diff -r 36b4fcf69f1c -r 57c23d1beb53 ColorEditDialog.st --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ColorEditDialog.st Tue May 11 14:49:57 2004 +0200 @@ -0,0 +1,596 @@ +" + 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:libtool2' }" + +SimpleDialog subclass:#ColorEditDialog + instanceVariableNames:'red green blue hue light saturation colorNameHolder' + classVariableNames:'' + poolDictionaries:'' + category:'Interface-UIPainter' +! + +!ColorEditDialog 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 +" + An edit-dialog for colors. +" +! + +examples +" + [exBegin] + |editor color| + + editor := ColorEditor new. + editor color:(Color green). + editor open. + editor accepted ifTrue:[ + editor color inspect. + ] + [exEnd] +" +! ! + +!ColorEditDialog class methodsFor:'interface specs'! + +windowSpec + "This resource specification was automatically generated + by the UIPainter of ST/X." + + "Do not manually edit this!! If it is corrupted, + the UIPainter may not be able to read the specification." + + " + UIPainter new openOnClass:ColorEditor andSelector:#windowSpec + ColorEditor new openInterface:#windowSpec + ColorEditor open + " + + + + ^ + #(FullSpec + name: windowSpec + window: + (WindowSpec + label: 'Define Color' + name: 'Define Color' + min: (Point 340 260) + max: (Point nil 260) + bounds: (Rectangle 0 0 453 260) + ) + component: + (SpecCollection + collection: ( + (VerticalPanelViewSpec + name: 'RGBLabelPanel' + layout: (LayoutFrame 0 0 0 0 58 0 76 0) + horizontalLayout: fit + verticalLayout: spreadSpace + horizontalSpace: 3 + verticalSpace: 3 + component: + (SpecCollection + collection: ( + (LabelSpec + label: 'Red:' + name: 'RedLabel' + translateLabel: true + adjust: right + useDefaultExtent: true + ) + (LabelSpec + label: 'Green:' + name: 'GreenLabel' + translateLabel: true + adjust: right + useDefaultExtent: true + ) + (LabelSpec + label: 'Blue:' + name: 'BlueLabel' + translateLabel: true + adjust: right + useDefaultExtent: true + ) + ) + + ) + ) + (VerticalPanelViewSpec + name: 'RGBSliderPanel' + layout: (LayoutFrame 62 0 0 0 -166 1 76 0) + horizontalLayout: fit + verticalLayout: spreadSpace + horizontalSpace: 3 + verticalSpace: 3 + component: + (SpecCollection + collection: ( + (SliderSpec + name: 'RedSlider' + tabable: false + model: red + orientation: horizontal + stop: 255 + step: 1 + backgroundColor: (Color 100.0 0.0 0.0) + extent: (Point 225 16) + ) + (SliderSpec + name: 'GreenSlider' + tabable: false + model: green + orientation: horizontal + stop: 255 + step: 1 + backgroundColor: (Color 0.0 100.0 0.0) + extent: (Point 225 16) + ) + (SliderSpec + name: 'BlueSlider' + tabable: false + model: blue + orientation: horizontal + stop: 255 + step: 1 + backgroundColor: (Color 0.0 0.0 100.0) + extent: (Point 225 16) + ) + ) + + ) + ) + (VerticalPanelViewSpec + name: 'RGBFieldPanel' + layout: (LayoutFrame -161 1 0 0 -123 1 76 0) + horizontalLayout: fit + verticalLayout: spreadSpace + horizontalSpace: 3 + verticalSpace: 3 + component: + (SpecCollection + collection: ( + (InputFieldSpec + name: 'RedField' + model: red + type: numberInRange + numChars: 3 + minValue: 0 + maxValue: 255 + acceptOnPointerLeave: false + extent: (Point 38 20) + ) + (InputFieldSpec + name: 'GreenField' + model: green + type: numberInRange + numChars: 3 + minValue: 0 + maxValue: 255 + acceptOnPointerLeave: false + extent: (Point 38 20) + ) + (InputFieldSpec + name: 'BlueField' + model: blue + type: numberInRange + numChars: 3 + minValue: 0 + maxValue: 255 + acceptOnPointerLeave: false + extent: (Point 38 20) + ) + ) + + ) + ) + (VerticalPanelViewSpec + name: 'HLSLabelPanel' + layout: (LayoutFrame 0 0 86 0 58 0 163 0) + horizontalLayout: fit + verticalLayout: spreadSpace + horizontalSpace: 3 + verticalSpace: 3 + component: + (SpecCollection + collection: ( + (LabelSpec + label: 'Hue:' + name: 'Label1' + translateLabel: true + adjust: right + useDefaultExtent: true + ) + (LabelSpec + label: 'Light:' + name: 'Label2' + translateLabel: true + adjust: right + useDefaultExtent: true + ) + (LabelSpec + label: 'Sat:' + name: 'Label3' + translateLabel: true + adjust: right + useDefaultExtent: true + ) + ) + + ) + ) + (VerticalPanelViewSpec + name: 'HLSSliderPanel' + layout: (LayoutFrame 62 0 86 0 -166 1 163 0) + horizontalLayout: fit + verticalLayout: spreadSpace + horizontalSpace: 3 + verticalSpace: 3 + component: + (SpecCollection + collection: ( + (SliderSpec + name: 'Slider1' + tabable: false + model: hue + orientation: horizontal + stop: 359 + step: 1 + keyboardStep: 1 + extent: (Point 225 16) + ) + (SliderSpec + name: 'Slider2' + tabable: false + model: light + orientation: horizontal + step: 1 + backgroundColor: (Color 66.9993 66.9993 66.9993) + keyboardStep: 1 + extent: (Point 225 16) + ) + (SliderSpec + name: 'Slider3' + tabable: false + model: saturation + orientation: horizontal + step: 1 + backgroundColor: (Color 66.9993 66.9993 66.9993) + keyboardStep: 1 + extent: (Point 225 16) + ) + ) + + ) + ) + (VerticalPanelViewSpec + name: 'HLSFieldPanel' + layout: (LayoutFrame -161 1 86 0 -123 1 163 0) + horizontalLayout: fit + verticalLayout: spreadSpace + horizontalSpace: 3 + verticalSpace: 3 + component: + (SpecCollection + collection: ( + (InputFieldSpec + name: 'EntryField1' + model: hue + type: numberInRange + numChars: 3 + minValue: 0 + maxValue: 359 + acceptOnPointerLeave: false + extent: (Point 38 20) + ) + (InputFieldSpec + name: 'EntryField2' + model: light + type: numberInRange + numChars: 3 + minValue: 0 + maxValue: 100 + acceptOnPointerLeave: false + extent: (Point 38 20) + ) + (InputFieldSpec + name: 'EntryField3' + model: saturation + type: numberInRange + numChars: 3 + minValue: 0 + maxValue: 100 + acceptOnPointerLeave: false + extent: (Point 38 20) + ) + ) + + ) + ) + (ViewSpec + name: 'Box1' + layout: (LayoutFrame -117 1 4 0.0 -3 1.0 -39 1.0) + level: 1 + component: + (SpecCollection + collection: ( + (LabelSpec + label: 'Preview' + name: 'PreviewBox' + layout: (LayoutFrame 2 0.0 2 0.0 -2 1.0 -2 1.0) + level: -1 + translateLabel: true + ) + ) + + ) + ) + (LabelSpec + label: 'Color Name:' + name: 'ColorNameLabel' + layout: (LayoutFrame 0 0 190 0 106 0 212 0) + translateLabel: true + adjust: right + ) + (InputFieldSpec + name: 'ColorNameField' + layout: (LayoutFrame 110 0 190 0 -123 1 212 0) + model: colorNameHolder + immediateAccept: true + acceptOnReturn: true + acceptOnTab: true + acceptOnLostFocus: true + acceptOnPointerLeave: false + ) + (HorizontalPanelViewSpec + name: 'HorizontalPanel1' + layout: (LayoutFrame 0 0.0 -32 1 0 1.0 0 1.0) + horizontalLayout: fitSpace + verticalLayout: centerMax + horizontalSpace: 3 + verticalSpace: 3 + reverseOrderIfOKAtLeft: true + component: + (SpecCollection + collection: ( + (ActionButtonSpec + label: 'Cancel' + name: 'CancelButton' + translateLabel: true + resizeForLabel: false + tabable: true + model: cancel + useDefaultExtent: true + ) + (ActionButtonSpec + label: 'OK' + name: 'OKButton' + translateLabel: true + resizeForLabel: false + tabable: true + model: accept + isDefault: true + defaultable: true + useDefaultExtent: true + ) + ) + + ) + ) + ) + + ) + ) +! ! + +!ColorEditDialog methodsFor:'accessing'! + +color + ^Color redByte:(red value) greenByte:(green value) blueByte:(blue value) +! + +color:aColor + aColor notNil ifTrue:[ + self red value:aColor redByte. + self green value:aColor greenByte. + self blue value:aColor blueByte. + ] +! + +colorName + ^ colorNameHolder value +! ! + +!ColorEditDialog methodsFor:'actions'! + +colorChanged + |box clr| + + box := self componentAt: #PreviewBox. + box isNil ifTrue:[^ self "called before setup"]. + + clr := self color. + box backgroundColor:clr. + box foregroundColor:(clr brightness < 0.5 + ifTrue:[Color white] + ifFalse:[Color black]). +! + +colorNameChanged + "compute rgb and hls (if possible)" + + |clr h| + + clr := Color name:colorNameHolder value ifIllegal:nil. + clr isNil ifTrue:[ + ^ self + ]. + + red value:clr redByte withoutNotifying:self. + green value:clr greenByte withoutNotifying:self. + blue value:clr blueByte withoutNotifying:self. + + h := clr hue. + h notNil ifTrue:[ + hue value:(h rounded) withoutNotifying:self. + ]. + light value:(clr light rounded) withoutNotifying:self. + saturation value:(clr saturation rounded) withoutNotifying:self. + + self colorChanged +! + +hlsSliderChanged + "compute rgb" + + Color withRGBFromHue:hue value light:light value saturation:saturation value do:[:r :g :b | + red value:(r * 255 / 100) rounded withoutNotifying:self. + green value:(g * 255 / 100) rounded withoutNotifying:self. + blue value:(b * 255 / 100) rounded withoutNotifying:self. + ]. + colorNameHolder value:'' withoutNotifying:self. + self colorChanged +! + +rgbSliderChanged + "compute hls" + + |r g b| + + r := self red value. + g := self green value. + b := self blue value. + + Color withHLSFromRed:(r * 100 / 255) green:(g * 100 / 255) blue:(b * 100 / 255) do:[:h :l :s | + h isNil ifTrue:[ + "/ achromatic + ] ifFalse:[ + self hue value:(h rounded) withoutNotifying:self. + ]. + self light value:(l rounded) withoutNotifying:self. + self saturation value:(s rounded) withoutNotifying:self. + ]. + self colorNameHolder value:'' withoutNotifying:self. + self colorChanged +! ! + +!ColorEditDialog methodsFor:'aspects'! + +blue + blue isNil ifTrue:[ + blue := 0 asValue. + blue addDependent:self. + ]. + ^blue +! + +colorNameHolder + colorNameHolder isNil ifTrue:[ + colorNameHolder := '' asValue. + colorNameHolder addDependent:self. + ]. + ^colorNameHolder +! + +green + green isNil ifTrue:[ + green := 0 asValue. + green addDependent:self. + ]. + ^green +! + +hue + hue isNil ifTrue:[ + hue := 0 asValue. + hue addDependent:self. + ]. + ^hue +! + +light + light isNil ifTrue:[ + light := 0 asValue. + light addDependent:self. + ]. + ^light +! + +red + red isNil ifTrue:[ + red := 0 asValue. + red addDependent:self. + ]. + ^red +! + +saturation + saturation isNil ifTrue:[ + saturation := 0 asValue. + saturation addDependent:self. + ]. + ^saturation +! ! + +!ColorEditDialog methodsFor:'change & update'! + +update:something with:aParameter from:changedObject + (changedObject == red + or:[changedObject == green + or:[changedObject == blue]]) ifTrue:[ + ^ self rgbSliderChanged + ]. + + (changedObject == hue + or:[changedObject == light + or:[changedObject == saturation]]) ifTrue:[ + ^ self hlsSliderChanged + ]. + + (changedObject == colorNameHolder) ifTrue:[ + ^ self colorNameChanged + ]. + + ^ super update:something with:aParameter from:changedObject +! ! + +!ColorEditDialog methodsFor:'startup & release'! + +postBuildWith:aBuilder + super postBuildWith:aBuilder. + self colorChanged. + + "Modified: / 6.9.1998 / 22:55:25 / cg" +! ! + +!ColorEditDialog class methodsFor:'documentation'! + +version + ^ '$Header$' +! !