"
COPYRIGHT (c) 1995 by eXept Software AG
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
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
"{ Package: 'stx:libwidg2' }"
MenuPanel subclass:#ColorMenu
instanceVariableNames:'enabledChannel labelsAreColored'
classVariableNames:'ColorMenuSpec'
poolDictionaries:''
category:'Interface-UIPainter'
!
!ColorMenu class methodsFor:'documentation'!
copyright
"
COPYRIGHT (c) 1995 by eXept Software AG
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
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
!
documentation
"
A simple ColorMenu used by the UIPainter
[see also:]
UIPainter
ColorMenuSpec
[author:]
Claus Atzkern
"
!
examples
"
very simple example
[exBegin]
|tool top channel|
top := StandardSystemView new.
top extent:250@30.
channel := (Color red) asValue.
tool := self origin:0.0@0.0 corner:1.0@1.0 in:top.
tool model:channel.
top open.
[exEnd]
"
! !
!ColorMenu class methodsFor:'adding & removing'!
addUserDefinedColor:aColor named:aName
|menu item label submenu|
"
ColorMenuSpec := nil.
self addUserDefinedColor:Color red lightened named:'UBS red'.
self addUserDefinedColor:Color lightBlue lightened named:'UBS blue'.
"
menu := self colorMenu.
item := menu detectItem:[:el| (el nameKey == #userDefined and:[el submenu notNil]) ]
ifNone:nil.
item isNil ifTrue:[
item := MenuItem labeled:(SystemBrowser packageIcon).
item nameKey:#userDefined.
item submenu:(submenu := Menu new).
menu addItem:item beforeIndex:1.
item := MenuItem new.
item nameKey:#userDefined.
menu addItem:item beforeIndex:1.
] ifFalse:[
submenu := item submenu.
item := submenu detectItem:[:el| el argument = aColor ] ifNone:nil.
item notNil ifTrue:[ ^ self ]. "/ already exists
].
label := ' %1 ' bindWith:(aName ? ' ').
label := Text string:label emphasis:#backgroundColor->aColor.
item := MenuItem labeled:label.
item argument:aColor.
submenu addItem:item.
!
removeUserDefinedColor:aColor
|menu menuitem submenu subitem|
"
ColorMenuSpec := nil.
self removeUserDefinedColor:Color lightBlue lightened
self removeUserDefinedColor:Color red lightened
self addUserDefinedColor:Color lightBlue lightened named:'UBS lightBlue'
self addUserDefinedColor:Color red lightened named:'UBS red'
"
menu := self colorMenu.
menuitem := menu detectItem:[:el| (el nameKey == #userDefined and:[el submenu notNil]) ]
ifNone:nil.
menuitem isNil ifTrue:[ ^ self ].
submenu := menuitem submenu.
subitem := submenu detectItem:[:el| el argument = aColor] ifNone:nil.
subitem notNil ifTrue:[
submenu removeItem:subitem.
].
submenu items size > 0 ifTrue:[^ self].
[menuitem notNil] whileTrue:[
"/ remove submenu and separators
menu removeItem:menuitem.
menuitem := menu detectItem:[:el| el nameKey == #userDefined ] ifNone:nil.
].
! !
!ColorMenu class methodsFor:'menu spec'!
colorMenu
|menuItem subItem baseColor color label getColSel submenu colorId|
"
ColorMenuSpec := nil.
self colorMenu
"
ColorMenuSpec notNil ifTrue:[ ^ ColorMenuSpec ].
ColorMenuSpec := Menu new.
self colorMenuSpec do:[:aSlice|
ColorMenuSpec addItem:(menuItem := MenuItem new).
aSlice notNil ifTrue:[
colorId := aSlice at:1.
getColSel := aSlice at:2.
baseColor := Color perform:colorId.
menuItem label:(Text string:' ' emphasis:(#backgroundColor->baseColor)).
menuItem submenu:(submenu := Menu new).
aSlice last do:[:el|
color := label := nil.
el isSymbol ifTrue:[
el == #lightened ifTrue:[ color := baseColor perform:el ]
ifFalse:[ color := Color perform:el ].
colorId == #gray ifTrue:[ label := el ].
] ifFalse:[
el isNumber ifTrue:[
color := Color perform:getColSel with:el.
].
].
color notNil ifTrue:[
label isNil ifTrue:[
label := getColSel, ' ', el printString.
].
subItem := MenuItem label:label.
subItem argument:color.
submenu addItem:subItem.
].
]
].
].
^ ColorMenuSpec
!
colorMenu:labelAreColored value:aValue
"returns a color menu
"
|style menu menuItem subItem|
menu := Menu new.
labelAreColored == false ifTrue:[ style := #backgroundColor ]
ifFalse:[ style := #color ].
self colorMenu itemsDo:[:anItem| |submenu|
menuItem := MenuItem label:(anItem rawLabel ? '').
menu addItem:menuItem.
anItem hasSubmenu ifTrue:[
menuItem isButton:true.
menuItem submenu:(submenu := Menu new).
anItem submenu itemsDo:[:el| | label color emphasis|
label := el rawLabel ? ' '.
color := el argument.
label isText ifFalse:[
emphasis := style->color.
style == #backgroundColor ifTrue:[
color brightness < 0.5 ifTrue:[
emphasis := Array with:emphasis with:(#color->Color white)
]
].
label := Text string:('Color ', label) emphasis:emphasis.
].
subItem := MenuItem label:label value:aValue.
subItem argument:color.
submenu addItem:subItem.
]].
].
^ menu
"
(ColorMenu colorMenu:true value:nil) startUp
(ColorMenu colorMenu:false value:#aSelector:) startUp
"
!
colorMenuSpec
"color definitions used to build a color menu
"
"
ColorMenuSpec := nil.
"
^ #(
nil "/ separator
#( gray
gray:
#( white
veryLightGray
lightGray
gray
darkGray
veryDarkGray
black
)
)
nil "/ separator
#( red
red:
#( lightened 100 87 67 50 33)
)
#( green
green:
#( lightened 100 87 67 50 33)
)
#( blue
blue:
#( lightened 100 87 67 50 33)
)
nil "/ separator
#( cyan
cyan:
#( lightened 100 87 67 50 33)
)
#( magenta
magenta:
#( lightened 100 87 67 50 33)
)
#( yellow
yellow:
#( lightened 100 87 67 50 33)
)
)
! !
!ColorMenu methodsFor:'accepting'!
accept:anItem
"accept current selected item"
|item holder color|
((item := super accept:anItem) notNil and: [item nameKey ~~ #def])
ifTrue:
[
(holder := self colorHolder) == item ifTrue:
[
enabledChannel value ifTrue:[color := self color]
]
ifFalse:
[
color := item argument.
holder label:(Text string:' ' emphasis:(#backgroundColor->color)).
].
model notNil ifTrue:[model value:color]
]
! !
!ColorMenu methodsFor:'accessing'!
color
"get current color"
|firstEmphasis|
(firstEmphasis := (self colorHolder label emphasis at:1)) isAssociation ifTrue: [^firstEmphasis value].
^(firstEmphasis at: 1) value
!
color:aColor
"set current color"
|holder label|
aColor isColor ifFalse:[
enabledChannel value:false
] ifTrue:[
self
disabledRedrawDo:
[
holder := self colorHolder.
label := Text string: ' ' emphasis:(#backgroundColor->aColor).
enabledChannel value:true.
holder label:label.
model value: aColor
]
]
!
labelsAreColored: aBoolean
"sets whether labels or their backgrounds will be colored"
|bool|
bool := aBoolean ? false.
labelsAreColored ~~ bool ifTrue:[
labelsAreColored := bool.
self setupMenu
].
! !
!ColorMenu methodsFor:'accessing-channels'!
model:aValueHolder
"set my color channel"
super model:aValueHolder.
model notNil ifTrue:[
self updateFromModel
]
! !
!ColorMenu methodsFor:'change & update'!
updateFromModel
self color:(model value)
! !
!ColorMenu methodsFor:'initialization'!
destroy
"release color channel dependency"
self model:nil.
super destroy
!
initialize
"setup menu"
super initialize.
labelsAreColored := false.
verticalLayout := false.
self fitFirstPanel:false.
enabledChannel := ValueHolder with:false.
self setupMenu.
"Modified: / 21.5.1998 / 03:07:26 / cg"
!
setupMenu
"setup menu"
|menu item|
menu := self class colorMenu:labelsAreColored value:nil.
menu
addItem:(
(MenuItem labeled:'...')
value:
[
|defineColor|
defineColor := ColorEditDialog new color: self color.
defineColor open.
defineColor accept value ifTrue: [self color: defineColor color]
];
nameKey:#def;
isButton: true).
item := MenuItem labeled:(Text string:' ' emphasis:(#backgroundColor->DefaultViewBackgroundColor)).
item value:#selection.
menu addItem:item beforeIndex:1.
self menu:menu.
self do:[:anItem|
(anItem submenu) notNil ifTrue:[
anItem enabled:enabledChannel.
] ifFalse:[
anItem value == #selection ifTrue:[anItem indication:enabledChannel]
ifFalse:[anItem enabled:false].
anItem nameKey == #def ifTrue:[anItem enabled:enabledChannel]
]
]
! !
!ColorMenu methodsFor:'private'!
colorHolder
"returns the item which keeps the selected color in its label
"
^ self itemAt:#selection
! !
!ColorMenu class methodsFor:'documentation'!
version
^ '$Header: /cvs/stx/stx/libwidg2/ColorMenu.st,v 1.36 2007-11-27 10:54:24 ca Exp $'
! !