--- a/HierarchicalListEditor.st Sat Jan 17 18:16:05 1998 +0100
+++ b/HierarchicalListEditor.st Sat Jan 17 18:22:09 1998 +0100
@@ -13,9 +13,9 @@
-ApplicationModel subclass:#HierarchicalListEditor
- instanceVariableNames:'didInstall treeView specClass specSelector'
- classVariableNames:'CopyBuffer IconCreateChild IconCreateSister'
+ToolApplicationModel subclass:#HierarchicalListEditor
+ instanceVariableNames:'isModified didInstall treeView specClass specSelector'
+ classVariableNames:'CopyBuffer'
poolDictionaries:''
category:'Interface-UIPainter'
!
@@ -58,36 +58,6 @@
! !
-!HierarchicalListEditor class methodsFor:'icons'!
-
-iconCreateChild
-
- <resource: #fileImage>
-
- IconCreateChild isNil ifTrue:[
- IconCreateChild := Image fromFile:'bitmaps/ui_hierListChild.xpm'.
- ].
- ^ IconCreateChild.
-
-"
-IconCreateChild := nil
-"
-!
-
-iconCreateSister
-
- <resource: #fileImage>
-
- IconCreateSister isNil ifTrue:[
- IconCreateSister := Image fromFile:'bitmaps/ui_hierListSister.xpm'.
- ].
- ^ IconCreateSister.
-
-"
-IconCreateSister := nil
-"
-! !
-
!HierarchicalListEditor class methodsFor:'interface specs'!
classAndMethodSpec
@@ -109,11 +79,12 @@
#'window:'
#(#WindowSpec
#'name:' 'Painter'
- #'layout:' #(#LayoutFrame 199 0 167 0 589 0 336 0)
+ #'layout:' #(#LayoutFrame 202 0 207 0 502 0 335 0)
#'label:' 'Painter'
#'min:' #(#Point 10 10)
#'max:' #(#Point 1160 870)
- #'bounds:' #(#Rectangle 199 167 590 337)
+ #'bounds:' #(#Rectangle 202 207 503 336)
+ #'usePreferredExtent:' false
)
#'component:'
#(#SpecCollection
@@ -122,14 +93,14 @@
#(#LabelSpec
#'name:' 'boxLabel'
#'layout:' #(#Point 5 10)
- #'label:' 'class & method for code:'
+ #'label:' 'Class and selector for code:'
#'adjust:' #left
#'resizeForLabel:' true
)
#(#LabelSpec
#'name:' 'classLabel'
#'layout:' #(#AlignmentOrigin 45 0.11 51 0 1 0.5)
- #'label:' 'class:'
+ #'label:' 'Class:'
#'adjust:' #right
#'resizeForLabel:' true
)
@@ -142,7 +113,7 @@
#(#LabelSpec
#'name:' 'methodLabel'
#'layout:' #(#AlignmentOrigin 45 0.11 74 0 1 0.5)
- #'label:' 'method:'
+ #'label:' 'Selector:'
#'adjust:' #right
#'resizeForLabel:' true
)
@@ -162,18 +133,18 @@
#(
#(#ActionButtonSpec
#'name:' 'cancel'
- #'label:' 'cancel'
+ #'label:' 'Cancel'
#'tabable:' true
#'model:' #cancel
- #'extent:' #(#Point 191 24)
+ #'extent:' #(#Point 146 24)
)
#(#ActionButtonSpec
#'name:' 'accept'
- #'label:' 'ok'
+ #'label:' 'OK'
#'tabable:' true
+ #'model:' #accept
#'isDefault:' true
- #'model:' #accept
- #'extent:' #(#Point 191 24)
+ #'extent:' #(#Point 146 24)
)
)
)
@@ -187,95 +158,15 @@
)
!
-menuButtons
+menu
"this window spec was automatically generated by the ST/X MenuEditor"
"do not manually edit this - the builder may not be able to
handle the specification if its corrupted."
"
- MenuEditor new openOnClass:HierarchicalListEditor andSelector:#menuButtons
- (Menu new fromLiteralArrayEncoding:(HierarchicalListEditor menuButtons)) startUp
- "
-
- <resource: #menu>
-
- ^
-
- #(#Menu
-
- #(
- #(#MenuItem
- #'label:' 'createChild'
- #'value:' #doCreateChild
- #'enabled:' #canCreateChildChannel
- #'labelImage:' #(#ResourceRetriever #HierarchicalListEditor #iconCreateChild)
- )
- #(#MenuItem
- #'label:' 'createSister'
- #'value:' #doCreateSister
- #'enabled:' #canCreateSisterChannel
- #'labelImage:' #(#ResourceRetriever #HierarchicalListEditor #iconCreateSister)
- )
- #(#MenuItem
- #'label:' '-'
- )
- #(#MenuItem
- #'label:' ''
- )
- #(#MenuItem
- #'label:' '-'
- )
- #(#MenuItem
- #'label:' 'stepUp'
- #'value:' #doStepUp
- #'enabled:' #canStepOverChannel
- #'labelImage:' #(#ResourceRetriever #UIPainter #iconStepUp)
- )
- #(#MenuItem
- #'label:' '-'
- )
- #(#MenuItem
- #'label:' 'stepDown'
- #'value:' #doStepDown
- #'enabled:' #canStepOverChannel
- #'labelImage:' #(#ResourceRetriever #UIPainter #iconStepDown)
- )
- #(#MenuItem
- #'label:' '-'
- )
- #(#MenuItem
- #'label:' 'stepIn'
- #'value:' #doStepIn
- #'enabled:' #canStepInChannel
- #'labelImage:' #(#ResourceRetriever #UIPainter #iconStepIn)
- )
- #(#MenuItem
- #'label:' '-'
- )
- #(#MenuItem
- #'label:' 'stepOut'
- #'value:' #doStepOut
- #'enabled:' #canStepOutChannel
- #'labelImage:' #(#ResourceRetriever #UIPainter #iconStepOut)
- )
- #(#MenuItem
- #'label:' '-'
- )
- ) nil
- nil
- )
-!
-
-menuMain
- "this window spec was automatically generated by the ST/X MenuEditor"
-
- "do not manually edit this - the builder may not be able to
- handle the specification if its corrupted."
-
- "
- MenuEditor new openOnClass:HierarchicalListEditor andSelector:#menuMain
- (Menu new fromLiteralArrayEncoding:(HierarchicalListEditor menuMain)) startUp
+ MenuEditor new openOnClass:HierarchicalListEditor andSelector:#menu
+ (Menu new fromLiteralArrayEncoding:(HierarchicalListEditor menu)) startUp
"
<resource: #menu>
@@ -286,24 +177,51 @@
#(
#(#MenuItem
- #'label:' 'file'
+ #'label:' 'About'
+ #'labelImage:' #(#ResourceRetriever #UIPainter #icon)
+ #'submenuChannel:' #menuAbout
+ )
+ #(#MenuItem
+ #'label:' 'File'
+ #'accessCharacterPosition:' 1
#'submenu:'
#(#Menu
#(
#(#MenuItem
- #'label:' 'new'
+ #'label:' 'New'
#'value:' #doNew
)
#(#MenuItem
- #'label:' 'reload'
+ #'label:' 'Reload'
#'value:' #doReload
)
#(#MenuItem
- #'label:' '='
+ #'label:' '-'
+ )
+ #(#MenuItem
+ #'label:' 'Save'
+ #'value:' #doInstall
+ #'enabled:' #hasValidClass
+ )
+ #(#MenuItem
+ #'label:' '-'
)
#(#MenuItem
- #'label:' 'quit'
+ #'label:' 'Define Selector'
+ #'value:' #doDefineSelector
+ #'enabled:' #hasValidClass
+ )
+ #(#MenuItem
+ #'label:' 'Define Class'
+ #'value:' #doDefineClass
+ #'enabled:' #canChangeClassName
+ )
+ #(#MenuItem
+ #'label:' '-'
+ )
+ #(#MenuItem
+ #'label:' 'Exit'
#'value:' #closeRequest
)
) nil
@@ -311,62 +229,34 @@
)
)
#(#MenuItem
- #'label:' 'code'
+ #'label:' 'Edit'
+ #'accessCharacterPosition:' 1
+ #'submenuChannel:' #menuEdit
+ )
+ #(#MenuItem
+ #'label:' 'Browse'
+ #'enabled:' #hasValidClass
+ #'accessCharacterPosition:' 1
#'submenu:'
#(#Menu
#(
#(#MenuItem
- #'label:' 'class && method'
- #'value:' #doDefineClass
- #'enabled:' #canChangeClassName
- )
- #(#MenuItem
- #'label:' 'method'
- #'value:' #doDefineSelector
- #'enabled:' #hasValidClass
- )
- #(#MenuItem
- #'label:' '-'
- )
- #(#MenuItem
- #'label:' 'install spec.'
- #'value:' #doInstall
- #'enabled:' #hasValidClass
- )
- #(#MenuItem
- #'label:' '-'
+ #'label:' 'Class'
+ #'value:' #'doBrowse:'
+ #'argument:' #class
)
#(#MenuItem
- #'label:' 'browse'
- #'enabled:' #hasValidClass
- #'submenu:'
- #(#Menu
-
- #(
- #(#MenuItem
- #'label:' 'class'
- #'value:' #'doBrowse:'
- #'argument:' #class
- )
- #(#MenuItem
- #'label:' '-'
- )
- #(#MenuItem
- #'label:' 'specification'
- #'value:' #'doBrowse:'
- #'enabled:' #hasValidSpecSelector
- #'argument:' #spec
- )
- #(#MenuItem
- #'label:' 'method'
- #'value:' #'doBrowse:'
- #'enabled:' #hasValidMethodSelector
- #'argument:' #method
- )
- ) nil
- nil
- )
+ #'label:' 'Method'
+ #'value:' #'doBrowse:'
+ #'enabled:' #hasValidMethodSelector
+ #'argument:' #method
+ )
+ #(#MenuItem
+ #'label:' 'Specification'
+ #'value:' #'doBrowse:'
+ #'enabled:' #hasValidSpecSelector
+ #'argument:' #spec
)
) nil
nil
@@ -377,15 +267,15 @@
)
!
-menuTree
+menuEdit
"this window spec was automatically generated by the ST/X MenuEditor"
"do not manually edit this - the builder may not be able to
handle the specification if its corrupted."
"
- MenuEditor new openOnClass:HierarchicalListEditor andSelector:#menuTree
- (Menu new fromLiteralArrayEncoding:(HierarchicalListEditor menuTree)) startUp
+ MenuEditor new openOnClass:HierarchicalListEditor andSelector:#menuEdit
+ (Menu new fromLiteralArrayEncoding:(HierarchicalListEditor menuEdit)) startUp
"
<resource: #menu>
@@ -396,19 +286,119 @@
#(
#(#MenuItem
- #'label:' 'copy'
+ #'label:' 'Cut'
+ #'value:' #doCut
+ #'enabled:' #canCut
+ )
+ #(#MenuItem
+ #'label:' 'Copy'
#'value:' #doCopy
#'enabled:' #canCopy
)
#(#MenuItem
- #'label:' 'cut'
- #'value:' #doCut
- #'enabled:' #canCut
+ #'label:' 'Paste'
+ #'value:' #doPaste
+ #'enabled:' #canPaste
+ )
+ #(#MenuItem
+ #'label:' '-'
+ )
+ #(#MenuItem
+ #'label:' 'Create Child'
+ #'value:' #doCreateChild
+ #'enabled:' #canCreateChildChannel
+ #'labelImage:' #(#ResourceRetriever #HierarchicalListEditor #iconCreateChild)
+ )
+ #(#MenuItem
+ #'label:' 'Create Sister'
+ #'value:' #doCreateSister
+ #'enabled:' #canCreateSisterChannel
+ #'labelImage:' #(#ResourceRetriever #HierarchicalListEditor #iconCreateSister)
+ )
+ ) nil
+ nil
+ )
+!
+
+menuToolbar
+ "this window spec was automatically generated by the ST/X MenuEditor"
+
+ "do not manually edit this - the builder may not be able to
+ handle the specification if its corrupted."
+
+ "
+ MenuEditor new openOnClass:HierarchicalListEditor andSelector:#menuToolbar
+ (Menu new fromLiteralArrayEncoding:(HierarchicalListEditor menuToolbar)) startUp
+ "
+
+ <resource: #menu>
+
+ ^
+
+ #(#Menu
+
+ #(
+ #(#MenuItem
+ #'label:' 'New'
+ #'isButton:' true
+ #'value:' #doNew
+ #'enabled:' #canCreateChildChannel
+ #'labelImage:' #(#ResourceRetriever nil #newIcon)
)
#(#MenuItem
- #'label:' 'paste'
- #'value:' #doPaste
- #'enabled:' #canPaste
+ #'label:' 'Save'
+ #'isButton:' true
+ #'value:' #doInstall
+ #'enabled:' #canCreateChildChannel
+ #'labelImage:' #(#ResourceRetriever nil #saveIcon)
+ )
+ #(#MenuItem
+ #'label:' ''
+ )
+ #(#MenuItem
+ #'label:' 'Create Child'
+ #'isButton:' true
+ #'value:' #doCreateChild
+ #'enabled:' #canCreateChildChannel
+ #'labelImage:' #(#ResourceRetriever #MenuEditor #submenuImage)
+ )
+ #(#MenuItem
+ #'label:' 'Create Sister'
+ #'isButton:' true
+ #'value:' #doCreateSister
+ #'enabled:' #canCreateSisterChannel
+ #'labelImage:' #(#ResourceRetriever #MenuEditor #menuItemImage)
+ )
+ #(#MenuItem
+ #'label:' ''
+ )
+ #(#MenuItem
+ #'label:' 'Step Up'
+ #'isButton:' true
+ #'value:' #doStepUp
+ #'enabled:' #canStepOverChannel
+ #'labelImage:' #(#ResourceRetriever nil #upIcon)
+ )
+ #(#MenuItem
+ #'label:' 'Step Down'
+ #'isButton:' true
+ #'value:' #doStepDown
+ #'enabled:' #canStepOverChannel
+ #'labelImage:' #(#ResourceRetriever nil #downIcon)
+ )
+ #(#MenuItem
+ #'label:' 'Step In'
+ #'isButton:' true
+ #'value:' #doStepIn
+ #'enabled:' #canStepInChannel
+ #'labelImage:' #(#ResourceRetriever nil #downRightIcon)
+ )
+ #(#MenuItem
+ #'label:' 'Step Out'
+ #'isButton:' true
+ #'value:' #doStepOut
+ #'enabled:' #canStepOutChannel
+ #'labelImage:' #(#ResourceRetriever nil #leftDownIcon)
)
) nil
nil
@@ -434,11 +424,12 @@
#'window:'
#(#WindowSpec
#'name:' 'Painter'
- #'layout:' #(#LayoutFrame 275 0 381 0 665 0 550 0)
+ #'layout:' #(#LayoutFrame 153 0 206 0 433 0 284 0)
#'label:' 'Painter'
#'min:' #(#Point 10 10)
#'max:' #(#Point 1160 870)
- #'bounds:' #(#Rectangle 275 381 666 551)
+ #'bounds:' #(#Rectangle 153 206 434 285)
+ #'usePreferredExtent:' false
)
#'component:'
#(#SpecCollection
@@ -446,21 +437,14 @@
#(
#(#LabelSpec
#'name:' 'boxLabel'
- #'layout:' #(#Point 5 10)
- #'label:' 'class & method for code:'
+ #'layout:' #(#LayoutFrame 0 0.0 3 0 0 1.0 20 0)
+ #'label:' 'Selector for code:'
#'adjust:' #left
#'resizeForLabel:' true
)
- #(#LabelSpec
- #'name:' 'methodLabel'
- #'layout:' #(#AlignmentOrigin 45 0.11 74 0 1 0.5)
- #'label:' 'method:'
- #'adjust:' #right
- #'resizeForLabel:' true
- )
#(#InputFieldSpec
#'name:' 'methodField'
- #'layout:' #(#LayoutFrame 47 0.11 64 0 -2 1.0 86 0)
+ #'layout:' #(#LayoutFrame 0 0.0 22 0 0 1.0 44 0)
#'tabable:' true
#'model:' #specSelectorChannel
#'type:' #string
@@ -474,18 +458,18 @@
#(
#(#ActionButtonSpec
#'name:' 'cancel'
- #'label:' 'cancel'
+ #'label:' 'Cancel'
#'tabable:' true
#'model:' #cancel
- #'extent:' #(#Point 191 24)
+ #'extent:' #(#Point 136 24)
)
#(#ActionButtonSpec
#'name:' 'accept'
- #'label:' 'ok'
+ #'label:' 'OK'
#'tabable:' true
+ #'model:' #accept
#'isDefault:' true
- #'model:' #accept
- #'extent:' #(#Point 191 24)
+ #'extent:' #(#Point 136 24)
)
)
)
@@ -518,128 +502,97 @@
#(#FullSpec
#'window:'
#(#WindowSpec
- #'name:' 'HierarchicalListEditor'
- #'layout:' #(#LayoutFrame 437 0 260 0 1004 0 554 0)
+ #'name:' 'Hierarchical List Editor'
+ #'layout:' #(#LayoutFrame 67 0 325 0 541 0 637 0)
#'label:' 'Hierarchical List Editor'
#'min:' #(#Point 10 10)
#'max:' #(#Point 1160 870)
- #'bounds:' #(#Rectangle 437 260 1005 555)
+ #'bounds:' #(#Rectangle 67 325 542 638)
+ #'menu:' #menu
+ #'usePreferredExtent:' false
)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#MenuPanelSpec
- #'name:' 'menuMain'
- #'layout:' #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
- #'menu:' #menuMain
+ #'name:' 'menuToolbarView'
+ #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 32 0)
+ #'menu:' #menuToolbar
)
#(#VariableHorizontalPanelSpec
- #'name:' 'variableHorizontalPanel1'
- #'layout:' #(#LayoutFrame 0 0.0 26 0.0 0 1.0 0 1.0)
+ #'name:' 'variableHorizontalPanel'
+ #'layout:' #(#LayoutFrame 0 0.0 34 0.0 0 1.0 -22 1.0)
#'component:'
#(#SpecCollection
#'collection:'
#(
- #(#ViewSpec
- #'name:' 'view1'
- #'component:'
- #(#SpecCollection
- #'collection:'
- #(
- #(#MenuPanelSpec
- #'name:' 'menuButtons'
- #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 28 0)
- #'menu:' #menuButtons
- )
- #(#ArbitraryComponentSpec
- #'name:' 'treeView'
- #'layout:' #(#LayoutFrame 0 0.0 28 0.0 0 1.0 0 1.0)
- #'menu:' #menuTree
- #'hasHorizontalScrollBar:' true
- #'hasVerticalScrollBar:' true
- #'miniScrollerHorizontal:' true
- #'miniScrollerVertical:' true
- #'component:' #treeView
- #'hasBorder:' false
- )
- )
- )
+ #(#ArbitraryComponentSpec
+ #'name:' 'treeView'
+ #'menu:' #menuEdit
+ #'hasHorizontalScrollBar:' true
+ #'hasVerticalScrollBar:' true
+ #'miniScrollerHorizontal:' true
+ #'miniScrollerVertical:' true
+ #'component:' #treeView
+ #'hasBorder:' false
)
#(#ViewSpec
- #'name:' 'view2'
+ #'name:' 'specView'
#'component:'
#(#SpecCollection
#'collection:'
#(
- #(#ViewSpec
- #'name:' 'viewSpec'
- #'layout:' #(#LayoutFrame 0 0 0 0 0 0 0 0)
- #'component:'
- #(#SpecCollection
- #'collection:'
- #(
- #(#LabelSpec
- #'name:' 'nameLabel'
- #'layout:' #(#AlignmentOrigin 75 0 36 0 1 0.5)
- #'label:' 'Name:'
- #'resizeForLabel:' true
- )
- #(#InputFieldSpec
- #'name:' 'nameFiled'
- #'layout:' #(#LayoutFrame 81 0 26 0 -5 1.0 48 0)
- #'model:' #itemName
- )
- #(#LabelSpec
- #'name:' 'valueLabel'
- #'layout:' #(#AlignmentOrigin 75 0 71 0 1 0.5)
- #'label:' 'Value:'
- #'resizeForLabel:' true
- )
- #(#InputFieldSpec
- #'name:' 'valueField'
- #'layout:' #(#LayoutFrame 81 0 61 0 -5 1.0 83 0)
- #'model:' #itemValue
- #'type:' #symbolOrNil
- )
- #(#HorizontalPanelViewSpec
- #'name:' 'commitPanel'
- #'layout:' #(#LayoutFrame 0 0.0 -30 1.0 0 1.0 0 1.0)
- #'component:'
- #(#SpecCollection
- #'collection:'
- #(
- #(#ActionButtonSpec
- #'name:' 'cancelButton'
- #'label:' 'cancel'
- #'model:' #cancel
- #'enableChannel:' #modifiedChannel
- #'extent:' #(#Point 1 22)
- )
- #(#ActionButtonSpec
- #'name:' 'acceptButton'
- #'label:' 'ok'
- #'model:' #accept
- #'enableChannel:' #modifiedChannel
- #'extent:' #(#Point 1 22)
- )
- )
- )
- #'horizontalLayout:' #fitSpace
- #'verticalLayout:' #center
- #'horizontalSpace:' 3
- #'verticalSpace:' 3
- )
- )
- )
+ #(#LabelSpec
+ #'name:' 'nameLabel'
+ #'layout:' #(#AlignmentOrigin 107 0 25 0 1 0.5)
+ #'label:' 'Name:'
+ #'resizeForLabel:' true
+ )
+ #(#InputFieldSpec
+ #'name:' 'nameInputField'
+ #'layout:' #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
+ #'model:' #itemName
+ )
+ #(#LabelSpec
+ #'name:' 'valueLabel'
+ #'layout:' #(#AlignmentOrigin 107 0 51 0 1 0.5)
+ #'label:' 'Value:'
+ #'resizeForLabel:' true
+ )
+ #(#InputFieldSpec
+ #'name:' 'valueInputField'
+ #'layout:' #(#LayoutFrame 110 0 41 0 -5 1.0 63 0)
+ #'model:' #itemValue
+ #'type:' #symbolOrNil
+ )
+ #(#UISubSpecification
+ #'name:' 'SubSpecification'
+ #'layout:' #(#LayoutFrame 2 0.0 -26 1.0 -2 1.0 -2 1.0)
+ #'majorKey:' #ToolApplicationModel
+ #'minorKey:' #windowSpecForCommit
)
)
)
- #'borderWidth:' 1
+ #'level:' -1
)
)
)
- #'handles:' #(#Any 0.5 1.0)
+ #'handles:' #(#Any 0.368421 1.0)
+ )
+ #(#LabelSpec
+ #'name:' 'infoLabel'
+ #'layout:' #(#LayoutFrame 0 0.0 -22 1 -80 1.0 0 1.0)
+ #'labelChannel:' #valueOfInfoLabel
+ #'level:' 1
+ #'adjust:' #left
+ )
+ #(#LabelSpec
+ #'name:' 'timeLabel'
+ #'layout:' #(#LayoutFrame -80 1 -22 1 0 1.0 0 1.0)
+ #'labelChannel:' #valueOfTimeLabel
+ #'level:' 1
+ #'adjust:' #right
)
)
)
@@ -702,49 +655,15 @@
!HierarchicalListEditor methodsFor:'accessing'!
didInstall
- "returns true if spec was installed by operator
- "
- ^ didInstall ? false
+ "returns true if spec was installed by operator"
+
+ ^didInstall ? false
!
selectorName
- "returns current spec. selector
- "
- ^ specSelector
-! !
-
-!HierarchicalListEditor methodsFor:'actions'!
-
-accept
- "accept changes"
-
- |node index|
+ "returns current spec. selector"
- (index := treeView selectedIndex) ~~ 0 ifTrue:[
- node := treeView nodeAtIndex:index.
- node name:(self itemName value).
- node contents:(self itemValue value).
- treeView redrawLine:index.
- ].
- self modifiedChannel value:false.
-
-!
-
-cancel
- "reload selected item and update channels
- "
- |node|
-
- (node := treeView selectedNode) notNil ifTrue:[
- self itemName value:node name.
- self itemValue value:node contents.
- (builder componentAt:#viewSpec) extent:1.0@1.0.
- ] ifFalse:[
- (builder componentAt:#viewSpec) extent:0@0.
- self itemName value:''.
- self itemValue value:nil.
- ].
- self modifiedChannel value:false.
+ ^specSelector
! !
!HierarchicalListEditor methodsFor:'aspects'!
@@ -752,35 +671,35 @@
canCreateChildChannel
"automatically generated by UIPainter ..."
- ^ builder booleanValueAspectFor:#canCreateChildChannel
+ ^builder booleanValueAspectFor:#canCreateChildChannel
!
canCreateSisterChannel
"automatically generated by UIPainter ..."
- ^ builder booleanValueAspectFor:#canCreateSisterChannel
+ ^builder booleanValueAspectFor:#canCreateSisterChannel
!
canStepInChannel
"automatically generated by UIPainter ..."
- ^ builder booleanValueAspectFor:#canStepInChannel
+ ^builder booleanValueAspectFor:#canStepInChannel
!
canStepOutChannel
"automatically generated by UIPainter ..."
- ^ builder booleanValueAspectFor:#canStepOutChannel
+ ^builder booleanValueAspectFor:#canStepOutChannel
!
canStepOverChannel
"automatically generated by UIPainter ..."
- ^ builder booleanValueAspectFor:#canStepOverChannel
+ ^builder booleanValueAspectFor:#canStepOverChannel
!
@@ -808,39 +727,297 @@
^ holder
!
-modifiedChannel
- "automatically generated by UIPainter ..."
-
- ^ builder booleanValueAspectFor:#modifiedChannel
-
-!
-
treeView
"automatically generated by UIPainter ..."
- ^ treeView
+ ^treeView
! !
!HierarchicalListEditor methodsFor:'change & update'!
update:something with:aParameter from:someObject
- "one of my models changed
- "
- self modifiedChannel value:true
+ "one of my models changed"
+
+ self valueOfEnablingCommitButtons value: true
+! !
+
+!HierarchicalListEditor methodsFor:'private'!
+
+checkMenuItemModified
+ "check item modification"
+
+ self valueOfEnablingCommitButtons value
+ ifTrue:
+ [
+ ((YesNoBox title:'Item was modified!!\Save it?\' withCRs)
+ noText:'No';
+ yesText:'Yes';
+ showAtPointer;
+ accepted) ifFalse: [self valueOfEnablingCommitButtons value: false. ^true].
+ self accept
+ ].
+ ^true
+!
+
+newItem
+ "creates and returns a new default item"
+
+ ^TreeItem name: 'Undefined' contents: nil
+!
+
+updateChannels
+ "update channels"
+
+ |node parent chnStepIn chnStepOut chnStepOvr chnChild chnSister|
+
+ chnStepIn := chnStepOut := chnStepOvr := chnChild := chnSister := false.
+
+ (node := treeView selectedNode) notNil
+ ifTrue:
+ [
+ (builder componentAt: #specView) beVisible.
+ chnChild := true.
+ (parent := node parent) notNil
+ ifTrue:
+ [
+ chnSister := true.
+ chnStepOvr := parent numberOfChildren > 1.
+ chnStepOut := parent parent notNil.
+ chnStepIn := node ~~ parent lastChild
+ ]
+ ]
+ ifFalse:
+ [
+ (builder componentAt: #specView) beInvisible
+ ].
+ self canCreateChildChannel value:chnChild.
+ self canCreateSisterChannel value:chnSister.
+ self canStepOverChannel value:chnStepOvr.
+ self canStepOutChannel value:chnStepOut.
+ self canStepInChannel value:chnStepIn
+!
+
+updateInputFields
+ "reload item value into input fields"
+
+ |node|
+
+ (node := treeView selectedNode) notNil
+ ifTrue:
+ [
+ self itemName value:node name.
+ self itemValue value:node contents
+ ]
+ ifFalse:
+ [
+ self itemName value:''.
+ self itemValue value:nil
+ ].
+ self valueOfEnablingCommitButtons value: false
! !
-!HierarchicalListEditor methodsFor:'menu buttons'!
+!HierarchicalListEditor methodsFor:'queries'!
+
+canChangeClassName
+ "returns true if current class could be changed which is dependent on
+ the mode: standalone or started by UIPainter"
+
+ ^masterApplication isNil
+!
+
+canCopy
+ "returns true if any selection exists"
+
+ ^treeView selection notNil
+!
+
+canCut
+ "returns true if any selection exists and not includes
+ the anchor (first element into list)."
+
+ treeView selection notNil ifTrue:[^(treeView isInSelection:1) not].
+ ^false
+!
+
+canPaste
+ "returns true if something to be paste exists and a
+ single selection exists"
+
+ ^CopyBuffer notNil and:[treeView selectedNode notNil]
+!
+
+hasValidClass
+ "returns true if the class defined allready exists"
+
+ ^specClass isBehavior
+!
+
+hasValidMethodSelector
+ "returns true if the class and the instance selector defined
+ allready exists."
+
+ (specSelector notNil and:[self hasValidClass])
+ ifTrue:
+ [
+ ^(specClass compiledMethodAt:specSelector) notNil
+ ].
+ ^false
+!
+
+hasValidSpecSelector
+ "returns true if the class and the class selector defined
+ allready exists."
+
+ (specSelector notNil and:[self hasValidClass])
+ ifTrue:
+ [
+ ^(specClass class compiledMethodAt:specSelector) notNil
+ ].
+ ^false
+! !
+
+!HierarchicalListEditor methodsFor:'startup / release'!
+
+buildFrom:aClass andSelector:aSelector
+ "rebuild window from a class and selector"
+
+ |sel anchor|
+
+ specClass := self resolveName:aClass.
+ specSelector := nil.
+
+ aSelector size ~~ 0
+ ifTrue:
+ [
+ sel := aSelector asString withoutSeparators.
+ sel size ~~ 0 ifTrue:[specSelector := sel asSymbol]
+ ].
+ treeView selection:nil.
+
+ (specSelector notNil and:[specClass notNil])
+ ifTrue:
+ [
+ (specClass respondsTo:specSelector)
+ ifTrue:
+ [
+ anchor := specClass perform:specSelector.
+ anchor isArray ifTrue:[anchor := anchor decodeAsLiteralArray]
+ ]
+ ].
+ anchor notNil
+ ifTrue: [anchor expand. treeView root:anchor]
+ ifFalse:[self doNew]
+!
+
+initialize
+ "setup default values"
+
+ super initialize.
+
+ treeView := SelectionInTreeView new.
+ treeView multipleSelectOk: true.
+ treeView showDirectoryIndicator: true.
+ treeView showDirectoryIndicatorForRoot: false.
+ treeView action:[:aNr| self updateChannels. self updateInputFields].
+ treeView selectConditionBlock: [:i|self checkMenuItemModified].
+ treeView validateDoubleClickBlock: [:node| node ~~ treeView model list first].
+ self doNew.
+!
+
+openModalOnClass:aClass andSelector:aSelector
+ "open modal on class and selector"
+
+ specClass := Association key:aClass value:aSelector.
+ super openInterfaceModal.
+
+
+!
+
+openOnClass:aClass andSelector:aSelector
+ "open on class and selector"
+
+ specClass := Association key:aClass value:aSelector.
+ super openInterface.
+
+!
+
+postBuildWith:builder
+ "setup view"
+
+ |cls sel|
+
+ specClass isAssociation ifTrue:[
+ cls := specClass key.
+ sel := specClass value.
+ ].
+ self buildFrom:cls andSelector:sel.
+
+! !
+
+!HierarchicalListEditor methodsFor:'user actions'!
+
+accept
+ "invoked by button 'OK'"
+
+ |node index|
+
+ (index := treeView selectedIndex) ~~ 0
+ ifTrue:
+ [
+ node := treeView nodeAtIndex:index.
+ node name: self itemName value.
+ node contents: self itemValue value.
+ treeView redrawLine:index.
+ ].
+ self valueOfEnablingCommitButtons value: false
+!
+
+cancel
+ "invoked by button 'Cancel'"
+
+ self updateInputFields.
+
+ self valueOfEnablingCommitButtons value: false
+!
+
+doBrowse:what
+ "open a system browser"
+
+ |cls sel|
+
+ (cls := specClass) notNil
+ ifTrue:
+ [
+ what == #class
+ ifFalse:
+ [
+ (sel := specSelector) isNil ifTrue:[^self].
+ what == #spec ifTrue:[cls := cls class]
+ ].
+ SystemBrowser openInClass:cls selector:sel
+ ]
+!
+
+doCopy
+ "copy current selected nodes into copy buffer"
+
+ CopyBuffer := OrderedCollection new.
+ treeView selectedNodesDo:[:aNode| CopyBuffer add: aNode copy]
+
+!
doCreateChild
- "create a child within selected parent
- "
+ "create a child within selected parent"
+
|node|
- (node := treeView selectedNode) notNil ifTrue:[
- treeView model add:(self newItem) beforeIndex:1 below:node.
+ (node := treeView selectedNode) notNil
+ ifTrue:
+ [
+ treeView model add: self newItem beforeIndex:1 below:node.
treeView selectedNodeExpand:true.
self updateChannels.
- ].
+ ]
!
doCreateSister
@@ -848,79 +1025,37 @@
"
|node|
- (node := treeView selectedNode) notNil ifTrue:[
- node parent notNil ifTrue:[
- treeView model add:(self newItem) after:node
- ] ifFalse:[
- treeView model add:(self newItem) beforeIndex:1 below:node
- ].
+ (node := treeView selectedNode) notNil
+ ifTrue:
+ [
+ node parent notNil
+ ifTrue: [treeView model add: self newItem after:node]
+ ifFalse:[treeView model add: self newItem beforeIndex:1 below:node].
self updateChannels
- ].
-!
-
-doStepDown
- "move selected item after next item
- "
- treeView selectedNodeChangeSequenceOrder:1.
- self updateChannels.
-!
-
-doStepIn
- "lets become the selected item a child of its next sister
- "
- treeView selectedNodeBecomeChildOfNext.
- self updateChannels.
-!
-
-doStepOut
- "let selected node become a sister of its current parent
- "
- treeView selectedNodeBecomeSisterOfParent.
- self updateChannels.
+ ]
!
-doStepUp
- "move selected item before previous item
- "
- treeView selectedNodeChangeSequenceOrder:-1.
- self updateChannels.
-!
-
-menuButtons
- "this window spec was automatically generated by the ST/X MenuEditor"
-
- ^ self class menuButtons
-
-
-! !
+doCut
+ "cut current selected nodes"
-!HierarchicalListEditor methodsFor:'menu main'!
-
-doBrowse:what
- "open a system browser
- "
- |cls sel|
-
- (cls := specClass) notNil ifTrue:[
- what == #class ifFalse:[
- (sel := specSelector) isNil ifTrue:[
- ^ self
- ].
- what == #spec ifTrue:[cls := cls class]
- ].
-
- SystemBrowser openInClass:cls selector:sel
+ |selection|
+ treeView hasSelection
+ ifTrue:
+ [
+ self doCopy.
+ selection := treeView selection asSortedCollection.
+ treeView selectedNodesRemove.
+ treeView selection: selection first - 1.
+ self updateChannels
]
!
doDefineClass
- "define class and selector
- "
+ "define class and selector"
+
|sel cls bindings accepted|
- masterApplication notNil ifTrue:[
- ^ self information:'only selector could be changed.'
- ].
+ masterApplication notNil ifTrue:[^self information:'Only selector can be changed.'].
accepted := true.
bindings := IdentityDictionary new.
@@ -930,22 +1065,24 @@
specSelector notNil ifTrue:[sel := specSelector asString]
ifFalse:[sel := ''].
- bindings at:#specSelectorChannel put:(sel asValue).
- bindings at:#specClassChannel put:(cls asValue).
-
- [accepted] whileTrue:[
- accepted := self openDialogInterface:#classAndMethodSpec withBindings:bindings.
+ bindings at:#specSelectorChannel put: sel asValue.
+ bindings at:#specClassChannel put: cls asValue.
- accepted ifTrue:[
- cls := self resolveName:(bindings at:#specClassChannel) value.
-
- cls notNil ifTrue:[
- sel := (bindings at:#specSelectorChannel) value withoutSeparators.
-
- sel size ~~ 0 ifTrue:[
+ [accepted]
+ whileTrue:
+ [
+ (accepted := self openDialogInterface:#classAndMethodSpec withBindings:bindings)
+ ifTrue:
+ [
+ (cls := self resolveName:(bindings at:#specClassChannel) value) notNil
+ ifTrue:
+ [
+ (sel := (bindings at:#specSelectorChannel) value withoutSeparators) size ~~ 0
+ ifTrue:
+ [
specClass := cls.
specSelector := sel asSymbol.
- ^ self
+ ^self
]
]
]
@@ -954,8 +1091,8 @@
!
doDefineSelector
- "define selector only
- "
+ "define selector only"
+
|sel bindings accepted|
accepted := true.
@@ -966,15 +1103,17 @@
bindings at:#specSelectorChannel put:(sel asValue).
- [accepted] whileTrue:[
- accepted := self openDialogInterface:#methodSpec withBindings:bindings.
-
- accepted ifTrue:[
- sel := (bindings at:#specSelectorChannel) value withoutSeparators.
-
- sel size ~~ 0 ifTrue:[
+ [accepted]
+ whileTrue:
+ [
+ (accepted := self openDialogInterface:#methodSpec withBindings:bindings)
+ ifTrue:
+ [
+ (sel := (bindings at:#specSelectorChannel) value withoutSeparators) size ~~ 0
+ ifTrue:
+ [
specSelector := sel asSymbol.
- ^ self
+ ^self
]
]
]
@@ -982,12 +1121,14 @@
!
doInstall
- "install code
- "
+ "install code"
+
|code spec category mthd stream|
- (specClass notNil and:[specSelector notNil]) ifFalse:[
- ^ self information:'no valid class & method defined'.
+ (specClass notNil and:[specSelector notNil])
+ ifFalse:
+ [
+ ^self information:'No valid class and method defined!!'
].
spec := (treeView nodeAtIndex:1) literalArrayEncoding.
@@ -997,8 +1138,10 @@
category := 'interface specs'.
didInstall := true.
- (mthd := specClass class compiledMethodAt:specSelector) notNil ifTrue:[
- category := mthd category.
+ (mthd := specClass class compiledMethodAt:specSelector) notNil
+ ifTrue:
+ [
+ category := mthd category
].
code := Character excla asString
@@ -1027,7 +1170,9 @@
code := code withCRs.
(ReadStream on:code) fileIn.
- (specClass compiledMethodAt:specSelector) isNil ifTrue:[
+ (specClass compiledMethodAt:specSelector) isNil
+ ifTrue:
+ [
category := 'aspects'.
code := Character excla asString
@@ -1044,233 +1189,60 @@
, '\\'.
code := code withCRs.
- (ReadStream on:code) fileIn.
- ].
+ (ReadStream on:code) fileIn
+ ]
!
doNew
- "remove all items; restart
- "
+ "remove all items; restart"
+
treeView root:(TreeItem name:'Anchor' contents:#anchor).
- treeView selection:0.
+ treeView selection:0
!
+doPaste
+ "paste after current selected item"
+
+ treeView selectedNodeAdd:CopyBuffer.
+ self updateChannels
+!
+
doReload
- "reload spec from current class and selector
- "
+ "reload spec from current class and selector"
+
self buildFrom:specClass andSelector:specSelector
!
-menuMain
- "this window spec was automatically generated by the ST/X MenuEditor"
-
- ^ self class menuMain
-
-
-! !
-
-!HierarchicalListEditor methodsFor:'menu tree'!
-
-doCopy
- "copy current selected nodes into copy buffer
- "
- CopyBuffer := OrderedCollection new.
- treeView selectedNodesDo:[:aNode| CopyBuffer add:(aNode copy)].
-
-!
-
-doCut
- "cut current selected nodes
- "
- treeView hasSelection ifTrue:[
- self doCopy.
- treeView selectedNodesRemove.
- self updateChannels.
- ]
-!
-
-doPaste
- "paste after current selected item
- "
- treeView selectedNodeAdd:CopyBuffer.
- self updateChannels.
-!
-
-menuTree
- "this window spec was automatically generated by the ST/X MenuEditor"
-
- ^ self class menuTree
-
-
-! !
-
-!HierarchicalListEditor methodsFor:'private'!
+doStepDown
+ "move selected item after next item"
-newItem
- "creates and returns a new default item
- "
- ^ TreeItem name:'undefined' contents:nil
-!
-
-updateChannels
- "update channels
- "
- |node parent chnStepIn chnStepOut chnStepOvr chnChild chnSister|
-
- chnStepIn := chnStepOut := chnStepOvr := chnChild := chnSister := false.
-
- (node := treeView selectedNode) notNil ifTrue:[
- chnChild := true.
-
- (parent := node parent) notNil ifTrue:[
- chnSister := true.
- chnStepOvr := parent numberOfChildren > 1.
- chnStepOut := parent parent notNil.
- chnStepIn := node ~~ parent lastChild.
- ]
- ].
- self canCreateChildChannel value:chnChild.
- self canCreateSisterChannel value:chnSister.
- self canStepOverChannel value:chnStepOvr.
- self canStepOutChannel value:chnStepOut.
- self canStepInChannel value:chnStepIn.
-! !
-
-!HierarchicalListEditor methodsFor:'queries'!
-
-canChangeClassName
- "returns true if current class could be changed which is dependent on
- the mode: standalone or started by UIPainter
- "
- ^ masterApplication isNil
-!
-
-canCopy
- "returns true if any selection exists
- "
- ^ treeView selection notNil
-!
-
-canCut
- "returns true if any selection exists and not includes
- the anchor (first element into list).
- "
- treeView selection notNil ifTrue:[
- ^ (treeView isInSelection:1) not
- ].
- ^ false
+ treeView selectedNodeChangeSequenceOrder:1.
+ self updateChannels
!
-canPaste
- "returns true if something to be paste exists and a
- single selection exists
- "
- ^ (CopyBuffer notNil and:[treeView selectedNode notNil])
-!
+doStepIn
+ "lets become the selected item a child of its next sister"
-hasValidClass
- "returns true if the class defined allready exists
- "
- ^ specClass isBehavior
-!
-
-hasValidMethodSelector
- "returns true if the class and the instance selector defined
- allready exists.
- "
- (specSelector notNil and:[self hasValidClass]) ifTrue:[
- ^ (specClass compiledMethodAt:specSelector) notNil
- ].
- ^ false
+ treeView selectedNodeBecomeChildOfNext.
+ self updateChannels
!
-hasValidSpecSelector
- "returns true if the class and the class selector defined
- allready exists.
- "
- (specSelector notNil and:[self hasValidClass]) ifTrue:[
- ^ (specClass class compiledMethodAt:specSelector) notNil
- ].
-! !
-
-!HierarchicalListEditor methodsFor:'startup/release'!
-
-buildFrom:aClass andSelector:aSelector
- "rebuild window from a class and selector
- "
- |sel anchor|
-
- specClass := self resolveName:aClass.
- specSelector := nil.
+doStepOut
+ "let selected node become a sister of its current parent"
- aSelector size ~~ 0 ifTrue:[
- sel := aSelector asString withoutSeparators.
- sel size ~~ 0 ifTrue:[
- specSelector := sel asSymbol
- ]
- ].
- treeView selection:nil.
-
- (specSelector notNil and:[specClass notNil]) ifTrue:[
- (specClass respondsTo:specSelector) ifTrue:[
- anchor := specClass perform:specSelector.
-
- anchor isArray ifTrue:[
- anchor := anchor decodeAsLiteralArray.
- ]
- ]
- ].
- anchor notNil ifTrue:[
- anchor expand.
- treeView root:anchor.
- ] ifFalse:[
- self doNew
- ].
+ treeView selectedNodeBecomeSisterOfParent.
+ self updateChannels
!
-initialize
- "setup default values
- "
- super initialize.
-
- treeView := SelectionInTreeView new.
- treeView multipleSelectOk:true.
- treeView action:[:aNr| self updateChannels. self cancel ].
- self doNew.
-!
-
-openModalOnClass:aClass andSelector:aSelector
- "open modal on class and selector
- "
- specClass := Association key:aClass value:aSelector.
- super openInterfaceModal.
-
-
-!
+doStepUp
+ "move selected item before previous item"
-openOnClass:aClass andSelector:aSelector
- "open on class and selector
- "
- specClass := Association key:aClass value:aSelector.
- super openInterface.
-
-!
-
-postBuildWith:builder
- "setup view
- "
- |cls sel|
-
- specClass isAssociation ifTrue:[
- cls := specClass key.
- sel := specClass value.
- ].
- self buildFrom:cls andSelector:sel.
-
+ treeView selectedNodeChangeSequenceOrder:-1.
+ self updateChannels
! !
!HierarchicalListEditor class methodsFor:'documentation'!