From b3397722a2f81f202020aabf01206bd96a99948f Mon Sep 17 00:00:00 2001 From: treectrl Date: Sat, 14 Oct 2006 21:19:53 +0000 Subject: Remove rowlabels. --- demos/demo.tcl | 18 +- demos/rowlabels.tcl | 148 --- generic/tkTreeColumn.c | 23 +- generic/tkTreeCtrl.c | 85 +- generic/tkTreeCtrl.h | 110 +- generic/tkTreeDisplay.c | 370 +----- generic/tkTreeElem.c | 34 +- generic/tkTreeElem.h | 11 +- generic/tkTreeItem.c | 26 +- generic/tkTreeRowLabel.c | 3107 ---------------------------------------------- generic/tkTreeStyle.c | 241 +--- library/treectrl.tcl | 142 +-- 12 files changed, 24 insertions(+), 4291 deletions(-) delete mode 100644 demos/rowlabels.tcl delete mode 100644 generic/tkTreeRowLabel.c 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 { - # no-op - } - bind DemoRowLabels { - 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 { 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 -- cgit v0.12