diff -r 2f495adadca5 -r 1a51da8de402 ColorMenu.st --- 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 $' ! !