# HG changeset patch # User Claus Gittinger # Date 893511776 -7200 # Node ID 63fb353fe9971206e1afb85d6f60ada73f7e2c6f # Parent 66e010d679a968564ffd971582f926369f9672d9 better #itemList entry diff -r 66e010d679a9 -r 63fb353fe997 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 $' ! !