diff -r d9ed26eeafe9 -r 249e94fdeb94 HierarchicalListEditor.st --- a/HierarchicalListEditor.st Wed Jan 28 16:24:22 1998 +0100 +++ b/HierarchicalListEditor.st Wed Jan 28 18:20:27 1998 +0100 @@ -78,12 +78,12 @@ #(#FullSpec #'window:' #(#WindowSpec - #'name:' 'Painter' - #'layout:' #(#LayoutFrame 233 0 430 0 533 0 558 0) - #'label:' 'Painter' + #'name:' 'Hierarchical List Editor' + #'layout:' #(#LayoutFrame 197 0 172 0 497 0 300 0) + #'label:' 'Hierarchical List Editor' #'min:' #(#Point 10 10) #'max:' #(#Point 1160 870) - #'bounds:' #(#Rectangle 233 430 534 559) + #'bounds:' #(#Rectangle 197 172 498 301) #'usePreferredExtent:' false ) #'component:' @@ -107,6 +107,7 @@ #(#InputFieldSpec #'name:' 'classField' #'layout:' #(#LayoutFrame 47 0.11 39 0 -2 1.0 61 0) + #'enableChannel:' #canChangeClassName #'tabable:' true #'model:' #specClassChannel ) @@ -135,305 +136,6 @@ ) ! -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:#menu - (Menu new fromLiteralArrayEncoding:(HierarchicalListEditor menu)) startUp - " - - - - ^ - - #(#Menu - - #( - #(#MenuItem - #'label:' 'About' - #'labelImage:' #(#ResourceRetriever nil #icon) - #'submenuChannel:' #menuAbout - ) - #(#MenuItem - #'label:' 'File' - #'submenu:' - #(#Menu - - #( - #(#MenuItem - #'label:' 'New' - #'value:' #doNew - ) - #(#MenuItem - #'label:' 'Reload' - #'value:' #doReload - ) - #(#MenuItem - #'label:' '-' - ) - #(#MenuItem - #'label:' 'Save' - #'value:' #doInstall - #'enabled:' #hasValidClass - ) - #(#MenuItem - #'label:' '-' - ) - #(#MenuItem - #'label:' 'Define Selector...' - #'value:' #doDefineSelector - #'enabled:' #hasValidClass - ) - #(#MenuItem - #'label:' 'Define Class...' - #'value:' #doDefineClass - #'enabled:' #canChangeClassName - ) - #(#MenuItem - #'label:' '-' - ) - #(#MenuItem - #'label:' 'Exit' - #'value:' #closeRequest - ) - ) nil - nil - ) - ) - #(#MenuItem - #'label:' 'Edit' - #'submenuChannel:' #menuEdit - ) - #(#MenuItem - #'label:' 'Browse' - #'enabled:' #hasValidClass - #'submenu:' - #(#Menu - - #( - #(#MenuItem - #'label:' 'Class' - #'value:' #'doBrowse:' - #'argument:' #class - ) - #(#MenuItem - #'label:' 'Method' - #'value:' #'doBrowse:' - #'enabled:' #hasValidMethodSelector - #'argument:' #method - ) - #(#MenuItem - #'label:' 'Specification' - #'value:' #'doBrowse:' - #'enabled:' #hasValidSpecSelector - #'argument:' #spec - ) - ) nil - nil - ) - ) - ) nil - nil - ) -! - -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:#menuEdit - (Menu new fromLiteralArrayEncoding:(HierarchicalListEditor menuEdit)) startUp - " - - - - ^ - - #(#Menu - - #( - #(#MenuItem - #'label:' 'Cut' - #'value:' #doCut - #'enabled:' #canCut - ) - #(#MenuItem - #'label:' 'Copy' - #'value:' #doCopy - #'enabled:' #canCopy - ) - #(#MenuItem - #'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:' '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 nil #createChildIcon) - ) - #(#MenuItem - #'label:' 'Create Sister' - #'isButton:' true - #'value:' #doCreateSister - #'enabled:' #canCreateSisterChannel - #'labelImage:' #(#ResourceRetriever nil #createSisterIcon) - ) - #(#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 - ) -! - -methodSpec - "this window spec was automatically generated by the ST/X UIPainter" - - "do not manually edit this - the painter/builder may not be able to - handle the specification if its corrupted." - - " - UIPainter new openOnClass:HierarchicalListEditor andSelector:#methodSpec - HierarchicalListEditor new openInterface:#methodSpec - " - - - - ^ - - #(#FullSpec - #'window:' - #(#WindowSpec - #'name:' 'Painter' - #'layout:' #(#LayoutFrame 151 0 377 0 431 0 455 0) - #'label:' 'Painter' - #'min:' #(#Point 10 10) - #'max:' #(#Point 1160 870) - #'bounds:' #(#Rectangle 151 377 432 456) - #'usePreferredExtent:' false - ) - #'component:' - #(#SpecCollection - #'collection:' - #( - #(#LabelSpec - #'name:' 'boxLabel' - #'layout:' #(#LayoutFrame 0 0.0 3 0 0 1.0 20 0) - #'label:' 'Selector for code:' - #'adjust:' #left - #'resizeForLabel:' true - ) - #(#InputFieldSpec - #'name:' 'methodField' - #'layout:' #(#LayoutFrame 0 0.0 22 0 0 1.0 44 0) - #'tabable:' true - #'model:' #specSelectorChannel - #'type:' #string - ) - #(#UISubSpecification - #'name:' 'SubSpecification' - #'layout:' #(#LayoutFrame 0 0.0 -29 1 0 1.0 -5 1.0) - #'majorKey:' #ToolApplicationModel - #'minorKey:' #windowSpecForCommitWithoutChannels - ) - ) - ) - ) -! - windowSpec "this window spec was automatically generated by the ST/X UIPainter" @@ -544,6 +246,276 @@ ) ! ! +!HierarchicalListEditor class methodsFor:'menu specs'! + +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:#menu + (Menu new fromLiteralArrayEncoding:(HierarchicalListEditor menu)) startUp + " + + + + ^ + + #(#Menu + + #( + #(#MenuItem + #'label:' 'About' + #'labelImage:' #(#ResourceRetriever nil #icon) + #'submenuChannel:' #menuAbout + ) + #(#MenuItem + #'label:' 'File' + #'submenu:' + #(#Menu + + #( + #(#MenuItem + #'label:' 'New' + #'value:' #doNew + ) + #(#MenuItem + #'label:' 'Reload' + #'value:' #doReload + ) + #(#MenuItem + #'label:' '-' + ) + #(#MenuItem + #'label:' 'Save' + #'value:' #doInstall + #'enabled:' #hasValidClass + ) + #(#MenuItem + #'label:' '-' + ) + #(#MenuItem + #'label:' 'Define Class And Selector...' + #'value:' #doDefineClass + ) + #(#MenuItem + #'label:' '-' + ) + #(#MenuItem + #'label:' 'Exit' + #'value:' #closeRequest + ) + ) nil + nil + ) + ) + #(#MenuItem + #'label:' 'Edit' + #'submenuChannel:' #menuEdit + ) + #(#MenuItem + #'label:' 'Browse' + #'enabled:' #hasValidClass + #'submenu:' + #(#Menu + + #( + #(#MenuItem + #'label:' 'Class' + #'value:' #'doBrowse:' + #'argument:' #class + ) + #(#MenuItem + #'label:' 'Method' + #'value:' #'doBrowse:' + #'enabled:' #hasValidMethodSelector + #'argument:' #method + ) + #(#MenuItem + #'label:' 'Specification' + #'value:' #'doBrowse:' + #'enabled:' #hasValidSpecSelector + #'argument:' #spec + ) + ) nil + nil + ) + ) + ) nil + nil + ) +! + +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:#menuEdit + (Menu new fromLiteralArrayEncoding:(HierarchicalListEditor menuEdit)) startUp + " + + + + ^ + + #(#Menu + + #( + #(#MenuItem + #'label:' 'Cut' + #'value:' #doCut + #'enabled:' #canCut + ) + #(#MenuItem + #'label:' 'Copy' + #'value:' #doCopy + #'enabled:' #canCopy + ) + #(#MenuItem + #'label:' 'Paste' + #'value:' #doPaste + #'enabled:' #canPaste + ) + #(#MenuItem + #'label:' '-' + ) + #(#MenuItem + #'label:' 'Create Child' + #'value:' #doCreateChild + #'enabled:' #canCreateChildChannel + #'labelImage:' #(#ResourceRetriever #HierarchicalListEditor #createChildIcon 'Create Child') + ) + #(#MenuItem + #'label:' 'Create Sister' + #'value:' #doCreateSister + #'enabled:' #canCreateSisterChannel + #'labelImage:' #(#ResourceRetriever #HierarchicalListEditor #createSisterIcon 'Create Sister') + ) + #(#MenuItem + #'label:' '-' + ) + #(#MenuItem + #'label:' 'Move Up' + #'value:' #doStepUp + #'activeHelpKey:' #moveSelectionUp + #'enabled:' #canStepOverChannel + #'labelImage:' #(#ResourceRetriever #ToolApplicationModel #upIcon 'Move Up') + ) + #(#MenuItem + #'label:' 'Move Down' + #'value:' #doStepDown + #'activeHelpKey:' #moveSelectionDown + #'enabled:' #canStepOverChannel + #'labelImage:' #(#ResourceRetriever #ToolApplicationModel #downIcon 'Move Down') + ) + #(#MenuItem + #'label:' 'Move In' + #'value:' #doStepIn + #'activeHelpKey:' #moveSelectionRight + #'enabled:' #canStepInChannel + #'labelImage:' #(#ResourceRetriever #ToolApplicationModel #downRightIcon 'Move In') + ) + #(#MenuItem + #'label:' 'Move Out' + #'value:' #doStepOut + #'activeHelpKey:' #moveSelectionLeft + #'enabled:' #canStepOutChannel + #'labelImage:' #(#ResourceRetriever #ToolApplicationModel #leftDownIcon 'Move Out') + ) + ) 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 + #'labelImage:' #(#ResourceRetriever nil #newIcon) + ) + #(#MenuItem + #'label:' 'Save' + #'isButton:' true + #'value:' #doInstall + #'enabled:' #hasValidClass + #'labelImage:' #(#ResourceRetriever nil #saveIcon) + ) + #(#MenuItem + #'label:' '' + ) + #(#MenuItem + #'label:' 'Create Child' + #'isButton:' true + #'value:' #doCreateChild + #'enabled:' #canCreateChildChannel + #'labelImage:' #(#ResourceRetriever nil #createChildIcon) + ) + #(#MenuItem + #'label:' 'Create Sister' + #'isButton:' true + #'value:' #doCreateSister + #'enabled:' #canCreateSisterChannel + #'labelImage:' #(#ResourceRetriever nil #createSisterIcon) + ) + #(#MenuItem + #'label:' '' + ) + #(#MenuItem + #'label:' 'Move Up' + #'isButton:' true + #'value:' #doStepUp + #'enabled:' #canStepOverChannel + #'labelImage:' #(#ResourceRetriever nil #upIcon) + ) + #(#MenuItem + #'label:' 'Move Down' + #'isButton:' true + #'value:' #doStepDown + #'enabled:' #canStepOverChannel + #'labelImage:' #(#ResourceRetriever nil #downIcon) + ) + #(#MenuItem + #'label:' 'Move In' + #'isButton:' true + #'value:' #doStepIn + #'enabled:' #canStepInChannel + #'labelImage:' #(#ResourceRetriever nil #downRightIcon) + ) + #(#MenuItem + #'label:' 'Move Out' + #'isButton:' true + #'value:' #doStepOut + #'enabled:' #canStepOutChannel + #'labelImage:' #(#ResourceRetriever nil #leftDownIcon) + ) + ) nil + nil + ) +! ! + !HierarchicalListEditor class methodsFor:'printing'! prettyPrintArray:anArray on:aStream indent:anIndent @@ -674,6 +646,13 @@ ! +hasValidClass + "automatically generated by UIPainter ..." + + ^builder booleanValueAspectFor:#hasValidClass + +! + itemName "automatically generated by UIPainter ..." @@ -730,6 +709,22 @@ ^true ! +checkModified + "check menu modification + " + isModified + ifTrue: + [ + ((YesNoBox title:'Hierarchical list was modified!!') + noText:'Cancel'; + yesText:'Waste it and proceed'; + showAtPointer; + accepted) ifFalse: [^false]. + isModified := false + ]. + ^true +! + newItem "creates and returns a new default item" @@ -765,7 +760,9 @@ self canCreateSisterChannel value:chnSister. self canStepOverChannel value:chnStepOvr. self canStepOutChannel value:chnStepOut. - self canStepInChannel value:chnStepIn + self canStepInChannel value:chnStepIn. + + ! updateInputFields @@ -817,12 +814,6 @@ ^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." @@ -873,13 +864,22 @@ [ anchor := specClass perform:specSelector. anchor isArray ifTrue:[anchor := anchor decodeAsLiteralArray] - ] + ]. + self hasValidClass value: true ]. anchor notNil ifTrue: [anchor expand. treeView root:anchor] ifFalse:[self doNew] ! +closeRequest + "close request" + + (self checkMenuItemModified and: [self checkModified]) ifTrue: [super closeRequest] + + +! + initialize "setup default values" @@ -892,7 +892,6 @@ 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 @@ -923,6 +922,8 @@ ]. self buildFrom:cls andSelector:sel. + isModified := false + ! ! !HierarchicalListEditor methodsFor:'user actions'! @@ -940,6 +941,7 @@ node contents: self itemValue value. treeView redrawLine:index. ]. + isModified := true. self valueOfEnablingCommitButtons value: false ! @@ -948,6 +950,7 @@ self updateInputFields. + isModified := false. self valueOfEnablingCommitButtons value: false ! @@ -988,6 +991,7 @@ treeView model add: self newItem beforeIndex:1 below:node. treeView selectedNodeExpand:true. self updateChannels. + isModified := true ] ! @@ -1002,7 +1006,8 @@ node parent notNil ifTrue: [treeView model add: self newItem after:node] ifFalse:[treeView model add: self newItem beforeIndex:1 below:node]. - self updateChannels + self updateChannels. + isModified := true ] ! @@ -1017,7 +1022,8 @@ selection := treeView selection asSortedCollection. treeView selectedNodesRemove. treeView selection: selection first - 1. - self updateChannels + self updateChannels. + isModified := true ] ! @@ -1026,7 +1032,6 @@ |sel cls bindings accepted| - masterApplication notNil ifTrue:[^self information:'Only selector can be changed.']. accepted := true. bindings := IdentityDictionary new. @@ -1053,6 +1058,8 @@ [ specClass := cls. specSelector := sel asSymbol. + self hasValidClass value: true. + isModified := true. ^self ] ] @@ -1061,36 +1068,6 @@ ! -doDefineSelector - "define selector only" - - |sel bindings accepted| - - accepted := true. - bindings := IdentityDictionary new. - - specSelector notNil ifTrue:[sel := specSelector asString] - ifFalse:[sel := '']. - - bindings at:#specSelectorChannel put:(sel asValue). - - [accepted] - whileTrue: - [ - (accepted := self openDialogInterface:#methodSpec withBindings:bindings) - ifTrue: - [ - (sel := (bindings at:#specSelectorChannel) value withoutSeparators) size ~~ 0 - ifTrue: - [ - specSelector := sel asSymbol. - ^self - ] - ] - ] - -! - doInstall "install code" @@ -1108,6 +1085,7 @@ spec := stream contents. category := 'interface specs'. didInstall := true. + isModified := false. (mthd := specClass class compiledMethodAt:specSelector) notNil ifTrue: @@ -1170,7 +1148,11 @@ "remove all items; restart" treeView root:(TreeItem name:'Anchor' contents:#anchor). - treeView selection:0 + treeView selection:0. + isModified := true + + + ! @@ -1178,7 +1160,9 @@ "paste after current selected item" treeView selectedNodeAdd:CopyBuffer. - self updateChannels + self updateChannels. + isModified := true + ! doReload @@ -1192,28 +1176,42 @@ "move selected item after next item" treeView selectedNodeChangeSequenceOrder:1. - self updateChannels + self updateChannels. + isModified := true + ! doStepIn "lets become the selected item a child of its next sister" treeView selectedNodeBecomeChildOfNext. - self updateChannels + self updateChannels. + isModified := true + + + ! doStepOut "let selected node become a sister of its current parent" treeView selectedNodeBecomeSisterOfParent. - self updateChannels + self updateChannels. + isModified := true + + + ! doStepUp "move selected item before previous item" treeView selectedNodeChangeSequenceOrder:-1. - self updateChannels + self updateChannels. + isModified := true + + + ! ! !HierarchicalListEditor class methodsFor:'documentation'!