summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortreectrl <treectrl>2006-10-14 21:19:53 (GMT)
committertreectrl <treectrl>2006-10-14 21:19:53 (GMT)
commitb3397722a2f81f202020aabf01206bd96a99948f (patch)
tree2ff1e236f6557ae0c82bd37f8e831cc66e3f9c87
parentfa86b7c5283c56f320d03929b44d988099e50763 (diff)
downloadtktreectrl-b3397722a2f81f202020aabf01206bd96a99948f.zip
tktreectrl-b3397722a2f81f202020aabf01206bd96a99948f.tar.gz
tktreectrl-b3397722a2f81f202020aabf01206bd96a99948f.tar.bz2
Remove rowlabels.
-rw-r--r--demos/demo.tcl18
-rw-r--r--demos/rowlabels.tcl148
-rw-r--r--generic/tkTreeColumn.c23
-rw-r--r--generic/tkTreeCtrl.c85
-rw-r--r--generic/tkTreeCtrl.h110
-rw-r--r--generic/tkTreeDisplay.c370
-rw-r--r--generic/tkTreeElem.c34
-rw-r--r--generic/tkTreeElem.h11
-rw-r--r--generic/tkTreeItem.c26
-rw-r--r--generic/tkTreeRowLabel.c3107
-rw-r--r--generic/tkTreeStyle.c241
-rw-r--r--library/treectrl.tcl142
12 files changed, 24 insertions, 4291 deletions
diff --git a/demos/demo.tcl b/demos/demo.tcl
index 3fd545f..47a09bf 100644
--- a/demos/demo.tcl
+++ b/demos/demo.tcl
@@ -1,6 +1,6 @@
#!/bin/wish84.exe
-# RCS: @(#) $Id: demo.tcl,v 1.47 2006/10/14 20:23:28 treectrl Exp $
+# RCS: @(#) $Id: demo.tcl,v 1.48 2006/10/14 21:20:08 treectrl Exp $
set VERSION 2.1.1
@@ -175,7 +175,6 @@ foreach file {
outlook-folders
outlook-newgroup
random
- rowlabels
span
textvariable
www-options
@@ -791,15 +790,11 @@ proc MakeListPopup {T} {
-command {$Popup(T) configure -showroot $Popup(showroot)}
$m2 add checkbutton -label "Root Button" -variable Popup(showrootbutton) \
-command {$Popup(T) configure -showrootbutton $Popup(showrootbutton)}
- $m2 add checkbutton -label "Row Labels" -variable Popup(showrowlabels) \
- -command {$Popup(T) configure -showrowlabels $Popup(showrowlabels)}
$m add cascade -label Show -menu $m2
set m2 [menu $m.mSpan -tearoff no]
$m add cascade -label Span -menu $m2
- $m add checkbutton -label "Row Label Resize" -variable Popup(rowlabelresize) \
- -command {$Popup(T) configure -rowlabelresize $Popup(rowlabelresize)}
$m add checkbutton -label "Use Theme" -variable Popup(usetheme) \
-command {$Popup(T) configure -usetheme $Popup(usetheme)}
@@ -931,7 +926,6 @@ proc ShowPopup {T x y X Y} {
set Popup(showrootlines) [$T cget -showrootlines]
set Popup(showroot) [$T cget -showroot]
set Popup(showrootbutton) [$T cget -showrootbutton]
- set Popup(showrowlabels) [$T cget -showrowlabels]
set m $menu.mVisible
$m delete 0 end
foreach C [$T column list] {
@@ -957,7 +951,6 @@ proc ShowPopup {T x y X Y} {
$m add command -label "no item column" -state disabled
}
- set Popup(rowlabelresize) [$T cget -rowlabelresize]
set Popup(usetheme) [$T cget -usetheme]
tk_popup $menu $X $Y
return
@@ -1009,7 +1002,6 @@ proc InitDemoList {} {
"Big List" DemoBigList biglist.tcl \
"Column Spanning" DemoSpan span.tcl \
"My Computer" DemoMyComputer mycomputer.tcl \
- "Row Labels" DemoRowLabels rowlabels.tcl \
"Column Locking" DemoColumnLock column-lock.tcl
] {
set item [$t item create]
@@ -1251,10 +1243,6 @@ proc DemoClear {} {
# Delete columns in demo list
$T column delete all
- # Delete row labels in demo list
-catch {
- $T rowlabel delete all
-}
# Delete all styles in demo list
eval $T style delete [$T style names]
@@ -1280,9 +1268,7 @@ catch {
-highlightthickness 3 -usetheme yes -cursor {} \
-itemwidth 0 -itemwidthequal no -itemwidthmultiple 0 \
-font [.f4.t cget -font]
-catch {
- $T configure -showrowlabels no
-}
+
# Undo "column configure all" in a demo
$T column configure tail -background \
[lindex [$T column configure tail -background] 3]
diff --git a/demos/rowlabels.tcl b/demos/rowlabels.tcl
deleted file mode 100644
index 8c8f8b6..0000000
--- a/demos/rowlabels.tcl
+++ /dev/null
@@ -1,148 +0,0 @@
-# RCS: @(#) $Id: rowlabels.tcl,v 1.2 2006/10/11 01:37:59 treectrl Exp $
-
-proc DemoRowLabels {} {
-
- global RowLabel
-
- set T .f2.f1.t
-
- #
- # Configure the treectrl widget
- #
-
- $T configure \
- -showbuttons no \
- -showlines no \
- -showroot no \
- -xscrollincrement 40 \
- -showrowlabels yes
-
- #
- # Create columns
- #
-
- for {set i 0} {$i < 100} {incr i} {
- $T column create -text "C$i" -tags C$i -width 40 -justify center
- }
-
- $T state define mouseover
-
- #
- # Create row labels
- #
-
- $T element create label1.bg rect -fill {gray80 mouseover gray {}}
- $T element create label1.text text
- $T style create label1 -orient horizontal
- $T style elements label1 {label1.bg label1.text}
- $T style layout label1 label1.bg -detach yes -iexpand xy
- $T style layout label1 label1.text -expand wns -padx 2
-
- for {set i 0} {$i < 10} {incr i} {
- $T rowlabel create -tags R$i -style label1
- $T rowlabel text R$i "R$i"
- }
-
- $T element create label2.bd border -background $::SystemButtonFace \
- -relief raised -thickness 2 -filled yes
- $T element create label2.text text
- $T style create label2 -orient horizontal
- $T style elements label2 {label2.bd label2.text}
- $T style layout label2 label2.bd -detach yes -iexpand xy
- $T style layout label2 label2.text -expand news -padx 2 -pady 2
-
- for {set i 10} {$i < 20} {incr i} {
- $T rowlabel create -tag R$i -style label2
- $T rowlabel text R$i "R$i"
- }
-
- $T element create label3.div rect -fill black -height 2
- $T element create label3.text text
- $T style create label3 -orient horizontal
- $T style elements label3 {label3.div label3.text}
- $T style layout label3 label3.div -detach yes -expand n -iexpand x
- $T style layout label3 label3.text -expand ws -padx 2 -pady 2
-
- for {set i 20} {$i < 30} {incr i} {
- $T rowlabel create -tag R$i -style label3
- $T rowlabel text R$i "R$i"
- }
-
- $T element create label4.rect rect -fill {#e0e8f0 mouseover}
- $T element create label4.text text
- $T element create label4.w window -clip yes
- $T style create label4 -orient vertical
- $T style elements label4 {label4.rect label4.text label4.w}
- $T style layout label4 label4.rect -detach yes -iexpand xy
- $T style layout label4 label4.text -expand we -padx 2 -pady 2
- $T style layout label4 label4.w -iexpand x -padx 2 -pady {0 2}
-
- for {set i 30} {$i < 40} {incr i} {
- $T rowlabel create -tag R$i -style label4
- $T rowlabel element configure R$i label4.text -textvariable ::DemoRowLabels(R$i)
- set clip [frame $T.clip$i -borderwidth 0]
- $::entryCmd $clip.e -width 4 -textvariable ::DemoRowLabels(R$i)
- $T rowlabel element configure R$i label4.w -window $clip
- set ::DemoRowLabels(R$i) "R$i"
- }
-
- #
- # Create elements
- #
-
- $T element create eRect rect -outline gray -outlinewidth 1 -open wn
-
- #
- # Create styles using the elements
- #
-
- $T style create s1 -orient horizontal
- $T style elements s1 eRect
- $T style layout s1 eRect -detach yes -iexpand xy
-
- #
- # Create items and assign styles
- #
-
- set ids [$T item create -count 40 -parent root]
- foreach C [$T column list] {
- $T item style set [list list $ids] $C s1
- }
-
- bind DemoRowLabels <Button1-Motion> {
- # no-op
- }
- bind DemoRowLabels <Motion> {
- RowLabelMotion %W %x %y
- }
-
- set RowLabel(prev) ""
- bindtags $T [list $T DemoRowLabels TreeCtrl [winfo toplevel $T] all]
-
- return
-}
-
-proc RowLabelMotion {w x y} {
- global RowLabel
- set id [$w identify $x $y]
- if {$id eq ""} {
- } elseif {[lindex $id 0] eq "header"} {
- } elseif {[lindex $id 0] eq "item"} {
- } elseif {[lindex $id 0] eq "rowlabel"} {
- set row [lindex $id 1]
- if {$row ne $RowLabel(prev)} {
- if {$RowLabel(prev) ne ""} {
- $w rowlabel state set $RowLabel(prev) !mouseover
- }
- $w rowlabel state set $row mouseover
- set RowLabel(prev) $row
- }
- return
- }
- if {$RowLabel(prev) ne ""} {
- $w rowlabel state set $RowLabel(prev) !mouseover
- set RowLabel(prev) ""
- }
- return
-}
-
diff --git a/generic/tkTreeColumn.c b/generic/tkTreeColumn.c
index 09e9012..626ae8c 100644
--- a/generic/tkTreeColumn.c
+++ b/generic/tkTreeColumn.c
@@ -7,7 +7,7 @@
* Copyright (c) 2002-2003 Christian Krone
* Copyright (c) 2003 ActiveState Corporation
*
- * RCS: @(#) $Id: tkTreeColumn.c,v 1.44 2006/10/14 19:52:42 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeColumn.c,v 1.45 2006/10/14 21:19:53 treectrl Exp $
*/
#include "tkTreeCtrl.h"
@@ -4610,27 +4610,6 @@ Tree_DrawHeader(
}
}
-#ifdef ROW_LABEL
- if (Tree_WidthOfRowLabels(tree) > 0) {
- column = (Column *) tree->columnTail;
- width = Tree_WidthOfRowLabels(tree);
- height = tree->headerHeight;
- if (tree->useTheme &&
- (TreeTheme_DrawHeaderItem(tree, pixmap, 0, 0, tree->inset, y, width, height) == TCL_OK)) {
- } else {
- Tk_3DBorder border;
- border = PerStateBorder_ForState(tree, &column->border,
- Column_MakeState(column), NULL);
- if (border == NULL)
- border = tree->border;
- Tk_Fill3DRectangle(tkwin, pixmap, border,
- tree->inset, y, width, height,
- column->borderWidth, TK_RELIEF_RAISED);
- }
- column = (Column *) tree->columns;
- }
-#endif
-
#ifdef COLUMN_LOCK
DrawHeaderLeft(tree, pixmap);
DrawHeaderRight(tree, pixmap);
diff --git a/generic/tkTreeCtrl.c b/generic/tkTreeCtrl.c
index ea8493d..2d93720 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.69 2006/10/14 19:47:04 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeCtrl.c,v 1.70 2006/10/14 21:19:53 treectrl Exp $
*/
#include "tkTreeCtrl.h"
@@ -187,6 +187,10 @@ static Tk_OptionSpec optionSpecs[] = {
{TK_OPTION_RELIEF, "-relief", "relief", "Relief",
"sunken", -1, Tk_Offset(TreeCtrl, relief),
0, (ClientData) NULL, TREE_CONF_REDISPLAY},
+ {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},
{TK_OPTION_STRING, "-scrollmargin", "scrollMargin", "ScrollMargin",
"0", Tk_Offset(TreeCtrl, scrollMargin), -1,
0, (ClientData) NULL, 0},
@@ -246,29 +250,6 @@ 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}
};
@@ -410,9 +391,6 @@ TreeObjCmd(
TreeMarquee_Init(tree);
TreeDragImage_Init(tree);
TreeDInfo_Init(tree);
-#ifdef ROW_LABEL
- Tree_InitRowLabels(tree);
-#endif
Tk_CreateEventHandler(tree->tkwin,
ExposureMask|StructureNotifyMask|FocusChangeMask|ActivateMask,
@@ -478,11 +456,7 @@ static int TreeWidgetCmd(
"debug", "depth", "dragimage",
"element", "expand", "identify", "index", "item",
"marquee", "notify", "numcolumns", "numitems", "orphans",
- "range",
-#ifdef ROW_LABEL
- "rowlabel",
-#endif
- "scan", "see", "selection", "state", "style",
+ "range", "scan", "see", "selection", "state", "style",
"toggle", "xview", "yview", (char *) NULL
};
enum {
@@ -492,9 +466,6 @@ 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_TOGGLE, COMMAND_XVIEW, COMMAND_YVIEW
};
@@ -806,34 +777,6 @@ static int TreeWidgetCmd(
if (hit == TREE_AREA_NONE)
break;
-#ifdef ROW_LABEL
- /* Point in row labels */
- if (hit == TREE_AREA_ROWLABEL) {
- 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 */
-
if (hit == TREE_AREA_HEADER) {
treeColumn = Tree_HeaderUnderPoint(tree, &x, &y, &width, &height,
FALSE);
@@ -1034,13 +977,7 @@ 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",
@@ -1190,7 +1127,6 @@ static int TreeWidgetCmd(
break;
}
}
-done:
Tree_ReleaseItems(tree);
Tcl_Release((ClientData) tree);
return result;
@@ -1420,9 +1356,6 @@ 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);
@@ -1712,10 +1645,6 @@ TreeDestroy(
}
Tcl_DeleteHashTable(&tree->imageHash);
-#ifdef ROW_LABEL
- /* Before TreeStyle_Free */
- Tree_FreeRowLabels(tree);
-#endif
TreeStyle_Free(tree);
TreeDragImage_Free(tree->dragImage);
diff --git a/generic/tkTreeCtrl.h b/generic/tkTreeCtrl.h
index fad956a..3e6af5b 100644
--- a/generic/tkTreeCtrl.h
+++ b/generic/tkTreeCtrl.h
@@ -7,7 +7,7 @@
* Copyright (c) 2002-2003 Christian Krone
* Copyright (c) 2003 ActiveState Corporation
*
- * RCS: @(#) $Id: tkTreeCtrl.h,v 1.52 2006/10/14 19:44:11 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeCtrl.h,v 1.53 2006/10/14 21:19:53 treectrl Exp $
*/
#include "tkPort.h"
@@ -36,7 +36,6 @@
#define SELECTION_VISIBLE
#define ALLOC_HAX
#define COLUMN_SPAN
-#define ROW_LABEL
#define COLUMN_LOCK
#define DEPRECATED
@@ -51,9 +50,6 @@ typedef struct TreeMarquee_ *TreeMarquee;
typedef struct TreeItemRInfo_ *TreeItemRInfo;
typedef struct TreeStyle_ *TreeStyle;
typedef struct TreeElement_ *TreeElement;
-#ifdef ROW_LABEL
-typedef struct TreeRowLabel_ *TreeRowLabel;
-#endif
/*****/
@@ -143,21 +139,6 @@ struct TreeCtrlColumnDrag
int indSide; /* -indicatorside */
};
-#ifdef ROW_LABEL
-struct TreeCtrlRowDrag
-{
- Tk_OptionTable optionTable;
- int enable; /* -enable */
- TreeRowLabel row; /* -imagerow */
- Tcl_Obj *offsetObj; /* -imageoffset */
- int offset; /* -imageoffset */
- XColor *color; /* -imagecolor */
- int alpha; /* -imagealpha */
- TreeRowLabel indRow; /* -indicatorrow */
- XColor *indColor; /* -indicatorcolor */
-};
-#endif
-
struct TreeCtrl
{
/* Standard stuff */
@@ -371,32 +352,6 @@ struct TreeCtrl
int onScreen;
} rowProxy;
-#ifdef ROW_LABEL
- int rowLabelResize; /* -rowlabelresize */
-
- int rowLabelWidth; /* -rowlabelwidth */
- Tcl_Obj *rowLabelWidthObj; /* -rowlabelwidth */
-
- int minRowLabelWidth; /* -minrowlabelwidth */
- Tcl_Obj *minRowLabelWidthObj; /* -minrowlabelwidth */
-
- int maxRowLabelWidth; /* -maxrowlabelwidth */
- Tcl_Obj *maxRowLabelWidthObj; /* -maxrowlabelwidth */
-
- int showRowLabels; /* -showrowlabels */
-
- char *rowPrefix; /* -rowlabelprefix */
- int rowPrefixLen; /* -rowlabelprefix */
-
- TreeRowLabel rows; /* List of row labels. */
- TreeRowLabel rowLabelLast; /* Last in list of row labels. */
- int nextRowId; /* Next unique id for a row. */
- int rowCount; /* Number of created row labels. */
- Tcl_HashTable rowIDHash; /* Key: row id, Value: row */
- struct TreeCtrlRowDrag rowDrag;
- int neededWidthOfRows; /* Max requested width of row labels. */
-#endif /* ROW_LABEL */
-
char *optionHax[64]; /* Used by OptionHax_xxx */
int optionHaxCnt; /* Used by OptionHax_xxx */
};
@@ -446,13 +401,7 @@ extern int Tree_StateFromListObj(TreeCtrl *tree, Tcl_Obj *obj, int states[3], in
#define Tree_BorderBottom(tree) \
(Tk_Height(tree->tkwin) - tree->inset)
-#if defined(ROW_LABEL) && defined(COLUMN_LOCK)
-#define Tree_ContentLeft(tree) \
- (Tree_BorderLeft(tree) + Tree_WidthOfRowLabels(tree) + Tree_WidthOfLeftColumns(tree))
-#elif defined(ROW_LABEL)
-#define Tree_ContentLeft(tree) \
- (Tree_BorderLeft(tree) + Tree_WidthOfRowLabels(tree))
-#elif defined(COLUMN_LOCK)
+#if defined(COLUMN_LOCK)
#define Tree_ContentLeft(tree) \
(Tree_BorderLeft(tree) + Tree_WidthOfLeftColumns(tree))
#else
@@ -635,23 +584,13 @@ extern int TreeStyle_FromObj(TreeCtrl *tree, Tcl_Obj *obj, TreeStyle *stylePtr);
extern Tcl_Obj *TreeStyle_ToObj(TreeStyle style_);
extern Tcl_Obj *TreeStyle_GetImage(TreeCtrl *tree, TreeStyle style_);
extern Tcl_Obj *TreeStyle_GetText(TreeCtrl *tree, TreeStyle style_);
-#ifdef ROW_LABEL
-extern int TreeStyle_SetImage(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeRowLabel row, TreeStyle style_, Tcl_Obj *textObj);
-extern int TreeStyle_SetText(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeRowLabel row, TreeStyle style_, Tcl_Obj *textObj);
-#else
extern int TreeStyle_SetImage(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *textObj);
extern int TreeStyle_SetText(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *textObj);
-#endif
extern int TreeStyle_FindElement(TreeCtrl *tree, TreeStyle style_, TreeElement elem_, int *index);
extern TreeStyle TreeStyle_NewInstance(TreeCtrl *tree, TreeStyle master);
extern int TreeStyle_ElementActual(TreeCtrl *tree, TreeStyle style_, int state, Tcl_Obj *elemObj, Tcl_Obj *obj);
-#ifdef ROW_LABEL
-extern int TreeStyle_ElementCget(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeRowLabel row, TreeStyle style_, Tcl_Obj *elemObj, Tcl_Obj *obj);
-extern int TreeStyle_ElementConfigure(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeRowLabel row, TreeStyle style_, Tcl_Obj *elemObj, int objc, Tcl_Obj **objv, int *eMask);
-#else
extern int TreeStyle_ElementCget(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *elemObj, Tcl_Obj *obj);
extern int TreeStyle_ElementConfigure(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *elemObj, int objc, Tcl_Obj **objv, int *eMask);
-#endif
extern void TreeStyle_ListElements(TreeCtrl *tree, TreeStyle style_);
extern TreeStyle TreeStyle_GetMaster(TreeCtrl *tree, TreeStyle style_);
extern char *TreeStyle_Identify(StyleDrawArgs *drawArgs, int x, int y);
@@ -798,9 +737,6 @@ enum {
TREE_AREA_NONE = 0,
TREE_AREA_HEADER,
TREE_AREA_CONTENT,
-#ifdef ROW_LABEL
-TREE_AREA_ROWLABEL,
-#endif
#ifdef COLUMN_LOCK
TREE_AREA_LEFT,
TREE_AREA_RIGHT
@@ -838,10 +774,6 @@ extern void TreeRowProxy_Undisplay(TreeCtrl *tree);
extern void TreeRowProxy_Display(TreeCtrl *tree);
extern void Tree_DrawTiledImage(TreeCtrl *tree, Drawable drawable, Tk_Image image,
int x1, int y1, int x2, int y2, int xOffset, int yOffset);
-#ifdef ROW_LABEL
-extern int Tree_RowLabelBbox(TreeCtrl *tree, TreeRowLabel row, int *x, int *y, int *w, int *h);
-extern TreeRowLabel Tree_RowLabelUnderPoint(TreeCtrl *tree, int *x, int *y, int *w, int *h, int nearest);
-#endif
#define DINFO_OUT_OF_DATE 0x0001
#define DINFO_CHECK_COLUMN_WIDTH 0x0002
@@ -858,39 +790,10 @@ extern TreeRowLabel Tree_RowLabelUnderPoint(TreeCtrl *tree, int *x, int *y, int
#define DINFO_REDO_INCREMENTS 0x1000
#define DINFO_REDO_COLUMN_WIDTH 0x2000
#define DINFO_REDO_SELECTION 0x4000
-#ifdef ROW_LABEL
-#define DINFO_DRAW_ROWLABELS 0x8000
-#endif
extern void Tree_DInfoChanged(TreeCtrl *tree, int flags);
extern void Tree_TheWorldHasChanged(Tcl_Interp *interp);
-#ifdef ROW_LABEL
-/* tkTreeRowLabel.c */
-extern void Tree_InitRowLabels(TreeCtrl *tree);
-extern void Tree_FreeRowLabels(TreeCtrl *tree);
-extern int TreeRowLabelCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
-extern int Tree_WidthOfRowLabels(TreeCtrl *tree);
-extern void TreeRowLabel_Draw(TreeRowLabel row_, int x, int y, int width, int height, Drawable drawable);
-extern void TreeRowLabel_Identify(TreeRowLabel row_, int x, int y, char *buf);
-extern int TreeRowLabel_GetID(TreeRowLabel row);
-extern int TreeRowLabel_Index(TreeRowLabel row);
-extern int TreeRowLabel_Visible(TreeRowLabel row);
-extern int TreeRowLabel_FixedHeight(TreeRowLabel row);
-extern int TreeRowLabel_NeededHeight(TreeRowLabel row);
-extern TreeStyle TreeRowLabel_GetStyle(TreeRowLabel row);
-extern void TreeRowLabel_ForgetStyle(TreeRowLabel row);
-extern TreeRowLabel TreeRowLabel_Next(TreeRowLabel row);
-extern void TreeRowLabel_OnScreen(TreeRowLabel row, int onScreen);
-
-#define ROW_ALL ((TreeRowLabel) -1)
-#define RFO_NOT_MANY 0x01
-#define RFO_NOT_NULL 0x02
-extern int TreeRowLabelList_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeRowLabelList *rows, int flags);
-extern int TreeRowLabel_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeRowLabel *rowPtr, int flags);
-extern Tcl_Obj *TreeRowLabel_ToObj(TreeCtrl *tree, TreeRowLabel row);
-#endif /* ROW_LABEL */
-
/* tkTreeTheme.c */
extern int TreeTheme_Init(Tcl_Interp *interp);
extern int TreeTheme_DrawHeaderItem(TreeCtrl *tree, Drawable drawable, int state, int arrow, int x, int y, int width, int height);
@@ -1051,15 +954,6 @@ extern void TreePtrList_Free(TreePtrList *tilPtr);
#define TreeColumnList_Nth(L,n) ((TreeColumn) (L)->pointers[n])
#define TreeColumnList_Count(L) ((L)->count)
-#ifdef ROW_LABEL
-#define TreeRowLabelList_Init TreePtrList_Init
-#define TreeRowLabelList_Append TreePtrList_Append
-#define TreeRowLabelList_Concat TreePtrList_Concat
-#define TreeRowLabelList_Free TreePtrList_Free
-#define TreeRowLabelList_Nth(L,n) ((TreeRowLabel) (L)->pointers[n])
-#define TreeRowLabelList_Count(L) ((L)->count)
-#endif
-
/*****/
/*
diff --git a/generic/tkTreeDisplay.c b/generic/tkTreeDisplay.c
index da44a5e..9cc8e9a 100644
--- a/generic/tkTreeDisplay.c
+++ b/generic/tkTreeDisplay.c
@@ -5,7 +5,7 @@
*
* Copyright (c) 2002-2006 Tim Baker
*
- * RCS: @(#) $Id: tkTreeDisplay.c,v 1.43 2006/10/14 19:58:48 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeDisplay.c,v 1.44 2006/10/14 21:19:53 treectrl Exp $
*/
#include "tkTreeCtrl.h"
@@ -79,16 +79,6 @@ struct DItem
#endif
};
-#ifdef ROW_LABEL
-typedef struct DRowLabel DRowLabel;
-struct DRowLabel
-{
- TreeRowLabel row;
- int offset; /* Vertical offset from canvas top. */
- int height;
-};
-#endif
-
typedef struct ColumnInfo {
TreeColumn column;
int offset; /* Last seen x-offset */
@@ -133,17 +123,11 @@ struct DInfo
int requests; /* Incremented for every call to
Tree_EventuallyRedraw */
int bounds[4], empty; /* Bounds of TREE_AREA_CONTENT */
-#ifdef ROW_LABEL
- int rowLabelWidth; /* Last seen Tree_WidthOfRowLabels */
- DRowLabel *dRowLabel; /* Offset and height of each visible row label. */
- int dRowLabelCnt; /* Number of visible rows in dRowLabel[] */
- int dRowLabelAlloc; /* Size of dRowLabel[] */
-#endif
#ifdef COLUMN_LOCK
int boundsL[4], emptyL; /* Bounds of TREE_AREA_LEFT */
int boundsR[4], emptyR; /* Bounds of TREE_AREA_RIGHT */
- int widthOfColumnsLeft;
- int widthOfColumnsRight;
+ int widthOfColumnsLeft; /* Last seen Tree_WidthOfLeftColumns() */
+ int widthOfColumnsRight; /* Last seen Tree_WidthOfRightColumns() */
Range *rangeLock; /* If there is no Range for non-locked
* columns, this range holds the vertical
* offset and height of each ReallyVisible
@@ -199,10 +183,6 @@ Range_Redo(
int wrapCount = 0, wrapPixels = 0;
int count, pixels, rItemCount = 0;
int rangeIndex = 0, itemIndex;
-#ifdef ROW_LABEL
- DRowLabel *dRowLabel;
- TreeRowLabel row;
-#endif
if (tree->debug.enable && tree->debug.display)
dbwin("Range_Redo %s\n", Tk_PathName(tree->tkwin));
@@ -213,34 +193,6 @@ Range_Redo(
dInfo->rangeFirst = NULL;
dInfo->rangeLast = NULL;
-#ifdef ROW_LABEL
- /* Calculate the size/position of every row label even if there are no
- * columns or items. */
- if (dInfo->dRowLabelAlloc < tree->rowCount) {
- dInfo->dRowLabel = (DRowLabel *) ckrealloc((char *) dInfo->dRowLabel,
- tree->rowCount * sizeof(DRowLabel));
- dInfo->dRowLabelAlloc = tree->rowCount;
- }
- dInfo->dRowLabelCnt = 0;
- if (Tree_WidthOfRowLabels(tree) > 0) {
- dRowLabel = dInfo->dRowLabel;
- pixels = 0 /*Tree_HeaderHeight(tree)*/;
- for (row = tree->rows; row != NULL; row = TreeRowLabel_Next(row)) {
- if (TreeRowLabel_Visible(row)) {
- dRowLabel->row = row;
- dRowLabel->offset = pixels;
- if (TreeRowLabel_FixedHeight(row) > 0)
- dRowLabel->height = TreeRowLabel_FixedHeight(row);
- else
- dRowLabel->height = TreeRowLabel_NeededHeight(row);
- pixels += dRowLabel->height;
- dInfo->dRowLabelCnt++;
- dRowLabel++;
- }
- }
- }
-#endif /* ROW_LABEL */
-
if (tree->columnCountVis < 1)
goto freeRanges;
@@ -350,20 +302,6 @@ Range_Redo(
rItem->offset = pixels;
if (tree->vertical) {
rItem->size = TreeItem_Height(tree, item);
-#ifdef ROW_LABEL
- if (dInfo->rangeFirst == NULL) {
- if (rItem->index < dInfo->dRowLabelCnt) {
- dRowLabel = &dInfo->dRowLabel[rItem->index];
- if (TreeRowLabel_FixedHeight(dRowLabel->row) > 0) {
- rItem->size = TreeRowLabel_FixedHeight(dRowLabel->row);
- } else if (TreeRowLabel_NeededHeight(dRowLabel->row) > rItem->size) {
- rItem->size = TreeRowLabel_NeededHeight(dRowLabel->row);
- }
- dRowLabel->offset = rItem->offset;
- dRowLabel->height = rItem->size;
- }
- }
-#endif
} else {
if (fixedWidth != -1) {
rItem->size = fixedWidth;
@@ -679,9 +617,6 @@ Range_TotalHeight(
Range *range /* Range to return the height of. */
)
{
-#ifdef ROW_LABEL
- DInfo *dInfo = (DInfo *) tree->dInfo;
-#endif
TreeItem item;
RItem *rItem;
int itemHeight;
@@ -696,20 +631,6 @@ Range_TotalHeight(
itemHeight = TreeItem_Height(tree, item);
if (tree->vertical) {
rItem->offset = range->totalHeight;
-#ifdef ROW_LABEL
- if (dInfo->rangeFirst == range) { /* always true? */
- if (rItem->index < dInfo->dRowLabelCnt) {
- DRowLabel *dRowLabel = &dInfo->dRowLabel[rItem->index];
- if (TreeRowLabel_FixedHeight(dRowLabel->row) > 0) {
- itemHeight = TreeRowLabel_FixedHeight(dRowLabel->row);
- } else if (TreeRowLabel_NeededHeight(dRowLabel->row) > itemHeight) {
- itemHeight = TreeRowLabel_NeededHeight(dRowLabel->row);
- }
- dRowLabel->offset = rItem->offset;
- dRowLabel->height = itemHeight;
- }
- }
-#endif
rItem->size = itemHeight;
range->totalHeight += itemHeight;
}
@@ -721,19 +642,6 @@ Range_TotalHeight(
break;
rItem++;
}
-#ifdef ROW_LABEL
- if (!tree->vertical) {
- if (range->index < dInfo->dRowLabelCnt) {
- DRowLabel *dRowLabel = &dInfo->dRowLabel[range->index];
- if (TreeRowLabel_FixedHeight(dRowLabel->row) > 0) {
- range->totalHeight = TreeRowLabel_FixedHeight(dRowLabel->row);
- } else if (TreeRowLabel_NeededHeight(dRowLabel->row) > range->totalHeight) {
- range->totalHeight = TreeRowLabel_NeededHeight(dRowLabel->row);
- }
- dRowLabel->height = range->totalHeight;
- }
- }
-#endif
return range->totalHeight;
}
@@ -830,16 +738,6 @@ Tree_TotalHeight(
}
range = range->next;
}
-#ifdef ROW_LABEL
- if (!tree->vertical) {
- int i, offset = 0;
- for (i = 0; i < dInfo->dRowLabelCnt; i++) {
- DRowLabel *dRowLabel = &dInfo->dRowLabel[i];
- dRowLabel->offset = offset;
- offset += dRowLabel->height;
- }
- }
-#endif
#ifdef COLUMN_LOCK
/* If dInfo->rangeLock is not NULL, then we are displaying some items
* in locked columns but no non-locked columns. */
@@ -1993,11 +1891,6 @@ Tree_HitTest(
if ((y < Tree_BorderTop(tree)) || (y >= Tree_BorderBottom(tree)))
return TREE_AREA_NONE;
-#ifdef ROW_LABEL
- if (x < Tree_WidthOfRowLabels(tree))
- return TREE_AREA_ROWLABEL;
-#endif
-
if (y < tree->inset + Tree_HeaderHeight(tree)) {
return TREE_AREA_HEADER;
}
@@ -2097,149 +1990,6 @@ Tree_ItemBbox(
return 0;
}
-#ifdef ROW_LABEL
-/*
- *--------------------------------------------------------------
- *
- * Tree_RowLabelUnderPoint --
- *
- * Return a TreeRowLabel containing the given coordinates.
- *
- * Results:
- * TreeRowLabel token or NULL if no row label contains the point.
- *
- * Side effects:
- * The list of Ranges will be recalculated if needed.
- *
- *--------------------------------------------------------------
- */
-
-TreeRowLabel
-Tree_RowLabelUnderPoint(
- TreeCtrl *tree, /* Widget info. */
- int *x_, int *y_, /* In: window coordinates.
- * Out: coordinates relative to top-left
- * corner of the returned row label. */
- int *w, int *h, /* Returned width and height. */
- int nearest /* TRUE if the row label nearest the coordinates
- * should be returned. */
- )
-{
- DInfo *dInfo = (DInfo *) tree->dInfo;
- DRowLabel *dRowLabel;
- int x = *x_, y = *y_;
- int i, l, u;
- int bottomOfRows;
-
- Range_RedoIfNeeded(tree);
- if (dInfo->dRowLabelCnt == 0)
- return NULL;
-
- dRowLabel = &dInfo->dRowLabel[dInfo->dRowLabelCnt - 1];
- bottomOfRows = dRowLabel->offset + dRowLabel->height;
- bottomOfRows -= tree->yOrigin; /* canvas -> window */
-
- if (nearest) {
- if (x < tree->inset)
- x = tree->inset;
- if (x >= Tree_ContentLeft(tree))
- x = Tree_ContentLeft(tree) - 1;
- if (y < Tree_ContentTop(tree))
- y = Tree_ContentTop(tree);
- if (y >= bottomOfRows)
- y = bottomOfRows - 1;
- } else {
- if (x < tree->inset)
- return NULL;
- if (x >= Tree_ContentLeft(tree))
- return NULL;
- if (y < Tree_ContentTop(tree))
- return NULL;
- if (y >= bottomOfRows)
- return NULL;
- }
-
- /* Window -> canvas */
- y += tree->yOrigin;
-
- /* Binary search */
- l = 0;
- u = dInfo->dRowLabelCnt - 1;
- while (l <= u) {
- i = (l + u) / 2;
- dRowLabel = dInfo->dRowLabel + i;
- if ((y >= dRowLabel->offset) && (y < dRowLabel->offset + dRowLabel->height)) {
- (*x_) = x - tree->inset;
- (*y_) = y - dRowLabel->offset;
- (*w) = Tree_WidthOfRowLabels(tree);
- (*h) = dRowLabel->height;
- return dRowLabel->row;
- }
- if (y < dRowLabel->offset)
- u = i - 1;
- else
- l = i + 1;
- }
- panic("Tree_RowLabelUnderPoint: can't find any row\n");
- return NULL;
-}
-
-/*
- *--------------------------------------------------------------
- *
- * Tree_RowLabelBbox --
- *
- * Return the bounding box for a row label.
- *
- * Results:
- * Return value is -1 if the row label is not visible. The coordinates
- * are relative to the top-left corner of the canvas.
- *
- * Side effects:
- * The list of Ranges will be recalculated if needed.
- *
- *--------------------------------------------------------------
- */
-
-int
-Tree_RowLabelBbox(
- TreeCtrl *tree, /* Widget info. */
- TreeRowLabel row, /* Row label whose bbox is needed. */
- int *x, int *y, /* Returned left and top. */
- int *w, int *h /* Returned width and height. */
- )
-{
- DInfo *dInfo = (DInfo *) tree->dInfo;
- DRowLabel *dRowLabel;
- int i, l, u;
-
- if (!TreeRowLabel_Visible(row) || !tree->showRowLabels)
- return -1;
- Range_RedoIfNeeded(tree);
-
- /* Binary search */
- l = 0;
- u = dInfo->dRowLabelCnt - 1;
- while (l <= u) {
- i = (l + u) / 2;
- dRowLabel = dInfo->dRowLabel + i;
- if (dRowLabel->row == row) {
- (*x) = -Tree_WidthOfRowLabels(tree);
- (*y) = dRowLabel->offset;
- (*w) = Tree_WidthOfRowLabels(tree);
- (*h) = dRowLabel->height;
- return 0;
- }
- if (TreeRowLabel_Index(row) < TreeRowLabel_Index(dRowLabel->row))
- u = i - 1;
- else
- l = i + 1;
- }
-
- return -1;
-}
-#endif /* ROW_LABEL */
-
/*
*--------------------------------------------------------------
*
@@ -4836,20 +4586,6 @@ displayRetry:
DINFO_DRAW_HEADER*/;
}
#endif /* COLUMN_LOCK */
-#ifdef ROW_LABEL
- if (dInfo->rowLabelWidth != Tree_WidthOfRowLabels(tree)) {
- dInfo->rowLabelWidth = Tree_WidthOfRowLabels(tree);
- dInfo->flags |=
- DINFO_SET_ORIGIN_X |
- DINFO_UPDATE_SCROLLBAR_X |
- DINFO_OUT_OF_DATE |
- DINFO_REDO_RANGES |
- DINFO_DRAW_HEADER;
- }
- if (dInfo->flags & DINFO_REDO_RANGES) {
- dInfo->flags |= DINFO_DRAW_ROWLABELS;
- }
-#endif
Range_RedoIfNeeded(tree);
Increment_RedoIfNeeded(tree);
if (dInfo->xOrigin != tree->xOrigin) {
@@ -4877,19 +4613,6 @@ displayRetry:
DINFO_UPDATE_SCROLLBAR_Y |
DINFO_OUT_OF_DATE;
}
-#ifdef ROW_LABEL
- if (dInfo->flags & (
- DINFO_SET_ORIGIN_Y |
- DINFO_UPDATE_SCROLLBAR_Y)) {
- /*
- * Redraw rowlabels because of:
- * 1) vertical scrolling
- * 2) redo-ranges
- * 3) display change of rowlabel
- */
- dInfo->flags |= DINFO_DRAW_ROWLABELS;
- }
-#endif
if (dInfo->flags & DINFO_SET_ORIGIN_X) {
Tree_SetOriginX(tree, tree->xOrigin);
dInfo->flags &= ~DINFO_SET_ORIGIN_X;
@@ -5026,75 +4749,6 @@ displayRetry:
dInfo->flags &= ~DINFO_DRAW_HEADER;
}
-#ifdef ROW_LABEL
- {
- TreeRowLabel row = tree->rows;
-
- /* Need onscreen/offscreen calls for window elements. */
- while (row != NULL) {
- if (!TreeRowLabel_Visible(row) || (Tree_WidthOfRowLabels(tree) <= 0)) {
- TreeRowLabel_OnScreen(row, FALSE);
- }
- row = TreeRowLabel_Next(row);
- }
- }
- if (dInfo->flags & DINFO_DRAW_ROWLABELS) {
- dInfo->flags &= ~DINFO_DRAW_ROWLABELS;
- if (Tree_WidthOfRowLabels(tree) > 0) {
- DRowLabel *dRowLabel = dInfo->dRowLabel;
- int i, y = 0 - tree->yOrigin;
- int width = Tree_WidthOfRowLabels(tree);
- Drawable pixmap = drawable;
- if (tree->doubleBuffer == DOUBLEBUFFER_ITEM) {
- pixmap = Tk_GetPixmap(tree->display, Tk_WindowId(tkwin),
- tree->inset + width, Tk_Height(tkwin),
- Tk_Depth(tkwin));
- }
-
- /* Erase entire background. */
- /* FIXME: background image? */
- Tk_Fill3DRectangle(tree->tkwin, pixmap, tree->border,
- tree->inset, Tree_ContentTop(tree), width,
- Tree_ContentHeight(tree), 0, TK_RELIEF_FLAT);
-
- /* This is needed for updating window positions */
- tree->drawableXOrigin = tree->xOrigin;
- tree->drawableYOrigin = tree->yOrigin;
-
- for (i = 0; i < dInfo->dRowLabelCnt; i++) {
- int onScreen = FALSE;
- dRowLabel = &dInfo->dRowLabel[i];
- if (dRowLabel->height > 0) {
- if ((y + dRowLabel->height > Tree_ContentTop(tree)) &&
- (y < Tree_ContentBottom(tree))) {
- TreeRowLabel_Draw(dRowLabel->row, tree->inset, y,
- width, dRowLabel->height,
- pixmap);
- onScreen = TRUE;
- }
- y += dRowLabel->height;
- }
- TreeRowLabel_OnScreen(dRowLabel->row, onScreen);
- }
-
- if (tree->doubleBuffer == DOUBLEBUFFER_ITEM) {
- XCopyArea(tree->display, pixmap, drawable,
- tree->copyGC, tree->inset, Tree_ContentTop(tree),
- width, Tree_ContentHeight(tree),
- tree->inset, Tree_ContentTop(tree));
- Tk_FreePixmap(tree->display, pixmap);
- }
-
- if (tree->doubleBuffer == DOUBLEBUFFER_WINDOW) {
- dInfo->dirty[LEFT] = MIN(dInfo->dirty[LEFT], tree->inset);
- dInfo->dirty[TOP] = MIN(dInfo->dirty[TOP], Tree_ContentTop(tree));
- dInfo->dirty[RIGHT] = MAX(dInfo->dirty[RIGHT], tree->inset);
- dInfo->dirty[BOTTOM] = MAX(dInfo->dirty[BOTTOM], Tree_ContentBottom(tree));
- }
- }
- }
-#endif /* ROW_LABEL */
-
if (tree->vertical) {
numCopy = ScrollVerticalComplex(tree);
ScrollHorizontalSimple(tree);
@@ -6383,14 +6037,9 @@ Tree_InvalidateArea(
if ((y2 > tree->inset) && (y1 < tree->inset + Tree_HeaderHeight(tree)))
dInfo->flags |= DINFO_DRAW_HEADER;
-#ifdef ROW_LABEL
- if (x2 > tree->inset && x1 < Tree_ContentLeft(tree))
- dInfo->flags |= DINFO_DRAW_ROWLABELS;
-#endif
-
dItem = dInfo->dItem;
while (dItem != NULL) {
- if (!(dItem->area.flags & DITEM_ALL_DIRTY) && !dInfo->empty &&
+ if (!dInfo->empty && !(dItem->area.flags & DITEM_ALL_DIRTY) &&
(x2 > dItem->area.x) && (x1 < dItem->area.x + dItem->area.width) &&
(y2 > dItem->y) && (y1 < dItem->y + dItem->height)) {
InvalidateDItemX(dItem, &dItem->area, dItem->area.x, x1, x2 - x1);
@@ -6493,13 +6142,6 @@ Tree_InvalidateRegion(
!= RectangleOut)
dInfo->flags |= DINFO_DRAW_HEADER;
-#ifdef ROW_LABEL
- if (TkRectInRegion(region, tree->inset, Tree_ContentTop(tree),
- Tree_WidthOfRowLabels(tree), Tree_ContentHeight(tree))
- != RectangleOut)
- dInfo->flags |= DINFO_DRAW_ROWLABELS;
-#endif
-
rgn = TkCreateRegion();
dItem = dInfo->dItem;
@@ -6731,10 +6373,6 @@ TreeDInfo_Free(
}
while (range != NULL)
range = Range_Free(tree, range);
-#ifdef ROW_LABEL
- if (dInfo->dRowLabel != NULL)
- ckfree((char *) dInfo->dRowLabel);
-#endif
Tk_FreeGC(tree->display, dInfo->scrollGC);
if (dInfo->flags & DINFO_REDRAW_PENDING)
Tcl_CancelIdleCall(Tree_Display, (ClientData) tree);
diff --git a/generic/tkTreeElem.c b/generic/tkTreeElem.c
index 1df0366..81abe52 100644
--- a/generic/tkTreeElem.c
+++ b/generic/tkTreeElem.c
@@ -5,7 +5,7 @@
*
* Copyright (c) 2002-2006 Tim Baker
*
- * RCS: @(#) $Id: tkTreeElem.c,v 1.42 2006/10/11 01:28:51 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeElem.c,v 1.43 2006/10/14 21:19:53 treectrl Exp $
*/
#include "tkTreeCtrl.h"
@@ -2031,9 +2031,6 @@ struct ElementText
TreeCtrl *tree; /* needed to redisplay */
TreeItem item; /* needed to redisplay */
TreeItemColumn column; /* needed to redisplay */
-#ifdef ROW_LABEL
- TreeRowLabel row; /* needed to redisplay */
-#endif
#endif
};
@@ -2458,13 +2455,8 @@ static char *VarTraceProc_Text(ClientData clientData, Tcl_Interp *interp,
}
elemX->stringRepInvalid = TRUE;
-#ifdef ROW_LABEL
- Tree_ElementChangedItself(elemX->tree, elemX->item, elemX->column,
- elemX->row, (Element *) elemX, CS_LAYOUT | CS_DISPLAY);
-#else
Tree_ElementChangedItself(elemX->tree, elemX->item, elemX->column,
(Element *) elemX, CS_LAYOUT | CS_DISPLAY);
-#endif
return (char *) NULL;
}
#endif /* TEXTVAR */
@@ -2579,9 +2571,6 @@ static int CreateProcText(ElementArgs *args)
elemX->tree = args->tree;
elemX->item = args->create.item;
elemX->column = args->create.column;
-#ifdef ROW_LABEL
- elemX->row = args->create.row;
-#endif
#endif
return TCL_OK;
}
@@ -3056,9 +3045,6 @@ struct ElementWindow
TreeCtrl *tree;
TreeItem item; /* Needed if window changes size */
TreeItemColumn column; /* Needed if window changes size */
-#ifdef ROW_LABEL
- TreeRowLabel row; /* Needed if window changes size */
-#endif
Tk_Window tkwin; /* Window associated with item. NULL means
* window has been destroyed. */
int destroy; /* Destroy window when element
@@ -3106,13 +3092,8 @@ WinItemStructureProc(clientData, eventPtr)
if (eventPtr->type == DestroyNotify) {
elemX->tkwin = elemX->child = NULL;
-#ifdef ROW_LABEL
- Tree_ElementChangedItself(elemX->tree, elemX->item, elemX->column,
- elemX->row, (Element *) elemX, CS_LAYOUT | CS_DISPLAY);
-#else
Tree_ElementChangedItself(elemX->tree, elemX->item, elemX->column,
(Element *) elemX, CS_LAYOUT | CS_DISPLAY);
-#endif
}
}
@@ -3129,13 +3110,8 @@ WinItemRequestProc(clientData, tkwin)
if (elemX->child != NULL && tkwin != elemX->child)
return;
#endif
-#ifdef ROW_LABEL
- Tree_ElementChangedItself(elemX->tree, elemX->item, elemX->column,
- elemX->row, (Element *) elemX, CS_LAYOUT | CS_DISPLAY);
-#else
Tree_ElementChangedItself(elemX->tree, elemX->item, elemX->column,
(Element *) elemX, CS_LAYOUT | CS_DISPLAY);
-#endif
}
static void
@@ -3182,13 +3158,8 @@ WinItemLostSlaveProc(clientData, tkwin)
Tk_UnmapWindow(elemX->tkwin);
elemX->tkwin = NULL;
#endif
-#ifdef ROW_LABEL
- Tree_ElementChangedItself(elemX->tree, elemX->item, elemX->column,
- elemX->row, (Element *) elemX, CS_LAYOUT | CS_DISPLAY);
-#else
Tree_ElementChangedItself(elemX->tree, elemX->item, elemX->column,
(Element *) elemX, CS_LAYOUT | CS_DISPLAY);
-#endif
}
static Tk_GeomMgr winElemGeomType = {
@@ -3381,9 +3352,6 @@ static int CreateProcWindow(ElementArgs *args)
elemX->tree = tree;
elemX->item = args->create.item;
elemX->column = args->create.column;
-#ifdef ROW_LABEL
- elemX->row = args->create.row;
-#endif
elemX->destroy = -1;
#ifdef CLIP_WINDOW
elemX->clip = -1;
diff --git a/generic/tkTreeElem.h b/generic/tkTreeElem.h
index 5ceeaf0..489c826 100644
--- a/generic/tkTreeElem.h
+++ b/generic/tkTreeElem.h
@@ -5,7 +5,7 @@
*
* Copyright (c) 2002-2006 Tim Baker
*
- * RCS: @(#) $Id: tkTreeElem.h,v 1.20 2006/10/04 03:32:23 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeElem.h,v 1.21 2006/10/14 21:19:53 treectrl Exp $
*/
typedef struct ElementType ElementType;
@@ -20,9 +20,6 @@ struct ElementArgs
struct {
TreeItem item;
TreeItemColumn column;
-#ifdef ROW_LABEL
- TreeRowLabel row;
-#endif
} create;
struct {
int noop;
@@ -125,13 +122,9 @@ extern TreeIterate Tree_ElementIterateBegin(TreeCtrl *tree, ElementType *elemTyp
extern TreeIterate Tree_ElementIterateNext(TreeIterate iter_);
extern Element *Tree_ElementIterateGet(TreeIterate iter_);
extern void Tree_ElementIterateChanged(TreeIterate iter_, int mask);
-#ifdef ROW_LABEL
-extern void Tree_ElementChangedItself(TreeCtrl *tree, TreeItem item,
- TreeItemColumn column, TreeRowLabel row, Element *elem, int mask);
-#else
extern void Tree_ElementChangedItself(TreeCtrl *tree, TreeItem item,
TreeItemColumn column, Element *elem, int mask);
-#endif
+
typedef struct TreeCtrlStubs TreeCtrlStubs;
struct TreeCtrlStubs
{
diff --git a/generic/tkTreeItem.c b/generic/tkTreeItem.c
index d0baf60..10426b7 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.68 2006/10/14 20:16:48 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeItem.c,v 1.69 2006/10/14 21:19:53 treectrl Exp $
*/
#include "tkTreeCtrl.h"
@@ -4973,13 +4973,8 @@ ItemElementCmd(
result = TCL_ERROR;
break;
}
-#ifdef ROW_LABEL
- result = TreeStyle_ElementCget(tree, (TreeItem) item,
- (TreeItemColumn) column, NULL, column->style, objv[6], objv[7]);
-#else
result = TreeStyle_ElementCget(tree, (TreeItem) item,
(TreeItemColumn) column, column->style, objv[6], objv[7]);
-#endif
break;
}
@@ -5121,15 +5116,9 @@ if (!co[index].isColumn) panic("isColumn == FALSE");
int eMask, index2;
if (co[indexElem].numArgs == -1) panic("indexElem=%d (%s) objc=%d numArgs == -1", indexElem, Tcl_GetString(objv[indexElem]), objc);
-#ifdef ROW_LABEL
- result = TreeStyle_ElementConfigure(tree, (TreeItem) item,
- (TreeItemColumn) column, NULL, column->style, objv[indexElem],
- co[indexElem].numArgs, (Tcl_Obj **) objv + indexElem + 1, &eMask);
-#else
result = TreeStyle_ElementConfigure(tree, (TreeItem) item,
(TreeItemColumn) column, column->style, objv[indexElem],
co[indexElem].numArgs, (Tcl_Obj **) objv + indexElem + 1, &eMask);
-#endif
if (result != TCL_OK)
break;
@@ -7328,15 +7317,9 @@ TreeItemCmd(
result = TCL_ERROR;
goto doneComplex;
}
-#ifdef ROW_LABEL
- if (TreeStyle_ElementConfigure(tree, (TreeItem) item,
- (TreeItemColumn) column, NULL, column->style,
- objv2[0], objc2 - 1, objv2 + 1, &eMask) != TCL_OK) {
-#else
if (TreeStyle_ElementConfigure(tree, (TreeItem) item,
(TreeItemColumn) column, column->style,
objv2[0], objc2 - 1, objv2 + 1, &eMask) != TCL_OK) {
-#endif
result = TCL_ERROR;
goto doneComplex;
}
@@ -7950,17 +7933,10 @@ doneSPAN:
goto doneTEXT;
}
result = isImage ?
-#ifdef ROW_LABEL
- TreeStyle_SetImage(tree, _item,
- (TreeItemColumn) column, (TreeRowLabel) NULL, column->style, co[i].obj) :
- TreeStyle_SetText(tree, _item,
- (TreeItemColumn) column, (TreeRowLabel) NULL, column->style, co[i].obj);
-#else
TreeStyle_SetImage(tree, _item,
(TreeItemColumn) column, column->style, co[i].obj) :
TreeStyle_SetText(tree, _item,
(TreeItemColumn) column, column->style, co[i].obj);
-#endif
if (result != TCL_OK)
goto doneTEXT;
TreeItemColumn_InvalidateSize(tree, (TreeItemColumn) column);
diff --git a/generic/tkTreeRowLabel.c b/generic/tkTreeRowLabel.c
deleted file mode 100644
index c18ca87..0000000
--- a/generic/tkTreeRowLabel.c
+++ /dev/null
@@ -1,3107 +0,0 @@
-/*
- * tkTreeRow.c --
- *
- * This module implements a treectrl's row labels.
- *
- * Copyright (c) 2002-2006 Tim Baker
- *
- * RCS: @(#) $Id: tkTreeRowLabel.c,v 1.2 2006/10/05 22:44:56 treectrl Exp $
- */
-
-#include "tkTreeCtrl.h"
-
-typedef struct RowLabel RowLabel;
-
-/*
- * The following structure holds information about a single
- * row label in a TreeCtrl.
- */
-struct RowLabel
-{
- int height; /* -height */
- Tcl_Obj *heightObj; /* -height */
- int minHeight; /* -minheight */
- Tcl_Obj *minHeightObj; /* -minheight */
- int maxHeight; /* -maxheight */
- Tcl_Obj *maxHeightObj; /* -maxheight */
- int visible; /* -visible */
- int resize; /* -resize */
- Tcl_Obj *styleObj; /* -style */
- int state; /* state flags. FIXME: item states have no meaning here */
-
- TreeCtrl *tree;
- Tk_OptionTable optionTable;
- int id; /* unique identifier */
- int index; /* order in list of rows */
- TreeStyle style; /* style */
- int onScreen; /* TRUE if onscreen. */
- TagInfo *tagInfo; /* Tags. May be NULL. */
- RowLabel *prev;
- RowLabel *next;
-};
-
-#define ROW_CONF_WIDTH 0x0002
-#define ROW_CONF_HEIGHT 0x0004
-#define ROW_CONF_DISPLAY 0x0040
-#define ROW_CONF_STYLE 0x0100
-#define ROW_CONF_TAGS 0x0200
-#define ROW_CONF_RANGES 0x0800
-
-static Tk_OptionSpec rowSpecs[] = {
- {TK_OPTION_PIXELS, "-height", (char *) NULL, (char *) NULL,
- (char *) NULL, Tk_Offset(RowLabel, heightObj), Tk_Offset(RowLabel, height),
- TK_OPTION_NULL_OK, (ClientData) NULL, ROW_CONF_HEIGHT},
- {TK_OPTION_PIXELS, "-maxheight", (char *) NULL, (char *) NULL,
- (char *) NULL, Tk_Offset(RowLabel, maxHeightObj),
- Tk_Offset(RowLabel, maxHeight),
- TK_OPTION_NULL_OK, (ClientData) NULL, ROW_CONF_HEIGHT},
- {TK_OPTION_PIXELS, "-minheight", (char *) NULL, (char *) NULL,
- (char *) NULL, Tk_Offset(RowLabel, minHeightObj),
- Tk_Offset(RowLabel, minHeight),
- TK_OPTION_NULL_OK, (ClientData) NULL, ROW_CONF_HEIGHT},
- {TK_OPTION_BOOLEAN, "-resize", (char *) NULL, (char *) NULL,
- "1", -1, Tk_Offset(RowLabel, resize), 0, (ClientData) NULL, 0},
- {TK_OPTION_STRING, "-style", (char *) NULL, (char *) NULL,
- (char *) NULL, Tk_Offset(RowLabel, styleObj), -1,
- TK_OPTION_NULL_OK, (ClientData) NULL, ROW_CONF_STYLE},
- {TK_OPTION_CUSTOM, "-tags", (char *) NULL, (char *) NULL,
- (char *) NULL, -1, Tk_Offset(RowLabel, tagInfo),
- TK_OPTION_NULL_OK, (ClientData) &TagInfoCO, ROW_CONF_TAGS},
- {TK_OPTION_BOOLEAN, "-visible", (char *) NULL, (char *) NULL,
- "1", -1, Tk_Offset(RowLabel, visible),
- 0, (ClientData) NULL, 0},
- {TK_OPTION_END, (char *) NULL, (char *) NULL, (char *) NULL,
- (char *) NULL, 0, -1, 0, 0, 0}
-};
-
-/*
- *----------------------------------------------------------------------
- *
- * RowOptionSet --
- *
- * Tk_ObjCustomOption.setProc(). Converts a Tcl_Obj holding a
- * row description into a pointer to a Row.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * May store a TreeRowLabel pointer into the internal representation
- * pointer. May change the pointer to the Tcl_Obj to NULL to indicate
- * that the specified string was empty and that is acceptable.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-RowOptionSet(
- ClientData clientData, /* RFO_xxx flags to control the conversion. */
- Tcl_Interp *interp, /* Current interpreter. */
- Tk_Window tkwin, /* Window for which option is being set. */
- Tcl_Obj **value, /* Pointer to the pointer to the value object.
- * We use a pointer to the pointer because
- * we may need to return a value (NULL). */
- char *recordPtr, /* Pointer to storage for the widget record. */
- int internalOffset, /* Offset within *recordPtr at which the
- * internal value is to be stored. */
- char *saveInternalPtr, /* Pointer to storage for the old value. */
- int flags /* Flags for the option, set Tk_SetOptions. */
- )
-{
- int rfoFlags = (int) clientData;
- TreeCtrl *tree = (TreeCtrl *) ((TkWindow *) tkwin)->instanceData;
- int objEmpty;
- TreeRowLabel new, *internalPtr;
-
- if (internalOffset >= 0)
- internalPtr = (TreeRowLabel *) (recordPtr + internalOffset);
- else
- internalPtr = NULL;
-
- objEmpty = ObjectIsEmpty((*value));
-
- if ((flags & TK_OPTION_NULL_OK) && objEmpty)
- (*value) = NULL;
- else {
- if (TreeRowLabel_FromObj(tree, (*value), &new, rfoFlags) != TCL_OK)
- return TCL_ERROR;
- }
- if (internalPtr != NULL) {
- if ((*value) == NULL)
- new = NULL;
- *((TreeRowLabel *) saveInternalPtr) = *internalPtr;
- *internalPtr = new;
- }
-
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * RowOptionGet --
- *
- * Tk_ObjCustomOption.getProc(). Converts a TreeRowLabel into a
- * Tcl_Obj string representation.
- *
- * Results:
- * Tcl_Obj containing the string representation of the row.
- * Returns NULL if the TreeRowLabel is NULL.
- *
- * Side effects:
- * May create a new Tcl_Obj.
- *
- *----------------------------------------------------------------------
- */
-
-static Tcl_Obj *
-RowOptionGet(
- ClientData clientData, /* Not used. */
- Tk_Window tkwin, /* Window for which option is being set. */
- char *recordPtr, /* Pointer to widget record. */
- int internalOffset /* Offset within *recordPtr containing the
- * sticky value. */
- )
-{
- TreeRowLabel value = *(TreeRowLabel *) (recordPtr + internalOffset);
- TreeCtrl *tree = (TreeCtrl *) ((TkWindow *) tkwin)->instanceData;
- if (value == NULL)
- return NULL;
- if (value == ROW_ALL)
- return Tcl_NewStringObj("all", -1);
- return TreeRowLabel_ToObj(tree, value);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * RowOptionRestore --
- *
- * Tk_ObjCustomOption.restoreProc(). Restores a TreeRowLabel value
- * from a saved value.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Restores the old value.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-RowOptionRestore(
- ClientData clientData, /* Not used. */
- Tk_Window tkwin, /* Not used. */
- char *internalPtr, /* Where to store old value. */
- char *saveInternalPtr) /* Pointer to old value. */
-{
- *(TreeRowLabel *) internalPtr = *(TreeRowLabel *) saveInternalPtr;
-}
-
-/*
- * The following structure contains pointers to functions used for processing
- * a custom config option that handles Tcl_Obj<->TreeRowLabel conversion.
- * A row description must refer to a valid row. "all" is not allowed.
- */
-Tk_ObjCustomOption rowCustomOption =
-{
- "row",
- RowOptionSet,
- RowOptionGet,
- RowOptionRestore,
- NULL,
- (ClientData) (RFO_NOT_MANY | RFO_NOT_NULL)
-};
-
-static Tk_OptionSpec dragSpecs[] = {
- {TK_OPTION_BOOLEAN, "-enable", (char *) NULL, (char *) NULL,
- "0", -1, Tk_Offset(TreeCtrl, rowDrag.enable),
- 0, (ClientData) NULL, 0},
- {TK_OPTION_INT, "-imagealpha", (char *) NULL, (char *) NULL,
- "128", -1, Tk_Offset(TreeCtrl, rowDrag.alpha),
- 0, (ClientData) NULL, 0},
- {TK_OPTION_COLOR, "-imagecolor", (char *) NULL, (char *) NULL,
- "gray75", -1, Tk_Offset(TreeCtrl, rowDrag.color),
- 0, (ClientData) NULL, 0},
- {TK_OPTION_CUSTOM, "-imagerow", (char *) NULL, (char *) NULL,
- (char *) NULL, -1, Tk_Offset(TreeCtrl, rowDrag.row),
- TK_OPTION_NULL_OK, (ClientData) &rowCustomOption, 0},
- {TK_OPTION_PIXELS, "-imageoffset", (char *) NULL, (char *) NULL,
- (char *) NULL, Tk_Offset(TreeCtrl, rowDrag.offsetObj),
- Tk_Offset(TreeCtrl, rowDrag.offset), 0, (ClientData) NULL, 0},
- {TK_OPTION_COLOR, "-indicatorcolor", (char *) NULL, (char *) NULL,
- "Black", -1, Tk_Offset(TreeCtrl, rowDrag.indColor),
- 0, (ClientData) NULL, 0},
- {TK_OPTION_CUSTOM, "-indicatorrow", (char *) NULL, (char *) NULL,
- (char *) NULL, -1, Tk_Offset(TreeCtrl, rowDrag.indRow),
- TK_OPTION_NULL_OK, (ClientData) &rowCustomOption, 0},
- {TK_OPTION_END, (char *) NULL, (char *) NULL, (char *) NULL,
- (char *) NULL, 0, -1, 0, 0, 0}
-};
-
-typedef struct Qualifiers {
- TreeCtrl *tree;
- int visible; /* 1 for -visible TRUE,
- 0 for -visible FALSE,
- -1 for unspecified. */
- int states[3]; /* States that must be on or off. */
- TagExpr expr; /* Tag expression. */
- int exprOK; /* TRUE if expr is valid. */
-} Qualifiers;
-
-/*
- *----------------------------------------------------------------------
- *
- * Qualifiers_Init --
- *
- * Helper routine for TreeItem_FromObj.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-Qualifiers_Init(
- TreeCtrl *tree, /* Widget info. */
- Qualifiers *q /* Out: Initialized qualifiers. */
- )
-{
- q->tree = tree;
- q->visible = -1;
- q->states[0] = q->states[1] = q->states[2] = 0;
- q->exprOK = FALSE;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Qualifiers_Scan --
- *
- * Helper routine for TreeItem_FromObj.
- *
- * Results:
- * TCL_OK or TCL_ERROR.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-Qualifiers_Scan(
- Qualifiers *q, /* Must call Qualifiers_Init first,
- * and Qualifiers_Free if result is TCL_OK. */
- int objc, /* Number of arguments. */
- Tcl_Obj **objv, /* Argument values. */
- int startIndex, /* First objv[] index to look at. */
- int *argsUsed /* Out: number of objv[] used. */
- )
-{
- TreeCtrl *tree = q->tree;
- Tcl_Interp *interp = tree->interp;
- int qual, j = startIndex;
-
- static CONST char *qualifiers[] = {
- "state", "tag", "visible", "!visible", NULL
- };
- enum qualEnum {
- QUAL_STATE, QUAL_TAG, QUAL_VISIBLE, QUAL_NOT_VISIBLE
- };
- /* Number of arguments used by qualifiers[]. */
- static int qualArgs[] = {
- 2, 2, 1, 1
- };
-
- *argsUsed = 0;
-
- for (; j < objc; ) {
- if (Tcl_GetIndexFromObj(NULL, objv[j], qualifiers, NULL, 0,
- &qual) != TCL_OK)
- break;
- if (objc - j < qualArgs[qual]) {
- Tcl_AppendResult(interp, "missing arguments to \"",
- Tcl_GetString(objv[j]), "\" qualifier", NULL);
- goto errorExit;
- }
- switch ((enum qualEnum) qual) {
- case QUAL_STATE:
- {
- if (Tree_StateFromListObj(tree, objv[j + 1], q->states,
- SFO_NOT_TOGGLE) != TCL_OK)
- goto errorExit;
- break;
- }
- case QUAL_TAG:
- {
- if (q->exprOK)
- TagExpr_Free(&q->expr);
- if (TagExpr_Init(tree, objv[j + 1], &q->expr) != TCL_OK)
- return TCL_ERROR;
- q->exprOK = TRUE;
- break;
- }
- case QUAL_VISIBLE:
- {
- q->visible = 1;
- break;
- }
- case QUAL_NOT_VISIBLE:
- {
- q->visible = 0;
- break;
- }
- }
- *argsUsed += qualArgs[qual];
- j += qualArgs[qual];
- }
- return TCL_OK;
-errorExit:
- if (q->exprOK)
- TagExpr_Free(&q->expr);
- return TCL_ERROR;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Qualifies --
- *
- * Helper routine for TreeItem_FromObj.
- *
- * Results:
- * Returns TRUE if the item meets the given criteria.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-Qualifies(
- Qualifiers *q, /* Qualifiers to check. */
- RowLabel *row /* The row to test. May be NULL. */
- )
-{
- /* Note: if the row is NULL it is a "match" because we have run
- * out of row to check. */
- if (row == NULL)
- return 1;
- if ((q->visible == 1) && !row->visible)
- return 0;
- else if ((q->visible == 0) && row->visible)
- return 0;
- if (q->states[STATE_OP_OFF] & row->state)
- return 0;
- if ((q->states[STATE_OP_ON] & row->state) != q->states[STATE_OP_ON])
- return 0;
- if (q->exprOK && !TagExpr_Eval(&q->expr, row->tagInfo))
- return 0;
- return 1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Qualifiers_Free --
- *
- * Helper routine for TreeItem_FromObj.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-Qualifiers_Free(
- Qualifiers *q /* Out: Initialized qualifiers. */
- )
-{
- if (q->exprOK)
- TagExpr_Free(&q->expr);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabelList_FromObj --
- *
- * Parse a Tcl_Obj rowlabel description to get a list of rowlabels.
- *
- * ID MODIFIERS
- * TAG QUALIFIERS
- * all QUALIFIERS
- * first QUALIFIERS MODIFIERS
- * end|last QUALIFIERS MODIFIERS
- * list listOfDescs
- * order N QUALIFIERS MODIFIERS
- * range first last QUALIFIERS
- * tag tagExpr QUALFIERS
- *
- * MODIFIERS:
- * next QUALIFIERS
- * prev QUALIFIERS
- *
- * QUALIFIERS:
- * state stateList
- * tag tagExpr
- * visible
- * !visible
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TreeRowLabelList_FromObj(
- TreeCtrl *tree, /* Widget info. */
- Tcl_Obj *objPtr, /* RowLabel description. */
- TreeRowLabelList *rows, /* Uninitialized list. Caller must free
- * it with TreeRowLabelList_Free unless the
- * result of this function is TCL_ERROR. */
- int flags /* RFO_xxx flags. */
- )
-{
- Tcl_Interp *interp = tree->interp;
- int objc;
- int index, listIndex;
- Tcl_Obj **objv, *elemPtr;
- RowLabel *row = NULL;
- Qualifiers q;
- Tcl_HashEntry *hPtr;
-
- static CONST char *indexName[] = {
- "all", "end", "first", "last", "list", "order", "range", "tag",
- (char *) NULL
- };
- enum indexEnum {
- INDEX_ALL, INDEX_END, INDEX_FIRST, INDEX_LAST, INDEX_LIST, INDEX_ORDER,
- INDEX_RANGE, INDEX_TAG
- } ;
- /* Number of arguments used by indexName[]. */
- static int indexArgs[] = {
- 1, 1, 1, 1, 2, 2, 3, 2
- };
- /* Boolean: can indexName[] be followed by 1 or more qualifiers. */
- static int indexQual[] = {
- 1, 1, 1, 1, 1, 1, 1, 1
- };
-
- static CONST char *modifiers[] = {
- "next", "prev", (char *) NULL
- };
- enum modEnum {
- TMOD_NEXT, TMOD_PREV
- };
- /* Number of arguments used by modifiers[]. */
- static int modArgs[] = {
- 1, 1
- };
- /* Boolean: can modifiers[] be followed by 1 or more qualifiers. */
- static int modQual[] = {
- 1, 1
- };
-
- TreeRowLabelList_Init(tree, rows, 0);
- Qualifiers_Init(tree, &q);
-
- if (Tcl_ListObjGetElements(NULL, objPtr, &objc, &objv) != TCL_OK)
- goto badDesc;
- if (objc == 0)
- goto badDesc;
-
- listIndex = 0;
- elemPtr = objv[listIndex];
- if (Tcl_GetIndexFromObj(NULL, elemPtr, indexName, NULL, 0, &index)
- == TCL_OK) {
- int qualArgsTotal = 0;
-
- if (objc - listIndex < indexArgs[index]) {
- Tcl_AppendResult(interp, "missing arguments to \"",
- Tcl_GetString(elemPtr), "\" keyword", NULL);
- goto errorExit;
- }
- if (indexQual[index]) {
- if (Qualifiers_Scan(&q, objc, objv, listIndex + indexArgs[index],
- &qualArgsTotal) != TCL_OK) {
- goto errorExit;
- }
- }
-
- switch ((enum indexEnum) index) {
- case INDEX_ALL:
- {
- if (qualArgsTotal) {
- row = (RowLabel *) tree->rows;
- while (row != NULL) {
- if (Qualifies(&q, row)) {
- TreeRowLabelList_Append(rows, (TreeRowLabel) row);
- }
- row = row->next;
- }
- row = NULL;
- } else {
- row = (RowLabel *) ROW_ALL;
- }
- break;
- }
- case INDEX_FIRST:
- {
- row = (RowLabel *) tree->rows;
- while (!Qualifies(&q, row))
- row = row->next;
- break;
- }
- case INDEX_END:
- case INDEX_LAST:
- {
- row = (RowLabel *) tree->rowLabelLast;
- while (!Qualifies(&q, row))
- row = row->prev;
- break;
- }
- case INDEX_LIST:
- {
- int listObjc;
- Tcl_Obj **listObjv;
- int i, count;
-
- if (Tcl_ListObjGetElements(interp, objv[listIndex + 1],
- &listObjc, &listObjv) != TCL_OK)
- goto errorExit;
- for (i = 0; i < listObjc; i++) {
- TreeRowLabelList row2s;
- if (TreeRowLabelList_FromObj(tree, listObjv[i], &row2s, flags)
- != TCL_OK)
- goto errorExit;
- TreeRowLabelList_Concat(rows, &row2s);
- TreeRowLabelList_Free(&row2s);
- }
- /* If any of the rowlabel descriptions in the list is "all", then
- * clear the list of rowlabels and use "all". */
- count = TreeRowLabelList_Count(rows);
- for (i = 0; i < count; i++) {
- TreeRowLabel row = TreeRowLabelList_Nth(rows, i);
- if (row == ROW_ALL)
- break;
- }
- if (i < count) {
- TreeRowLabelList_Free(rows);
- row = (RowLabel *) ROW_ALL;
- } else
- row = NULL;
- break;
- }
- case INDEX_ORDER:
- {
- int order;
-
- if (Tcl_GetIntFromObj(NULL, objv[listIndex + 1], &order) != TCL_OK)
- goto errorExit;
- row = (RowLabel *) tree->rows;
- while (row != NULL) {
- if (Qualifies(&q, row))
- if (order-- <= 0)
- break;
- row = row->next;
- }
- break;
- }
- case INDEX_RANGE:
- {
- TreeRowLabel _first, _last;
- RowLabel *first, *last;
-
- if (TreeRowLabel_FromObj(tree, objv[listIndex + 1],
- &_first, RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- goto errorExit;
- first = (RowLabel *) _first;
- if (TreeRowLabel_FromObj(tree, objv[listIndex + 2],
- &_last, RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- goto errorExit;
- last = (RowLabel *) _last;
- if (first->index > last->index) {
- row = first;
- first = last;
- last = row;
- }
- row = first;
- while (1) {
- if (Qualifies(&q, row)) {
- TreeRowLabelList_Append(rows, row);
- }
- if (row == last)
- break;
- row = row->next;
- }
- row = NULL;
- break;
- }
- case INDEX_TAG:
- {
- TagExpr expr;
-
- if (TagExpr_Init(tree, objv[listIndex + 1], &expr) != TCL_OK)
- goto errorExit;
- row = (RowLabel *) tree->rows;
- while (row != NULL) {
- if (TagExpr_Eval(&expr, row->tagInfo) &&
- Qualifies(&q, row)) {
- TreeRowLabelList_Append(rows, (TreeRowLabel) row);
- }
- row = row->next;
- }
- TagExpr_Free(&expr);
- row = NULL;
- break;
- }
- }
- /* If 1 rowlabel, use it and clear the list. */
- if (TreeRowLabelList_Count(rows) == 1) {
- row = (RowLabel *) TreeRowLabelList_Nth(rows, 0);
- rows->count = 0;
-
- }
-
- /* If > 1 rowlabel, no modifiers may follow. */
- if ((TreeRowLabelList_Count(rows) > 1) || (row == (RowLabel *) ROW_ALL)) {
- if (listIndex + indexArgs[index] + qualArgsTotal < objc) {
- FormatResult(interp,
- "unexpected arguments after \"%s\" keyword",
- indexName[index]);
- goto errorExit;
- }
- }
- listIndex += indexArgs[index] + qualArgsTotal;
- } else {
- int gotId = FALSE, id = -1;
-
- if (tree->rowPrefixLen) {
- char *end, *t = Tcl_GetString(elemPtr);
- if (strncmp(t, tree->rowPrefix, tree->rowPrefixLen) == 0)
- {
- t += tree->rowPrefixLen;
- id = strtoul(t, &end, 10);
- if ((end != t) && (*end == '\0'))
- gotId = TRUE;
- }
-
- } else if (Tcl_GetIntFromObj(NULL, elemPtr, &id) == TCL_OK) {
- gotId = TRUE;
- }
- if (gotId) {
- hPtr = Tcl_FindHashEntry(&tree->rowIDHash, (char *) id);
- if (hPtr != NULL) {
- row = (RowLabel *) Tcl_GetHashValue(hPtr);
- }
- listIndex++;
- } else {
- TagExpr expr;
- int qualArgsTotal = 0;
-
- if (objc > 1) {
- if (Qualifiers_Scan(&q, objc, objv, listIndex + 1,
- &qualArgsTotal) != TCL_OK) {
- goto errorExit;
- }
- }
- if (TagExpr_Init(tree, elemPtr, &expr) != TCL_OK)
- goto errorExit;
- row = (RowLabel *) tree->rows;
- while (row != NULL) {
- if (TagExpr_Eval(&expr, row->tagInfo) && Qualifies(&q, row)) {
- TreeRowLabelList_Append(rows, (TreeRowLabel) row);
- }
- row = row->next;
- }
- TagExpr_Free(&expr);
- row = NULL;
-
- /* If 1 rowlabel, use it and clear the list. */
- if (TreeRowLabelList_Count(rows) == 1) {
- row = (RowLabel *) TreeRowLabelList_Nth(rows, 0);
- rows->count = 0;
-
- }
-
- /* If > 1 rowlabel, no modifiers may follow. */
- if (TreeRowLabelList_Count(rows) > 1) {
- if (listIndex + 1 + qualArgsTotal < objc) {
- FormatResult(interp,
- "unexpected arguments after \"%s\"",
- Tcl_GetString(elemPtr));
- goto errorExit;
- }
- }
-
- listIndex += 1 + qualArgsTotal;
- }
- }
-
- /* This means a valid specification was given, but there is no such row */
- if ((TreeRowLabelList_Count(rows) == 0) && (row == NULL)) {
- if (flags & RFO_NOT_NULL)
- goto notNull;
- /* Empty list returned */
- goto goodExit;
- }
-
- for (; listIndex < objc; /* nothing */) {
- int qualArgsTotal = 0;
-
- elemPtr = objv[listIndex];
- if (Tcl_GetIndexFromObj(interp, elemPtr, modifiers, "modifier", 0,
- &index) != TCL_OK)
- return TCL_ERROR;
- if (objc - listIndex < modArgs[index]) {
- Tcl_AppendResult(interp, "missing arguments to \"",
- Tcl_GetString(elemPtr), "\" modifier", NULL);
- goto errorExit;
- }
- if (modQual[index]) {
- Qualifiers_Free(&q);
- Qualifiers_Init(tree, &q);
- if (Qualifiers_Scan(&q, objc, objv, listIndex + modArgs[index],
- &qualArgsTotal) != TCL_OK) {
- goto errorExit;
- }
- }
- switch ((enum modEnum) index) {
- case TMOD_NEXT:
- {
- row = row->next;
- while (!Qualifies(&q, row)) {
- row = row->next;
- }
- break;
- }
- case TMOD_PREV:
- {
- row = row->prev;
- while (!Qualifies(&q, row))
- row = row->prev;
- break;
- }
- }
- if ((TreeRowLabelList_Count(rows) == 0) && (row == NULL)) {
- if (flags & RFO_NOT_NULL)
- goto notNull;
- /* Empty list returned. */
- goto goodExit;
- }
- listIndex += modArgs[index] + qualArgsTotal;
- }
- if ((flags & RFO_NOT_MANY) && ((row == (RowLabel *) ROW_ALL) ||
- (TreeRowLabelList_Count(rows) > 1))) {
- FormatResult(interp, "can't specify > 1 rowlabel for this command");
- goto errorExit;
- }
- if ((flags & RFO_NOT_NULL) && (TreeRowLabelList_Count(rows) == 0) &&
- (row == NULL)) {
-notNull:
- FormatResult(interp, "rowlabel \"%s\" doesn't exist", Tcl_GetString(objPtr));
- goto errorExit;
- }
- if (TreeRowLabelList_Count(rows)) {
- } else if (row == (RowLabel *) ROW_ALL) {
- if ((flags & RFO_NOT_NULL) && (tree->rowCount == 0))
- goto notNull;
- TreeRowLabelList_Append(rows, ROW_ALL);
- } else {
- TreeRowLabelList_Append(rows, (TreeRowLabel) row);
- }
-goodExit:
- Qualifiers_Free(&q);
- return TCL_OK;
-
-badDesc:
- FormatResult(interp, "bad rowlabel description \"%s\"", Tcl_GetString(objPtr));
- goto errorExit;
-
-errorExit:
- Qualifiers_Free(&q);
- TreeRowLabelList_Free(rows);
- return TCL_ERROR;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_FromObj --
- *
- * Parse a Tcl_Obj column description to get a single column.
- *
- * Results:
- * TCL_OK or TCL_ERROR.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TreeRowLabel_FromObj(
- TreeCtrl *tree, /* Widget info. */
- Tcl_Obj *objPtr, /* Object to parse to an item. */
- TreeRowLabel *rowPtr, /* Returned item. */
- int flags /* RFO_xxx flags */
- )
-{
- TreeRowLabelList rows;
-
- if (TreeRowLabelList_FromObj(tree, objPtr, &rows, flags) != TCL_OK)
- return TCL_ERROR;
- /* May be NULL. */
- (*rowPtr) = TreeRowLabelList_Nth(&rows, 0);
- TreeRowLabelList_Free(&rows);
- return TCL_OK;
-}
-
-typedef struct RowForEach RowForEach;
-struct RowForEach {
- TreeCtrl *tree;
- int error;
- int all;
- TreeRowLabel current;
- TreeRowLabelList *list;
- int index;
-};
-
-#define ROW_FOR_EACH(row, rows, iter) \
- for (row = RowForEach_Start(rows, iter); \
- row != NULL; \
- row = RowForEach_Next(iter))
-
-/*
- *----------------------------------------------------------------------
- *
- * RowForEach_Start --
- *
- * Begin iterating over rowlabels.
- *
- * Results:
- * Returns the first item to iterate over. If an error occurs
- * then RowForEach.error is set to 1.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TreeRowLabel
-RowForEach_Start(
- TreeRowLabelList *rows, /* List of rowlabels. */
- RowForEach *iter /* Returned info, pass to
- RowForEach_Next. */
- )
-{
- TreeCtrl *tree = rows->tree;
- TreeRowLabel row;
-
- row = TreeRowLabelList_Nth(rows, 0);
-
- iter->tree = tree;
- iter->all = FALSE;
- iter->error = 0;
- iter->list = NULL;
-
- if (row == ROW_ALL) {
- iter->all = TRUE;
- return iter->current = tree->rows;
- }
-
- iter->list = rows;
- iter->index = 0;
- return iter->current = row;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * RowForEach_Next --
- *
- * Returns the next column to iterate over. Keep calling this until
- * the result is NULL.
- *
- * Results:
- * Returns the next column to iterate over or NULL.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TreeRowLabel
-RowForEach_Next(
- RowForEach *iter /* Initialized by RowForEach_Start. */
- )
-{
- if (iter->all) {
- return iter->current = TreeRowLabel_Next(iter->current);
- }
-
- if (iter->index >= TreeRowLabelList_Count(iter->list))
- return iter->current = NULL;
- return iter->current = TreeRowLabelList_Nth(iter->list, ++iter->index);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_ToObj --
- *
- * Return a Tcl_Obj representing a column.
- *
- * Results:
- * A Tcl_Obj.
- *
- * Side effects:
- * Allocates a Tcl_Obj.
- *
- *----------------------------------------------------------------------
- */
-
-Tcl_Obj *
-TreeRowLabel_ToObj(
- TreeCtrl *tree, /* Widget info. */
- TreeRowLabel row_ /* RowLabel token to get Tcl_Obj for. */
- )
-{
- RowLabel *row = (RowLabel *) row_;
-
- if (tree->rowPrefixLen) {
- char buf[100 + TCL_INTEGER_SPACE];
- (void) sprintf(buf, "%s%d", tree->rowPrefix, row->id);
- return Tcl_NewStringObj(buf, -1);
- }
- return Tcl_NewIntObj(row->id);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tree_FindRow --
- *
- * Get the N'th row in a TreeCtrl.
- *
- * Results:
- * Token for the N'th row.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TreeRowLabel
-Tree_FindRow(
- TreeCtrl *tree, /* Widget info. */
- int rowIndex /* 0-based index of the row to return. */
- )
-{
- RowLabel *row = (RowLabel *) tree->rows;
-
- while (row != NULL) {
- if (row->index == rowIndex)
- break;
- row = row->next;
- }
- return (TreeRowLabel) row;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_Next --
- *
- * Return the row to the right of the given one.
- *
- * Results:
- * Token for the next row.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TreeRowLabel
-TreeRowLabel_Next(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- return (TreeRowLabel) ((RowLabel *) row_)->next;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_OnScreen --
- *
- * Called by display code.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TreeRowLabel_OnScreen(
- TreeRowLabel row_, /* RowLabel token. */
- int onScreen
- )
-{
- RowLabel *row = (RowLabel *) row_;
- TreeCtrl *tree = row->tree;
-
- if (onScreen == row->onScreen)
- return;
- row->onScreen = onScreen;
- if (row->style != NULL)
- TreeStyle_OnScreen(tree, row->style, onScreen);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Row_Config --
- *
- * This procedure is called to process an objc/objv list to set
- * configuration options for a Row.
- *
- * Results:
- * The return value is a standard Tcl result. If TCL_ERROR is
- * returned, then an error message is left in interp's result.
- *
- * Side effects:
- * Configuration information, such as height, span, etc. get set
- * for row; old resources get freed, if there were any. Display
- * changes may occur.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-Row_Config(
- RowLabel *row, /* RowLabel record. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[], /* Argument values. */
- int createFlag /* TRUE if the RowLabel is being created. */
- )
-{
- TreeCtrl *tree = row->tree;
- Tk_SavedOptions savedOptions;
- RowLabel saved;
- int error;
- Tcl_Obj *errorResult = NULL;
- int mask;
- TreeStyle style = NULL; /* master style */
-
- saved.visible = row->visible;
-
- for (error = 0; error <= 1; error++) {
- if (error == 0) {
- if (Tk_SetOptions(tree->interp, (char *) row,
- row->optionTable, objc, objv, tree->tkwin,
- &savedOptions, &mask) != TCL_OK) {
- mask = 0;
- continue;
- }
-
- /* Wouldn't have to do this if Tk_InitOptions() would return
- * a mask of configured options like Tk_SetOptions() does. */
- if (createFlag) {
- if (row->styleObj != NULL)
- mask |= ROW_CONF_STYLE;
- }
-
- /*
- * Step 1: Save old values
- */
-
- /*
- * Step 2: Process new values
- */
-
- if (mask & ROW_CONF_STYLE) {
- if (row->styleObj != NULL) {
- if (TreeStyle_FromObj(tree, row->styleObj, &style) != TCL_OK)
- continue;
- }
- }
-
- /*
- * Step 3: Free saved values
- */
-
- Tk_FreeSavedOptions(&savedOptions);
- break;
- } else {
- errorResult = Tcl_GetObjResult(tree->interp);
- Tcl_IncrRefCount(errorResult);
- Tk_RestoreSavedOptions(&savedOptions);
-
- /* *** */
-
- Tcl_SetObjResult(tree->interp, errorResult);
- Tcl_DecrRefCount(errorResult);
- return TCL_ERROR;
- }
- }
-
- /* Wouldn't have to do this if Tk_InitOptions() would return
- * a mask of configured options like Tk_SetOptions() does. */
- if (createFlag) {
- }
-
- if (mask & ROW_CONF_STYLE) {
- if (style == NULL) {
- if (row->style != NULL) {
- TreeStyle_FreeResources(tree, row->style);
- row->style = NULL;
- mask |= ROW_CONF_WIDTH | ROW_CONF_HEIGHT;
- }
- } else {
- if ((row->style == NULL) || (TreeStyle_GetMaster(tree, row->style) != style)) {
- if (row->style != NULL) {
- TreeStyle_FreeResources(tree, row->style);
- }
- row->style = TreeStyle_NewInstance(tree, style);
- mask |= ROW_CONF_WIDTH | ROW_CONF_HEIGHT;
- }
- }
- }
-
- if (mask & ROW_CONF_HEIGHT) {
- Tree_DInfoChanged(tree, DINFO_REDO_RANGES);
- }
- if (mask & ROW_CONF_WIDTH) {
- tree->neededWidthOfRows = -1; /* requested width of row labels */
- }
- if (mask & (ROW_CONF_WIDTH | ROW_CONF_HEIGHT)) {
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
- }
- if (saved.visible != row->visible)
- Tree_DInfoChanged(tree, DINFO_REDO_RANGES);
-
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Row_Alloc --
- *
- * Allocate and initialize a new RowLabel record.
- *
- * Results:
- * Pointer to the new RowLabel, or NULL if errors occurred.
- *
- * Side effects:
- * Memory is allocated.
- *
- *----------------------------------------------------------------------
- */
-
-static RowLabel *
-Row_Alloc(
- TreeCtrl *tree /* Widget info. */
- )
-{
- RowLabel *row;
- Tcl_HashEntry *hPtr;
- int isNew;
-
- row = (RowLabel *) ckalloc(sizeof(RowLabel));
- memset(row, '\0', sizeof(RowLabel));
- row->tree = tree;
- row->optionTable = Tk_CreateOptionTable(tree->interp, rowSpecs);
- if (Tk_InitOptions(tree->interp, (char *) row, row->optionTable,
- tree->tkwin) != TCL_OK) {
- WFREE(row, RowLabel);
- return NULL;
- }
- row->id = tree->nextRowId++;
- tree->rowCount++;
- hPtr = Tcl_CreateHashEntry(&tree->rowIDHash, (char *) row->id, &isNew);
- Tcl_SetHashValue(hPtr, (char *) row);
-
- return row;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Row_Free --
- *
- * Free a Row.
- *
- * Results:
- * Pointer to the next row.
- *
- * Side effects:
- * Memory is deallocated. If this is the last row being
- * deleted, the TreeCtrl.nextRowId field is reset to zero.
- *
- *----------------------------------------------------------------------
- */
-
-static RowLabel *
-Row_Free(
- RowLabel *row /* RowLabel record. */
- )
-{
- TreeCtrl *tree = row->tree;
- RowLabel *next = row->next;
- Tcl_HashEntry *hPtr;
-
- hPtr = Tcl_FindHashEntry(&tree->rowIDHash, (char *) row->id);
- Tcl_DeleteHashEntry(hPtr);
- if (row->style != NULL)
- TreeStyle_FreeResources(tree, row->style);
- Tk_FreeConfigOptions((char *) row, row->optionTable, tree->tkwin);
- WFREE(row, RowLabel);
- tree->rowCount--;
- if (tree->rowCount == 0)
- tree->nextRowId = 0;
- return next;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_FixedHeight --
- *
- * Return the value of the -height option.
- *
- * Results:
- * The pixel height or -1 if the -height option is unspecified.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TreeRowLabel_FixedHeight(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- RowLabel *row = (RowLabel *) row_;
- return row->heightObj ? row->height : -1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_MinHeight --
- *
- * Return the value of the -minheight option.
- *
- * Results:
- * The pixel height or -1 if the -minheight option is unspecified.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TreeRowLabel_MinHeight(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- RowLabel *row = (RowLabel *) row_;
- return row->minHeightObj ? row->minHeight : -1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_MaxHeight --
- *
- * Return the value of the -maxheight option.
- *
- * Results:
- * The pixel height or -1 if the -maxheight option is unspecified.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TreeRowLabel_MaxHeight(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- RowLabel *row = (RowLabel *) row_;
- return row->maxHeightObj ? row->maxHeight : -1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_NeededWidth --
- *
- * Returns the requested width of a Row.
- *
- * Results:
- * If the RowLabel has a style, the requested width of the style
- * is returned (a positive pixel value). Otherwise 0 is returned.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TreeRowLabel_NeededWidth(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- RowLabel *row = (RowLabel *) row_;
- TreeCtrl *tree = row->tree;
-
- if (row->style != NULL)
- return TreeStyle_NeededWidth(tree, row->style, row->state);
- return 0;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_NeededHeight --
- *
- * Returns the requested height of a Row.
- *
- * Results:
- * If the RowLabel has a style, the requested height of the style
- * is returned (a positive pixel value). Otherwise 0 is returned.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TreeRowLabel_NeededHeight(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- RowLabel *row = (RowLabel *) row_;
- TreeCtrl *tree = row->tree;
-
- if (row->style != NULL)
- return TreeStyle_NeededHeight(tree, row->style, row->state);
- return 0;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_Visible --
- *
- * Return the value of the -visible config option for a row.
- *
- * Results:
- * Boolean value.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TreeRowLabel_Visible(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- return ((RowLabel *) row_)->visible;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_GetID --
- *
- * Return the unique identifier for a row.
- *
- * Results:
- * Unique integer id.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int TreeRowLabel_GetID(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- return ((RowLabel *) row_)->id;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_GetStyle --
- *
- * Returns the style assigned to a Row.
- *
- * Results:
- * Returns the style, or NULL.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TreeStyle TreeRowLabel_GetStyle(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- return ((RowLabel *) row_)->style;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_ForgetStyle --
- *
- * Free the style assigned to a Row.
- *
- * Results:
- * RowLabel has no style assigned anymore.
- *
- * Side effects:
- * Memory is freed.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TreeRowLabel_ForgetStyle(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- RowLabel *row = (RowLabel *) row_;
- TreeCtrl *tree = row->tree;
-
- if (row->style != NULL) {
- TreeStyle_FreeResources(tree, row->style);
- Tcl_DecrRefCount(row->styleObj);
- row->styleObj = NULL;
- row->style = NULL;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_Index --
- *
- * Return the 0-based index for a row.
- *
- * Results:
- * Position of the row in the list of rows.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TreeRowLabel_Index(
- TreeRowLabel row_ /* RowLabel token. */
- )
-{
- return ((RowLabel *) row_)->index;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * NoStyleMsg --
- *
- * Utility to set the interpreter result with a message indicating
- * a RowLabel has no assigned style.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Interpreter result is changed.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-NoStyleMsg(
- RowLabel *row /* RowLabel record. */
- )
-{
- TreeCtrl *tree = row->tree;
-
- FormatResult(tree->interp, "rowlabel %s%d has no style",
- tree->rowPrefix, row->id);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * RowElementCmd --
- *
- * This procedure is invoked to process the [rowlabel element] widget
- * command. See the user documentation for details on what
- * it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-RowElementCmd(
- ClientData clientData, /* Widget info. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[] /* Argument values. */
- )
-{
- TreeCtrl *tree = (TreeCtrl *) clientData;
- static CONST char *commandNames[] = { "cget", "configure", "perstate",
- (char *) NULL };
- enum { COMMAND_CGET, COMMAND_CONFIGURE, COMMAND_PERSTATE };
- int index;
- TreeRowLabelList rows;
- TreeRowLabel row_;
- RowLabel *row;
- RowForEach iter;
-
- if (objc < 6) {
- Tcl_WrongNumArgs(interp, 3, objv, "command row element ?arg ...?");
- return TCL_ERROR;
- }
-
- if (Tcl_GetIndexFromObj(interp, objv[3], commandNames, "command", 0,
- &index) != TCL_OK)
- return TCL_ERROR;
-
- switch (index) {
- /* T rowlabel element perstate R E option ?stateList? */
- case COMMAND_PERSTATE:
- {
- int state;
-
- if (objc < 7 || objc > 8) {
- Tcl_WrongNumArgs(tree->interp, 4, objv,
- "row element option ?stateList?");
- return TCL_ERROR;
- }
- if (TreeRowLabel_FromObj(tree, objv[4], &row_,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- row = (RowLabel *) row_;
- if (row->style == NULL) {
- NoStyleMsg(row);
- return TCL_ERROR;
- }
- state = row->state;
- if (objc == 8) {
- int states[3];
-
- if (Tree_StateFromListObj(tree, objv[7], states,
- SFO_NOT_OFF | SFO_NOT_TOGGLE) != TCL_OK) {
- return TCL_ERROR;
- }
- state = states[STATE_OP_ON];
- }
- return TreeStyle_ElementActual(tree, row->style,
- state, objv[6], objv[7]);
- }
-
- /* T rowlabel element cget R E option */
- case COMMAND_CGET:
- {
- if (objc != 7) {
- Tcl_WrongNumArgs(tree->interp, 4, objv,
- "row element option");
- return TCL_ERROR;
- }
- if (TreeRowLabel_FromObj(tree, objv[4], &row_,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- row = (RowLabel *) row_;
- if (row->style == NULL) {
- NoStyleMsg(row);
- return TCL_ERROR;
- }
- return TreeStyle_ElementCget(tree, (TreeItem) NULL,
- (TreeItemColumn) NULL, row_, row->style, objv[5], objv[6]);
- }
-
- /* T rowlabel element configure R E ... */
- case COMMAND_CONFIGURE:
- {
- int result = TCL_OK;
-
- if (TreeRowLabelList_FromObj(tree, objv[4], &rows,
- RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
-
- ROW_FOR_EACH(row_, &rows, &iter) {
- row = (RowLabel *) row_;
-
- /* T row element configure R E option value \
- * + E option value + ... */
- int eMask, rMask = 0;
- int indexElem = 5;
-
- while (1) {
- int numArgs = 0;
- char breakChar = '\0';
-
- /* Look for a + */
- for (index = indexElem + 1; index < objc; index++) {
- if (numArgs % 2 == 0) {
- int length;
- char *s = Tcl_GetStringFromObj(objv[index], &length);
-
- if ((length == 1) && (s[0] == '+')) {
- breakChar = s[0];
- break;
- }
- }
- numArgs++;
- }
-
- /* Require at least one option-value pair if more than one
- * element is specified. */
- if ((breakChar || indexElem != 5) && (numArgs < 2)) {
- FormatResult(interp,
- "missing option-value pair after element \"%s\"",
- Tcl_GetString(objv[indexElem]));
- result = TCL_ERROR;
- break;
- }
-
- result = TreeStyle_ElementConfigure(tree, (TreeItem) NULL,
- (TreeItemColumn) NULL, row_, row->style, objv[indexElem],
- numArgs, (Tcl_Obj **) objv + indexElem + 1, &eMask);
- if (result != TCL_OK)
- break;
-
- rMask |= eMask;
-
- if (breakChar) {
-
- if (index == objc - 1) {
- FormatResult(interp, "missing %s after \"%c\"",
- (breakChar == '+') ? "element name" : "column",
- breakChar);
- result = TCL_ERROR;
- break;
- }
-
- /* + indicates start of another element */
- if (breakChar == '+') {
- indexElem = index + 1;
- }
-
- } else if (index == objc)
- break;
- }
- if (rMask & CS_LAYOUT) {
- tree->neededWidthOfRows = -1;
- }
- if (rMask & CS_DISPLAY)
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
- if (result != TCL_OK)
- break;
- }
- TreeRowLabelList_Free(&rows);
- return result;
- }
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Row_ChangeState --
- *
- * Toggles zero or more STATE_xxx flags for a Row.
- *
- * Results:
- * Bit mask of CS_LAYOUT and CS_DISPLAY flags, or zero if no
- * changes occurred.
- *
- * Side effects:
- * Display changes.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-Row_ChangeState(
- RowLabel *row, /* RowLabel info. */
- int stateOff, /* STATE_xxx flags to turn off. */
- int stateOn /* STATE_xxx flags to turn on. */
- )
-{
- TreeCtrl *tree = row->tree;
- int state;
- int sMask = 0;
-
- state = row->state;
- state &= ~stateOff;
- state |= stateOn;
-
- if (state == row->state)
- return 0;
-
- if (row->style != NULL) {
- sMask = TreeStyle_ChangeState(tree, row->style, row->state, state);
- if (sMask & CS_LAYOUT) {
- tree->neededWidthOfRows = -1;
- }
- if (sMask & CS_DISPLAY)
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
- }
-
- row->state = state;
- return sMask;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * RowStateCmd --
- *
- * This procedure is invoked to process the [row state] widget
- * command. See the user documentation for details on what
- * it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-RowStateCmd(
- ClientData clientData, /* Widget info. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[] /* Argument values. */
- )
-{
- TreeCtrl *tree = (TreeCtrl *) clientData;
- static CONST char *commandNames[] = {
- "get", "set", (char *) NULL
- };
- enum {
- COMMAND_GET, COMMAND_SET
- };
- int index;
- TreeRowLabelList rows;
- TreeRowLabel row_;
- RowLabel *row;
- RowForEach iter;
-
- if (objc < 5) {
- Tcl_WrongNumArgs(interp, 3, objv, "command rowlabel ?arg ...?");
- return TCL_ERROR;
- }
-
- if (Tcl_GetIndexFromObj(interp, objv[3], commandNames, "command", 0,
- &index) != TCL_OK)
- return TCL_ERROR;
-
- switch (index) {
-
- /* T row state get R ?state? */
- case COMMAND_GET:
- {
- Tcl_Obj *listObj;
- int i, states[3];
-
- if (objc > 6) {
- Tcl_WrongNumArgs(interp, 5, objv, "?state?");
- return TCL_ERROR;
- }
- if (TreeRowLabel_FromObj(tree, objv[4], &row_,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- row = (RowLabel *) row_;
- if (objc == 6) {
- states[STATE_OP_ON] = 0;
- if (Tree_StateFromObj(tree, objv[5], states, NULL,
- SFO_NOT_OFF | SFO_NOT_TOGGLE) != TCL_OK)
- return TCL_ERROR;
- Tcl_SetObjResult(interp,
- Tcl_NewBooleanObj((row->state & states[STATE_OP_ON]) != 0));
- break;
- }
- listObj = Tcl_NewListObj(0, NULL);
- for (i = 0; i < 32; i++) {
- if (tree->stateNames[i] == NULL)
- continue;
- if (row->state & (1L << i)) {
- Tcl_ListObjAppendElement(interp, listObj,
- Tcl_NewStringObj(tree->stateNames[i], -1));
- }
- }
- Tcl_SetObjResult(interp, listObj);
- break;
- }
-
- /* T row state set R {state ...} */
- case COMMAND_SET:
- {
- int states[3], stateOn, stateOff;
-
- if (objc != 6) {
- Tcl_WrongNumArgs(interp, 5, objv, "stateList");
- return TCL_ERROR;
- }
- if (TreeRowLabelList_FromObj(tree, objv[4], &rows,
- RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- if (Tree_StateFromListObj(tree, objv[5], states,
- SFO_NOT_STATIC) != TCL_OK) {
- TreeRowLabelList_Free(&rows);
- return TCL_ERROR;
- }
- if (states[0] || states[1] || states[2]) {
- ROW_FOR_EACH(row_, &rows, &iter) {
- row = (RowLabel *) row_;
- stateOn = states[STATE_OP_ON];
- stateOff = states[STATE_OP_OFF];
- stateOn |= ~row->state & states[STATE_OP_TOGGLE];
- stateOff |= row->state & states[STATE_OP_TOGGLE];
- Row_ChangeState(row, stateOff, stateOn);
- }
- }
- TreeRowLabelList_Free(&rows);
- return TCL_OK;
- }
- }
-
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * RowTagCmd --
- *
- * This procedure is invoked to process the [rowlabel tag] widget
- * command. See the user documentation for details on what
- * it does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-RowTagCmd(
- ClientData clientData, /* Widget info. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[] /* Argument values. */
- )
-{
- TreeCtrl *tree = (TreeCtrl *) clientData;
- static CONST char *commandNames[] = {
- "add", "expr", "names", "remove", (char *) NULL
- };
- enum {
- COMMAND_ADD, COMMAND_EXPR, COMMAND_NAMES, COMMAND_REMOVE
- };
- int index;
- RowForEach iter;
- TreeRowLabelList rows;
- TreeRowLabel _row;
- RowLabel *row;
- int result = TCL_OK;
-
- if (objc < 4)
- {
- Tcl_WrongNumArgs(interp, 3, objv, "command ?arg arg ...?");
- return TCL_ERROR;
- }
-
- if (Tcl_GetIndexFromObj(interp, objv[3], commandNames, "command", 0,
- &index) != TCL_OK)
- {
- return TCL_ERROR;
- }
-
- switch (index)
- {
- /* T rowlabel tag add R tagList */
- case COMMAND_ADD:
- {
- int i, numTags;
- Tcl_Obj **listObjv;
- Tk_Uid staticTags[STATIC_SIZE], *tags = staticTags;
-
- if (objc != 6)
- {
- Tcl_WrongNumArgs(interp, 4, objv, "rowlabel tagList");
- return TCL_ERROR;
- }
- if (TreeRowLabelList_FromObj(tree, objv[4], &rows, 0) != TCL_OK) {
- return TCL_ERROR;
- }
- if (Tcl_ListObjGetElements(interp, objv[5], &numTags, &listObjv) != TCL_OK) {
- result = TCL_ERROR;
- break;
- }
- STATIC_ALLOC(tags, Tk_Uid, numTags);
- for (i = 0; i < numTags; i++) {
- tags[i] = Tk_GetUid(Tcl_GetString(listObjv[i]));
- }
- ROW_FOR_EACH(_row, &rows, &iter) {
- row = (RowLabel *) _row;
- row->tagInfo = TagInfo_Add(tree, row->tagInfo, tags, numTags);
- }
- STATIC_FREE(tags, Tk_Uid, numTags);
- break;
- }
-
- /* T rowlabel tag expr R tagExpr */
- case COMMAND_EXPR:
- {
- TagExpr expr;
- int ok = TRUE;
-
- if (objc != 6)
- {
- Tcl_WrongNumArgs(interp, 4, objv, "rowlabel tagExpr");
- return TCL_ERROR;
- }
- if (TreeRowLabelList_FromObj(tree, objv[4], &rows, 0) != TCL_OK) {
- return TCL_ERROR;
- }
- if (TagExpr_Init(tree, objv[5], &expr) != TCL_OK) {
- result = TCL_ERROR;
- break;
- }
- ROW_FOR_EACH(_row, &rows, &iter) {
- row = (RowLabel *) _row;
- if (!TagExpr_Eval(&expr, row->tagInfo)) {
- ok = FALSE;
- break;
- }
- }
- TagExpr_Free(&expr);
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(ok));
- break;
- }
-
- /* T rowlabel tag names R */
- case COMMAND_NAMES:
- {
- Tcl_Obj *listObj;
- Tk_Uid *tags = NULL;
- int i, tagSpace, numTags = 0;
-
- if (objc != 5)
- {
- Tcl_WrongNumArgs(interp, 4, objv, "rowlabel");
- return TCL_ERROR;
- }
- if (TreeRowLabelList_FromObj(tree, objv[4], &rows, 0) != TCL_OK) {
- return TCL_ERROR;
- }
- ROW_FOR_EACH(_row, &rows, &iter) {
- row = (RowLabel *) _row;
- tags = TagInfo_Names(tree, row->tagInfo, tags, &numTags, &tagSpace);
- }
- if (numTags) {
- listObj = Tcl_NewListObj(0, NULL);
- for (i = 0; i < numTags; i++) {
- Tcl_ListObjAppendElement(NULL, listObj,
- Tcl_NewStringObj((char *) tags[i], -1));
- }
- Tcl_SetObjResult(interp, listObj);
- ckfree((char *) tags);
- }
- break;
- }
-
- /* T rowlabel tag remove R tagList */
- case COMMAND_REMOVE:
- {
- int i, numTags;
- Tcl_Obj **listObjv;
- Tk_Uid staticTags[STATIC_SIZE], *tags = staticTags;
-
- if (objc != 6)
- {
- Tcl_WrongNumArgs(interp, 4, objv, "rowlabel tagList");
- return TCL_ERROR;
- }
- if (TreeRowLabelList_FromObj(tree, objv[4], &rows, 0) != TCL_OK) {
- return TCL_ERROR;
- }
- if (Tcl_ListObjGetElements(interp, objv[5], &numTags, &listObjv) != TCL_OK) {
- result = TCL_ERROR;
- break;
- }
- STATIC_ALLOC(tags, Tk_Uid, numTags);
- for (i = 0; i < numTags; i++) {
- tags[i] = Tk_GetUid(Tcl_GetString(listObjv[i]));
- }
- ROW_FOR_EACH(_row, &rows, &iter) {
- row = (RowLabel *) _row;
- row->tagInfo = TagInfo_Remove(tree, row->tagInfo, tags, numTags);
- }
- STATIC_FREE(tags, Tk_Uid, numTags);
- break;
- }
- }
-
- TreeRowLabelList_Free(&rows);
- return result;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowCmd --
- *
- * This procedure is invoked to process the [row] widget
- * command. See the user documentation for details on what it
- * does.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * See the user documentation.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TreeRowLabelCmd(
- ClientData clientData, /* Widget info. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[] /* Argument values. */
- )
-{
- TreeCtrl *tree = (TreeCtrl *) clientData;
- static CONST char *commandNames[] = {
- "bbox", "cget", "compare", "configure", "count", "create", "delete",
- "dragcget", "dragconfigure", "element", "id", "image", "list", "move",
- "neededheight", "order", "state", "tag", "text", "width", (char *) NULL
- };
- enum {
- COMMAND_BBOX, COMMAND_CGET, COMMAND_COMPARE, COMMAND_CONFIGURE,
- COMMAND_COUNT, COMMAND_CREATE, COMMAND_DELETE, COMMAND_DRAGCGET,
- COMMAND_DRAGCONF, COMMAND_ELEMENT, COMMAND_ID, COMMAND_IMAGE,
- COMMAND_LIST, COMMAND_MOVE, COMMAND_NHEIGHT, COMMAND_ORDER,
- COMMAND_STATE, COMMAND_TAG, COMMAND_TEXT, COMMAND_WIDTH
- };
- int index;
- TreeRowLabelList rows;
- TreeRowLabel _row;
- RowLabel *row;
- RowForEach iter;
-
- if (objc < 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "command ?arg arg ...?");
- return TCL_ERROR;
- }
-
- if (Tcl_GetIndexFromObj(interp, objv[2], commandNames, "command", 0,
- &index) != TCL_OK) {
- return TCL_ERROR;
- }
-
- switch (index) {
- case COMMAND_BBOX:
- {
- int x, y, w, h;
-
- if (objc != 4) {
- Tcl_WrongNumArgs(interp, 3, objv, "rowlabel");
- return TCL_ERROR;
- }
- if (TreeRowLabel_FromObj(tree, objv[3], &_row,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- if (Tree_RowLabelBbox(tree, _row, &x, &y, &w, &h) < 0)
- break;
- x -= tree->xOrigin;
- y -= tree->yOrigin;
- FormatResult(interp, "%d %d %d %d", x, y, x + w, y + h);
- break;
- }
-
- case COMMAND_CGET:
- {
- TreeRowLabel row;
- Tcl_Obj *resultObjPtr;
-
- if (objc != 5) {
- Tcl_WrongNumArgs(interp, 3, objv, "rowlabel option");
- return TCL_ERROR;
- }
- if (TreeRowLabel_FromObj(tree, objv[3], &row,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- resultObjPtr = Tk_GetOptionValue(interp, (char *) row,
- ((RowLabel *) row)->optionTable, objv[4], tree->tkwin);
- if (resultObjPtr == NULL)
- return TCL_ERROR;
- Tcl_SetObjResult(interp, resultObjPtr);
- break;
- }
-
- /* T row compare C op C */
- case COMMAND_COMPARE:
- {
- TreeRowLabel row1, row2;
- static CONST char *opName[] = { "<", "<=", "==", ">=", ">", "!=", NULL };
- int op, compare = 0, index1, index2;
-
- if (objc != 6) {
- Tcl_WrongNumArgs(interp, 3, objv, "rowlabel1 op rowlabel2");
- return TCL_ERROR;
- }
- if (TreeRowLabel_FromObj(tree, objv[3], &row1,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- if (Tcl_GetIndexFromObj(interp, objv[4], opName,
- "comparison operator", 0, &op) != TCL_OK)
- return TCL_ERROR;
- if (TreeRowLabel_FromObj(tree, objv[5], &row2,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- index1 = TreeRowLabel_Index(row1);
- index2 = TreeRowLabel_Index(row2);
- switch (op) {
- case 0: compare = index1 < index2; break;
- case 1: compare = index1 <= index2; break;
- case 2: compare = index1 == index2; break;
- case 3: compare = index1 >= index2; break;
- case 4: compare = index1 > index2; break;
- case 5: compare = index1 != index2; break;
- }
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(compare));
- break;
- }
-
- /* T rowlabel configure R ?option? ?value? ?option value ...? */
- case COMMAND_CONFIGURE:
- {
- int result = TCL_OK;
-
- if (objc < 4) {
- Tcl_WrongNumArgs(interp, 3, objv, "rowlabel ?option? ?value? ?option value ...?");
- return TCL_ERROR;
- }
- if (objc <= 5) {
- Tcl_Obj *resultObjPtr;
- if (TreeRowLabel_FromObj(tree, objv[3], &_row,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- row = (RowLabel *) _row;
- resultObjPtr = Tk_GetOptionInfo(interp, (char *) row,
- row->optionTable,
- (objc == 4) ? (Tcl_Obj *) NULL : objv[4],
- tree->tkwin);
- if (resultObjPtr == NULL)
- return TCL_ERROR;
- Tcl_SetObjResult(interp, resultObjPtr);
- break;
- }
- if (TreeRowLabelList_FromObj(tree, objv[3], &rows,
- RFO_NOT_NULL) != TCL_OK) {
- return TCL_ERROR;
- }
- ROW_FOR_EACH(_row, &rows, &iter) {
- if (Row_Config((RowLabel *) _row, objc - 4, objv + 4, FALSE)
- != TCL_OK) {
- result = TCL_ERROR;
- break;
- };
- }
- TreeRowLabelList_Free(&rows);
- return result;
- }
-
- case COMMAND_CREATE:
- {
- RowLabel *row, *last = (RowLabel *) tree->rowLabelLast;
-
- /* FIXME: -count N -tags $tags */
- row = Row_Alloc(tree);
- if (Row_Config(row, objc - 3, objv + 3, TRUE) != TCL_OK)
- {
- Row_Free(row);
- return TCL_ERROR;
- }
-
- if (tree->rows == NULL) {
- row->index = 0;
- tree->rows = (TreeRowLabel) row;
- } else {
- last->next = row;
- row->prev = last;
- row->index = last->index + 1;
- }
- tree->rowLabelLast = (TreeRowLabel) row;
-
- tree->neededWidthOfRows = -1;
- Tree_DInfoChanged(tree, DINFO_REDO_RANGES);
- Tcl_SetObjResult(interp, TreeRowLabel_ToObj(tree, (TreeRowLabel) row));
- break;
- }
-
- case COMMAND_DELETE:
- {
- RowLabel *prev, *next;
-
- if (objc != 4) {
- Tcl_WrongNumArgs(interp, 3, objv, "rowlabel");
- return TCL_ERROR;
- }
- if (TreeRowLabelList_FromObj(tree, objv[3], &rows, 0) != TCL_OK)
- return TCL_ERROR;
- ROW_FOR_EACH(_row, &rows, &iter) {
- if (iter.all) {
- row = (RowLabel *) tree->rows;
- while (row != NULL) {
- row = Row_Free(row);
- }
- tree->rows = NULL;
- tree->rowLabelLast = NULL;
- tree->rowDrag.row = tree->rowDrag.indRow = NULL;
- tree->neededWidthOfRows = -1;
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
- break;
- }
- row = (RowLabel *) _row;
-
- if (row == (RowLabel *) tree->rowDrag.row)
- tree->rowDrag.row = NULL;
- if (row == (RowLabel *) tree->rowDrag.indRow)
- tree->rowDrag.indRow = NULL;
-
- prev = row->prev;
- next = row->next;
- if (prev != NULL)
- prev->next = next;
- if (next != NULL)
- next->prev = prev;
- if (prev == NULL)
- tree->rows = (TreeRowLabel) next;
- if (next == NULL)
- tree->rowLabelLast = (TreeRowLabel) prev;
- (void) Row_Free(row);
- }
- TreeRowLabelList_Free(&rows);
-
- /* Renumber rows */
- index = 0;
- row = (RowLabel *) tree->rows;
- while (row != NULL) {
- row->index = index++;
- row = row->next;
- }
-
- tree->neededWidthOfRows = -1;
- Tree_DInfoChanged(tree, DINFO_REDO_RANGES);
- break;
- }
-
- /* T rowlabel dragcget option */
- case COMMAND_DRAGCGET:
- {
- Tcl_Obj *resultObjPtr;
-
- if (objc != 4) {
- Tcl_WrongNumArgs(interp, 3, objv, "option");
- return TCL_ERROR;
- }
- resultObjPtr = Tk_GetOptionValue(interp, (char *) tree,
- tree->rowDrag.optionTable, objv[3], tree->tkwin);
- if (resultObjPtr == NULL)
- return TCL_ERROR;
- Tcl_SetObjResult(interp, resultObjPtr);
- break;
- }
-
- /* T rowlabel dragconfigure ?option? ?value? ?option value ...? */
- case COMMAND_DRAGCONF:
- {
- Tcl_Obj *resultObjPtr;
- Tk_SavedOptions savedOptions;
- int mask, result;
-
- if (objc < 3) {
- Tcl_WrongNumArgs(interp, 3, objv, "?option? ?value?");
- return TCL_ERROR;
- }
- if (objc <= 4) {
- resultObjPtr = Tk_GetOptionInfo(interp, (char *) tree,
- tree->rowDrag.optionTable,
- (objc == 3) ? (Tcl_Obj *) NULL : objv[3],
- tree->tkwin);
- if (resultObjPtr == NULL)
- return TCL_ERROR;
- Tcl_SetObjResult(interp, resultObjPtr);
- break;
- }
- result = Tk_SetOptions(interp, (char *) tree,
- tree->rowDrag.optionTable, objc - 3, objv + 3, tree->tkwin,
- &savedOptions, &mask);
- if (result != TCL_OK) {
- Tk_RestoreSavedOptions(&savedOptions);
- return TCL_ERROR;
- }
- Tk_FreeSavedOptions(&savedOptions);
-
- if (tree->rowDrag.alpha < 0)
- tree->rowDrag.alpha = 0;
- if (tree->rowDrag.alpha > 255)
- tree->rowDrag.alpha = 255;
-
- Tree_DInfoChanged(tree, DINFO_DRAW_HEADER);
- break;
- }
-
- case COMMAND_COUNT:
- {
- if (objc != 3) {
- Tcl_WrongNumArgs(interp, 2, objv, (char *) NULL);
- return TCL_ERROR;
- }
- Tcl_SetObjResult(interp, Tcl_NewIntObj(tree->rowCount));
- break;
- }
-
- case COMMAND_ELEMENT:
- {
- return RowElementCmd(clientData, interp, objc, objv);
- }
-
- case COMMAND_ID:
- {
- Tcl_Obj *listObj;
-
- if (objc != 4) {
- Tcl_WrongNumArgs(interp, 3, objv, "rowlabel");
- return TCL_ERROR;
- }
- if (TreeRowLabelList_FromObj(tree, objv[3], &rows, 0) != TCL_OK)
- return TCL_ERROR;
- listObj = Tcl_NewListObj(0, NULL);
- ROW_FOR_EACH(_row, &rows, &iter) {
- Tcl_ListObjAppendElement(interp, listObj,
- TreeRowLabel_ToObj(tree, _row));
- }
- TreeRowLabelList_Free(&rows);
- Tcl_SetObjResult(interp, listObj);
- break;
- }
-
- /* T rowlabel list ?-visible? */
- case COMMAND_LIST:
- {
- RowLabel *row = (RowLabel *) tree->rows;
- Tcl_Obj *listObj;
- int visible = FALSE;
-
- if (objc > 4) {
- Tcl_WrongNumArgs(interp, 3, objv, "?-visible?");
- return TCL_ERROR;
- }
- if (objc == 4) {
- int len;
- char *s = Tcl_GetStringFromObj(objv[3], &len);
- if ((s[0] == '-') && (strncmp(s, "-visible", len) == 0))
- visible = TRUE;
- else {
- FormatResult(interp, "bad switch \"%s\": must be -visible",
- s);
- return TCL_ERROR;
- }
- }
- listObj = Tcl_NewListObj(0, NULL);
- while (row != NULL) {
- if (!visible || row->visible)
- Tcl_ListObjAppendElement(interp, listObj,
- TreeRowLabel_ToObj(tree, (TreeRowLabel) row));
- row = row->next;
- }
- Tcl_SetObjResult(interp, listObj);
- break;
- }
-
- /* T rowlabel move R before */
- case COMMAND_MOVE:
- {
- TreeRowLabel _move, _before;
- RowLabel *move, *before, *prev, *next, *last, *rowAfterLast = NULL;
-
- if (objc != 5) {
- Tcl_WrongNumArgs(interp, 3, objv, "rowlabel before");
- return TCL_ERROR;
- }
- if (TreeRowLabel_FromObj(tree, objv[3], &_move,
- RFO_NOT_MANY | RFO_NOT_NULL ) != TCL_OK)
- return TCL_ERROR;
- move = (RowLabel *) _move;
- if (TreeRowLabel_FromObj(tree, objv[4], &_before,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- before = (RowLabel *) _before;
- if (move == before)
- break;
- if (move->index == before->index - 1)
- break;
-
- /* Unlink. */
- prev = move->prev;
- next = move->next;
- if (prev == NULL)
- tree->rows = (TreeRowLabel) next;
- else
- prev->next = next;
- if (next == NULL)
- tree->rowLabelLast = (TreeRowLabel) prev;
- else
- next->prev = prev;
-
- /* Link. */
- if (before == rowAfterLast) { /* FIXME */
- last = (RowLabel *) tree->rowLabelLast;
- last->next = move;
- move->prev = last;
- move->next = NULL;
- tree->rowLabelLast = (TreeRowLabel) move;
- } else {
- prev = before->prev;
- if (prev == NULL)
- tree->rows = (TreeRowLabel) move;
- else
- prev->next = move;
- before->prev = move;
- move->prev = prev;
- move->next = before;
- }
-
- /* Renumber rows */
- index = 0;
- row = (RowLabel *) tree->rows;
- while (row != NULL) {
- row->index = index++;
- row = row->next;
- }
-
- if (move->visible) {
- Tree_DInfoChanged(tree, DINFO_REDO_RANGES);
- }
- break;
- }
-
- case COMMAND_NHEIGHT:
- {
- TreeRowLabel _row;
-
- if (objc != 4) {
- Tcl_WrongNumArgs(interp, 3, objv, "rowlabel");
- return TCL_ERROR;
- }
- if (TreeRowLabel_FromObj(tree, objv[3], &_row,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
-
- Tcl_SetObjResult(interp, Tcl_NewIntObj(TreeRowLabel_NeededHeight(_row)));
- break;
- }
-
- /* T rowlabel order R ?-visible? */
- case COMMAND_ORDER:
- {
- int visible = FALSE;
- int index = 0;
-
- if (objc < 4 || objc > 5) {
- Tcl_WrongNumArgs(interp, 3, objv, "rowlabel ?-visible?");
- return TCL_ERROR;
- }
- if (objc == 5) {
- int len;
- char *s = Tcl_GetStringFromObj(objv[4], &len);
- if ((s[0] == '-') && (strncmp(s, "-visible", len) == 0))
- visible = TRUE;
- else {
- FormatResult(interp, "bad switch \"%s\": must be -visible",
- s);
- return TCL_ERROR;
- }
- }
- if (TreeRowLabel_FromObj(tree, objv[3], &_row,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- row = (RowLabel *) _row;
- if (visible) {
- RowLabel *walk = (RowLabel *) tree->rows;
- while (walk != NULL) {
- if (walk == row)
- break;
- if (walk->visible)
- index++;
- walk = walk->next;
- }
- if (!row->visible)
- index = -1;
- } else {
- index = row->index;
- }
- Tcl_SetObjResult(interp, Tcl_NewIntObj(index));
- break;
- }
-
- case COMMAND_STATE:
- {
- return RowStateCmd(clientData, interp, objc, objv);
- }
-
- case COMMAND_TAG:
- {
- return RowTagCmd(clientData, interp, objc, objv);
- }
-
- /* T row image R ?image? */
- case COMMAND_IMAGE:
- /* T row text R ?text? */
- case COMMAND_TEXT:
- {
- Tcl_Obj *objPtr;
- int isImage = (index == COMMAND_IMAGE);
- int result = TCL_OK;
-
- if (objc < 4 || objc > 5) {
- Tcl_WrongNumArgs(interp, 3, objv,
- isImage ? "rowlabel ?image?" : "rowlabel ?text?");
- return TCL_ERROR;
- }
- if (objc == 4) {
- if (TreeRowLabel_FromObj(tree, objv[3], &_row,
- RFO_NOT_MANY | RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- row = (RowLabel *) _row;
- if (row->style == NULL) {
- NoStyleMsg(row);
- return TCL_ERROR;
- }
- objPtr = isImage ?
- TreeStyle_GetImage(tree, row->style) :
- TreeStyle_GetText(tree, row->style);
- if (objPtr != NULL)
- Tcl_SetObjResult(interp, objPtr);
- break;
- }
- if (TreeRowLabelList_FromObj(tree, objv[3], &rows,
- RFO_NOT_NULL) != TCL_OK)
- return TCL_ERROR;
- ROW_FOR_EACH(_row, &rows, &iter) {
- row = (RowLabel *) _row;
- result = isImage ?
- TreeStyle_SetImage(tree, (TreeItem) NULL,
- (TreeItemColumn) NULL, _row, row->style, objv[4]) :
- TreeStyle_SetText(tree, (TreeItem) NULL,
- (TreeItemColumn) NULL, _row, row->style, objv[4]);
- if (result != TCL_OK)
- break;
- }
- TreeRowLabelList_Free(&rows);
- tree->neededWidthOfRows = -1;
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
- return result;
- }
-
- case COMMAND_WIDTH:
- {
- if (objc != 3) {
- Tcl_WrongNumArgs(interp, 3, objv, NULL);
- return TCL_ERROR;
- }
- Tcl_SetObjResult(interp, Tcl_NewIntObj(Tree_WidthOfRowLabels(tree)));
- break;
- }
- }
-
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_Draw --
- *
- * Draw a row label.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Stuff is drawn in a drawable.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TreeRowLabel_Draw(
- TreeRowLabel row_, /* RowLabel record. */
- int x, int y, /* Drawable coordinates of the row. */
- int width, int height, /* Total size of the row. */
- Drawable drawable /* Where to draw. */
- )
-{
- RowLabel *row = (RowLabel *) row_;
- TreeCtrl *tree = row->tree;
- StyleDrawArgs drawArgs;
-
- if (row->style == NULL)
- return;
-
- drawArgs.tree = tree;
- drawArgs.drawable = drawable;
- drawArgs.state = row->state;
- drawArgs.style = row->style;
- drawArgs.indent = 0;
- drawArgs.x = x;
- drawArgs.y = y;
- drawArgs.width = width;
- drawArgs.height = height;
- drawArgs.justify = TK_JUSTIFY_LEFT;
- TreeStyle_Draw(&drawArgs);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TreeRowLabel_Identify --
- *
- * Determine which element the given point is in.
- * This is used by the [identify] widget command.
- *
- * Results:
- * If the RowLabel is not visible or no Rows are visible
- * then buf[] is untouched. Otherwise the given string may be
- * appended with "elem E".
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TreeRowLabel_Identify(
- TreeRowLabel row_, /* RowLabel token. */
- int x, int y, /* RowLabel coords to hit-test with. */
- char *buf /* NULL-terminated string which may be
- * appended. */
- )
-{
- RowLabel *row = (RowLabel *) row_;
- TreeCtrl *tree = row->tree;
- int left, top, width, height;
- StyleDrawArgs drawArgs;
- char *elem;
-
- if (row->style == NULL)
- return;
-
- if (Tree_RowLabelBbox(tree, row_, &left, &top, &width, &height) < 0)
- return;
- drawArgs.tree = tree;
- drawArgs.drawable = None;
- drawArgs.state = row->state;
- drawArgs.style = row->style;
- drawArgs.indent = 0;
- drawArgs.x = 0;
- drawArgs.y = 0;
- drawArgs.width = width;
- drawArgs.height = height;
- drawArgs.justify = TK_JUSTIFY_LEFT;
- elem = TreeStyle_Identify(&drawArgs, x, y);
- if (elem != NULL)
- sprintf(buf + strlen(buf), " elem %s", elem);
-}
-
-#if 0
-/*
- *----------------------------------------------------------------------
- *
- * SetImageForRow --
- *
- * Set a photo image containing a simplified picture of a row label.
- * This image is used when dragging and dropping a row label.
- *
- * Results:
- * Token for a photo image, or NULL if the image could not be
- * created.
- *
- * Side effects:
- * A photo image called "TreeCtrlRowImage" will be created if
- * it doesn't exist. The image is set to contain a picture of the
- * row label.
- *
- *----------------------------------------------------------------------
- */
-
-static Tk_Image
-SetImageForRow(
- TreeCtrl *tree, /* Widget info. */
- RowLabel *row /* Row record. */
- )
-{
- Tk_PhotoHandle photoH;
- Pixmap pixmap;
- int width = Tree_WidthOfRowLabels(tree);
- int height = tree->headerHeight;
- XImage *ximage;
-
- photoH = Tk_FindPhoto(tree->interp, "TreeCtrlRowImage");
- if (photoH == NULL) {
- Tcl_GlobalEval(tree->interp, "image create photo TreeCtrlRowImage");
- photoH = Tk_FindPhoto(tree->interp, "TreeCtrlRowImage");
- if (photoH == NULL)
- return NULL;
- }
-
- pixmap = Tk_GetPixmap(tree->display, Tk_WindowId(tree->tkwin),
- width, height, Tk_Depth(tree->tkwin));
-
- Row_Draw(row, pixmap, 0, 0, TRUE);
-
- /* Pixmap -> XImage */
- ximage = XGetImage(tree->display, pixmap, 0, 0,
- (unsigned int)width, (unsigned int)height, AllPlanes, ZPixmap);
- if (ximage == NULL)
- panic("ximage is NULL");
-
- /* XImage -> Tk_Image */
- XImage2Photo(tree->interp, photoH, ximage, tree->rowDrag.alpha);
-
- XDestroyImage(ximage);
- Tk_FreePixmap(tree->display, pixmap);
-
- return Tk_GetImage(tree->interp, tree->tkwin, "TreeCtrlRowImage",
- NULL, (ClientData) NULL);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tree_DrawHeader --
- *
- * Draw the header of every row.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Stuff is drawn in a drawable.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tree_DrawHeader(
- TreeCtrl *tree, /* Widget info. */
- Drawable drawable, /* Where to draw. */
- int x, int y /* Top-left corner of the header. */
- )
-{
- RowLabel *column = (RowLabel *) tree->columns;
- Tk_Window tkwin = tree->tkwin;
- int minX, maxX, width, height;
- Drawable pixmap;
- int x2 = x;
-
- /* Update layout if needed */
- (void) Tree_HeaderHeight(tree);
- (void) Tree_WidthOfRows(tree);
-
- minX = tree->inset;
- maxX = Tk_Width(tkwin) - tree->inset;
-
- if (tree->doubleBuffer == DOUBLEBUFFER_ITEM)
- pixmap = Tk_GetPixmap(tree->display, Tk_WindowId(tkwin),
- Tk_Width(tkwin), tree->inset + tree->headerHeight, Tk_Depth(tkwin));
- else
- pixmap = drawable;
-
- while (column != NULL) {
- if (column->visible) {
- if ((x < maxX) && (x + column->useWidth > minX))
- Row_Draw(column, pixmap, x, y, FALSE);
- x += column->useWidth;
- }
- column = column->next;
- }
-
- /* Draw "tail" column */
- if (x < maxX) {
- column = (RowLabel *) tree->columnTail;
- width = maxX - x + column->borderWidth;
- height = tree->headerHeight;
- if (tree->useTheme &&
- (TreeTheme_DrawHeaderItem(tree, pixmap, 0, 0, x, y, width, height) == TCL_OK)) {
- } else {
- Tk_3DBorder border;
- border = PerStateBorder_ForState(tree, &column->border,
- Row_MakeState(column), NULL);
- if (border == NULL)
- border = tree->border;
- Tk_Fill3DRectangle(tkwin, pixmap, border,
- x, y, width, height, column->borderWidth, TK_RELIEF_RAISED);
- }
- }
-
- {
- Tk_Image image = NULL;
- int imageX = 0, imageW = 0, indDraw = FALSE, indX = 0;
-
- column = (RowLabel *) tree->columns;
- while (column != NULL) {
- if (column->visible) {
- if (column == (RowLabel *) tree->columnDrag.column) {
- image = SetImageForRow(tree, column);
- imageX = x2;
- imageW = column->useWidth;
- }
- if (column == (RowLabel *) tree->columnDrag.indRow) {
- indX = x2 - 1;
- indDraw = TRUE;
- }
- x2 += column->useWidth;
- }
- if (tree->columnDrag.indRow == tree->columnTail) {
- indX = x2 - 1;
- indDraw = TRUE;
- }
- column = column->next;
- }
- if (indDraw) {
- GC gc = Tk_GCForColor(tree->columnDrag.indColor, Tk_WindowId(tree->tkwin));
- XFillRectangle(tree->display, pixmap, gc,
- indX, y, 2, tree->headerHeight);
- }
- if (image != NULL) {
-#if !defined(WIN32) && !defined(MAC_TCL) && !defined(MAC_OSX_TK)
- int ix = 0, iy = 0, iw = imageW, ih = tree->headerHeight;
- /*
- * Do boundary clipping, so that Tk_RedrawImage is passed
- * valid coordinates. [Tk Bug 979239]
- */
- imageX += tree->columnDrag.offset;
- if (imageX < minX) {
- ix = minX - imageX;
- iw -= ix;
- imageX = minX;
- } else if (imageX + imageW >= maxX) {
- iw -= (imageX + imageW) - maxX;
- }
- Tk_RedrawImage(image, ix, iy, iw, ih, pixmap,
- imageX, y);
-#else
- Tk_RedrawImage(image, 0, 0, imageW,
- tree->headerHeight, pixmap,
- imageX + tree->columnDrag.offset, y);
-#endif
- Tk_FreeImage(image);
- }
- }
-
- if (tree->doubleBuffer == DOUBLEBUFFER_ITEM) {
- XCopyArea(tree->display, pixmap, drawable,
- tree->copyGC, minX, y,
- maxX - minX, tree->headerHeight,
- tree->inset, y);
-
- Tk_FreePixmap(tree->display, pixmap);
- }
-}
-#endif
-
-/*
- *----------------------------------------------------------------------
- *
- * Tree_WidthOfRowLabels --
- *
- * Returns the display width of the row labels.
- *
- * Results:
- * If the -rowlabelwidth option is set, that is the result. Otherwise
- * the result is the maximum requested width of every visible row
- * label, clipped to -minrowlabelwidth and -maxrowlabelwidth.
- *
- * Side effects:
- * The size of elements and styles may be updated if they are
- * marked out-of-date.
- *
- *----------------------------------------------------------------------
- */
-
-int
-Tree_WidthOfRowLabels(
- TreeCtrl *tree /* Widget info. */
- )
-{
- RowLabel *row;
- int width;
-
- if (!tree->showRowLabels)
- return 0;
-
- /* The treectrl option -rowlabelwidth specifies a fixed width for
- * the row labels. */
- if (tree->rowLabelWidthObj != NULL && tree->rowLabelWidth >= 0)
- return tree->rowLabelWidth;
-
- /* Recalculate the maximum requested width of every visible row label. */
- if (tree->neededWidthOfRows < 0) {
- width = 0;
- row = (RowLabel *) tree->rows;
- while (row != NULL) {
- if (row->visible) {
- width = MAX(TreeRowLabel_NeededWidth((TreeRowLabel) row), width);
- }
- row = row->next;
- }
- tree->neededWidthOfRows = width;
- }
-
- width = tree->neededWidthOfRows;
- if ((tree->minRowLabelWidthObj != NULL) && (tree->minRowLabelWidth >= 0) &&
- (width < tree->minRowLabelWidth))
- width = tree->minRowLabelWidth;
- if ((tree->maxRowLabelWidthObj != NULL) && (tree->maxRowLabelWidth >= 0) &&
- (width > tree->maxRowLabelWidth))
- width = tree->maxRowLabelWidth;
- return width;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tree_InitRowLabels --
- *
- * Perform row-related initialization when a new TreeCtrl is
- * created.
- *
- * Results:
- * A standard Tcl result.
- *
- * Side effects:
- * Memory is allocated.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tree_InitRowLabels(
- TreeCtrl *tree /* Widget info. */
- )
-{
- tree->rows = NULL;
- tree->rowLabelLast = NULL;
- tree->nextRowId = 0;
- tree->rowCount = 0;
- tree->neededWidthOfRows = -1;
-
- Tcl_InitHashTable(&tree->rowIDHash, TCL_ONE_WORD_KEYS);
-
- tree->rowDrag.optionTable = Tk_CreateOptionTable(tree->interp, dragSpecs);
- (void) Tk_InitOptions(tree->interp, (char *) tree,
- tree->rowDrag.optionTable, tree->tkwin);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tree_FreeRowLabels --
- *
- * Free row-related resources for a deleted TreeCtrl.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Memory is deallocated.
- *
- *----------------------------------------------------------------------
- */
-
-void Tree_FreeRowLabels(
- TreeCtrl *tree /* Widget info. */
- )
-{
- RowLabel *row = (RowLabel *) tree->rows;
-
- while (row != NULL) {
- row = Row_Free(row);
- }
- Tcl_DeleteHashTable(&tree->rowIDHash);
-}
-
diff --git a/generic/tkTreeStyle.c b/generic/tkTreeStyle.c
index b5938d8..8cbf0bd 100644
--- a/generic/tkTreeStyle.c
+++ b/generic/tkTreeStyle.c
@@ -5,7 +5,7 @@
*
* Copyright (c) 2002-2006 Tim Baker
*
- * RCS: @(#) $Id: tkTreeStyle.c,v 1.51 2006/10/11 01:35:33 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeStyle.c,v 1.52 2006/10/14 21:19:53 treectrl Exp $
*/
#include "tkTreeCtrl.h"
@@ -2789,9 +2789,6 @@ Element_CreateAndConfig(
* be NULL for a master element. */
TreeItemColumn column, /* Item-column containing the element.
* Should be NULL for a master element. */
-#ifdef ROW_LABEL
- TreeRowLabel row, /* Row using element, or NULL. */
-#endif
Element *masterElem, /* Master element if creating an instance. */
ElementType *type, /* Element type. Should be NULL when
* creating an instance. */
@@ -2824,9 +2821,6 @@ Element_CreateAndConfig(
args.elem = elem;
args.create.item = item;
args.create.column = column;
-#ifdef ROW_LABEL
- args.create.row = row;
-#endif
if ((*type->createProc)(&args) != TCL_OK)
{
#ifdef ALLOC_HAX
@@ -2901,9 +2895,6 @@ Style_CreateElem(
TreeCtrl *tree, /* Widget info. */
TreeItem item, /* Item containing the element. */
TreeItemColumn column, /* Item-column containing the element. */
-#ifdef ROW_LABEL
- TreeRowLabel row, /* Row using element, or NULL. */
-#endif
IStyle *style, /* Style to search/add the element to. */
Element *masterElem, /* Element to find or create and instance of. */
int *isNew) /* If non-NULL, set to TRUE if a new instance
@@ -2937,11 +2928,7 @@ Style_CreateElem(
if (i == masterStyle->numElements)
return NULL;
-#ifdef ROW_LABEL
- elem = Element_CreateAndConfig(tree, item, column, row, masterElem, NULL, NULL, 0, NULL);
-#else
elem = Element_CreateAndConfig(tree, item, column, masterElem, NULL, NULL, 0, NULL);
-#endif
if (elem == NULL)
return NULL;
@@ -3262,31 +3249,6 @@ Style_Changed(
}
if (updateDInfo)
Tree_DInfoChanged(tree, DINFO_REDO_RANGES);
-#ifdef ROW_LABEL
- updateDInfo = FALSE;
- hPtr = Tcl_FirstHashEntry(&tree->rowIDHash, &search);
- while (hPtr != NULL)
- {
- TreeRowLabel row = (TreeRowLabel) Tcl_GetHashValue(hPtr);
- style = (IStyle *) TreeRowLabel_GetStyle(row);
- if ((style != NULL) && (style->master == masterStyle))
- {
- for (i = 0; i < masterStyle->numElements; i++)
- {
- IElementLink *eLink = &style->elements[i];
- /* This is needed if the -width/-height layout options change */
- eLink->neededWidth = eLink->neededHeight = -1;
- }
- style->neededWidth = style->neededHeight = -1;
- updateDInfo = TRUE;
- }
- hPtr = Tcl_NextHashEntry(&search);
- }
- if (updateDInfo) {
- tree->neededWidthOfRows = -1;
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
- }
-#endif /* ROW_LABEL */
}
/*
@@ -3585,26 +3547,6 @@ Style_ChangeElements(
}
if (updateDInfo)
Tree_DInfoChanged(tree, DINFO_REDO_RANGES);
-#ifdef ROW_LABEL
- updateDInfo = FALSE;
- hPtr = Tcl_FirstHashEntry(&tree->rowIDHash, &search);
- while (hPtr != NULL)
- {
- TreeRowLabel row = (TreeRowLabel) Tcl_GetHashValue(hPtr);
- style = (IStyle *) TreeRowLabel_GetStyle(row);
- if ((style != NULL) && (style->master == masterStyle))
- {
- IStyle_ChangeElementsAux(tree, style, count, elemList, map);
- style->neededWidth = style->neededHeight = -1;
- updateDInfo = TRUE;
- }
- hPtr = Tcl_NextHashEntry(&search);
- }
- if (updateDInfo) {
- tree->neededWidthOfRows = -1;
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
- }
-#endif
}
/*
@@ -3721,47 +3663,6 @@ Style_ElemChanged(
}
if (updateDInfo)
Tree_DInfoChanged(tree, DINFO_REDO_RANGES);
-#ifdef ROW_LABEL
- updateDInfo = FALSE;
- hPtr = Tcl_FirstHashEntry(&tree->rowIDHash, &search);
- while (hPtr != NULL)
- {
- TreeRowLabel row = (TreeRowLabel) Tcl_GetHashValue(hPtr);
- style = (IStyle *) TreeRowLabel_GetStyle(row);
- if ((style != NULL) && (style->master == masterStyle))
- {
- iMask = csM;
- for (i = 0; i < masterStyle->numElements; i++)
- {
- eLink = &style->elements[i];
- if (eLink->elem == masterElem)
- {
- if (csM & CS_LAYOUT)
- eLink->neededWidth = eLink->neededHeight = -1;
- break;
- }
- /* Instance element */
- if (eLink->elem->master == masterElem)
- {
- args.elem = eLink->elem;
- eMask = (*masterElem->typePtr->changeProc)(&args);
- if (eMask & CS_LAYOUT)
- eLink->neededWidth = eLink->neededHeight = -1;
- iMask |= eMask;
- break;
- }
- }
- if (iMask & CS_LAYOUT) {
- tree->neededWidthOfRows = -1;
- updateDInfo = TRUE;
- }
- }
- hPtr = Tcl_NextHashEntry(&search);
- }
- if (updateDInfo) {
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
- }
-#endif /* ROW_LABEL */
}
/*
@@ -3925,9 +3826,6 @@ Style_SetImageOrText(
TreeItem item, /* Item containing the style. Needed if
* a new instance Element is created. */
TreeItemColumn column, /* Item-column containing the style */
-#ifdef ROW_LABEL
- TreeRowLabel row, /* Row using element, or NULL. */
-#endif
IStyle *style, /* The style */
ElementType *typePtr, /* Element type to look for. */
CONST char *optionName, /* NULL-terminated config option name. */
@@ -3954,11 +3852,8 @@ Style_SetImageOrText(
Tcl_Obj *objv[2];
ElementArgs args;
-#ifdef ROW_LABEL
- eLink = Style_CreateElem(tree, item, column, row, style, masterElem, NULL);
-#else
eLink = Style_CreateElem(tree, item, column, style, masterElem, NULL);
-#endif
+
objv[0] = *optionNameObj;
objv[1] = valueObj;
args.tree = tree;
@@ -4005,20 +3900,12 @@ TreeStyle_SetImage(
TreeCtrl *tree, /* Widget info. */
TreeItem item, /* Item containing the style. */
TreeItemColumn column, /* Item-column containing the style. */
-#ifdef ROW_LABEL
- TreeRowLabel row, /* Row using the style, or NULL. */
-#endif
TreeStyle style_, /* The instance style. */
Tcl_Obj *valueObj /* New value for -image option. */
)
{
-#ifdef ROW_LABEL
- return Style_SetImageOrText(tree, item, column, row, (IStyle *) style_,
- &elemTypeImage, "-image", &confImageObj, valueObj);
-#else
return Style_SetImageOrText(tree, item, column, (IStyle *) style_,
&elemTypeImage, "-image", &confImageObj, valueObj);
-#endif
}
/*
@@ -4044,20 +3931,12 @@ TreeStyle_SetText(
TreeCtrl *tree, /* Widget info. */
TreeItem item, /* Item containing the style. */
TreeItemColumn column, /* Item-column containing the style. */
-#ifdef ROW_LABEL
- TreeRowLabel row, /* Row using the style, or NULL. */
-#endif
TreeStyle style_, /* The instance style. */
Tcl_Obj *valueObj /* New value for -text option. */
)
{
-#ifdef ROW_LABEL
- return Style_SetImageOrText(tree, item, column, row, (IStyle *) style_,
- &elemTypeText, "-text", &confTextObj, valueObj);
-#else
return Style_SetImageOrText(tree, item, column, (IStyle *) style_,
&elemTypeText, "-text", &confTextObj, valueObj);
-#endif
}
/*
@@ -4116,21 +3995,6 @@ Style_Deleted(
}
hPtr = Tcl_NextHashEntry(&search);
}
-#ifdef ROW_LABEL
- hPtr = Tcl_FirstHashEntry(&tree->rowIDHash, &search);
- while (hPtr != NULL)
- {
- TreeRowLabel row = (TreeRowLabel) Tcl_GetHashValue(hPtr);
- style = (IStyle *) TreeRowLabel_GetStyle(row);
- if ((style != NULL) && (style->master == masterStyle))
- {
- TreeRowLabel_ForgetStyle(row);
- tree->neededWidthOfRows = -1;
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
- }
- hPtr = Tcl_NextHashEntry(&search);
- }
-#endif
/* Update -defaultstyle option */
if (tree->defaultStyle.stylesObj != NULL)
@@ -4408,40 +4272,11 @@ Tree_ElementChangedItself(
TreeCtrl *tree, /* Widget info. */
TreeItem item, /* Item containing the element. */
TreeItemColumn column, /* Item-column containing the element. */
-#ifdef ROW_LABEL
- TreeRowLabel row, /* Row using element, or NULL. */
-#endif
Element *elem, /* The element that changed. */
int csM /* CS_xxx flags detailing the effects of
* the change. */
)
{
-#ifdef ROW_LABEL
- if ((row != NULL) && (csM & CS_LAYOUT)) {
- IStyle *style = (IStyle *) TreeRowLabel_GetStyle(row);
- IElementLink *eLink = NULL;
- int i;
-
- if (style == NULL)
- panic("Tree_ElementChangedItself but style is NULL\n");
-
- for (i = 0; i < style->master->numElements; i++)
- {
- eLink = &style->elements[i];
- if (eLink->elem == elem)
- break;
- }
-
- if (eLink == NULL)
- panic("Tree_ElementChangedItself but eLink is NULL\n");
-
- eLink->neededWidth = eLink->neededHeight = -1;
- style->neededWidth = style->neededHeight = -1;
- tree->neededWidthOfRows = -1;
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
- return;
- }
-#endif
if (csM & CS_LAYOUT)
{
IStyle *style = (IStyle *) TreeItemColumn_GetStyle(tree, column);
@@ -4580,9 +4415,6 @@ TreeStyle_ElementCget(
TreeCtrl *tree, /* Widget info. */
TreeItem item, /* Item containing the element. */
TreeItemColumn column, /* Item-column containing the element. */
-#ifdef ROW_LABEL
- TreeRowLabel row, /* Row using style or NULL */
-#endif
TreeStyle style_, /* Style containing the element. */
Tcl_Obj *elemObj, /* Name of the element. */
Tcl_Obj *optionNameObj /* Name of the config option. */
@@ -4599,21 +4431,6 @@ TreeStyle_ElementCget(
eLink = IStyle_FindElem(tree, style, elem, NULL);
if ((eLink != NULL) && (eLink->elem == elem))
{
-#ifdef ROW_LABEL
- if (row != NULL) {
- FormatResult(tree->interp,
- "element %s is not configured in row %s%d",
- elem->name, tree->rowPrefix, TreeRowLabel_GetID(row));
- } else {
- int index = TreeItemColumn_Index(tree, item, column);
- TreeColumn treeColumn = Tree_FindColumn(tree, index);
-
- FormatResult(tree->interp,
- "element %s is not configured in item %s%d column %s%d",
- elem->name, tree->itemPrefix, TreeItem_GetID(tree, item),
- tree->columnPrefix, TreeColumn_GetID(treeColumn));
- }
-#else
int index = TreeItemColumn_Index(tree, item, column);
TreeColumn treeColumn = Tree_FindColumn(tree, index);
@@ -4621,7 +4438,6 @@ TreeStyle_ElementCget(
"element %s is not configured in item %s%d column %s%d",
elem->name, tree->itemPrefix, TreeItem_GetID(tree, item),
tree->columnPrefix, TreeColumn_GetID(treeColumn));
-#endif
return TCL_ERROR;
}
if (eLink == NULL)
@@ -4662,9 +4478,6 @@ TreeStyle_ElementConfigure(
TreeCtrl *tree, /* Widget info. */
TreeItem item, /* Item containing the element. */
TreeItemColumn column, /* Item-column containing the element. */
-#ifdef ROW_LABEL
- TreeRowLabel row, /* Row using style or NULL */
-#endif
TreeStyle style_, /* Style containing the element. */
Tcl_Obj *elemObj, /* Name of the element. */
int objc, /* Number of arguments. */
@@ -4689,21 +4502,6 @@ TreeStyle_ElementConfigure(
eLink = IStyle_FindElem(tree, style, elem, NULL);
if ((eLink != NULL) && (eLink->elem == elem))
{
-#ifdef ROW_LABEL
- if (row != NULL) {
- FormatResult(tree->interp,
- "element %s is not configured in row %s%d",
- elem->name, tree->rowPrefix, TreeRowLabel_GetID(row));
- } else {
- int index = TreeItemColumn_Index(tree, item, column);
- TreeColumn treeColumn = Tree_FindColumn(tree, index);
-
- FormatResult(tree->interp,
- "element %s is not configured in item %s%d column %s%d",
- elem->name, tree->itemPrefix, TreeItem_GetID(tree, item),
- tree->columnPrefix, TreeColumn_GetID(treeColumn));
- }
-#else
int index = TreeItemColumn_Index(tree, item, column);
TreeColumn treeColumn = Tree_FindColumn(tree, index);
@@ -4711,7 +4509,6 @@ TreeStyle_ElementConfigure(
"element %s is not configured in item %s%d column %s%d",
elem->name, tree->itemPrefix, TreeItem_GetID(tree, item),
tree->columnPrefix, TreeColumn_GetID(treeColumn));
-#endif
return TCL_ERROR;
}
if (eLink == NULL)
@@ -4733,11 +4530,7 @@ TreeStyle_ElementConfigure(
{
int isNew;
-#ifdef ROW_LABEL
- eLink = Style_CreateElem(tree, item, column, row, style, elem, &isNew);
-#else
eLink = Style_CreateElem(tree, item, column, style, elem, &isNew);
-#endif
if (eLink == NULL)
{
FormatResult(tree->interp, "style %s does not use element %s",
@@ -4968,11 +4761,7 @@ TreeElementCmd(
}
if (TreeElement_TypeFromObj(tree, objv[4], &typePtr) != TCL_OK)
return TCL_ERROR;
-#ifdef ROW_LABEL
- elem = Element_CreateAndConfig(tree, NULL, NULL, NULL, NULL, typePtr, name, objc - 5, objv + 5);
-#else
elem = Element_CreateAndConfig(tree, NULL, NULL, NULL, typePtr, name, objc - 5, objv + 5);
-#endif
if (elem == NULL)
return TCL_ERROR;
hPtr = Tcl_CreateHashEntry(&tree->elementHash, name, &isNew);
@@ -6771,32 +6560,6 @@ Tree_UndefineState(
Tree_InvalidateColumnWidth(tree, NULL);
Tree_DInfoChanged(tree, DINFO_REDO_RANGES);
-#ifdef ROW_LABEL
- hPtr = Tcl_FirstHashEntry(&tree->rowIDHash, &search);
- while (hPtr != NULL)
- {
- TreeRowLabel row = (TreeRowLabel) Tcl_GetHashValue(hPtr);
- IStyle *style = (IStyle *) TreeRowLabel_GetStyle(row);
- if (style != NULL)
- {
- for (i = 0; i < style->master->numElements; i++)
- {
- eLink = &style->elements[i];
- /* Instance element */
- if (eLink->elem->master != NULL) {
- args.elem = eLink->elem;
- (*args.elem->typePtr->undefProc)(&args);
- }
- eLink->neededWidth = eLink->neededHeight = -1;
- }
- style->neededWidth = style->neededHeight = -1;
- tree->neededWidthOfRows = -1;
- }
- hPtr = Tcl_NextHashEntry(&search);
- }
- Tree_DInfoChanged(tree, DINFO_DRAW_ROWLABELS);
-#endif
-
hPtr = Tcl_FirstHashEntry(&tree->elementHash, &search);
while (hPtr != NULL)
{
diff --git a/library/treectrl.tcl b/library/treectrl.tcl
index 0fff4e8..abbd326 100644
--- a/library/treectrl.tcl
+++ b/library/treectrl.tcl
@@ -1,4 +1,4 @@
-# RCS: @(#) $Id: treectrl.tcl,v 1.27 2006/10/14 20:18:15 treectrl Exp $
+# RCS: @(#) $Id: treectrl.tcl,v 1.28 2006/10/14 21:20:16 treectrl Exp $
bind TreeCtrl <Motion> {
TreeCtrl::CursorCheck %W %x %y
@@ -242,9 +242,7 @@ proc ::TreeCtrl::ColumnCanMoveHere {w column before} {
# ::TreeCtrl::CursorAction --
#
# If the given point is at the left or right edge of a resizable column, the
-# result is "column C". If the given point is at the right edge of a rowlabel,
-# the result is "rowlabel all". If the given point is at the top or bottom
-# edge of a resizable rowlabel, the result is "rowlabel R".
+# result is "column C".
#
# Arguments:
# w The treectrl widget.
@@ -277,29 +275,6 @@ proc ::TreeCtrl::CursorAction {w x y} {
}
}
}
- scan [$w contentbox] "%d %d %d %d" left top right bottom
- if {[$w cget -showrowlabels] && [$w cget -rowlabelresize] &&
- ($x >= $left - 4) && ($x < $left + 4)} {
- if {![$w cget -showheader] || ($y < $top)} {
- return "rowlabel all"
- }
- }
- if {([llength $id] > 1) && ([lindex $id 0] eq "rowlabel")} {
- set rowlabel [lindex $id 1]
- if {[lindex $id end] eq "top"} {
- if {[$w rowlabel compare $rowlabel != "first visible"]} {
- set rowlabel [$w rowlabel id "$rowlabel prev visible"]
- if {[$w rowlabel cget $rowlabel -resize]} {
- return "rowlabel $rowlabel"
- }
- }
- }
- if {[lindex $id end] eq "bottom"} {
- if {[$w rowlabel cget $rowlabel -resize]} {
- return "rowlabel $rowlabel"
- }
- }
- }
return ""
}
@@ -326,14 +301,6 @@ proc ::TreeCtrl::CursorCheck {w x y} {
if {[lindex $action 0] eq "column"} {
set cursor sb_h_double_arrow
}
- if {[lindex $action 0] eq "rowlabel"} {
- set rowlabel [lindex $action 1]
- if {$rowlabel eq "all"} {
- set cursor sb_h_double_arrow
- } else {
- set cursor sb_v_double_arrow
- }
- }
if {![info exists Priv(cursor,$w)]} {
set Priv(cursor,$w) [$w cget -cursor]
}
@@ -459,18 +426,6 @@ proc ::TreeCtrl::ButtonPress1 {w x y} {
focus $w
set action [CursorAction $w $x $y]
- if {$action ne "" && [lindex $action 0] eq "rowlabel"} {
- set Priv(buttonMode) rowlabel
- set Priv(rowlabel) [lindex $action 1]
- set Priv(x) $x
- set Priv(y) $y
- set Priv(width) [$w rowlabel width]
- if {$Priv(rowlabel) ne "all"} {
- scan [$w rowlabel bbox $Priv(rowlabel)] "%d %d %d %d" x1 y1 x2 y2
- set Priv(height) [expr {$y2 - $y1}]
- }
- return
- }
set id [$w identify $x $y]
if {$id eq ""} {
@@ -521,11 +476,6 @@ proc ::TreeCtrl::ButtonPress1 {w x y} {
set Priv(columnDrag,y) $y
return
}
- if {[lindex $id 0] eq "rowlabel"} {
- # What action should be taken when clicking in a rowlabel?
- # Resizing is handled above.
- return
- }
set item [lindex $id 1]
if {![$w item enabled $item]} {
return
@@ -547,14 +497,6 @@ proc ::TreeCtrl::ButtonPress1 {w x y} {
proc ::TreeCtrl::DoubleButton1 {w x y} {
set action [CursorAction $w $x $y]
- if {$action ne "" && [lindex $action 0] eq "rowlabel"} {
- set rowlabel [lindex $action 1]
- if {$rowlabel eq "all"} {
- $w configure -rowlabelwidth ""
- } else {
- $w rowlabel configure $rowlabel -height ""
- }
- }
set id [$w identify $x $y]
if {$id eq ""} {
@@ -725,70 +667,6 @@ proc ::TreeCtrl::Motion1 {w x y} {
}
}
}
- rowlabel {
- if {$Priv(rowlabel) eq "all"} {
- set width [expr {$Priv(width) + $x - $Priv(x)}]
- set minWidth [$w cget -minrowlabelwidth]
- set maxWidth [$w cget -maxrowlabelwidth]
- if {$minWidth eq ""} {
- set minWidth 0
- }
- if {$minWidth >= 0 && $width < $minWidth} {
- set width $minWidth
- }
- if {$maxWidth ne "" && $width > $maxWidth} {
- set width $maxWidth
- }
- if {$width == 0} {
- incr width
- }
- switch -- [$w cget -columnresizemode] {
- proxy {
- scan [$w contentbox] "%d %d %d %d" x1 y1 x2 y2
- incr x1 -[$w rowlabel width]
- # Use "ne" because -columnproxy could be ""
- if {($x1 + $width - 1) ne [$w cget -columnproxy]} {
- $w configure -columnproxy [expr {$x1 + $width - 1}]
- }
- }
- realtime {
- if {[$w cget -rowlabelwidth] != $width} {
- $w configure -rowlabelwidth $width
- }
- }
- }
- } else {
- set height [expr {$Priv(height) + $y - $Priv(y)}]
- set minHeight [$w rowlabel cget $Priv(rowlabel) -minheight]
- set maxHeight [$w rowlabel cget $Priv(rowlabel) -maxheight]
- if {$minHeight eq ""} {
- set minHeight 0
- }
- if {$minHeight >= 0 && $height < $minHeight} {
- set height $minHeight
- }
- if {$maxHeight ne "" && $height > $maxHeight} {
- set height $maxHeight
- }
- if {$height == 0} {
- incr height
- }
- switch -- [$w cget -columnresizemode] {
- proxy {
- scan [$w rowlabel bbox $Priv(rowlabel)] "%d %d %d %d" x1 y1 x2 y2
- # Use "ne" because -rowproxy could be ""
- if {($y1 + $height - 1) ne [$w cget -rowproxy]} {
- $w configure -rowproxy [expr {$y1 + $height - 1}]
- }
- }
- realtime {
- if {[$w rowlabel cget $Priv(rowlabel) -height] != $height} {
- $w rowlabel configure $Priv(rowlabel) -height $height
- }
- }
- }
- }
- }
}
return
}
@@ -901,22 +779,6 @@ set Priv(prev) ""
CursorCheck $w $x $y
}
}
- rowlabel {
- if {[$w cget -columnproxy] ne ""} {
- scan [$w contentbox] "%d %d %d %d" x1 y1 x2 y2
- incr x1 -[$w rowlabel width]
- set width [expr {[$w cget -columnproxy] - $x1 + 1}]
- $w configure -columnproxy {}
- $w configure -rowlabelwidth $width
- CursorCheck $w $x $y
- }
- if {[$w cget -rowproxy] ne ""} {
- scan [$w rowlabel bbox $Priv(rowlabel)] "%d %d %d %d" x1 y1 x2 y2
- set height [expr {[$w cget -rowproxy] - $y1 + 1}]
- $w configure -rowproxy {}
- $w rowlabel configure $Priv(rowlabel) -height $height
- }
- }
}
unset Priv(buttonMode)
return