summaryrefslogtreecommitdiffstats
path: root/generic/tkTreeItem.c
diff options
context:
space:
mode:
authortreectrl <treectrl>2006-11-07 20:52:58 (GMT)
committertreectrl <treectrl>2006-11-07 20:52:58 (GMT)
commit4d0f3a61e03985f45abf42fdd0b6e27f05d06576 (patch)
tree64aeb2ac4e9de66a3e92d592c573dd72e08cdf25 /generic/tkTreeItem.c
parent541d4817d3529b8b231e63ffd0fba5a517f43bee (diff)
downloadtktreectrl-4d0f3a61e03985f45abf42fdd0b6e27f05d06576.zip
tktreectrl-4d0f3a61e03985f45abf42fdd0b6e27f05d06576.tar.gz
tktreectrl-4d0f3a61e03985f45abf42fdd0b6e27f05d06576.tar.bz2
Changed [item bbox] to respect spans.
Diffstat (limited to 'generic/tkTreeItem.c')
-rw-r--r--generic/tkTreeItem.c114
1 files changed, 110 insertions, 4 deletions
diff --git a/generic/tkTreeItem.c b/generic/tkTreeItem.c
index 549804b..56085df 100644
--- a/generic/tkTreeItem.c
+++ b/generic/tkTreeItem.c
@@ -5,7 +5,7 @@
*
* Copyright (c) 2002-2006 Tim Baker
*
- * RCS: @(#) $Id: tkTreeItem.c,v 1.82 2006/11/07 01:24:46 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeItem.c,v 1.83 2006/11/07 20:52:58 treectrl Exp $
*/
#include "tkTreeCtrl.h"
@@ -7270,12 +7270,26 @@ TreeItemCmd(
if (TreeColumn_FromObj(tree, objv[4], &treeColumn,
CFO_NOT_NULL | CFO_NOT_TAIL) != TCL_OK)
goto errorExit;
+#if 1
+ /* Bounds of a column. */
+ if (objc == 5) {
+ objc = 0;
+ objv = NULL;
+
+ /* Single element in a column. */
+ } else {
+ objc -= 5;
+ objv += 5;
+ }
+ if (TreeItem_GetRects(tree, item_, treeColumn,
+ objc, objv, &rect) == 0)
+ break;
+#else
if (Tree_ItemBbox(tree, item_, TreeColumn_Lock(treeColumn),
&x, &y, &w, &h) < 0)
break;
totalWidth = TreeColumn_Offset(treeColumn);
columnIndex = TreeColumn_Index(treeColumn);
- itemColumn = Item_FindColumn(tree, item, columnIndex);
if (treeColumn == tree->columnTree)
indent = TreeItem_Indent(tree, item_);
else
@@ -7288,14 +7302,15 @@ TreeItemCmd(
y + h - tree->yOrigin);
break;
}
+ itemColumn = Item_FindColumn(tree, item, columnIndex);
if ((itemColumn == NULL) || (itemColumn->style == NULL)) {
NoStyleMsg(tree, item, columnIndex);
goto errorExit;
}
- drawArgs.style = itemColumn->style;
drawArgs.tree = tree;
drawArgs.drawable = None;
- drawArgs.state = TreeItem_GetState(tree, item_);
+ drawArgs.style = itemColumn->style;
+ drawArgs.state = item->state | itemColumn->state;
drawArgs.indent = indent;
drawArgs.x = x + totalWidth;
drawArgs.y = y;
@@ -7305,6 +7320,7 @@ TreeItemCmd(
if (TreeStyle_GetElemRects(&drawArgs, objc - 5, objv + 5,
&rect) == -1)
goto errorExit;
+#endif
x = rect.x;
y = rect.y;
w = rect.width;
@@ -8486,6 +8502,96 @@ TreeItem_Identify2(
SpanWalkProc_Identify2, (ClientData) &clientData);
}
+static int
+SpanWalkProc_GetRects(
+ TreeCtrl *tree,
+ TreeItem item_,
+ SpanInfo *spanPtr,
+ StyleDrawArgs *drawArgs,
+ ClientData clientData
+ )
+{
+ int objc;
+ Tcl_Obj *CONST *objv;
+ struct {
+ TreeColumn treeColumn;
+ int count;
+ Tcl_Obj *CONST *objv;
+ XRectangle *rects;
+ int result;
+ } *data = clientData;
+
+ if (spanPtr->treeColumn != data->treeColumn)
+ return 0;
+
+ /* Bounds of span. */
+ if (data->count == 0) {
+ /* Not sure why I add 'indent' but for compatibility I will leave
+ * it in. */
+ data->rects[0].x = drawArgs->x + drawArgs->indent;
+ data->rects[0].y = drawArgs->y;
+ data->rects[0].width = drawArgs->width - drawArgs->indent;
+ data->rects[0].height = drawArgs->height;
+ data->result = 1; /* # of rects */
+ return 1; /* stop */
+ }
+
+ if (drawArgs->style == NULL) {
+ NoStyleMsg(tree, (Item *) item_, TreeColumn_Index(spanPtr->treeColumn));
+ data->result = -1; /* error */
+ return 1; /* stop */
+ }
+
+ if (data->count == -1) {
+ /* All the elements. */
+ objc = 0;
+ objv = NULL;
+ } else {
+ objc = data->count;
+ objv = data->objv;
+ }
+
+ data->result = TreeStyle_GetElemRects(drawArgs, objc, objv, data->rects);
+ return 1; /* stop */
+}
+
+int
+TreeItem_GetRects(
+ TreeCtrl *tree, /* Widget info. */
+ TreeItem item_, /* Item token. */
+ TreeColumn treeColumn,
+ int count,
+ Tcl_Obj *CONST objv[],
+ XRectangle rects[]
+ )
+{
+ int left, top, width, height;
+ int lock = TreeColumn_Lock(treeColumn);
+ struct {
+ TreeColumn treeColumn;
+ int count;
+ Tcl_Obj *CONST *objv;
+ XRectangle *rects;
+ int result;
+ } clientData;
+
+ if (Tree_ItemBbox(tree, item_, lock,
+ &left, &top, &width, &height) < 0)
+ return 0;
+
+ clientData.treeColumn = treeColumn;
+ clientData.count = count;
+ clientData.objv = objv;
+ clientData.rects = rects;
+ clientData.result = 0; /* -1 error, 0 no rects, 1+ success */
+
+ TreeItem_WalkSpans(tree, item_, lock,
+ left, top, width, height,
+ SpanWalkProc_GetRects, (ClientData) &clientData);
+
+ return clientData.result;
+}
+
/*
*----------------------------------------------------------------------
*