PullDownMenu.st
author claus
Wed, 17 May 1995 14:26:27 +0200
changeset 128 06a050529335
parent 119 59758ff5b841
child 130 338e856bddc9
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     1
"
5
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
     3
	      All Rights Reserved
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     4
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    11
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    12
119
claus
parents: 116
diff changeset
    13
SimpleView subclass:#PullDownMenu
128
claus
parents: 119
diff changeset
    14
       instanceVariableNames:'receiver menus titles selectors activeMenuNumber
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    15
			      showSeparatingLines topMargin
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    16
			      fgColor bgColor activeFgColor activeBgColor
63
f4eaf04d1eaf *** empty log message ***
claus
parents: 60
diff changeset
    17
			      onLevel offLevel edgeStyle
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
    18
			      keepMenu toggleKeep'
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    19
       classVariableNames:'DefaultFont
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    20
			   DefaultViewBackground 
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    21
			   DefaultForegroundColor 
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    22
			   DefaultBackgroundColor
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    23
			   DefaultHilightForegroundColor 
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    24
			   DefaultHilightBackgroundColor
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    25
			   DefaultLevel DefaultHilightLevel
63
f4eaf04d1eaf *** empty log message ***
claus
parents: 60
diff changeset
    26
			   DefaultShadowColor DefaultLightColor 
128
claus
parents: 119
diff changeset
    27
			   DefaultEdgeStyle DefaultKeepMenu DefaultToggleKeep
claus
parents: 119
diff changeset
    28
			   DefaultSeparatingLines'
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    29
       poolDictionaries:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    30
       category:'Views-Menus'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    31
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    32
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    33
PullDownMenu comment:'
5
claus
parents: 3
diff changeset
    34
COPYRIGHT (c) 1989 by Claus Gittinger
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    35
	     All Rights Reserved
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    36
128
claus
parents: 119
diff changeset
    37
$Header: /cvs/stx/stx/libwidg/PullDownMenu.st,v 1.18 1995-05-17 12:25:49 claus Exp $
3
claus
parents: 0
diff changeset
    38
'!
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    39
3
claus
parents: 0
diff changeset
    40
!PullDownMenu class methodsFor:'documentation'!
claus
parents: 0
diff changeset
    41
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    42
copyright
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    43
"
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    44
 COPYRIGHT (c) 1989 by Claus Gittinger
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
    45
	      All Rights Reserved
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    46
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    47
 This software is furnished under a license and may be used
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    48
 only in accordance with the terms of that license and with the
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    49
 inclusion of the above copyright notice.   This software may not
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    50
 be provided or otherwise made available to, or used by, any
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    51
 other person.  No title to or ownership of the software is
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    52
 hereby transferred.
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    53
"
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    54
!
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    55
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    56
version
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    57
"
128
claus
parents: 119
diff changeset
    58
$Header: /cvs/stx/stx/libwidg/PullDownMenu.st,v 1.18 1995-05-17 12:25:49 claus Exp $
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    59
"
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    60
!
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    61
3
claus
parents: 0
diff changeset
    62
documentation
claus
parents: 0
diff changeset
    63
"
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    64
    PullDown menu provides the top (always visible) part of these menus. 
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    65
    It controls display of its menus, which become visible when one of the 
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    66
    PullDownMenus entries is pressed.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    67
128
claus
parents: 119
diff changeset
    68
    A PullDownMenu itself consists of a single row of labels, which activate
claus
parents: 119
diff changeset
    69
    a pulled menu when clicked. Entries may be empty (i.e. have no menu)
claus
parents: 119
diff changeset
    70
    and empty entries may (optionally) also perform some action when clicked.
claus
parents: 119
diff changeset
    71
    An entries selector is used as the key to define and access submenus
claus
parents: 119
diff changeset
    72
    and (for empty entries:) the selector sent to the receiver of the menu.
claus
parents: 119
diff changeset
    73
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
    74
    Instance variables:
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    75
128
claus
parents: 119
diff changeset
    76
      menus                   <Collection>    the sub menus
claus
parents: 119
diff changeset
    77
claus
parents: 119
diff changeset
    78
      titles                  <Collection>    the strings in the menu
claus
parents: 119
diff changeset
    79
claus
parents: 119
diff changeset
    80
      selectors               <Collection>    the selectors to send to the menu-
claus
parents: 119
diff changeset
    81
					      receiver (for empty pull-menus)
claus
parents: 119
diff changeset
    82
					      if nil (the default), title entries
claus
parents: 119
diff changeset
    83
					      do not send anything.
claus
parents: 119
diff changeset
    84
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
    85
      activeMenuNumber        <Number>        the index of the currently active menu
128
claus
parents: 119
diff changeset
    86
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
    87
      showSeparatingLines     <Boolean>       show separating lines between my menu-strings
128
claus
parents: 119
diff changeset
    88
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
    89
      topMargin               <Number>        number of pixels at top
128
claus
parents: 119
diff changeset
    90
claus
parents: 119
diff changeset
    91
      fgColor                 <Color>         fg color to draw passive menu-titles
claus
parents: 119
diff changeset
    92
      bgColor                 <Color>         bg color to draw passive menu-titles
claus
parents: 119
diff changeset
    93
claus
parents: 119
diff changeset
    94
      activeFgColor           <Color>         fg color to draw activated menu-titles
claus
parents: 119
diff changeset
    95
      activeBgColor           <Color>         bg color to draw activated menu-titles
claus
parents: 119
diff changeset
    96
claus
parents: 119
diff changeset
    97
      onLevel                 <Integer>       3D level of entry-buttons when pressed
claus
parents: 119
diff changeset
    98
      offLevel                <Integer>       3D level of entry-buttons when released
claus
parents: 119
diff changeset
    99
claus
parents: 119
diff changeset
   100
      edgeStyle               <Symbol>        how to draw edges
claus
parents: 119
diff changeset
   101
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   102
      keepmenu                <Boolean>       if on, pulled menu stays on click,
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   103
					      till clicked again (motif & windows behavior)
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   104
128
claus
parents: 119
diff changeset
   105
      toggleKeep              <Boolean>       if on and keepMenu is on,
claus
parents: 119
diff changeset
   106
					      clicking again on label closes menu
claus
parents: 119
diff changeset
   107
claus
parents: 119
diff changeset
   108
     except menus, titles and selectors, instvars are usually defined from
claus
parents: 119
diff changeset
   109
     defaults in the styleSheet; you should not care for them.
claus
parents: 119
diff changeset
   110
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   111
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   112
    StyleSheet values:
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   113
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   114
      pullDownMenuViewBackground              view background Color for the menu bar
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   115
					      default: menuViewBackground
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   116
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   117
      pullDownMenuForegroundColor             foreground drawing color for the menu bar
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   118
					      default: menuForegroundColor
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   119
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   120
      pullDownMenuBackgroundColor             background drawing color for the menu bar
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   121
					      default: menuBackgroundColor
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   122
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   123
      pullDownMenuHilightForegroundColor      active foreground drawing color for the menu bar
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   124
					      default: menuHilightForegroundColor
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   125
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   126
      pullDownMenuHilightBackgroundColor      active background drawing color for the menu bar
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   127
					      default: menuHilightBackgroundColor
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   128
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   129
      pullDownMenuHilightLevel                level (3D only) when active
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   130
					      default: menuHilightLevel
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   131
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   132
      pullDownMenuEdgeStyle                   edge style (nil or #soft)
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   133
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   134
      pullDownMenuKeepMenu                    if true, pulled menu stays open until button
128
claus
parents: 119
diff changeset
   135
					      is pressed again outside of the item-area (motif behavior)
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   136
					      if false, menu closes on release (default)
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   137
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   138
      pullDownMenuToggleKeep                  if true, pulled menu closes when an entry is pressed
128
claus
parents: 119
diff changeset
   139
					      again. Otherwise, only press outside of the items area
claus
parents: 119
diff changeset
   140
					      hides it. default is false
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   141
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   142
      pullDownMenuLevel                       level (3D only)
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   143
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   144
      pullDownMenuFont                        font to use for the menu bar
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   145
					      default: menuFont
128
claus
parents: 119
diff changeset
   146
claus
parents: 119
diff changeset
   147
      pullDownMenuShowSeparatingLines         if true, lines are drawn between items.
claus
parents: 119
diff changeset
   148
					      default: false
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   149
"
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   150
!
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   151
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   152
examples 
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   153
"
128
claus
parents: 119
diff changeset
   154
	|top menu|
claus
parents: 119
diff changeset
   155
claus
parents: 119
diff changeset
   156
	top := StandardSystemView new.
claus
parents: 119
diff changeset
   157
	top extent:300@300.
claus
parents: 119
diff changeset
   158
claus
parents: 119
diff changeset
   159
	menu := PullDownMenu origin:0.0@0.0 corner:1.0@30 in:top.
claus
parents: 119
diff changeset
   160
	menu labels:#('foo' 'bar').
claus
parents: 119
diff changeset
   161
	menu selectors:#(foo bar).
claus
parents: 119
diff changeset
   162
	menu at:#foo
claus
parents: 119
diff changeset
   163
	     putLabels:#('foo1' 'foo2' 'foo3')
claus
parents: 119
diff changeset
   164
	     selectors:#(foo1 foo2 foo3)
claus
parents: 119
diff changeset
   165
	     receiver:nil.
claus
parents: 119
diff changeset
   166
	menu at:#bar 
claus
parents: 119
diff changeset
   167
	     putLabels:#('bar1' 'bar2' 'bar3')
claus
parents: 119
diff changeset
   168
	     selectors:#(bar1 bar2 bar3)
claus
parents: 119
diff changeset
   169
	     receiver:nil.
claus
parents: 119
diff changeset
   170
	top open
claus
parents: 119
diff changeset
   171
claus
parents: 119
diff changeset
   172
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   173
128
claus
parents: 119
diff changeset
   174
    empty entries are possible as selectable items (with non-nil seletor) ...
claus
parents: 119
diff changeset
   175
claus
parents: 119
diff changeset
   176
	|top menu|
claus
parents: 119
diff changeset
   177
claus
parents: 119
diff changeset
   178
	top := StandardSystemView new.
claus
parents: 119
diff changeset
   179
	top extent:300@300.
claus
parents: 119
diff changeset
   180
claus
parents: 119
diff changeset
   181
	menu := PullDownMenu origin:0.0@0.0 corner:1.0@30 in:top.
claus
parents: 119
diff changeset
   182
	menu labels:#('foo' 'bar' 'baz').
claus
parents: 119
diff changeset
   183
	menu selectors:#(foo bar baz).
claus
parents: 119
diff changeset
   184
	menu at:#foo
claus
parents: 119
diff changeset
   185
	     putLabels:#('foo1' 'foo2' 'foo3')
claus
parents: 119
diff changeset
   186
	     selectors:#(foo1 foo2 foo3)
claus
parents: 119
diff changeset
   187
	     receiver:nil.
claus
parents: 119
diff changeset
   188
	menu at:#baz 
claus
parents: 119
diff changeset
   189
	     putLabels:#('baz1' 'baz2' 'baz3')
claus
parents: 119
diff changeset
   190
	     selectors:#(baz1 baz2 baz3)
claus
parents: 119
diff changeset
   191
	     receiver:nil.
claus
parents: 119
diff changeset
   192
	top open
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   193
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   194
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   195
128
claus
parents: 119
diff changeset
   196
    ... or as separators (with nil selector)
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   197
128
claus
parents: 119
diff changeset
   198
	|top menu|
claus
parents: 119
diff changeset
   199
claus
parents: 119
diff changeset
   200
	top := StandardSystemView new.
claus
parents: 119
diff changeset
   201
	top extent:500@200.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   202
128
claus
parents: 119
diff changeset
   203
	menu := PullDownMenu origin:0.0@0.0 corner:1.0@30 in:top.
claus
parents: 119
diff changeset
   204
	menu labels:#('foo' '    ' 'bar' ' baz' '    ' 'moreFoo' 'moreBar' 'moreBaz').
claus
parents: 119
diff changeset
   205
	menu selectors:#(foo nil bar baz nil moreFoo moreBar moreBaz).
claus
parents: 119
diff changeset
   206
	menu at:#foo
claus
parents: 119
diff changeset
   207
	     putLabels:#('foo1' 'foo2' 'foo3')
claus
parents: 119
diff changeset
   208
	     selectors:#(foo1 foo2 foo3)
claus
parents: 119
diff changeset
   209
	     receiver:nil.
claus
parents: 119
diff changeset
   210
	menu at:#bar 
claus
parents: 119
diff changeset
   211
	     putLabels:#('bar1' 'bar2' 'bar3')
claus
parents: 119
diff changeset
   212
	     selectors:#(bar1 bar2 bar3)
claus
parents: 119
diff changeset
   213
	     receiver:nil.
claus
parents: 119
diff changeset
   214
	menu at:#baz 
claus
parents: 119
diff changeset
   215
	     putLabels:#('baz1' 'baz2' 'baz3')
claus
parents: 119
diff changeset
   216
	     selectors:#(baz1 baz2 baz3)
claus
parents: 119
diff changeset
   217
	     receiver:nil.
claus
parents: 119
diff changeset
   218
	top open
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   219
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   220
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   221
128
claus
parents: 119
diff changeset
   222
claus
parents: 119
diff changeset
   223
    use the menus default height
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   224
128
claus
parents: 119
diff changeset
   225
	|top menu|
claus
parents: 119
diff changeset
   226
claus
parents: 119
diff changeset
   227
	top := StandardSystemView new.
claus
parents: 119
diff changeset
   228
	top extent:300@300.
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   229
128
claus
parents: 119
diff changeset
   230
	menu := PullDownMenu in:top.
claus
parents: 119
diff changeset
   231
	menu origin:0.0@0.0 corner:1.0@(menu height).
claus
parents: 119
diff changeset
   232
	menu labels:#('foo' 'bar').
claus
parents: 119
diff changeset
   233
	menu selectors:#(foo bar).
claus
parents: 119
diff changeset
   234
	menu at:#foo
claus
parents: 119
diff changeset
   235
	     putLabels:#('foo1' 'foo2' 'foo3')
claus
parents: 119
diff changeset
   236
	     selectors:#(foo1 foo2 foo3)
claus
parents: 119
diff changeset
   237
	     receiver:nil.
claus
parents: 119
diff changeset
   238
	top open
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   239
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   240
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   241
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   242
128
claus
parents: 119
diff changeset
   243
    although you can change the font, colors etc (as shown below)
claus
parents: 119
diff changeset
   244
    you should NOT do it - since if you do so, the styleSheet settings
claus
parents: 119
diff changeset
   245
    are ineffective (which users wont like probably)
claus
parents: 119
diff changeset
   246
    BTW: The styleSheet entries for below are pullDownMenuForegroundColor,
claus
parents: 119
diff changeset
   247
	 pullDownMenuBackgroundColor and pullDownMenuFont
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   248
128
claus
parents: 119
diff changeset
   249
	|top menu|
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   250
128
claus
parents: 119
diff changeset
   251
	top := StandardSystemView new.
claus
parents: 119
diff changeset
   252
	menu := PullDownMenu in:top.
claus
parents: 119
diff changeset
   253
	menu font:(Font family:'courier' size:20).
claus
parents: 119
diff changeset
   254
	menu foregroundColor:Color red.
claus
parents: 119
diff changeset
   255
	menu backgroundColor:Color yellow.
claus
parents: 119
diff changeset
   256
	menu viewBackground:Color yellow.
claus
parents: 119
diff changeset
   257
	menu showSeparatingLines:true.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   258
128
claus
parents: 119
diff changeset
   259
	menu origin:0.0@0.0 corner:1.0@(menu height).
claus
parents: 119
diff changeset
   260
	menu labels:#('foo' 'bar').
claus
parents: 119
diff changeset
   261
	menu selectors:#(foo bar).
claus
parents: 119
diff changeset
   262
	menu at:#foo
claus
parents: 119
diff changeset
   263
	     putLabels:#('foo1' 'foo2' 'foo3')
claus
parents: 119
diff changeset
   264
	     selectors:#(foo1 foo2 foo3)
claus
parents: 119
diff changeset
   265
	     receiver:nil.
claus
parents: 119
diff changeset
   266
	(menu menuAt:#foo) font:(Font family:'courier' size:36).
claus
parents: 119
diff changeset
   267
	top open
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   268
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   269
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   270
128
claus
parents: 119
diff changeset
   271
    you can use icons, too ...
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   272
128
claus
parents: 119
diff changeset
   273
	|labels top menu|
claus
parents: 119
diff changeset
   274
claus
parents: 119
diff changeset
   275
	top := StandardSystemView new.
claus
parents: 119
diff changeset
   276
	top extent:300@300.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   277
128
claus
parents: 119
diff changeset
   278
	menu := PullDownMenu in:top.
claus
parents: 119
diff changeset
   279
	menu origin:0.0@0.0 corner:1.0@(menu height).
claus
parents: 119
diff changeset
   280
	labels := Array with:((Image fromFile:'SmalltalkX.xbm') magnifiedTo:16@16)
claus
parents: 119
diff changeset
   281
			with:'foo'
claus
parents: 119
diff changeset
   282
			with:'bar'.
claus
parents: 119
diff changeset
   283
	menu labels:labels.
claus
parents: 119
diff changeset
   284
	menu selectors:#(about foo bar).
claus
parents: 119
diff changeset
   285
	menu at:#about 
claus
parents: 119
diff changeset
   286
	     putLabels:#('about PullDownMenus')
claus
parents: 119
diff changeset
   287
	     selectors:#(aboutMenus)
claus
parents: 119
diff changeset
   288
	     receiver:nil.
claus
parents: 119
diff changeset
   289
	menu at:#foo
claus
parents: 119
diff changeset
   290
	     putLabels:#('foo1' 'foo2' 'foo3')
claus
parents: 119
diff changeset
   291
	     selectors:#(foo1 foo2 foo3)
claus
parents: 119
diff changeset
   292
	     receiver:nil.
claus
parents: 119
diff changeset
   293
	top open
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   294
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   295
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   296
128
claus
parents: 119
diff changeset
   297
    a concrete example (combining things described above)
claus
parents: 119
diff changeset
   298
    (using a Plug, since we have no application class here):
claus
parents: 119
diff changeset
   299
claus
parents: 119
diff changeset
   300
	|labels top menu textView appModel|
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   301
128
claus
parents: 119
diff changeset
   302
	appModel := Plug new.
claus
parents: 119
diff changeset
   303
	appModel respondTo:#quit with:[top destroy].
claus
parents: 119
diff changeset
   304
	appModel respondTo:#showAbout with:[self information:'some info here ...'].
claus
parents: 119
diff changeset
   305
	appModel respondTo:#help with:[self information:'some help here ...'].
claus
parents: 119
diff changeset
   306
claus
parents: 119
diff changeset
   307
	top := StandardSystemView new.
claus
parents: 119
diff changeset
   308
	top extent:300@300.
claus
parents: 119
diff changeset
   309
claus
parents: 119
diff changeset
   310
	menu := PullDownMenu in:top.
claus
parents: 119
diff changeset
   311
	menu receiver:appModel.
claus
parents: 119
diff changeset
   312
	menu origin:0.0@0.0 corner:1.0@(menu height).
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   313
128
claus
parents: 119
diff changeset
   314
	textView := ScrollableView forView:(EditTextView new).
claus
parents: 119
diff changeset
   315
	textView origin:0.0@menu height corner:1.0@1.0.
claus
parents: 119
diff changeset
   316
	top addSubView:textView.
claus
parents: 119
diff changeset
   317
claus
parents: 119
diff changeset
   318
	labels := Array with:((Image fromFile:'SmalltalkX.xbm') magnifiedTo:16@16)
claus
parents: 119
diff changeset
   319
			with:'file'
claus
parents: 119
diff changeset
   320
			with:'edit'
claus
parents: 119
diff changeset
   321
			with:'help'.
claus
parents: 119
diff changeset
   322
	menu labels:labels.
claus
parents: 119
diff changeset
   323
	menu selectors:#(about file edit help).
claus
parents: 119
diff changeset
   324
	menu at:#about 
claus
parents: 119
diff changeset
   325
	     putLabels:#('about PullDownMenus')
claus
parents: 119
diff changeset
   326
	     selectors:#(showAbout)
claus
parents: 119
diff changeset
   327
	     receiver:appModel.
claus
parents: 119
diff changeset
   328
	menu at:#file 
claus
parents: 119
diff changeset
   329
	     putLabels:#('quit')
claus
parents: 119
diff changeset
   330
	     selectors:#(quit)
claus
parents: 119
diff changeset
   331
	     receiver:appModel.
claus
parents: 119
diff changeset
   332
	menu at:#edit 
claus
parents: 119
diff changeset
   333
	     putLabels:#('copy' 'cut' 'paste')
claus
parents: 119
diff changeset
   334
	     selectors:#(copySelection cut paste)
claus
parents: 119
diff changeset
   335
	     receiver:textView.
claus
parents: 119
diff changeset
   336
	top open
3
claus
parents: 0
diff changeset
   337
"
claus
parents: 0
diff changeset
   338
! !
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   339
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   340
!PullDownMenu class methodsFor:'defaults'!
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   341
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   342
updateStyleCache
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   343
    "extract values from the styleSheet and cache them in class variables"
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   344
60
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   345
    DefaultViewBackground := StyleSheet colorAt:'pullDownMenuViewBackground'.
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   346
    DefaultViewBackground isNil ifTrue:[
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   347
	DefaultViewBackground := StyleSheet colorAt:'menuViewBackground'.
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   348
    ].
60
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   349
    DefaultForegroundColor := StyleSheet colorAt:'pullDownMenuForegroundColor'.
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   350
    DefaultForegroundColor isNil ifTrue:[
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   351
	DefaultForegroundColor := StyleSheet colorAt:'menuForegroundColor'.
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   352
    ].
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   353
    DefaultBackgroundColor := StyleSheet colorAt:'pullDownMenuBackgroundColor'.
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   354
    DefaultBackgroundColor isNil ifTrue:[
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   355
	DefaultViewBackground notNil ifTrue:[
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   356
	    DefaultBackgroundColor := DefaultViewBackground
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   357
	] ifFalse:[
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   358
	    DefaultBackgroundColor := StyleSheet colorAt:'menuBackgroundColor'.
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   359
	]
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   360
    ].
60
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   361
    DefaultHilightForegroundColor := StyleSheet colorAt:'pullDownMenuHilightForegroundColor'.
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   362
    DefaultHilightForegroundColor isNil ifTrue:[
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   363
	DefaultHilightForegroundColor := StyleSheet colorAt:'menuHilightForegroundColor'.
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   364
    ].
60
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   365
    DefaultHilightBackgroundColor := StyleSheet colorAt:'pullDownMenuHilightBackgroundColor'.
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   366
    DefaultHilightBackgroundColor isNil ifTrue:[
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   367
	DefaultHilightBackgroundColor := StyleSheet colorAt:'menuHilightBackgroundColor'.
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   368
    ].
60
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   369
    DefaultHilightLevel := StyleSheet at:'pullDownMenuHilightLevel'.
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   370
    DefaultHilightLevel isNil ifTrue:[
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   371
	DefaultHilightLevel := StyleSheet at:'menuHilightLevel' default:0.
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   372
    ].
63
f4eaf04d1eaf *** empty log message ***
claus
parents: 60
diff changeset
   373
    DefaultEdgeStyle := StyleSheet at:'pullDownMenuEdgeStyle'.
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   374
    DefaultKeepMenu := StyleSheet at:'pullDownMenuKeepMenu' default:false.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   375
    DefaultToggleKeep := StyleSheet at:'pullDownMenuToggleKeep' default:false.
60
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   376
    DefaultLevel := StyleSheet at:'pullDownMenuLevel' default:1.
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   377
    DefaultFont := StyleSheet fontAt:'pullDownMenuFont'.
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   378
    DefaultFont isNil ifTrue:[
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   379
	DefaultFont := StyleSheet fontAt:'menuFont'.
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   380
    ].
128
claus
parents: 119
diff changeset
   381
    DefaultSeparatingLines := StyleSheet at:'pullDownMenuSeparatingLines' default:false.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   382
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   383
    "
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   384
     PullDownMenu updateStyleCache
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   385
    "
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   386
! !
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   387
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   388
!PullDownMenu class methodsFor:'instance creation'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   389
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   390
labels:titleArray
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   391
    "create and return a new PullDownMenu"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   392
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   393
    ^ self new labels:titleArray
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   394
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   395
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   396
!PullDownMenu methodsFor:'initialize / release'!
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   397
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   398
initialize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   399
    super initialize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   400
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   401
    font := font on:device.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   402
    self origin:(0.0 @ 0.0)
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   403
	 extent:(1.0 @ (font height + (font descent * 2)  + topMargin)).
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   404
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   405
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   406
initStyle
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   407
    super initStyle.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   408
128
claus
parents: 119
diff changeset
   409
    showSeparatingLines := DefaultSeparatingLines. "/ false.
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   410
    DefaultViewBackground notNil ifTrue:[
60
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   411
	viewBackground := DefaultViewBackground on:device
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   412
    ].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   413
60
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   414
    DefaultFont notNil ifTrue:[
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   415
	font := DefaultFont on:device
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   416
    ].
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   417
    DefaultForegroundColor notNil ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   418
	fgColor := DefaultForegroundColor
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   419
    ] ifFalse:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   420
	fgColor := Black.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   421
    ].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   422
    DefaultBackgroundColor notNil ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   423
	bgColor := DefaultBackgroundColor
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   424
    ] ifFalse:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   425
	bgColor := viewBackground.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   426
    ].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   427
    onLevel := DefaultHilightLevel.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   428
    offLevel := DefaultLevel.
21
9ef599238fea *** empty log message ***
claus
parents: 5
diff changeset
   429
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   430
    self is3D ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   431
	device hasColors ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   432
	    activeFgColor := Color name:'yellow'
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   433
	] ifFalse:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   434
	    activeFgColor := White
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   435
	].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   436
	device hasGreyscales ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   437
	    activeBgColor := bgColor.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   438
	] ifFalse:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   439
	    activeBgColor := fgColor.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   440
	].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   441
	topMargin := 2.
21
9ef599238fea *** empty log message ***
claus
parents: 5
diff changeset
   442
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   443
	((StyleSheet name == #iris) or:[StyleSheet name == #motif]) ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   444
	    self level:2.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   445
	    onLevel := 2.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   446
	    offLevel := 0.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   447
	    activeFgColor := fgColor
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   448
	]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   449
    ] ifFalse:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   450
	activeFgColor := bgColor.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   451
	activeBgColor := fgColor.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   452
	topMargin := 0
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   453
    ].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   454
63
f4eaf04d1eaf *** empty log message ***
claus
parents: 60
diff changeset
   455
    edgeStyle := DefaultEdgeStyle.
f4eaf04d1eaf *** empty log message ***
claus
parents: 60
diff changeset
   456
    keepMenu := DefaultKeepMenu.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   457
    toggleKeep := DefaultToggleKeep.
63
f4eaf04d1eaf *** empty log message ***
claus
parents: 60
diff changeset
   458
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   459
    DefaultHilightForegroundColor notNil ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   460
	activeFgColor := DefaultHilightForegroundColor
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   461
    ].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   462
    DefaultHilightBackgroundColor notNil ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   463
	activeBgColor := DefaultHilightBackgroundColor
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   464
    ].
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   465
    DefaultShadowColor notNil ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   466
	shadowColor := DefaultShadowColor on:device
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   467
    ].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   468
    DefaultLightColor notNil ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   469
	lightColor := DefaultLightColor on:device
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   470
    ].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   471
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   472
    bgColor := bgColor on:device.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   473
    fgColor := fgColor on:device.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   474
    activeBgColor := activeBgColor on:device.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   475
    activeFgColor := activeFgColor on:device.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   476
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   477
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   478
recreate
128
claus
parents: 119
diff changeset
   479
    "if the image was saved with an active menu, hide it"
claus
parents: 119
diff changeset
   480
claus
parents: 119
diff changeset
   481
    |m|
115
claus
parents: 112
diff changeset
   482
claus
parents: 112
diff changeset
   483
    activeMenuNumber notNil ifTrue:[
128
claus
parents: 119
diff changeset
   484
	(m := menus at:activeMenuNumber) notNil ifTrue:[
claus
parents: 119
diff changeset
   485
	    m unrealize.
claus
parents: 119
diff changeset
   486
	].
115
claus
parents: 112
diff changeset
   487
	activeMenuNumber := nil.
claus
parents: 112
diff changeset
   488
    ].
claus
parents: 112
diff changeset
   489
    super recreate.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   490
    self setMenuOrigins
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   491
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   492
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   493
create
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   494
    super create.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   495
    self setMenuOrigins
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   496
!
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   497
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   498
destroy
128
claus
parents: 119
diff changeset
   499
    "have to destroy the menus manually here,
claus
parents: 119
diff changeset
   500
     since they are no real subviews of myself"
claus
parents: 119
diff changeset
   501
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   502
    menus notNil ifTrue:[
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   503
	menus do:[:m |
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   504
	    m notNil ifTrue:[m destroy]
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   505
	].
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   506
	menus := nil
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   507
    ].
115
claus
parents: 112
diff changeset
   508
    activeMenuNumber := nil.
claus
parents: 112
diff changeset
   509
    super destroy.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   510
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   511
128
claus
parents: 119
diff changeset
   512
!PullDownMenu methodsFor:'accessing-look'!
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   513
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   514
showSeparatingLines:aBoolean
128
claus
parents: 119
diff changeset
   515
    "turn on/off drawing of separating lines.
claus
parents: 119
diff changeset
   516
     You should not use this method; instead leave the value as
claus
parents: 119
diff changeset
   517
     defined in the StyleSheet."
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   518
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   519
    showSeparatingLines := aBoolean.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   520
    shown ifTrue:[
128
claus
parents: 119
diff changeset
   521
	self setMenuOrigins.
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   522
	self redraw
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   523
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   524
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   525
128
claus
parents: 119
diff changeset
   526
font:aFont
claus
parents: 119
diff changeset
   527
    "set the menus font.
claus
parents: 119
diff changeset
   528
     adjusts menu-origins when font changes.
claus
parents: 119
diff changeset
   529
     You should not use this method; instead leave the value as
claus
parents: 119
diff changeset
   530
     defined in the StyleSheet."
claus
parents: 119
diff changeset
   531
claus
parents: 119
diff changeset
   532
    aFont ~~ font ifTrue:[
claus
parents: 119
diff changeset
   533
	super font:(aFont on:device).
claus
parents: 119
diff changeset
   534
	self height:(font height + (font descent * 2)).
claus
parents: 119
diff changeset
   535
	shown ifTrue:[
claus
parents: 119
diff changeset
   536
	    self setMenuOrigins
claus
parents: 119
diff changeset
   537
	]
claus
parents: 119
diff changeset
   538
    ]
claus
parents: 119
diff changeset
   539
!
claus
parents: 119
diff changeset
   540
claus
parents: 119
diff changeset
   541
foregroundColor:aColor
claus
parents: 119
diff changeset
   542
    "set the foreground drawing color.
claus
parents: 119
diff changeset
   543
     You should not use this method; instead leave the value as
claus
parents: 119
diff changeset
   544
     defined in the StyleSheet."
claus
parents: 119
diff changeset
   545
claus
parents: 119
diff changeset
   546
    fgColor := aColor on:device
claus
parents: 119
diff changeset
   547
!
claus
parents: 119
diff changeset
   548
claus
parents: 119
diff changeset
   549
backgroundColor:aColor
claus
parents: 119
diff changeset
   550
    "set the background drawing color.
claus
parents: 119
diff changeset
   551
     You should not use this method; instead leave the value as
claus
parents: 119
diff changeset
   552
     defined in the StyleSheet."
claus
parents: 119
diff changeset
   553
claus
parents: 119
diff changeset
   554
    bgColor := aColor on:device
claus
parents: 119
diff changeset
   555
! !
claus
parents: 119
diff changeset
   556
claus
parents: 119
diff changeset
   557
claus
parents: 119
diff changeset
   558
!PullDownMenu methodsFor:'accessing'!
claus
parents: 119
diff changeset
   559
claus
parents: 119
diff changeset
   560
receiver:anObject 
claus
parents: 119
diff changeset
   561
    "set the menu-receiver. Thats the one who gets the
claus
parents: 119
diff changeset
   562
     messages (both from myself and from my submenus).
claus
parents: 119
diff changeset
   563
     This only sets the receiver for menus which are already
claus
parents: 119
diff changeset
   564
     created - menus added later should get their receiver in
claus
parents: 119
diff changeset
   565
     the creation send."
claus
parents: 119
diff changeset
   566
claus
parents: 119
diff changeset
   567
    receiver := anObject.
claus
parents: 119
diff changeset
   568
    menus notNil ifTrue:[
claus
parents: 119
diff changeset
   569
	menus do:[:aMenu |
claus
parents: 119
diff changeset
   570
	    aMenu receiver:anObject
claus
parents: 119
diff changeset
   571
	]
claus
parents: 119
diff changeset
   572
    ]
claus
parents: 119
diff changeset
   573
!
claus
parents: 119
diff changeset
   574
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   575
numberOfTitles:n
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   576
    "setup blank title-space to be filled in later"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   577
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   578
    menus := Array new:n.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   579
    titles := Array new:n
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   580
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   581
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   582
labels:titleArray
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   583
    "define the menu-titles (group-headers)"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   584
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   585
    |numberOfLabels|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   586
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   587
    numberOfLabels := titleArray size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   588
    menus := Array new:numberOfLabels.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   589
    titles := Array new:numberOfLabels.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   590
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   591
    titleArray keysAndValuesDo:[:index :entry |
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   592
	|e|
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   593
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   594
	entry isImage ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   595
	    e := entry on:device
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   596
	] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   597
	    e := entry printString
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   598
	].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   599
	titles at:index put:e
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   600
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   601
    shown ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   602
	self clear.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   603
	self redraw
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   604
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   605
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   606
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   607
labels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   608
    "return the menu-titles (group-headers)"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   609
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   610
    ^ titles
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   611
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   612
91
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   613
selectors:selectorArray
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   614
    "define the menu-selectors. These are used as accesskey only
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   615
     in menuAt: accesses. This makes PullDownMenu accesss
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   616
     somewhat more compatible to PopUpMenus."
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   617
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   618
    selectors := selectorArray.
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   619
!
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   620
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   621
menuAt:string
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   622
    "return the menu with the title; return nil if not found"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   623
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   624
    |index|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   625
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   626
    index := self indexOf:string.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   627
    (index == 0) ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   628
    ^ menus at:index
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   629
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   630
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   631
at:aString putMenu:aMenu
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   632
    "set the menu under the title, aString"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   633
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   634
    |index|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   635
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   636
    index := self indexOf:aString.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   637
    (index == 0) ifTrue:[^ nil].
112
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   638
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   639
"/ not needed:
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   640
"/    aMenu origin:((left + (self titleLenUpTo:index)) 
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   641
"/                  @
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   642
"/                  (height + aMenu borderWidth)).
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   643
    aMenu hidden:true.
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   644
    menus at:index put:aMenu.
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   645
    aMenu masterView:self.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   646
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   647
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   648
at:aString putLabels:labels selectors:selectors args:args receiver:anObject
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   649
    "create and set the menu under the title, aString"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   650
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   651
    |menuView|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   652
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   653
    menuView := MenuView labels:labels
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   654
		      selectors:selectors
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   655
			   args:args
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   656
		       receiver:anObject
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   657
			    for:self.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   658
    self at:aString putMenu:menuView
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   659
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   660
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   661
at:aString putLabels:labels selector:selector args:args receiver:anObject
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   662
    "create and set the menu under the title, aString"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   663
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   664
    |menuView|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   665
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   666
    menuView := MenuView labels:labels
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   667
		       selector:selector
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   668
			   args:args
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   669
		       receiver:anObject
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   670
			    for:self.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   671
    self at:aString putMenu:menuView
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   672
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   673
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   674
at:aString putLabels:labels selectors:selectors receiver:anObject
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   675
    "create and set the menu under the title, aString"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   676
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   677
    |menuView|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   678
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   679
    menuView := MenuView labels:labels
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   680
		      selectors:selectors
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   681
		       receiver:anObject
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   682
			    for:self.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   683
    self at:aString putMenu:menuView
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   684
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   685
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   686
!PullDownMenu methodsFor:'private'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   687
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   688
titleLenUpTo:index
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   689
    "answer len (in pixels) of all title-strings up-to 
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   690
     (but excluding) title-index. Used to compute x-position when drawing
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   691
     individual entries."
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   692
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   693
    |len "{ Class: SmallInteger }" 
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   694
     wSpace wSep|
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   695
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   696
    (index <= 1) ifTrue:[^ 0].
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   697
    wSpace := (font widthOf:' ').
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   698
    showSeparatingLines ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   699
	self is3D ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   700
	    wSep := 2
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   701
	] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   702
	    wSep := 1
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   703
	]
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   704
    ] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   705
	wSep := 0
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   706
    ].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   707
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   708
    len := 0.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   709
    titles from:1 to:(index - 1) do:[:entry |
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   710
	|thisLength|
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   711
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   712
	entry isString ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   713
	    thisLength := (font widthOf:entry).
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   714
	] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   715
	    thisLength := entry width
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   716
	].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   717
	len := len + thisLength + wSpace + wSep + wSpace.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   718
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   719
    ^ len
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   720
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   721
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   722
indexOf:stringOrNumber
91
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   723
    "return the index of the menu with title; return 0 if not found.
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   724
     stringOrNumber may be a number, a selector from the selectorArray
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   725
     or a string from the title array."
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   726
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   727
    |idx|
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   728
91
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   729
    stringOrNumber isNumber ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   730
	^ stringOrNumber
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   731
    ].
91
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   732
    selectors notNil ifTrue:[
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   733
	idx := selectors indexOf:stringOrNumber.
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   734
	idx ~~ 0 ifTrue:[^ idx].
e8db16616e97 *** empty log message ***
claus
parents: 77
diff changeset
   735
    ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   736
    ^ titles indexOf:stringOrNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   737
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   738
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   739
setMenuOrigins
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   740
    "adjust origins of menus when font changes"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   741
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   742
    (font device == device) ifTrue:[
119
claus
parents: 116
diff changeset
   743
	menus keysAndValuesDo:[:index :aMenu |
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   744
	    aMenu notNil ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   745
		aMenu origin:((left + (self titleLenUpTo:index)) 
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   746
			      @
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   747
			      (height + aMenu borderWidth))
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   748
	    ].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   749
	]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   750
    ]
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   751
!
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   752
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   753
titleIndexForX:x
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   754
    "given a click x-position, return index in title or nil"
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   755
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   756
    |xstart "{ Class: SmallInteger }"
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   757
     xend   "{ Class: SmallInteger }" 
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   758
     wSpace wSep|
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   759
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   760
    wSpace := (font widthOf:' ') * 2. 
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   761
    showSeparatingLines ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   762
	self is3D ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   763
	    wSep := 2
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   764
	] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   765
	    wSep := 1
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   766
	]
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   767
    ] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   768
	wSep := 0
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   769
    ].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   770
    xstart := 0.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   771
    1 to:(titles size) do:[:index |
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   772
	|entry thisLength|
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   773
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   774
	entry := titles at:index.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   775
	entry isString ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   776
	    thisLength := font widthOf:entry.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   777
	] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   778
	    thisLength := entry width
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   779
	].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   780
	xend := xstart + thisLength + wSpace + wSep.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   781
	(x between:xstart and:xend) ifTrue:[^ index].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   782
	xstart := xend
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   783
    ].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   784
    ^ nil
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   785
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   786
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   787
!PullDownMenu methodsFor:'hiding/showing menus'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   788
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   789
hideActiveMenuRelease:aBoolean
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   790
    "hide currently active menu - release grab if aBoolean is true
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   791
     and a grab was set (keepMenu)"
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   792
128
claus
parents: 119
diff changeset
   793
    |m|
claus
parents: 119
diff changeset
   794
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   795
    activeMenuNumber notNil ifTrue:[
128
claus
parents: 119
diff changeset
   796
	(m := menus at:activeMenuNumber) notNil ifTrue:[
claus
parents: 119
diff changeset
   797
	    m unrealize.
claus
parents: 119
diff changeset
   798
	].
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   799
	self unHighlightActiveTitle.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   800
	activeMenuNumber := nil
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   801
    ].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   802
    aBoolean ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   803
	device ungrabPointer. 
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   804
	self cursor:Cursor normal
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   805
    ].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   806
!
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   807
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   808
hideActiveMenu
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   809
    "hide currently active menu - release grab if there is any grab (keepMenu)"
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   810
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   811
    ^ self hideActiveMenuRelease:true
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   812
!
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   813
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   814
pullMenu:aNumber
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   815
    "activate a menu, return it or nil"
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   816
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   817
    |subMenu|
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   818
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   819
    activeMenuNumber notNil ifTrue:[self hideActiveMenuRelease:false].
128
claus
parents: 119
diff changeset
   820
    activeMenuNumber := aNumber.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   821
    subMenu := menus at:aNumber.
128
claus
parents: 119
diff changeset
   822
claus
parents: 119
diff changeset
   823
    (activeMenuNumber notNil 
claus
parents: 119
diff changeset
   824
    and:[
claus
parents: 119
diff changeset
   825
	 subMenu notNil
claus
parents: 119
diff changeset
   826
	 or:[(selectors at:activeMenuNumber) notNil]]) ifTrue:[
claus
parents: 119
diff changeset
   827
	    self highlightActiveTitle.
claus
parents: 119
diff changeset
   828
	 ].
claus
parents: 119
diff changeset
   829
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   830
    subMenu notNil ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   831
	subMenu deselect.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   832
	subMenu create.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   833
	subMenu saveUnder:true.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   834
	subMenu superMenu:self.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   835
	subMenu raise show
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   836
    ].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   837
    ^ subMenu
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   838
!
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   839
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   840
regainControl
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   841
    keepMenu ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   842
	device grabPointerInView:self.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   843
	self cursor:Cursor upRightArrow
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   844
    ]
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   845
! !
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   846
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   847
!PullDownMenu methodsFor:'drawing '!
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   848
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   849
redraw
128
claus
parents: 119
diff changeset
   850
    |x     "{ Class: SmallInteger }"
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   851
     y     "{ Class: SmallInteger }"
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   852
     index "{ Class: SmallInteger }" 
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   853
     wSpace|
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   854
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   855
    shown ifFalse: [ ^ self ].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   856
    titles isNil ifTrue:[^ self].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   857
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   858
    wSpace := (font widthOf:' ').
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   859
    x := 0.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   860
    y := height "- 1".
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   861
    index := 1.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   862
    titles do:[:title |
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   863
	self drawTitle:title x:x selected:(index == activeMenuNumber).
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   864
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   865
	title isString ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   866
	    x := x + (font widthOf:title).
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   867
	] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   868
	    x := x + title width
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   869
	].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   870
	x := x + wSpace + wSpace.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   871
	showSeparatingLines ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   872
	    self is3D ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   873
		self paint:shadowColor.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   874
		self displayLineFromX:x y:0 toX:x y:y.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   875
		x := x + 1.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   876
		self paint:lightColor.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   877
	    ] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   878
		self paint:fgColor.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   879
	    ].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   880
	    self displayLineFromX:x y:0 toX:x y:y.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   881
	    x := x + 1
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   882
	].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   883
	index := index + 1
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   884
    ]
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   885
!
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   886
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   887
drawTitle:stringOrImage x:x0 selected:selected
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   888
    |y w x wSpace|
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   889
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   890
    wSpace := font widthOf:' '.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   891
    x := x0.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   892
    stringOrImage isString ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   893
	y := ((height - (font height)) // 2) + (font ascent) "+ topMargin".
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   894
	w := font widthOf:stringOrImage.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   895
    ] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   896
	y := ((height - stringOrImage height) // 2) max:0.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   897
	w := stringOrImage width
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   898
    ].
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   899
    w := w + (wSpace * 2).
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   900
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   901
    selected ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   902
	self paint:activeBgColor
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   903
    ] ifFalse:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   904
	self paint:bgColor
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   905
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   906
    self fillRectangleX:x y:0 width:w height:height.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   907
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   908
    self is3D ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   909
	self drawEdgesForX:x y:0
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   910
		     width:w
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   911
		    height:height
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   912
		     level:(selected ifTrue:[onLevel] ifFalse:[offLevel])
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   913
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   914
    selected ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   915
	self paint:activeFgColor
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   916
    ] ifFalse:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   917
	self paint:fgColor
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   918
    ].
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   919
    x := x + wSpace.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   920
    stringOrImage isString ifTrue:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   921
	self displayString:stringOrImage x:x y:y
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   922
    ] ifFalse:[
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   923
	self displayForm:stringOrImage x:x y:y
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   924
    ]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   925
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   926
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   927
highlightActiveTitle
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   928
    |x|
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   929
    activeMenuNumber notNil ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   930
	x := self titleLenUpTo:activeMenuNumber.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   931
	self drawTitle:(titles at:activeMenuNumber) x:x selected:true
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   932
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   933
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   934
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   935
unHighlightActiveTitle
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   936
    |x|
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   937
    activeMenuNumber notNil ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
   938
	x := self titleLenUpTo:activeMenuNumber.
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   939
	self drawTitle:(titles at:activeMenuNumber) x:x selected:false
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   940
    ]
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   941
! !
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   942
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   943
!PullDownMenu methodsFor:'submenu notifications'!
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   944
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   945
showActive
128
claus
parents: 119
diff changeset
   946
    "sent by a menu to tell me that it starts to perform
claus
parents: 119
diff changeset
   947
     its menu action."
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
   948
!
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
   949
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   950
showPassive
128
claus
parents: 119
diff changeset
   951
    "sent by a menu to tell me that it finished its menu-action.
claus
parents: 119
diff changeset
   952
     Here, we hide the currently active menu."
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   953
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   954
    self hideActiveMenu
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   955
!
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
   956
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   957
submenuTriggered 
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   958
    "sent by a sub-submenu to tell me that it finished its menu-action."
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   959
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
   960
    self showPassive
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   961
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   962
70
14443a9ea4ec *** empty log message ***
claus
parents: 63
diff changeset
   963
!PullDownMenu methodsFor:'event handling'!
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   964
128
claus
parents: 119
diff changeset
   965
showNoFocus
claus
parents: 119
diff changeset
   966
    "when stepping focus, hide any active menu"
claus
parents: 119
diff changeset
   967
claus
parents: 119
diff changeset
   968
    self hideActiveMenu.
claus
parents: 119
diff changeset
   969
    super showNoFocus
claus
parents: 119
diff changeset
   970
!
claus
parents: 119
diff changeset
   971
112
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   972
keyPress:key x:x y:y
128
claus
parents: 119
diff changeset
   973
    |index m sel|
112
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   974
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   975
    "
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   976
     handle CursorLeft/Right for non-mouse operation
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   977
     (once it has the explicit focus)
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   978
    "
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   979
    ((key == #CursorRight) or:[key == #CursorLeft]) ifTrue:[
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   980
	activeMenuNumber isNil ifTrue:[
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   981
	    index := (key == #CursorRight) ifTrue:[1] ifFalse:[menus size].
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   982
	] ifFalse:[
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   983
	    (key == #CursorRight) ifTrue:[
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   984
		index := activeMenuNumber+1
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   985
	    ] ifFalse:[
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   986
		index := activeMenuNumber-1
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   987
	    ].
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   988
	    index == 0 ifTrue:[index := menus size]
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   989
	    ifFalse:[
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   990
		index > menus size ifTrue:[index := 1]
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   991
	    ]
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   992
	].
128
claus
parents: 119
diff changeset
   993
	self pullMenu:index.
112
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   994
	^ self
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   995
    ].
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   996
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   997
    activeMenuNumber isNil ifTrue:[^self].
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   998
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
   999
    "
128
claus
parents: 119
diff changeset
  1000
     pass it on to the active menu or perform the items action
112
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
  1001
    "
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
  1002
    m := menus at:activeMenuNumber.
128
claus
parents: 119
diff changeset
  1003
    m isNil ifTrue:[
claus
parents: 119
diff changeset
  1004
	key == #Return ifTrue:[
claus
parents: 119
diff changeset
  1005
	    sel := selectors at:activeMenuNumber.
claus
parents: 119
diff changeset
  1006
	    sel notNil ifTrue:[
claus
parents: 119
diff changeset
  1007
		receiver perform:sel
claus
parents: 119
diff changeset
  1008
	    ]
claus
parents: 119
diff changeset
  1009
	].
claus
parents: 119
diff changeset
  1010
    ] ifFalse:[
claus
parents: 119
diff changeset
  1011
	m keyPress:key x:0 y:0.
claus
parents: 119
diff changeset
  1012
    ].
112
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
  1013
!
81633ba1bf40 *** empty log message ***
claus
parents: 110
diff changeset
  1014
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
  1015
buttonPress:button x:x y:y
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
  1016
    |titleIndex activeMenu activeLeft activeTop m|
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1017
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
  1018
    device ungrabPointer.
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1019
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1020
    (y between:0 and:height) ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1021
	titleIndex := self titleIndexForX:x.
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1022
    ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1023
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1024
    "
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1025
     now, titleIndex is non-nil if pressed within myself
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1026
    "
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1027
    (titleIndex notNil and:[titleIndex ~~ activeMenuNumber]) ifTrue:[
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
  1028
	m := self pullMenu:titleIndex.
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
  1029
	(keepMenu and:[m notNil]) ifTrue:[
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
  1030
	    device grabPointerInView:self.
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1031
	    self cursor:Cursor upRightArrow
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1032
	]
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1033
    ] ifFalse:[
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
  1034
	(keepMenu and:[toggleKeep not]) ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1035
	    titleIndex == activeMenuNumber ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1036
		"same pressed again ... stay"
110
eb59f6e31e84 *** empty log message ***
claus
parents: 95
diff changeset
  1037
		device grabPointerInView:self.
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1038
		^ self
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1039
	    ].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1040
	    "moving around below"
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1041
	    activeMenuNumber isNil ifTrue:[^self].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1042
	    activeMenu := menus at:activeMenuNumber.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1043
	    activeLeft := activeMenu left.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1044
	    (x between:activeLeft and:(activeMenu right)) ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1045
		activeTop := activeMenu top.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1046
		(y between:activeTop and:(activeMenu bottom)) ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1047
		    "moving around in menu"
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1048
		    activeMenu buttonPress:button
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1049
					 x:(x - activeLeft)
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1050
					 y:(y - activeTop).
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1051
		    ^ self
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1052
		]
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1053
	    ].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1054
	].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1055
	self hideActiveMenu
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1056
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1057
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1058
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1059
buttonMotion:button x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1060
    |titleIndex activeMenu activeLeft activeTop|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1061
116
claus
parents: 115
diff changeset
  1062
    activeMenuNumber notNil ifTrue:[
claus
parents: 115
diff changeset
  1063
	activeMenu := menus at:activeMenuNumber.
claus
parents: 115
diff changeset
  1064
    ].
claus
parents: 115
diff changeset
  1065
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1066
    (y < height) ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1067
	"moving around in title line"
116
claus
parents: 115
diff changeset
  1068
	activeMenu notNil ifTrue:[
claus
parents: 115
diff changeset
  1069
	    activeMenu selection:nil
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1070
	].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1071
	titleIndex := self titleIndexForX:x.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1072
	titleIndex notNil ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1073
	    (titleIndex ~~ activeMenuNumber) ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1074
		self pullMenu:titleIndex
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1075
	    ]
128
claus
parents: 119
diff changeset
  1076
	] ifFalse:[
claus
parents: 119
diff changeset
  1077
	    self hideActiveMenu
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1078
	]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1079
    ] ifFalse:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1080
	"moving around below"
116
claus
parents: 115
diff changeset
  1081
	activeMenu isNil ifTrue:[^self].
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1082
	activeLeft := activeMenu left.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1083
	(x between:activeLeft and:(activeMenu right)) ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1084
	    activeTop := activeMenu top.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1085
	    (y between:activeTop and:(activeMenu bottom)) ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1086
		"moving around in menu"
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1087
		activeMenu buttonMotion:button
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1088
				      x:(x - activeLeft)
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1089
				      y:(y - activeTop).
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1090
		^ self
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1091
	    ]
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1092
	].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1093
	"moved outside menu"
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1094
	activeMenu selection:nil
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1095
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1096
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1097
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1098
buttonRelease:button x:x y:y
128
claus
parents: 119
diff changeset
  1099
    |activeMenu activeLeft activeTop hideMenu sel|
claus
parents: 119
diff changeset
  1100
claus
parents: 119
diff changeset
  1101
    activeMenuNumber isNil ifTrue:[^self].
claus
parents: 119
diff changeset
  1102
    activeMenu := menus at:activeMenuNumber.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1103
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1104
    hideMenu := false.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1105
    (y >= height) ifTrue:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1106
	"release below title-line"
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1107
	activeLeft := activeMenu left.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1108
	"
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1109
	 released in a submenu ?
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1110
	"
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1111
	(x between:activeLeft and:(activeMenu right)) ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1112
	    activeTop := activeMenu top.
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1113
	    (y between:activeTop and:(activeMenu bottom)) ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1114
		"release in menu"
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1115
		self hideActiveMenu.   
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1116
		activeMenu buttonRelease:button
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1117
				       x:(x - activeLeft)
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1118
				       y:(y - activeTop).
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1119
		^ self
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1120
	    ]
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1121
	].
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1122
	hideMenu := true.
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1123
    ] ifFalse:[
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1124
	y < 0 ifTrue:[
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1125
	    hideMenu := true
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1126
	] ifFalse:[
128
claus
parents: 119
diff changeset
  1127
	    activeMenu isNil ifTrue:[
claus
parents: 119
diff changeset
  1128
		sel := selectors at:activeMenuNumber.
claus
parents: 119
diff changeset
  1129
		sel notNil ifTrue:[
claus
parents: 119
diff changeset
  1130
		    receiver perform:sel
claus
parents: 119
diff changeset
  1131
		].
claus
parents: 119
diff changeset
  1132
		hideMenu := true.
claus
parents: 119
diff changeset
  1133
	    ] ifFalse:[
claus
parents: 119
diff changeset
  1134
		keepMenu ifFalse:[   
claus
parents: 119
diff changeset
  1135
		    hideMenu := true
claus
parents: 119
diff changeset
  1136
		]
59
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1137
	    ]
450ce95a72a4 *** empty log message ***
claus
parents: 38
diff changeset
  1138
	]
38
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1139
    ].                  
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1140
    hideMenu ifTrue:[
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1141
       self hideActiveMenu.
4b9b70b2cc87 2.10.3 pre-final version
claus
parents: 21
diff changeset
  1142
    ]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1143
! !