MenuView.st
changeset 119 59758ff5b841
parent 115 57c0ee9a56c0
child 126 40228f4fd66b
equal deleted inserted replaced
118:3ee5ea99d0e2 119:59758ff5b841
    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
    30 
    31 
    31 MenuView comment:'
    32 MenuView comment:'
    32 COPYRIGHT (c) 1989 by Claus Gittinger
    33 COPYRIGHT (c) 1989 by Claus Gittinger
    33 	      All Rights Reserved
    34 	      All Rights Reserved
    34 
    35 
    35 $Header: /cvs/stx/stx/libwidg/MenuView.st,v 1.23 1995-04-02 11:43:25 claus Exp $
    36 $Header: /cvs/stx/stx/libwidg/MenuView.st,v 1.24 1995-05-03 00:36:19 claus Exp $
    36 '!
    37 '!
    37 
    38 
    38 !MenuView class methodsFor:'documentation'!
    39 !MenuView class methodsFor:'documentation'!
    39 
    40 
    40 copyright
    41 copyright
    51 "
    52 "
    52 !
    53 !
    53 
    54 
    54 version
    55 version
    55 "
    56 "
    56 $Header: /cvs/stx/stx/libwidg/MenuView.st,v 1.23 1995-04-02 11:43:25 claus Exp $
    57 $Header: /cvs/stx/stx/libwidg/MenuView.st,v 1.24 1995-05-03 00:36:19 claus Exp $
    57 "
    58 "
    58 !
    59 !
    59 
    60 
    60 documentation
    61 documentation
    61 "
    62 "
    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
   229     selection := nil. "self selection:nil."
   233     selection := nil. "self selection:nil."
   230     self cursor:Cursor hand
   234     self cursor:Cursor hand
   231 !
   235 !
   232 
   236 
   233 initStyle
   237 initStyle
       
   238     |style|
       
   239 
   234     super initStyle.
   240     super initStyle.
   235 
   241 
   236     DefaultFont notNil ifTrue:[
   242     DefaultFont notNil ifTrue:[
   237 	font := DefaultFont on:device
   243 	font := DefaultFont on:device
   238     ].
   244     ].
   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:[
   309 
   310 
   310     "
   311     "
   311      the following has to be changed to
   312      the following has to be changed to
   312      use the styleSheet too
   313      use the styleSheet too
   313     "
   314     "
       
   315     style := StyleSheet name.
   314     (style ~~ #normal) ifTrue:[
   316     (style ~~ #normal) ifTrue:[
   315 	"the inset on each side"
   317 	"the inset on each side"
   316 	style == #motif ifTrue:[
   318 	style == #motif ifTrue:[
   317 	    lineInset := 0
   319 	    lineInset := 0
   318 	] ifFalse:[
   320 	] ifFalse:[
   349 !
   351 !
   350 
   352 
   351 create
   353 create
   352     super create.
   354     super create.
   353     subMenuShown := nil.
   355     subMenuShown := nil.
   354     self recomputeSize
   356     self resizeIfChanged
       
   357 "/    self recomputeSize
   355 !
   358 !
   356 
   359 
   357 recreate
   360 recreate
   358     super recreate.
   361     super recreate.
   359     hilightStyle == #openwin ifTrue:[
   362     hilightStyle == #openwin ifTrue:[
   435     text keysAndValuesDo:[:index :line |
   438     text keysAndValuesDo:[:index :line |
   436 	(line notNil and:[line includes:$\ ]) ifTrue:[
   439 	(line notNil and:[line includes:$\ ]) ifTrue:[
   437 	    onOffFlags at:index put:false
   440 	    onOffFlags at:index put:false
   438 	].
   441 	].
   439     ].
   442     ].
   440     self recomputeSize
   443     shown ifTrue:[
       
   444 	self recomputeSize
       
   445     ] ifFalse:[
       
   446 	needResize := true
       
   447     ]
   441 !
   448 !
   442 
   449 
   443 labelAt:indexOrName put:aString
   450 labelAt:indexOrName put:aString
   444     "change the label at index to be aString"
   451     "change the label at index to be aString"
   445 
   452 
   458 		onOffFlags := onOffFlags copyWith:nil 
   465 		onOffFlags := onOffFlags copyWith:nil 
   459 	    ]
   466 	    ]
   460 	].
   467 	].
   461 	onOffFlags at:i put:false
   468 	onOffFlags at:i put:false
   462     ].
   469     ].
   463     self recomputeSize
   470     shown ifTrue:[
       
   471 	self recomputeSize
       
   472     ] ifFalse:[
       
   473 	needResize := true
       
   474     ]
   464 !
   475 !
   465 
   476 
   466 font:aFont
   477 font:aFont
   467     "adjust size for new font"
   478     "adjust size for new font"
   468 
   479 
   469     super font:(aFont on:device).
   480     super font:(aFont on:device).
   470     self recomputeSize
   481     shown ifTrue:[
       
   482 	self recomputeSize
       
   483     ] ifFalse:[
       
   484 	needResize := true
       
   485     ]
   471 !
   486 !
   472 
   487 
   473 addSeparatingLine
   488 addSeparatingLine
   474     "add a separating line"
   489     "add a separating line"
   475 
   490 
   490     ] ifFalse:[
   505     ] ifFalse:[
   491 	list := list copyWith:aLabel
   506 	list := list copyWith:aLabel
   492     ].
   507     ].
   493     selectors := selectors copyWith:aSelector.
   508     selectors := selectors copyWith:aSelector.
   494     enableFlags := enableFlags copyWith:true.
   509     enableFlags := enableFlags copyWith:true.
   495     self recomputeSize
   510     shown ifTrue:[
       
   511 	self recomputeSize
       
   512     ] ifFalse:[
       
   513 	needResize := true
       
   514     ]
   496 !
   515 !
   497 
   516 
   498 addLabel:aLabel selector:aSelector arg:anArg
   517 addLabel:aLabel selector:aSelector arg:anArg
   499     "add another label/selector/argument trio"
   518     "add another label/selector/argument trio"
   500 
   519 
   504 	list := list copyWith:aLabel
   523 	list := list copyWith:aLabel
   505     ].
   524     ].
   506     selectors := selectors copyWith:aSelector.
   525     selectors := selectors copyWith:aSelector.
   507     args := args copyWith:anArg.
   526     args := args copyWith:anArg.
   508     enableFlags := enableFlags copyWith:true.
   527     enableFlags := enableFlags copyWith:true.
   509     self recomputeSize
   528     shown ifTrue:[
       
   529 	self recomputeSize
       
   530     ] ifFalse:[
       
   531 	needResize := true
       
   532     ]
   510 !
   533 !
   511 
   534 
   512 addLabel:aLabel selector:aSelector after:aLabelOrSelectorOrNumber 
   535 addLabel:aLabel selector:aSelector after:aLabelOrSelectorOrNumber 
   513     "insert another label/selector pair at some place.
   536     "insert another label/selector pair at some place.
   514      Being very friendly here, allowing label-string, selector or numeric
   537      Being very friendly here, allowing label-string, selector or numeric
   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"
   604     selectors := selectors asOrderedCollection removeIndex:i.
   753     selectors := selectors asOrderedCollection removeIndex:i.
   605     enableFlags := enableFlags asOrderedCollection removeIndex:i.
   754     enableFlags := enableFlags asOrderedCollection removeIndex:i.
   606     subMenus notNil ifTrue:[
   755     subMenus notNil ifTrue:[
   607 	subMenus := subMenus asOrderedCollection removeIndex:i.
   756 	subMenus := subMenus asOrderedCollection removeIndex:i.
   608     ].
   757     ].
   609     self recomputeSize
   758     shown ifTrue:[
       
   759 	self recomputeSize
       
   760     ] ifFalse:[
       
   761 	needResize := true
       
   762     ]
   610 !
   763 !
   611 
   764 
   612 indexOf:indexOrName
   765 indexOf:indexOrName
   613     "return the index of the label named:aName or , if its a symbol
   766     "return the index of the label named:aName or , if its a symbol
   614      the index in the selector list"
   767      the index in the selector list"
   694     "return the receiver of the message"
   847     "return the receiver of the message"
   695 
   848 
   696     ^ receiver
   849     ^ receiver
   697 !
   850 !
   698 
   851 
       
   852 checkFlags 
       
   853     "return an array filled with the check-mark flags.
       
   854      Non check-menu items have a nil entry in this array."
       
   855 
       
   856     ^ onOffFlags
       
   857 !
       
   858 
   699 selectors
   859 selectors
   700     "return the selector array"
   860     "return the selector array"
   701 
   861 
   702     ^ selectors
   862     ^ selectors
   703 !
   863 !
   820 	newSubMenus := Array new:(list size max:i).
   980 	newSubMenus := Array new:(list size max:i).
   821 	subMenus notNil ifTrue:[
   981 	subMenus notNil ifTrue:[
   822 	    newSubMenus replaceFrom:1 with:subMenus.
   982 	    newSubMenus replaceFrom:1 with:subMenus.
   823 	].
   983 	].
   824 	subMenus := newSubMenus.
   984 	subMenus := newSubMenus.
   825 	self recomputeSize
   985 	shown ifTrue:[
       
   986 	    self recomputeSize
       
   987 	] ifFalse:[
       
   988 	    needResize := true
       
   989 	]
   826     ].
   990     ].
   827     subMenus at:i put:aPopUpMenu
   991     subMenus at:i put:aPopUpMenu
   828 !
   992 !
   829 
   993 
   830 selection:index
   994 selection:index
   852 	subMenuShown hide.
  1016 	subMenuShown hide.
   853 	subMenuShown := nil
  1017 	subMenuShown := nil
   854     ].
  1018     ].
   855 !
  1019 !
   856 
  1020 
       
  1021 resizeIfChanged
       
  1022     needResize == true ifTrue:[
       
  1023 	self recomputeSize.
       
  1024 	needResize := false
       
  1025     ]
       
  1026 !
       
  1027 
   857 recomputeSize
  1028 recomputeSize
   858     |margin2 w h|
  1029     |margin2 w h|
       
  1030 
       
  1031     widthOfWidestLine := nil.  "/ i.e. unknown
   859 
  1032 
   860     margin2 := margin * 2.
  1033     margin2 := margin * 2.
   861     w := self widthOfContents + leftMargin + leftMargin + margin2.
  1034     w := self widthOfContents + leftMargin + leftMargin + margin2.
   862     h := (self numberOfLines) * fontHeight + (2 * topMargin) + margin2.
  1035     h := (self numberOfLines) * fontHeight + (2 * topMargin) + margin2.
   863     "if there is a submenu, add some space for the right arrow"
  1036     "if there is a submenu, add some space for the right arrow"
   899 	windowGroup addTopView:m.
  1072 	windowGroup addTopView:m.
   900     ].
  1073     ].
   901     m fixSize.
  1074     m fixSize.
   902     m origin:org.
  1075     m origin:org.
   903     m makeFullyVisible.
  1076     m makeFullyVisible.
       
  1077     m noShadow.
   904     m realize. 
  1078     m realize. 
   905     device synchronizeOutput.
  1079     device synchronizeOutput.
   906 
  1080 
   907     subMenuShown := m
  1081     subMenuShown := m
   908 !
  1082 !
   952     ]
  1126     ]
   953 ! !
  1127 ! !
   954 
  1128 
   955 !MenuView methodsFor:'showing'!
  1129 !MenuView methodsFor:'showing'!
   956 
  1130 
       
  1131 realize
       
  1132     needResize == true ifTrue:[
       
  1133 	self recomputeSize
       
  1134     ].
       
  1135     super realize
       
  1136 !
       
  1137 
   957 show
  1138 show
   958     hidden := false.
  1139     hidden := false.
   959     super realize
  1140     self realize
   960 ! !
  1141 ! !
   961 
  1142 
   962 !MenuView methodsFor:'selections'!
  1143 !MenuView methodsFor:'selections'!
   963 
  1144 
   964 isValidSelection:aNumber
  1145 isValidSelection:aNumber