SelectionInTree.st
changeset 458 e4b907c8f0ce
child 482 7f922ead2b06
--- /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 $'
+! !