- Timestamp:
- Jun 13, 2012 4:36:48 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gui/src/RpCanvHotspot.c
r3038 r3039 41 41 #define REDRAW_PENDING (1<<0) 42 42 #define LAYOUT_PENDING (1<<1) 43 #define SUBST _PENDING(1<<2)43 #define SUBSTITUTIONS_PENDING (1<<2) 44 44 45 45 #undef ROUND … … 59 59 ItemSegment *nextPtr; 60 60 int type; /* Image, normal text, or substituted 61 * text. */61 * value. */ 62 62 short int x, y; /* Location of segment on canvas. */ 63 63 short int width, height; /* Dimension of segment. */ 64 64 Tk_TextLayout layout; /* Layout of normal or substituted 65 * text*/65 * value */ 66 66 int length; /* # of bytes in below string. */ 67 67 int lineNum; /* Line where segment if located. */ 68 char * subst; /* Substitututed text. */68 char *value; /* Substitututed value. */ 69 69 char text[1]; 70 70 }; … … 95 95 * Configuration settings that are updated by Tk_ConfigureWidget: 96 96 */ 97 Tcl_Interp * substInterp; /* If non-NULL, interpreter containing97 Tcl_Interp *valueInterp; /* If non-NULL, interpreter containing 98 98 * substituted variables. */ 99 99 const char *text; /* Text to be displayed */ … … 101 101 * (x,y) */ 102 102 XColor *textColor; /* Color for normal text */ 103 XColor *substColor; /* Color for substitututed text */ 103 XColor *valueColor; /* Color for substitututed values. */ 104 XColor *activeValueColor; /* Color for active substitututed 105 * values */ 104 106 XColor *outlineColor; /* Color for outline of rectangle */ 105 107 Tk_3DBorder border; /* If non-NULL, background color of 106 * rectangle. */ 107 int borderWidth; /* supports 3D border (drawn under 108 * rectangle enclosing the entire 109 * hotspot item. */ 110 Tk_3DBorder activeValueBorder; /* If non-NULL, background color of 111 * active substituted values. */ 112 int borderWidth; /* 3D border width (drawn under 108 113 * -outline) */ 109 114 int relief; /* Indicates whether hotspot as a 110 115 * whole is raised, sunken, or flat */ 111 116 Tk_Font font; /* Font for drawing normal text. */ 112 Tk_Font substFont; /* Font for drawing substituted text. */ 117 Tk_Font valueFont; /* Font for drawing substituted 118 * values. */ 113 119 114 120 const char *imageName; /* Name of normal hotspot image. */ … … 124 130 GC normalGC; /* Graphics context for drawing 125 131 * text. */ 126 GC substGC; /* GC for substituted text. */ 132 GC valueGC; /* GC for substituted values. */ 133 GC activeGC; /* Gc for active substituted 134 * values. */ 127 135 GC outlineGC; /* GC for outline? */ 128 136 ItemSegment *firstPtr, *lastPtr; /* List of hotspot segments. */ … … 157 165 {TK_CONFIG_COLOR, "-foreground", "foreground", (char*)NULL, 158 166 "black", Tk_Offset(HotspotItem, textColor), 0}, 159 {TK_CONFIG_FONT, "-substitutionfont", (char*)NULL, (char*)NULL, 160 "courier -12", Tk_Offset(HotspotItem, substFont), 0}, 161 {TK_CONFIG_COLOR, "-substitutionforeground", (char*)NULL, (char*)NULL, 162 "blue", Tk_Offset(HotspotItem, substColor), 0}, 167 {TK_CONFIG_COLOR, "-activevaluebackground", (char*)NULL, (char*)NULL, 168 "blue", Tk_Offset(HotspotItem, activeValueBorder), 0}, 169 {TK_CONFIG_FONT, "-valuefont", (char*)NULL, (char*)NULL, 170 "courier -12", Tk_Offset(HotspotItem, valueFont), 0}, 171 {TK_CONFIG_COLOR, "-valueforeground", (char*)NULL, (char*)NULL, 172 "blue", Tk_Offset(HotspotItem, valueColor), 0}, 163 173 {TK_CONFIG_STRING, "-image", (char*)NULL, (char*)NULL, (char*)NULL, 164 174 Tk_Offset(HotspotItem, imageName), 0}, … … 484 494 } 485 495 } 486 itemPtr->flags |= SUBST _PENDING;496 itemPtr->flags |= SUBSTITUTIONS_PENDING; 487 497 EventuallyRedraw(itemPtr); 488 498 return NULL; /* Done. */ … … 562 572 segPtr->text[length] = '\0'; 563 573 segPtr->length = length; 564 interp = itemPtr-> substInterp;574 interp = itemPtr->valueInterp; 565 575 if (interp == NULL) { 566 576 interp = itemPtr->interp; 567 577 } 568 578 Tcl_TraceVar(interp, varName, VAR_FLAGS, TraceVarProc, itemPtr); 569 segPtr-> subst= NULL;579 segPtr->value = NULL; 570 580 segPtr->x = segPtr->y = 0; 571 581 segPtr->nextPtr = NULL; … … 619 629 itemPtr); 620 630 } 621 if (segPtr-> subst!= NULL) {622 Tcl_Free((char *)segPtr-> subst);631 if (segPtr->value != NULL) { 632 Tcl_Free((char *)segPtr->value); 623 633 } 624 634 Tcl_Free((char *)segPtr); … … 638 648 639 649 static void 640 DoSubst (HotspotItem *itemPtr)650 DoSubstitutions(HotspotItem *itemPtr) 641 651 { 642 652 ItemSegment *segPtr; 643 653 Tcl_Interp *interp; 644 654 645 itemPtr->flags &= ~SUBST _PENDING;646 interp = itemPtr-> substInterp;655 itemPtr->flags &= ~SUBSTITUTIONS_PENDING; 656 interp = itemPtr->valueInterp; 647 657 if (interp == NULL) { 648 658 interp = itemPtr->interp; … … 658 668 value = "???"; 659 669 } 660 if (segPtr-> subst!= NULL) {661 Tcl_Free((char *)segPtr-> subst);670 if (segPtr->value != NULL) { 671 Tcl_Free((char *)segPtr->value); 662 672 } 663 segPtr-> subst= Tcl_Alloc(strlen(value) + 1);664 strcpy(segPtr-> subst, value);673 segPtr->value = Tcl_Alloc(strlen(value) + 1); 674 strcpy(segPtr->value, value); 665 675 } 666 676 itemPtr->flags |= LAYOUT_PENDING; … … 694 704 break; 695 705 case SEGMENT_TYPE_VARIABLE: 696 tkFont = (itemPtr-> substFont != NULL) ?697 itemPtr-> substFont : itemPtr->font;698 segPtr->layout = Tk_ComputeTextLayout(tkFont, segPtr-> subst,706 tkFont = (itemPtr->valueFont != NULL) ? 707 itemPtr->valueFont : itemPtr->font; 708 segPtr->layout = Tk_ComputeTextLayout(tkFont, segPtr->value, 699 709 -1, wrapLength, justify, flags, &w, &h); 700 710 break; … … 797 807 AddTextSegment(itemPtr, start, p - start); 798 808 } 799 itemPtr->flags |= SUBST _PENDING;809 itemPtr->flags |= SUBSTITUTIONS_PENDING; 800 810 return TCL_OK; 801 811 } … … 861 871 itemPtr->outlineGC = None; 862 872 itemPtr->relief = TK_RELIEF_FLAT; 863 itemPtr->substColor = NULL; 864 itemPtr->substFont = NULL; 865 itemPtr->substGC = None; 866 itemPtr->substInterp = interp; 873 itemPtr->valueColor = NULL; 874 itemPtr->valueFont = NULL; 875 itemPtr->valueGC = None; 876 itemPtr->activeGC = None; 877 itemPtr->valueInterp = interp; 867 878 itemPtr->text = NULL; 868 879 itemPtr->textColor = NULL; … … 1007 1018 } 1008 1019 1009 /* Substituted textGC. */1020 /* Substituted value GC. */ 1010 1021 mask = GCFont | GCForeground; 1011 if (itemPtr-> substFont != NULL) {1012 gcValues.font = Tk_FontId(itemPtr-> substFont);1022 if (itemPtr->valueFont != NULL) { 1023 gcValues.font = Tk_FontId(itemPtr->valueFont); 1013 1024 } else { 1014 1025 gcValues.font = Tk_FontId(itemPtr->font); 1015 1026 } 1016 if (itemPtr-> substColor != NULL) {1017 gcValues.foreground = itemPtr-> substColor->pixel;1027 if (itemPtr->valueColor != NULL) { 1028 gcValues.foreground = itemPtr->valueColor->pixel; 1018 1029 } else { 1019 1030 gcValues.foreground = itemPtr->textColor->pixel; 1020 1031 } 1021 1032 newGC = Tk_GetGC(tkwin, mask, &gcValues); 1022 if (itemPtr-> substGC != None) {1023 Tk_FreeGC(Tk_Display(tkwin), itemPtr-> substGC);1024 } 1025 itemPtr-> substGC = newGC;1033 if (itemPtr->valueGC != None) { 1034 Tk_FreeGC(Tk_Display(tkwin), itemPtr->valueGC); 1035 } 1036 itemPtr->valueGC = newGC; 1026 1037 1027 1038 itemPtr->maxImageWidth = itemPtr->maxImageHeight = 0; … … 1106 1117 Tk_FreeColor(itemPtr->textColor); 1107 1118 } 1108 if (itemPtr-> substColor != NULL) {1109 Tk_FreeColor(itemPtr-> substColor);1119 if (itemPtr->valueColor != NULL) { 1120 Tk_FreeColor(itemPtr->valueColor); 1110 1121 } 1111 1122 if (itemPtr->outlineColor != NULL) { … … 1130 1141 Tk_FreeFont(itemPtr->font); 1131 1142 } 1132 if (itemPtr-> substFont != NULL) {1133 Tk_FreeFont(itemPtr-> substFont);1143 if (itemPtr->valueFont != NULL) { 1144 Tk_FreeFont(itemPtr->valueFont); 1134 1145 } 1135 1146 if (itemPtr->normalGC != None) { … … 1139 1150 Tk_FreeGC(display, itemPtr->outlineGC); 1140 1151 } 1141 if (itemPtr-> substGC != None) {1142 Tk_FreeGC(display, itemPtr-> substGC);1152 if (itemPtr->valueGC != None) { 1153 Tk_FreeGC(display, itemPtr->valueGC); 1143 1154 } 1144 1155 DestroySegments(itemPtr); … … 1266 1277 1267 1278 gc = (segPtr->type == SEGMENT_TYPE_VARIABLE) ? 1268 itemPtr-> substGC : itemPtr->normalGC;1279 itemPtr->valueGC : itemPtr->normalGC; 1269 1280 Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable, gc, 1270 1281 segPtr->layout, x + segPtr->x, y + segPtr->y, 0, -1); … … 1297 1308 1298 1309 itemPtr->flags &= ~REDRAW_PENDING; 1299 if (itemPtr->flags & SUBST _PENDING) {1300 DoSubst (itemPtr);1310 if (itemPtr->flags & SUBSTITUTIONS_PENDING) { 1311 DoSubstitutions(itemPtr); 1301 1312 } 1302 1313 if (itemPtr->flags & LAYOUT_PENDING) { … … 1317 1328 } 1318 1329 for (segPtr = itemPtr->firstPtr; segPtr != NULL; segPtr = segPtr->nextPtr) { 1319 fprintf(stderr, "Display: segment=(%s) type=%d x=%d y=%d (x=%d y=%d w=%d h=%d) lineNum=%d nextPtr=%x\n",1320 segPtr->text, segPtr->type, x, y, segPtr->x, segPtr->y,1321 segPtr->width, segPtr->height, segPtr->lineNum, segPtr->nextPtr);1322 1330 DrawSegment(segPtr, drawable, x, y); 1323 1331 } … … 1484 1492 int prepass) 1485 1493 { 1494 #ifdef notdef 1486 1495 HotspotItem *itemPtr = (HotspotItem *)canvItemPtr; 1487 1496 Tk_Window canvasWin = Tk_CanvasTkwin(canvas); 1488 1497 1489 #ifdef notdef1490 1498 int x, y; 1491 1499 double xpos; … … 1592 1600 } 1593 1601 1602 static HotspotItem * 1603 GetHotspotItem(Tcl_Interp *interp, Tcl_Obj *canvasObjPtr, Tcl_Obj *itemObjPtr) 1604 { 1605 const char *string; 1606 Tk_Item *canvItemPtr; 1607 HotspotItem *itemPtr; 1608 Tcl_CmdInfo cmdInfo; 1609 TkCanvas *canvasPtr; 1610 int id; 1611 Tcl_HashEntry *hPtr; 1612 Tk_Window tkwin; 1613 1614 /* See if we can find the canvas window associated by the name. */ 1615 string = Tcl_GetString(canvasObjPtr); 1616 tkwin = Tk_NameToWindow(interp, string, Tk_MainWindow(interp)); 1617 if (tkwin == NULL) { 1618 Tcl_AppendResult(interp, "can't find canvas \"", string, "\"", 1619 (char *)NULL); 1620 return NULL; 1621 } 1622 if (strcmp(Tk_Class(tkwin), "Canvas") != 0) { 1623 Tcl_AppendResult(interp, "window \"", string, "\" isn't a canvas.", 1624 (char *)NULL); 1625 return NULL; 1626 } 1627 /* If we're this far, then we can try to get the clientData. If the widget 1628 * command was renamed, we're out of luck. */ 1629 if (!Tcl_GetCommandInfo(interp, string, &cmdInfo)) { 1630 Tcl_AppendResult(interp, "can't find canvas \"", string, "\"", 1631 (char *)NULL); 1632 return NULL; 1633 } 1634 canvasPtr = cmdInfo.objClientData; 1635 if (Tcl_GetIntFromObj(interp, itemObjPtr, &id) != TCL_OK) { 1636 return NULL; 1637 } 1638 string = Tcl_GetString(itemObjPtr); 1639 hPtr = Tcl_FindHashEntry(&canvasPtr->idTable, (char *)id); 1640 if (hPtr == NULL) { 1641 Tcl_AppendResult(interp, "can't find canvas item \"", string, 1642 "\"", (char *)NULL); 1643 return NULL; 1644 1645 } 1646 canvItemPtr = Tcl_GetHashValue(hPtr); 1647 /* The canvas item we find has to be a hotspot. */ 1648 if (canvItemPtr->typePtr != &hotspotType) { 1649 Tcl_AppendResult(interp, "bad canvas item \"", string, 1650 "\": must be a hotspot", (char *)NULL); 1651 return NULL; 1652 1653 } 1654 return itemPtr = (HotspotItem *)canvItemPtr; 1655 } 1656 1657 static int 1658 HotspotCmd(ClientData clientData, Tcl_Interp *interp, int objc, 1659 Tcl_Obj *const *objv) 1660 { 1661 const char *string; 1662 HotspotItem *itemPtr; 1663 int length; 1664 char c; 1665 1666 if (objc < 3) { 1667 return TCL_ERROR; 1668 } 1669 itemPtr = GetHotspotItem(interp, objv[2], objv[3]); 1670 if (itemPtr == NULL) { 1671 return TCL_ERROR; 1672 } 1673 string = Tcl_GetStringFromObj(objv[1], &length); 1674 c = string[0]; 1675 if ((c == 'a') && (strncmp(string, "activate", length) == 0)) { 1676 /* hotspot activate .c 0 varName */ 1677 } else if ((c == 'd') && (strncmp(string, "deactivate", length) == 0)) { 1678 /* hotspot deactivate .c 0 */ 1679 itemPtr->activePtr = NULL; 1680 } else if ((c == 'i') && (strncmp(string, "identify", length) == 0)) { 1681 /* hotspot identify .c 0 x y */ 1682 /* Return name of variable identified by x,y coordinate. */ 1683 } else if ((c == 'v') && (strncmp(string, "variables", length) == 0)) { 1684 /* hotspot variables .c 0 */ 1685 /* Return list of variable names. */ 1686 } else { 1687 Tcl_AppendResult(interp, "unknown hotspot option \"", string, 1688 "\": should be either activate, deactivate, identity, ", 1689 "or variables", (char *)NULL); 1690 return TCL_ERROR; 1691 } 1692 return TCL_OK; 1693 } 1694 1594 1695 /* 1595 1696 * ------------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.