AbstractHierarchicalItem.st
author Jan Vrany <jan.vrany@labware.com>
Fri, 02 Sep 2022 11:25:39 +0100
branchjv
changeset 6261 9b7eb7159d29
parent 5363 4e25de452cea
child 5461 d259ac0f3ba6
permissions -rw-r--r--
Fix loong standing bug with some menus not being translated / resolved This has happened with browser "View" menu when sometimes it had the slice resolved and sometimes not. It turned out that it was because the code disabled resources (and therefore slices) resolution when processing shortcuts, so the menu was created and cached unresolved. This fixes the issue. eXept apparently run into the same problem.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 1999/2015 by eXept Software AG
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libwidg2' }"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
"{ NameSpace: Smalltalk }"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
Object subclass:#AbstractHierarchicalItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	instanceVariableNames:'parent children'
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	classVariableNames:''
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	poolDictionaries:''
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	category:'Views-Support'
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!AbstractHierarchicalItem class methodsFor:'documentation'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
copyright
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
 COPYRIGHT (c) 1999/2015 by eXept Software AG
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
              All Rights Reserved
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
 This software is furnished under a license and may be used
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
 only in accordance with the terms of that license and with the
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 inclusion of the above copyright notice.   This software may not
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 be provided or otherwise made available to, or used by, any
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 other person.  No title to or ownership of the software is
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 hereby transferred.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
documentation
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    Hierarchical Items are mostly like Models, but the list of
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    dependencies are kept by its HierarchicalList.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    The class is used to build up hierarchical trees.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    2015 update:
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
        the original HierarchicalItem has been refactored into this abstract class,
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
        which provides all the mechanisms, but leaves the concrete representation
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
        of some slots open.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
        These are:
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
            - if and how the geometry information (width + height) are cached,
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
            - if and how the expanded-state is remembered.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
            - if and how the underlying model is fetched
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
        The old class used private slots for the first three (width-height-isExpanded),
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
        but did not keep a reference to the model. This leads to a very poor performance,
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
        as many algorithms degenerated to O(n log(n)) or even O(n^2) time behavior,
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
        as the model was fetched by walking along the parent chain - sometimes for every item
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
        in a long list.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
        The old class is still around and may be used for small trees,
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
        but we recommend rewriting applications to use the new CompactHierarchicalItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
        class, which behaves the same on the outside, but uses clever tricks to be both more
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
        space efficient (saving 2 slots) and time efficient (caching the model).
4749
13a7e6db823b class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4746
diff changeset
    64
        For this, make sure that the subclass does not access the instvars isExpanded, width and height
13a7e6db823b class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4746
diff changeset
    65
        directly, but uses the getters isExpanded, width and height and the setters setExpanded:, width: and height:
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    [Instance variables:]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
        parent      <Item, List or nil>         parent or my HierarchicalList.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
        children    <Collection or nil>         list of children
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    [author:]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
        Claus Gittinger (redesign and refactoring)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    [see also:]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
        HierarchicalItem (the old item class)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
        HierarchicalList (typical model)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
        HierarchicalListView (typical user of me)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
!AbstractHierarchicalItem class methodsFor:'instance creation'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
new
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
    ^ (self basicNew) initialize
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
parent:aParent
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    |item|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    item := self new.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    item parent:aParent.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
  ^ item
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
!AbstractHierarchicalItem class methodsFor:'protocol'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
doResetExtentOnChange
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    "true: the extent of the item is reset if a change
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
     notification is raised from the item. the default is true
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    "
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    ^ true
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
!AbstractHierarchicalItem methodsFor:'accessing'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
getChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    "returns the children as they are present (or not); not going to the model..."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
    ^ children
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
level
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    "returns the level starting with 0 for the root"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    |item level|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    item := self.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    level := 0.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    [ (item := item parentOrModel) notNil] whileTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
        level := level + 1.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
        level > 100000 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
            self halt:'possibly recursive item hierarchy'
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    ^ level
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    "Modified: / 09-07-2010 / 08:56:27 / cg"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
parent
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
    "returns the parent or nil"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
    ^ (parent notNil and:[parent isHierarchicalItem]) 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
        ifTrue:[parent]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
        ifFalse:[nil]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
parent:aParent
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    "set the parent (or the model if the item is the root item)"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    parent := aParent
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
rootItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
    "returns the root item"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    parent isHierarchicalItem ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
        ^ parent rootItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    ^ self
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
!AbstractHierarchicalItem methodsFor:'accessing-children'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
at:anIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
    "return the child at anIndex if valid;
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
     if the index is invalid, nil is returned"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
    ^ self at:anIndex ifAbsent:nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
at:anIndex ifAbsent:exceptionBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
    "return the child at anIndex if valid; if the index is
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
     invalid, the result of evaluating the exceptionBlock is returned."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
    |list|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
    (list := self children) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
        ^ list at:anIndex ifAbsent:exceptionBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    ^ exceptionBlock value
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
at:anIndex put:anItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
    "replace a child by a new item. return anItem (sigh)"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
    |children oldItem visIndex model expFlag|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
    anItem isNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
        self removeFromIndex:anIndex toIndex:anIndex.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
        ^ nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
    anItem parent:self.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
    (model := self model) isNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
        self children at:anIndex put:anItem.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
        ^ anItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    model criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
        children := self children.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
        oldItem  := children at:anIndex.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
        oldItem isExpanded ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
            oldItem collapse
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
        visIndex := model identityIndexOf:oldItem.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
        expFlag  := anItem isExpanded.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
        anItem setExpanded:false.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
        children at:anIndex put:anItem.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
        visIndex ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
            model at:visIndex put:anItem.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
        self changed:#redraw.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
        expFlag ifTrue:[ anItem expand ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
    ^ anItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
children:aListOfChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    "set a new list of children"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
        self removeAll.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
        self addAll:aListOfChildren beforeIndex:1
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    ^ aListOfChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
first
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    "returns the first child
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
    "
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    ^ self at:1
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
last
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    "returns the last child"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
    ^ self at:(self size)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
second
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
    "returns the second child"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    ^ self at:2
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
!AbstractHierarchicalItem methodsFor:'accessing-hierarchy'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
collapse
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    "hide all my subitems"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
    |visChd index|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
    self canCollapse ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
        self setExpanded:false.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
        self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
            (index := self listIndex) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
                "/ do not call :#size: children will be autoloaded !!!!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
                (visChd := children size) ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
                    self nonCriticalFrom:1 to:nil do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
                        visChd := visChd + el numberOfVisibleChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
                    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
                    self model itemRemoveFromIndex:(index + 1) toIndex:(index + visChd).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
                ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
                index ~~ 0 ifTrue:[self hierarchyChanged].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
            ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
enforcedExpand
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
    "expand children - even if there are no children,
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
     the item is initially expanded (but this might be undone later,
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
     when we know that no children are there"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
    self expand:true
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
expand
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
    "expand children - but only if there are children 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
     (i.e. this cannot be used before the childInfo is valid;
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
      aka not before the updateTask came along this item)"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
    self expand:false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
expand:enforced
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
    "expand children"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
    |index list|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
    "/ test whether the item already is expanded; #canExpand could be redefined
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
    "/ without checking whether the node is expanded (happens already) !!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
    self isExpanded ifTrue:[ ^ self ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
    (enforced not and:[self canExpand not]) ifTrue:[ ^ self ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
        (index := self listIndex) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
            "/ must set expand-flag to false, otherwise change notifications
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
            "/ are raised during lazy auto creation (to the list).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
            self setExpanded:false.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
            list := self children.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
            self setExpanded:true.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
            list notEmptyOrNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
                list := OrderedCollection new.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
                self addVisibleChildrenTo:list.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
                self model itemAddAll:list beforeIndex:(index + 1).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
            ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
            index ~~ 0 ifTrue:[self hierarchyChanged].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
        ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
            self setExpanded:true
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
makeVisible
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
    "expand all my parents"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
    (parent notNil and:[parent isHierarchicalItem]) ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
        self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
            parent makeVisible.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
            parent expand.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
recursiveCollapse
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
    "collapse all item and sub items
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
     **** must be expanded
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
    "
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
    |visChd index|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
    self canCollapse ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
        self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
            (index := self listIndex) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
                "/ do not call :#size: children will be autoloaded !!!!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
                (visChd := children size) ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
                    self nonCriticalFrom:1 to:nil do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
                        visChd := visChd + el numberOfVisibleChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
                    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
                ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
                self recursiveSetCollapsed.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
                visChd ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
                    self model itemRemoveFromIndex:(index + 1)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
                                           toIndex:(index + visChd)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
                ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
                index ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
                    self hierarchyChanged
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
                ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
            ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
                self recursiveSetCollapsed
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
            ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
recursiveExpand
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
    "expand children and sub-children
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
     **** must be collapsed"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    "/ test whether the item already is expanded; #canExpand could be redefined
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
    "/ without checking whether the node is expanded (happens already) !!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
    |index list|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
    self isExpanded ifTrue:[ ^ self ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
    self canExpand ifFalse:[ ^ self ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
    self setExpanded:true.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
        self size ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
            index := self listIndex.    "/ get the visible list index
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
            index isNil ifTrue:[        "/ not visible
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
                self nonCriticalFrom:1 to:nil do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
                    el setExpanded:true
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
                ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
            ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
                list := OrderedCollection new.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
                self recursiveSetExpandedAndAddToList:list.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
                self model itemAddAll:list beforeIndex:(index + 1).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
                index ~~ 0 ifTrue:[self hierarchyChanged]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
            ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
recursiveToggleExpand
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    "if the item is collapsed, the item and all its sub-items
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
     are expanded otherwise collapsed"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
    self isExpanded ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
        self recursiveCollapse
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
    ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
        self recursiveExpand
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
toggleExpand
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
    "if the item is collapsed, the item is expanded otherwise collapsed"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
    self isExpanded ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
        self collapse
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
    ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
        self expand
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
!AbstractHierarchicalItem methodsFor:'accessing-mvc'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
application
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
    "returns the responsible application or nil"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
    |model|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
    (model := self model) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
        ^ model application
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
    ^ nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
applicationsDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
    "evaluate the block for each dependent application"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
    |model|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
    (model := self model) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
        model applicationsDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
model
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
    "returns the hierachicalList model or nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
     This is a stupid implementation here, in that the top-item's parent is assumed to
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
     be the model of the tree, and that is returned.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
     This saves a slot in every node, but makes some algorithms O(n*log n) or even O(n^2).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
     So be aware of the performance penalty"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
    |item next|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
    item := self. 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
    [ (next := item parentOrModel) notNil ] whileTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
        item := next.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
    item isHierarchicalItem ifFalse:[^ item].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
    ^ nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
!AbstractHierarchicalItem methodsFor:'adding & removing'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
add:aChildItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
    "add a child at end"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
    ^ self add:aChildItem beforeIndex:(self children size + 1).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
add:aChildItem after:aChild
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
    "add an item after an existing item"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
    |index|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
    index := self identityIndexOf:aChild.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
    index == 0 ifTrue:[ self subscriptBoundsError:index ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
    self add:aChildItem beforeIndex:(index + 1).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
    ^ aChildItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
add:aChildItem afterIndex:anIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
    "add an item after an index"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
    ^ self add:aChildItem beforeIndex:(anIndex + 1).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
add:aChildItem before:aChild
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
    "add an item before an existing item"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
    |index|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
    index := self identityIndexOf:aChild.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
    index == 0 ifTrue:[ self subscriptBoundsError:index ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
    self add:aChildItem beforeIndex:index.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486
    ^ aChild
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   487
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
add:aChildItem beforeIndex:anIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   490
    "add an item before an index"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
    aChildItem notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
        self addAll:(Array with:aChildItem) beforeIndex:anIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
    ^ aChildItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
add:aChild sortBlock:aBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
    "add a child sorted"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
        self basicAdd:aChild sortBlock:aBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
    ^ aChild
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   507
addAll:aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
    "add children at the end"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
    ^ self addAll:aList beforeIndex:(self children size + 1)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
addAll:aList before:aChild
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
    "add an item before an existing item"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
    |index|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
    index := self identityIndexOf:aChild.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
    index == 0 ifTrue:[ self subscriptBoundsError:index ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
    ^ self addAll:aList beforeIndex:index
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
addAll:aList beforeIndex:anIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525
    "add children before an index"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   526
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   527
    aList size ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   528
        self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   529
            self basicAddAll:aList beforeIndex:anIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   530
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   531
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   532
    ^ aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   533
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   534
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   535
addAll:aList sortBlock:aBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   536
    "add children sorted"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   537
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
    aList size == 0 ifTrue:[ ^ aList ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   539
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   540
    aBlock isNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
        self addAll:aList.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
    ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
        self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
            aList do:[:el| self basicAdd:el sortBlock:aBlock ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
    ^ aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   550
addAllFirst:aCollectionOfItems
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   551
    "add children at the beginning"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
    ^ self addAll:aCollectionOfItems beforeIndex:1
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   556
addAllLast:aCollectionOfItems
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   557
    "add children at the end"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   558
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   559
    ^ self addAll:aCollectionOfItems
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   562
addFirst:aChildItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
    "add a child at the beginning"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   565
    ^ self add:aChildItem beforeIndex:1.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   566
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   567
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   568
addLast:anItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   569
    "add a child at the end"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   570
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   571
    ^ self add:anItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   572
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   573
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   574
remove
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   575
    "remove the item"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   576
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   577
    parent notNil ifTrue:[                                      "check whether parent exists"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   578
        parent isHierarchicalItem ifTrue:[parent remove:self]   "parent is HierarchicalItem"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   579
                                 ifFalse:[parent root:nil]      "parent is HierarchicalList"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   580
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   581
    ^ self
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   582
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   583
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   584
remove:aChild
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   585
    "remove a child"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   586
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   587
    self removeIndex:(self identityIndexOf:aChild)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   588
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   589
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   590
removeAll
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   591
    "remove all children"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   592
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   593
    |size|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   594
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   595
    (size := children size) ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   596
        self removeFromIndex:1 toIndex:size
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   597
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   598
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   599
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   600
removeAll:aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   601
    "remove all children in the collection"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   602
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   603
    |index|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   604
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   605
    aList size ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   606
        self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   607
            aList do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   608
                (index := self identityIndexOf:el) ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   609
                    self removeIndex:index
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   610
                ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   611
            ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   612
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   613
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   614
    ^ aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   615
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   616
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   617
removeAllIdentical:aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   618
    "remove all children in the collection"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   619
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   620
    self removeAll:aList.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
    ^ aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   622
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   623
    "Created: / 20-09-2010 / 09:43:06 / sr"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   624
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   625
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   626
removeFromIndex:startIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   627
    "remove the children from startIndex up to end of children"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   628
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   629
    ^ self removeFromIndex:startIndex toIndex:(children size)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   630
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   631
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   632
removeFromIndex:startIndex toIndex:stopIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
    "remove the children from startIndex up to and including
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   634
     the child under stopIndex.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   635
     Returns the receiver."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   636
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   637
    |nrOfChildren stop|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   638
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   639
    nrOfChildren := children size.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   640
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   641
    (startIndex <= stopIndex and:[startIndex <= nrOfChildren]) ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   642
        stop := stopIndex min:nrOfChildren.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   643
        
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   644
        self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   645
            self basicRemoveFromIndex:startIndex toIndex:stop
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   646
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   647
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   648
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   649
    children size == 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   650
        self clearExpandedWhenLastChildWasRemoved ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   651
            self setExpanded:false.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   652
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   653
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   654
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   655
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   656
removeIndex:anIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   657
    "remove the child at an index"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   658
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   659
    anIndex > 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   660
        self removeFromIndex:anIndex toIndex:anIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   661
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   662
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   663
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   664
!AbstractHierarchicalItem methodsFor:'basic adding & removing'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   665
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   666
basicAdd:aChild sortBlock:aBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   667
    "add a child sorted"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   668
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   669
    |size list|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   670
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   671
    size := children size.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   672
    list := Array with:aChild.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   673
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   674
    (aBlock notNil and:[size ~~ 0]) ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   675
        children keysAndValuesDo:[:i :el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   676
            (aBlock value:aChild value:el) ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   677
                self basicAddAll:list beforeIndex:i.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   678
                ^ aChild
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   679
            ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   680
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   681
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   682
    self basicAddAll:list beforeIndex:(size + 1).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   683
    ^ aChild.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   684
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   685
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   686
basicAddAll:aList beforeIndex:anIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   687
    "add children before an index"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   688
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   689
    |coll model notify index size|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   690
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   691
    size := children size.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   692
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   693
    anIndex == 1 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   694
        notify := self
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   695
    ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   696
        anIndex > size ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   697
            anIndex > (1 + size) ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   698
                ^ self subscriptBoundsError:index
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   699
            ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   700
            notify := self at:size
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   701
        ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
            notify := nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   703
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   704
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   705
    children isArray ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   706
        children := children asOrderedCollection
4795
eead012852f9 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4758
diff changeset
   707
    ] ifFalse:[
eead012852f9 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4758
diff changeset
   708
        size == 0 ifTrue:[
eead012852f9 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4758
diff changeset
   709
            children := OrderedCollection new
eead012852f9 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4758
diff changeset
   710
        ].
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   712
    aList do:[:anItem| anItem parent:self ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
    children addAll:aList beforeIndex:anIndex.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
    (model := self model) isNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   716
        ^ aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   718
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   719
    self isExpanded ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   720
        notify notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
            notify changed
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   722
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   723
        ^ aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   724
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   725
    (index := self listIndex) isNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   726
        ^ aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   727
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   728
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   729
    children from:1 to:(anIndex - 1) do:[:anItem|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   730
        index := 1 + index + anItem numberOfVisibleChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   731
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   732
    coll := OrderedCollection new.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   734
    aList do:[:anItem|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   735
        coll add:anItem.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   736
        anItem addVisibleChildrenTo:coll.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   737
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   738
    model itemAddAll:coll beforeIndex:(index + 1).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   739
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   740
    notify notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   741
        notify changed
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   742
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   743
    ^ aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   744
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   745
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   746
basicRemoveFromIndex:startIndex toIndex:stopIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   747
    "remove the children from startIndex up to and including
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   748
     the child under stopIndex."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   749
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   750
    |model notify
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   751
     index "{ Class:SmallInteger }"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   752
     start "{ Class:SmallInteger }"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   753
     stop  "{ Class:SmallInteger }"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   754
     size  "{ Class:SmallInteger }"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   755
    |
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   756
    size  := self children size.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   757
    stop  := stopIndex.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   758
    start := startIndex.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   759
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   760
    (stop <= size and:[start between:1 and:stop]) ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   761
        ^ self subscriptBoundsError:index
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   762
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   763
    start == 1 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   764
        notify := self
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   765
    ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   766
        stop == size ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   767
            notify := self at:(start - 1)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   768
        ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   769
            notify := nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   770
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   771
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   772
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   773
    (model := self model) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   774
        index := model identityIndexOf:(children at:start).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   775
        size  := stop - start + 1.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   776
    ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   777
        index := 0
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   778
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   779
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   780
    children from:start to:stop do:[:aChild|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   781
        index ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   782
            size := size + aChild numberOfVisibleChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   783
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   784
        aChild parent:nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   785
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   786
    children removeFromIndex:start toIndex:stop.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   787
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   788
    index ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   789
        model itemRemoveFromIndex:index toIndex:(index + size - 1)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   790
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   791
    notify notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   792
        notify changed
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   793
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   794
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   795
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   796
!AbstractHierarchicalItem methodsFor:'change & update'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   797
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   798
changed:what with:anArgument
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   799
    "the item changed; raise change notification
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   800
        #icon           icon is modified; height and width are unchanged
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   801
        #hierarchy      collapsed/expanded; height and width are unchanged
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   802
        #redraw         redraw but height and width are unchanged
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   803
        .......         all others: the height and width are reset
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   804
    "
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   805
    |model|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   806
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   807
    what ~~ #redraw ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   808
        (what ~~ #hierarchy and:[what ~~ #icon]) ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   809
            self class doResetExtentOnChange ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   810
                self makeWidthAndHeightUnknown
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   811
            ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   812
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   813
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   814
    (model := self model) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   815
        model itemChanged:what with:anArgument from:self
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   816
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   817
    super changed:what with:anArgument
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   818
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   819
    "Modified: / 24-11-2010 / 17:21:20 / cg"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   820
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   821
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   822
childrenOrderChanged
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   823
    "called if the order of the children changed by a user
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   824
     operation. Update the model and raise a change notification for
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   825
     each item which has changed its position
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   826
     triggered by the user operation !!"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   827
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   828
    |model visStart list|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   829
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   830
    self isExpanded   ifFalse:[ ^ self ].       "/ not expanded
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   831
    children size > 1 ifFalse:[ ^ self ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   832
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   833
    model := self model.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   834
    model isNil ifTrue:[^ self].                       "/ no model
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   835
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   836
    visStart := model identityIndexOf:self.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   837
    visStart == 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   838
        model root ~~ self ifTrue:[ ^ self ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   839
     "/ I'am the root but switched of by setting #showRoot to false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   840
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   841
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   842
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   843
        list := OrderedCollection new.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   844
        self addVisibleChildrenTo:list.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   845
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   846
        list do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   847
            visStart := visStart + 1.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   848
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   849
            (model at:visStart ifAbsent:el) ~~ el ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   850
                model at:visStart put:el
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   851
            ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   852
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   853
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   854
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   855
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   856
fontChanged
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   857
    "called if the font has changed.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   858
     Clear the precomputed width and height"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   859
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   860
    self makeWidthAndHeightUnknown.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   861
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   862
    children size ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   863
        children do:[:el| el fontChanged].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   864
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   865
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   866
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   867
hierarchyChanged
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   868
    "hierarchy changed; optimize redrawing"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   869
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   870
    self changed:#hierarchy with:nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   871
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   872
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   873
iconChanged
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   874
    "icon changed; optimize redrawing"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   875
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   876
    self changed:#icon with:nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   877
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   878
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   879
labelChanged
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   880
    "called if the label has changed.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   881
     Clear the precomputed width and height"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   882
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   883
    self makeWidthAndHeightUnknown.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   884
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   885
    "Created: / 17-01-2011 / 17:43:42 / cg"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   886
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   887
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   888
!AbstractHierarchicalItem methodsFor:'enumerating'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   889
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   890
collect:aBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   891
    "for each child in the receiver (non recursive), evaluate the argument, aBlock
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   892
     and return a new collection with the results"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   893
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   894
    |coll|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   895
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   896
    coll := OrderedCollection new.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   897
    self do:[:el| coll add:(aBlock value:el) ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   898
    ^ coll
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   899
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   900
    "Modified (comment): / 25-11-2016 / 08:42:19 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   901
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   902
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   903
contains:aBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   904
    "evaluate aOneArgBlock for each of the receiver's children (non recursive).
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   905
     Return true and skip remaining elements, if aBlock ever returns true, 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   906
     otherwise return false"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   907
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   908
    self do:[:el | (aBlock value:el) ifTrue:[^ true] ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   909
    ^ false
5362
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
   910
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   911
    "Modified (comment): / 25-11-2016 / 08:43:31 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   912
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   913
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   914
do:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   915
    "evaluate a block for each child (non recursive)"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   916
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   917
    self from:1 to:nil do:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   918
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   919
    "Modified (comment): / 25-11-2016 / 08:43:36 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   920
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   921
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   922
from:startIndex do:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   923
    "evaluate a block on each child starting with the
5362
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
   924
     child at startIndex to the end."
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
   925
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   926
    self from:startIndex to:nil do:aOneArgBlock
5362
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
   927
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
   928
    "Modified (comment): / 25-11-2016 / 07:45:55 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   929
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   930
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   931
from:startIndex reverseDo:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   932
    "evaluate a block on each child (non recursive) starting at end to the startIndex"
5362
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
   933
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   934
    self from:startIndex to:nil reverseDo:aOneArgBlock
5362
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
   935
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   936
    "Modified (comment): / 25-11-2016 / 08:43:42 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   937
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   938
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   939
from:startIndex to:endIndex do:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   940
    "evaluate a block on each child (non recursive),
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   941
     starting with the child at startIndex to the endIndex."
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   942
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   943
    |res|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   944
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   945
    self size < startIndex ifTrue:[^ self "nil"].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   946
    res := nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   947
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   948
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   949
        res := self nonCriticalFrom:startIndex to:endIndex do:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   950
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   951
    "/ ^ res - return the receiver, as all other collections do
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   952
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   953
    "Modified (comment): / 25-11-2016 / 08:43:51 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   954
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   955
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   956
from:startIndex to:endIndex reverseDo:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   957
    "evaluate a block on each child (non recursive),
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   958
     starting with the child at endIndex to the startIndex."
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   959
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   960
    |res|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   961
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   962
    self size < startIndex ifTrue:[^ self "nil"].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   963
    res := nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   964
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   965
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   966
        res := self nonCriticalFrom:startIndex to:endIndex reverseDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   967
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   968
    "/ ^ res - return the receiver, as all other collections do
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   969
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   970
    "Modified (comment): / 25-11-2016 / 08:43:58 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   971
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   972
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   973
keysAndValuesDo:aTwoArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   974
    "evaluate the argument, aBlock for every child (non recursive),
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   975
     passing both index and element as arguments."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   976
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   977
    |key res|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   978
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   979
    key := 1.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   980
    res := nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   981
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   982
    self do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   983
        res := el value:key value:el.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   984
        key := key + 1.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   985
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   986
    "/ ^ res - no: return the receiver, as all other collections do
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   987
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   988
    "Modified (comment): / 25-11-2016 / 08:44:03 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   989
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   990
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   991
keysAndValuesReverseDo:aTwoArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   992
    "evaluate the argument, aBlock in reverse order for every child (non recursive), 
5362
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
   993
     passing both index and element as arguments."
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   994
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   995
    |res|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   996
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   997
    self size == 0 ifTrue:[^ self "nil"].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   998
    res := nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   999
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1000
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1001
        res := self nonCriticalKeysAndValuesReverseDo:aTwoArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1002
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1003
    "/ ^ res - no: return the receiver, as all other collections do
5362
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
  1004
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1005
    "Modified (comment): / 25-11-2016 / 08:44:06 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1006
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1007
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1008
recursiveCollect:aBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1009
    "for each child in the receiver, evaluate the argument, aBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1010
     and return a new collection with the results.
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1011
     Warning: this only enumerates already visible child elements
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1012
     i.e. any collapsed items are not visited."
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1013
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1014
    |coll|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1015
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1016
    coll := OrderedCollection new.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1017
    self recursiveDo:[:el| coll add:(aBlock value:el) ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1018
    ^ coll
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1019
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1020
    "Modified (comment): / 25-11-2016 / 08:43:20 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1021
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1022
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1023
recursiveDo:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1024
    "evaluate a block on each item and all the sub-items.
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1025
     Warning: this only enumerates already visible child elements
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1026
     i.e. any collapsed items are not visited."
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1027
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1028
    self do:[:aChild|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1029
        aOneArgBlock value:aChild.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1030
        aChild nonCriticalRecursiveDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1031
    ].
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1032
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1033
    "Modified (comment): / 25-11-2016 / 08:43:04 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1034
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1035
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1036
recursiveReverseDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1037
    "evaluate a block on each item and all the sub-items;
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1038
     proccesing children in reverse direction.
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1039
     Warning: this only enumerates already visible child elements
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1040
     i.e. any collapsed items are not visited."
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1041
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1042
    self reverseDo:[:aChild|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1043
        aChild nonCriticalRecursiveReverseDo:aOneArgBlock.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1044
        aOneArgBlock value:aChild.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1045
    ].
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1046
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1047
    "Modified (comment): / 25-11-2016 / 08:43:09 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1048
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1049
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1050
recursiveSelect:aBlock
5362
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
  1051
    "return a new collection with all children and subChildren from the receiver, 
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1052
     for which the argument aBlock evaluates to true.
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1053
     Warning: this only enumerates already visible child elements
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1054
     i.e. any collapsed items are not visited."
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1055
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1056
    |coll|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1057
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1058
    coll := OrderedCollection new.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1059
    self recursiveDo:[:el| (aBlock value:el) ifTrue:[coll add:el] ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1060
    ^ coll
5362
070e173ba167 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5325
diff changeset
  1061
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1062
    "Modified (comment): / 25-11-2016 / 08:43:12 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1063
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1064
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1065
reverseDo:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1066
    "evaluate a block on each child (non recursive) in reverse direction"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1067
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1068
    self from:1 reverseDo:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1069
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1070
    "Modified (comment): / 25-11-2016 / 08:44:12 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1071
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1072
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1073
select:aBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1074
    "return a new collection with all items from the receiver (non recursive), 
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1075
     for which the argument aBlock evaluates to true."
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1076
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1077
    |coll|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1078
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1079
    coll := OrderedCollection new.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1080
    self do:[:el| (aBlock value:el) ifTrue:[coll add:el] ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1081
    ^ coll
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1082
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1083
    "Modified (comment): / 25-11-2016 / 08:44:20 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1084
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1085
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1086
withAllDo:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1087
    "recursively evaluate aOneArgBlock on each item and subitem including self"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1088
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1089
    aOneArgBlock value:self.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1090
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1091
    self do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1092
        aOneArgBlock value:el.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1093
        el nonCriticalRecursiveDo:aOneArgBlock.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1094
    ].
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1095
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1096
    "Modified (comment): / 25-11-2016 / 08:44:49 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1097
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1098
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1099
!AbstractHierarchicalItem methodsFor:'enumerating parents'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1100
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1101
parentsDetect:aBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1102
    "find the first parent, for which evaluation of the block returns
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1103
     true; if none does so, report an error"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1104
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1105
    ^ self parentsDetect:aBlock ifNone:[self errorNotFound]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1106
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1107
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1108
parentsDetect:aBlock ifNone:anExceptionBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1109
    "find the first parent, for which evaluation of the block returns
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1110
     true; if none does so, return the evaluation of anExceptionBlock"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1111
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1112
    |prnt|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1113
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1114
    prnt := self.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1115
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1116
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1117
        [(prnt := prnt parent) notNil and:[prnt isHierarchicalItem]] whileTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1118
            (aBlock value:prnt) ifTrue:[^ prnt]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1119
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1120
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1121
    ^ anExceptionBlock value
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1122
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1123
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1124
parentsDo:aBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1125
    "evaluate a block for each parent"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1126
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1127
    |prnt|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1128
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1129
    prnt := self.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1130
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1131
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1132
        [(prnt := prnt parent) notNil and:[prnt isHierarchicalItem]] whileTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1133
            aBlock value:prnt
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1134
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1135
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1136
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1137
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1138
!AbstractHierarchicalItem methodsFor:'initialization'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1139
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1140
initialize
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1141
    self setExpanded:false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1142
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1143
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1144
!AbstractHierarchicalItem methodsFor:'private'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1145
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1146
addVisibleChildrenTo:aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1147
    "add all visible children and sub-children to the list"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1148
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1149
    self isExpanded ifFalse:[^ self].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1150
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1151
    self nonCriticalFrom:1 to:nil do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1152
        aList add:el.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1153
        el addVisibleChildrenTo:aList.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1154
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1155
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1156
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1157
clearExpandedWhenLastChildWasRemoved
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1158
    ^ true
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1159
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1160
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1161
criticalDo:aBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1162
    |model|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1163
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1164
    (model := self model) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1165
        model recursionLock critical:aBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1166
    ] ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1167
        aBlock value
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1168
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1169
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1170
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1171
listIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1172
    "returns the visible index or nil; for a non-visible root, 0 is returned"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1173
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1174
    |index model|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1175
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1176
    (model := self model) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1177
        index := model identityIndexOf:self.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1178
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1179
        (index ~~ 0 or:[parent == model]) ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1180
            ^ index
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1181
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1182
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1183
    ^ nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1184
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1185
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1186
numberOfVisibleChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1187
    "returns number of all visible children including subchildren"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1188
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1189
    |size|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1190
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1191
    self isExpanded ifFalse:[^ 0].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1192
    size := 0.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1193
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1194
    self nonCriticalFrom:1 to:nil do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1195
        size := 1 + size + el numberOfVisibleChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1196
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1197
    ^ size
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1198
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1199
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1200
parentOrModel
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1201
    "returns the parent without checking for item or model"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1202
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1203
    ^ parent
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1204
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1205
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1206
!AbstractHierarchicalItem methodsFor:'private-displaying'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1207
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1208
displayLabel:aLabel h:lH on:aGC x:x y:y h:h
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1209
    <resource: #obsolete>
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1210
 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1211
    "display the label at x@y"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1212
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1213
    "/ obsolete - left in for backward compatibility
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1214
    self displayLabel:aLabel h:lH on:aGC x:x y:y h:h isHighlightedAsSelected:false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1215
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1216
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1217
displayLabel:aLabel h:lH on:aGC x:x y:y h:h isHighlightedAsSelected:isHighlightedAsSelected
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1218
    "display the label at x@y"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1219
4758
1095f8fdf167 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4751
diff changeset
  1220
    |y0|
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1221
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1222
    lH ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1223
        y0 := y - ((lH + 1 - h) // 2).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1224
        y0 := y0 + (aLabel ascentOn:aGC).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1225
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1226
        (aLabel isString not
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1227
        or:[(aLabel includes:(Character cr)) not]) ifTrue:[
4758
1095f8fdf167 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4751
diff changeset
  1228
            |labelShown|
1095f8fdf167 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4751
diff changeset
  1229
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1230
            labelShown := aLabel.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1231
            isHighlightedAsSelected ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1232
                (aLabel isText and:[aLabel hasChangeOfEmphasis]) ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1233
                    labelShown := Text string:aLabel string emphasisCollection:aLabel emphasis asArray.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1234
                    labelShown emphasisAllRemove:#color.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1235
                ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1236
            ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1237
            ^ labelShown displayOn:aGC x:x y:y0
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1238
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1239
4758
1095f8fdf167 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4751
diff changeset
  1240
        aLabel asCollectionOfLines do:[:el|
1095f8fdf167 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4751
diff changeset
  1241
            |labelShown|
1095f8fdf167 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4751
diff changeset
  1242
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1243
            labelShown := el.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1244
            isHighlightedAsSelected ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1245
                (el isText and:[el hasChangeOfEmphasis]) ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1246
                    labelShown := Text string:el string emphasisCollection:el emphasis asArray.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1247
                    labelShown emphasisAllRemove:#color.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1248
                ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1249
            ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1250
            labelShown displayOn:aGC x:x y:y0.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1251
            y0 := y0 + (el heightOn:aGC)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1252
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1253
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1254
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1255
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1256
heightOf:aLabel on:aGC
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1257
    "returns the height of the label or 0"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1258
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1259
    |h|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1260
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1261
    aLabel isSequenceable ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1262
        ^ aLabel notNil ifTrue:[aLabel heightOn:aGC] ifFalse:[0]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1263
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1264
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1265
    aLabel isString ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1266
        h := 0.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1267
        aLabel do:[:el|h := h max:(self heightOf:el on:aGC)].
4746
25341fd92e38 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4733
diff changeset
  1268
        ^ h
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1269
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1270
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1271
    h := 1 + (aLabel occurrencesOf:(Character cr)).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1272
    ^ h * (aGC font height)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1273
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1274
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1275
widthOf:aLabel on:aGC
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1276
    "returns the height of the label or 0"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1277
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1278
    |w|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1279
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1280
    aLabel isSequenceable ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1281
        ^ aLabel notNil ifTrue:[aLabel widthOn:aGC] ifFalse:[0]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1282
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1283
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1284
    aLabel isString ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1285
        w := -5.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1286
        aLabel do:[:el|w := w + 5 + (self widthOf:el on:aGC)].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1287
        ^ w
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1288
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1289
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1290
    (aLabel indexOf:(Character cr)) == 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1291
        ^ aLabel widthOn:aGC
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1292
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1293
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1294
    w := 0.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1295
    aLabel asCollectionOfLines do:[:el|w := w max:(el widthOn:aGC)].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1296
    ^ w
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1297
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1298
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1299
!AbstractHierarchicalItem methodsFor:'private-enumerating'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1300
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1301
nonCriticalDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1302
    "evaluate a block noncritical for each child."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1303
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1304
    ^ self nonCriticalFrom:1 to:nil do:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1305
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1306
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1307
nonCriticalFrom:startIndex to:endIndex do:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1308
    "evaluate a block noncritical for each child starting with the
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1309
     child at startIndex to the endIndex (if nil to end of list)."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1310
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1311
    |list size resp|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1312
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1313
    list := self children.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1314
    size := list size.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1315
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1316
    startIndex > size ifTrue:[^ nil].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1317
    resp := nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1318
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1319
    endIndex notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1320
        size := size min:endIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1321
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1322
    startIndex to:size do:[:i| 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1323
        |item|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1324
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1325
        item := list at:i ifAbsent:nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1326
        item isNil ifTrue:[^ resp].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1327
        resp := aOneArgBlock value:item.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1328
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1329
    ^ resp
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1330
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1331
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1332
nonCriticalFrom:startIndex to:endIndex reverseDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1333
    "evaluate a block non critical for each child starting with the
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1334
     child at endIndex (if nil to end of list) to startIndex."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1335
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1336
    |list size resp|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1337
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1338
    list := self children.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1339
    size := list size.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1340
    resp := nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1341
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1342
    endIndex notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1343
        size := size min:endIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1344
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1345
    size to:startIndex by:-1 do:[:i| 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1346
        |item|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1347
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1348
        item := list at:i ifAbsent:nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1349
        item isNil ifTrue:[^ resp].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1350
        resp := aOneArgBlock value:item.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1351
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1352
    ^ resp
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1353
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1354
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1355
nonCriticalKeysAndValuesReverseDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1356
    "evaluate the argument, aBlock in reverse order for every
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1357
     child, passing both index and element as arguments."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1358
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1359
    |list size resp|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1360
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1361
    list := self children.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1362
    size := list size.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1363
    resp := nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1364
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1365
    size to:1 by:-1 do:[:i| 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1366
        |item|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1367
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1368
        item := list at:i ifAbsent:nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1369
        item isNil ifTrue:[^ resp].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1370
        resp := aOneArgBlock value:i value:item.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1371
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1372
    ^ resp
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1373
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1374
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1375
nonCriticalRecursiveDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1376
    "evaluate the block non critical for each item and all the sub-items"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1377
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1378
    self nonCriticalFrom:1 to:nil do:[:eachChild|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1379
        aOneArgBlock value:eachChild.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1380
        eachChild nonCriticalRecursiveDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1381
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1382
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1383
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1384
nonCriticalRecursiveReverseDo:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1385
    "evaluate the block non critical for each item and all the sub-items;
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1386
     proccesing children in reverse direction"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1387
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1388
    self nonCriticalFrom:1 to:nil reverseDo:[:eachChild|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1389
        eachChild nonCriticalRecursiveReverseDo:aOneArgBlock.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1390
        aOneArgBlock value:eachChild.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1391
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1392
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1393
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1394
nonCriticalRecursiveSort:aSortBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1395
    "evaluate a block noncritical for each child."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1396
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1397
    |unsorted sorted|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1398
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1399
    unsorted := children.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1400
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1401
    unsorted size ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1402
        sorted := unsorted sort:aSortBlock.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1403
        sorted do:[:el| el nonCriticalRecursiveSort:aSortBlock ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1404
        children := sorted.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1405
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1406
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1407
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1408
!AbstractHierarchicalItem methodsFor:'private-hierarchy'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1409
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1410
recursiveSetCollapsed
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1411
    "collapse all children and sub-children without notifications"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1412
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1413
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1414
        self recursiveSetCollapsedHelper
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1415
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1416
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1417
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1418
recursiveSetCollapsedHelper
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1419
    "private helper.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1420
     collapse all children and sub-children without notifications.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1421
     Helper only - does not lock"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1422
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1423
    self setExpanded:false.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1424
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1425
    "/ do not call #size: children will be autoloaded !!!!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1426
    children size ~~ 0 ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1427
        self nonCriticalFrom:1 to:nil do:[:eachChild| 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1428
            eachChild canRecursiveCollapse ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1429
                eachChild recursiveSetCollapsedHelper
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1430
            ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1431
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1432
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1433
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1434
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1435
recursiveSetExpandedAndAddToList:aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1436
    "expand all children and sub-children without notifications;
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1437
     add children to list"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1438
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1439
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1440
        self recursiveSetExpandedAndAddToListHelper:aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1441
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1442
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1443
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1444
recursiveSetExpandedAndAddToListHelper:aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1445
    "private helper.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1446
     expand all children and sub-children without notifications; adds children to aList
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1447
     Helper only - does not lock"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1448
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1449
    self setExpanded:true.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1450
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1451
    self nonCriticalFrom:1 to:nil do:[:eachChild|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1452
        aList add:eachChild.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1453
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1454
        eachChild canRecursiveExpand ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1455
            eachChild recursiveSetExpandedAndAddToListHelper:aList.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1456
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1457
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1458
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1459
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1460
!AbstractHierarchicalItem methodsFor:'private-to be redefined'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1461
4751
a1b6112d33ca class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4749
diff changeset
  1462
fetchChildren
a1b6112d33ca class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4749
diff changeset
  1463
    ^ nil
a1b6112d33ca class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4749
diff changeset
  1464
!
a1b6112d33ca class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4749
diff changeset
  1465
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1466
heightOn:aGC
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1467
    "return the height of the receiver, if it is to be displayed on aGC"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1468
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1469
    self subclassResponsibility.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1470
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1471
    "/ could in theory compute it for every draw operation;
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1472
    "/ in practice, this is not a good idea, as it could make drawing very slow
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1473
    "/ (unless that info can be easily computed)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1474
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1475
    "/ so we force programmers to think about that issue and redefine this method
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1476
    "/ as required. If compuation is really cheap, it can be redefined as:
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1477
    "/ ^ self heightOf:(self label) on:aGC
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1478
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1479
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1480
isExpanded
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1481
    "returns true if the item is expanded"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1482
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1483
    self subclassResponsibility
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1484
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1485
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1486
makeWidthAndHeightUnknown
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1487
    "invalidate any cached with/height information"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1488
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1489
    "see comments in widthOn/heightOn"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1490
    self subclassResponsibility
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1491
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1492
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1493
setExpanded:aBoolean
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1494
    "set expanded flag without any computation or notification.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1495
     It is left to the subclasses responsibility, where this expanded state is stored;
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1496
     could be in the model (as a list of expanded items), in the item itself (as boolean flag),
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1497
     or somewhere else.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1498
     For huge trees, it may make sense to not store the expanded flag in a slot 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1499
     (in order to save space). See CompactHierarchicalItem as a clever example of how it can be
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1500
     stored without ANY additional space requirements."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1501
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1502
    self subclassResponsibility
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1503
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1504
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1505
widthOn:aGC
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1506
    "return the width of the receiver, if it is to be displayed on aGC"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1507
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1508
    self subclassResponsibility.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1509
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1510
    "/ could in theory compute it for every draw operation;
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1511
    "/ in practice, this is not a good idea, as it could make drawing very slow
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1512
    "/ (unless that info can be easily computed)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1513
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1514
    "/ so we force programmers to think about that issue and redefine this method
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1515
    "/ as required. If compuation is really cheap, it can be redefined as:
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1516
    "/ ^ self widthOf:(self label) on:aGC
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1517
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1518
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1519
!AbstractHierarchicalItem methodsFor:'protocol-accessing'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1520
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1521
children
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1522
    "returns a list of children. When first asked, the list is fetched, if it was
5116
c8aaea21d6cf #OTHER by mawalch
mawalch
parents: 4795
diff changeset
  1523
     built lazily.
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1524
     *** to optimize: either redefine this or fetchChildren by subClass"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1525
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1526
    children isNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1527
        children := self fetchChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1528
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1529
    ^ children
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1530
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1531
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1532
icon
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1533
    "returns the icon or nil;
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1534
     *** to optimize:redefine by subClass"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1535
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1536
    |model|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1537
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1538
    (model := self model) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1539
        ^ model iconFor:self
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1540
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1541
    ^ nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1542
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1543
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1544
label
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1545
    "returns the label displayed on aGC;
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1546
     *** to optimize:redefine by subClass"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1547
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1548
    |model|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1549
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1550
    (model := self model) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1551
        ^ model labelFor:self
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1552
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1553
    ^ nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1554
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1555
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1556
middleButtonMenu
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1557
    "returns the items middleButtonMenu or nil if no menu is defined.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1558
     If nil is returned, the view is asked for a menu."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1559
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1560
    <resource: #programMenu>
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1561
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1562
    |model|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1563
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1564
    (model := self model) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1565
        ^ model middleButtonMenuFor:self
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1566
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1567
    ^ nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1568
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1569
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1570
recursiveSortChildren:aSortBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1571
    |children|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1572
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1573
    (children := self children) notEmptyOrNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1574
        self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1575
            children sort:aSortBlock.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1576
            children do:[:aChild| aChild recursiveSortChildren:aSortBlock ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1577
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1578
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1579
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1580
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1581
sortChildren:aSortBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1582
    "sort the children inplace using the 2-arg block sortBlock for comparison"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1583
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1584
    <resource: #obsolete>
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1585
    self obsoleteMethodWarning:'use #sort:'.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1586
    self sort:aSortBlock.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1587
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1588
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1589
!AbstractHierarchicalItem methodsFor:'protocol-displaying'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1590
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1591
displayIcon:anIcon atX:x y:y on:aGC
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1592
    "called to draw the icon - can be redefined to manipulate the icon"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1593
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1594
    anIcon displayOn:aGC x:x y:y.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1595
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1596
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1597
displayOn:aGC x:x y:y h:h
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1598
    <resource: #obsolete>
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1599
    "draw the receiver in the graphicsContext, aGC"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1600
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1601
    "/ obsolete - left here for backward compatibility
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1602
    self displayOn:aGC x:x y:y h:h isHighlightedAsSelected:false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1603
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1604
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1605
displayOn:aGC x:x y:y h:h isHighlightedAsSelected:isHighlightedAsSelected
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1606
    "draw the receiver in the graphicsContext, aGC"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1607
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1608
    |label
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1609
     x0 "{ Class:SmallInteger }"|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1610
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1611
    label := self label.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1612
    label isNil ifTrue:[^ self].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1613
5325
caf5101b667a #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5116
diff changeset
  1614
    label isNonByteCollection ifFalse:[
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1615
        ^ self displayLabel:label h:(self heightOn:aGC) on:aGC x:x y:y h:h isHighlightedAsSelected:isHighlightedAsSelected
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1616
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1617
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1618
    x0 := x.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1619
    label do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1620
        el notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1621
            self displayLabel:el h:(self heightOf:el on:aGC) on:aGC x:x0 y:y h:h isHighlightedAsSelected:isHighlightedAsSelected.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1622
            x0 := x0 + 5 + (el widthOn:aGC).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1623
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1624
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1625
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1626
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1627
!AbstractHierarchicalItem methodsFor:'protocol-event processing'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1628
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1629
processButtonPress:button visibleX:visX visibleY: visY on: view
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1630
    "A mouse button was pressed on myself. The visX/visY coordinates
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1631
     are relative to the viewOrigin.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1632
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1633
     If this method returns TRUE, the other method
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1634
     #processButtonPress:x:y:on: IS NOT CALLED !!!!!!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1635
    "
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1636
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1637
    ^false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1638
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1639
    "Created: / 18-04-2013 / 09:56:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1640
    "Modified (comment): / 18-04-2013 / 11:04:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1641
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1642
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1643
processButtonPress:button x:x y:y
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1644
    "a mouse button was pressed in my label.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1645
     Return true, if the event is eaten (ignored by the gc).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1646
     By default, false is returned (should be handled by the gc)."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1647
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1648
    ^ false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1649
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1650
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1651
processButtonPress:button x:x y:y on:aGC
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1652
    "a mouse button was pressed in my label.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1653
     Return true, if the event is eaten (ignored by the gc).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1654
     By default, false is returned (should be handled by the gc)."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1655
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1656
    ^ self processButtonPress:button x:x y:y
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1657
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1658
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1659
processButtonPressOnIcon:button on:aGC
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1660
    "a mouse button was pressed in my icon.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1661
     Return true, if the event is eaten (ignored by the gc).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1662
     By default, false is returned (should be handled by the gc)."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1663
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1664
    ^ false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1665
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1666
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1667
!AbstractHierarchicalItem methodsFor:'protocol-monitoring'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1668
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1669
monitoringCycle
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1670
    "called every 'n' seconds by the model, if the monitoring
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1671
     cycle is enabled. The item can perform some checks, ..
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1672
     **** can be redefined by subclass to perform some actions
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1673
    "
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1674
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1675
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1676
!AbstractHierarchicalItem methodsFor:'protocol-queries'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1677
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1678
canCollapse
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1679
    "called before collapsing the item; can be redefined
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1680
     by subclass to omit the collapse operation"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1681
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1682
    ^ self isExpanded
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1683
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1684
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1685
canExpand
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1686
    "called before expanding the item; can be redefined
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1687
     by subclass to omit the expand operation"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1688
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1689
    ^ self hasChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1690
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1691
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1692
canRecursiveCollapse
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1693
    "called before collapsing the item; can be redefined
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1694
     by subclass to omit the collapse operation "
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1695
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1696
    ^ self canCollapse
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1697
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1698
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1699
canRecursiveExpand
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1700
    "called before expanding the item; can be redefined
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1701
     by subclass to omit the collapse operation"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1702
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1703
    ^ self canExpand
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1704
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1705
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1706
drawHorizontalLineUpToText
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1707
    "draw the horizizontal line for the selected item up to the text
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1708
     or on default to the start of the the vertical line; only used by
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1709
     the hierarchical view
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1710
    "
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1711
    ^ false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1712
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1713
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1714
hasChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1715
    "checks whether the item has children; 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1716
     the list needs not to be loaded yet( example. FileDirectory ).
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1717
     *** to optimize: redefine in subClass"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1718
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1719
    ^ self children size ~~ 0
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1720
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1721
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1722
hasIndicator
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1723
    "on default the indicator is drawn if the item has children"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1724
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1725
    ^ self hasChildren
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1726
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1727
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1728
isSelectable
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1729
    "returns true if the item is selectable. Can be redefined in subclasses"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1730
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1731
    ^ true
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1732
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1734
string
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1735
    "access the printable string used for stepping through a list
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1736
     searching for an entry starting with a character.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1737
     *** to optimize:redefine by subClass"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1738
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1739
    |label|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1740
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1741
    (label := self label) notNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1742
        label isString      ifTrue:[ ^ label string ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1743
        label isImageOrForm ifTrue:[ ^ nil ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1744
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1745
        label isSequenceable ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1746
            ^ label perform:#string ifNotUnderstood:nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1747
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1748
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1749
        label do:[:el||s|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1750
            (el notNil and:[el isImageOrForm not]) ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1751
                s := el perform:#string ifNotUnderstood:nil.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1752
                s notNil ifTrue:[^ s].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1753
            ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1754
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1755
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1756
    ^ nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1757
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1758
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1759
!AbstractHierarchicalItem methodsFor:'queries'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1760
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1761
isChildOf:anItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1762
    "returns true if the item is a child of anItem"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1763
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1764
    |item|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1765
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1766
    item := self.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1767
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1768
    [anItem ~~ item] whileTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1769
        ((item := item parent) notNil and:[item isHierarchicalItem]) ifFalse:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1770
            ^ false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1771
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1772
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1773
    ^ true
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1774
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1775
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1776
isCollapsed
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1777
    "returns true if the item is collapsed"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1778
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1779
    ^ self isExpanded not
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1780
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1781
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1782
isDirectoryItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1783
    ^ false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1784
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1785
    "Created: / 23-06-2006 / 12:47:05 / fm"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1786
    "Modified: / 23-02-2007 / 12:04:23 / User"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1787
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1788
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1789
isHierarchicalItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1790
    "used to decide if the parent is a hierarchical item or the model"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1791
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1792
    ^ true
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1793
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1794
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1795
isRealChildOf:anItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1796
    "returns true if the item is a child of anItem"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1797
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1798
    |item|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1799
    item := self parent.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1800
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1801
    [item notNil] whileTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1802
        item == anItem ifTrue:[^ true].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1803
        item := item parent.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1804
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1805
    ^ false
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1806
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1807
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1808
isRootItem
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1809
    "returns true if the item is the root item"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1810
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1811
    ^ parent isHierarchicalItem not
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1812
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1813
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1814
size
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1815
    "return the number of children"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1816
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1817
    ^ self children size
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1818
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1819
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1820
!AbstractHierarchicalItem methodsFor:'searching'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1821
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1822
detect:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1823
    "find the first child (not recursive), for which evaluation of the block returns
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1824
     true; if none does so, report an error"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1825
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1826
    ^ self detect:aOneArgBlock ifNone:[self errorNotFound]
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1827
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1828
    "Modified (comment): / 25-11-2016 / 08:40:16 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1829
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1830
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1831
detect:aOneArgBlock ifNone:exceptionValue
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1832
    "find the first child (not recursive), for which evaluation of the block returns
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1833
     true; if none does so, return the value of anExceptionValue"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1834
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1835
    self do:[:el| 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1836
        (aOneArgBlock value:el) ifTrue:[^ el] 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1837
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1838
    ^ exceptionValue value
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1839
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1840
    "Modified (comment): / 25-11-2016 / 08:40:18 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1841
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1842
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1843
detectLast:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1844
    "find the last child (not recursive), for which evaluation of the block returns
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1845
     true; if none does so, an exception is raised"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1846
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1847
    ^ self detectLast:aOneArgBlock ifNone:[self errorNotFound]
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1848
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1849
    "Modified (comment): / 25-11-2016 / 08:40:21 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1850
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1851
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1852
detectLast:aOneArgBlock ifNone:anExceptionValue
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1853
    "find the last child (not recursive), for which evaluation of the block returns
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1854
     true; if none does so, return the value of anExceptionValue"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1855
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1856
    self reverseDo:[:el| (aOneArgBlock value:el) ifTrue:[^ el] ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1857
    ^ anExceptionValue value
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1858
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1859
    "Modified (comment): / 25-11-2016 / 08:40:23 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1860
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1861
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1862
findFirst:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1863
    "find the first child (not recursive), for which evaluation of the argument, aOneArgBlock
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1864
     returns true; return its index or 0 if none detected."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1865
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1866
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1867
    self keysAndValuesDo:[:i :el| (aOneArgBlock value:el) ifTrue:[^ i] ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1868
    ^ 0
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1869
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1870
    "Modified (comment): / 25-11-2016 / 08:40:25 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1871
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1872
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1873
findLast:aOneArgBlock
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1874
    "find the last child (not recursive), for which evaluation of the argument, aOneArgBlock
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1875
     returns true; return its index or 0 if none detected."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1876
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1877
    self keysAndValuesReverseDo:[:i :el| (aOneArgBlock value:el) ifTrue:[^ i] ].
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1878
    ^ 0
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1879
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1880
    "Modified (format): / 25-11-2016 / 08:40:33 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1881
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1882
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1883
identityIndexOf:aChild
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1884
    "return the index of aChild or 0 if not found. Compare using =="
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1885
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1886
    ^ self identityIndexOf:aChild startingAt:1
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1887
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1888
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1889
identityIndexOf:aChild startingAt:startIndex
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1890
    "return the index of aChild, starting search at startIndex.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1891
     Compare using ==; return 0 if not found"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1892
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1893
    |index|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1894
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1895
    index := startIndex.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1896
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1897
    self from:startIndex do:[:el|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1898
        el == aChild ifTrue:[^ index ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1899
        index := index + 1.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1900
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1901
    ^ 0
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1902
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1903
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1904
recursiveDetect:aOneArgBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1905
    "recursive find the first child, for which evaluation 
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1906
     of the block returns true; if none, nil is returned.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1907
     Warning: this only searches in already visible child elements
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1908
     i.e. any collapsed items are not searched."
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1909
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1910
    self recursiveDo:[:aChild|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1911
        (aOneArgBlock value:aChild) ifTrue:[^ aChild]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1912
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1913
    ^ nil
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1914
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1915
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1916
recursiveDetectLast:aBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1917
    "recursive find the last child, for which evaluation of the block returns true; 
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1918
     if none does so, nil is returned.
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1919
     Warning: this only searches in already visible child elements
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1920
     i.e. any collapsed items are not searched."
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1921
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1922
    self recursiveReverseDo:[:aChild|
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1923
        (aBlock value:aChild) ifTrue:[^ aChild].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1924
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1925
    ^ nil
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1926
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1927
    "Modified (comment): / 25-11-2016 / 08:41:42 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1928
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1929
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1930
withAllDetect:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1931
    "recursive find the first item including self, 
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1932
     for which evaluation of the block returns true; if none nil is returned.
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1933
     Warning: this only searches in already visible child elements
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1934
     i.e. any collapsed items are not searched."
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1935
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1936
    (aOneArgBlock value:self) ifTrue:[^ self].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1937
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1938
    ^ self recursiveDetect:aOneArgBlock
5363
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1939
4e25de452cea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
  1940
    "Modified (comment): / 25-11-2016 / 08:41:53 / cg"
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1941
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1942
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1943
!AbstractHierarchicalItem methodsFor:'sorting & reordering'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1944
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1945
recursiveSort:aSortBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1946
    "recursive sort the children inplace using the 2-arg block sortBlock for comparison"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1947
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1948
    self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1949
        children notEmptyOrNil ifTrue:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1950
            self nonCriticalRecursiveSort:aSortBlock.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1951
            self childrenOrderChanged.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1952
        ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1953
    ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1954
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1955
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1956
sort:aSortBlock
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1957
    "sort the children inplace using the 2-arg block sortBlock for comparison"
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1958
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1959
    children notEmptyOrNil ifTrue: [
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1960
        self criticalDo:[
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1961
            "/ check again (asynchronous update was possible before)
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1962
            children notEmptyOrNil ifTrue: [
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1963
                children := children sort:aSortBlock.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1964
                self childrenOrderChanged.
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1965
            ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1966
        ].
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1967
    ]
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1968
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1969
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1970
!AbstractHierarchicalItem class methodsFor:'documentation'!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1971
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1972
version
4795
eead012852f9 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4758
diff changeset
  1973
    ^ '$Header$'
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1974
!
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1975
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1976
version_CVS
4795
eead012852f9 class: AbstractHierarchicalItem
Claus Gittinger <cg@exept.de>
parents: 4758
diff changeset
  1977
    ^ '$Header$'
4733
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1978
! !
9ad52ca7b1c3 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1979