diff -r c0f108c6d05f -r e4b907c8f0ce SelectionInTree.st --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SelectionInTree.st Sat Jul 05 14:59:13 1997 +0200 @@ -0,0 +1,269 @@ +" + COPYRIGHT (c) 1997 by eXept Software AG / Claus Gittinger + All Rights Reserved + + This software is furnished under a license and may be used + only in accordance with the terms of that license and with the + inclusion of the above copyright notice. This software may not + be provided or otherwise made available to, or used by, any + other person. No title to or ownership of the software is + hereby transferred. +" + + + +Model subclass:#SelectionInTree + instanceVariableNames:'root list selection' + classVariableNames:'' + poolDictionaries:'' + category:'Interface-Support-Models' +! + +!SelectionInTree class methodsFor:'documentation'! + +copyright +" + COPYRIGHT (c) 1997 by eXept Software AG / Claus Gittinger + All Rights Reserved + + This software is furnished under a license and may be used + only in accordance with the terms of that license and with the + inclusion of the above copyright notice. This software may not + be provided or otherwise made available to, or used by, any + other person. No title to or ownership of the software is + hereby transferred. +" + + +! + +documentation +" + list and selection holder for hierarchical list structures. Used + to buildup file-trees, class tress etc. + + Especially suited for use with SelectionInTreeView. + + [See also:] + TreeItem + SelectionInTreeView + + [Author:] + W. Olberding + Claus Atzkern +" +! ! + +!SelectionInTree methodsFor:'accessing'! + +list + "get list oc currently shown objects + " + ^ list +! + +root + "get the root node + " + ^ root +! + +root:aRootNode + "set a new root and recompute list + " + root := aRootNode. + self recomputeList. +! ! + +!SelectionInTree methodsFor:'accessing hierarchy'! + +collapse:something + "collapse a node or collection of nodes + " + |invalidate| + + self each:something do:[:aNode| + aNode isCollapsable ifTrue:[ + aNode collapse. + invalidate := true + ] + ]. + invalidate == true ifTrue:[self recomputeList] +! + +expand:something + "expand a node or collection of nodes + " + |invalidate| + + self each:something do:[:aNode| + aNode isExpandable ifTrue:[ + aNode expand. + invalidate := true + ] + ]. + invalidate == true ifTrue:[self recomputeList] +! ! + +!SelectionInTree methodsFor:'adding & removing'! + +add:something after:aChild + "add a node or collection of nodes to parent after a child + " + "add a node or collection of nodes to after a child + " + aChild notNil ifTrue:[ + aChild parent add:something after:aChild. + self recomputeList + ] +! + +add:something afterIndex:anIndex below:aParent + "add a node or collection of nodes to parent after an index + " + aParent add:something afterIndex:anIndex. + self recomputeList + +! + +add:something before:aChild + "add a node or collection of nodes to before a child + " + aChild notNil ifTrue:[ + aChild parent add:something before:aChild. + self recomputeList + ] +! + +add:something beforeIndex:anIndex below:aParent + "add a node or collection of nodes to parent before an index + " + aParent add:something beforeIndex:anIndex. + self recomputeList + +! + +add:something below:aParent + "add a node or collection of nodes to parent + " + aParent add:something. + self recomputeList + +! + +remove:something + "remove a node or collection of nodes + " + |invalidate| + + self each:something do:[:aNode| + aNode parent notNil ifTrue:[ + aNode parent remove:aNode. + invalidate := true + ] + ]. + invalidate == true ifTrue:[self recomputeList]. + ^ something +! + +removeIndex:something + "remove a node at index or collection of indexed nodes + " + |invalidate node| + + something isCollection ifFalse:[ + (something isNil or:[something == 0]) ifFalse:[ + ^ self remove:(list at:something) + ]. + ^ nil + ]. + + (SortedCollection withAll:something) reverseDo:[:anIndex| + node := list at:anIndex. + + node parent notNil ifTrue:[ + node parent remove:node. + invalidate := true + ] + ]. + invalidate == true ifTrue:[self recomputeList]. +! + +removeSelection + "remove selected nodes + " + self removeIndex:(self selectionIndex). + self selectionIndex:nil +! ! + +!SelectionInTree methodsFor:'enumerating'! + +each:something do:aBlock + "evaluate a block for something or in case of a collection for each + element in the collection + " + something notNil ifTrue:[ + something isCollection ifTrue:[something do:[:el|aBlock value:el]] + ifFalse:[aBlock value:something] + ] + +! ! + +!SelectionInTree methodsFor:'private'! + +recomputeList + "Travers the tree and build a new list." + + list := OrderedCollection new. + + root notNil ifTrue:[ + list add:root. + root recomputeList:list + ]. + self changed:#list. +! ! + +!SelectionInTree methodsFor:'selection'! + +selection + "get the selection or nil + " + ^ self selectionIndex +! + +selection:indexesOrNil + "set the selection + " + self selectionIndex:indexesOrNil +! + +selectionIndex + "get the selection or nil + " + ^ selection +! + +selectionIndex:indexesOrNil + "set the selection + " + |indexes| + + indexes := indexesOrNil. + + indexes size == 0 ifTrue:[ + (indexes isCollection or:[indexes == 0]) ifTrue:[ + indexes := nil + ] + ]. + + indexes = selection ifFalse:[ + selection := indexes. + self changed:#selection + ] +! ! + +!SelectionInTree class methodsFor:'documentation'! + +version + ^ '$Header: /cvs/stx/stx/libwidg2/SelectionInTree.st,v 1.1 1997-07-05 12:59:13 ca Exp $' +! !