ColorMenu.st
changeset 3322 1a51da8de402
parent 3304 f589791dd24c
child 3323 b4aef3ba5d24
--- 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 $'
 ! !