better #itemList entry
authorClaus Gittinger <cg@exept.de>
Sat, 25 Apr 1998 15:42:56 +0200
changeset 1506 63fb353fe997
parent 1505 66e010d679a9
child 1507 c712eb1a247e
better #itemList entry
PopUpMenu.st
--- a/PopUpMenu.st	Sat Apr 25 15:00:20 1998 +0200
+++ b/PopUpMenu.st	Sat Apr 25 15:42:56 1998 +0200
@@ -404,30 +404,8 @@
      if resources are non-nil, labels are translated using the translations found there.
     "
 
-    |n labels selectors accelerators|
-
-    n := itemList size.
-    labels := Array new:n.
-    selectors := Array new:n.
-    accelerators := Array new:n.
-    itemList keysAndValuesDo:[:idx :item |
-        |label selector accelerator|
-
-        label := item at:1.
-        selector := item at:2 ifAbsent:nil.
-        accelerator := item at:3 ifAbsent:nil.
-
-        labels at:idx put:label.
-        selectors at:idx put:selector.
-        accelerators at:idx put:accelerator.
-    ].
-    resources notNil ifTrue:[
-        labels := resources array:labels
-    ].
     ^ self
-        labels:labels
-        selectors:selectors
-        accelerators:accelerators
+        itemList:itemList resources:resources receiver:nil for:nil
 
     "the sometimes more convenient:
         |p|
@@ -452,6 +430,79 @@
 
 !
 
+itemList:itemList resources:resources receiver:anObject for:aView
+    "like labels:selectors:... messages, but expects a single collection,
+     containing items row-wise (i.e. elements are themself arrays, consisting of
+        label [selector [accelerator [arg]]]
+     if resources are non-nil, labels are translated using the translations found there.
+    "
+
+    |n labels selectors accelerators args anyArg|
+
+    n := itemList size.
+    labels := Array new:n.
+    selectors := Array new:n.
+    accelerators := Array new:n.
+    anyArg := false.
+
+    itemList keysAndValuesDo:[:idx :item |
+        |label selector accelerator arg|
+
+        label := item at:1.
+        labels at:idx put:label.
+        item size > 1 ifTrue:[
+            selector := item at:2.
+            selectors at:idx put:selector.
+            item size > 2 ifTrue:[
+                accelerator := item at:3.
+                accelerators at:idx put:accelerator.
+                item size > 3 ifTrue:[
+                    arg := item at:4.
+                    anyArg ifFalse:[
+                        anyArg := true.
+                        args := Array new:n.
+                    ].
+                    args at:idx put:arg.    
+                ]
+            ]
+        ].
+    ].
+
+    resources notNil ifTrue:[
+        labels := resources array:labels
+    ].
+
+    ^ self
+        labels:labels
+        selectors:selectors
+        accelerators:accelerators
+        args:args 
+        receiver:anObject 
+        for:aView
+
+    "this is sometimes more convenient:
+        |p|
+
+        p := PopUpMenu
+                itemList:#(('foo' doFoo CtrlF)
+                           ('-')
+                           ('bar' doBar CtrlB)
+                           ('baz' doBaz CtrlZ))
+                resources:nil.
+        p showAtPointer
+
+     and does the same as:
+        |p|
+
+        p := PopUpMenu
+                labels:#('foo' '-' 'bar' 'baz')
+                selectors:#(doFoo nil doBar doBaz)
+                accelerators:#(CtrlF nil CtrlB CtrlZ).
+        p showAtPointer
+    "
+
+!
+
 labels:labels args:args 
     "create and return a menu with label-items and args. 
      The actionBlock has to be defined later"
@@ -1400,5 +1451,5 @@
 !PopUpMenu class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libwidg/PopUpMenu.st,v 1.72 1998-04-25 13:00:20 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg/PopUpMenu.st,v 1.73 1998-04-25 13:42:56 cg Exp $'
 ! !