MenuEditor.st
changeset 220 8f0065e7a83d
parent 218 5c88856b360f
child 224 c1d7bffe73f1
--- a/MenuEditor.st	Thu Jul 17 12:08:15 1997 +0200
+++ b/MenuEditor.st	Thu Jul 17 18:46:03 1997 +0200
@@ -13,25 +13,25 @@
 
 
 ApplicationModel subclass:#MenuEditor
-        instanceVariableNames:'specClass tabSelection aspects slices activeHelpTool'
-        classVariableNames:''
-        poolDictionaries:''
-        category:'Interface-UIPainter'
+	instanceVariableNames:'specClass tabSelection aspects slices activeHelpTool'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-UIPainter'
 !
 
 Object subclass:#Item
-        instanceVariableNames:'activeHelpKey enabled label value nameKey indication shortcutKey
-                accessCharaterPos retriever icon iconAndLabel submenuChannel'
-        classVariableNames:''
-        poolDictionaries:''
-        privateIn:MenuEditor
+	instanceVariableNames:'activeHelpKey enabled label value nameKey indication shortcutKey
+		accessCharaterPos retriever icon iconAndLabel submenuChannel'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:MenuEditor
 !
 
 SelectionInTreeView subclass:#Painter
-        instanceVariableNames:'imageDirSelect'
-        classVariableNames:'CopyBuffer'
-        poolDictionaries:''
-        privateIn:MenuEditor
+	instanceVariableNames:'imageMenuLink imageSeparator'
+	classVariableNames:'CopyBuffer ImageMenuLink ImageSeparator'
+	poolDictionaries:''
+	privateIn:MenuEditor
 !
 
 !MenuEditor class methodsFor:'documentation'!
@@ -75,6 +75,26 @@
 
 !MenuEditor class methodsFor:'icons'!
 
+iconCreateItem
+    ^ Painter imageItem
+
+!
+
+iconCreateLink
+    ^ Painter imageMenuLink
+
+!
+
+iconCreateMenu
+    ^ Painter imageClosed
+
+!
+
+iconCreateSep
+    ^ Painter imageSeparator
+
+!
+
 iconStepDown
     ^ ((Image fromFile:'stepOver.xpm') rotated:90) flipHorizontal
 !
@@ -268,6 +288,104 @@
       )
 !
 
+menuButtons
+    "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:MenuEditor andSelector:#menuButtons
+     (Menu new fromLiteralArrayEncoding:(MenuEditor menuButtons)) startUp
+    "
+
+    <resource: #menu>
+
+    ^
+     
+       #(#Menu
+          
+           #(
+             #(#MenuItem
+                #'label:' 'createMenu'
+                #'value:' #doCreateMenu
+                #'enabled:' #hasAnySingleSelection
+                #'labelImage:' 
+                 #(#ResourceRetriever
+                    #MenuEditor #iconCreateMenu
+                )
+            )
+             #(#MenuItem
+                #'label:' 'createLink'
+                #'value:' #doCreateLink
+                #'enabled:' #hasAnySingleSelection
+                #'labelImage:' 
+                 #(#ResourceRetriever
+                    #MenuEditor #iconCreateLink
+                )
+            )
+             #(#MenuItem
+                #'label:' 'createItem'
+                #'value:' #doCreateItem
+                #'enabled:' #hasAnySingleSelection
+                #'labelImage:' 
+                 #(#ResourceRetriever
+                    #MenuEditor #iconCreateItem
+                )
+            )
+             #(#MenuItem
+                #'label:' 'createSeparator'
+                #'value:' #doCreateSep
+                #'enabled:' #hasAnySingleSelection
+                #'labelImage:' 
+                 #(#ResourceRetriever
+                    #MenuEditor #iconCreateSep
+                )
+            )
+             #(#MenuItem
+                #'label:' ''
+            )
+             #(#MenuItem
+                #'label:' 'stepUp'
+                #'value:' #doStepUp
+                #'enabled:' #enabledStepOver
+                #'labelImage:' 
+                 #(#ResourceRetriever
+                    #MenuEditor #iconStepUp
+                )
+            )
+             #(#MenuItem
+                #'label:' 'stepDown'
+                #'value:' #doStepDown
+                #'enabled:' #enabledStepOver
+                #'labelImage:' 
+                 #(#ResourceRetriever
+                    #MenuEditor #iconStepDown
+                )
+            )
+             #(#MenuItem
+                #'label:' 'stepIn'
+                #'value:' #doStepIn
+                #'enabled:' #enabledStepIn
+                #'labelImage:' 
+                 #(#ResourceRetriever
+                    #MenuEditor #iconStepIn
+                )
+            )
+             #(#MenuItem
+                #'label:' 'stepOut'
+                #'value:' #doStepOut
+                #'enabled:' #enabledStepOut
+                #'labelImage:' 
+                 #(#ResourceRetriever
+                    #MenuEditor #iconStepOut
+                )
+            )
+          ) nil
+          nil
+      )
+!
+
 menuDefaultLink
     "this window spec was automatically generated by the ST/X MenuEditor"
 
@@ -294,6 +412,97 @@
       )
 !
 
+menuPainter
+    "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:MenuEditor andSelector:#menuPainter
+     (Menu new fromLiteralArrayEncoding:(MenuEditor menuPainter)) startUp
+    "
+
+    <resource: #menu>
+
+    ^
+     
+       #(#Menu
+          
+           #(
+             #(#MenuItem
+                #'label:' 'copy'
+                #'value:' #doCopy
+                #'enabled:' #hasValidSelection
+            )
+             #(#MenuItem
+                #'label:' 'cut'
+                #'value:' #doCut
+                #'enabled:' #hasValidSelection
+            )
+             #(#MenuItem
+                #'label:' 'paste'
+                #'value:' #doPaste
+                #'enabled:' #hasAnySingleSelection
+            )
+             #(#MenuItem
+                #'label:' '-'
+            )
+             #(#MenuItem
+                #'label:' 'create'
+                #'enabled:' #hasAnySingleSelection
+                #'submenu:' 
+                 #(#Menu
+                    
+                     #(
+                       #(#MenuItem
+                          #'label:' 'submenu static'
+                          #'value:' #doCreateMenu
+                          #'labelImage:' 
+                           #(#ResourceRetriever
+                              #MenuEditor #iconCreateMenu
+                              'submenu static'
+                          )
+                      )
+                       #(#MenuItem
+                          #'label:' 'submenu dynamic'
+                          #'value:' #doCreateLink
+                          #'labelImage:' 
+                           #(#ResourceRetriever
+                              #MenuEditor #iconCreateLink
+                              'submenu dynamic'
+                          )
+                      )
+                       #(#MenuItem
+                          #'label:' '-'
+                      )
+                       #(#MenuItem
+                          #'label:' 'item'
+                          #'value:' #doCreateItem
+                          #'labelImage:' 
+                           #(#ResourceRetriever
+                              #MenuEditor #iconCreateItem
+                              'item'
+                          )
+                      )
+                       #(#MenuItem
+                          #'label:' 'separator'
+                          #'value:' #doCreateSep
+                          #'labelImage:' 
+                           #(#ResourceRetriever
+                              #MenuEditor #iconCreateSep
+                              'separator'
+                          )
+                      )
+                    ) nil
+                    nil
+                )
+            )
+          ) nil
+          nil
+      )
+!
+
 menuPullDown
     "this window spec was automatically generated by the ST/X MenuEditor"
 
@@ -383,66 +592,6 @@
                 #'label:' 'test'
                 #'submenuChannel:' #submenuTest
             )
-             #(#MenuItem
-                #'label:' ''
-            )
-             #(#MenuItem
-                #'label:' '-'
-            )
-             #(#MenuItem
-                #'label:' 'stepUp'
-                #'value:' #doStepUp
-                #'enabled:' #enabledStepOver
-                #'labelImage:' 
-                 #(#ResourceRetriever
-                    #MenuEditor #iconStepUp
-                )
-            )
-             #(#MenuItem
-                #'label:' '-'
-            )
-             #(#MenuItem
-                #'label:' 'stepDown'
-                #'value:' #doStepDown
-                #'enabled:' #enabledStepOver
-                #'labelImage:' 
-                 #(#ResourceRetriever
-                    #MenuEditor #iconStepDown
-                )
-            )
-             #(#MenuItem
-                #'label:' '-'
-            )
-             #(#MenuItem
-                #'label:' ''
-            )
-             #(#MenuItem
-                #'label:' '-'
-            )
-             #(#MenuItem
-                #'label:' 'stepIn'
-                #'value:' #doStepIn
-                #'enabled:' #enabledStepIn
-                #'labelImage:' 
-                 #(#ResourceRetriever
-                    #MenuEditor #iconStepIn
-                )
-            )
-             #(#MenuItem
-                #'label:' '-'
-            )
-             #(#MenuItem
-                #'label:' 'stepOut'
-                #'value:' #doStepOut
-                #'enabled:' #enabledStepOut
-                #'labelImage:' 
-                 #(#ResourceRetriever
-                    #MenuEditor #iconStepOut
-                )
-            )
-             #(#MenuItem
-                #'label:' '-'
-            )
           ) nil
           nil
       )
@@ -478,17 +627,17 @@
                #(
                  #(#ArbitraryComponentSpec
                     #'name:' 'painterView'
-                    #'layout:' #(#LayoutFrame 0 0.0 25 0.0 0 0.5 0 1.0)
-                    #'component:' #painter
+                    #'layout:' #(#LayoutFrame 0 0.0 57 0 0 0.5 0 1.0)
+                    #'menu:' #menuPainter
                     #'hasHorizontalScrollBar:' true
                     #'hasVerticalScrollBar:' true
+                    #'component:' #painter
                     #'hasBorder:' false
-                    #'miniScrollerHorizontal:' false
-                    #'miniScrollerVertical:' false
                 )
                  #(#NoteBookViewSpec
                     #'name:' 'specificationView'
-                    #'layout:' #(#LayoutFrame 0 0.5 25 0.0 0 1.0 -25 1.0)
+                    #'layout:' #(#LayoutFrame 0 0.5 0 0.0 0 1.0 -25 1.0)
+                    #'tabable:' true
                     #'menu:' #tabList
                     #'model:' #tabModel
                     #'tabWidget:' #Window
@@ -525,9 +674,16 @@
                 )
                  #(#MenuPanelSpec
                     #'name:' 'pullDownMenu'
-                    #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 24 0)
+                    #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 0.5 24 0)
+                    #'tabable:' true
                     #'menu:' #menuPullDown
                 )
+                 #(#MenuPanelSpec
+                    #'name:' 'menuPanel1'
+                    #'layout:' #(#LayoutFrame 0 0 28 0 0 0.5 53 0)
+                    #'menu:' #menuButtons
+                    #'showSeparatingLines:' true
+                )
               )
           )
       )
@@ -1058,6 +1214,24 @@
   ^ menu
 ! !
 
+!MenuEditor methodsFor:'accessing menu'!
+
+menuButtons
+    "this window spec was automatically generated by the ST/X MenuEditor"
+
+    ^ self class menuButtons
+
+
+!
+
+menuPainter
+    "this window spec was automatically generated by the ST/X MenuEditor"
+
+    ^ self class menuPainter
+
+
+! !
+
 !MenuEditor methodsFor:'actions'!
 
 accept
@@ -1154,6 +1328,36 @@
     ^ holder
 !
 
+hasAnySingleSelection
+    |holder|
+
+    (holder := builder bindingAt:#hasAnySingleSelection) isNil ifTrue:[
+        builder aspectAt:#hasAnySingleSelection put:(holder :=  false asValue).
+    ].
+    ^ holder
+
+!
+
+hasValidSelection
+    |holder|
+
+    (holder := builder bindingAt:#hasValidSelection) isNil ifTrue:[
+        builder aspectAt:#hasValidSelection put:(holder :=  false asValue).
+    ].
+    ^ holder
+
+!
+
+hasValidSingleSelection
+    |holder|
+
+    (holder := builder bindingAt:#hasValidSingleSelection) isNil ifTrue:[
+        builder aspectAt:#hasValidSingleSelection put:(holder :=  false asValue).
+    ].
+    ^ holder
+
+!
+
 menuPullDown
     |menu|
 
@@ -1222,20 +1426,51 @@
 updateEnabledChannels
     "update enabled channels
     "
-    |node parent next|
-
-    node := self painter selectedNode.
-
-    (node notNil and:[(parent := node parent) notNil]) ifTrue:[
-        next := parent childAt:((parent indexOfChild:node) + 1).
-        self enabledStepIn   value:(next notNil and:[next hasChildren]).
-        self enabledStepOver value:(parent children size > 1).
-        self enabledStepOut  value:(parent parent notNil).
+    |node parent next painter state|
+
+    painter := self painter.
+    node    := painter selectedNode.
+    state   := false.
+
+    node notNil ifTrue:[
+        self hasAnySingleSelection value:true.
+
+        (parent := node parent) notNil ifTrue:[
+            next := parent childAt:((parent indexOfChild:node) + 1).
+            self enabledStepIn           value:(next notNil and:[next hasChildren]).
+            self enabledStepOver         value:(parent children size > 1).
+            self enabledStepOut          value:(parent parent notNil).
+            self hasValidSingleSelection value:true.
+            self hasValidSelection       value:true.
+          ^ self
+        ]
     ] ifFalse:[
-        self enabledStepOver value:false.
-        self enabledStepIn   value:false.
-        self enabledStepOut  value:false.
-    ]
+        self hasAnySingleSelection value:false.
+
+        painter numberOfSelections ~~ 0 ifTrue:[
+            state := (painter isInSelection:1) not
+        ]
+    ].
+    self enabledStepOver         value:false.
+    self enabledStepIn           value:false.
+    self enabledStepOut          value:false.
+    self hasValidSingleSelection value:false.
+    self hasValidSelection       value:state.
+! !
+
+!MenuEditor methodsFor:'event handling'!
+
+doesNotUnderstand:aMessage
+   |painter|
+
+   painter := self painter.
+
+   (painter respondsTo:(aMessage selector)) ifTrue:[
+        ^ aMessage sendTo:painter
+   ].
+   super doesNotUnderstand:aMessage
+
+
 ! !
 
 !MenuEditor methodsFor:'queries'!
@@ -1792,6 +2027,30 @@
     ^ self separatorType notNil
 ! !
 
+!MenuEditor::Painter class methodsFor:'constants'!
+
+imageMenuLink
+    ImageMenuLink isNil ifTrue:[
+        ImageMenuLink := Image fromFile:('xpmBitmaps/document_images/tiny_yellow_dir_link.xpm').
+    ].
+  ^ ImageMenuLink
+"
+ImageMenuLink := nil
+"
+
+!
+
+imageSeparator
+    ImageSeparator isNil ifTrue:[
+        ImageSeparator := Image fromFile:('xpmBitmaps/document_images/tiny_file_exec.xpm').
+    ].
+  ^ ImageSeparator
+"
+ImageSeparator := nil
+"
+
+! !
+
 !MenuEditor::Painter class methodsFor:'defaults'!
 
 defaultMenuMessage   
@@ -1963,14 +2222,26 @@
 figureFor:aNode
     "access figure for a node
     "
-    (aNode hasChildren or:[aNode contents submenuChannel isNil]) ifTrue:[
-        ^ super figureFor:aNode
+    |item|
+
+    aNode hasChildren ifFalse:[
+        item := aNode contents.
+
+        item submenuChannel notNil ifTrue:[
+            imageMenuLink isNil ifTrue:[
+                imageMenuLink := (self class imageMenuLink) onDevice:device.
+            ].
+          ^ imageMenuLink
+        ].
+
+        item isSeparator ifTrue:[
+            imageSeparator isNil ifTrue:[
+                imageSeparator := (self class imageSeparator) onDevice:device.
+            ].
+          ^ imageSeparator
+        ]    
     ].
-    imageDirSelect isNil ifTrue:[
-        imageDirSelect := Image fromFile:('xpmBitmaps/document_images/tiny_yellow_dir_link.xpm').
-        imageDirSelect := imageDirSelect onDevice:device.
-    ].
-  ^ imageDirSelect
+  ^ super figureFor:aNode
 ! !
 
 !MenuEditor::Painter methodsFor:'initialization'!
@@ -2032,7 +2303,7 @@
 
     (CopyBuffer notNil and:[self selectedNode notNil]) ifTrue:[
         self addElement:(CopyBuffer collect:[:el| el copy])
-    ]
+    ].
 !
 
 doStepIn
@@ -2106,41 +2377,6 @@
         model add:node beforeIndex:idx below:parent.
         self selectNode:node.
     ]
-!
-
-menu
-    |menu subm sz inclRoot|
-
-    (sz := self numberOfSelections) == 0 ifTrue:[
-        ^ nil
-    ].
-
-    inclRoot := self isInSelection:1.
-
-    sz > 1 ifTrue:[
-          inclRoot ifTrue:[^ nil ].
-
-        ^ PopUpMenu labels:#( 'copy'   'cut'  )
-                 selectors:#( #doCopy  #doCut )
-                  receiver:self.
-    ].
-
-    menu := PopUpMenu labels:#( 'copy'   'cut'   'paste'  '-' 'create' )
-                   selectors:#( #doCopy  #doCut  #doPaste nil #create  )
-                    receiver:self.
-
-    inclRoot ifTrue:[
-        menu disable:#doCopy.
-        menu disable:#doCut.
-    ].
-    subm :=  PopUpMenu labels:#( 'menu static' 'menu dynamic' '-' 'item'         '-' 'separator'  )
-                    selectors:#( #doCreateMenu #doCreateLink  nil #doCreateItem  nil #doCreateSep )
-                     receiver:self.
-
-    menu subMenuAt:#create put:subm.
-  ^ menu.
-
-    "Modified: 6.7.1997 / 12:51:28 / cg"
 ! !
 
 !MenuEditor::Painter methodsFor:'private'!