--- 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
- "
-
- <resource: #menu>
-
- ^
-
- #(#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
- "
-
- <resource: #menu>
-
- ^
-
- #(#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
- "
-
- <resource: #menu>
-
- ^
-
- #(#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
- "
-
- <resource: #canvas>
-
- ^
-
- #(#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
+ "
+
+ <resource: #menu>
+
+ ^
+
+ #(#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
+ "
+
+ <resource: #menu>
+
+ ^
+
+ #(#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
+ "
+
+ <resource: #menu>
+
+ ^
+
+ #(#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'!