PullDownMenu.st
author claus
Wed, 13 Oct 1993 02:04:14 +0100
changeset 3 9d7eefb5e69f
parent 0 e6a541c1c0eb
child 5 7b4fb1b170e5
permissions -rw-r--r--
(none)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     1
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1989-93 by Claus Gittinger
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
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
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    13
View subclass:#PullDownMenu
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'menus titles activeMenuNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    15
                              showSeparatingLines topMargin
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    16
                              fgColor bgColor activeFgColor activeBgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    17
                              onLevel offLevel'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    18
       classVariableNames:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    19
       poolDictionaries:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    20
       category:'Views-Menus'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    21
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    22
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    23
PullDownMenu comment:'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    24
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    25
COPYRIGHT (c) 1989-93 by Claus Gittinger
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    26
             All Rights Reserved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    27
3
claus
parents: 0
diff changeset
    28
$Header: /cvs/stx/stx/libwidg/PullDownMenu.st,v 1.2 1993-10-13 01:03:09 claus Exp $
claus
parents: 0
diff changeset
    29
claus
parents: 0
diff changeset
    30
written summer 89 by claus
claus
parents: 0
diff changeset
    31
'!
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    32
3
claus
parents: 0
diff changeset
    33
!PullDownMenu class methodsFor:'documentation'!
claus
parents: 0
diff changeset
    34
claus
parents: 0
diff changeset
    35
documentation
claus
parents: 0
diff changeset
    36
"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    37
PullDown menu provides the top (always visible) part of these menus. It controls
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    38
display of its menus, which become visible when one of the PullDownMenus entries is pressed.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    39
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    40
Instance variables:
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    41
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    42
menus                   <aCollection>   the sub menus
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    43
titles                  <aCollection>   the strings in the menu
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    44
activeMenuNumber        <Number>        the index of the currently active menu
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    45
showSeparatingLines     <Boolean>       show separating lines between my menu-strings
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    46
topMargin               <Number>        number of pixels at top
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    47
fgColor                 <Color>         color to draw passive menu-titles
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    48
bgColor                 <Color>         color to draw passive menu-titles
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    49
activeFgColor           <Color>         color to draw activated menu-titles
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    50
activeBgColor           <Color>         color to draw activated menu-titles
3
claus
parents: 0
diff changeset
    51
"
claus
parents: 0
diff changeset
    52
! !
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    53
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    54
!PullDownMenu class methodsFor:'instance creation'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    55
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    56
labels:titleArray
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    57
    "create and return a new PullDownMenu"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    58
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    59
    ^ self new labels:titleArray
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    60
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    61
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    62
!PullDownMenu methodsFor:'initialization'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    63
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    64
initialize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    65
    super initialize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    66
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    67
    font := font on:device.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    68
    self origin:(0.0 @ 0.0)
3
claus
parents: 0
diff changeset
    69
         extent:(1.0 @ (font height + (font descent * 2)  + topMargin)).
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    70
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    71
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    72
initStyle
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    73
    super initStyle.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    74
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    75
    showSeparatingLines := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    76
    fgColor := Black.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    77
    bgColor := viewBackground.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    78
    self is3D ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    79
        device hasColors ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    80
            activeFgColor := Color name:'yellow'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    81
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    82
            activeFgColor := White
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    83
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    84
        device hasGreyscales ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    85
            activeBgColor := bgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    86
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    87
            activeBgColor := fgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    88
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    89
        topMargin := 2
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    90
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    91
        activeFgColor := bgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    92
        activeBgColor := fgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    93
        topMargin := 0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    94
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    95
    onLevel := -1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    96
    offLevel := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    97
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    98
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    99
initEvents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   100
    self enableButtonMotionEvents.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   101
    self enableButtonEvents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   102
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   103
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   104
recreate
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   105
    super create.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   106
    self setMenuOrigins
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   107
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   108
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   109
create
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   110
    super create.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   111
    self setMenuOrigins
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   112
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   113
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   114
!PullDownMenu methodsFor:'accessing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   115
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   116
showSeparatingLines:aBoolean
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   117
    "turn on/off drawing of separating lines"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   118
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   119
    showSeparatingLines := aBoolean.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   120
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   121
        self redraw
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   122
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   123
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   124
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   125
numberOfTitles:n
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   126
    "setup blank title-space to be filled in later"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   127
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   128
    menus := Array new:n.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   129
    titles := Array new:n
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   130
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   131
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   132
labels:titleArray
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   133
    "define the menu-titles (group-headers)"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   134
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   135
    |numberOfLabels|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   136
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   137
    numberOfLabels := titleArray size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   138
    menus := Array new:numberOfLabels.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   139
    titles := Array new:numberOfLabels.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   140
    1 to:numberOfLabels do:[:index |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   141
        titles at:index put:(titleArray at:index) printString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   142
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   143
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   144
        self clear.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   145
        self redraw
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   146
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   147
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   148
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   149
labels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   150
    "return the menu-titles (group-headers)"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   151
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   152
    ^ titles
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   153
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   154
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   155
font:aFont
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   156
    "adjust menu-origins when font changes"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   157
3
claus
parents: 0
diff changeset
   158
    super font:(aFont on:device).
claus
parents: 0
diff changeset
   159
    self height:(font height + (font descent * 2)).
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   160
    self setMenuOrigins
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   161
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   162
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   163
menuAt:string
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   164
    "return the menu with the title; return nil if not found"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   165
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   166
    |index|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   167
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   168
    index := self indexOf:string.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   169
    (index == 0) ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   170
    ^ menus at:index
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   171
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   172
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   173
at:aString putMenu:aMenu
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   174
    "set the menu under the title, aString"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   175
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   176
    |index|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   177
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   178
    index := self indexOf:aString.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   179
    (index == 0) ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   180
    aMenu origin:((left + (self titleLenUpTo:index)) 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   181
                  @
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   182
                  (height + aMenu borderWidth)).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   183
    aMenu hidden:true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   184
    menus at:index put:aMenu
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   185
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   186
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   187
at:aString putLabels:labels selectors:selectors args:args receiver:anObject
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   188
    "create and set the menu under the title, aString"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   189
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   190
    |menuView|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   191
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   192
    menuView := MenuView labels:labels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   193
                      selectors:selectors
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   194
                           args:args
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   195
                       receiver:anObject
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   196
                            for:self.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   197
    self at:aString putMenu:menuView
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   198
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   199
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   200
at:aString putLabels:labels selector:selector args:args receiver:anObject
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   201
    "create and set the menu under the title, aString"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   202
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   203
    |menuView|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   204
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   205
    menuView := MenuView labels:labels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   206
                       selector:selector
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   207
                           args:args
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   208
                       receiver:anObject
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   209
                            for:self.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   210
    self at:aString putMenu:menuView
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   211
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   212
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   213
at:aString putLabels:labels selectors:selectors receiver:anObject
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   214
    "create and set the menu under the title, aString"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   215
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   216
    |menuView|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   217
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   218
    menuView := MenuView labels:labels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   219
                      selectors:selectors
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   220
                       receiver:anObject
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   221
                            for:self.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   222
    self at:aString putMenu:menuView
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   223
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   224
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   225
!PullDownMenu methodsFor:'private'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   226
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   227
titleLenUpTo:index
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   228
    "answer len of all title-strings up-to (but excluding) title-index"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   229
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   230
    |len "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   231
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   232
    (index <= 1) ifTrue:[^ 0].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   233
    len := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   234
    titles from:1 to:(index - 1) do:[:string |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   235
        len := len + (font widthOf:(' ' , string , ' ')).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   236
        showSeparatingLines ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   237
            self is3D ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   238
                len := len + 2
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   239
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   240
                len := len + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   241
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   242
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   243
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   244
    ^ len
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   245
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   246
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   247
indexOf:stringOrNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   248
    "return the index of the menu with title; return 0 if not found"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   249
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   250
    (stringOrNumber isMemberOf:SmallInteger) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   251
        ^ stringOrNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   252
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   253
    ^ titles indexOf:stringOrNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   254
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   255
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   256
setMenuOrigins
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   257
    "adjust origins of menus when font changes"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   258
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   259
    |index|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   260
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   261
    (font device == device) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   262
        index := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   263
        menus do:[:aMenu |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   264
            aMenu notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   265
                aMenu origin:((left + (self titleLenUpTo:index)) 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   266
                              @
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   267
                              (height + aMenu borderWidth))
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   268
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   269
            index := index + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   270
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   271
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   272
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   273
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   274
!PullDownMenu methodsFor:'hiding/showing menus'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   275
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   276
drawTitle:string x:x selected:selected
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   277
    |yText w|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   278
3
claus
parents: 0
diff changeset
   279
    yText := ((height - (font height)) // 2) + (font ascent) "+ topMargin".
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   280
    w := font widthOf:string.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   281
    selected ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   282
        self paint:activeBgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   283
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   284
        self paint:bgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   285
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   286
    self fillRectangleX:x y:0 width:w height:height.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   287
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   288
    self is3D ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   289
        self drawEdgesForX:x y:0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   290
                     width:w
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   291
                    height:height
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   292
                     level:(selected ifTrue:[onLevel] ifFalse:[offLevel])
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   293
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   294
    selected ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   295
        self paint:activeFgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   296
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   297
        self paint:fgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   298
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   299
    self displayString:string x:x y:yText
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   300
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   301
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   302
highlightActiveTitle
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   303
    |x string|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   304
    activeMenuNumber notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   305
        x := self titleLenUpTo:activeMenuNumber.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   306
        string := ' ' , (titles at:activeMenuNumber) , ' '.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   307
        self drawTitle:string x:x selected:true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   308
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   309
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   310
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   311
unHighlightActiveTitle
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   312
    |x string|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   313
    activeMenuNumber notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   314
        x := self titleLenUpTo:activeMenuNumber.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   315
        string := ' ' , (titles at:activeMenuNumber) , ' '.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   316
        self drawTitle:string x:x selected:false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   317
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   318
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   319
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   320
hideActiveMenu
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   321
    activeMenuNumber notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   322
        (menus at:activeMenuNumber) unrealize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   323
        self unHighlightActiveTitle.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   324
        activeMenuNumber := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   325
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   326
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   327
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   328
pullMenu:aNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   329
    "activate a menu"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   330
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   331
    |subMenu|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   332
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   333
    activeMenuNumber notNil ifTrue:[self hideActiveMenu].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   334
    subMenu := menus at:aNumber.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   335
    subMenu notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   336
        activeMenuNumber := aNumber.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   337
        self highlightActiveTitle.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   338
        subMenu deselect.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   339
        subMenu create.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   340
        subMenu saveUnder:true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   341
        subMenu raise show
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   342
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   343
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   344
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   345
!PullDownMenu methodsFor:'events'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   346
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   347
redraw
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   348
    |string
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   349
     x     "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   350
     y     "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   351
     index "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   352
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   353
    shown ifFalse: [ ^ self ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   354
    titles isNil ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   355
    x := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   356
    y := height "- 1".
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   357
    index := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   358
    titles do:[:title |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   359
        string := ' ' , title , ' '.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   360
        self drawTitle:string x:x selected:(index == activeMenuNumber).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   361
        x := x + (font widthOf:string).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   362
        showSeparatingLines ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   363
            self is3D ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   364
                self paint:shadowColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   365
                self displayLineFromX:x y:0 toX:x y:y.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   366
                x := x + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   367
                self paint:lightColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   368
                self displayLineFromX:x y:0 toX:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   369
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   370
                self paint:fgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   371
                self displayLineFromX:x y:0 toX:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   372
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   373
            x := x + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   374
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   375
        index := index + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   376
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   377
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   378
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   379
titleIndexForX:x
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   380
    "given a click x-position, return index in title or nil"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   381
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   382
    |string 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   383
     xstart "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   384
     xend   "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   385
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   386
    xstart := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   387
    1 to:(titles size) do:[:index |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   388
        string := ' ' , (titles at:index) , ' '.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   389
        xend := xstart + (font widthOf:string).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   390
        showSeparatingLines ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   391
            self is3D ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   392
                xend := xend + 2
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   393
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   394
                xend := xend + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   395
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   396
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   397
        (x between:xstart and:xend) ifTrue:[^ index].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   398
        xstart := xend
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   399
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   400
    ^ nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   401
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   402
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   403
buttonPress:button x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   404
    |titleIndex|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   405
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   406
    titleIndex := self titleIndexForX:x.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   407
    titleIndex notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   408
        self pullMenu:titleIndex
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   409
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   410
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   411
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   412
buttonMotion:button x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   413
    |titleIndex activeMenu activeLeft activeTop|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   414
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   415
    (y < height) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   416
        "moving around in title line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   417
        activeMenuNumber notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   418
            (menus at:activeMenuNumber) selection:nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   419
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   420
        titleIndex := self titleIndexForX:x.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   421
        titleIndex notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   422
            (titleIndex ~~ activeMenuNumber) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   423
                self hideActiveMenu.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   424
                self pullMenu:titleIndex
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   425
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   426
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   427
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   428
        "moving around below"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   429
        activeMenuNumber isNil ifTrue:[^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   430
        activeMenu := menus at:activeMenuNumber.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   431
        activeLeft := activeMenu left.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   432
        (x between:activeLeft and:(activeMenu right)) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   433
            activeTop := activeMenu top.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   434
            (y between:activeTop and:(activeMenu bottom)) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   435
                "moving around in menu"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   436
                activeMenu buttonMotion:button
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   437
                                      x:(x - activeLeft)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   438
                                      y:(y - activeTop).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   439
                ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   440
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   441
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   442
        "moved outside menu"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   443
        activeMenu selection:nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   444
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   445
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   446
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   447
buttonRelease:button x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   448
    |activeMenu activeLeft activeTop|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   449
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   450
    (y >= height) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   451
        "release below title-line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   452
        activeMenuNumber isNil ifTrue:[^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   453
        activeMenu := menus at:activeMenuNumber.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   454
        activeLeft := activeMenu left.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   455
        (x between:activeLeft and:(activeMenu right)) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   456
            activeTop := activeMenu top.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   457
            (y between:activeTop and:(activeMenu bottom)) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   458
                "release in menu"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   459
                self hideActiveMenu.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   460
                activeMenu buttonRelease:button
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   461
                                       x:(x - activeLeft)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   462
                                       y:(y - activeTop).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   463
                ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   464
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   465
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   466
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   467
    self hideActiveMenu
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   468
! !