--- a/ColorMenu.st Sun Jan 27 16:59:07 2008 +0100
+++ b/ColorMenu.st Sun Jan 27 17:08:51 2008 +0100
@@ -13,7 +13,7 @@
MenuPanel subclass:#ColorMenu
instanceVariableNames:'enabledChannel labelsAreColored'
- classVariableNames:'ColorMenuSpec'
+ classVariableNames:'ColorMenuSpec RecentlyUsedColors'
poolDictionaries:''
category:'Interface-UIPainter'
!
@@ -67,9 +67,33 @@
"
! !
-!ColorMenu class methodsFor:'adding & removing'!
+!ColorMenu class methodsFor:'instance creation'!
+
+colorMenu:labelAreColored value:aValue
+ "returns a color menu
+ "
+ |menu|
+
+ menu := Menu new.
+
+ self colorMenu itemsDo:[:el|
+ menu addItem:(self resolveMenuItem:el value:aValue labelAreColored:labelAreColored).
+ ].
+ ^ menu
+
+ "
+ (ColorMenu colorMenu:true value:nil) startUp
+ (ColorMenu colorMenu:false value:#aSelector:) startUp
+ "
+! !
+
+!ColorMenu class methodsFor:'adding & removing user defined items'!
addUserDefinedColors:aColors labels:labelsOrNil title:aTitle
+ "add user colors to ALL colormenus"
+
+ "cg: I think this is a bad hack, as it is too global."
+
|size submenu item label fgColor bgColor labels defLabel|
submenu := self userDefinedSubmenu.
@@ -147,26 +171,83 @@
!
removeAllUserDefinedColors
+ "flush user defined colors"
+
ColorMenuSpec := nil.
+!
+
+userDefinedSubmenu
+ "answer the menu entry under which the userdefined color entries are placed"
+
+ |menu submenu item icon|
+
+ menu := self colorMenu.
+ item := menu detectItem:[:el| (el nameKey == #userDefined and:[el submenu notNil]) ]
+ ifNone:nil.
+
+ item isNil ifTrue:[
+ icon := XPToolbarIconLibrary changesBrowser24x24Icon.
+ item := MenuItem labeled:icon.
+ item nameKey:#userDefined.
+ item activeHelpKey:#userDefinedColors.
+ menu addItem:item beforeIndex:1.
+ ].
+
+ (submenu := item submenu) isNil ifTrue:[
+ submenu := Menu new.
+ item submenu:submenu.
+ ].
+ ^ submenu
! !
!ColorMenu class methodsFor:'menu spec'!
-colorMenu:labelAreColored value:aValue
- "returns a color menu
+colorMenuSpec
+ "color definitions used to build a color menu
"
- |menu|
-
- menu := Menu new.
+"
+ColorMenuSpec := nil.
+"
+ ^ #(
+ #( gray
+ gray:
+ #( white
+ veryLightGray
+ lightGray
+ gray
+ darkGray
+ veryDarkGray
+ black
+ )
+ )
+"/ nil "/ separator
+ #( red
+ red:
+ #( veryLight lightened 100 87 67 50 33)
+ )
+ #( green
+ green:
+ #( veryLight lightened 100 87 67 50 33)
+ )
+ #( blue
+ blue:
+ #( veryLight lightened 100 87 67 50 33)
+ )
+"/ nil "/ separator
+ #( cyan
+ cyan:
+ #( veryLight lightened 100 87 67 50 33)
+ )
+ #( magenta
+ magenta:
+ #( veryLight lightened 100 87 67 50 33)
+ )
+ #( yellow
+ yellow:
+ #( veryLight lightened 100 87 67 50 33)
+ )
- self colorMenu itemsDo:[:el|
- menu addItem:(self resolveMenuItem:el value:aValue labelAreColored:labelAreColored).
- ].
- ^ menu
-"
-(ColorMenu colorMenu:true value:nil) startUp
-(ColorMenu colorMenu:false value:#aSelector:) startUp
-"
+ )
! !
!ColorMenu class methodsFor:'private'!
@@ -194,9 +275,13 @@
color := label := nil.
el isSymbol ifTrue:[
- el == #lightened ifTrue:[ color := baseColor perform:el ]
- ifFalse:[ color := Color perform:el ].
-
+ el == #veryLight ifTrue:[
+ color := baseColor lightened lightened
+ ] ifFalse:[ el == #lightened ifTrue:[
+ color := baseColor perform:el
+ ] ifFalse:[
+ color := Color perform:el
+ ]].
colorId == #gray ifTrue:[ label := el ].
] ifFalse:[
el isNumber ifTrue:[
@@ -207,7 +292,7 @@
label isNil ifTrue:[
label := getColSel, ' ', el printString.
].
- subItem := MenuItem label:' Color ', label, ' '.
+ subItem := MenuItem label:' ',label,' '.
subItem argument:color.
submenu addItem:subItem.
].
@@ -217,54 +302,6 @@
^ ColorMenuSpec
!
-colorMenuSpec
- "color definitions used to build a color menu
- "
-"
-ColorMenuSpec := nil.
-"
- ^ #(
- #( 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)
- )
-
- )
-!
-
resolveMenuItem:aMenuItem value:aValue labelAreColored:labelAreColored
|menuItem label color fgColor submenu|
@@ -296,52 +333,41 @@
].
menuItem submenu:submenu.
^ menuItem
-!
-
-userDefinedSubmenu
- "answer the menu entry under which the userdefined color entries are placed"
-
- |menu submenu item icon|
-
- menu := self colorMenu.
- item := menu detectItem:[:el| (el nameKey == #userDefined and:[el submenu notNil]) ]
- ifNone:nil.
-
- item isNil ifTrue:[
- icon := XPToolbarIconLibrary changesBrowser24x24Icon.
- item := MenuItem labeled:icon.
- item nameKey:#userDefined.
- item activeHelpKey:#userDefinedColors.
- menu addItem:item beforeIndex:1.
- ].
-
- (submenu := item submenu) isNil ifTrue:[
- submenu := Menu new.
- item submenu:submenu.
- ].
- ^ submenu
! !
!ColorMenu methodsFor:'accepting'!
accept:anItem
- "accept current selected item"
+ "accept the current selected item"
|item holder color|
- ((item := super accept:anItem) notNil and: [item nameKey ~~ #def])
- ifTrue:
- [
- (holder := self colorHolder) == item ifTrue:
- [
+ ((item := super accept:anItem) notNil
+ and: [((item nameKey ? '') startsWith:'pseudo') not])
+ ifTrue:[
+ (holder := self colorHolder) == item ifTrue:[
enabledChannel value ifTrue:[color := self color]
- ]
- ifFalse:
- [
+ ] ifFalse:[
color := item argument.
holder label:(Text string:' ' emphasis:(#backgroundColor->color)).
].
- model notNil ifTrue:[model value:color]
+ self choseColor:color.
+ ]
+!
+
+choseColor:aColor
+ "accept the current selected item"
+
+ model notNil ifTrue:[
+ model value:aColor.
+ RecentlyUsedColors isNil ifTrue:[
+ RecentlyUsedColors := OrderedCollection new.
+ ].
+ RecentlyUsedColors remove:aColor ifAbsent:[].
+ RecentlyUsedColors addFirst:aColor.
+ RecentlyUsedColors size > 20 ifTrue:[
+ RecentlyUsedColors removeLast
+ ].
]
! !
@@ -370,7 +396,7 @@
label := Text string: ' ' emphasis:(#backgroundColor->aColor).
enabledChannel value:true.
holder label:label.
- model value: aColor
+ self choseColor:aColor
]
]
!
@@ -407,6 +433,30 @@
!ColorMenu methodsFor:'initialization'!
+colorHistorySubmenu
+ |menu|
+
+ RecentlyUsedColors isEmptyOrNil ifTrue:[^ nil].
+
+ menu := Menu new.
+
+ RecentlyUsedColors do:[:clr |
+ |label fgColor item|
+
+ clr brightness < 0.5 ifTrue:[ fgColor := Color white ]
+ ifFalse:[ fgColor := Color black ].
+
+ label := clr htmlPrintString.
+ label := Text string:(' ', label, ' ') foregroundColor:fgColor backgroundColor:clr.
+ item := MenuItem labeled:label.
+ item argument:clr.
+
+ menu addItem:item.
+ ].
+
+ ^ menu.
+!
+
destroy
"release color channel dependency"
@@ -416,10 +466,8 @@
!
initialize
- "setup menu"
-
super initialize.
- labelsAreColored := false.
+ labelsAreColored := true. "false."
verticalLayout := false.
self fitFirstPanel:false.
@@ -430,39 +478,48 @@
!
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;
+ (MenuItem labeled:nil)
+ labelImage:(ToolbarIconLibrary palette16x16Icon);
+ value:[ self openColorEditDialog ];
+ nameKey:#pseudoDef;
isButton: true).
- menu addItem:(MenuItem label:'') beforeIndex:1.
- item := MenuItem labeled:(Text string:' ' emphasis:(#backgroundColor->DefaultViewBackgroundColor)).
+ menu
+ addItem:(
+ (MenuItem labeled:nil)
+ labelImage:(ToolbarIconLibrary pipette16x16Icon);
+ value:[ self pickColorFromScreen ];
+ nameKey:#pseudoPick;
+ isButton: true).
+
+ menu
+ addItem:(
+ (MenuItem labeled:nil)
+ labelImage:(ToolbarIconLibrary colorHistory16x16Icon);
+ submenuChannel:[ self colorHistorySubmenu ];
+ nameKey:#seudoHhistory;
+ isButton: false)
+ beforeIndex:1.
+
+ "/ menu addItem:(MenuItem label:'') beforeIndex:1.
+
+ 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.
+ anItem value == #selection ifTrue:[
+ anItem indication:enabledChannel
] ifFalse:[
- anItem value == #selection ifTrue:[anItem indication:enabledChannel]
- ifFalse:[anItem enabled:false].
- anItem nameKey == #def ifTrue:[anItem enabled:enabledChannel]
+ anItem enabled:enabledChannel.
]
]
! !
@@ -473,10 +530,29 @@
"returns the item which keeps the selected color in its label
"
^ self itemAt:#selection
+!
+
+openColorEditDialog
+ |defineColorDialog|
+
+ defineColorDialog := ColorEditDialog new color: self color.
+ defineColorDialog open.
+ defineColorDialog accept value ifTrue: [
+ self color:defineColorDialog color
+ ]
+!
+
+pickColorFromScreen
+ |color|
+
+ color := Color fromUser.
+ color notNil ifTrue:[
+ self color:color.
+ ]
! !
!ColorMenu class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libwidg2/ColorMenu.st,v 1.41 2008-01-09 11:32:13 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libwidg2/ColorMenu.st,v 1.42 2008-01-27 16:08:51 cg Exp $'
! !