SelectionInTree.st
author ca
Mon, 11 Aug 1997 13:02:03 +0200
changeset 491 c7d57a5e7a21
parent 482 7f922ead2b06
child 496 d511fde77222
permissions -rw-r--r--
change root, do not remove children

"
 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
    "
    self root:aRootNode keepRoot:false

!

root:aRootNode keepRoot:keepRoot
    "set a new root and recompute list
    "
    |idx children|

    (keepRoot and:[root notNil]) ifTrue:[
        children := aRootNode children.

        idx := children findFirst:[:el| el name = root name ].

        idx ~~ 0 ifTrue:[
            root parent:aRootNode.
            children at:idx put:root.
        ].
    ].
    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."

    self updateList.
    self changed:#list.
!

updateList
    "Travers the tree and build a new list.; no notification raised"

    list := OrderedCollection new.

    root notNil ifTrue:[
        list add:root.
        root recomputeList: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.3 1997-08-11 11:02:03 ca Exp $'
! !