MenuPanel.st
changeset 3934 5d1150f0174c
parent 3928 d175aca884ce
child 3935 852001cc6bd5
--- a/MenuPanel.st	Tue Sep 21 16:59:04 2010 +0200
+++ b/MenuPanel.st	Wed Sep 22 14:20:31 2010 +0200
@@ -2092,7 +2092,6 @@
 
     |submenu|
 
-    
     self itemAt:stringOrNumber do:[:anItem|
         submenu := anItem currentSubmenu.
         submenu isNil ifTrue:[
@@ -2100,6 +2099,8 @@
         ].
     ].
     ^ submenu
+
+    "Modified: / 22-09-2010 / 13:53:21 / cg"
 !
 
 subMenuAt:stringOrNumber put:aSubMenu
@@ -7610,7 +7611,7 @@
     aRecv isNil ifTrue:[^ nil].
 
     sel := menuItem submenuChannel.
-    sel isString ifFalse:[^ nil].
+    (sel isString or:[sel isSymbol]) ifFalse:[^ nil].
     sel := sel asSymbol.
     numArgs := sel numArgs.
 
@@ -7652,7 +7653,7 @@
 
     ^ subm
 
-    "Modified: / 30.10.2001 / 13:28:25 / cg"
+    "Modified: / 22-09-2010 / 13:56:50 / cg"
 !
 
 indicationValue
@@ -7770,7 +7771,8 @@
 !
 
 setupSubmenu
-    |appl master recv submenuHolder submenu submenuEncoding channel|
+    |appl submenuProvider master recv submenuHolder newSubmenu submenuEncoding 
+     channel whoProvidedMenu t|
 
     channel := menuItem submenuChannel value.
     channel isNil ifTrue:[ ^ subMenu ].
@@ -7782,45 +7784,103 @@
     channel isSymbol ifFalse:[
         submenuHolder := channel
     ] ifTrue:[
-        appl := menuPanel application.
-        appl isNil ifTrue:[
-            appl := menuPanel receiver.
-            appl notNil ifTrue:[
-                (submenuHolder := self findSubMenuIn:appl) isNil ifTrue:[
-                    [submenuHolder isNil 
-                     and:[(master := appl perform:#masterApplication ifNotUnderstood:nil) notNil
-                          and:[master ~~ appl]]] whileTrue:[
-                        appl := master.
-                        submenuHolder := self findSubMenuIn:appl.
-                    ].
-                ]
+        "/ submenu is specified by a selector in submenuChannel.
+        "/ who gets me the menu:
+        "/ 1) submenuProvider (if not nil)
+        "/ 2) menuPanel application
+        "/ 3) menuPanel receiver
+        "/ 4) menuPanel application master-chain
+        "/ 5) menuPanel receiver master-chain
+
+        (submenuProvider := menuItem submenuProvider) notNil ifTrue:[
+            submenuHolder := self findSubMenuIn:submenuProvider.
+            whoProvidedMenu := submenuProvider.
+        ].
+        submenuHolder isNil ifTrue:[
+            appl := menuPanel application.
+            (appl notNil and:[appl ~~ submenuProvider]) ifTrue:[
+                submenuHolder := self findSubMenuIn:appl.
+                whoProvidedMenu := appl.
             ].
-        ].
-        submenuHolder isNil ifTrue:[    
-            (submenuHolder := self findSubMenuIn:appl) isNil ifTrue:[
-                (recv := menuPanel receiver) ~~ appl ifTrue:[
-                    appl := recv.
-                    submenuHolder := self findSubMenuIn:appl
-                ]
-            ]
-        ]
-    ].
-
-    (submenu := submenuHolder value) isArray ifTrue:[
-        submenuEncoding := submenu.    
-        submenu := Menu decodeFromLiteralArray:submenuEncoding.
+            submenuHolder isNil ifTrue:[
+                recv := menuPanel receiver.
+                (recv notNil and:[recv ~~ appl and:[recv ~~ submenuProvider]]) ifTrue:[
+                    submenuHolder := self findSubMenuIn:recv.
+                    whoProvidedMenu := recv.
+                ].
+                (submenuHolder isNil and:[appl notNil]) ifTrue:[
+                    t := appl.
+                    [ submenuHolder isNil
+                       and:[ (master := t perform:#masterApplication ifNotUnderstood:nil) notNil ]
+                    ] whileTrue:[
+                       ( master ~~ appl 
+                        and:[ master ~~ recv 
+                        and:[ master ~~ submenuProvider ]] ) ifTrue:[
+                            submenuHolder := self findSubMenuIn:master.
+                        ].
+                        t := master.
+                        whoProvidedMenu := master.
+                    ]
+                ].
+                (submenuHolder isNil and:[recv notNil]) ifTrue:[
+                    t := recv.
+                    [ submenuHolder isNil
+                       and:[ (master := t perform:#masterApplication ifNotUnderstood:nil) notNil ]
+                    ] whileTrue:[
+                       ( master ~~ appl 
+                        and:[ master ~~ recv 
+                        and:[ master ~~ submenuProvider ]] ) ifTrue:[
+                            submenuHolder := self findSubMenuIn:master.
+                        ].
+                        t := master.
+                        whoProvidedMenu := master.
+                    ]
+                ].
+            ].
+        ].
+        submenuHolder isNil ifTrue:[
+            self halt:'did not find any menu'
+        ].
+
+"/        appl := menuPanel application.
+"/        appl isNil ifTrue:[
+"/            appl := menuPanel receiver.
+"/            appl notNil ifTrue:[
+"/                (submenuHolder := self findSubMenuIn:appl) isNil ifTrue:[
+"/                    [submenuHolder isNil 
+"/                     and:[(master := appl perform:#masterApplication ifNotUnderstood:nil) notNil
+"/                          and:[master ~~ appl]]] whileTrue:[
+"/                        appl := master.
+"/                        submenuHolder := self findSubMenuIn:appl.
+"/                    ].
+"/                ]
+"/            ].
+"/        ].
+"/        submenuHolder isNil ifTrue:[    
+"/            (submenuHolder := self findSubMenuIn:appl) isNil ifTrue:[
+"/                (recv := menuPanel receiver) ~~ appl ifTrue:[
+"/                    appl := recv.
+"/                    submenuHolder := self findSubMenuIn:appl
+"/                ]
+"/            ]
+"/        ]
+    ].
+
+    (newSubmenu := submenuHolder value) isArray ifTrue:[
+        submenuEncoding := newSubmenu.    
+        newSubmenu := Menu decodeFromLiteralArray:submenuEncoding.
         "/ cg: linked menus also may contain translations ...
-        submenu notNil ifTrue:[
-            appl notNil ifTrue:[
-                submenu findGuiResourcesIn:appl.
+        newSubmenu notNil ifTrue:[
+            whoProvidedMenu "appl" notNil ifTrue:[
+                newSubmenu findGuiResourcesIn:whoProvidedMenu "appl".
             ]                
         ].
     ].
     "/ appl notNil ifTrue:[submenu application:appl].
-    self submenu:submenu.
+    self submenu:newSubmenu.
     ^ subMenu
 
-    "Modified: / 27-03-2007 / 08:43:25 / cg"
+    "Modified: / 22-09-2010 / 14:19:29 / cg"
 !
 
 spaceBetweenEmptyLines
@@ -8272,11 +8332,11 @@
 !MenuPanel class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libwidg2/MenuPanel.st,v 1.505 2010-08-17 08:47:53 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/MenuPanel.st,v 1.506 2010-09-22 12:20:31 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libwidg2/MenuPanel.st,v 1.505 2010-08-17 08:47:53 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/MenuPanel.st,v 1.506 2010-09-22 12:20:31 cg Exp $'
 ! !
 
 MenuPanel initialize!