PullDownMenu.st
changeset 59 450ce95a72a4
parent 38 4b9b70b2cc87
child 60 f3c738c24ce6
--- a/PullDownMenu.st	Tue Aug 30 00:54:47 1994 +0200
+++ b/PullDownMenu.st	Mon Oct 10 04:03:47 1994 +0100
@@ -1,6 +1,6 @@
 "
  COPYRIGHT (c) 1989 by Claus Gittinger
-              All Rights Reserved
+	      All Rights Reserved
 
  This software is furnished under a license and may be used
  only in accordance with the terms of that license and with the
@@ -12,20 +12,27 @@
 
 View subclass:#PullDownMenu
        instanceVariableNames:'menus titles activeMenuNumber
-                              showSeparatingLines topMargin
-                              fgColor bgColor activeFgColor activeBgColor
-                              onLevel offLevel
-                              keepMenu'
-       classVariableNames:''
+			      showSeparatingLines topMargin
+			      fgColor bgColor activeFgColor activeBgColor
+			      onLevel offLevel
+			      keepMenu'
+       classVariableNames:'DefaultFont
+			   DefaultViewBackground 
+			   DefaultForegroundColor 
+			   DefaultBackgroundColor
+			   DefaultHilightForegroundColor 
+			   DefaultHilightBackgroundColor
+			   DefaultLevel DefaultHilightLevel
+			   DefaultShadowColor DefaultLightColor'
        poolDictionaries:''
        category:'Views-Menus'
 !
 
 PullDownMenu comment:'
 COPYRIGHT (c) 1989 by Claus Gittinger
-             All Rights Reserved
+	     All Rights Reserved
 
-$Header: /cvs/stx/stx/libwidg/PullDownMenu.st,v 1.5 1994-08-07 13:23:11 claus Exp $
+$Header: /cvs/stx/stx/libwidg/PullDownMenu.st,v 1.6 1994-10-10 03:02:41 claus Exp $
 '!
 
 !PullDownMenu class methodsFor:'documentation'!
@@ -33,7 +40,7 @@
 copyright
 "
  COPYRIGHT (c) 1989 by Claus Gittinger
-              All Rights Reserved
+	      All Rights Reserved
 
  This software is furnished under a license and may be used
  only in accordance with the terms of that license and with the
@@ -46,7 +53,7 @@
 
 version
 "
-$Header: /cvs/stx/stx/libwidg/PullDownMenu.st,v 1.5 1994-08-07 13:23:11 claus Exp $
+$Header: /cvs/stx/stx/libwidg/PullDownMenu.st,v 1.6 1994-10-10 03:02:41 claus Exp $
 "
 !
 
@@ -70,10 +77,45 @@
     onLevel                 <Integer>       level of entry-buttons when pressed
     offLevel                <Integer>       level of entry-buttons when released
     keepmenu                <Boolean>       if on, pulled menu stays on click,
-                                            till clicked again (motif & windows behavior)
+					    till clicked again (motif & windows behavior)
 "
 ! !
 
+!PullDownMenu class methodsFor:'defaults'!
+
+updateStyleCache
+    DefaultViewBackground := StyleSheet at:'pullDownMenuViewBackground'.
+    DefaultForegroundColor := StyleSheet at:'pullDownMenuForegroundColor' default:Black.
+    DefaultBackgroundColor := StyleSheet at:'pullDownMenuBackgroundColor'.
+    DefaultHilightForegroundColor := StyleSheet at:'pullDownMenuHilightForegroundColor'.
+    DefaultHilightBackgroundColor := StyleSheet at:'pullDownMenuHilightBackgroundColor'.
+    DefaultHilightLevel := StyleSheet at:'pullDownMenuHilightLevel' default:-1.
+    DefaultLevel := StyleSheet at:'pullDownMenuLevel' default:1.
+    DefaultFont := StyleSheet at:'pullDownMenuFont'.
+
+    DefaultForegroundColor notNil ifTrue:[
+	DefaultForegroundColor := DefaultForegroundColor on:Display
+    ].
+    DefaultBackgroundColor notNil ifTrue:[
+	DefaultBackgroundColor := DefaultBackgroundColor on:Display
+    ].
+    DefaultShadowColor notNil ifTrue:[
+	DefaultShadowColor := DefaultShadowColor on:Display
+    ].
+    DefaultLightColor notNil ifTrue:[
+	DefaultLightColor := DefaultLightColor on:Display
+    ].
+    DefaultHilightForegroundColor notNil ifTrue:[
+	DefaultHilightForegroundColor := DefaultHilightForegroundColor on:Display
+    ].
+    DefaultHilightBackgroundColor notNil ifTrue:[
+	DefaultHilightBackgroundColor := DefaultHilightBackgroundColor on:Display
+    ].
+    DefaultFont notNil ifTrue:[
+	DefaultFont := DefaultFont on:Display
+    ].
+! !
+
 !PullDownMenu class methodsFor:'instance creation'!
 
 labels:titleArray
@@ -89,43 +131,74 @@
 
     font := font on:device.
     self origin:(0.0 @ 0.0)
-         extent:(1.0 @ (font height + (font descent * 2)  + topMargin)).
+	 extent:(1.0 @ (font height + (font descent * 2)  + topMargin)).
 !
 
 initStyle
     super initStyle.
 
     showSeparatingLines := false.
-    fgColor := Black.
-    bgColor := viewBackground.
-    onLevel := -1.
-    offLevel := 1.
+    DefaultViewBackground notNil ifTrue:[
+	viewBackground := DefaultViewBackground
+    ].
+
+    DefaultForegroundColor notNil ifTrue:[
+	fgColor := DefaultForegroundColor
+    ] ifFalse:[
+	fgColor := Black.
+    ].
+    DefaultBackgroundColor notNil ifTrue:[
+	bgColor := DefaultBackgroundColor
+    ] ifFalse:[
+	bgColor := viewBackground.
+    ].
+    onLevel := DefaultHilightLevel.
+    offLevel := DefaultLevel.
 
     self is3D ifTrue:[
-        device hasColors ifTrue:[
-            activeFgColor := Color name:'yellow'
-        ] ifFalse:[
-            activeFgColor := White
-        ].
-        device hasGreyscales ifTrue:[
-            activeBgColor := bgColor.
-        ] ifFalse:[
-            activeBgColor := fgColor.
-        ].
-        topMargin := 2.
+	device hasColors ifTrue:[
+	    activeFgColor := Color name:'yellow'
+	] ifFalse:[
+	    activeFgColor := White
+	].
+	device hasGreyscales ifTrue:[
+	    activeBgColor := bgColor.
+	] ifFalse:[
+	    activeBgColor := fgColor.
+	].
+	topMargin := 2.
 
-        ((style == #iris) or:[style == #motif]) ifTrue:[
-            self level:2.
-            softEdge := true.
-            onLevel := 2.
-            offLevel := 0.
-            activeFgColor := fgColor
-        ]
+	((style == #iris) or:[style == #motif]) ifTrue:[
+	    self level:2.
+	    softEdge := true.
+	    onLevel := 2.
+	    offLevel := 0.
+	    activeFgColor := fgColor
+	]
     ] ifFalse:[
-        activeFgColor := bgColor.
-        activeBgColor := fgColor.
-        topMargin := 0
+	activeFgColor := bgColor.
+	activeBgColor := fgColor.
+	topMargin := 0
+    ].
+
+    DefaultHilightForegroundColor notNil ifTrue:[
+	activeFgColor := DefaultHilightForegroundColor
+    ].
+    DefaultHilightBackgroundColor notNil ifTrue:[
+	activeBgColor := DefaultHilightBackgroundColor
     ].
+    DefaultShadowColor notNil ifTrue:[
+	shadowColor := DefaultShadowColor on:device
+    ].
+    DefaultLightColor notNil ifTrue:[
+	lightColor := DefaultLightColor on:device
+    ].
+
+    bgColor := bgColor on:device.
+    fgColor := fgColor on:device.
+    activeBgColor := activeBgColor on:device.
+    activeFgColor := activeFgColor on:device.
+
     keepMenu := (style == #motif) or:[(style == #iris) or:[style == #mswindows]].
 !
 
@@ -151,7 +224,7 @@
 
     showSeparatingLines := aBoolean.
     shown ifTrue:[
-        self redraw
+	self redraw
     ]
 !
 
@@ -171,11 +244,11 @@
     menus := Array new:numberOfLabels.
     titles := Array new:numberOfLabels.
     1 to:numberOfLabels do:[:index |
-        titles at:index put:(titleArray at:index) printString
+	titles at:index put:(titleArray at:index) printString
     ].
     shown ifTrue:[
-        self clear.
-        self redraw
+	self clear.
+	self redraw
     ]
 !
 
@@ -211,8 +284,8 @@
     index := self indexOf:aString.
     (index == 0) ifTrue:[^ nil].
     aMenu origin:((left + (self titleLenUpTo:index)) 
-                  @
-                  (height + aMenu borderWidth)).
+		  @
+		  (height + aMenu borderWidth)).
     aMenu hidden:true.
     menus at:index put:aMenu
 !
@@ -223,10 +296,10 @@
     |menuView|
 
     menuView := MenuView labels:labels
-                      selectors:selectors
-                           args:args
-                       receiver:anObject
-                            for:self.
+		      selectors:selectors
+			   args:args
+		       receiver:anObject
+			    for:self.
     self at:aString putMenu:menuView
 !
 
@@ -236,10 +309,10 @@
     |menuView|
 
     menuView := MenuView labels:labels
-                       selector:selector
-                           args:args
-                       receiver:anObject
-                            for:self.
+		       selector:selector
+			   args:args
+		       receiver:anObject
+			    for:self.
     self at:aString putMenu:menuView
 !
 
@@ -249,9 +322,9 @@
     |menuView|
 
     menuView := MenuView labels:labels
-                      selectors:selectors
-                       receiver:anObject
-                            for:self.
+		      selectors:selectors
+		       receiver:anObject
+			    for:self.
     self at:aString putMenu:menuView
 ! !
 
@@ -265,14 +338,14 @@
     (index <= 1) ifTrue:[^ 0].
     len := 0.
     titles from:1 to:(index - 1) do:[:string |
-        len := len + (font widthOf:(' ' , string , ' ')).
-        showSeparatingLines ifTrue:[
-            self is3D ifTrue:[
-                len := len + 2
-            ] ifFalse:[
-                len := len + 1
-            ]
-        ]
+	len := len + (font widthOf:(' ' , string , ' ')).
+	showSeparatingLines ifTrue:[
+	    self is3D ifTrue:[
+		len := len + 2
+	    ] ifFalse:[
+		len := len + 1
+	    ]
+	]
     ].
     ^ len
 !
@@ -281,7 +354,7 @@
     "return the index of the menu with title; return 0 if not found"
 
     (stringOrNumber isMemberOf:SmallInteger) ifTrue:[
-        ^ stringOrNumber
+	^ stringOrNumber
     ].
     ^ titles indexOf:stringOrNumber
 !
@@ -292,15 +365,15 @@
     |index|
 
     (font device == device) ifTrue:[
-        index := 1.
-        menus do:[:aMenu |
-            aMenu notNil ifTrue:[
-                aMenu origin:((left + (self titleLenUpTo:index)) 
-                              @
-                              (height + aMenu borderWidth))
-            ].
-            index := index + 1
-        ]
+	index := 1.
+	menus do:[:aMenu |
+	    aMenu notNil ifTrue:[
+		aMenu origin:((left + (self titleLenUpTo:index)) 
+			      @
+			      (height + aMenu borderWidth))
+	    ].
+	    index := index + 1
+	]
     ]
 ! !
 
@@ -312,22 +385,22 @@
     yText := ((height - (font height)) // 2) + (font ascent) "+ topMargin".
     w := font widthOf:string.
     selected ifTrue:[
-        self paint:activeBgColor
+	self paint:activeBgColor
     ] ifFalse:[
-        self paint:bgColor
+	self paint:bgColor
     ].
     self fillRectangleX:x y:0 width:w height:height.
 
     self is3D ifTrue:[
-        self drawEdgesForX:x y:0
-                     width:w
-                    height:height
-                     level:(selected ifTrue:[onLevel] ifFalse:[offLevel])
+	self drawEdgesForX:x y:0
+		     width:w
+		    height:height
+		     level:(selected ifTrue:[onLevel] ifFalse:[offLevel])
     ].
     selected ifTrue:[
-        self paint:activeFgColor
+	self paint:activeFgColor
     ] ifFalse:[
-        self paint:fgColor
+	self paint:fgColor
     ].
     self displayString:string x:x y:yText
 !
@@ -335,27 +408,27 @@
 highlightActiveTitle
     |x string|
     activeMenuNumber notNil ifTrue:[
-        x := self titleLenUpTo:activeMenuNumber.
-        string := ' ' , (titles at:activeMenuNumber) , ' '.
-        self drawTitle:string x:x selected:true
+	x := self titleLenUpTo:activeMenuNumber.
+	string := ' ' , (titles at:activeMenuNumber) , ' '.
+	self drawTitle:string x:x selected:true
     ]
 !
 
 unHighlightActiveTitle
     |x string|
     activeMenuNumber notNil ifTrue:[
-        x := self titleLenUpTo:activeMenuNumber.
-        string := ' ' , (titles at:activeMenuNumber) , ' '.
-        self drawTitle:string x:x selected:false
+	x := self titleLenUpTo:activeMenuNumber.
+	string := ' ' , (titles at:activeMenuNumber) , ' '.
+	self drawTitle:string x:x selected:false
     ]
 !
 
 hideActiveMenuRelease:aBoolean
     activeMenuNumber notNil ifTrue:[
-        (menus at:activeMenuNumber) unrealize.
-        self unHighlightActiveTitle.
-        aBoolean ifTrue:[device ungrabPointer. self cursor:Cursor normal].
-        activeMenuNumber := nil
+	(menus at:activeMenuNumber) unrealize.
+	self unHighlightActiveTitle.
+	aBoolean ifTrue:[device ungrabPointer. self cursor:Cursor normal].
+	activeMenuNumber := nil
     ]
 !
 
@@ -371,12 +444,12 @@
     activeMenuNumber notNil ifTrue:[self hideActiveMenuRelease:false].
     subMenu := menus at:aNumber.
     subMenu notNil ifTrue:[
-        activeMenuNumber := aNumber.
-        self highlightActiveTitle.
-        subMenu deselect.
-        subMenu create.
-        subMenu saveUnder:true.
-        subMenu raise show
+	activeMenuNumber := aNumber.
+	self highlightActiveTitle.
+	subMenu deselect.
+	subMenu create.
+	subMenu saveUnder:true.
+	subMenu raise show
     ]
 ! !
 
@@ -394,23 +467,23 @@
     y := height "- 1".
     index := 0.
     titles do:[:title |
-        string := ' ' , title , ' '.
-        self drawTitle:string x:x selected:(index == activeMenuNumber).
-        x := x + (font widthOf:string).
-        showSeparatingLines ifTrue:[
-            self is3D ifTrue:[
-                self paint:shadowColor.
-                self displayLineFromX:x y:0 toX:x y:y.
-                x := x + 1.
-                self paint:lightColor.
-                self displayLineFromX:x y:0 toX:x y:y
-            ] ifFalse:[
-                self paint:fgColor.
-                self displayLineFromX:x y:0 toX:x y:y
-            ].
-            x := x + 1
-        ].
-        index := index + 1
+	string := ' ' , title , ' '.
+	self drawTitle:string x:x selected:(index == activeMenuNumber).
+	x := x + (font widthOf:string).
+	showSeparatingLines ifTrue:[
+	    self is3D ifTrue:[
+		self paint:shadowColor.
+		self displayLineFromX:x y:0 toX:x y:y.
+		x := x + 1.
+		self paint:lightColor.
+		self displayLineFromX:x y:0 toX:x y:y
+	    ] ifFalse:[
+		self paint:fgColor.
+		self displayLineFromX:x y:0 toX:x y:y
+	    ].
+	    x := x + 1
+	].
+	index := index + 1
     ]
 !
 
@@ -423,17 +496,17 @@
 
     xstart := 0.
     1 to:(titles size) do:[:index |
-        string := ' ' , (titles at:index) , ' '.
-        xend := xstart + (font widthOf:string).
-        showSeparatingLines ifTrue:[
-            self is3D ifTrue:[
-                xend := xend + 2
-            ] ifFalse:[
-                xend := xend + 1
-            ]
-        ].
-        (x between:xstart and:xend) ifTrue:[^ index].
-        xstart := xend
+	string := ' ' , (titles at:index) , ' '.
+	xend := xstart + (font widthOf:string).
+	showSeparatingLines ifTrue:[
+	    self is3D ifTrue:[
+		xend := xend + 2
+	    ] ifFalse:[
+		xend := xend + 1
+	    ]
+	].
+	(x between:xstart and:xend) ifTrue:[^ index].
+	xstart := xend
     ].
     ^ nil
 !
@@ -442,40 +515,40 @@
     |titleIndex activeMenu activeLeft activeTop|
 
     (y between:0 and:height) ifTrue:[
-        titleIndex := self titleIndexForX:x.
+	titleIndex := self titleIndexForX:x.
     ].
 
     "
      now, titleIndex is non-nil if pressed within myself
     "
     (titleIndex notNil and:[titleIndex ~~ activeMenuNumber]) ifTrue:[
-        self pullMenu:titleIndex.
-        keepMenu ifTrue:[
-            device grabPointerIn:self id.
-            self cursor:Cursor upRightArrow
-        ]
+	self pullMenu:titleIndex.
+	keepMenu ifTrue:[
+	    device grabPointerIn:self id.
+	    self cursor:Cursor upRightArrow
+	]
     ] ifFalse:[
-        keepMenu ifTrue:[
-            titleIndex == activeMenuNumber ifTrue:[
-                "same pressed again ... stay"
-                ^ self
-            ].
-            "moving around below"
-            activeMenuNumber isNil ifTrue:[^self].
-            activeMenu := menus at:activeMenuNumber.
-            activeLeft := activeMenu left.
-            (x between:activeLeft and:(activeMenu right)) ifTrue:[
-                activeTop := activeMenu top.
-                (y between:activeTop and:(activeMenu bottom)) ifTrue:[
-                    "moving around in menu"
-                    activeMenu buttonPress:button
-                                         x:(x - activeLeft)
-                                         y:(y - activeTop).
-                    ^ self
-                ]
-            ].
-        ].
-        self hideActiveMenu
+	keepMenu ifTrue:[
+	    titleIndex == activeMenuNumber ifTrue:[
+		"same pressed again ... stay"
+		^ self
+	    ].
+	    "moving around below"
+	    activeMenuNumber isNil ifTrue:[^self].
+	    activeMenu := menus at:activeMenuNumber.
+	    activeLeft := activeMenu left.
+	    (x between:activeLeft and:(activeMenu right)) ifTrue:[
+		activeTop := activeMenu top.
+		(y between:activeTop and:(activeMenu bottom)) ifTrue:[
+		    "moving around in menu"
+		    activeMenu buttonPress:button
+					 x:(x - activeLeft)
+					 y:(y - activeTop).
+		    ^ self
+		]
+	    ].
+	].
+	self hideActiveMenu
     ]
 !
 
@@ -483,33 +556,33 @@
     |titleIndex activeMenu activeLeft activeTop|
 
     (y < height) ifTrue:[
-        "moving around in title line"
-        activeMenuNumber notNil ifTrue:[
-            (menus at:activeMenuNumber) selection:nil
-        ].
-        titleIndex := self titleIndexForX:x.
-        titleIndex notNil ifTrue:[
-            (titleIndex ~~ activeMenuNumber) ifTrue:[
-                self pullMenu:titleIndex
-            ]
-        ]
+	"moving around in title line"
+	activeMenuNumber notNil ifTrue:[
+	    (menus at:activeMenuNumber) selection:nil
+	].
+	titleIndex := self titleIndexForX:x.
+	titleIndex notNil ifTrue:[
+	    (titleIndex ~~ activeMenuNumber) ifTrue:[
+		self pullMenu:titleIndex
+	    ]
+	]
     ] ifFalse:[
-        "moving around below"
-        activeMenuNumber isNil ifTrue:[^self].
-        activeMenu := menus at:activeMenuNumber.
-        activeLeft := activeMenu left.
-        (x between:activeLeft and:(activeMenu right)) ifTrue:[
-            activeTop := activeMenu top.
-            (y between:activeTop and:(activeMenu bottom)) ifTrue:[
-                "moving around in menu"
-                activeMenu buttonMotion:button
-                                      x:(x - activeLeft)
-                                      y:(y - activeTop).
-                ^ self
-            ]
-        ].
-        "moved outside menu"
-        activeMenu selection:nil
+	"moving around below"
+	activeMenuNumber isNil ifTrue:[^self].
+	activeMenu := menus at:activeMenuNumber.
+	activeLeft := activeMenu left.
+	(x between:activeLeft and:(activeMenu right)) ifTrue:[
+	    activeTop := activeMenu top.
+	    (y between:activeTop and:(activeMenu bottom)) ifTrue:[
+		"moving around in menu"
+		activeMenu buttonMotion:button
+				      x:(x - activeLeft)
+				      y:(y - activeTop).
+		^ self
+	    ]
+	].
+	"moved outside menu"
+	activeMenu selection:nil
     ]
 !
 
@@ -518,33 +591,33 @@
 
     hideMenu := false.
     (y >= height) ifTrue:[
-        "release below title-line"
-        activeMenuNumber isNil ifTrue:[^self].
-        activeMenu := menus at:activeMenuNumber.
-        activeLeft := activeMenu left.
-        "
-         released in a submenu ?
-        "
-        (x between:activeLeft and:(activeMenu right)) ifTrue:[
-            activeTop := activeMenu top.
-            (y between:activeTop and:(activeMenu bottom)) ifTrue:[
-                "release in menu"
-                self hideActiveMenu.   
-                activeMenu buttonRelease:button
-                                       x:(x - activeLeft)
-                                       y:(y - activeTop).
-                ^ self
-            ]
-        ].
-        hideMenu := true.
+	"release below title-line"
+	activeMenuNumber isNil ifTrue:[^self].
+	activeMenu := menus at:activeMenuNumber.
+	activeLeft := activeMenu left.
+	"
+	 released in a submenu ?
+	"
+	(x between:activeLeft and:(activeMenu right)) ifTrue:[
+	    activeTop := activeMenu top.
+	    (y between:activeTop and:(activeMenu bottom)) ifTrue:[
+		"release in menu"
+		self hideActiveMenu.   
+		activeMenu buttonRelease:button
+				       x:(x - activeLeft)
+				       y:(y - activeTop).
+		^ self
+	    ]
+	].
+	hideMenu := true.
     ] ifFalse:[
-        y < 0 ifTrue:[
-            hideMenu := true
-        ] ifFalse:[
-            keepMenu ifFalse:[   
-                hideMenu := true
-            ]
-        ]
+	y < 0 ifTrue:[
+	    hideMenu := true
+	] ifFalse:[
+	    keepMenu ifFalse:[   
+		hideMenu := true
+	    ]
+	]
     ].                  
     hideMenu ifTrue:[
        self hideActiveMenu.