diff options
-rw-r--r-- | generic/tkTreeStyle.c | 138 |
1 files changed, 54 insertions, 84 deletions
diff --git a/generic/tkTreeStyle.c b/generic/tkTreeStyle.c index 1bb88ec..4cf7892 100644 --- a/generic/tkTreeStyle.c +++ b/generic/tkTreeStyle.c @@ -5,7 +5,7 @@ * * Copyright (c) 2002-2005 Tim Baker * - * RCS: @(#) $Id: tkTreeStyle.c,v 1.30 2005/06/06 03:25:55 treectrl Exp $ + * RCS: @(#) $Id: tkTreeStyle.c,v 1.31 2005/06/06 17:34:24 treectrl Exp $ */ #include "tkTreeCtrl.h" @@ -24,7 +24,7 @@ struct Style ElementLink *elements; int neededWidth; int neededHeight; -#ifdef NEEDEDHAX +#ifdef NEEDEDHAX /* needed for debugging only */ int neededState; #endif int minWidth; @@ -142,7 +142,7 @@ static void Style_DoExpandH(struct Layout *layout, int flags, StyleDrawArgs *dra /* Internal: can expand to max of ePadX[] or uPadX[] */ iW = eW + MAX(layout->ePadX[PAD_TOP_LEFT], layout->uPadX[PAD_TOP_LEFT]); iE = width - MAX(layout->ePadX[PAD_BOTTOM_RIGHT], - layout->uPadX[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; @@ -321,7 +321,7 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[]) layout->eLink = eLink2; layout->master = eLink1; - /* Width before squeezing */ + /* Width before squeezing/expanding */ layout->useWidth = eLink2->neededWidth; /* No -union padding yet */ @@ -356,7 +356,7 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[]) uPadX = layout->uPadX; uPadY = layout->uPadY; -#if 1 + if (masterStyle->vertical) { uPadX[PAD_TOP_LEFT] = MAX(uPadX[PAD_TOP_LEFT], iPadX[PAD_TOP_LEFT] + ePadX[PAD_TOP_LEFT]); @@ -375,12 +375,6 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[]) 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]); } -#else - 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]); -#endif } } @@ -516,11 +510,7 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[]) if ((eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; -#if 1 /* bug */ layout->x = x + abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT])); -#else - layout->x = MAX(x, abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT]))); -#endif layout->iWidth = iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT]; layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; @@ -976,11 +966,7 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[]) if ((eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; -#if 1 /* bug */ layout->y = y + abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT])); -#else - layout->y = MAX(y, abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT]))); -#endif layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; @@ -1312,11 +1298,7 @@ void Style_DoLayoutNeededV(StyleDrawArgs *drawArgs, struct Layout layouts[]) if (eLink1->flags & ELF_DETACH) continue; -#if 1 layout->y = y + abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT])); -#else - layout->y = MAX(y, abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT]))); -#endif layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; @@ -1358,8 +1340,8 @@ static void Style_DoLayout(StyleDrawArgs *drawArgs, struct Layout layouts[], panic("Style_DoLayout(file %s line %d): style.neededWidth == -1", file, line); if (style->minWidth + drawArgs->indent > drawArgs->width) - panic("Style_DoLayout: style.minWidth + drawArgs->indent %d > drawArgs.width %d", - style->minWidth + drawArgs->indent, drawArgs->width); + panic("Style_DoLayout(file %s line %d): style.minWidth + drawArgs->indent %d > drawArgs.width %d", + file, line, style->minWidth + drawArgs->indent, drawArgs->width); Style_DoLayoutH(drawArgs, layouts); @@ -1466,7 +1448,7 @@ static int Style_NeededSize(TreeCtrl *tree, Style *style, int state, uPadX = layout->uPadX; uPadY = layout->uPadY; -#if 1 + if (masterStyle->vertical) { uPadX[PAD_TOP_LEFT] = MAX(uPadX[PAD_TOP_LEFT], iPadX[PAD_TOP_LEFT] + ePadX[PAD_TOP_LEFT]); @@ -1485,12 +1467,6 @@ static int Style_NeededSize(TreeCtrl *tree, Style *style, int state, 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]); } -#else - 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]); -#endif } } @@ -1587,13 +1563,8 @@ static int Style_NeededSize(TreeCtrl *tree, Style *style, int state, continue; layout->eLink = eLink2; -#if 1 /* bug */ layout->x = x + abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT])); layout->y = y + abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT])); -#else - 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]))); -#endif 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]; @@ -1889,8 +1860,8 @@ void TreeStyle_UpdateWindowPositions(StyleDrawArgs *drawArgs) int i; struct Layout staticLayouts[STATIC_SIZE], *layouts = staticLayouts; - if (drawArgs->width < style->minWidth) - drawArgs->width = style->minWidth; + if (drawArgs->width < style->minWidth + drawArgs->indent) + drawArgs->width = style->minWidth + drawArgs->indent; if (drawArgs->height < style->minHeight) drawArgs->height = style->minHeight; @@ -2302,11 +2273,7 @@ static void Style_Changed(TreeCtrl *tree, Style *masterStyle) if (layout) { TreeItem_InvalidateHeight(tree, item); -#if 1 Tree_FreeItemDInfo(tree, item, NULL); -#else - Tree_InvalidateItemDInfo(tree, item, NULL); -#endif updateDInfo = TRUE; } hPtr = Tcl_NextHashEntry(&search); @@ -2460,11 +2427,7 @@ static void Style_ChangeElements(TreeCtrl *tree, Style *masterStyle, int count, if (layout) { TreeItem_InvalidateHeight(tree, item); -#if 1 Tree_FreeItemDInfo(tree, item, NULL); -#else - Tree_InvalidateItemDInfo(tree, item, NULL); -#endif updateDInfo = TRUE; } hPtr = Tcl_NextHashEntry(&search); @@ -2537,9 +2500,7 @@ static void Style_ElemChanged(TreeCtrl *tree, Style *masterStyle, if (iMask & CS_LAYOUT) { TreeItem_InvalidateHeight(tree, item); -#if 1 Tree_FreeItemDInfo(tree, item, NULL); -#endif updateDInfo = TRUE; } if (iMask & CS_DISPLAY) @@ -2888,9 +2849,7 @@ void Tree_ElementChangedItself(TreeCtrl *tree, TreeItem item, Tree_InvalidateColumnWidth(tree, columnIndex); TreeItemColumn_InvalidateSize(tree, column); TreeItem_InvalidateHeight(tree, item); -#if 1 Tree_FreeItemDInfo(tree, item, NULL); -#endif Tree_DInfoChanged(tree, DINFO_REDO_RANGES); } if (mask & CS_DISPLAY) @@ -2908,9 +2867,7 @@ void Tree_ElementIterateChanged(TreeIterate iter_, int mask) Tree_InvalidateColumnWidth(iter->tree, iter->columnIndex); TreeItemColumn_InvalidateSize(iter->tree, iter->column); TreeItem_InvalidateHeight(iter->tree, iter->item); -#if 1 Tree_FreeItemDInfo(iter->tree, iter->item, NULL); -#endif Tree_DInfoChanged(iter->tree, DINFO_REDO_RANGES); } if (mask & CS_DISPLAY) @@ -3355,7 +3312,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, TreeCtrl *tree = (TreeCtrl *) clientData; Style *style; Element *elem; - ElementLink *eLink; + ElementLink saved, *eLink; int i, index; static CONST char *optionNames[] = { "-padx", "-pady", "-ipadx", "-ipady", "-expand", "-union", "-detach", @@ -3584,18 +3541,20 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, return TCL_OK; } + saved = *eLink; + for (i = 5; i < objc; i += 2) { if (i + 2 > objc) { FormatResult(interp, "value for \"%s\" missing", Tcl_GetString(objv[i])); - return TCL_ERROR; + goto badConfig; } if (Tcl_GetIndexFromObj(interp, objv[i], optionNames, "option", 0, &index) != TCL_OK) { - return TCL_ERROR; + goto badConfig; } switch (index) { @@ -3605,7 +3564,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, tree->tkwin, objv[i + 1], &eLink->ePadX[PAD_TOP_LEFT], &eLink->ePadX[PAD_BOTTOM_RIGHT]) != TCL_OK) - return TCL_ERROR; + goto badConfig; break; } case OPTION_PADY: @@ -3614,7 +3573,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, tree->tkwin, objv[i + 1], &eLink->ePadY[PAD_TOP_LEFT], &eLink->ePadY[PAD_BOTTOM_RIGHT]) != TCL_OK) - return TCL_ERROR; + goto badConfig; break; } case OPTION_iPADX: @@ -3623,7 +3582,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, tree->tkwin, objv[i + 1], &eLink->iPadX[PAD_TOP_LEFT], &eLink->iPadX[PAD_BOTTOM_RIGHT]) != TCL_OK) - return TCL_ERROR; + goto badConfig; break; } case OPTION_iPADY: @@ -3632,14 +3591,14 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, tree->tkwin, objv[i + 1], &eLink->iPadY[PAD_TOP_LEFT], &eLink->iPadY[PAD_BOTTOM_RIGHT]) != TCL_OK) - return TCL_ERROR; + goto badConfig; break; } case OPTION_DETACH: { int detach; if (Tcl_GetBooleanFromObj(interp, objv[i + 1], &detach) != TCL_OK) - return TCL_ERROR; + goto badConfig; if (detach) eLink->flags |= ELF_DETACH; else @@ -3667,7 +3626,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, expand, "\": must be a string ", "containing zero or more of n, e, s, and w", (char *) NULL); - return TCL_ERROR; + goto badConfig; } } } @@ -3694,7 +3653,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, expand, "\": must be a string ", "containing zero or more of n, e, s, and w", (char *) NULL); - return TCL_ERROR; + goto badConfig; } } } @@ -3704,7 +3663,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, { int indent; if (Tcl_GetBooleanFromObj(interp, objv[i + 1], &indent) != TCL_OK) - return TCL_ERROR; + goto badConfig; if (indent) eLink->flags |= ELF_INDENT; else @@ -3730,7 +3689,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, string, "\": must be a string ", "containing zero or more of x and y", (char *) NULL); - return TCL_ERROR; + goto badConfig; } } } @@ -3744,13 +3703,14 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, if (Tcl_ListObjGetElements(interp, objv[i + 1], &objc1, &objv1) != TCL_OK) - return TCL_ERROR; + goto badConfig; if (objc1 == 0) { if (eLink->onion != NULL) { - wipefree((char *) eLink->onion, - sizeof(int) * eLink->onionCount); + if (eLink->onion != saved.onion) + wipefree((char *) eLink->onion, + sizeof(int) * eLink->onionCount); eLink->onionCount = 0; eLink->onion = NULL; } @@ -3765,7 +3725,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, if (Element_FromObj(tree, objv1[j], &elem2) != TCL_OK) { ckfree((char *) onion); - return TCL_ERROR; + goto badConfig; } eLink2 = Style_FindElem(tree, style, elem2, &n); @@ -3775,7 +3735,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, FormatResult(interp, "style %s does not use element %s", style->name, elem2->name); - return TCL_ERROR; + goto badConfig; } if (eLink == eLink2) { @@ -3783,7 +3743,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, FormatResult(interp, "element %s can't form union with itself", elem2->name); - return TCL_ERROR; + goto badConfig; } /* Silently ignore duplicates */ for (k = 0; k < count; k++) @@ -3795,7 +3755,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, continue; onion[count++] = n; } - if (eLink->onion != NULL) + if ((eLink->onion != NULL) && (eLink->onion != saved.onion)) wipefree((char *) eLink->onion, sizeof(int) * eLink->onionCount); if (count == objc1) @@ -3824,7 +3784,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, { FormatResult(interp, "bad screen distance \"%s\"", Tcl_GetString(objv[i + 1])); - return TCL_ERROR; + goto badConfig; } eLink->minHeight = height; break; @@ -3842,7 +3802,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, { FormatResult(interp, "bad screen distance \"%s\"", Tcl_GetString(objv[i + 1])); - return TCL_ERROR; + goto badConfig; } eLink->fixedHeight = height; break; @@ -3860,7 +3820,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, { FormatResult(interp, "bad screen distance \"%s\"", Tcl_GetString(objv[i + 1])); - return TCL_ERROR; + goto badConfig; } eLink->minWidth = width; break; @@ -3878,7 +3838,7 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, { FormatResult(interp, "bad screen distance \"%s\"", Tcl_GetString(objv[i + 1])); - return TCL_ERROR; + goto badConfig; } eLink->fixedWidth = width; break; @@ -3886,8 +3846,16 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, #endif } } + if (saved.onion && (eLink->onion != saved.onion)) + wipefree((char *) saved.onion, sizeof(int) * saved.onionCount); Style_Changed(tree, style); return TCL_OK; + +badConfig: + if (eLink->onion && (eLink->onion != saved.onion)) + wipefree((char *) eLink->onion, sizeof(int) * eLink->onionCount); + *eLink = saved; + return TCL_ERROR; } int TreeStyleCmd(ClientData clientData, Tcl_Interp *interp, int objc, @@ -4188,8 +4156,8 @@ char *TreeStyle_Identify(StyleDrawArgs *drawArgs, int x, int y) Style_CheckNeededSize(tree, style, state); - if (drawArgs->width < style->minWidth) - drawArgs->width = style->minWidth; + if (drawArgs->width < style->minWidth + drawArgs->indent) + drawArgs->width = style->minWidth + drawArgs->indent; if (drawArgs->height < style->minHeight) drawArgs->height = style->minHeight; @@ -4229,8 +4197,8 @@ void TreeStyle_Identify2(StyleDrawArgs *drawArgs, Style_CheckNeededSize(tree, style, state); - if (drawArgs->width < style->minWidth) - drawArgs->width = style->minWidth; + if (drawArgs->width < style->minWidth + drawArgs->indent) + drawArgs->width = style->minWidth + drawArgs->indent; if (drawArgs->height < style->minHeight) drawArgs->height = style->minHeight; @@ -4367,8 +4335,10 @@ int TreeStyle_Remap(TreeCtrl *tree, TreeStyle styleFrom_, TreeStyle styleTo_, in { #ifdef ALLOC_HAX if (styleFrom->numElements > 0) - AllocHax_CFree(tree->allocData, (char *) styleFrom->elements, sizeof(ElementLink), styleFrom->numElements, 5); - styleFrom->elements = (ElementLink *) AllocHax_CAlloc(tree->allocData, sizeof(ElementLink), styleTo->numElements, 5); + AllocHax_CFree(tree->allocData, (char *) styleFrom->elements, + sizeof(ElementLink), styleFrom->numElements, 5); + styleFrom->elements = (ElementLink *) AllocHax_CAlloc(tree->allocData, + sizeof(ElementLink), styleTo->numElements, 5); #else if (styleFrom->numElements > 0) wipefree((char *) styleFrom->elements, sizeof(ElementLink) * @@ -4486,8 +4456,8 @@ int TreeStyle_GetElemRects(StyleDrawArgs *drawArgs, int objc, } } - if (drawArgs->width < style->minWidth) - drawArgs->width = style->minWidth; + if (drawArgs->width < style->minWidth + drawArgs->indent) + drawArgs->width = style->minWidth + drawArgs->indent; if (drawArgs->height < style->minHeight) drawArgs->height = style->minHeight; |