Changeset 3042 for trunk/gui/src/RpCanvHotspot.c
- Timestamp:
- Jun 15, 2012, 11:14:10 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gui/src/RpCanvHotspot.c
r3041 r3042 36 36 #define SEGMENT_TEXT 0 37 37 #define SEGMENT_VALUE 1 38 #define SEGMENT_ICON 239 38 #define VAR_FLAGS (TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS) 40 39 … … 45 44 #define TRUE 1 46 45 #define FALSE 0 46 #undef MAX 47 #define MAX(a,b) (((a)>(b))?(a):(b)) 47 48 48 49 #undef ROUND … … 50 51 51 52 #define IMAGE_PAD 3 53 #define TEXT_PADX 3 54 #define TEXT_PADY 1 52 55 53 56 typedef struct _ItemSegment ItemSegment; … … 105 108 XColor *textColor; /* Color for normal text */ 106 109 XColor *valueColor; /* Color for substitututed values. */ 107 XColor *active ValueColor; /* Color for active substitututed110 XColor *activeColor; /* Color for active substitututed 108 111 * values */ 112 Tk_3DBorder activeBorder; /* Background color for active 113 * substitututed values */ 109 114 XColor *outlineColor; /* Color for outline of rectangle */ 110 115 Tk_3DBorder border; /* If non-NULL, background color of … … 152 157 153 158 static Tk_ConfigSpec configSpecs[] = { 159 {TK_CONFIG_BORDER, "-activebackground", (char *)NULL, (char*)NULL, 160 "white", Tk_Offset(HotspotItem, activeBorder), TK_CONFIG_NULL_OK}, 161 {TK_CONFIG_COLOR, "-activeforeground", (char*)NULL, (char*)NULL, 162 "cyan4", Tk_Offset(HotspotItem, activeColor), 0}, 154 163 {TK_CONFIG_STRING, "-activeimage", "activeImage", (char*)NULL, (char*)NULL, 155 164 Tk_Offset(HotspotItem, activeImageName), TK_CONFIG_NULL_OK}, … … 168 177 {TK_CONFIG_COLOR, "-foreground", "foreground", (char*)NULL, 169 178 "black", Tk_Offset(HotspotItem, textColor), 0}, 170 {TK_CONFIG_COLOR, "-activevalueforeground", (char*)NULL, (char*)NULL,171 "red3", Tk_Offset(HotspotItem, activeValueColor), 0},172 179 {TK_CONFIG_FONT, "-valuefont", (char*)NULL, (char*)NULL, 173 180 "helvetica -12 bold", Tk_Offset(HotspotItem, valueFont), 0}, … … 181 188 "flat", Tk_Offset(HotspotItem, relief), TK_CONFIG_DONT_SET_DEFAULT}, 182 189 {TK_CONFIG_BOOLEAN, "-showicons", (char*)NULL, (char*)NULL, 183 " ", Tk_Offset(HotspotItem, showIcons), TK_CONFIG_DONT_SET_DEFAULT},190 "0", Tk_Offset(HotspotItem, showIcons), TK_CONFIG_DONT_SET_DEFAULT}, 184 191 {TK_CONFIG_CUSTOM, "-tags", (char*)NULL, (char*)NULL, 185 192 (char*)NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, … … 564 571 565 572 static void 566 AddVa riableSegment(HotspotItem *itemPtr, const char *varName, int length)573 AddValueSegment(HotspotItem *itemPtr, const char *varName, int length) 567 574 { 568 575 ItemSegment *segPtr; … … 597 604 598 605 static void 599 AddHotspotSegment(HotspotItem *itemPtr, const char *varName, int length)600 {601 ItemSegment *segPtr;602 603 segPtr = (ItemSegment *)Tcl_Alloc(sizeof(ItemSegment) + length + 1);604 memset(segPtr, 0, sizeof(ItemSegment));605 segPtr->itemPtr = itemPtr;606 segPtr->lineNum = itemPtr->numLines;607 segPtr->type = SEGMENT_ICON;608 strncpy(segPtr->text, varName, length);609 segPtr->text[length] = '\0';610 segPtr->length = length;611 segPtr->x = segPtr->y = 0;612 segPtr->nextPtr = NULL;613 if (itemPtr->firstPtr == NULL) {614 itemPtr->firstPtr = segPtr;615 }616 if (itemPtr->lastPtr == NULL) {617 itemPtr->lastPtr = segPtr;618 } else {619 itemPtr->lastPtr->nextPtr = segPtr;620 itemPtr->lastPtr = segPtr;621 }622 }623 624 static void625 606 DestroySegment(ItemSegment *segPtr) 626 607 { … … 690 671 int imgWidth, imgHeight; 691 672 int maxWidth, maxHeight; 692 Tk_Font tkFont;693 673 int justify; 694 674 int wrapLength; … … 699 679 flags = 0; 700 680 /* Collect the individual segment sizes. */ 701 imgWidth = itemPtr->maxImageWidth + 2 *IMAGE_PAD;681 imgWidth = itemPtr->maxImageWidth + IMAGE_PAD; 702 682 imgHeight = itemPtr->maxImageHeight + 2 * IMAGE_PAD; 703 683 for (segPtr = itemPtr->firstPtr; segPtr != NULL; segPtr = segPtr->nextPtr) { … … 707 687 w = h = 0; 708 688 switch (segPtr->type) { 709 case SEGMENT_ICON: 689 case SEGMENT_VALUE: 690 segPtr->layout = Tk_ComputeTextLayout(itemPtr->valueFont, 691 segPtr->value, -1, wrapLength, justify, flags, &w, &h); 692 w += TEXT_PADX * 2; 693 h += TEXT_PADY * 2; 710 694 if (itemPtr->showIcons) { 711 w = imgWidth, h = imgHeight;695 w += imgWidth, h = MAX(h, imgHeight); 712 696 } 713 697 break; 714 case SEGMENT_VALUE:715 tkFont = (itemPtr->valueFont != NULL) ?716 itemPtr->valueFont : itemPtr->font;717 segPtr->layout = Tk_ComputeTextLayout(tkFont, segPtr->value,718 -1, wrapLength, justify, flags, &w, &h);719 break;720 698 case SEGMENT_TEXT: 721 segPtr->layout = Tk_ComputeTextLayout(itemPtr->font, 722 segPtr->text, -1, wrapLength, justify, flags, 723 &w, &h); 699 segPtr->layout = Tk_ComputeTextLayout(itemPtr->font, segPtr->text, 700 -1, wrapLength, justify, flags, &w, &h); 701 w += TEXT_PADX * 2; 702 h += TEXT_PADY * 2; 724 703 break; 725 704 default: … … 745 724 startPtr = segPtr; 746 725 x = 0; 726 747 727 while ((segPtr != NULL) && (segPtr->lineNum == lineNum)) { 748 728 if (segPtr->height > maxHeight) { … … 793 773 for (q = varName; q != '\0'; q++) { 794 774 if (*q == '}') { 795 AddHotspotSegment(itemPtr, varName, q- varName); 796 AddVariableSegment(itemPtr, varName, q - varName); 775 AddValueSegment(itemPtr, varName, q - varName); 797 776 p = q; 798 777 start = p + 1; … … 870 849 itemPtr->tkwin = tkwin; 871 850 itemPtr->valueInterp = interp; 872 itemPtr->showIcons = TRUE;851 itemPtr->showIcons = FALSE; 873 852 874 853 /* Process the arguments to fill in the item record. */ … … 1010 989 /* Substituted value GC. */ 1011 990 mask = GCFont | GCForeground; 1012 if (itemPtr->valueFont != NULL) { 1013 gcValues.font = Tk_FontId(itemPtr->valueFont); 1014 } else { 1015 gcValues.font = Tk_FontId(itemPtr->font); 1016 } 1017 if (itemPtr->valueColor != NULL) { 1018 gcValues.foreground = itemPtr->valueColor->pixel; 1019 } else { 1020 gcValues.foreground = itemPtr->textColor->pixel; 1021 } 991 gcValues.font = Tk_FontId(itemPtr->valueFont); 992 gcValues.foreground = itemPtr->valueColor->pixel; 1022 993 newGC = Tk_GetGC(tkwin, mask, &gcValues); 1023 994 if (itemPtr->valueGC != None) { … … 1028 999 /* Active substituted value GC. */ 1029 1000 mask = GCFont | GCForeground; 1030 if (itemPtr->valueFont != NULL) { 1031 gcValues.font = Tk_FontId(itemPtr->valueFont); 1032 } else { 1033 gcValues.font = Tk_FontId(itemPtr->font); 1034 } 1035 gcValues.foreground = itemPtr->activeValueColor->pixel; 1001 gcValues.font = Tk_FontId(itemPtr->valueFont); 1002 gcValues.foreground = itemPtr->activeColor->pixel; 1036 1003 newGC = Tk_GetGC(tkwin, mask, &gcValues); 1037 1004 if (itemPtr->activeGC != None) { … … 1124 1091 Tk_FreeColor(itemPtr->valueColor); 1125 1092 } 1093 if (itemPtr->activeColor != NULL) { 1094 Tk_FreeColor(itemPtr->activeColor); 1095 } 1126 1096 if (itemPtr->outlineColor != NULL) { 1127 1097 Tk_FreeColor(itemPtr->outlineColor); 1098 } 1099 if (itemPtr->border != NULL) { 1100 Tk_Free3DBorder(itemPtr->border); 1101 } 1102 if (itemPtr->activeBorder != NULL) { 1103 Tk_Free3DBorder(itemPtr->activeBorder); 1128 1104 } 1129 1105 if (itemPtr->text != NULL) { … … 1267 1243 { 1268 1244 HotspotItem *itemPtr; 1245 GC gc; 1246 int isActive; 1269 1247 1270 1248 itemPtr = segPtr->itemPtr; 1271 if (segPtr->type == SEGMENT_ICON) { 1249 if (segPtr->type == SEGMENT_TEXT) { 1250 Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable, 1251 itemPtr->normalGC, segPtr->layout, x + segPtr->x + TEXT_PADX, 1252 y + segPtr->y + TEXT_PADY, 0, -1); 1253 return; 1254 } 1255 isActive = ((itemPtr->activeValue != NULL) && 1256 (strcmp(itemPtr->activeValue, segPtr->text) == 0)); 1257 1258 if ((itemPtr->activeBorder != NULL) && (isActive)) { 1259 Tk_Fill3DRectangle(itemPtr->tkwin, drawable, itemPtr->activeBorder, 1260 x + segPtr->x, y + segPtr->y, segPtr->width, segPtr->height, 1261 1, TK_RELIEF_SOLID); 1262 } 1263 if (itemPtr->showIcons) { 1272 1264 Tk_Image tkImage; 1273 1265 int w, h; 1274 1275 if (!itemPtr->showIcons) { 1276 return; 1277 } 1278 tkImage = NULL; 1279 if ((itemPtr->activeValue != NULL) && 1280 (strcmp(itemPtr->activeValue, segPtr->text) == 0)) { 1281 tkImage = itemPtr->activeImage; 1282 } 1283 if (tkImage == NULL) { 1284 tkImage = itemPtr->image; 1285 } 1266 int ix, iy, ih, iw; 1267 1268 ih = itemPtr->maxImageHeight * 2 * IMAGE_PAD; 1269 iw = itemPtr->maxImageWidth + IMAGE_PAD; 1270 ix = x + segPtr->x + IMAGE_PAD; 1271 iy = y + segPtr->y + IMAGE_PAD; 1272 if (segPtr->height > ih) { 1273 iy += (segPtr->height - ih) / 2; 1274 } 1275 tkImage = (isActive) ? itemPtr->activeImage : itemPtr->image; 1286 1276 Tk_SizeOfImage(tkImage, &w, &h); 1287 Tk_RedrawImage(tkImage, 0, 0, w, h, drawable, x + segPtr->x + IMAGE_PAD, 1288 y + segPtr->y + IMAGE_PAD); 1289 } else if (segPtr->type == SEGMENT_VALUE) { 1290 GC gc; 1291 1292 gc = itemPtr->valueGC; 1293 if ((itemPtr->activeValue != NULL) && 1294 (strcmp(itemPtr->activeValue, segPtr->text) == 0)) { 1295 gc = itemPtr->activeGC; 1296 Tk_UnderlineTextLayout(Tk_Display(itemPtr->tkwin), drawable, gc, 1297 segPtr->layout, x + segPtr->x, y + segPtr->y, -1); 1298 } 1299 Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable, gc, 1300 segPtr->layout, x + segPtr->x, y + segPtr->y, 0, -1); 1301 } else { 1302 Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable, 1303 itemPtr->normalGC, segPtr->layout, x + segPtr->x, 1304 y + segPtr->y, 0, -1); 1305 } 1277 Tk_RedrawImage(tkImage, 0, 0, w, h, drawable, ix, iy); 1278 x += iw; 1279 } 1280 gc = (isActive) ? itemPtr->activeGC : itemPtr->valueGC; 1281 Tk_DrawTextLayout(Tk_Display(itemPtr->tkwin), drawable, gc, segPtr->layout, 1282 x + segPtr->x + TEXT_PADX, y + segPtr->y + TEXT_PADY, 0, -1); 1306 1283 } 1307 1284 … … 1688 1665 continue; /* Ignore text segments. */ 1689 1666 } 1690 if ((segPtr->type == SEGMENT_ICON) && (!itemPtr->showIcons)) {1691 continue;1692 }1693 1667 if ((x >= segPtr->x) && (x < (segPtr->x + segPtr->width)) && 1694 1668 (y >= segPtr->y) && (y < (segPtr->y + segPtr->height))) {
Note: See TracChangeset
for help on using the changeset viewer.