diff options
author | treectrl <treectrl> | 2006-11-19 00:48:11 (GMT) |
---|---|---|
committer | treectrl <treectrl> | 2006-11-19 00:48:11 (GMT) |
commit | 7d51879c281d91b4d84a4c06b0dbe2568d4c10cf (patch) | |
tree | 4ed35359c8ebbdedeaed64ed8be177e13f9b8d24 /generic/tkTreeCtrl.c | |
parent | d12b2b7f0b8eddf1d766b10b828f9b11e47e0a43 (diff) | |
download | tktreectrl-7d51879c281d91b4d84a4c06b0dbe2568d4c10cf.zip tktreectrl-7d51879c281d91b4d84a4c06b0dbe2568d4c10cf.tar.gz tktreectrl-7d51879c281d91b4d84a4c06b0dbe2568d4c10cf.tar.bz2 |
Added 2 optional arguments to [selection get] to perform lindex- and lrange-like operations on the sorted list of selected items.
Diffstat (limited to 'generic/tkTreeCtrl.c')
-rw-r--r-- | generic/tkTreeCtrl.c | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/generic/tkTreeCtrl.c b/generic/tkTreeCtrl.c index 1b430b1..a5b1c33 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.86 2006/11/15 23:52:13 treectrl Exp $ + * RCS: @(#) $Id: tkTreeCtrl.c,v 1.87 2006/11/19 00:48:11 treectrl Exp $ */ #include "tkTreeCtrl.h" @@ -2724,10 +2724,70 @@ doneCLEAR: Tcl_HashEntry *hPtr; Tcl_HashSearch search; +#ifdef SELECTION_VISIBLE + if (objc < 3 || objc > 5) { + Tcl_WrongNumArgs(interp, 3, objv, "?first? ?last?"); + return TCL_ERROR; + } + if (objc > 3) { + int first, last; + TreeItemList items; + + if (TclGetIntForIndex(interp, objv[3], tree->selectCount - 1, + &first) != TCL_OK) { + return TCL_ERROR; + } + if (first < 0) + first = 0; + last = first; + if (objc == 5) { + if (TclGetIntForIndex(interp, objv[4], tree->selectCount - 1, + &last) != TCL_OK) { + return TCL_ERROR; + } + } + if (last >= tree->selectCount) + last = tree->selectCount - 1; + if (first > last) + break; + + /* Build a list of selected items. */ + TreeItemList_Init(tree, &items, tree->selectCount); + hPtr = Tcl_FirstHashEntry(&tree->selection, &search); + while (hPtr != NULL) { + item = (TreeItem) Tcl_GetHashKey(&tree->selection, hPtr); + TreeItemList_Append(&items, item); + hPtr = Tcl_NextHashEntry(&search); + } + + /* Sort it. */ + TreeItemList_Sort(&items); + + if (first == last) { + item = TreeItemList_Nth(&items, first); + Tcl_SetObjResult(interp, TreeItem_ToObj(tree, item)); + } else { + listObj = Tcl_NewListObj(0, NULL); + for (index = first; index <= last; index++) { + item = TreeItemList_Nth(&items, index); + Tcl_ListObjAppendElement(interp, listObj, + TreeItem_ToObj(tree, item)); + } + Tcl_SetObjResult(interp, listObj); + } + + TreeItemList_Free(&items); + break; + } +#else /* SELECTION_VISIBLE */ + /* If any item may be selected, including orphans, then getting + * a sorted list of selected items is impossible. */ if (objc != 3) { Tcl_WrongNumArgs(interp, 3, objv, (char *) NULL); return TCL_ERROR; } +#endif /* SELECTION_VISIBLE */ + if (tree->selectCount < 1) break; listObj = Tcl_NewListObj(0, NULL); |