12 |
12 |
13 SelectionInListView subclass:#MenuView |
13 SelectionInListView subclass:#MenuView |
14 instanceVariableNames:'selectors args receiver enableFlags |
14 instanceVariableNames:'selectors args receiver enableFlags |
15 disabledFgColor onOffFlags subMenus |
15 disabledFgColor onOffFlags subMenus |
16 subMenuShown superMenu checkColor |
16 subMenuShown superMenu checkColor |
17 lineLevel lineInset masterView hilightStyle' |
17 lineLevel lineInset masterView hilightStyle |
|
18 needResize' |
18 classVariableNames:'DefaultFont DefaultCheckColor DefaultViewBackground |
19 classVariableNames:'DefaultFont DefaultCheckColor DefaultViewBackground |
19 DefaultForegroundColor |
20 DefaultForegroundColor |
20 DefaultBackgroundColor |
21 DefaultBackgroundColor |
21 DefaultDisabledForegroundColor |
22 DefaultDisabledForegroundColor |
22 DefaultHilightForegroundColor |
23 DefaultHilightForegroundColor |
65 |
66 |
66 1) action:aBlockWithOneArg |
67 1) action:aBlockWithOneArg |
67 which defines a block to be called with the line number (1..n) |
68 which defines a block to be called with the line number (1..n) |
68 of the selected line. |
69 of the selected line. |
69 |
70 |
70 2) selectors:selectorArray [args: argarray] receiver:anObject |
71 2) selectors:selectorArray [args: argArray] [receiver:anObject] |
71 which defines the messages to be sent to receiver for each |
72 which defines the messages to be sent to the model or |
72 line. |
73 receiver. Giving an explicit receiver overrides the model. |
73 |
74 |
74 It is also possible to define both actionBlock and selectorArray. |
75 It is also possible to define both actionBlock and selectorArray. |
75 |
76 |
76 The wellknown popups are created by wrapping a MenuView into an instance of |
77 The wellknown popups are created by wrapping a MenuView into an instance of |
77 PopUpMenu (read the description of popupmenu). |
78 PopUpMenu (read the description of popupmenu). |
126 labels:labels selectors:selArray args:argArray receiver:anObject in:aView |
127 labels:labels selectors:selArray args:argArray receiver:anObject in:aView |
127 "create and return a new MenuView in aView |
128 "create and return a new MenuView in aView |
128 - receiverObject gets message from selectorArray with argument |
129 - receiverObject gets message from selectorArray with argument |
129 from argArray" |
130 from argArray" |
130 |
131 |
131 ^ (self in:aView) labels:labels |
132 ^ (self in:aView) |
132 selectors:selArray |
133 labels:labels |
133 args:argArray |
134 selectors:selArray |
134 receiver:anObject |
135 args:argArray |
|
136 receiver:anObject |
135 ! |
137 ! |
136 |
138 |
137 labels:labels selectors:selArray receiver:anObject in:aView |
139 labels:labels selectors:selArray receiver:anObject in:aView |
138 "create and return a new MenuView in aView |
140 "create and return a new MenuView in aView |
139 - receiverObject gets message from selectorArray without argument" |
141 - receiverObject gets message from selectorArray without argument" |
140 |
142 |
141 ^ (self in:aView) labels:labels |
143 ^ self labels:labels selectors:selArray args:nil receiver:anObject in:aView |
142 selectors:selArray |
|
143 args:nil |
|
144 receiver:anObject |
|
145 ! |
144 ! |
146 |
145 |
147 labels:labels selector:aSelector args:argArray receiver:anObject in:aTopMenu |
146 labels:labels selector:aSelector args:argArray receiver:anObject in:aTopMenu |
148 "create and return a new MenuView |
147 "create and return a new MenuView |
149 - receiverObject gets message aSelector with argument from |
148 - receiverObject gets message aSelector with argument from |
150 argArray for all entries" |
149 argArray for all entries" |
151 |
150 |
152 ^ (self in:aTopMenu) labels:labels |
151 "OBSOLETE protocol: labels:selectors:args:receiver: knows how to handle a |
153 selectors:aSelector |
152 single symbol-arg for selectors ..." |
154 args:argArray |
153 |
155 receiver:anObject |
154 ^ self labels:labels selectors:aSelector args:argArray receiver:anObject |
|
155 ! |
|
156 |
|
157 labels:labels selectors:selArray args:argArray receiver:anObject for:aTopMenu |
|
158 "create and return a new MenuView for a topMenu" |
|
159 |
|
160 ^ self labels:labels selectors:selArray args:argArray receiver:anObject in:(aTopMenu superView) |
156 ! |
161 ! |
157 |
162 |
158 labels:labels selector:aSelector args:argArray receiver:anObject for:aTopMenu |
163 labels:labels selector:aSelector args:argArray receiver:anObject for:aTopMenu |
159 "create and return a new MenuView |
164 "create and return a new MenuView |
160 - receiverObject gets message aSelector with argument from |
165 - receiverObject gets message aSelector with argument from |
161 argArray for all entries" |
166 argArray for ALL entries" |
162 |
167 |
163 ^ (self in:(aTopMenu superView)) labels:labels |
168 "OBSOLETE protocol: labels:selectors:args:receiver: knows how to handle a |
164 selectors:aSelector |
169 single symbol-arg for selectors ..." |
165 args:argArray |
170 |
166 receiver:anObject |
171 ^ self labels:labels selectors:aSelector args:argArray receiver:anObject in:(aTopMenu superView) |
167 ! |
|
168 |
|
169 labels:labels selectors:selArray args:argArray receiver:anObject for:aTopMenu |
|
170 ^ (self in:(aTopMenu superView)) labels:labels |
|
171 selectors:selArray |
|
172 args:argArray |
|
173 receiver:anObject |
|
174 ! |
172 ! |
175 |
173 |
176 labels:labels selectors:selArray receiver:anObject for:aTopMenu |
174 labels:labels selectors:selArray receiver:anObject for:aTopMenu |
177 ^ (self in:(aTopMenu superView)) labels:labels |
175 ^ self labels:labels selectors:selArray args:nil receiver:anObject for:aTopMenu |
178 selectors:selArray |
176 ! |
179 args:nil |
177 |
180 receiver:anObject |
178 labels:labels selectors:selArray args:argArray receiver:anObject |
|
179 "create and return a new MenuView. The parent view |
|
180 should be set later." |
|
181 |
|
182 ^ (self new) |
|
183 labels:labels |
|
184 selectors:selArray |
|
185 args:argArray |
|
186 receiver:anObject |
|
187 ! |
|
188 |
|
189 labels:labels selectors:selArray args:argArray |
|
190 "create and return a new MenuView. The parent view |
|
191 should be set later." |
|
192 |
|
193 ^ self labels:labels selectors:selArray args:argArray |
181 ! |
194 ! |
182 |
195 |
183 labels:labels selectors:selArray receiver:anObject |
196 labels:labels selectors:selArray receiver:anObject |
184 "create and return a new MenuView. The parent view |
197 "create and return a new MenuView. The parent view |
185 should be set later." |
198 should be set later." |
186 |
199 |
187 ^ (self new) labels:labels |
200 ^ self labels:labels selectors:selArray args:nil receiver:anObject |
188 selectors:selArray |
|
189 args:nil |
|
190 receiver:anObject |
|
191 ! |
201 ! |
192 |
202 |
193 labels:labels selectors:selArray |
203 labels:labels selectors:selArray |
194 "create and return a new MenuView. The parent veiw |
204 "create and return a new MenuView. The parent veiw |
195 and receiver should be set later." |
205 and receiver should be set later." |
196 |
206 |
197 ^ (self new) labels:labels |
207 ^ self labels:labels selectors:selArray args:nil receiver:nil |
198 selectors:selArray |
|
199 args:nil |
|
200 receiver:nil |
|
201 ! |
208 ! |
202 |
209 |
203 labels:labels |
210 labels:labels |
204 "create and return a new MenuView. The parent view, |
211 "create and return a new MenuView. The parent view, |
205 selectors and receiver should be set later." |
212 selectors and receiver should be set later." |
206 |
213 |
207 ^ (self new) labels:labels |
214 ^ self labels:labels selectors:nil args:nil receiver:nil |
208 selectors:nil |
|
209 args:nil |
|
210 receiver:nil |
|
211 ! ! |
215 ! ! |
212 |
216 |
213 !MenuView methodsFor:'initialize / release'! |
217 !MenuView methodsFor:'initialize / release'! |
214 |
218 |
215 initialize |
219 initialize |
240 DefaultCheckColor notNil ifTrue:[ |
246 DefaultCheckColor notNil ifTrue:[ |
241 checkColor := DefaultCheckColor |
247 checkColor := DefaultCheckColor |
242 ] ifFalse:[ |
248 ] ifFalse:[ |
243 checkColor := fgColor. |
249 checkColor := fgColor. |
244 ]. |
250 ]. |
245 DefaultDisabledForegroundColor notNil ifTrue:[ |
251 disabledFgColor := DefaultDisabledForegroundColor on:device. |
246 disabledFgColor := DefaultDisabledForegroundColor |
|
247 ] ifFalse:[ |
|
248 disabledFgColor := Color darkGrey |
|
249 ]. |
|
250 disabledFgColor := disabledFgColor on:device. |
|
251 |
252 |
252 DefaultForegroundColor notNil ifTrue:[ |
253 DefaultForegroundColor notNil ifTrue:[ |
253 fgColor := DefaultForegroundColor on:device |
254 fgColor := DefaultForegroundColor on:device |
254 ]. |
255 ]. |
255 DefaultBackgroundColor notNil ifTrue:[ |
256 DefaultBackgroundColor notNil ifTrue:[ |
525 |v1 v2 v3 v4| |
548 |v1 v2 v3 v4| |
526 |
549 |
527 v1 := CodeView new realize. |
550 v1 := CodeView new realize. |
528 |
551 |
529 v2 := CodeView new realize. |
552 v2 := CodeView new realize. |
530 v2 middleButtonMenu menuView addLabel:'new entry' selector:#foo after:'paste'. |
553 v2 middleButtonMenu: |
|
554 v editMenu addLabel:'new entry' selector:#foo after:'paste'. |
531 |
555 |
532 v3 := CodeView new realize. |
556 v3 := CodeView new realize. |
533 v3 middleButtonMenu menuView addLabel:'new entry' selector:#foo after:#others. |
557 v3 middleButtonMenu: |
|
558 v editMenu addLabel:'new entry' selector:#foo after:#others. |
534 |
559 |
535 v4 := CodeView new realize. |
560 v4 := CodeView new realize. |
536 v4 middleButtonMenu menuView addLabel:'new entry' selector:#foo after:1. |
561 v4 middleButtonMenu: |
|
562 v editMenu addLabel:'new entry' selector:#foo after:1. |
|
563 " |
|
564 ! |
|
565 |
|
566 addLabels:moreLabels selectors:moreSelectors after:aLabelOrSelectorOrNumber |
|
567 "insert more labels/selectors at some place. |
|
568 Being very friendly here, allowing label-string, selector or numeric |
|
569 index for the argument aLabelOrSelectorOrNumber. |
|
570 |
|
571 To be independent of the entries label, we recommend you use the selector |
|
572 as index; in systems which translate strings for national variants, |
|
573 this makes your code easier to maintain." |
|
574 |
|
575 ^ self addLabels:moreLabels |
|
576 selectors:moreSelectors |
|
577 before:(self indexOf:aLabelOrSelectorOrNumber) + 1 |
|
578 ! |
|
579 |
|
580 addLabels:moreLabels selectors:moreSelectors before:aLabelOrSelectorOrNumber |
|
581 "insert more labels/selectors at some place. |
|
582 Being very friendly here, allowing label-string, selector or numeric |
|
583 index for the argument aLabelOrSelectorOrNumber. |
|
584 |
|
585 To be independent of the entries label, we recommend you use the selector |
|
586 as index; in systems which translate strings for national variants, |
|
587 this makes your code easier to maintain." |
|
588 |
|
589 |idx |
|
590 i "{ Class: SmallInteger }" |
|
591 nMore "{ Class: SmallInteger }"| |
|
592 |
|
593 list isNil ifTrue:[ |
|
594 ^ self addLabels:moreLabels selectors:moreSelectors |
|
595 ]. |
|
596 " |
|
597 be user friendly - allow both label or selector |
|
598 to be passed |
|
599 " |
|
600 idx := self indexOf:aLabelOrSelectorOrNumber. |
|
601 (idx between:1 and:list size) ifFalse:[ |
|
602 "add to end" |
|
603 ^ self addLabels:moreLabels selectors:moreSelectors |
|
604 ]. |
|
605 |
|
606 nMore := moreLabels size. |
|
607 "/ just a check |
|
608 moreSelectors size ~~ nMore ifTrue:[ |
|
609 ^ self error |
|
610 ]. |
|
611 |
|
612 list := list asOrderedCollection. |
|
613 i := idx. |
|
614 moreLabels do:[:aLabel | |
|
615 list add:aLabel beforeIndex:i. i := i + 1. |
|
616 ]. |
|
617 |
|
618 selectors := selectors asOrderedCollection. |
|
619 i := idx. |
|
620 moreSelectors do:[:sel | |
|
621 selectors add:sel beforeIndex:i. i := i + 1. |
|
622 ]. |
|
623 |
|
624 enableFlags := enableFlags asOrderedCollection. |
|
625 i := idx. |
|
626 nMore timesRepeat:[ |
|
627 enableFlags add:true beforeIndex:i. i := i + 1. |
|
628 ]. |
|
629 |
|
630 subMenus notNil ifTrue:[ |
|
631 subMenus := subMenus asOrderedCollection. |
|
632 i := idx. |
|
633 nMore timesRepeat:[ |
|
634 subMenus add:nil beforeIndex:i. i := i + 1. |
|
635 ]. |
|
636 ]. |
|
637 args notNil ifTrue:[ |
|
638 args := args asOrderedCollection. |
|
639 i := idx. |
|
640 nMore timesRepeat:[ |
|
641 args add:nil beforeIndex:i. i := i + 1. |
|
642 ] |
|
643 ]. |
|
644 shown ifTrue:[ |
|
645 self recomputeSize |
|
646 ] ifFalse:[ |
|
647 needResize := true |
|
648 ] |
|
649 |
|
650 " |
|
651 |v1 v2 v3 v4 m| |
|
652 |
|
653 |
|
654 v1 := CodeView new realize. |
|
655 |
|
656 v2 := CodeView new realize. |
|
657 m := v2 editMenu. |
|
658 m |
|
659 addLabels:#('new entry1' 'new entry2') |
|
660 selectors:#(foo bar) |
|
661 before:'paste'. |
|
662 v2 middleButtonMenu:m. |
|
663 |
|
664 v3 := CodeView new realize. |
|
665 m := v3 editMenu. |
|
666 m |
|
667 addLabels:#('new entry1' 'new entry2') |
|
668 selectors:#(foo bar) |
|
669 before:#again. |
|
670 v3 middleButtonMenu:m. |
|
671 |
|
672 v4 := CodeView new realize. |
|
673 m := v4 editMenu. |
|
674 m |
|
675 addLabels:#('new entry1' 'new entry2') |
|
676 selectors:#(foo bar) |
|
677 before:1. |
|
678 v4 middleButtonMenu:m. |
537 " |
679 " |
538 ! |
680 ! |
539 |
681 |
540 addLabel:aLabel selector:aSelector before:aLabelOrSelectorOrNumber |
682 addLabel:aLabel selector:aSelector before:aLabelOrSelectorOrNumber |
541 "insert another label/selector pair at some place. |
683 "insert another label/selector pair at some place. |
573 ]. |
715 ]. |
574 args notNil ifTrue:[ |
716 args notNil ifTrue:[ |
575 args := args asOrderedCollection. |
717 args := args asOrderedCollection. |
576 args add:nil beforeIndex:idx. |
718 args add:nil beforeIndex:idx. |
577 ]. |
719 ]. |
578 self recomputeSize |
720 shown ifTrue:[ |
|
721 self recomputeSize |
|
722 ] ifFalse:[ |
|
723 needResize := true |
|
724 ] |
579 |
725 |
580 " |
726 " |
581 |v1 v2 v3 v4| |
727 |v1 v2 v3 v4| |
582 |
728 |
583 v1 := CodeView new realize. |
729 v1 := CodeView new realize. |
584 |
730 |
585 v2 := CodeView new realize. |
731 v2 := CodeView new realize. |
586 v2 middleButtonMenu menuView addLabel:'new entry' selector:#foo before:'paste'. |
732 v2 middleButtonMenu: |
|
733 (v2 editMenu) addLabel:'new entry' selector:#foo before:'paste'. |
587 |
734 |
588 v3 := CodeView new realize. |
735 v3 := CodeView new realize. |
589 v3 middleButtonMenu menuView addLabel:'new entry' selector:#foo before:#again. |
736 v3 middleButtonMenu: |
|
737 (v3 editMenu) addLabel:'new entry' selector:#foo before:#again. |
590 |
738 |
591 v4 := CodeView new realize. |
739 v4 := CodeView new realize. |
592 v4 middleButtonMenu menuView addLabel:'new entry' selector:#foo before:1. |
740 v4 middleButtonMenu: |
|
741 (v4 editMenu) addLabel:'new entry' selector:#foo before:1. |
593 " |
742 " |
594 ! |
743 ! |
595 |
744 |
596 remove:indexOrName |
745 remove:indexOrName |
597 "remove the label at index" |
746 "remove the label at index" |