diff options
author | treectrl <treectrl> | 2003-01-02 02:24:08 (GMT) |
---|---|---|
committer | treectrl <treectrl> | 2003-01-02 02:24:08 (GMT) |
commit | 0a431c440c9fcd7ad76346915857845ad0726df5 (patch) | |
tree | 1239e1ef0833dcd694f322d10176b8d3aaf93997 /generic | |
parent | 0258f98d4b6bc495493a1dd12f26922d5edd7349 (diff) | |
download | tktreectrl-0a431c440c9fcd7ad76346915857845ad0726df5.zip tktreectrl-0a431c440c9fcd7ad76346915857845ad0726df5.tar.gz tktreectrl-0a431c440c9fcd7ad76346915857845ad0726df5.tar.bz2 |
Big padx and pady patch.
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tkTreeColumn.c | 135 | ||||
-rw-r--r-- | generic/tkTreeCtrl.c | 26 | ||||
-rw-r--r-- | generic/tkTreeCtrl.h | 15 | ||||
-rw-r--r-- | generic/tkTreeStyle.c | 616 | ||||
-rw-r--r-- | generic/tkTreeUtils.c | 263 |
5 files changed, 683 insertions, 372 deletions
diff --git a/generic/tkTreeColumn.c b/generic/tkTreeColumn.c index 9b796ce..23eefd0 100644 --- a/generic/tkTreeColumn.c +++ b/generic/tkTreeColumn.c @@ -28,12 +28,16 @@ struct Column int sunken; /* -sunken */ Tcl_Obj *itemBgObj; /* -itembackground */ int button; /* -button */ - Tcl_Obj *textPadObj[4]; /* -textpad* */ - int textPad[4]; /* -textpad* */ - Tcl_Obj *imagePadObj[4]; /* -imagepad* */ - int imagePad[4]; /* -imagepad* */ - Tcl_Obj *arrowPadObj[2]; /* -arrowpadw -arrowpade */ - int arrowPad[2]; /* -arrowpadw -arrowpade */ + Tcl_Obj *textPadXObj; /* -textpadx */ + int *textPadX; /* -textpadx */ + Tcl_Obj *textPadYObj; /* -textpady */ + int *textPadY; /* -textpady */ + Tcl_Obj *imagePadXObj; /* -imagepadx */ + int *imagePadX; /* -imagepadx */ + Tcl_Obj *imagePadYObj; /* -imagepady */ + int *imagePadY; /* -imagepady */ + Tcl_Obj *arrowPadObj; /* -arrowpad */ + int *arrowPad; /* -arrowpad */ #define ARROW_NONE 0 #define ARROW_UP 1 @@ -85,14 +89,10 @@ static Tk_OptionSpec columnSpecs[] = { {TK_OPTION_STRING_TABLE, "-arrowgravity", (char *) NULL, (char *) NULL, "left", -1, Tk_Offset(Column, arrowGravity), 0, (ClientData) arrowSideST, COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-arrowpade", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, arrowPadObj[SIDE_RIGHT]), - Tk_Offset(Column, arrowPad[SIDE_RIGHT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-arrowpadw", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, arrowPadObj[SIDE_LEFT]), - Tk_Offset(Column, arrowPad[SIDE_LEFT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, + {TK_OPTION_CUSTOM, "-arrowpad", (char *) NULL, (char *) NULL, + "6", Tk_Offset(Column, arrowPadObj), + Tk_Offset(Column, arrowPad), 0, (ClientData) &PadAmountOption, + COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, {TK_OPTION_BITMAP, "-bitmap", (char *) NULL, (char *) NULL, (char *) NULL, -1, Tk_Offset(Column, bitmap), TK_OPTION_NULL_OK, (ClientData) NULL, @@ -117,22 +117,14 @@ static Tk_OptionSpec columnSpecs[] = { (char *) NULL, -1, Tk_Offset(Column, imageString), TK_OPTION_NULL_OK, (ClientData) NULL, COLU_CONF_IMAGE | COLU_CONF_NWIDTH | COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-imagepade", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, imagePadObj[RIGHT]), - Tk_Offset(Column, imagePad[RIGHT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-imagepadn", (char *) NULL, (char *) NULL, - "0", Tk_Offset(Column, imagePadObj[TOP]), - Tk_Offset(Column, imagePad[TOP]), - 0, (ClientData) NULL, COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-imagepads", (char *) NULL, (char *) NULL, - "0", Tk_Offset(Column, imagePadObj[BOTTOM]), - Tk_Offset(Column, imagePad[BOTTOM]), - 0, (ClientData) NULL, COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-imagepadw", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, imagePadObj[LEFT]), - Tk_Offset(Column, imagePad[LEFT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, + {TK_OPTION_CUSTOM, "-imagepadx", (char *) NULL, (char *) NULL, + "6", Tk_Offset(Column, imagePadXObj), + Tk_Offset(Column, imagePadX), 0, (ClientData) &PadAmountOption, + COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, + {TK_OPTION_CUSTOM, "-imagepady", (char *) NULL, (char *) NULL, + "0", Tk_Offset(Column, imagePadYObj), + Tk_Offset(Column, imagePadY), 0, (ClientData) &PadAmountOption, + COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, {TK_OPTION_STRING, "-itembackground", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(Column, itemBgObj), -1, TK_OPTION_NULL_OK, (ClientData) NULL, COLU_CONF_ITEMBG}, @@ -163,22 +155,14 @@ static Tk_OptionSpec columnSpecs[] = { {TK_OPTION_COLOR, "-textcolor", (char *) NULL, (char *) NULL, DEF_BUTTON_FG, -1, Tk_Offset(Column, textColor), 0, (ClientData) NULL, COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-textpade", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, textPadObj[RIGHT]), - Tk_Offset(Column, textPad[RIGHT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-textpadn", (char *) NULL, (char *) NULL, - "0", Tk_Offset(Column, textPadObj[TOP]), - Tk_Offset(Column, textPad[TOP]), - 0, (ClientData) NULL, COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-textpads", (char *) NULL, (char *) NULL, - "0", Tk_Offset(Column, textPadObj[BOTTOM]), - Tk_Offset(Column, textPad[BOTTOM]), - 0, (ClientData) NULL, COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-textpadw", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, textPadObj[LEFT]), - Tk_Offset(Column, textPad[LEFT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, + {TK_OPTION_CUSTOM, "-textpadx", (char *) NULL, (char *) NULL, + "6", Tk_Offset(Column, textPadXObj), + Tk_Offset(Column, textPadX), 0, (ClientData) &PadAmountOption, + COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, + {TK_OPTION_CUSTOM, "-textpady", (char *) NULL, (char *) NULL, + "0", Tk_Offset(Column, textPadYObj), + Tk_Offset(Column, textPadY), 0, (ClientData) &PadAmountOption, + COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, {TK_OPTION_PIXELS, "-width", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(Column, widthObj), Tk_Offset(Column, width), TK_OPTION_NULL_OK, (ClientData) NULL, COLU_CONF_TWIDTH}, @@ -625,8 +609,8 @@ int TreeColumn_NeededWidth(TreeColumn column_) if ((column->arrow != ARROW_NONE) && (column->arrowSide == SIDE_LEFT)) { widthList[n] = arrowWidth; - padList[n] = column->arrowPad[SIDE_LEFT]; - padList[n + 1] = column->arrowPad[SIDE_RIGHT]; + padList[n] = column->arrowPad[PAD_TOP_LEFT]; + padList[n + 1] = column->arrowPad[PAD_BOTTOM_RIGHT]; n++; } if ((column->image != NULL) || (column->bitmap != None)) @@ -636,23 +620,23 @@ int TreeColumn_NeededWidth(TreeColumn column_) Tk_SizeOfImage(column->image, &imgWidth, &imgHeight); else Tk_SizeOfBitmap(column->tree->display, column->bitmap, &imgWidth, &imgHeight); - padList[n] = MAX(column->imagePad[LEFT], padList[n]); - padList[n + 1] = column->imagePad[RIGHT]; + padList[n] = MAX(column->imagePadX[PAD_TOP_LEFT], padList[n]); + padList[n + 1] = column->imagePadX[PAD_BOTTOM_RIGHT]; widthList[n] = imgWidth; n++; } if (column->textLen > 0) { - padList[n] = MAX(column->textPad[LEFT], padList[n]); - padList[n + 1] = column->textPad[RIGHT]; + padList[n] = MAX(column->textPadX[PAD_TOP_LEFT], padList[n]); + padList[n + 1] = column->textPadX[PAD_BOTTOM_RIGHT]; widthList[n] = column->textWidth; n++; } if ((column->arrow != ARROW_NONE) && (column->arrowSide == SIDE_RIGHT)) { widthList[n] = arrowWidth; - padList[n] = column->arrowPad[SIDE_LEFT]; - padList[n + 1] = column->arrowPad[SIDE_RIGHT]; + padList[n] = column->arrowPad[PAD_TOP_LEFT]; + padList[n + 1] = column->arrowPad[PAD_BOTTOM_RIGHT]; n++; } @@ -679,7 +663,8 @@ int TreeColumn_NeededHeight(TreeColumn column_) Tk_SizeOfImage(column->image, &imgWidth, &imgHeight); else Tk_SizeOfBitmap(column->tree->display, column->bitmap, &imgWidth, &imgHeight); - imgHeight += column->imagePad[TOP] + column->imagePad[BOTTOM]; + imgHeight += column->imagePadY[PAD_TOP_LEFT] + + column->imagePadY[PAD_BOTTOM_RIGHT]; column->neededHeight = MAX(column->neededHeight, imgHeight); } if (column->text != NULL) @@ -687,7 +672,8 @@ int TreeColumn_NeededHeight(TreeColumn column_) Tk_Font tkfont = column->tkfont ? column->tkfont : column->tree->tkfont; Tk_FontMetrics fm; Tk_GetFontMetrics(tkfont, &fm); - fm.linespace += column->textPad[TOP] + column->textPad[BOTTOM]; + fm.linespace += column->textPadY[PAD_TOP_LEFT] + + column->textPadY[PAD_BOTTOM_RIGHT]; column->neededHeight = MAX(column->neededHeight, fm.linespace); } column->neededHeight += column->borderWidth * 2; @@ -1108,8 +1094,8 @@ static void Column_Layout(Column *column, struct Layout *layout) if ((column->arrow != ARROW_NONE) && (column->arrowSide == SIDE_LEFT)) { widthList[n] = layout->arrowWidth; - padList[n] = column->arrowPad[SIDE_LEFT]; - padList[n + 1] = column->arrowPad[SIDE_RIGHT]; + padList[n] = column->arrowPad[PAD_TOP_LEFT]; + padList[n + 1] = column->arrowPad[PAD_BOTTOM_RIGHT]; iArrow = n++; } if ((column->image != NULL) || (column->bitmap != None)) @@ -1119,8 +1105,8 @@ static void Column_Layout(Column *column, struct Layout *layout) Tk_SizeOfImage(column->image, &imgWidth, &imgHeight); else Tk_SizeOfBitmap(column->tree->display, column->bitmap, &imgWidth, &imgHeight); - padList[n] = MAX(column->imagePad[LEFT], padList[n]); - padList[n + 1] = column->imagePad[RIGHT]; + padList[n] = MAX(column->imagePadX[PAD_TOP_LEFT], padList[n]); + padList[n + 1] = column->imagePadX[PAD_BOTTOM_RIGHT]; widthList[n] = imgWidth; layout->imageWidth = imgWidth; iImage = n++; @@ -1132,8 +1118,9 @@ static void Column_Layout(Column *column, struct Layout *layout) layout->bytesThatFit = 0; if (layout->width >= TreeColumn_NeededWidth((TreeColumn) column)) { - padList[n] = MAX(column->textPad[LEFT], padList[n]); - padList[n + 1] = column->textPad[RIGHT]; + padList[n] = MAX(column->textPadX[PAD_TOP_LEFT], + padList[n]); + padList[n + 1] = column->textPadX[PAD_BOTTOM_RIGHT]; widthList[n] = column->textWidth; iText = n++; layout->bytesThatFit = column->textLen; @@ -1147,8 +1134,9 @@ static void Column_Layout(Column *column, struct Layout *layout) width = column->textWidth - width; layout->bytesThatFit = Ellipsis(layout->tkfont, column->text, column->textLen, &width, "..."); - padList[n] = MAX(column->textPad[LEFT], padList[n]); - padList[n + 1] = column->textPad[RIGHT]; + padList[n] = MAX(column->textPadX[PAD_TOP_LEFT], + padList[n]); + padList[n + 1] = column->textPadX[PAD_BOTTOM_RIGHT]; widthList[n] = width; iText = n++; layout->textWidth = width; @@ -1158,8 +1146,8 @@ static void Column_Layout(Column *column, struct Layout *layout) if ((column->arrow != ARROW_NONE) && (column->arrowSide == SIDE_RIGHT)) { widthList[n] = layout->arrowWidth; - padList[n] = column->arrowPad[SIDE_LEFT]; - padList[n + 1] = column->arrowPad[SIDE_RIGHT]; + padList[n] = column->arrowPad[PAD_TOP_LEFT]; + padList[n + 1] = column->arrowPad[PAD_BOTTOM_RIGHT]; iArrow = n++; } @@ -1346,9 +1334,10 @@ void TreeColumn_Draw(TreeColumn column_, Drawable drawable, int x, int y) int imgW, imgH, ix, iy, h; Tk_SizeOfImage(column->image, &imgW, &imgH); ix = x + layout.imageLeft + column->sunken; - h = column->imagePad[TOP] + imgH + column->imagePad[BOTTOM]; + h = column->imagePadY[PAD_TOP_LEFT] + imgH + + column->imagePadY[PAD_BOTTOM_RIGHT]; iy = y + (height - h) / 2 + column->sunken; - iy += column->imagePad[TOP]; + iy += column->imagePadY[PAD_TOP_LEFT]; Tk_RedrawImage(column->image, 0, 0, imgW, imgH, drawable, ix, iy); } else if (column->bitmap != None) @@ -1357,9 +1346,10 @@ void TreeColumn_Draw(TreeColumn column_, Drawable drawable, int x, int y) Tk_SizeOfBitmap(tree->display, column->bitmap, &imgW, &imgH); bx = x + layout.imageLeft + column->sunken; - h = column->imagePad[TOP] + imgH + column->imagePad[BOTTOM]; + h = column->imagePadY[PAD_TOP_LEFT] + imgH + + column->imagePadY[PAD_BOTTOM_RIGHT]; by = y + (height - h) / 2 + column->sunken; - by += column->imagePad[TOP]; + by += column->imagePadY[PAD_TOP_LEFT]; XSetClipOrigin(tree->display, column->bitmapGC, bx, by); XCopyPlane(tree->display, column->bitmap, drawable, column->bitmapGC, 0, 0, (unsigned int) imgW, (unsigned int) imgH, @@ -1397,9 +1387,10 @@ void TreeColumn_Draw(TreeColumn column_, Drawable drawable, int x, int y) mask = GCFont | GCForeground | GCGraphicsExposures; gc = Tk_GetGC(tree->tkwin, mask, &gcValues); tx = x + layout.textLeft + column->sunken; - h = column->textPad[TOP] + layout.fm.linespace + column->textPad[BOTTOM]; + h = column->textPadY[PAD_TOP_LEFT] + layout.fm.linespace + + column->textPadY[PAD_BOTTOM_RIGHT]; ty = y + (height - h) / 2 + layout.fm.ascent + column->sunken; - ty += column->textPad[TOP]; + ty += column->textPadY[PAD_TOP_LEFT]; Tk_DrawChars(tree->display, drawable, gc, layout.tkfont, text, textLen, tx, ty); Tk_FreeGC(tree->display, gc); diff --git a/generic/tkTreeCtrl.c b/generic/tkTreeCtrl.c index eb06c8a..7a3d30c 100644 --- a/generic/tkTreeCtrl.c +++ b/generic/tkTreeCtrl.c @@ -85,26 +85,16 @@ static Tk_OptionSpec optionSpecs[] = { Tk_Offset(TreeCtrl, itemHeight), 0, (ClientData) NULL, TREE_CONF_ITEMHEIGHT | TREE_CONF_RELAYOUT}, #if 0 - {TK_OPTION_PIXELS, "-itempadw", (char *) NULL, (char *) NULL, + {TK_OPTION_CUSTOM, "-itempadx", (char *) NULL, (char *) NULL, "0", - Tk_Offset(TreeCtrl, itemPadObj[LEFT]), - Tk_Offset(TreeCtrl, itemPad[LEFT]), - TK_CONFIG_NULL_OK, (ClientData) NULL, 0}, - {TK_OPTION_PIXELS, "-itempadn", (char *) NULL, (char *) NULL, + Tk_Offset(TreeCtrl, itemPadXObj), + Tk_Offset(TreeCtrl, itemPadX), + TK_CONFIG_NULL_OK, (ClientData) &PadAmountOption, 0}, + {TK_OPTION_PIXELS, "-itempady", (char *) NULL, (char *) NULL, "0", - Tk_Offset(TreeCtrl, itemPadObj[TOP]), - Tk_Offset(TreeCtrl, itemPad[TOP]), - TK_CONFIG_NULL_OK, (ClientData) NULL, 0}, - {TK_OPTION_PIXELS, "-itempade", (char *) NULL, (char *) NULL, - "0", - Tk_Offset(TreeCtrl, itemPadObj[RIGHT]), - Tk_Offset(TreeCtrl, itemPad[RIGHT]), - TK_CONFIG_NULL_OK, (ClientData) NULL, 0}, - {TK_OPTION_PIXELS, "-itempads", (char *) NULL, (char *) NULL, - "0", - Tk_Offset(TreeCtrl, itemPadObj[BOTTOM]), - Tk_Offset(TreeCtrl, itemPad[BOTTOM]), - TK_CONFIG_NULL_OK, (ClientData) NULL, 0}, + Tk_Offset(TreeCtrl, itemPadYObj), + Tk_Offset(TreeCtrl, itemPadY), + TK_CONFIG_NULL_OK, (ClientData) &PadAmountOption, 0}, #endif {TK_OPTION_COLOR, "-linecolor", "lineColor", "LineColor", "#808080", -1, Tk_Offset(TreeCtrl, lineColor), diff --git a/generic/tkTreeCtrl.h b/generic/tkTreeCtrl.h index 4778bc8..0da2923 100644 --- a/generic/tkTreeCtrl.h +++ b/generic/tkTreeCtrl.h @@ -116,8 +116,10 @@ struct TreeCtrl #define BG_MODE_ROW 2 #define BG_MODE_VISINDEX 3 int backgroundMode; /* -backgroundmode */ - int itemPad[4]; /* -itempad w/n/e/s */ - Tcl_Obj *itemPadObj[4]; /* -itempad w/n/e/s */ + int *itemPadX; /* -itempadx */ + Tcl_Obj *itemPadXObj; /* -itempadx */ + int *itemPadY; /* -itempady */ + Tcl_Obj *itemPadYObj; /* -itempady */ struct TreeCtrlDebug debug; @@ -503,3 +505,12 @@ extern void TextLayout_Size(TextLayout textLayout, int *widthPtr, int *heightPtr extern void TextLayout_Draw(Display *display, Drawable drawable, GC gc, TextLayout layout, int x, int y, int firstChar, int lastChar); + +#define PAD_TOP_LEFT 0 +#define PAD_BOTTOM_RIGHT 1 +extern Tk_ObjCustomOption PadAmountOption; + +extern int TreeCtrl_GetPadAmountFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *padObj, + int *topLeftPtr, int *bottomRightPtr)); +extern Tcl_Obj * TreeCtrl_NewPadAmountObj _ANSI_ARGS_((int *padAmounts)); diff --git a/generic/tkTreeStyle.c b/generic/tkTreeStyle.c index 7d677b0..77b02fc 100644 --- a/generic/tkTreeStyle.c +++ b/generic/tkTreeStyle.c @@ -51,8 +51,10 @@ struct ElementLink int neededHeight; int layoutWidth; int layoutHeight; - int ePad[4]; /* external padding */ - int iPad[4]; /* internal padding */ + int ePadX[2]; /* external horizontal padding */ + int ePadY[2]; /* external vertical padding */ + int iPadX[2]; /* internal horizontal padding */ + int iPadY[2]; /* internal vertical padding */ int flags; /* ELF_xxx */ int *onion, onionCount; /* -union option info */ }; @@ -83,15 +85,18 @@ struct Layout int eHeight; /* ePad + iPad + useHeight + iPad + ePad */ int iWidth; /* iPad + useWidth + iPad */ int iHeight; /* iPad + useHeight + iPad */ - int ePad[4]; /* external padding */ - int iPad[4]; /* internal padding */ - int uPad[4]; /* padding due to -union */ + int ePadX[2]; /* external horizontal padding */ + int ePadY[2]; /* external vertical padding */ + int iPadX[2]; /* internal horizontal padding */ + int iPadY[2]; /* internal vertical padding */ + int uPadX[2]; /* padding due to -union */ + int uPadY[2]; /* padding due to -union */ }; static void Style_DoExpandH(struct Layout *layout, int flags, int width) { int extraWidth; - int *ePad, *iPad; + int *ePadX, *iPadX; int eW, eE, iW, iE, eLeft, eRight, iLeft, iRight, eMax, iMax; if (!(flags & ELF_EXPAND_WE)) @@ -108,40 +113,41 @@ static void Style_DoExpandH(struct Layout *layout, int flags, int width) eRight = width - (layout->x + layout->eWidth); eMax = eLeft + eRight; - /* Internal: can expand to max of ePad[] or uPad[] */ - iW = MAX(layout->ePad[LEFT], layout->uPad[LEFT]); - iE = width - MAX(layout->ePad[RIGHT], layout->uPad[RIGHT]); - iLeft = layout->x + layout->ePad[LEFT] - iW; - iRight = iE - (layout->x + layout->eWidth - layout->ePad[RIGHT]); + /* Internal: can expand to max of ePadX[] or uPadX[] */ + iW = MAX(layout->ePadX[PAD_TOP_LEFT], layout->uPadX[PAD_TOP_LEFT]); + iE = width - MAX(layout->ePadX[PAD_BOTTOM_RIGHT], + layout->uPadX[PAD_BOTTOM_RIGHT]); + iLeft = layout->x + layout->ePadX[PAD_TOP_LEFT] - iW; + iRight = iE - (layout->x + layout->eWidth - layout->ePadX[PAD_BOTTOM_RIGHT]); iMax = iLeft + iRight; - ePad = layout->ePad; - iPad = layout->iPad; + ePadX = layout->ePadX; + iPadX = layout->iPadX; /* Internal expansion */ if (flags & ELF_iEXPAND_WE) { if ((flags & ELF_iEXPAND_WE) == ELF_iEXPAND_WE) { - iPad[LEFT] += MIN(iMax / 2, iLeft); - layout->x = iW - ePad[LEFT]; + iPadX[PAD_TOP_LEFT] += MIN(iMax / 2, iLeft); + layout->x = iW - ePadX[PAD_TOP_LEFT]; layout->iWidth += iMax; layout->eWidth += iMax; - iPad[RIGHT] = layout->iWidth - layout->eLink->neededWidth - iPad[LEFT]; + iPadX[PAD_BOTTOM_RIGHT] = layout->iWidth - layout->eLink->neededWidth - iPadX[PAD_TOP_LEFT]; } else if (flags & ELF_iEXPAND_W) { - layout->x = iW - ePad[LEFT]; + layout->x = iW - ePadX[PAD_TOP_LEFT]; layout->iWidth += iMax; layout->eWidth += iMax; - iPad[LEFT] = layout->iWidth - layout->eLink->neededWidth - iPad[RIGHT]; + iPadX[PAD_TOP_LEFT] = layout->iWidth - layout->eLink->neededWidth - iPadX[PAD_BOTTOM_RIGHT]; } else { - layout->x = iW - ePad[LEFT]; + layout->x = iW - ePadX[PAD_TOP_LEFT]; layout->iWidth += iMax; layout->eWidth += iMax; - iPad[RIGHT] = layout->iWidth - layout->eLink->neededWidth - iPad[LEFT]; + iPadX[PAD_BOTTOM_RIGHT] = layout->iWidth - layout->eLink->neededWidth - iPadX[PAD_TOP_LEFT]; } return; } @@ -155,22 +161,22 @@ static void Style_DoExpandH(struct Layout *layout, int flags, int width) layout->x = 0; layout->eWidth = width; - if (ePad[LEFT] + amt + layout->iWidth > iE) - amt -= (ePad[LEFT] + amt + layout->iWidth) - iE; - ePad[LEFT] += amt; - ePad[RIGHT] += extraWidth - amt; + if (ePadX[PAD_TOP_LEFT] + amt + layout->iWidth > iE) + amt -= (ePadX[PAD_TOP_LEFT] + amt + layout->iWidth) - iE; + ePadX[PAD_TOP_LEFT] += amt; + ePadX[PAD_BOTTOM_RIGHT] += extraWidth - amt; } else if (flags & ELF_eEXPAND_W) { layout->x = 0; - layout->eWidth = iE + ePad[RIGHT]; - ePad[LEFT] = layout->eWidth - layout->iWidth - ePad[RIGHT]; + layout->eWidth = iE + ePadX[PAD_BOTTOM_RIGHT]; + ePadX[PAD_TOP_LEFT] = layout->eWidth - layout->iWidth - ePadX[PAD_BOTTOM_RIGHT]; } else { - layout->x = iW - ePad[LEFT]; + layout->x = iW - ePadX[PAD_TOP_LEFT]; layout->eWidth = width - layout->x; - ePad[RIGHT] = layout->eWidth - layout->iWidth - ePad[LEFT]; + ePadX[PAD_BOTTOM_RIGHT] = layout->eWidth - layout->iWidth - ePadX[PAD_TOP_LEFT]; } } } @@ -178,7 +184,7 @@ static void Style_DoExpandH(struct Layout *layout, int flags, int width) static void Style_DoExpandV(struct Layout *layout, int flags, int height) { int extraHeight; - int *ePad, *iPad; + int *ePadY, *iPadY; int eN, eS, iN, iS, eAbove, eBelow, iAbove, iBelow, eMax, iMax; if (!(flags & ELF_EXPAND_NS)) @@ -188,8 +194,8 @@ static void Style_DoExpandV(struct Layout *layout, int flags, int height) if (extraHeight <= 0) return; - ePad = layout->ePad; - iPad = layout->iPad; + ePadY = layout->ePadY; + iPadY = layout->iPadY; /* External: can expand to top and bottom */ eN = 0; @@ -198,11 +204,11 @@ static void Style_DoExpandV(struct Layout *layout, int flags, int height) eBelow = height - (layout->y + layout->eHeight); eMax = eAbove + eBelow; - /* Internal: can expand to max of ePad[] or uPad[] */ - iN = MAX(ePad[TOP], layout->uPad[TOP]); - iS = height - MAX(ePad[BOTTOM], layout->uPad[BOTTOM]); - iAbove = layout->y + ePad[TOP] - iN; - iBelow = iS - (layout->y + layout->eHeight - ePad[BOTTOM]); + /* Internal: can expand to max of ePadY[] or uPadY[] */ + iN = MAX(ePadY[PAD_TOP_LEFT], layout->uPadY[PAD_TOP_LEFT]); + iS = height - MAX(ePadY[PAD_BOTTOM_RIGHT], layout->uPadY[PAD_BOTTOM_RIGHT]); + iAbove = layout->y + ePadY[PAD_TOP_LEFT] - iN; + iBelow = iS - (layout->y + layout->eHeight - ePadY[PAD_BOTTOM_RIGHT]); iMax = iAbove + iBelow; /* Internal expansion */ @@ -210,25 +216,25 @@ static void Style_DoExpandV(struct Layout *layout, int flags, int height) { if ((flags & ELF_iEXPAND_NS) == ELF_iEXPAND_NS) { - iPad[TOP] += MIN(iMax / 2, iAbove); - layout->y = iN - ePad[TOP]; + iPadY[PAD_TOP_LEFT] += MIN(iMax / 2, iAbove); + layout->y = iN - ePadY[PAD_TOP_LEFT]; layout->iHeight += iMax; layout->eHeight += iMax; - iPad[BOTTOM] = layout->iHeight - layout->eLink->neededHeight - iPad[TOP]; + iPadY[PAD_BOTTOM_RIGHT] = layout->iHeight - layout->eLink->neededHeight - iPadY[PAD_TOP_LEFT]; } else if (flags & ELF_iEXPAND_N) { - layout->y = iN - ePad[TOP]; + layout->y = iN - ePadY[PAD_TOP_LEFT]; layout->iHeight += iMax; layout->eHeight += iMax; - iPad[TOP] = layout->iHeight - layout->eLink->neededHeight - iPad[BOTTOM]; + iPadY[PAD_TOP_LEFT] = layout->iHeight - layout->eLink->neededHeight - iPadY[PAD_BOTTOM_RIGHT]; } else { - layout->y = iN - ePad[TOP]; + layout->y = iN - ePadY[PAD_TOP_LEFT]; layout->iHeight += iMax; layout->eHeight += iMax; - iPad[BOTTOM] = layout->iHeight - layout->eLink->neededHeight - iPad[TOP]; + iPadY[PAD_BOTTOM_RIGHT] = layout->iHeight - layout->eLink->neededHeight - iPadY[PAD_TOP_LEFT]; } return; } @@ -242,22 +248,22 @@ static void Style_DoExpandV(struct Layout *layout, int flags, int height) layout->y = 0; layout->eHeight = height; - if (ePad[TOP] + amt + layout->iHeight > iS) - amt -= (ePad[TOP] + amt + layout->iHeight) - iS; - ePad[TOP] += amt; - ePad[BOTTOM] += extraHeight - amt; + if (ePadY[PAD_TOP_LEFT] + amt + layout->iHeight > iS) + amt -= (ePadY[PAD_TOP_LEFT] + amt + layout->iHeight) - iS; + ePadY[PAD_TOP_LEFT] += amt; + ePadY[PAD_BOTTOM_RIGHT] += extraHeight - amt; } else if (flags & ELF_eEXPAND_N) { layout->y = 0; - layout->eHeight = iS + ePad[BOTTOM]; - ePad[TOP] = layout->eHeight - layout->iHeight - ePad[BOTTOM]; + layout->eHeight = iS + ePadY[PAD_BOTTOM_RIGHT]; + ePadY[PAD_TOP_LEFT] = layout->eHeight - layout->iHeight - ePadY[PAD_BOTTOM_RIGHT]; } else { - layout->y = iN - ePad[TOP]; + layout->y = iN - ePadY[PAD_TOP_LEFT]; layout->eHeight = height - layout->y; - ePad[BOTTOM] = layout->eHeight - layout->iHeight - ePad[TOP]; + ePadY[PAD_BOTTOM_RIGHT] = layout->eHeight - layout->iHeight - ePadY[PAD_TOP_LEFT]; } } } @@ -269,10 +275,10 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) ElementLink *eLinks1, *eLinks2, *eLink1, *eLink2; int x = 0; int w, e; - int *ePad, *iPad, *uPad; + int *ePadX, *iPadX, *uPadX, *ePadY, *iPadY, *uPadY; int numExpandWE = 0; int numSqueezeX = 0; - int i, j, k, eLinkCount = 0; + int i, j, eLinkCount = 0; eLinks1 = masterStyle->elements; eLinks2 = style->elements; @@ -289,8 +295,10 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) layout->useWidth = eLink2->neededWidth; /* No -union padding yet */ - for (j = 0; j < 4; j++) - layout->uPad[j] = 0; + layout->uPadX[PAD_TOP_LEFT] = 0; + layout->uPadX[PAD_BOTTOM_RIGHT] = 0; + layout->uPadY[PAD_TOP_LEFT] = 0; + layout->uPadY[PAD_BOTTOM_RIGHT] = 0; /* Count all non-union, non-detach squeezeable items */ if ((eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) @@ -307,16 +315,21 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->onion == NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; + ePadX = eLink1->ePadX; + ePadY = eLink1->ePadY; + iPadX = eLink1->iPadX; + iPadY = eLink1->iPadY; for (j = 0; j < eLink1->onionCount; j++) { struct Layout *layout = &layouts[eLink1->onion[j]]; - uPad = layout->uPad; - for (k = 0; k < 4; k++) - uPad[k] = MAX(uPad[k], iPad[k] + ePad[k]); + uPadX = layout->uPadX; + uPadY = layout->uPadY; + uPadX[PAD_TOP_LEFT] = MAX(uPadX[PAD_TOP_LEFT], iPadX[PAD_TOP_LEFT] + ePadX[PAD_TOP_LEFT]); + uPadX[PAD_BOTTOM_RIGHT] = MAX(uPadX[PAD_BOTTOM_RIGHT], iPadX[PAD_BOTTOM_RIGHT] + ePadX[PAD_BOTTOM_RIGHT]); + uPadY[PAD_TOP_LEFT] = MAX(uPadY[PAD_TOP_LEFT], iPadY[PAD_TOP_LEFT] + ePadY[PAD_TOP_LEFT]); + uPadY[PAD_BOTTOM_RIGHT] = MAX(uPadY[PAD_BOTTOM_RIGHT], iPadY[PAD_BOTTOM_RIGHT] + ePadY[PAD_BOTTOM_RIGHT]); } } @@ -364,18 +377,18 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->onion != NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadX = eLink1->ePadX; + iPadX = eLink1->iPadX; + uPadX = layout->uPadX; if ((eLink1->flags & ELF_SQUEEZE_X) && ((eLink1->flags & ELF_DETACH) || masterStyle->vertical)) { int width = - MAX(ePad[LEFT], uPad[LEFT]) + - iPad[LEFT] + layout->useWidth + iPad[RIGHT] + - MAX(ePad[RIGHT], uPad[RIGHT]); + MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT]) + + iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT] + + MAX(ePadX[PAD_BOTTOM_RIGHT], uPadX[PAD_BOTTOM_RIGHT]); if (width > drawArgs->width) layout->useWidth -= (width - drawArgs->width); } @@ -390,22 +403,24 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) eLink1 = &eLinks1[i]; eLink2 = &eLinks2[i]; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadX = eLink1->ePadX; + iPadX = eLink1->iPadX; + uPadX = layout->uPadX; if ((eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; layout->eLink = eLink2; layout->master = eLink1; - layout->x = MAX(x, abs(ePad[LEFT] - MAX(ePad[LEFT], uPad[LEFT]))); - layout->iWidth = iPad[LEFT] + layout->useWidth + iPad[RIGHT]; - layout->eWidth = ePad[LEFT] + layout->iWidth + ePad[RIGHT]; - for (j = 0; j < 4; j++) - { - layout->ePad[j] = ePad[j]; - layout->iPad[j] = iPad[j]; + layout->x = MAX(x, abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT]))); + layout->iWidth = iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT]; + layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; + + for (j = 0; j < 2; j++) { + layout->ePadX[j] = eLink1->ePadX[j]; + layout->ePadY[j] = eLink1->ePadY[j]; + layout->iPadX[j] = eLink1->iPadX[j]; + layout->iPadY[j] = eLink1->iPadY[j]; } if (!masterStyle->vertical) @@ -448,8 +463,8 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (layouts[j].eLink != NULL) layouts[j].x += extraWidth; - ePad = layout->ePad; - iPad = layout->iPad; + ePadX = layout->ePadX; + iPadX = layout->iPadX; /* External and internal expansion */ if ((eLink1->flags & ELF_eEXPAND_WE) && (eLink1->flags & ELF_iEXPAND_WE)) @@ -468,13 +483,13 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { if ((eLink1->flags & ELF_eEXPAND_WE) == ELF_eEXPAND_WE) { - ePad[LEFT] += eExtra / 2; - ePad[RIGHT] += eExtra - eExtra / 2; + ePadX[PAD_TOP_LEFT] += eExtra / 2; + ePadX[PAD_BOTTOM_RIGHT] += eExtra - eExtra / 2; } else if (eLink1->flags & ELF_eEXPAND_W) - ePad[LEFT] += eExtra; + ePadX[PAD_TOP_LEFT] += eExtra; else - ePad[RIGHT] += eExtra; + ePadX[PAD_BOTTOM_RIGHT] += eExtra; } /* Internal expansion */ @@ -482,13 +497,13 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { if ((eLink1->flags & ELF_iEXPAND_WE) == ELF_iEXPAND_WE) { - iPad[LEFT] += iExtra / 2; - iPad[RIGHT] += iExtra - iExtra / 2; + iPadX[PAD_TOP_LEFT] += iExtra / 2; + iPadX[PAD_BOTTOM_RIGHT] += iExtra - iExtra / 2; } else if (eLink1->flags & ELF_iEXPAND_W) - iPad[LEFT] += iExtra; + iPadX[PAD_TOP_LEFT] += iExtra; else - iPad[RIGHT] += iExtra; + iPadX[PAD_BOTTOM_RIGHT] += iExtra; layout->iWidth += iExtra; } layout->eWidth += extraWidth; @@ -548,19 +563,22 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (!(eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadX = eLink1->ePadX; + iPadX = eLink1->iPadX; + uPadX = layout->uPadX; layout->eLink = eLink2; layout->master = eLink1; - layout->x = abs(ePad[LEFT] - MAX(ePad[LEFT], uPad[LEFT])); - layout->iWidth = iPad[LEFT] + layout->useWidth + iPad[RIGHT]; - layout->eWidth = ePad[LEFT] + layout->iWidth + ePad[RIGHT]; - for (j = 0; j < 4; j++) + layout->x = abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT])); + layout->iWidth = iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT]; + layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; + + for (j = 0; j < 2; j++) { - layout->ePad[j] = ePad[j]; - layout->iPad[j] = iPad[j]; + layout->ePadX[j] = eLink1->ePadX[j]; + layout->ePadY[j] = eLink1->ePadY[j]; + layout->iPadX[j] = eLink1->iPadX[j]; + layout->iPadY[j] = eLink1->iPadY[j]; } Style_DoExpandH(layout, eLink1->flags, drawArgs->width); @@ -577,8 +595,8 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->onion == NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; + ePadX = eLink1->ePadX; + iPadX = eLink1->iPadX; w = 10000, e = -10000; @@ -586,19 +604,22 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { struct Layout *layout2 = &layouts[eLink1->onion[j]]; - w = MIN(w, layout2->x + layout2->ePad[LEFT]); - e = MAX(e, layout2->x + layout2->ePad[LEFT] + layout2->iWidth); + w = MIN(w, layout2->x + layout2->ePadX[PAD_TOP_LEFT]); + e = MAX(e, layout2->x + layout2->ePadX[PAD_TOP_LEFT] + layout2->iWidth); } layout->eLink = eLink2; layout->master = eLink1; - layout->x = w - iPad[LEFT] - ePad[LEFT]; - layout->iWidth = iPad[LEFT] + (e - w) + iPad[RIGHT]; - layout->eWidth = ePad[LEFT] + layout->iWidth + ePad[RIGHT]; - for (j = 0; j < 4; j++) + layout->x = w - iPadX[PAD_TOP_LEFT] - ePadX[PAD_TOP_LEFT]; + layout->iWidth = iPadX[PAD_TOP_LEFT] + (e - w) + iPadX[PAD_BOTTOM_RIGHT]; + layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; + + for (j = 0; j < 2; j++) { - layout->ePad[j] = ePad[j]; - layout->iPad[j] = iPad[j]; + layout->ePadX[j] = eLink1->ePadX[j]; + layout->ePadY[j] = eLink1->ePadY[j]; + layout->iPadX[j] = eLink1->iPadX[j]; + layout->iPadY[j] = eLink1->iPadY[j]; } } @@ -627,19 +648,19 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) int iExtra = extraWidth - extraWidth / 2; /* External expansion */ - layout->ePad[LEFT] += eExtra; + layout->ePadX[PAD_TOP_LEFT] += eExtra; layout->x = 0; layout->eWidth += extraWidth; /* Internal expansion */ - layout->iPad[LEFT] += iExtra; + layout->iPadX[PAD_TOP_LEFT] += iExtra; layout->iWidth += iExtra; } /* External expansion only: W */ else if (eLink1->flags & ELF_eEXPAND_W) { - layout->ePad[LEFT] += extraWidth; + layout->ePadX[PAD_TOP_LEFT] += extraWidth; layout->x = 0; layout->eWidth += extraWidth; } @@ -647,7 +668,7 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) /* Internal expansion only: W */ else { - layout->iPad[LEFT] += extraWidth; + layout->iPadX[PAD_TOP_LEFT] += extraWidth; layout->x = 0; layout->iWidth += extraWidth; layout->eWidth += extraWidth; @@ -664,25 +685,25 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) int iExtra = extraWidth - extraWidth / 2; /* External expansion */ - layout->ePad[RIGHT] += eExtra; + layout->ePadX[PAD_BOTTOM_RIGHT] += eExtra; layout->eWidth += extraWidth; /* all the space */ /* Internal expansion */ - layout->iPad[RIGHT] += iExtra; + layout->iPadX[PAD_BOTTOM_RIGHT] += iExtra; layout->iWidth += iExtra; } /* External expansion only: E */ else if (eLink1->flags & ELF_eEXPAND_E) { - layout->ePad[RIGHT] += extraWidth; + layout->ePadX[PAD_BOTTOM_RIGHT] += extraWidth; layout->eWidth += extraWidth; } /* Internal expansion only: E */ else { - layout->iPad[RIGHT] += extraWidth; + layout->iPadX[PAD_BOTTOM_RIGHT] += extraWidth; layout->iWidth += extraWidth; layout->eWidth += extraWidth; } @@ -699,7 +720,7 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) ElementLink *eLinks1, *eLinks2, *eLink1, *eLink2; int y = 0; int n, s; - int *ePad, *iPad, *uPad; + int *ePadY, *iPadY, *uPadY; int numExpandNS = 0; int numSqueezeY = 0; int i, j, eLinkCount = 0; @@ -763,18 +784,18 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->onion != NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; + uPadY = layout->uPadY; if ((eLink1->flags & ELF_SQUEEZE_Y) && ((eLink1->flags & ELF_DETACH) || !masterStyle->vertical)) { int height = - MAX(ePad[TOP], uPad[TOP]) + - iPad[TOP] + layout->useHeight + iPad[BOTTOM] + - MAX(ePad[BOTTOM], uPad[BOTTOM]); + MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT]) + + iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT] + + MAX(ePadY[PAD_BOTTOM_RIGHT], uPadY[PAD_BOTTOM_RIGHT]); if (height > drawArgs->height) layout->useHeight -= (height - drawArgs->height); } @@ -789,16 +810,16 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) eLink1 = &eLinks1[i]; eLink2 = &eLinks2[i]; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; + uPadY = layout->uPadY; if ((eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; - layout->y = MAX(y, abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP]))); - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; + layout->y = MAX(y, abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT]))); + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; if (masterStyle->vertical) y = layout->y + layout->eHeight; @@ -840,8 +861,8 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (layouts[j].eLink != NULL) layouts[j].y += extraHeight; - ePad = layout->ePad; - iPad = layout->iPad; + ePadY = layout->ePadY; + iPadY = layout->iPadY; /* External and internal expansion */ if ((eLink1->flags & ELF_eEXPAND_NS) && (eLink1->flags & ELF_iEXPAND_NS)) @@ -860,13 +881,13 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { if ((eLink1->flags & ELF_eEXPAND_NS) == ELF_eEXPAND_NS) { - ePad[TOP] += eExtra / 2; - ePad[BOTTOM] += eExtra - eExtra / 2; + ePadY[PAD_TOP_LEFT] += eExtra / 2; + ePadY[PAD_BOTTOM_RIGHT] += eExtra - eExtra / 2; } else if (eLink1->flags & ELF_eEXPAND_N) - ePad[TOP] += eExtra; + ePadY[PAD_TOP_LEFT] += eExtra; else - ePad[BOTTOM] += eExtra; + ePadY[PAD_BOTTOM_RIGHT] += eExtra; } /* Internal expansion */ @@ -874,13 +895,13 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { if ((eLink1->flags & ELF_iEXPAND_NS) == ELF_iEXPAND_NS) { - iPad[TOP] += iExtra / 2; - iPad[BOTTOM] += iExtra - iExtra / 2; + iPadY[PAD_TOP_LEFT] += iExtra / 2; + iPadY[PAD_BOTTOM_RIGHT] += iExtra - iExtra / 2; } else if (eLink1->flags & ELF_iEXPAND_N) - iPad[TOP] += iExtra; + iPadY[PAD_TOP_LEFT] += iExtra; else - iPad[BOTTOM] += iExtra; + iPadY[PAD_BOTTOM_RIGHT] += iExtra; layout->iHeight += iExtra; } layout->eHeight += extraHeight; @@ -914,13 +935,13 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (!(eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; + uPadY = layout->uPadY; - layout->y = abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP])); - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; + layout->y = abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT])); + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; Style_DoExpandV(layout, eLink1->flags, drawArgs->height); } @@ -936,8 +957,8 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->onion == NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; n = 10000, s = -10000; @@ -945,13 +966,13 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { struct Layout *layout2 = &layouts[eLink1->onion[j]]; - n = MIN(n, layout2->y + layout2->ePad[TOP]); - s = MAX(s, layout2->y + layout2->ePad[TOP] + layout2->iHeight); + n = MIN(n, layout2->y + layout2->ePadY[PAD_TOP_LEFT]); + s = MAX(s, layout2->y + layout2->ePadY[PAD_TOP_LEFT] + layout2->iHeight); } - layout->y = n - iPad[TOP] - ePad[TOP]; - layout->iHeight = iPad[TOP] + (s - n) + iPad[BOTTOM]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; + layout->y = n - iPadY[PAD_TOP_LEFT] - ePadY[PAD_TOP_LEFT]; + layout->iHeight = iPadY[PAD_TOP_LEFT] + (s - n) + iPadY[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; } /* Expand -union elements if needed: vertical */ @@ -978,19 +999,19 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) int iExtra = extraHeight - extraHeight / 2; /* External expansion */ - layout->ePad[TOP] += eExtra; + layout->ePadY[PAD_TOP_LEFT] += eExtra; layout->y = 0; layout->eHeight += extraHeight; /* Internal expansion */ - layout->iPad[TOP] += iExtra; + layout->iPadY[PAD_TOP_LEFT] += iExtra; layout->iHeight += iExtra; } /* External expansion only: N */ else if (eLink1->flags & ELF_eEXPAND_N) { - layout->ePad[TOP] += extraHeight; + layout->ePadY[PAD_TOP_LEFT] += extraHeight; layout->y = 0; layout->eHeight += extraHeight; } @@ -998,7 +1019,7 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) /* Internal expansion only: N */ else { - layout->iPad[TOP] += extraHeight; + layout->iPadY[PAD_TOP_LEFT] += extraHeight; layout->y = 0; layout->iHeight += extraHeight; layout->eHeight += extraHeight; @@ -1015,25 +1036,25 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) int iExtra = extraHeight - extraHeight / 2; /* External expansion */ - layout->ePad[BOTTOM] += eExtra; + layout->ePadY[PAD_BOTTOM_RIGHT] += eExtra; layout->eHeight += extraHeight; /* all the space */ /* Internal expansion */ - layout->iPad[BOTTOM] += iExtra; + layout->iPadY[PAD_BOTTOM_RIGHT] += iExtra; layout->iHeight += iExtra; } /* External expansion only: S */ else if (eLink1->flags & ELF_eEXPAND_S) { - layout->ePad[BOTTOM] += extraHeight; + layout->ePadY[PAD_BOTTOM_RIGHT] += extraHeight; layout->eHeight += extraHeight; } /* Internal expansion only */ else { - layout->iPad[BOTTOM] += extraHeight; + layout->iPadY[PAD_BOTTOM_RIGHT] += extraHeight; layout->iHeight += extraHeight; layout->eHeight += extraHeight; } @@ -1056,10 +1077,10 @@ static void Layout_Size(int vertical, int numLayouts, struct Layout layouts[20], struct Layout *layout = &layouts[i]; int w, n, e, s; - w = layout->x + layout->ePad[LEFT] - MAX(layout->ePad[LEFT], layout->uPad[LEFT]); - n = layout->y + layout->ePad[TOP] - MAX(layout->ePad[TOP], layout->uPad[TOP]); - e = layout->x + layout->eWidth - layout->ePad[RIGHT] + MAX(layout->ePad[RIGHT], layout->uPad[RIGHT]); - s = layout->y + layout->eHeight - layout->ePad[BOTTOM] + MAX(layout->ePad[BOTTOM], layout->uPad[BOTTOM]); + w = layout->x + layout->ePadX[PAD_TOP_LEFT] - MAX(layout->ePadX[PAD_TOP_LEFT], layout->uPadX[PAD_TOP_LEFT]); + n = layout->y + layout->ePadY[PAD_TOP_LEFT] - MAX(layout->ePadY[PAD_TOP_LEFT], layout->uPadY[PAD_TOP_LEFT]); + e = layout->x + layout->eWidth - layout->ePadX[PAD_BOTTOM_RIGHT] + MAX(layout->ePadX[PAD_BOTTOM_RIGHT], layout->uPadX[PAD_BOTTOM_RIGHT]); + s = layout->y + layout->eHeight - layout->ePadY[PAD_BOTTOM_RIGHT] + MAX(layout->ePadY[PAD_BOTTOM_RIGHT], layout->uPadY[PAD_BOTTOM_RIGHT]); if (vertical) { @@ -1090,7 +1111,7 @@ void Style_DoLayoutNeededV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) Style *style = (Style *) drawArgs->style; Style *masterStyle = style->master; ElementLink *eLinks1, *eLinks2, *eLink1, *eLink2; - int *ePad, *iPad, *uPad; + int *ePadY, *iPadY, *uPadY; int i; int y = 0; @@ -1105,9 +1126,9 @@ void Style_DoLayoutNeededV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) eLink1 = &eLinks1[i]; eLink2 = &eLinks2[i]; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; + uPadY = layout->uPadY; /* The size of a -union element is determined by the elements * it surrounds */ @@ -1118,9 +1139,9 @@ void Style_DoLayoutNeededV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->flags & ELF_DETACH) continue; - layout->y = MAX(y, abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP]))); - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; + layout->y = MAX(y, abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT]))); + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; if (masterStyle->vertical) y = layout->y + layout->eHeight; @@ -1137,13 +1158,13 @@ void Style_DoLayoutNeededV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (!(eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; + uPadY = layout->uPadY; - layout->y = abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP])); - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; + layout->y = abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT])); + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; } } @@ -1263,8 +1284,8 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width Style *masterStyle = style->master; ElementLink *eLinks1, *eLinks2, *eLink1, *eLink2; struct Layout layouts[20]; - int *ePad, *iPad, *uPad; - int i, j, k; + int *ePadX, *iPadX, *uPadX, *ePadY, *iPadY, *uPadY; + int i, j; int x = 0, y = 0; if (style->master != NULL) @@ -1283,8 +1304,10 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width struct Layout *layout = &layouts[i]; /* No -union padding yet */ - for (j = 0; j < 4; j++) - layout->uPad[j] = 0; + layout->uPadX[PAD_TOP_LEFT] = 0; + layout->uPadX[PAD_BOTTOM_RIGHT] = 0; + layout->uPadY[PAD_TOP_LEFT] = 0; + layout->uPadY[PAD_BOTTOM_RIGHT] = 0; } /* Figure out the padding around elements surrounded by -union elements */ @@ -1295,16 +1318,21 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width if (eLink1->onion == NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; + ePadX = eLink1->ePadX; + ePadY = eLink1->ePadY; + iPadX = eLink1->iPadX; + iPadY = eLink1->iPadY; for (j = 0; j < eLink1->onionCount; j++) { struct Layout *layout = &layouts[eLink1->onion[j]]; - uPad = layout->uPad; - for (k = 0; k < 4; k++) - uPad[k] = MAX(uPad[k], iPad[k] + ePad[k]); + uPadX = layout->uPadX; + uPadY = layout->uPadY; + uPadX[PAD_TOP_LEFT] = MAX(uPadX[PAD_TOP_LEFT], iPadX[PAD_TOP_LEFT] + ePadX[PAD_TOP_LEFT]); + uPadX[PAD_BOTTOM_RIGHT] = MAX(uPadX[PAD_BOTTOM_RIGHT], iPadX[PAD_BOTTOM_RIGHT] + ePadX[PAD_BOTTOM_RIGHT]); + uPadY[PAD_TOP_LEFT] = MAX(uPadY[PAD_TOP_LEFT], iPadY[PAD_TOP_LEFT] + ePadY[PAD_TOP_LEFT]); + uPadY[PAD_BOTTOM_RIGHT] = MAX(uPadY[PAD_BOTTOM_RIGHT], iPadY[PAD_BOTTOM_RIGHT] + ePadY[PAD_BOTTOM_RIGHT]); } } @@ -1316,17 +1344,26 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width eLink1 = &eLinks1[i]; eLink2 = &eLinks2[i]; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadX = eLink1->ePadX; + ePadY = eLink1->ePadY; + iPadX = eLink1->iPadX; + iPadY = eLink1->iPadY; + uPadX = layout->uPadX; + uPadY = layout->uPadY; /* The size of a -union element is determined by the elements * it surrounds */ if (eLink1->onion != NULL) { layout->x = layout->y = layout->eWidth = layout->eHeight = 0; - for (j = 0; j < 4; j++) - layout->ePad[j] = layout->iPad[j] = 0; + layout->ePadX[PAD_TOP_LEFT] = 0; + layout->ePadX[PAD_BOTTOM_RIGHT] = 0; + layout->ePadY[PAD_TOP_LEFT] = 0; + layout->ePadY[PAD_BOTTOM_RIGHT] = 0; + layout->iPadX[PAD_TOP_LEFT] = 0; + layout->iPadX[PAD_BOTTOM_RIGHT] = 0; + layout->iPadY[PAD_TOP_LEFT] = 0; + layout->iPadY[PAD_BOTTOM_RIGHT] = 0; continue; } @@ -1362,16 +1399,19 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width continue; layout->eLink = eLink2; - layout->x = MAX(x, abs(ePad[LEFT] - MAX(ePad[LEFT], uPad[LEFT]))); - layout->y = MAX(y, abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP]))); - layout->iWidth = iPad[LEFT] + layout->useWidth + iPad[RIGHT]; - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eWidth = ePad[LEFT] + layout->iWidth + ePad[RIGHT]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; - for (j = 0; j < 4; j++) + layout->x = MAX(x, abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT]))); + layout->y = MAX(y, abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT]))); + layout->iWidth = iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT]; + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; + + for (j = 0; j < 2; j++) { - layout->ePad[j] = ePad[j]; - layout->iPad[j] = iPad[j]; + layout->ePadX[j] = eLink1->ePadX[j]; + layout->ePadY[j] = eLink1->ePadY[j]; + layout->iPadX[j] = eLink1->iPadX[j]; + layout->iPadY[j] = eLink1->iPadY[j]; } if (masterStyle->vertical) @@ -1391,22 +1431,28 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width if (!(eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadX = eLink1->ePadX; + ePadY = eLink1->ePadY; + iPadX = eLink1->iPadX; + iPadY = eLink1->iPadY; + uPadX = layout->uPadX; + uPadY = layout->uPadY; layout->eLink = eLink2; layout->master = eLink1; - layout->x = abs(ePad[LEFT] - MAX(ePad[LEFT], uPad[LEFT])); - layout->y = abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP])); - layout->iWidth = iPad[LEFT] + layout->useWidth + iPad[RIGHT]; - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eWidth = ePad[LEFT] + layout->iWidth + ePad[RIGHT]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; - for (j = 0; j < 4; j++) + layout->x = abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT])); + layout->y = abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT])); + layout->iWidth = iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT]; + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; + + for (j = 0; j < 2; j++) { - layout->ePad[j] = ePad[j]; - layout->iPad[j] = iPad[j]; + layout->ePadX[j] = eLink1->ePadX[j]; + layout->ePadY[j] = eLink1->ePadY[j]; + layout->iPadX[j] = eLink1->iPadX[j]; + layout->iPadY[j] = eLink1->iPadY[j]; } } @@ -1516,14 +1562,14 @@ void TreeStyle_Draw(StyleDrawArgs *drawArgs) if ((layout->iWidth > 0) && (layout->iHeight > 0)) { args.elem = layout->eLink->elem; - args.display.x = drawArgs->x + layout->x + layout->ePad[LEFT]; - args.display.y = drawArgs->y + layout->y + layout->ePad[TOP]; + args.display.x = drawArgs->x + layout->x + layout->ePadX[PAD_TOP_LEFT]; + args.display.y = drawArgs->y + layout->y + layout->ePadY[PAD_TOP_LEFT]; args.display.width = layout->iWidth; args.display.height = layout->iHeight; - args.display.pad[LEFT] = layout->iPad[LEFT]; - args.display.pad[TOP] = layout->iPad[TOP]; - args.display.pad[RIGHT] = layout->iPad[RIGHT]; - args.display.pad[BOTTOM] = layout->iPad[BOTTOM]; + args.display.pad[LEFT] = layout->iPadX[PAD_TOP_LEFT]; + args.display.pad[TOP] = layout->iPadY[PAD_TOP_LEFT]; + args.display.pad[RIGHT] = layout->iPadX[PAD_BOTTOM_RIGHT]; + args.display.pad[BOTTOM] = layout->iPadY[PAD_BOTTOM_RIGHT]; if (debugDraw) { XColor *color[3]; @@ -1549,8 +1595,8 @@ void TreeStyle_Draw(StyleDrawArgs *drawArgs) /* external */ XFillRectangle(tree->display, args.display.drawable, gc[2], - args.display.x - layout->ePad[LEFT], - args.display.y - layout->ePad[TOP], + args.display.x - layout->ePadX[PAD_TOP_LEFT], + args.display.y - layout->ePadY[PAD_TOP_LEFT], layout->eWidth, layout->eHeight); /* internal */ XFillRectangle(tree->display, args.display.drawable, @@ -1561,8 +1607,8 @@ void TreeStyle_Draw(StyleDrawArgs *drawArgs) if (!layout->master->onion && !(layout->master->flags & ELF_DETACH)) XFillRectangle(tree->display, args.display.drawable, gc[0], - args.display.x + layout->iPad[LEFT], - args.display.y + layout->iPad[TOP], + args.display.x + layout->iPadX[PAD_TOP_LEFT], + args.display.y + layout->iPadY[PAD_TOP_LEFT], layout->eLink->neededWidth, layout->eLink->neededHeight); } else @@ -1580,14 +1626,14 @@ void TreeStyle_Draw(StyleDrawArgs *drawArgs) if (layout->iWidth > 0 && layout->iHeight > 0) { args.elem = layout->eLink->elem; - args.display.x = drawArgs->x + layout->x + layout->ePad[LEFT]; - args.display.y = drawArgs->y + layout->y + layout->ePad[TOP]; + args.display.x = drawArgs->x + layout->x + layout->ePadX[PAD_TOP_LEFT]; + args.display.y = drawArgs->y + layout->y + layout->ePadY[PAD_TOP_LEFT]; args.display.width = layout->iWidth; args.display.height = layout->iHeight; - args.display.pad[LEFT] = layout->iPad[LEFT]; - args.display.pad[TOP] = layout->iPad[TOP]; - args.display.pad[RIGHT] = layout->iPad[RIGHT]; - args.display.pad[BOTTOM] = layout->iPad[BOTTOM]; + args.display.pad[LEFT] = layout->iPadX[PAD_TOP_LEFT]; + args.display.pad[TOP] = layout->iPadY[PAD_TOP_LEFT]; + args.display.pad[RIGHT] = layout->iPadX[PAD_BOTTOM_RIGHT]; + args.display.pad[BOTTOM] = layout->iPadY[PAD_BOTTOM_RIGHT]; { XColor *color[3]; GC gc[3]; @@ -1600,8 +1646,8 @@ void TreeStyle_Draw(StyleDrawArgs *drawArgs) /* external */ XDrawRectangle(tree->display, args.display.drawable, gc[0], - args.display.x - layout->ePad[LEFT], - args.display.y - layout->ePad[TOP], + args.display.x - layout->ePadX[PAD_TOP_LEFT], + args.display.y - layout->ePadY[PAD_TOP_LEFT], layout->eWidth - 1, layout->eHeight - 1); /* internal */ XDrawRectangle(tree->display, args.display.drawable, @@ -2722,14 +2768,12 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, Style *style; Element *elem; ElementLink *eLink; - int i, index, pad; - static CONST char *optionNames[] = { "-padw", "-padn", "-pade", - "-pads", "-ipadw", "-ipadn", "-ipade", - "-ipads", "-expand", "-union", "-detach", "-iexpand", + int i, index; + static CONST char *optionNames[] = { "-padx", "-pady", "-ipadx", + "-ipady", "-expand", "-union", "-detach", "-iexpand", "-squeeze", (char *) NULL }; - enum { OPTION_PADLEFT, OPTION_PADTOP, OPTION_PADRIGHT, - OPTION_PADBOTTOM, OPTION_iPADLEFT, OPTION_iPADTOP, - OPTION_iPADRIGHT, OPTION_iPADBOTTOM, OPTION_EXPAND, + enum { OPTION_PADX, OPTION_PADY, OPTION_iPADX, OPTION_iPADY, + OPTION_EXPAND, OPTION_UNION, OPTION_DETACH, OPTION_iEXPAND, OPTION_SQUEEZE }; if (objc < 5) @@ -2760,22 +2804,14 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *listObj = Tcl_NewListObj(0, NULL); Tcl_Obj *unionObj = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-padw", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->ePad[LEFT])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-padn", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->ePad[TOP])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-pade", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->ePad[RIGHT])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-pads", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->ePad[BOTTOM])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipadw", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPad[LEFT])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipadn", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPad[TOP])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipade", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPad[RIGHT])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipads", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPad[BOTTOM])); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-padx", -1)); + Tcl_ListObjAppendElement(interp, listObj, TreeCtrl_NewPadAmountObj(eLink->ePadX)); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-pady", -1)); + Tcl_ListObjAppendElement(interp, listObj, TreeCtrl_NewPadAmountObj(eLink->ePadY)); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipadx", -1)); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPadX[PAD_TOP_LEFT])); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipady", -1)); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPadY[PAD_TOP_LEFT])); n = 0; if (eLink->flags & ELF_eEXPAND_W) flags[n++] = 'w'; @@ -2822,20 +2858,24 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, return TCL_ERROR; switch (index) { - case OPTION_PADLEFT: - case OPTION_PADTOP: - case OPTION_PADRIGHT: - case OPTION_PADBOTTOM: + case OPTION_PADX: + { + objPtr = TreeCtrl_NewPadAmountObj(eLink->ePadX); + break; + } + case OPTION_PADY: { - objPtr = Tcl_NewIntObj(eLink->ePad[index - OPTION_PADLEFT]); + objPtr = TreeCtrl_NewPadAmountObj(eLink->ePadY); break; } - case OPTION_iPADLEFT: - case OPTION_iPADTOP: - case OPTION_iPADRIGHT: - case OPTION_iPADBOTTOM: + case OPTION_iPADX: { - objPtr = Tcl_NewIntObj(eLink->iPad[index - OPTION_iPADLEFT]); + objPtr = TreeCtrl_NewPadAmountObj(eLink->iPadX); + break; + } + case OPTION_iPADY: + { + objPtr = TreeCtrl_NewPadAmountObj(eLink->iPadY); break; } case OPTION_DETACH: @@ -2913,24 +2953,40 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, } switch (index) { - case OPTION_PADLEFT: - case OPTION_PADTOP: - case OPTION_PADRIGHT: - case OPTION_PADBOTTOM: + case OPTION_PADX: + { + if (TreeCtrl_GetPadAmountFromObj(interp, + tree->tkwin, objv[i + 1], + &eLink->ePadX[PAD_TOP_LEFT], + &eLink->ePadX[PAD_BOTTOM_RIGHT]) != TCL_OK) + return TCL_ERROR; + break; + } + case OPTION_PADY: + { + if (TreeCtrl_GetPadAmountFromObj(interp, + tree->tkwin, objv[i + 1], + &eLink->ePadY[PAD_TOP_LEFT], + &eLink->ePadY[PAD_BOTTOM_RIGHT]) != TCL_OK) + return TCL_ERROR; + break; + } + case OPTION_iPADX: { - if (Tk_GetPixelsFromObj(interp, tree->tkwin, objv[i + 1], &pad) != TCL_OK) + if (TreeCtrl_GetPadAmountFromObj(interp, + tree->tkwin, objv[i + 1], + &eLink->iPadX[PAD_TOP_LEFT], + &eLink->iPadX[PAD_BOTTOM_RIGHT]) != TCL_OK) return TCL_ERROR; - eLink->ePad[index - OPTION_PADLEFT] = pad; break; } - case OPTION_iPADLEFT: - case OPTION_iPADTOP: - case OPTION_iPADRIGHT: - case OPTION_iPADBOTTOM: + case OPTION_iPADY: { - if (Tk_GetPixelsFromObj(interp, tree->tkwin, objv[i + 1], &pad) != TCL_OK) + if (TreeCtrl_GetPadAmountFromObj(interp, + tree->tkwin, objv[i + 1], + &eLink->iPadY[PAD_TOP_LEFT], + &eLink->iPadY[PAD_BOTTOM_RIGHT]) != TCL_OK) return TCL_ERROR; - eLink->iPad[index - OPTION_iPADLEFT] = pad; break; } case OPTION_DETACH: @@ -3360,8 +3416,8 @@ char *TreeStyle_Identify(StyleDrawArgs *drawArgs, int x, int y) { struct Layout *layout = &layouts[i]; eLink = layout->eLink; - if ((x >= layout->x + layout->ePad[LEFT]) && (x < layout->x + layout->ePad[LEFT] + layout->iWidth) && - (y >= layout->y + layout->ePad[TOP]) && (y < layout->y + layout->ePad[TOP] + layout->iHeight)) + if ((x >= layout->x + layout->ePadX[PAD_TOP_LEFT]) && (x < layout->x + layout->ePadX[PAD_TOP_LEFT] + layout->iWidth) && + (y >= layout->y + layout->ePadY[PAD_TOP_LEFT]) && (y < layout->y + layout->ePadY[PAD_TOP_LEFT] + layout->iHeight)) { return (char *) eLink->elem->name; } @@ -3397,10 +3453,10 @@ void TreeStyle_Identify2(StyleDrawArgs *drawArgs, { struct Layout *layout = &layouts[i]; eLink = layout->eLink; - if ((drawArgs->x + layout->x + layout->ePad[LEFT] < x2) && - (drawArgs->x + layout->x + layout->ePad[LEFT] + layout->iWidth > x1) && - (drawArgs->y + layout->y + layout->ePad[TOP] < y2) && - (drawArgs->y + layout->y + layout->ePad[TOP] + layout->iHeight > y1)) + if ((drawArgs->x + layout->x + layout->ePadX[PAD_TOP_LEFT] < x2) && + (drawArgs->x + layout->x + layout->ePadX[PAD_TOP_LEFT] + layout->iWidth > x1) && + (drawArgs->y + layout->y + layout->ePadY[PAD_TOP_LEFT] < y2) && + (drawArgs->y + layout->y + layout->ePadY[PAD_TOP_LEFT] + layout->iHeight > y1)) { Tcl_ListObjAppendElement(drawArgs->tree->interp, listObj, Tcl_NewStringObj(eLink->elem->name, -1)); @@ -3614,8 +3670,8 @@ int TreeStyle_GetElemRects(StyleDrawArgs *drawArgs, int objc, if (j == objc) continue; } - rects[count].x = drawArgs->x + layout->x + layout->ePad[LEFT]; - rects[count].y = drawArgs->y + layout->y + layout->ePad[TOP]; + rects[count].x = drawArgs->x + layout->x + layout->ePadX[PAD_TOP_LEFT]; + rects[count].y = drawArgs->y + layout->y + layout->ePadY[PAD_TOP_LEFT]; rects[count].width = layout->iWidth; rects[count].height = layout->iHeight; count++; diff --git a/generic/tkTreeUtils.c b/generic/tkTreeUtils.c index f03de2d..75a245a 100644 --- a/generic/tkTreeUtils.c +++ b/generic/tkTreeUtils.c @@ -3,6 +3,37 @@ #include "tkWinInt.h" #endif +/* + * Forward declarations for procedures defined later in this file: + */ + +static int PadAmountOptionSet _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, + Tcl_Obj **value, char *recordPtr, int internalOffset, + char *saveInternalPtr, int flags)); +static Tcl_Obj *PadAmountOptionGet _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *recordPtr, int internalOffset)); +static void PadAmountOptionRestore _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *internalPtr, + char *saveInternalPtr)); +static void PadAmountOptionFree _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *internalPtr)); + +/* + * The following Tk_ObjCustomOption structure can be used as clientData entry + * of a Tk_OptionSpec record with a TK_OPTION_CUSTOM type in the form + * "(ClientData) &PadAmountOption"; the option will then parse list with + * one or two screen distances. + */ + +Tk_ObjCustomOption PadAmountOption = { + "pad amount", + PadAmountOptionSet, + PadAmountOptionGet, + PadAmountOptionRestore, + PadAmountOptionFree +}; + void wipefree(char *memPtr, int size) { memset(memPtr, 0xAA, size); @@ -879,3 +910,235 @@ void TextLayout_Draw( chunkPtr++; } } + +/* + *---------------------------------------------------------------------- + * + * TreeCtrl_GetPadAmountFromObj -- + * + * Parse a pad amount configuration options. + * A pad amount (typically the value of an option -XXXpadx or + * -XXXpady, where XXX may be a possibly empty string) can + * be either a single pixel width, or a list of two pixel widths. + * If a single pixel width, the amount specified is used for + * padding on both sides. If two amounts are specified, then + * they specify the left/right or top/bottom padding. + * + * Results: + * Standard Tcl Result. + * + * Side effects: + * Sets internal representation of the object. In case of an error + * the result of the interpreter is modified. + * + *---------------------------------------------------------------------- + */ + +int +TreeCtrl_GetPadAmountFromObj(interp, tkwin, padObj, topLeftPtr, bottomRightPtr) + Tcl_Interp *interp; /* Interpreter for error reporting, or NULL, + * if no error message is wanted. */ + Tk_Window tkwin; /* A window. Needed by Tk_GetPixels() */ + Tcl_Obj *padObj; /* Object containing a pad amount. */ + int *topLeftPtr; /* Pointer to the location, where to store the + first component of the padding. */ + int *bottomRightPtr; /* Pointer to the location, where to store the + second component of the padding. */ +{ + int padc; /* Number of element objects in padv. */ + Tcl_Obj **padv; /* Pointer to the element objects of the + * parsed pad amount value. */ + + if (Tcl_ListObjGetElements(interp, padObj, &padc, &padv) != TCL_OK) { + return TCL_ERROR; + } + + /* + * The value specifies a non empty string. + * Check that this string is indeed a valid pad amount. + */ + + if (padc < 1 || padc > 2) { + if (interp != NULL) { + error: + Tcl_ResetResult(interp); + Tcl_AppendResult(interp, "bad pad amount \"", + Tcl_GetString(padObj), "\": must be a list of ", + "1 or 2 positive screen distances", (char *) NULL); + } + return TCL_ERROR; + } + if ((Tk_GetPixelsFromObj(interp, tkwin, padv[0], topLeftPtr) + != TCL_OK) || (*topLeftPtr < 0)) { + goto error; + } + if (padc == 2) { + if ((Tk_GetPixelsFromObj(interp, tkwin, padv[1], bottomRightPtr) + != TCL_OK) || (*bottomRightPtr < 0)) { + goto error; + } + } else { + *bottomRightPtr = *topLeftPtr; + } + return TCL_OK; +} + +/* + *---------------------------------------------------------------------- + * + * TreeCtrl_NewPadAmountObj -- + * + * Create a Tcl object with an internal representation, that + * corresponds to a pad amount, i.e. an integer Tcl_Obj or a + * list Tcl_Obj with 2 elements. + * + * Results: + * The created object. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +Tcl_Obj * +TreeCtrl_NewPadAmountObj(padAmounts) + int *padAmounts; /* Internal form of a pad amount. */ +{ + Tcl_Obj *newObj; + + /* + * If both values are the same, create a list with one value, + * otherwise create a two element list with the top/left value + * first followed by the bottom/right value. + */ + + if (padAmounts[PAD_TOP_LEFT] == padAmounts[PAD_BOTTOM_RIGHT]) { + newObj = Tcl_NewIntObj(padAmounts[PAD_TOP_LEFT]); + } else { + newObj = Tcl_NewObj(); + Tcl_ListObjAppendElement((Tcl_Interp *) NULL, newObj, + Tcl_NewIntObj(padAmounts[PAD_TOP_LEFT])); + Tcl_ListObjAppendElement((Tcl_Interp *) NULL, newObj, + Tcl_NewIntObj(padAmounts[PAD_BOTTOM_RIGHT])); + } + return newObj; +} + +/* + *---------------------------------------------------------------------- + * + * PadAmountOptionSet -- + * PadAmountOptionGet -- + * PadAmountOptionRestore -- + * PadAmountOptionFree -- + * + * Handlers for object-based pad amount configuration options. + * A pad amount (typically the value of an option -XXXpadx or + * -XXXpady, where XXX may be a possibly empty string) can + * be either a single pixel width, or a list of two pixel widths. + * If a single pixel width, the amount specified is used for + * padding on both sides. If two amounts are specified, then + * they specify the left/right or top/bottom padding. + * + * Results: + * See user documentation for expected results from these functions. + * PadAmountOptionSet Standard Tcl Result. + * PadAmountOptionGet Tcl_Obj * containing a valid internal + * representation of the pad amount. + * PadAmountOptionRestore None. + * PadAmountOptionFree None. + * + * Side effects: + * Depends on the function. + * PadAmountOptionSet Sets option value to new setting, + * allocating a new integer array. + * PadAmountOptionGet Creates a new Tcl_Obj. + * PadAmountOptionRestore Resets option value to original value. + * PadAmountOptionFree Free storage for internal rep. + * + *---------------------------------------------------------------------- + */ + +static int +PadAmountOptionSet(clientData, interp, tkwin, valuePtr, recordPtr, + internalOffset, saveInternalPtr, flags) + ClientData clientData; /* unused. */ + Tcl_Interp *interp; /* Interpreter for error reporting, or NULL, + * if no error message is wanted. */ + Tk_Window tkwin; /* A window. Needed by Tk_GetPixels() */ + Tcl_Obj **valuePtr; /* The argument to "-padx", "-pady", "-ipadx", + * or "-ipady". The thing to be parsed. */ + char *recordPtr; /* Pointer to start of widget record. */ + int internalOffset; /* Offset of internal representation or + * -1, if no internal repr is wanted. */ + char *saveInternalPtr; /* Pointer to the place, where the saved + * internal form (of type "int *") resides. */ + int flags; /* Flags as specified in Tk_OptionSpec. */ +{ + int topLeft, bottomRight; /* The two components of the padding. */ + int *new; /* Pointer to the allocated array of integers + * containing the parsed pad amounts. */ + int **internalPtr; /* Pointer to the place, where the internal + * form (of type "int *") resides. */ + + /* + * Check that the given object indeed specifies a valid pad amount. + */ + + if (TreeCtrl_GetPadAmountFromObj(interp, tkwin, *valuePtr, + &topLeft, &bottomRight) != TCL_OK) { + return TCL_ERROR; + } + + /* + * Store a pointer to an allocated array of the two padding values + * into the widget record at the specified offset. + */ + + if (internalOffset >= 0) { + internalPtr = (int **) (recordPtr + internalOffset); + *(int **) saveInternalPtr = *internalPtr; + new = (int *) ckalloc(2 * sizeof(int)); + new[PAD_TOP_LEFT] = topLeft; + new[PAD_BOTTOM_RIGHT] = bottomRight; + *internalPtr = new; + } + return TCL_OK; +} + +static Tcl_Obj * +PadAmountOptionGet(clientData, tkwin, recordPtr, internalOffset) + ClientData clientData; /* unused. */ + Tk_Window tkwin; /* A window; unused. */ + char *recordPtr; /* Pointer to start of widget record. */ + int internalOffset; /* Offset of internal representation. */ +{ + int *padAmounts = *(int **)(recordPtr + internalOffset); + + return TreeCtrl_NewPadAmountObj(padAmounts); +} + +static void +PadAmountOptionRestore(clientData, tkwin, internalPtr, saveInternalPtr) + ClientData clientData; /* unused. */ + Tk_Window tkwin; /* A window; unused. */ + char *internalPtr; /* Pointer to the place, where the internal + * form (of type "int *") resides. */ + char *saveInternalPtr; /* Pointer to the place, where the saved + * internal form (of type "int *") resides. */ +{ + *(int **) internalPtr = *(int **) saveInternalPtr; +} + +static void +PadAmountOptionFree(clientData, tkwin, internalPtr) + ClientData clientData; /* unused. */ + Tk_Window tkwin; /* A window; unused */ + char *internalPtr; /* Pointer to the place, where the internal + * form (of type "int *") resides. */ +{ + if (*(int **)internalPtr != NULL) { + ckfree((char *) *(int **)internalPtr); + } +} |