diff options
Diffstat (limited to 'tix/generic/tixDiImg.c')
-rw-r--r-- | tix/generic/tixDiImg.c | 611 |
1 files changed, 611 insertions, 0 deletions
diff --git a/tix/generic/tixDiImg.c b/tix/generic/tixDiImg.c new file mode 100644 index 00000000000..bd44f1830b7 --- /dev/null +++ b/tix/generic/tixDiImg.c @@ -0,0 +1,611 @@ +/* + * tixDiImgTxt.c -- + * + * This file implements one of the "Display Items" in the Tix library : + * Image-text display items. + * + * Copyright (c) 1996, Expert Interface Technologies + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + */ + +#include <tixPort.h> +#include <tixInt.h> +#include <tixDef.h> + +#define DEF_IMAGEITEM_BITMAP "" +#define DEF_IMAGEITEM_IMAGE "" +#define DEF_IMAGEITEM_TYPE "image" +#define DEF_IMAGEITEM_SHOWIMAGE "1" +#define DEF_IMAGEITEM_SHOWTEXT "1" +#define DEF_IMAGEITEM_STYLE "" +#define DEF_IMAGEITEM_TEXT "" +#define DEF_IMAGEITEM_UNDERLINE "-1" + +static Tk_ConfigSpec imageItemConfigSpecs[] = { + + {TK_CONFIG_STRING, "-image", "image", "Image", + DEF_IMAGEITEM_IMAGE, Tk_Offset(TixImageItem, imageString), + TK_CONFIG_NULL_OK}, + + {TK_CONFIG_CUSTOM, "-itemtype", "itemType", "ItemType", + DEF_IMAGEITEM_TYPE, Tk_Offset(TixImageItem, diTypePtr), + 0, &tixConfigItemType}, + + {TK_CONFIG_CUSTOM, "-style", "imageStyle", "ImageStyle", + DEF_IMAGEITEM_STYLE, Tk_Offset(TixImageItem, stylePtr), + TK_CONFIG_NULL_OK, &tixConfigItemStyle}, + + {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL, + (char *) NULL, 0, 0} +}; + +/*---------------------------------------------------------------------- + * + * Configuration options for Text Styles + * + *---------------------------------------------------------------------- + */ + + +#define SELECTED_BG SELECT_BG +#define DISABLED_BG DISABLED + +#define DEF_IMAGESTYLE_NORMAL_FG_COLOR BLACK +#define DEF_IMAGESTYLE_NORMAL_FG_MONO BLACK +#define DEF_IMAGESTYLE_NORMAL_BG_COLOR NORMAL_BG +#define DEF_IMAGESTYLE_NORMAL_BG_MONO WHITE + +#define DEF_IMAGESTYLE_ACTIVE_FG_COLOR BLACK +#define DEF_IMAGESTYLE_ACTIVE_FG_MONO WHITE +#define DEF_IMAGESTYLE_ACTIVE_BG_COLOR ACTIVE_BG +#define DEF_IMAGESTYLE_ACTIVE_BG_MONO BLACK + +#define DEF_IMAGESTYLE_SELECTED_FG_COLOR BLACK +#define DEF_IMAGESTYLE_SELECTED_FG_MONO WHITE +#define DEF_IMAGESTYLE_SELECTED_BG_COLOR SELECTED_BG +#define DEF_IMAGESTYLE_SELECTED_BG_MONO BLACK + +#define DEF_IMAGESTYLE_DISABLED_FG_COLOR BLACK +#define DEF_IMAGESTYLE_DISABLED_FG_MONO BLACK +#define DEF_IMAGESTYLE_DISABLED_BG_COLOR DISABLED_BG +#define DEF_IMAGESTYLE_DISABLED_BG_MONO WHITE + +#define DEF_IMAGESTYLE_PADX "0" +#define DEF_IMAGESTYLE_PADY "0" +#define DEF_IMAGESTYLE_ANCHOR "w" + + +static Tk_ConfigSpec imageStyleConfigSpecs[] = { + {TK_CONFIG_ANCHOR, "-anchor", "anchor", "Anchor", + DEF_IMAGESTYLE_ANCHOR, Tk_Offset(TixImageStyle, anchor), 0}, + + {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL, + (char *) NULL, 0, 0}, + {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL, + (char *) NULL, 0, 0}, + + {TK_CONFIG_PIXELS, "-padx", "padX", "Pad", + DEF_IMAGESTYLE_PADX, Tk_Offset(TixImageStyle, pad[0]), 0}, + + {TK_CONFIG_PIXELS, "-pady", "padY", "Pad", + DEF_IMAGESTYLE_PADY, Tk_Offset(TixImageStyle, pad[1]), 0}, + +/* The following is automatically generated */ + {TK_CONFIG_COLOR,"-background","background","Background", + DEF_IMAGESTYLE_NORMAL_BG_COLOR, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_NORMAL].bg), + TK_CONFIG_COLOR_ONLY}, + {TK_CONFIG_COLOR,"-background","background","Background", + DEF_IMAGESTYLE_NORMAL_BG_MONO, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_NORMAL].bg), + TK_CONFIG_MONO_ONLY}, + {TK_CONFIG_COLOR,"-foreground","foreground","Foreground", + DEF_IMAGESTYLE_NORMAL_FG_COLOR, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_NORMAL].fg), + TK_CONFIG_COLOR_ONLY}, + {TK_CONFIG_COLOR,"-foreground","foreground","Foreground", + DEF_IMAGESTYLE_NORMAL_FG_MONO, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_NORMAL].fg), + TK_CONFIG_MONO_ONLY}, + {TK_CONFIG_COLOR,"-activebackground","activeBackground","ActiveBackground", + DEF_IMAGESTYLE_ACTIVE_BG_COLOR, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_ACTIVE].bg), + TK_CONFIG_COLOR_ONLY}, + {TK_CONFIG_COLOR,"-activebackground","activeBackground","ActiveBackground", + DEF_IMAGESTYLE_ACTIVE_BG_MONO, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_ACTIVE].bg), + TK_CONFIG_MONO_ONLY}, + {TK_CONFIG_COLOR,"-activeforeground","activeForeground","ActiveForeground", + DEF_IMAGESTYLE_ACTIVE_FG_COLOR, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_ACTIVE].fg), + TK_CONFIG_COLOR_ONLY}, + {TK_CONFIG_COLOR,"-activeforeground","activeForeground","ActiveForeground", + DEF_IMAGESTYLE_ACTIVE_FG_MONO, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_ACTIVE].fg), + TK_CONFIG_MONO_ONLY}, + {TK_CONFIG_COLOR,"-selectbackground","selectBackground","SelectBackground", + DEF_IMAGESTYLE_SELECTED_BG_COLOR, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_SELECTED].bg), + TK_CONFIG_COLOR_ONLY}, + {TK_CONFIG_COLOR,"-selectbackground","selectBackground","SelectBackground", + DEF_IMAGESTYLE_SELECTED_BG_MONO, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_SELECTED].bg), + TK_CONFIG_MONO_ONLY}, + {TK_CONFIG_COLOR,"-selectforeground","selectForeground","SelectForeground", + DEF_IMAGESTYLE_SELECTED_FG_COLOR, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_SELECTED].fg), + TK_CONFIG_COLOR_ONLY}, + {TK_CONFIG_COLOR,"-selectforeground","selectForeground","SelectForeground", + DEF_IMAGESTYLE_SELECTED_FG_MONO, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_SELECTED].fg), + TK_CONFIG_MONO_ONLY}, + {TK_CONFIG_COLOR,"-disabledbackground","disabledBackground","DisabledBackground", + DEF_IMAGESTYLE_DISABLED_BG_COLOR, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_DISABLED].bg), + TK_CONFIG_COLOR_ONLY}, + {TK_CONFIG_COLOR,"-disabledbackground","disabledBackground","DisabledBackground", + DEF_IMAGESTYLE_DISABLED_BG_MONO, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_DISABLED].bg), + TK_CONFIG_MONO_ONLY}, + {TK_CONFIG_COLOR,"-disabledforeground","disabledForeground","DisabledForeground", + DEF_IMAGESTYLE_DISABLED_FG_COLOR, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_DISABLED].fg), + TK_CONFIG_COLOR_ONLY}, + {TK_CONFIG_COLOR,"-disabledforeground","disabledForeground","DisabledForeground", + DEF_IMAGESTYLE_DISABLED_FG_MONO, + Tk_Offset(TixImageStyle,colors[TIX_DITEM_DISABLED].fg), + TK_CONFIG_MONO_ONLY}, + + {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL, + (char *) NULL, 0, 0} +}; + +/*---------------------------------------------------------------------- + * Forward declarations for procedures defined later in this file: + *---------------------------------------------------------------------- + */ +static void ImageProc _ANSI_ARGS_((ClientData clientData, + int x, int y, int width, int height, + int imgWidth, int imgHeight)); +static void Tix_ImageItemCalculateSize _ANSI_ARGS_(( + Tix_DItem * iPtr)); +static char * Tix_ImageItemComponent _ANSI_ARGS_(( + Tix_DItem * iPtr, int x, int y)); +static int Tix_ImageItemConfigure _ANSI_ARGS_(( + Tix_DItem * iPtr, int argc, char ** argv, + int flags)); +static Tix_DItem * Tix_ImageItemCreate _ANSI_ARGS_(( + Tix_DispData * ddPtr, Tix_DItemInfo * diTypePtr)); +static void Tix_ImageItemDisplay _ANSI_ARGS_(( + Pixmap pixmap, GC gc, Tix_DItem * iPtr, + int x, int y, int width, int height, int flag)); +static void Tix_ImageItemFree _ANSI_ARGS_(( + Tix_DItem * iPtr)); +static void Tix_ImageItemLostStyle _ANSI_ARGS_(( + Tix_DItem * iPtr)); +static void Tix_ImageItemStyleChanged _ANSI_ARGS_(( + Tix_DItem * iPtr)); +static int Tix_ImageStyleConfigure _ANSI_ARGS_(( + Tix_DItemStyle* style, int argc, char ** argv, + int flags)); +static Tix_DItemStyle * Tix_ImageStyleCreate _ANSI_ARGS_(( + Tcl_Interp *interp, Tk_Window tkwin, + Tix_DItemInfo * diTypePtr, char * name)); +static void Tix_ImageStyleFree _ANSI_ARGS_(( + Tix_DItemStyle* style)); +static void Tix_ImageStyleSetTemplate _ANSI_ARGS_(( + Tix_DItemStyle* style, + Tix_StyleTemplate * tmplPtr)); + +Tix_DItemInfo tix_ImageItemType = { + "image", /* type */ + TIX_DITEM_IMAGE, + Tix_ImageItemCreate, /* createProc */ + Tix_ImageItemConfigure, + Tix_ImageItemCalculateSize, + Tix_ImageItemComponent, + Tix_ImageItemDisplay, + Tix_ImageItemFree, + Tix_ImageItemStyleChanged, + Tix_ImageItemLostStyle, + + Tix_ImageStyleCreate, + Tix_ImageStyleConfigure, + Tix_ImageStyleFree, + Tix_ImageStyleSetTemplate, + + imageItemConfigSpecs, + imageStyleConfigSpecs, + NULL, /*next */ +}; + + +/*---------------------------------------------------------------------- + * Tix_Image -- + * + * + *---------------------------------------------------------------------- + */ +static Tix_DItem * Tix_ImageItemCreate(ddPtr, diTypePtr) + Tix_DispData * ddPtr; + Tix_DItemInfo * diTypePtr; +{ + TixImageItem * itPtr; + + itPtr = (TixImageItem*) ckalloc(sizeof(TixImageItem)); + + itPtr->diTypePtr = diTypePtr; + itPtr->ddPtr = ddPtr; + itPtr->stylePtr = NULL; + itPtr->clientData = 0; + itPtr->size[0] = 0; + itPtr->size[1] = 0; + + itPtr->imageString = NULL; + itPtr->image = NULL; + itPtr->imageW = 0; + itPtr->imageH = 0; + + return (Tix_DItem *)itPtr; +} + +static void Tix_ImageItemFree(iPtr) + Tix_DItem * iPtr; +{ + TixImageItem * itPtr = (TixImageItem *) iPtr; + + if (itPtr->image) { + Tk_FreeImage(itPtr->image); + } + if (itPtr->stylePtr) { + TixDItemStyleFree(iPtr, (Tix_DItemStyle*)itPtr->stylePtr); + } + + Tk_FreeOptions(imageItemConfigSpecs, (char *)itPtr, + itPtr->ddPtr->display, 0); + ckfree((char*)itPtr); +} + +static int Tix_ImageItemConfigure(iPtr, argc, argv, flags) + Tix_DItem * iPtr; + int argc; + char ** argv; + int flags; +{ + TixImageItem * itPtr = (TixImageItem *) iPtr; + TixImageStyle * oldStyle = itPtr->stylePtr; + + if (Tk_ConfigureWidget(itPtr->ddPtr->interp, itPtr->ddPtr->tkwin, + imageItemConfigSpecs, + argc, argv, (char *)itPtr, flags) != TCL_OK) { + return TCL_ERROR; + } + if (itPtr->stylePtr == NULL) { + itPtr->stylePtr = (TixImageStyle*)TixGetDefaultDItemStyle( + itPtr->ddPtr, &tix_ImageItemType, iPtr, NULL); + } + + /* + * Free the old images for the widget, if there were any. + */ + if (itPtr->image != NULL) { + Tk_FreeImage(itPtr->image); + itPtr->image = NULL; + } + + if (itPtr->imageString != NULL) { + itPtr->image = Tk_GetImage(itPtr->ddPtr->interp, itPtr->ddPtr->tkwin, + itPtr->imageString, ImageProc, (ClientData) itPtr); + if (itPtr->image == NULL) { + return TCL_ERROR; + } + } + + if (oldStyle != NULL && itPtr->stylePtr != oldStyle) { + Tix_ImageItemStyleChanged(iPtr); + } + else { + Tix_ImageItemCalculateSize((Tix_DItem*)itPtr); + } + + return TCL_OK; +} + +static void Tix_ImageItemDisplay(pixmap, gc, iPtr, x, y, width, height, flags) + Pixmap pixmap; + GC gc; + Tix_DItem * iPtr; + int x; + int y; + int width; + int height; + int flags; +{ + TixImageItem *itPtr = (TixImageItem *)iPtr; + GC foreGC, backGC; + TixpSubRegion subReg; + + if ((width <= 0) || (height <= 0)) { + return; + } + + TixGetColorDItemGC(iPtr, &backGC, &foreGC, flags); + TixpStartSubRegionDraw(itPtr->ddPtr->display, pixmap, foreGC, + &subReg, 0, 0, x, y, width, height, + itPtr->size[0], itPtr->size[1]); + TixDItemGetAnchor(itPtr->stylePtr->anchor, x, y, width, height, + itPtr->size[0], itPtr->size[1], &x, &y); + + if (backGC != None) { + TixpSubRegFillRectangle(itPtr->ddPtr->display, pixmap, + backGC, &subReg, x, y, width, height); + } + + if (itPtr->image != NULL) { + int bitY; + + bitY = itPtr->size[1] - itPtr->imageH - 2*itPtr->stylePtr->pad[1]; + + if (bitY > 0) { + bitY = bitY / 2; + } else { + bitY = 0; + } + TixpSubRegDrawImage(&subReg, itPtr->image, 0, 0, itPtr->imageW, + itPtr->imageH, pixmap, + x + itPtr->stylePtr->pad[0], + y + itPtr->stylePtr->pad[1] + bitY); + } + + TixpEndSubRegionDraw(itPtr->ddPtr->display, pixmap, foreGC, + &subReg); +} + +static void Tix_ImageItemCalculateSize(iPtr) + Tix_DItem * iPtr; +{ + TixImageItem *itPtr = (TixImageItem *)iPtr; + + itPtr->size[0] = 0; + itPtr->size[1] = 0; + + if (itPtr->image != NULL) { + Tk_SizeOfImage(itPtr->image, &itPtr->imageW, &itPtr->imageH); + + itPtr->size[0] = itPtr->imageW; + itPtr->size[1] = itPtr->imageH; + } + + itPtr->size[0] += 2*itPtr->stylePtr->pad[0]; + itPtr->size[1] += 2*itPtr->stylePtr->pad[1]; +} + +static char * Tix_ImageItemComponent(iPtr, x, y) + Tix_DItem * iPtr; + int x; + int y; +{ +#if 0 + TixImageItem *itPtr = (TixImageItem *)iPtr; +#endif + static char * body = "body"; + + return body; +} + + +static void Tix_ImageItemStyleChanged(iPtr) + Tix_DItem * iPtr; +{ + TixImageItem *itPtr = (TixImageItem *)iPtr; + + if (itPtr->stylePtr == NULL) { + /* Maybe we haven't set the style to default style yet */ + return; + } + Tix_ImageItemCalculateSize(iPtr); + if (itPtr->ddPtr->sizeChangedProc != NULL) { + itPtr->ddPtr->sizeChangedProc(iPtr); + } +} +static void Tix_ImageItemLostStyle(iPtr) + Tix_DItem * iPtr; +{ + TixImageItem *itPtr = (TixImageItem *)iPtr; + + itPtr->stylePtr = (TixImageStyle*)TixGetDefaultDItemStyle( + itPtr->ddPtr, &tix_ImageItemType, iPtr, NULL); + + Tix_ImageItemStyleChanged(iPtr); +} + +/* + *---------------------------------------------------------------------- + * + * ImageProc -- + * + * This procedure is invoked by the image code whenever the manager + * for an image does something that affects the size of contents + * of an image displayed in this widget. + * + * Results: + * None. + * + * Side effects: + * Arranges for the HList to get redisplayed. + * + *---------------------------------------------------------------------- + */ +static void +ImageProc(clientData, x, y, width, height, imgWidth, imgHeight) + ClientData clientData; /* Pointer to widget record. */ + int x, y; /* Upper left pixel (within image) + * that must be redisplayed. */ + int width, height; /* Dimensions of area to redisplay + * (may be <= 0). */ + int imgWidth, imgHeight; /* New dimensions of image. */ +{ + TixImageItem *itPtr = (TixImageItem *)clientData; + + Tix_ImageItemCalculateSize((Tix_DItem *)itPtr); + if (itPtr->ddPtr->sizeChangedProc != NULL) { + itPtr->ddPtr->sizeChangedProc((Tix_DItem *)itPtr); + } +} + +/*---------------------------------------------------------------------- + * + * + * Display styles + * + * + *---------------------------------------------------------------------- + */ +static Tix_DItemStyle * +Tix_ImageStyleCreate(interp, tkwin, diTypePtr, name) + Tcl_Interp * interp; + Tk_Window tkwin; + char * name; + Tix_DItemInfo * diTypePtr; +{ + int i; + TixImageStyle * stylePtr = + (TixImageStyle *)ckalloc(sizeof(TixImageStyle)); + + stylePtr->pad[0] = 0; + stylePtr->pad[1] = 0; + stylePtr->anchor = TK_ANCHOR_CENTER; + + for (i=0; i<4; i++) { + stylePtr->colors[i].bg = NULL; + stylePtr->colors[i].fg = NULL; + stylePtr->colors[i].backGC = None; + stylePtr->colors[i].foreGC = NULL; + } + + return (Tix_DItemStyle *)stylePtr; +} + +static int +Tix_ImageStyleConfigure(style, argc, argv, flags) + Tix_DItemStyle *style; + int argc; + char ** argv; + int flags; +{ + TixImageStyle * stylePtr = (TixImageStyle *)style; + XGCValues gcValues; + GC newGC; + int i; + + if (!(flags &TIX_DONT_CALL_CONFIG)) { + if (Tk_ConfigureWidget(stylePtr->interp, stylePtr->tkwin, + imageStyleConfigSpecs, + argc, argv, (char *)stylePtr, flags) != TCL_OK) { + return TCL_ERROR; + } + } + + gcValues.graphics_exposures = False; + for (i=0; i<4; i++) { + /* Foreground */ + gcValues.background = stylePtr->colors[i].bg->pixel; + gcValues.foreground = stylePtr->colors[i].fg->pixel; + newGC = Tk_GetGC(stylePtr->tkwin, + GCForeground|GCBackground|GCGraphicsExposures, &gcValues); + + if (stylePtr->colors[i].foreGC != None) { + Tk_FreeGC(Tk_Display(stylePtr->tkwin), + stylePtr->colors[i].foreGC); + } + stylePtr->colors[i].foreGC = newGC; + + /* Background */ + gcValues.foreground = stylePtr->colors[i].bg->pixel; + newGC = Tk_GetGC(stylePtr->tkwin, + GCForeground|GCGraphicsExposures, &gcValues); + + if (stylePtr->colors[i].backGC != None) { + Tk_FreeGC(Tk_Display(stylePtr->tkwin), + stylePtr->colors[i].backGC); + } + stylePtr->colors[i].backGC = newGC; + } + + return TCL_OK; +} + +static void Tix_ImageStyleFree(style) + Tix_DItemStyle *style; +{ + TixImageStyle * stylePtr = (TixImageStyle *)style; + int i; + + for (i=0; i<4; i++) { + if (stylePtr->colors[i].backGC != None) { + Tk_FreeGC(Tk_Display(stylePtr->tkwin), stylePtr->colors[i].backGC); + } + if (stylePtr->colors[i].foreGC != None) { + Tk_FreeGC(Tk_Display(stylePtr->tkwin), stylePtr->colors[i].foreGC); + } + } + + Tk_FreeOptions(imageStyleConfigSpecs, (char *)stylePtr, + Tk_Display(stylePtr->tkwin), 0); + ckfree((char *)stylePtr); +} + +static int bg_flags [4] = { + TIX_DITEM_NORMAL_BG, + TIX_DITEM_ACTIVE_BG, + TIX_DITEM_SELECTED_BG, + TIX_DITEM_DISABLED_BG +}; +static int fg_flags [4] = { + TIX_DITEM_NORMAL_FG, + TIX_DITEM_ACTIVE_FG, + TIX_DITEM_SELECTED_FG, + TIX_DITEM_DISABLED_FG +}; + +static void +Tix_ImageStyleSetTemplate(style, tmplPtr) + Tix_DItemStyle* style; + Tix_StyleTemplate * tmplPtr; +{ + TixImageStyle * stylePtr = (TixImageStyle *)style; + int i; + + if (tmplPtr->flags & TIX_DITEM_PADX) { + stylePtr->pad[0] = tmplPtr->pad[0]; + } + if (tmplPtr->flags & TIX_DITEM_PADY) { + stylePtr->pad[1] = tmplPtr->pad[1]; + } + + for (i=0; i<4; i++) { + if (tmplPtr->flags & bg_flags[i]) { + if (stylePtr->colors[i].bg != NULL) { + Tk_FreeColor(stylePtr->colors[i].bg); + } + stylePtr->colors[i].bg = Tk_GetColor( + stylePtr->interp, stylePtr->tkwin, + Tk_NameOfColor(tmplPtr->colors[i].bg)); + } + } + for (i=0; i<4; i++) { + if (tmplPtr->flags & fg_flags[i]) { + if (stylePtr->colors[i].fg != NULL) { + Tk_FreeColor(stylePtr->colors[i].fg); + } + stylePtr->colors[i].fg = Tk_GetColor( + stylePtr->interp, stylePtr->tkwin, + Tk_NameOfColor(tmplPtr->colors[i].fg)); + } + } + + Tix_ImageStyleConfigure(style, 0, 0, TIX_DONT_CALL_CONFIG); +} |