TreeItem.st
author Claus Gittinger <cg@exept.de>
Fri, 14 Dec 2001 11:57:44 +0100
changeset 2071 7c58c73eff49
parent 2038 81b3b590c9d8
child 2102 aa58c7d922fe
permissions -rw-r--r--
use new #valueWithOptionalArg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
     1
"
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
     2
 COPYRIGHT (c) 1997 by eXept Software AG / Claus Gittinger
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
     3
              All Rights Reserved
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
     4
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
     5
 This software is furnished under a license and may be used
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    10
 hereby transferred.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    11
"
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    12
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    13
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    14
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    15
1818
fe99c5c721e9 category changes
Claus Gittinger <cg@exept.de>
parents: 1552
diff changeset
    16
"{ Package: 'stx:libwidg2' }"
fe99c5c721e9 category changes
Claus Gittinger <cg@exept.de>
parents: 1552
diff changeset
    17
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    18
Object subclass:#TreeItem
795
d36f94d682bf #changed: bug fixed
tz
parents: 786
diff changeset
    19
	instanceVariableNames:'name tree parent children contents hide readChildren'
1196
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
    20
	classVariableNames:'UnknownContents'
795
d36f94d682bf #changed: bug fixed
tz
parents: 786
diff changeset
    21
	poolDictionaries:''
d36f94d682bf #changed: bug fixed
tz
parents: 786
diff changeset
    22
	category:'Interface-Support'
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    23
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    24
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    25
!TreeItem class methodsFor:'documentation'!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    26
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    27
copyright
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    28
"
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    29
 COPYRIGHT (c) 1997 by eXept Software AG / Claus Gittinger
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    30
              All Rights Reserved
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    31
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    32
 This software is furnished under a license and may be used
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    33
 only in accordance with the terms of that license and with the
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    35
 be provided or otherwise made available to, or used by, any
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    36
 other person.  No title to or ownership of the software is
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    37
 hereby transferred.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    38
"
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    39
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    40
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    41
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    42
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    43
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    44
documentation
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    45
"
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    46
    class to build up trees like structures to represent
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    47
    file-trees, class tress etc.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    48
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    49
    Especially suited for use with SelectionInTree and
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    50
    SelectionInTreeView.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    51
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    52
    [Author:]
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    53
        W. Olberding
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    54
        Claus Atzkern
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    55
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    56
    [See also:]
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    57
        SelectionInTree
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    58
        SelectionInTreeView
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    59
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    60
"
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    61
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    62
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    63
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    64
! !
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    65
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    66
!TreeItem class methodsFor:'instance creation'!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    67
768
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
    68
contents:aContents
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
    69
    |node|
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
    70
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
    71
    node := self new.
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
    72
    node contents:aContents.
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
    73
  ^ node
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
    74
!
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
    75
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
    76
name:aName
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
    77
    ^ self name:aName contents:nil
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
    78
!
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
    79
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    80
name:aName contents:aContents
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    81
    |node|
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    82
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    83
    node := self new.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    84
    node name:aName.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    85
    node contents:aContents.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    86
  ^ node
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    87
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    88
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
    89
name:aName value:aContents
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
    90
    ^ self name:aName contents:aContents
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
    91
!
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
    92
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    93
new
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    94
    ^ self basicNew initialize
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    95
! !
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
    96
1196
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
    97
!TreeItem class methodsFor:'class initialization'!
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
    98
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
    99
initialize
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   100
    UnknownContents isNil ifTrue:[
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   101
        UnknownContents := Object new.
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   102
    ]
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   103
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   104
    "
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   105
     self initialize
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   106
    "
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   107
! !
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   108
786
ca
parents: 784
diff changeset
   109
!TreeItem class methodsFor:'default icons'!
ca
parents: 784
diff changeset
   110
ca
parents: 784
diff changeset
   111
keysAndIcons
ca
parents: 784
diff changeset
   112
    "returns an IdentityDictionary containing a list of images and keys used
ca
parents: 784
diff changeset
   113
     by any file entry; could be redefined by subclass
ca
parents: 784
diff changeset
   114
    "
ca
parents: 784
diff changeset
   115
    ^ nil
ca
parents: 784
diff changeset
   116
ca
parents: 784
diff changeset
   117
! !
ca
parents: 784
diff changeset
   118
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   119
!TreeItem class methodsFor:'example - instance creation'!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   120
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   121
newAsTreeFromSmalltalkClass:aClass
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   122
    "create a tree of nodes with aClass and all its
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   123
     subclasses as contents. Set the initial level as given."
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   124
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   125
    |newInst clsName|
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   126
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   127
    aClass isNil ifTrue:[
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   128
        "/ nil subclasses requested
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   129
        clsName := 'nil'
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   130
    ] ifFalse:[
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   131
        "/ regular tree requested
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   132
        clsName := aClass name
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   133
    ].
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   134
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   135
    newInst := super new initialize.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   136
    newInst name:clsName.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   137
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   138
    aClass isNil ifTrue:[
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   139
        ((Smalltalk allClasses select:[:cls | cls superclass isNil])
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   140
            asSortedCollection:[:a :b | a name < b name])
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   141
        do:[:aSubClass |
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   142
            newInst add:(self newAsTreeFromSmalltalkClass:aSubClass).
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   143
        ]
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   144
    ] ifFalse:[
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   145
        (aClass subclasses asSortedCollection:[:a :b | a name < b name])
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   146
        do:[:aSubClass |
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   147
            newInst add:(self newAsTreeFromSmalltalkClass:aSubClass).
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   148
        ]
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   149
    ].
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   150
    ^newInst
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   151
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   152
"
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   153
      |top model sel root|
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   154
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   155
      root  := TreeItem newAsTreeFromSmalltalkClass:ByteArray.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   156
      root expand.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   157
      model := SelectionInTree new root:root.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   158
      top := StandardSystemView new.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   159
      top extent:300@300.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   160
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   161
      sel := SelectionInTreeView new.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   162
      sel model: model.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   163
      sel action:[:nr | Transcript show:'selected:'; showCR:nr].
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   164
      top add:(ScrollableView forView:sel) in:((0.0 @ 0.0 ) corner:( 1.0 @ 1.0)).
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   165
      top open.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   166
"
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   167
! !
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   168
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   169
!TreeItem methodsFor:'accessing'!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   170
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   171
contents
1196
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   172
    "get the contents; 
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   173
     usually, the contents is computed lazily i.e. #retrieveContents
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   174
     is invoked when the contents has not yet been set.
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   175
    "
1196
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   176
    contents == UnknownContents ifTrue:[        
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   177
        self retrieveContents
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   178
    ].
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   179
    ^contents
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   180
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   181
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   182
contents:something 
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   183
    "set contents
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   184
    "
1196
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   185
    contents := something
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   186
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   187
1172
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   188
editor
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   189
    "returns an editor on the editable value or nil
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   190
    "
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   191
    ^ nil
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   192
!
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   193
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   194
hide
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   195
    ^ hide
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   196
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   197
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   198
hide:aBoolean
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   199
   "set hide flag
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   200
   "    
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   201
   hide:= aBoolean
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   202
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   203
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   204
icon
786
ca
parents: 784
diff changeset
   205
    "get the icon
766
c37798a729eb in #expand and #collapse icon has to be retrieved
tz
parents: 761
diff changeset
   206
    "        
772
9ae43992a603 do not cache icons because TreeItems are models
tz
parents: 768
diff changeset
   207
    ^self retrieveAndEvaluate: #iconAction
9ae43992a603 do not cache icons because TreeItems are models
tz
parents: 768
diff changeset
   208
    
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   209
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   210
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   211
level
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   212
    "get level
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   213
    "
786
ca
parents: 784
diff changeset
   214
    |p
ca
parents: 784
diff changeset
   215
     lv "{ Class:SmallInteger }"
ca
parents: 784
diff changeset
   216
    |
ca
parents: 784
diff changeset
   217
    lv := 1.
ca
parents: 784
diff changeset
   218
    p  := self.
ca
parents: 784
diff changeset
   219
ca
parents: 784
diff changeset
   220
    [ (p := p parent) notNil ] whileTrue:[ lv := lv + 1 ].
ca
parents: 784
diff changeset
   221
    ^ lv
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   222
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   223
1172
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   224
middleButtonMenu
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   225
    "returns the middleButtonMenu of the item or nil
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   226
    "
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   227
    ^ nil
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   228
!
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   229
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   230
name
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   231
    "get name
772
9ae43992a603 do not cache icons because TreeItems are models
tz
parents: 768
diff changeset
   232
    "   
786
ca
parents: 784
diff changeset
   233
    name isNil ifTrue:[    
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   234
        self retrieveLabel
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   235
    ].
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   236
    ^name
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   237
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   238
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   239
name:aString
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   240
    "set name
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   241
    "      
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   242
    name := aString.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   243
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   244
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   245
parent
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   246
    "get parent
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   247
    "
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   248
    ^ parent
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   249
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   250
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   251
parent:something
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   252
    "set parent
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   253
    "
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   254
    parent := something.
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   255
!
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   256
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   257
value
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   258
    "get contents
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   259
    "
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   260
    ^ self contents
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   261
!
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   262
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   263
value:something 
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   264
    "set contents
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   265
    "
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   266
    self contents:something
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   267
! !
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   268
1818
fe99c5c721e9 category changes
Claus Gittinger <cg@exept.de>
parents: 1552
diff changeset
   269
!TreeItem methodsFor:'accessing-children'!
1172
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   270
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   271
basicLastChild
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   272
    "returns the last child without checking for valid sequence
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   273
    "
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   274
    ^ children last
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   275
!
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   276
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   277
children
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   278
    "get list of children
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   279
    "
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   280
    (readChildren and:[children isEmpty]) ifTrue:[       
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   281
        self retrieveChildren
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   282
    ].
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   283
    ^children
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   284
!
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   285
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   286
children:aCollection 
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   287
    "set children
1208
2f9d74cead2f children:
Claus Gittinger <cg@exept.de>
parents: 1205
diff changeset
   288
    "
2f9d74cead2f children:
Claus Gittinger <cg@exept.de>
parents: 1205
diff changeset
   289
    aCollection isNil ifTrue:[
2f9d74cead2f children:
Claus Gittinger <cg@exept.de>
parents: 1205
diff changeset
   290
        children removeAll
2f9d74cead2f children:
Claus Gittinger <cg@exept.de>
parents: 1205
diff changeset
   291
    ] ifFalse:[
2f9d74cead2f children:
Claus Gittinger <cg@exept.de>
parents: 1205
diff changeset
   292
        aCollection notNil ifTrue:[
2f9d74cead2f children:
Claus Gittinger <cg@exept.de>
parents: 1205
diff changeset
   293
            aCollection do:[:child| child parent:self ].
2f9d74cead2f children:
Claus Gittinger <cg@exept.de>
parents: 1205
diff changeset
   294
            readChildren := false
2f9d74cead2f children:
Claus Gittinger <cg@exept.de>
parents: 1205
diff changeset
   295
        ].
2f9d74cead2f children:
Claus Gittinger <cg@exept.de>
parents: 1205
diff changeset
   296
        children := aCollection
2f9d74cead2f children:
Claus Gittinger <cg@exept.de>
parents: 1205
diff changeset
   297
    ]
1172
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   298
!
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   299
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   300
firstChild
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   301
    "returns first child in sequence
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   302
    "
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   303
    self children notEmpty ifTrue:[
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   304
        ^ children at:1
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   305
    ].
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   306
    ^ nil
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   307
        
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   308
!
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   309
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   310
lastChild
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   311
    "returns last child in sequence
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   312
    "
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   313
    self children notEmpty ifTrue:[
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   314
        ^ children last
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   315
    ].
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   316
    ^ nil
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   317
        
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   318
!
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   319
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   320
readChildren:aBoolean
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   321
   "set read children flag
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   322
   "    
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   323
   readChildren:= aBoolean
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   324
! !
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   325
1818
fe99c5c721e9 category changes
Claus Gittinger <cg@exept.de>
parents: 1552
diff changeset
   326
!TreeItem methodsFor:'accessing-dimensions'!
1172
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   327
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   328
childrenWidthOn:aDevice
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   329
    "returns the maximum name length of my children
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   330
    "
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   331
    |max name|
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   332
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   333
    max := 0.
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   334
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   335
    children do:[:aChild|
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   336
        (name := aChild name) notNil ifTrue:[
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   337
            max := max max:(name widthOn:aDevice)
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   338
        ]
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   339
    ].
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   340
    ^ max
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   341
! !
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   342
1818
fe99c5c721e9 category changes
Claus Gittinger <cg@exept.de>
parents: 1552
diff changeset
   343
!TreeItem methodsFor:'accessing-hierarchy'!
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   344
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   345
collapse 
469
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   346
    "hide all my children
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   347
    "
772
9ae43992a603 do not cache icons because TreeItems are models
tz
parents: 768
diff changeset
   348
    hide := true
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   349
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   350
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   351
collapseAll 
469
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   352
    "hide all my children and sub children
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   353
    "
841
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   354
    hide := true.
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   355
841
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   356
    children notEmpty ifTrue:[
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   357
        children do:[:aChild| aChild collapseAll]
834
8729c234f95d add new queries
ca
parents: 795
diff changeset
   358
    ]
8729c234f95d add new queries
ca
parents: 795
diff changeset
   359
!
8729c234f95d add new queries
ca
parents: 795
diff changeset
   360
469
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   361
expand
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   362
    "show all my children
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   363
    "
772
9ae43992a603 do not cache icons because TreeItems are models
tz
parents: 768
diff changeset
   364
    hide := false
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   365
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   366
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   367
expandAll 
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   368
    "show all my children and sub children
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   369
    "
841
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   370
    hide := false.
834
8729c234f95d add new queries
ca
parents: 795
diff changeset
   371
841
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   372
    self children notEmpty ifTrue:[
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   373
        children do:[:aChild| aChild expandAll ]
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   374
    ]
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   375
! !
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   376
1818
fe99c5c721e9 category changes
Claus Gittinger <cg@exept.de>
parents: 1552
diff changeset
   377
!TreeItem methodsFor:'accessing-model'!
786
ca
parents: 784
diff changeset
   378
ca
parents: 784
diff changeset
   379
model
ca
parents: 784
diff changeset
   380
    "get my model (an instance of selection in tree) or nil
ca
parents: 784
diff changeset
   381
    "    
ca
parents: 784
diff changeset
   382
    ^ parent notNil ifTrue:[parent model] ifFalse:[tree]
ca
parents: 784
diff changeset
   383
!
ca
parents: 784
diff changeset
   384
ca
parents: 784
diff changeset
   385
model:aSelectionInTree
ca
parents: 784
diff changeset
   386
    "set my model (an instance of selection in tree) or nil
ca
parents: 784
diff changeset
   387
    "    
ca
parents: 784
diff changeset
   388
    tree:= aSelectionInTree
ca
parents: 784
diff changeset
   389
!
ca
parents: 784
diff changeset
   390
ca
parents: 784
diff changeset
   391
tree
ca
parents: 784
diff changeset
   392
    "get my model (an instance of selection in tree) or nil
ca
parents: 784
diff changeset
   393
    "    
ca
parents: 784
diff changeset
   394
    ^ self model
ca
parents: 784
diff changeset
   395
!
ca
parents: 784
diff changeset
   396
ca
parents: 784
diff changeset
   397
tree:aSelectionInTree
ca
parents: 784
diff changeset
   398
    "set my model (an instance of selection in tree) or nil
ca
parents: 784
diff changeset
   399
    "    
ca
parents: 784
diff changeset
   400
    self model:aSelectionInTree
ca
parents: 784
diff changeset
   401
! !
ca
parents: 784
diff changeset
   402
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   403
!TreeItem methodsFor:'adding & removing'!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   404
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   405
add:something
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   406
    "add a child or collection of children add end
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   407
    "
469
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   408
    self add:something beforeIndex:(self children size + 1)
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   409
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   410
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   411
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   412
add:something after:aChild
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   413
    "add a child or collection of children add end
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   414
    "
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   415
    self add:something afterIndex:(self indexOfChild:aChild)
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   416
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   417
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   418
add:something afterIndex:anIndex
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   419
    "add a child or collection after an index
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   420
    "
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   421
    self add:something beforeIndex:(anIndex + 1)
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   422
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   423
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   424
add:something before:aChild
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   425
    "add a child or collection of children add end
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   426
    "
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   427
    self add:something beforeIndex:(self indexOfChild:aChild)
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   428
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   429
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   430
add:something beforeIndex:anIndex
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   431
    "add a child or collection before an index
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   432
    "
469
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   433
    |idx children|
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   434
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   435
    children := self children.
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   436
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   437
    (idx := anIndex) > children size ifTrue:[
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   438
        idx := children size + 1
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   439
    ] ifFalse:[
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   440
        idx == 0 ifTrue:[idx := 1]
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   441
    ].
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   442
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   443
    self each:something do:[:el|
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   444
        children add:el beforeIndex:idx.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   445
        el parent:self.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   446
        el allWithParentAndChildrenDo:[:aParent :aChild| aChild parent:aParent ].
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   447
        idx := idx + 1.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   448
    ]
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   449
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   450
909
b2930fedcbe8 checkin from browser
tz
parents: 858
diff changeset
   451
addFirst: something
b2930fedcbe8 checkin from browser
tz
parents: 858
diff changeset
   452
    "add a child at the beginning
b2930fedcbe8 checkin from browser
tz
parents: 858
diff changeset
   453
    "
b2930fedcbe8 checkin from browser
tz
parents: 858
diff changeset
   454
    self add:something beforeIndex:1
b2930fedcbe8 checkin from browser
tz
parents: 858
diff changeset
   455
!
b2930fedcbe8 checkin from browser
tz
parents: 858
diff changeset
   456
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   457
remove:something 
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   458
    "remove a child or collection of children
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   459
    "
858
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   460
    self each:something do:[:aChild| self removeChild:aChild ].
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   461
  ^ something
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   462
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   463
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   464
removeAll
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   465
    "remove all children
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   466
    "
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   467
    self childrenDo:[:aChild| aChild parent:nil ].
469
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   468
    self children removeAll.
858
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   469
!
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   470
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   471
removeChild:aChild
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   472
    "remove a aChild
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   473
    "
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   474
    |item|
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   475
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   476
    (item := self children remove:aChild ifAbsent:nil) notNil ifTrue:[
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   477
        item parent:nil
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   478
    ].
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   479
    ^ item
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   480
!
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   481
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   482
removeIndex:anIndex
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   483
    "remove child at index
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   484
    "
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   485
    ^ self removeChild:(self childAt:anIndex)
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   486
! !
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   487
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   488
!TreeItem methodsFor:'change & update'!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   489
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   490
changed
786
ca
parents: 784
diff changeset
   491
    "node changed; raise notification to model
ca
parents: 784
diff changeset
   492
    "
ca
parents: 784
diff changeset
   493
    self changed:#value
784
f521b359ec84 #changed: mechanism extented
tz
parents: 777
diff changeset
   494
!
f521b359ec84 #changed: mechanism extented
tz
parents: 777
diff changeset
   495
786
ca
parents: 784
diff changeset
   496
changed:what
ca
parents: 784
diff changeset
   497
    "node changed; raise notification to model
ca
parents: 784
diff changeset
   498
    "
ca
parents: 784
diff changeset
   499
    |model|
784
f521b359ec84 #changed: mechanism extented
tz
parents: 777
diff changeset
   500
795
d36f94d682bf #changed: bug fixed
tz
parents: 786
diff changeset
   501
    what == #value 
982
d94684e7fe9f sending #changed to a tree item should not invoke retrieving children
tz
parents: 909
diff changeset
   502
        ifTrue:  [self retrieveLabel]
795
d36f94d682bf #changed: bug fixed
tz
parents: 786
diff changeset
   503
        ifFalse: [what == #children ifTrue: [self retrieveChildren]].
786
ca
parents: 784
diff changeset
   504
ca
parents: 784
diff changeset
   505
    (model := self model) notNil ifTrue:[
795
d36f94d682bf #changed: bug fixed
tz
parents: 786
diff changeset
   506
        model update:what with:nil from:self
786
ca
parents: 784
diff changeset
   507
    ]
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   508
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   509
2038
81b3b590c9d8 *** empty log message ***
ca
parents: 1825
diff changeset
   510
changedSelected
81b3b590c9d8 *** empty log message ***
ca
parents: 1825
diff changeset
   511
    "called if the node is selected
81b3b590c9d8 *** empty log message ***
ca
parents: 1825
diff changeset
   512
    "
81b3b590c9d8 *** empty log message ***
ca
parents: 1825
diff changeset
   513
!
81b3b590c9d8 *** empty log message ***
ca
parents: 1825
diff changeset
   514
786
ca
parents: 784
diff changeset
   515
update:something with:aParameter from:anItem
ca
parents: 784
diff changeset
   516
    "raise change notification to my model
ca
parents: 784
diff changeset
   517
    "
ca
parents: 784
diff changeset
   518
    |m|
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   519
786
ca
parents: 784
diff changeset
   520
    (m := self model) notNil ifTrue:[
ca
parents: 784
diff changeset
   521
        m update:something with:aParameter from:anItem
ca
parents: 784
diff changeset
   522
    ]
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   523
! !
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   524
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   525
!TreeItem methodsFor:'converting'!
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   526
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   527
fromLiteralArrayEncoding:aLiteralEncodedArray
786
ca
parents: 784
diff changeset
   528
    "read my contents from a aLiteralEncodedArray.
ca
parents: 784
diff changeset
   529
    "
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   530
    |narg|
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   531
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   532
    (     (aLiteralEncodedArray size > 0)
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   533
     and:[(name := aLiteralEncodedArray at:1) isString]) ifFalse:[
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   534
        ^ nil
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   535
    ].
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   536
    narg := aLiteralEncodedArray at:2 ifAbsent:nil.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   537
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   538
    name isSymbol ifTrue:[
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   539
        (narg isArray and:[aLiteralEncodedArray size == 2]) ifTrue:[
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   540
            ^ self fromLiteralArrayEncoding:narg
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   541
        ].
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   542
        ^ nil
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   543
    ].
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   544
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   545
    narg isArray ifFalse:[
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   546
        contents := narg.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   547
        narg := aLiteralEncodedArray at:3 ifAbsent:nil.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   548
    ].
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   549
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   550
    narg isArray ifTrue:[
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   551
        children := OrderedCollection new.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   552
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   553
        narg do:[:aSubArray||aChild|
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   554
            children add:(aChild := TreeItem new).
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   555
            aChild fromLiteralArrayEncoding:aSubArray.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   556
            aChild parent:self.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   557
        ]
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   558
    ]
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   559
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   560
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   561
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   562
!
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   563
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   564
literalArrayEncoding
786
ca
parents: 784
diff changeset
   565
    "return myself encoded as a literal array
ca
parents: 784
diff changeset
   566
    "
ca
parents: 784
diff changeset
   567
    |array childs size noChld|
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   568
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   569
    contents isString ifTrue:[size := 2]
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   570
                     ifFalse:[size := 1].
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   571
786
ca
parents: 784
diff changeset
   572
    noChld := self numberOfChildren.
ca
parents: 784
diff changeset
   573
ca
parents: 784
diff changeset
   574
    noChld == 0 ifTrue:[
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   575
        array := Array new:size
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   576
    ] ifFalse:[
786
ca
parents: 784
diff changeset
   577
        array  := Array new:size + 1.
ca
parents: 784
diff changeset
   578
        childs := Array new:noChld.
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   579
        array at:(size + 1) put:childs.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   580
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   581
        self children keysAndValuesDo:[:i :aChild|
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   582
            childs at:i put:(aChild literalArrayEncoding)
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   583
        ]
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   584
    ].
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   585
    array at:1 put:(name ? '').
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   586
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   587
    contents isString ifTrue:[
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   588
        array at:2 put:contents
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   589
    ].
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   590
    parent isNil ifTrue:[
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   591
        array := Array with:#TreeItem with:array.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   592
    ].
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   593
    ^ array
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   594
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   595
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   596
! !
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   597
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   598
!TreeItem methodsFor:'copy'!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   599
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   600
copy
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   601
    |node|
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   602
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   603
    node := self species new.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   604
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   605
    node name:(name copy).
1196
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   606
    contents ~~ UnknownContents ifTrue:[
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   607
        node contents:(contents copy).
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   608
    ] ifFalse:[
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   609
        node contents:UnknownContents
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   610
    ].
469
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   611
    node children:(self children collect:[:c| c copy]).
786
ca
parents: 784
diff changeset
   612
    node readChildren:readChildren.
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   613
  ^ node
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   614
! !
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   615
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   616
!TreeItem methodsFor:'enumerating'!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   617
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   618
allChildrenDo:aOneArgBlock
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   619
    "evaluate a block on each children and subchildren
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   620
    "
469
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   621
    self children do:[:aChild|
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   622
        aOneArgBlock value:aChild.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   623
        aChild allChildrenDo:aOneArgBlock
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   624
    ]
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   625
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   626
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   627
allWithParentAndChildrenDo:aTwoArgBlock
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   628
    self childrenDo:[:aChild|
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   629
        aTwoArgBlock value:self value:aChild.
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   630
        aChild allWithParentAndChildrenDo:aTwoArgBlock
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   631
    ]
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   632
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   633
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   634
childrenDo:aOneArgBlock
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   635
    "evaluate a block on each children( excluding  sub-children )
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   636
    "
837
5d437be03bcf optimize evaluation of block
ca
parents: 834
diff changeset
   637
    self children do:aOneArgBlock
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   638
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   639
1241
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   640
detectParent:aBlock
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   641
    "evaluate aBlock for my parent-chain; return the parent for which it returns true"
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   642
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   643
    |p|
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   644
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   645
    p := parent.
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   646
    [p notNil] whileTrue:[
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   647
        (aBlock value:p) ifTrue:[^ p].
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   648
        p := p parent
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   649
    ].
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   650
    ^ nil
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   651
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   652
!
11749610046e added #detectParent:
tm
parents: 1208
diff changeset
   653
837
5d437be03bcf optimize evaluation of block
ca
parents: 834
diff changeset
   654
each:something do:aOneArgBlock
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   655
    "evaluate a block for something or in case of a collection for each
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   656
     element in the collection
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   657
    "
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   658
    something notNil ifTrue:[
837
5d437be03bcf optimize evaluation of block
ca
parents: 834
diff changeset
   659
        something isCollection ifTrue:[something do:aOneArgBlock]
5d437be03bcf optimize evaluation of block
ca
parents: 834
diff changeset
   660
                              ifFalse:[aOneArgBlock value:something]
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   661
    ]
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   662
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   663
! !
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   664
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   665
!TreeItem methodsFor:'initialize-release'!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   666
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   667
initialize
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   668
    "setup defaults
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   669
    "
506
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   670
    super initialize.
6a56843fb354 encodeing decoding
ca
parents: 479
diff changeset
   671
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   672
    children := OrderedCollection new.
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   673
    readChildren := hide := true.
1196
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   674
    contents := UnknownContents.
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   675
! !
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   676
1825
962390f1b499 category change
Claus Gittinger <cg@exept.de>
parents: 1818
diff changeset
   677
!TreeItem methodsFor:'printing & storing'!
1172
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   678
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   679
asString
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   680
    "sometimes used by the SelectionInListView to get the name
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   681
    "
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   682
    ^ name notNil ifTrue:[name] ifFalse:[self name]
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   683
        
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   684
!
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   685
1196
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   686
displayString
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   687
    ^ self class name , '(' , self printString , ')'
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   688
!
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   689
1172
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   690
printString
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   691
    "sometimes used by the SelectionInListView to get the name
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   692
    "
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   693
    ^ name notNil ifTrue:[name] ifFalse:[self name]
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   694
        
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   695
!
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   696
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   697
printableEditValue
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   698
    "returns the printable edit value or nil
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   699
    "
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   700
    ^ nil
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   701
! !
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   702
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   703
!TreeItem methodsFor:'queries'!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   704
1172
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   705
canEdit
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   706
    "returns true if field is editable
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   707
    "
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   708
    ^ false
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   709
!
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   710
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   711
hasChildren
786
ca
parents: 784
diff changeset
   712
    "returns true if any child exists
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   713
    "
786
ca
parents: 784
diff changeset
   714
    ^ self children notEmpty
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   715
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   716
834
8729c234f95d add new queries
ca
parents: 795
diff changeset
   717
hasChildrenWithSubChildren
8729c234f95d add new queries
ca
parents: 795
diff changeset
   718
    "returns true if any child exists and has children too
8729c234f95d add new queries
ca
parents: 795
diff changeset
   719
    "
8729c234f95d add new queries
ca
parents: 795
diff changeset
   720
    self children do:[:aChild|
8729c234f95d add new queries
ca
parents: 795
diff changeset
   721
        aChild hasChildren ifTrue:[^ true].
8729c234f95d add new queries
ca
parents: 795
diff changeset
   722
    ].
8729c234f95d add new queries
ca
parents: 795
diff changeset
   723
    ^ false
8729c234f95d add new queries
ca
parents: 795
diff changeset
   724
8729c234f95d add new queries
ca
parents: 795
diff changeset
   725
!
8729c234f95d add new queries
ca
parents: 795
diff changeset
   726
8729c234f95d add new queries
ca
parents: 795
diff changeset
   727
hasExpandedChildren
8729c234f95d add new queries
ca
parents: 795
diff changeset
   728
    "returns true if any of my children is expanded
8729c234f95d add new queries
ca
parents: 795
diff changeset
   729
    "
8729c234f95d add new queries
ca
parents: 795
diff changeset
   730
    children notEmpty ifTrue:[
8729c234f95d add new queries
ca
parents: 795
diff changeset
   731
        children do:[:aChild| aChild hidden ifFalse:[^ true] ]
8729c234f95d add new queries
ca
parents: 795
diff changeset
   732
    ].
8729c234f95d add new queries
ca
parents: 795
diff changeset
   733
    ^ false
8729c234f95d add new queries
ca
parents: 795
diff changeset
   734
!
8729c234f95d add new queries
ca
parents: 795
diff changeset
   735
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   736
hidden
786
ca
parents: 784
diff changeset
   737
    "returns true if node is not visible
ca
parents: 784
diff changeset
   738
    "
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   739
    ^ hide
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   740
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   741
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   742
isCollapsable
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   743
    "is collabsable; children existing and shown
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   744
    "
469
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   745
    ^ (self hasChildren and:[hide == false])
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   746
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   747
569
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   748
isContainedByParent:aParent
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   749
    "returns true if contained in subtree of a parent
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   750
    "
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   751
    |p|
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   752
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   753
    p := parent.
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   754
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   755
    [p notNil] whileTrue:[
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   756
        p == aParent ifTrue:[^ true ].
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   757
        p := p parent
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   758
    ].
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   759
    ^ false
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   760
!
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   761
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   762
isExpandable
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   763
    "is expandable; children existing and hidden
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   764
    "
469
d3537bee9988 accessing children through message
ca
parents: 457
diff changeset
   765
    ^ (self hasChildren and:[hide == true])
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   766
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   767
!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   768
1205
98175b161f98 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1196
diff changeset
   769
isExpanded
98175b161f98 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1196
diff changeset
   770
    "return true if I am expanded"
98175b161f98 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1196
diff changeset
   771
    ^ hide not
98175b161f98 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1196
diff changeset
   772
98175b161f98 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1196
diff changeset
   773
!
98175b161f98 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1196
diff changeset
   774
472
ca
parents: 469
diff changeset
   775
numberOfChildren
786
ca
parents: 784
diff changeset
   776
    "returns number of children
ca
parents: 784
diff changeset
   777
    "
472
ca
parents: 469
diff changeset
   778
    ^ self children size
ca
parents: 469
diff changeset
   779
!
ca
parents: 469
diff changeset
   780
841
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   781
showIndicator
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   782
    "returns true if children exists
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   783
    "
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   784
    ^ self hasChildren
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   785
!
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   786
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   787
shown
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   788
    "returns true if node is visible
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   789
    "
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   790
    ^ hide not
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   791
! !
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   792
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   793
!TreeItem methodsFor:'recomputation'!
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   794
858
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   795
addVisibleChildrenTo:aList
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   796
    "add all visible children and sub-children to the list
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   797
    "  
838
d15daece0c54 optimize algorithm to get list from model and to
ca
parents: 837
diff changeset
   798
    |item
d15daece0c54 optimize algorithm to get list from model and to
ca
parents: 837
diff changeset
   799
     size "{ Class: SmallInteger }"
d15daece0c54 optimize algorithm to get list from model and to
ca
parents: 837
diff changeset
   800
     idx  "{ Class: SmallInteger }"
d15daece0c54 optimize algorithm to get list from model and to
ca
parents: 837
diff changeset
   801
    |
d15daece0c54 optimize algorithm to get list from model and to
ca
parents: 837
diff changeset
   802
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   803
    hide ifFalse:[
841
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   804
        readChildren ifTrue:[
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   805
            self children
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   806
        ].
849
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
   807
        (size := children size) ~~ 0 ifTrue:[
838
d15daece0c54 optimize algorithm to get list from model and to
ca
parents: 837
diff changeset
   808
            idx := 1.
d15daece0c54 optimize algorithm to get list from model and to
ca
parents: 837
diff changeset
   809
            size timesRepeat:[
d15daece0c54 optimize algorithm to get list from model and to
ca
parents: 837
diff changeset
   810
                aList add:(item := children at:idx).
858
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   811
                item addVisibleChildrenTo:aList.
838
d15daece0c54 optimize algorithm to get list from model and to
ca
parents: 837
diff changeset
   812
                idx := idx + 1.
d15daece0c54 optimize algorithm to get list from model and to
ca
parents: 837
diff changeset
   813
            ]
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   814
        ]
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   815
    ]
841
163dc6648f02 add more functionality
ca
parents: 838
diff changeset
   816
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   817
569
2a1014d6697c checkin from browser
ca
parents: 545
diff changeset
   818
858
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   819
!
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   820
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   821
numberOfAllVisibleChildren
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   822
    "returns number of all visible children including all the children of children
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   823
    "
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   824
    |total "{ Class: SmallInteger }"|
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   825
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   826
    hide ifTrue:[
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   827
        ^ 0
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   828
    ].
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   829
    readChildren ifTrue:[ self children ].
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   830
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   831
    (total := children size) ~~ 0 ifTrue:[
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   832
        children do:[:aChild| total := total + aChild numberOfAllVisibleChildren ].
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   833
    ].
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   834
    ^ total
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   835
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   836
0bfbe5be0541 add more functionality
ca
parents: 849
diff changeset
   837
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   838
! !
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
   839
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   840
!TreeItem methodsFor:'retrieving'!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   841
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   842
childrenAction
786
ca
parents: 784
diff changeset
   843
    "get children action block
ca
parents: 784
diff changeset
   844
    "
ca
parents: 784
diff changeset
   845
    |m|
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   846
786
ca
parents: 784
diff changeset
   847
    ^ (m := self model) notNil ifTrue:[m childrenAction] ifFalse:[nil]
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   848
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   849
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   850
contentsAction
786
ca
parents: 784
diff changeset
   851
    "get contents action block
ca
parents: 784
diff changeset
   852
    "
ca
parents: 784
diff changeset
   853
    |m|
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   854
786
ca
parents: 784
diff changeset
   855
    ^ (m := self model) notNil ifTrue:[m contentsAction] ifFalse:[nil]
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   856
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   857
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   858
iconAction
786
ca
parents: 784
diff changeset
   859
    "get icon action block
ca
parents: 784
diff changeset
   860
    "
ca
parents: 784
diff changeset
   861
    |m|
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   862
786
ca
parents: 784
diff changeset
   863
    ^ (m := self model) notNil ifTrue:[m iconAction] ifFalse:[nil]
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   864
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   865
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   866
labelAction
786
ca
parents: 784
diff changeset
   867
    "get label action block
ca
parents: 784
diff changeset
   868
    "
ca
parents: 784
diff changeset
   869
    |m|
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   870
786
ca
parents: 784
diff changeset
   871
    ^ (m := self model) notNil ifTrue:[m labelAction] ifFalse:[nil]
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   872
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   873
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   874
retrieveAll
786
ca
parents: 784
diff changeset
   875
    "retrieve all values from model
ca
parents: 784
diff changeset
   876
    "
784
f521b359ec84 #changed: mechanism extented
tz
parents: 777
diff changeset
   877
    self "retrieveContents;" retrieveLabel; retrieveChildren
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   878
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   879
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   880
retrieveAndEvaluate: aBlockSymbol
1279
2fe9b64b04b1 comment
Claus Gittinger <cg@exept.de>
parents: 1241
diff changeset
   881
    "retrieve a specific value from model; if no model exists, nil is returned
786
ca
parents: 784
diff changeset
   882
    "
2071
7c58c73eff49 use new #valueWithOptionalArg
Claus Gittinger <cg@exept.de>
parents: 2038
diff changeset
   883
    |arg model|
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   884
786
ca
parents: 784
diff changeset
   885
    (model := self model) isNil ifTrue:[
ca
parents: 784
diff changeset
   886
        ^ nil
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   887
    ].
786
ca
parents: 784
diff changeset
   888
    arg := model perform:aBlockSymbol.
ca
parents: 784
diff changeset
   889
ca
parents: 784
diff changeset
   890
    arg isBlock ifFalse:[
ca
parents: 784
diff changeset
   891
        ^ arg value
ca
parents: 784
diff changeset
   892
    ].
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   893
2071
7c58c73eff49 use new #valueWithOptionalArg
Claus Gittinger <cg@exept.de>
parents: 2038
diff changeset
   894
    ^ arg valueWithOptionalArgument:self
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   895
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   896
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   897
retrieveChildren
786
ca
parents: 784
diff changeset
   898
    "retrieve children from model
ca
parents: 784
diff changeset
   899
    "
ca
parents: 784
diff changeset
   900
    |retChildren cls|
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   901
786
ca
parents: 784
diff changeset
   902
    retChildren := self retrieveAndEvaluate:#childrenAction.
ca
parents: 784
diff changeset
   903
ca
parents: 784
diff changeset
   904
    retChildren notNil ifTrue:[
ca
parents: 784
diff changeset
   905
        retChildren isCollection ifFalse: [retChildren := OrderedCollection with:retChildren].
ca
parents: 784
diff changeset
   906
        cls := self class.
ca
parents: 784
diff changeset
   907
ca
parents: 784
diff changeset
   908
        self children: (retChildren collect: 
768
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
   909
        [:obj|      
786
ca
parents: 784
diff changeset
   910
            (obj isKindOf:cls) ifTrue:[obj]
ca
parents: 784
diff changeset
   911
                              ifFalse:[cls new contents:obj]       
768
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
   912
        ]). 
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
   913
        readChildren := false.
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
   914
    ].     
5fa51db3bdb5 set read children flag to false only if retrieving succeeded
tz
parents: 766
diff changeset
   915
786
ca
parents: 784
diff changeset
   916
    ^ children
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   917
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   918
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   919
retrieveContents
786
ca
parents: 784
diff changeset
   920
    "retrieve contents value from model;
ca
parents: 784
diff changeset
   921
    "
ca
parents: 784
diff changeset
   922
    |cont|
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   923
786
ca
parents: 784
diff changeset
   924
    (cont := self retrieveAndEvaluate: #contentsAction) isNil ifTrue:[
1196
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   925
        contents == UnknownContents ifTrue:[
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   926
            cont := ''
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
   927
        ]
786
ca
parents: 784
diff changeset
   928
    ].
ca
parents: 784
diff changeset
   929
    ^ contents := cont
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   930
!
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   931
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   932
retrieveLabel
786
ca
parents: 784
diff changeset
   933
    "retrieve label from model
ca
parents: 784
diff changeset
   934
    "
ca
parents: 784
diff changeset
   935
    |n|
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   936
786
ca
parents: 784
diff changeset
   937
    (n := self retrieveAndEvaluate:#labelAction) isNil ifTrue:[
ca
parents: 784
diff changeset
   938
        n := name ? ''
ca
parents: 784
diff changeset
   939
    ].
ca
parents: 784
diff changeset
   940
    ^ name := n
761
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   941
! !
d0cf8f76f1b6 supports dynamic read behavior for contents, label, children, and icon
tz
parents: 569
diff changeset
   942
479
ca
parents: 472
diff changeset
   943
!TreeItem methodsFor:'searching'!
ca
parents: 472
diff changeset
   944
1172
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   945
childAt:anIndex
1551
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   946
    "get child at an index or nil"
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   947
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   948
    ^ self children at:anIndex ifAbsent:nil
1172
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   949
!
ab035d2357b3 add editable value and menu
ca
parents: 983
diff changeset
   950
479
ca
parents: 472
diff changeset
   951
detectChild:aOneArgBlock
1551
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   952
    "evaluate the block on each child; 
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   953
     returns the child's node or nil.
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   954
     This searches my children only - not walking down sublevels.
479
ca
parents: 472
diff changeset
   955
    "
1551
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   956
479
ca
parents: 472
diff changeset
   957
    ^ self children detect:aOneArgBlock ifNone:nil
ca
parents: 472
diff changeset
   958
ca
parents: 472
diff changeset
   959
!
ca
parents: 472
diff changeset
   960
849
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
   961
detectChild:aTwoArgBlock arguments:args
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
   962
    "detect a child the evaluation of the block returns true. The
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
   963
     first argument to the block is the item, the second argument
1551
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   964
     the value derived from the argument list at node-level ...
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   965
     I.e. for each sublevel, a different block arg can be specified.
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   966
     The number of arguments also defines the search level.
1552
e3ad6557a3c3 comments
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
   967
     i.e. if you pass (1 to:10) as args, the block will get the sub-level
e3ad6557a3c3 comments
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
   968
     as second argument and stop the search after 10 levels.
849
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
   969
    "
1551
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   970
849
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
   971
    ^ self detectChild:aTwoArgBlock arguments:args index:1
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
   972
!
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
   973
1551
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   974
detectFirstChild:anOneArgBlock
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   975
    "detect the first child which evaluation of anOneArgBlock returns true.
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   976
     Recursively walks down the node-tree.
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   977
    "
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   978
    |node children|
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   979
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   980
    (anOneArgBlock value:self) ifTrue:[
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   981
        ^ self.
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   982
    ].
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   983
    (children := self children) notEmpty ifTrue:[
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   984
        children do:[:aChild |
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   985
            (node := aChild detectFirstChild:anOneArgBlock) notNil ifTrue:[
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   986
                ^ node
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   987
            ]
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   988
        ]
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   989
    ].  
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   990
    ^ nil
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   991
!
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   992
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   993
indexOfChild:aChild
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   994
    "get index of a child or 0
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   995
    "
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   996
    ^ aChild notNil ifTrue:[self children identityIndexOf:aChild]
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   997
                   ifFalse:[0]
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   998
! !
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
   999
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
  1000
!TreeItem methodsFor:'searching - private'!
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
  1001
849
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1002
detectChild:aTwoArgBlock arguments:args index:idxArgs
1552
e3ad6557a3c3 comments
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
  1003
    "helper for limited search.
e3ad6557a3c3 comments
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
  1004
     detect a child the evaluation of the block returns true. The
849
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1005
     first argument to the block is the item, the second argument
1551
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
  1006
     the value derived from the argument list at an index.
2163ee51cb72 comments
Claus Gittinger <cg@exept.de>
parents: 1465
diff changeset
  1007
     This one recursively walks down the tree searching for a node.
849
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1008
    "
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1009
    |num node|
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1010
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1011
    (num := args size) >= idxArgs ifTrue:[
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1012
        (aTwoArgBlock value:self value:(args at:idxArgs)) ifFalse:[
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1013
            ^ nil
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1014
        ].
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1015
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1016
        idxArgs == num ifTrue:[
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1017
            ^ self
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1018
        ].
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1019
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1020
        self children notEmpty ifTrue:[
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1021
            num := idxArgs + 1.
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1022
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1023
            children do:[:aChild|
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1024
                node := aChild detectChild:aTwoArgBlock arguments:args index:num.
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1025
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1026
                node notNil ifTrue:[
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1027
                    ^ node
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1028
                ]
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1029
            ]
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1030
        ]
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1031
    ].
f7d8363fc24f support more detectItem mechanisms
ca
parents: 845
diff changeset
  1032
    ^ nil
479
ca
parents: 472
diff changeset
  1033
! !
ca
parents: 472
diff changeset
  1034
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
  1035
!TreeItem class methodsFor:'documentation'!
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
  1036
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
  1037
version
2071
7c58c73eff49 use new #valueWithOptionalArg
Claus Gittinger <cg@exept.de>
parents: 2038
diff changeset
  1038
    ^ '$Header: /cvs/stx/stx/libwidg2/TreeItem.st,v 1.39 2001-12-14 10:57:44 cg Exp $'
457
c0f108c6d05f intitial checkin
ca
parents:
diff changeset
  1039
! !
1196
8f9a3c273eff use UnknownContents special object instead of nil.
Claus Gittinger <cg@exept.de>
parents: 1172
diff changeset
  1040
TreeItem initialize!