diff -r f85de4fc2a2c -r ea6880a0e024 HierarchicalListEditor.st --- 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 - - - - IconCreateChild isNil ifTrue:[ - IconCreateChild := Image fromFile:'bitmaps/ui_hierListChild.xpm'. - ]. - ^ IconCreateChild. - -" -IconCreateChild := nil -" -! - -iconCreateSister - - - - 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 - " - - - - ^ - - #(#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 " @@ -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 " @@ -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 + " + + + + ^ + + #(#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'!