summaryrefslogtreecommitdiffstats
path: root/generic/tkTreeCtrl.c
diff options
context:
space:
mode:
authortreectrl <treectrl>2006-10-04 03:25:45 (GMT)
committertreectrl <treectrl>2006-10-04 03:25:45 (GMT)
commit47a17686c61ab7a8445bec9afab126ce17fe0203 (patch)
tree25c3ce61f748f51ba650cbce4aa8c464f3bb3efb /generic/tkTreeCtrl.c
parentbd4f64a20b6b298a7ee16d393433313fd7007e63 (diff)
downloadtktreectrl-47a17686c61ab7a8445bec9afab126ce17fe0203.zip
tktreectrl-47a17686c61ab7a8445bec9afab126ce17fe0203.tar.gz
tktreectrl-47a17686c61ab7a8445bec9afab126ce17fe0203.tar.bz2
New treectrl options: -rowlabelresize, -rowlabelwidth, -minrowlabelwidth, -maxrowlabelwidth, -rowlabelprefix, -rowproxy, -showrowlabels.
Added [rowlabel] command. Moved [tag] command to [item tag] since columns and rowlabels have tags too. [identify] command may return "rowlabel ...". Use Tree_ContentXXX macros. Moved TreeStyle_Init out of package init routine into treectrl create routine because it initialized TreeCtrl.styleOptionTable now (before it did nothing).
Diffstat (limited to 'generic/tkTreeCtrl.c')
-rw-r--r--generic/tkTreeCtrl.c148
1 files changed, 107 insertions, 41 deletions
diff --git a/generic/tkTreeCtrl.c b/generic/tkTreeCtrl.c
index c6cef2d..6cb02da 100644
--- a/generic/tkTreeCtrl.c
+++ b/generic/tkTreeCtrl.c
@@ -7,7 +7,7 @@
* Copyright (c) 2002-2003 Christian Krone
* Copyright (c) 2003-2005 ActiveState, a division of Sophos
*
- * RCS: @(#) $Id: tkTreeCtrl.c,v 1.65 2006/09/24 22:24:50 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeCtrl.c,v 1.66 2006/10/04 03:25:45 treectrl Exp $
*/
#include "tkTreeCtrl.h"
@@ -246,6 +246,29 @@ static Tk_OptionSpec optionSpecs[] = {
{TK_OPTION_PIXELS, "-yscrollincrement", "yScrollIncrement", "ScrollIncrement",
"0", -1, Tk_Offset(TreeCtrl, yScrollIncrement),
0, (ClientData) NULL, TREE_CONF_REDISPLAY},
+#ifdef ROW_LABEL
+ {TK_OPTION_BOOLEAN, "-rowlabelresize", "rowLabelResize",
+ "RowLabelResize", "1", -1, Tk_Offset(TreeCtrl, rowLabelResize),
+ 0, (ClientData) NULL, 0},
+ {TK_OPTION_PIXELS, "-rowlabelwidth", "rowLabelWidth", "RowLabelWidth",
+ (char *) NULL, Tk_Offset(TreeCtrl, rowLabelWidthObj), Tk_Offset(TreeCtrl, rowLabelWidth),
+ TK_OPTION_NULL_OK, (ClientData) NULL, TREE_CONF_RELAYOUT},
+ {TK_OPTION_PIXELS, "-minrowlabelwidth", "minRowLabelWidth", "RowLabelWidth",
+ (char *) NULL, Tk_Offset(TreeCtrl, minRowLabelWidthObj), Tk_Offset(TreeCtrl, minRowLabelWidth),
+ TK_OPTION_NULL_OK, (ClientData) NULL, TREE_CONF_RELAYOUT},
+ {TK_OPTION_PIXELS, "-maxrowlabelwidth", "maxRowLabelWidth", "RowLabelWidth",
+ (char *) NULL, Tk_Offset(TreeCtrl, maxRowLabelWidthObj), Tk_Offset(TreeCtrl, maxRowLabelWidth),
+ TK_OPTION_NULL_OK, (ClientData) NULL, TREE_CONF_RELAYOUT},
+ {TK_OPTION_BOOLEAN, "-showrowlabels", "showRowLabels",
+ "ShowRowLabels", "0", -1, Tk_Offset(TreeCtrl, showRowLabels),
+ 0, (ClientData) NULL, TREE_CONF_RELAYOUT},
+ {TK_OPTION_STRING, "-rowlabelprefix", "rowLabelPrefix", "RowLabelPrefix",
+ "", -1, Tk_Offset(TreeCtrl, rowPrefix), 0, (ClientData) NULL, 0},
+ {TK_OPTION_PIXELS, "-rowproxy", "rowProxy", "RowProxy",
+ (char *) NULL, Tk_Offset(TreeCtrl, rowProxy.yObj),
+ Tk_Offset(TreeCtrl, rowProxy.y),
+ TK_OPTION_NULL_OK, (ClientData) NULL, TREE_CONF_PROXY},
+#endif /* ROW_LABEL */
{TK_OPTION_END}
};
@@ -380,9 +403,13 @@ TreeObjCmd(
Tree_InitColumns(tree);
TreeItem_Init(tree);
TreeNotify_Init(tree);
+ (void) TreeStyle_Init(tree);
TreeMarquee_Init(tree);
TreeDragImage_Init(tree);
TreeDInfo_Init(tree);
+#ifdef ROW_LABEL
+ Tree_InitRowLabels(tree);
+#endif
Tk_CreateEventHandler(tree->tkwin,
ExposureMask|StructureNotifyMask|FocusChangeMask|ActivateMask,
@@ -409,11 +436,11 @@ TreeObjCmd(
#define W2Cx(x) ((x) + tree->xOrigin)
#define C2Wx(x) ((x) - tree->xOrigin)
-#define C2Ox(x) ((x) - tree->inset)
+#define C2Ox(x) ((x) - Tree_ContentLeft(tree))
#define W2Cy(y) ((y) + tree->yOrigin)
#define C2Wy(y) ((y) - tree->yOrigin)
-#define C2Oy(y) ((y) - tree->inset - Tree_HeaderHeight(tree))
+#define C2Oy(y) ((y) - Tree_ContentTop(tree))
/*
*--------------------------------------------------------------
@@ -448,8 +475,12 @@ static int TreeWidgetCmd(
"debug", "depth", "dragimage",
"element", "expand", "identify", "index", "item",
"marquee", "notify", "numcolumns", "numitems", "orphans",
- "range", "scan", "see", "selection", "state", "style",
- "tag", "toggle", "xview", "yview", (char *) NULL
+ "range",
+#ifdef ROW_LABEL
+ "rowlabel",
+#endif
+ "scan", "see", "selection", "state", "style",
+ "toggle", "xview", "yview", (char *) NULL
};
enum {
COMMAND_ACTIVATE, COMMAND_CANVASX, COMMAND_CANVASY, COMMAND_CGET,
@@ -458,8 +489,11 @@ static int TreeWidgetCmd(
COMMAND_DRAGIMAGE, COMMAND_ELEMENT, COMMAND_EXPAND,COMMAND_IDENTIFY,
COMMAND_INDEX, COMMAND_ITEM, COMMAND_MARQUEE, COMMAND_NOTIFY,
COMMAND_NUMCOLUMNS, COMMAND_NUMITEMS, COMMAND_ORPHANS, COMMAND_RANGE,
+#ifdef ROW_LABEL
+ COMMAND_ROWLABEL,
+#endif
COMMAND_SCAN, COMMAND_SEE, COMMAND_SELECTION, COMMAND_STATE,
- COMMAND_STYLE, COMMAND_TAG, COMMAND_TOGGLE, COMMAND_XVIEW, COMMAND_YVIEW
+ COMMAND_STYLE, COMMAND_TOGGLE, COMMAND_XVIEW, COMMAND_YVIEW
};
Tcl_Obj *resultObjPtr;
int index;
@@ -574,9 +608,8 @@ static int TreeWidgetCmd(
goto error;
}
FormatResult(interp, "%d %d %d %d",
- tree->inset, tree->inset + Tree_HeaderHeight(tree),
- Tk_Width(tree->tkwin) - tree->inset,
- Tk_Height(tree->tkwin) - tree->inset);
+ Tree_ContentLeft(tree), Tree_ContentTop(tree),
+ Tree_ContentRight(tree), Tree_ContentBottom(tree));
break;
}
@@ -744,6 +777,34 @@ static int TreeWidgetCmd(
if ((y < tree->inset) || (y >= Tk_Height(tree->tkwin) - tree->inset))
break;
+#ifdef ROW_LABEL
+ /* Point in row labels */
+ if (x < Tree_ContentLeft(tree)) {
+ TreeRowLabel row;
+ int rx = x, ry = y, w, h;
+
+ /* What to call the dead space at top-left? */
+ if (y < Tree_ContentTop(tree)) {
+ break;
+ }
+
+ row = Tree_RowLabelUnderPoint(tree, &rx, &ry, &w, &h, FALSE);
+ if (row == NULL)
+ break;
+ sprintf(buf, "rowlabel %s%d", tree->rowPrefix,
+ TreeRowLabel_GetID(row));
+ TreeRowLabel_Identify(row, rx, ry, buf);
+ if (rx >= w - 4)
+ strcpy(buf + strlen(buf), " right");
+ else if (ry < 4)
+ strcpy(buf + strlen(buf), " top");
+ else if (ry >= h - 4)
+ strcpy(buf + strlen(buf), " bottom");
+ Tcl_SetResult(interp, buf, TCL_VOLATILE);
+ break;
+ }
+#endif /* ROW_LABEL */
+
/* Point in header */
if (y < tree->inset + Tree_HeaderHeight(tree)) {
int left = 0 - tree->xOrigin;
@@ -935,7 +996,13 @@ static int TreeWidgetCmd(
Tcl_SetObjResult(interp, listObj);
break;
}
-
+#ifdef ROW_LABEL
+ case COMMAND_ROWLABEL:
+ {
+ result = TreeRowLabelCmd(clientData, interp, objc, objv);
+ break;
+ }
+#endif
case COMMAND_SCAN:
{
static CONST char *optionName[] = { "dragto", "mark",
@@ -991,15 +1058,14 @@ static int TreeWidgetCmd(
{
TreeItem item;
int x, y, w, h;
- int topInset = tree->inset + Tree_HeaderHeight(tree);
- int visWidth = Tk_Width(tree->tkwin) - tree->inset * 2;
- int visHeight = Tk_Height(tree->tkwin) - topInset - tree->inset;
+ int visWidth = Tree_ContentWidth(tree);
+ int visHeight = Tree_ContentHeight(tree);
int xOrigin = tree->xOrigin;
int yOrigin = tree->yOrigin;
- int minX = tree->inset;
- int minY = topInset;
- int maxX = minX + visWidth;
- int maxY = minY + visHeight;
+ int minX = Tree_ContentLeft(tree);
+ int minY = Tree_ContentTop(tree);
+ int maxX = Tree_ContentRight(tree);
+ int maxY = Tree_ContentBottom(tree);
int index, offset;
if (objc != 3) {
@@ -1070,12 +1136,6 @@ static int TreeWidgetCmd(
break;
}
- case COMMAND_TAG:
- {
- result = TreeTagCmd(clientData, interp, objc, objv);
- break;
- }
-
case COMMAND_XVIEW:
{
result = TreeXviewCmd(interp, tree, objc, objv);
@@ -1346,6 +1406,9 @@ badWrap:
tree->itemPrefixLen = strlen(tree->itemPrefix);
tree->columnPrefixLen = strlen(tree->columnPrefix);
+#ifdef ROW_LABEL
+ tree->rowPrefixLen = strlen(tree->rowPrefix);
+#endif
Tk_SetWindowBackground(tree->tkwin,
Tk_3DBorderColor(tree->border)->pixel);
@@ -1400,6 +1463,10 @@ badWrap:
if (mask & TREE_CONF_PROXY) {
TreeColumnProxy_Undisplay(tree);
TreeColumnProxy_Display(tree);
+#ifdef ROW_LABEL
+ TreeRowLabelProxy_Undisplay(tree);
+ TreeRowLabelProxy_Display(tree);
+#endif
}
tree->useIndent = MAX(tree->indent, ButtonMaxWidth(tree));
@@ -1630,6 +1697,10 @@ TreeDestroy(
}
Tcl_DeleteHashTable(&tree->imageHash);
+#ifdef ROW_LABEL
+ /* Before TreeStyle_Free */
+ Tree_FreeRowLabels(tree);
+#endif
TreeStyle_Free(tree);
TreeDragImage_Free(tree->dragImage);
@@ -2840,7 +2911,7 @@ A_XviewCmd(
} else {
int count, index = 0, indexMax, offset, type;
double fraction;
- int visWidth = Tk_Width(tree->tkwin) - 2 * tree->inset;
+ int visWidth = Tree_ContentWidth(tree);
int totWidth = Tree_TotalWidth(tree);
int xIncr = tree->xScrollIncrement;
@@ -2875,15 +2946,15 @@ A_XviewCmd(
index = Increment_FindX(tree, offset);
break;
case TK_SCROLL_PAGES:
- offset = tree->inset + tree->xOrigin;
+ offset = Tree_ContentLeft(tree) + tree->xOrigin;
offset += (int) (count * visWidth * 0.9);
index = Increment_FindX(tree, offset);
if ((count > 0) && (index ==
- Increment_FindX(tree, tree->inset + tree->xOrigin)))
+ Increment_FindX(tree, Tree_ContentLeft(tree) + tree->xOrigin)))
index++;
break;
case TK_SCROLL_UNITS:
- offset = tree->inset + tree->xOrigin;
+ offset = Tree_ContentLeft(tree) + tree->xOrigin;
index = offset / xIncr;
index += count;
break;
@@ -2898,8 +2969,8 @@ A_XviewCmd(
index = indexMax;
offset = Increment_ToOffsetX(tree, index);
- if (offset - tree->inset != tree->xOrigin) {
- tree->xOrigin = offset - tree->inset;
+ if (offset - Tree_ContentLeft(tree) != tree->xOrigin) {
+ tree->xOrigin = offset - Tree_ContentLeft(tree);
Tree_EventuallyRedraw(tree);
}
}
@@ -2946,8 +3017,7 @@ A_YviewCmd(
} else {
int count, index = 0, indexMax, offset, type;
double fraction;
- int topInset = tree->inset + Tree_HeaderHeight(tree);
- int visHeight = Tk_Height(tree->tkwin) - topInset - tree->inset;
+ int visHeight = Tree_ContentHeight(tree);
int totHeight = Tree_TotalHeight(tree);
int yIncr = tree->yScrollIncrement;
@@ -2982,15 +3052,15 @@ A_YviewCmd(
index = Increment_FindY(tree, offset);
break;
case TK_SCROLL_PAGES:
- offset = topInset + tree->yOrigin;
+ offset = Tree_ContentTop(tree) + tree->yOrigin;
offset += (int) (count * visHeight * 0.9);
index = Increment_FindY(tree, offset);
if ((count > 0) && (index ==
- Increment_FindY(tree, topInset + tree->yOrigin)))
+ Increment_FindY(tree, Tree_ContentTop(tree) + tree->yOrigin)))
index++;
break;
case TK_SCROLL_UNITS:
- offset = topInset + tree->yOrigin;
+ offset = Tree_ContentTop(tree) + tree->yOrigin;
index = offset / yIncr;
index += count;
break;
@@ -3005,8 +3075,8 @@ A_YviewCmd(
index = indexMax;
offset = Increment_ToOffsetY(tree, index);
- if (offset - topInset != tree->yOrigin) {
- tree->yOrigin = offset - topInset;
+ if (offset - Tree_ContentTop(tree) != tree->yOrigin) {
+ tree->yOrigin = offset - Tree_ContentTop(tree);
Tree_EventuallyRedraw(tree);
}
}
@@ -3190,8 +3260,7 @@ TreeDebugCmd(
case COMMAND_SCROLL:
{
- int topInset = Tree_HeaderHeight(tree) + tree->inset;
- int visHeight = Tk_Height(tree->tkwin) - topInset - tree->inset;
+ int visHeight = Tree_ContentHeight(tree);
int totHeight = Tree_TotalHeight(tree);
int yIncr = tree->yScrollIncrement;
if (yIncr <= 0)
@@ -3922,9 +3991,6 @@ Treectrl_Init(
if (TreeElement_Init(interp) != TCL_OK) {
return TCL_ERROR;
}
- if (TreeStyle_Init(interp) != TCL_OK) {
- return TCL_ERROR;
- }
/* We don't care if this fails */
(void) TreeTheme_Init(interp);