]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorComposite.java
Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.utils.ui / src / org / simantics / utils / ui / color / ColorComposite.java
index bae10b93586e926a5e33e6ca20b87cda1fb5de3e..7e86056af3b749dfc745c352fb0b5d20c6142b60 100644 (file)
  *******************************************************************************/\r
 package org.simantics.utils.ui.color;\r
 \r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.layout.GridLayoutFactory;\r
 import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.ModifyEvent;\r
+import org.eclipse.swt.events.ModifyListener;\r
 import org.eclipse.swt.events.MouseEvent;\r
 import org.eclipse.swt.events.MouseListener;\r
+import org.eclipse.swt.events.MouseMoveListener;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.graphics.GC;\r
 import org.eclipse.swt.graphics.Rectangle;\r
-import org.eclipse.swt.layout.GridData;\r
 import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Canvas;\r
+import org.eclipse.swt.widgets.Button;\r
 import org.eclipse.swt.widgets.Composite;\r
 import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.TabFolder;\r
+import org.eclipse.swt.widgets.TabItem;\r
 import org.eclipse.swt.widgets.Text;\r
 \r
 /**\r
@@ -32,160 +41,525 @@ import org.eclipse.swt.widgets.Text;
 public class ColorComposite extends Composite{\r
        \r
        \r
-       private Color color = new Color(255,255,255);\r
+       private Color color;\r
        private ColorGradient rGradient;\r
        private ColorGradient gGradient;\r
        private ColorGradient bGradient;\r
+       private ColorGradient hGradient;\r
+       private ColorGradient sGradient;\r
+       private ColorGradient vGradient;\r
        private ColorGradient colorGradient;\r
        \r
+       TabFolder tabFolder;\r
+       \r
        Text rText;\r
        Text gText;\r
        Text bText;\r
-       ColorGradientCanvas rCanvas;\r
-       ColorGradientCanvas gCanvas;\r
-       ColorGradientCanvas bCanvas;\r
+       IntGradientWidget rCanvas;\r
+       IntGradientWidget gCanvas;\r
+       IntGradientWidget bCanvas;\r
        ColorGradientCanvas colorCanvas;\r
        \r
+       Text hText;\r
+       Text sText;\r
+       Text vText;\r
+       GradientWidget hCanvas;\r
+       GradientWidget sCanvas;\r
+       GradientWidget vCanvas;\r
+       \r
+       Button dynamicButton;\r
+       \r
+       boolean dynamic = true;\r
+       \r
        \r
        public ColorComposite(Composite parent, int style) {\r
                super(parent,style);\r
-               updateGradients();\r
                \r
                GridLayout layout = new GridLayout();\r
-               layout.makeColumnsEqualWidth = false;\r
-               layout.numColumns = 3;\r
+               layout.makeColumnsEqualWidth = true;\r
+               layout.numColumns = 1;\r
                this.setLayout(layout);\r
                \r
                colorCanvas = new ColorGradientCanvas(this,SWT.BORDER|SWT.HORIZONTAL);\r
-               GridData colorCanvasData = new GridData();\r
-               colorCanvasData.horizontalSpan = 3;\r
-               colorCanvasData.heightHint = 32;\r
-               colorCanvasData.widthHint = 600;\r
-               colorCanvasData.grabExcessHorizontalSpace = true;\r
-               colorCanvas.setLayoutData(colorCanvasData);\r
-               \r
-               //layout data used with labels\r
-               GridData labelData = new GridData();\r
-               labelData.widthHint = 30;\r
-               //layout data used with gradients\r
-               GridData gradientData = new GridData();\r
-               gradientData.grabExcessHorizontalSpace = true;\r
-               gradientData.heightHint = 16;\r
-               gradientData.widthHint = 500;\r
-               //layout data used with texts\r
-               GridData textData = new GridData();\r
-               textData.widthHint = 30;\r
-               \r
-               \r
-               //Composite rComposite = new Composite(this,SWT.NONE);\r
-               //Layout rLayout = new FillLayout(SWT.HORIZONTAL);\r
-               //rComposite.setLayout(rLayout);\r
-               Label rLabel = new Label(this,SWT.NONE);\r
+               \r
+               tabFolder = new TabFolder(this, SWT.NONE);\r
+               \r
+               TabItem rgbTab = new TabItem(tabFolder, SWT.NONE);\r
+               rgbTab.setText("RGB");\r
+               Composite rgbComposite = new Composite(tabFolder, SWT.NONE);\r
+               \r
+               rgbTab.setControl(rgbComposite);\r
+               \r
+               Label rLabel = new Label(rgbComposite,SWT.NONE);\r
                rLabel.setText("Red");\r
-               rLabel.setLayoutData(labelData);\r
-               rCanvas = new ColorGradientCanvas(this,SWT.BORDER|SWT.HORIZONTAL);\r
-               rCanvas.setLayoutData(gradientData);\r
-               rText = new Text(this,SWT.BORDER);\r
-               rText.setLayoutData(textData);\r
-               rCanvas.addMouseListener(new ColorSelectListener(rCanvas) {\r
+               rCanvas = new IntGradientWidget(rgbComposite,SWT.BORDER|SWT.HORIZONTAL){\r
+                       @Override\r
+                       protected void updatePosition(int value) {\r
+                               Color newColor = new Color(value,color.getG(),color.getB());\r
+                               setColor(newColor);\r
+                       }\r
+               };\r
+               rText = new Text(rgbComposite,SWT.BORDER);\r
+               rText.addModifyListener(new IntColorModifyListener() {\r
+                       \r
+                       @Override\r
                        void setValue(int value) {\r
                                Color newColor = new Color(value,color.getG(),color.getB());\r
-                               updateColor(newColor);\r
-                       };\r
+                               setColor(newColor);\r
+                       }\r
                });\r
                \r
-               //Composite gComposite = new Composite(this,SWT.NONE);\r
-               //Layout gLayout = new FillLayout(SWT.HORIZONTAL);\r
-               //gComposite.setLayout(gLayout);\r
-               Label gLabel = new Label(this,SWT.NONE);\r
+               Label gLabel = new Label(rgbComposite,SWT.NONE);\r
                gLabel.setText("Green");\r
-               gLabel.setLayoutData(labelData);\r
-               gCanvas = new ColorGradientCanvas(this,SWT.BORDER|SWT.HORIZONTAL);\r
-               gCanvas.setLayoutData(gradientData);\r
-               gText = new Text(this,SWT.BORDER);\r
-               gText.setLayoutData(textData);\r
-               gCanvas.addMouseListener(new ColorSelectListener(gCanvas) {\r
+               gCanvas = new IntGradientWidget(rgbComposite,SWT.BORDER|SWT.HORIZONTAL) {\r
+                       @Override\r
+                       protected void updatePosition(int value) {\r
+                               Color newColor = new Color(color.getR(),value,color.getB());\r
+                               setColor(newColor);\r
+                       }\r
+               };\r
+               gText = new Text(rgbComposite,SWT.BORDER);\r
+               gText.addModifyListener(new IntColorModifyListener() {\r
+                       \r
+                       @Override\r
                        void setValue(int value) {\r
                                Color newColor = new Color(color.getR(),value,color.getB());\r
-                               updateColor(newColor);\r
-                       };\r
+                               setColor(newColor);\r
+                       }\r
                });\r
                \r
-               //Composite bComposite = new Composite(this,SWT.NONE);\r
-               //Layout bLayout = new FillLayout(SWT.HORIZONTAL);\r
-               //bComposite.setLayout(bLayout);\r
-               Label bLabel = new Label(this,SWT.NONE);\r
+               Label bLabel = new Label(rgbComposite,SWT.NONE);\r
                bLabel.setText("Blue");\r
-               bLabel.setLayoutData(labelData);\r
-               bCanvas = new ColorGradientCanvas(this,SWT.BORDER|SWT.HORIZONTAL);\r
-               bCanvas.setLayoutData(gradientData);\r
-               bText = new Text(this,SWT.BORDER);\r
-               bText.setLayoutData(textData);\r
-               bCanvas.addMouseListener(new ColorSelectListener(bCanvas) {\r
+               bCanvas = new IntGradientWidget(rgbComposite,SWT.BORDER|SWT.HORIZONTAL) {\r
+                       @Override\r
+                       protected void updatePosition(int value) {\r
+                               Color newColor = new Color(color.getR(),color.getG(),value);\r
+                               setColor(newColor);\r
+                       }\r
+               };\r
+               bText = new Text(rgbComposite,SWT.BORDER);\r
+               bText.addModifyListener(new IntColorModifyListener() {\r
+                       \r
+                       @Override\r
                        void setValue(int value) {\r
                                Color newColor = new Color(color.getR(),color.getG(),value);\r
-                               updateColor(newColor);\r
-                       };\r
+                               setColor(newColor);\r
+                       }\r
                });\r
-               updateWidgets();\r
                \r
-       }\r
-       \r
-       private abstract class ColorSelectListener implements MouseListener {\r
-               private Canvas canvas;\r
+               TabItem hsvTab = new TabItem(tabFolder, SWT.NONE);\r
+               hsvTab.setText("HSV");\r
+               Composite hsvComposite = new Composite(tabFolder, SWT.NONE);\r
                \r
-               public ColorSelectListener(Canvas canvas) {\r
-                       this.canvas = canvas;\r
-               }\r
-               public void mouseDoubleClick(MouseEvent e) {\r
-                                               \r
-               }\r
-               public void mouseDown(MouseEvent e) {\r
-                       Rectangle r = this.canvas.getBounds();\r
-                       double d = (double)e.x / (double)r.width;\r
-                       int value = (int)(d * 255);\r
-                       if (value < 0)\r
-                               value = 0;\r
-                       if (value > 255)\r
-                               value = 255;\r
-                       setValue(value);\r
+               hsvTab.setControl(hsvComposite);\r
+               \r
+               Label hLabel = new Label(hsvComposite,SWT.NONE);\r
+               hLabel.setText("Hue");\r
+               hCanvas = new GradientWidget(hsvComposite,SWT.BORDER|SWT.HORIZONTAL) {\r
+                       @Override\r
+                       protected boolean updatePosition(double d) {\r
+                               Color newColor = new Color(d*360.0,color.getS(),color.getV());\r
+                               setColor(newColor);\r
+                               return true;\r
+                       }\r
                        \r
-               }\r
-               public void mouseUp(MouseEvent e) {\r
+                       @Override\r
+                       protected void setPosition(double d) {\r
+                               super.setPosition(d/360.0);\r
+                       }\r
+               };\r
+               hText = new Text(hsvComposite,SWT.BORDER);\r
+               hText.addModifyListener(new DoubleColorModifyListener(0.,360.) {\r
+                       \r
+                       @Override\r
+                       void setValue(double value) {\r
+                               Color newColor = new Color(value,color.getS(),color.getV());\r
+                               setColor(newColor);\r
+                       }\r
+               });\r
+               \r
+               Label sLabel = new Label(hsvComposite,SWT.NONE);\r
+               sLabel.setText("Saturation");\r
+               sCanvas = new GradientWidget(hsvComposite,SWT.BORDER|SWT.HORIZONTAL) {\r
+                       @Override\r
+                       protected boolean updatePosition(double d) {\r
+                               Color newColor = new Color(color.getH(),d,color.getV());\r
+                               setColor(newColor);\r
+                               return true;\r
+                       }\r
+               };\r
+               sText = new Text(hsvComposite,SWT.BORDER);\r
+               sText.addModifyListener(new DoubleColorModifyListener(0.,1.) {\r
+                       \r
+                       @Override\r
+                       void setValue(double value) {\r
+                               Color newColor = new Color(color.getH(),value,color.getV());\r
+                               setColor(newColor);\r
+                       }\r
+               });\r
+               \r
+               Label vLabel = new Label(hsvComposite,SWT.NONE);\r
+               vLabel.setText("Value");\r
+               vCanvas = new GradientWidget(hsvComposite,SWT.BORDER|SWT.HORIZONTAL) {\r
+                       @Override\r
+                       protected boolean updatePosition(double d) {\r
+                               Color newColor = new Color(color.getH(),color.getS(),d);\r
+                               setColor(newColor);\r
+                               return true;\r
+                       }\r
+               };\r
+               vText = new Text(hsvComposite,SWT.BORDER);\r
+               vText.addModifyListener(new DoubleColorModifyListener(0.,1.) {\r
+                       \r
+                       @Override\r
+                       void setValue(double value) {\r
+                               Color newColor = new Color(color.getH(),color.getS(),value);\r
+                               setColor(newColor);\r
+                       }\r
+               });\r
+               \r
+               TabItem settingsTab = new TabItem(tabFolder, SWT.NONE);\r
+               settingsTab.setText("Settings");\r
+               Composite settingsComposite = new Composite(tabFolder, SWT.NONE);\r
+               \r
+               settingsTab.setControl(settingsComposite);\r
+               \r
+               dynamicButton = new Button(settingsComposite, SWT.CHECK);\r
+               dynamicButton.setText("Dynamic widgets");\r
+               dynamicButton.setSelection(dynamic);\r
+               dynamicButton.addSelectionListener(new SelectionAdapter() {\r
+                       @Override\r
+                       public void widgetSelected(SelectionEvent e) {\r
+                               dynamic = dynamicButton.getSelection();\r
+                               updateWidgets();\r
+                       }\r
+               });\r
+\r
+               GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).applyTo(rgbComposite);\r
+               GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).applyTo(hsvComposite);\r
+               GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).applyTo(settingsComposite);\r
+               GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(rgbComposite);\r
+               GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(hsvComposite);\r
+               GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(settingsComposite);\r
+               GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(tabFolder);\r
+               \r
+               GridDataFactory.fillDefaults().hint(-1, 32).grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(colorCanvas);\r
+               GridDataFactory.fillDefaults().hint(-1, 16).grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(rCanvas);\r
+               GridDataFactory.fillDefaults().hint(-1, 16).grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(gCanvas);\r
+               GridDataFactory.fillDefaults().hint(-1, 16).grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(bCanvas);\r
+               GridDataFactory.fillDefaults().hint(-1, 16).grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(hCanvas);\r
+               GridDataFactory.fillDefaults().hint(-1, 16).grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(sCanvas);\r
+               GridDataFactory.fillDefaults().hint(-1, 16).grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(vCanvas);\r
+               GridDataFactory.fillDefaults().hint(20, 15).grab(false, false).applyTo(rText);\r
+               GridDataFactory.fillDefaults().hint(20, 15).grab(false, false).applyTo(gText);\r
+               GridDataFactory.fillDefaults().hint(20, 15).grab(false, false).applyTo(bText);\r
+               GridDataFactory.fillDefaults().hint(20, 15).grab(false, false).applyTo(hText);\r
+               GridDataFactory.fillDefaults().hint(20, 15).grab(false, false).applyTo(sText);\r
+               GridDataFactory.fillDefaults().hint(20, 15).grab(false, false).applyTo(vText);\r
+               \r
+               if (color == null)\r
+                       setColor(new Color(255,255,255));\r
+               else\r
+                       setColor(color);\r
+       }\r
+       \r
+       private abstract class IntColorModifyListener implements ModifyListener {\r
+               boolean modify = false;\r
+               @Override\r
+               public void modifyText(ModifyEvent e) {\r
+                       if (internalUpdate)\r
+                               return;\r
+                       if (modify)\r
+                               return;\r
+                       modify = true;\r
+                       Text text = (Text)e.widget;\r
+                       try {\r
+                               int value = Integer.parseInt(text.getText());\r
+                               if (value < 0)\r
+                                       value = 0;\r
+                               if (value > 255)\r
+                                       value = 255;\r
+                               setValue(value);\r
+                       } catch (NumberFormatException err) {\r
+                               \r
+                       }\r
+                       modify = false;\r
                        \r
                }\r
                \r
                abstract void setValue(int value);\r
        }\r
+\r
+       private abstract class DoubleColorModifyListener implements ModifyListener {\r
+               boolean modify = false;\r
+               double min;\r
+               double max;\r
+               \r
+               public DoubleColorModifyListener( double min, double max) {\r
+                       this.min = min;\r
+                       this.max = max;\r
+               }\r
+               \r
+               @Override\r
+               public void modifyText(ModifyEvent e) {\r
+                       if (internalUpdate)\r
+                               return;\r
+                       if (modify)\r
+                               return;\r
+                       modify = true;\r
+                       Text text = (Text)e.widget;\r
+                       try {\r
+                               double value = Integer.parseInt(text.getText());\r
+                               if (value < min) {\r
+                                       value = min;\r
+                               } else if (value > max)\r
+                                       value = max;\r
+                               setValue(value);\r
+                       } catch (NumberFormatException err) {\r
+                               \r
+                       }\r
+                       modify = false;                 \r
+               }\r
+\r
+               \r
+               abstract void setValue(double value);\r
+       }\r
        \r
-       private void updateColor(Color color) {\r
+       public void setColor(Color color) {\r
                this.color = color;\r
                updateWidgets();\r
        }\r
        \r
+       public Color getColor() {\r
+               return color;\r
+       }\r
+       \r
        private void updateGradients() {\r
-               rGradient = new ColorGradient(new ColorValue[]{\r
-                                       new ColorValue(new Color(0,color.getG(),color.getB()),0.0),\r
-                                       new ColorValue(new Color(255,color.getG(),color.getB()),1.0)});\r
-               gGradient = new ColorGradient(new ColorValue[]{\r
-                               new ColorValue(new Color(color.getR(),0,color.getB()),0.0),\r
-                               new ColorValue(new Color(color.getR(),255,color.getB()),1.0)});\r
-               bGradient = new ColorGradient(new ColorValue[]{\r
-                               new ColorValue(new Color(color.getR(),color.getG(),0),0.0),\r
-                               new ColorValue(new Color(color.getR(),color.getG(),255),1.0)});\r
+               if (dynamic) {\r
+                       rGradient = new ColorGradient(new ColorValue[]{\r
+                                               new ColorValue(new Color(0,color.getG(),color.getB()),0.0),\r
+                                               new ColorValue(new Color(255,color.getG(),color.getB()),1.0)});\r
+                       gGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(color.getR(),0,color.getB()),0.0),\r
+                                       new ColorValue(new Color(color.getR(),255,color.getB()),1.0)});\r
+                       bGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(color.getR(),color.getG(),0),0.0),\r
+                                       new ColorValue(new Color(color.getR(),color.getG(),255),1.0)});\r
+                       // hue is interpolated along the shortest route, using just 0 and 360 would result in constant color. \r
+                       hGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(0.0,color.getS(),color.getV()),0.0),\r
+                                       new ColorValue(new Color(90.0,color.getS(),color.getV()),0.25),\r
+                                       new ColorValue(new Color(180.0,color.getS(),color.getV()),0.5),\r
+                                       new ColorValue(new Color(270.0,color.getS(),color.getV()),0.75),\r
+                                       new ColorValue(new Color(360.0,color.getS(),color.getV()),1.0)}, ColorGradient.HSV);\r
+                       sGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(color.getH(),0.0,color.getV()),0.0),\r
+                                       new ColorValue(new Color(color.getH(),1.0,color.getV()),1.0)}, ColorGradient.HSV);\r
+                       vGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(color.getH(),color.getS(),0.0),0.0),\r
+                                       new ColorValue(new Color(color.getH(),color.getS(),1.0),1.0)}, ColorGradient.HSV);\r
+               } else {\r
+                       rGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(0,0,0),0.0),\r
+                                       new ColorValue(new Color(255,0,0),1.0)});\r
+                       gGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(0,0,0),0.0),\r
+                                       new ColorValue(new Color(0,255,0),1.0)});\r
+                       bGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(0,0,0),0.0),\r
+                                       new ColorValue(new Color(0,0,255),1.0)});\r
+                       // hue is interpolated along the shortest route, using just 0 and 360 would result in constant color. \r
+                       hGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(0.0,1.0,1.0),0.0),\r
+                                       new ColorValue(new Color(90.0,1.0,1.0),0.25),\r
+                                       new ColorValue(new Color(180.0,1.0,1.0),0.5),\r
+                                       new ColorValue(new Color(270.0,1.0,1.0),0.75),\r
+                                       new ColorValue(new Color(360.0,1.0,1.0),1.0)}, ColorGradient.HSV);\r
+                       sGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(color.getH(),0.0,1.0),0.0),\r
+                                       new ColorValue(new Color(color.getH(),1.0,1.0),1.0)}, ColorGradient.HSV);\r
+                       vGradient = new ColorGradient(new ColorValue[]{\r
+                                       new ColorValue(new Color(color.getH(),1.0,0.0),0.0),\r
+                                       new ColorValue(new Color(color.getH(),1.0,1.0),1.0)}, ColorGradient.HSV);\r
+               }\r
+               \r
                colorGradient = new ColorGradient(new ColorValue[]{\r
                                new ColorValue(new Color(color.getR(),color.getG(),color.getB()),0.0)});\r
        \r
        }\r
        \r
+       private boolean internalUpdate = false;\r
+       \r
        private void updateWidgets() {\r
+               if (internalUpdate)\r
+                       return;\r
+               internalUpdate = true;\r
                updateGradients();\r
                rCanvas.setGradient(rGradient);\r
                gCanvas.setGradient(gGradient);\r
                bCanvas.setGradient(bGradient);\r
+               hCanvas.setGradient(hGradient);\r
+               sCanvas.setGradient(sGradient);\r
+               vCanvas.setGradient(vGradient);\r
                colorCanvas.setGradient(colorGradient);\r
-               rText.setText(Integer.toString(color.getR()));\r
-               gText.setText(Integer.toString(color.getG()));\r
-               bText.setText(Integer.toString(color.getB()));  \r
+               \r
+               rCanvas.setPosition(color.getR());\r
+               gCanvas.setPosition(color.getG());\r
+               bCanvas.setPosition(color.getB());\r
+               hCanvas.setPosition(color.getH());\r
+               sCanvas.setPosition(color.getS());\r
+               vCanvas.setPosition(color.getV());\r
+               \r
+               if(!rText.isFocusControl())\r
+                       rText.setText(Integer.toString(color.getR()));\r
+               if(!gText.isFocusControl())\r
+                       gText.setText(Integer.toString(color.getG()));\r
+               if(!bText.isFocusControl())\r
+                       bText.setText(Integer.toString(color.getB()));\r
+               if(!hText.isFocusControl())\r
+                       hText.setText(Double.toString(color.getH()));\r
+               if(!sText.isFocusControl())\r
+                       sText.setText(Double.toString(color.getS()));\r
+               if(!vText.isFocusControl())\r
+                       vText.setText(Double.toString(color.getV()));   \r
+               internalUpdate = false;\r
+       }\r
+       \r
+       private abstract static class IntGradientWidget extends GradientWidget {\r
+\r
+               public IntGradientWidget(Composite parent, int style) {\r
+                       super(parent, style);\r
+               }\r
+               \r
+               @Override\r
+               protected boolean updatePosition(double d) {\r
+                       int value = (int)(d * 255);\r
+                       if (value < 0)\r
+                               value = 0;\r
+                       if (value > 255)\r
+                               value = 255;\r
+                       updatePosition(value);\r
+                       return true;\r
+               }\r
+               protected abstract void updatePosition(int value);\r
+               \r
+               protected void setPosition(int value) {\r
+                       double d = ((double)value)/255.0;\r
+                       setPosition(d);\r
+               }\r
+               \r
+       }\r
+       \r
+       private abstract static class GradientWidget extends ColorGradientCanvas {\r
+\r
+               int pos = -1;\r
+               double posD = -1.0;\r
+               \r
+               int size = 8;\r
+               int sized2 = 4;\r
+               \r
+               \r
+               \r
+               public GradientWidget(Composite parent, int style) {\r
+                       super(parent, style);\r
+                       this.addMouseListener(new MouseListener() {                     \r
+                               @Override\r
+                               public void mouseDown(MouseEvent e) {\r
+                                       if (e.button == 1) {\r
+                                               update(e);\r
+                                       }\r
+                               }\r
+                               \r
+                               @Override\r
+                               public void mouseUp(MouseEvent e) {}\r
+                               @Override\r
+                               public void mouseDoubleClick(MouseEvent e) {}\r
+                       });\r
+                       this.addMouseMoveListener(new MouseMoveListener() {\r
+                               \r
+                               @Override\r
+                               public void mouseMove(MouseEvent e) {\r
+                                       if ((e.stateMask & SWT.BUTTON1)>0) {\r
+                                               update(e);\r
+                                       }\r
+                               }\r
+                       });\r
+               }\r
+               \r
+               protected void update(MouseEvent e) {\r
+                       Rectangle r = getClientArea();\r
+                       double d;\r
+                       if ((style & SWT.HORIZONTAL) > 0) {\r
+                               d = (double)e.x / (double)r.width;\r
+                       } else {\r
+                               d = (double)e.y / (double)r.height;\r
+                       }\r
+                       if (d < 0.0)\r
+                               d = 0.0;\r
+                       else if (d > 1.0)\r
+                               d = 1.0;\r
+                       if (updatePosition(d)) {\r
+                               if ((style & SWT.HORIZONTAL) > 0) {\r
+                                       pos = (int)(d*((double)r.width));\r
+                               } else {\r
+                                       pos = (int)(d*((double)r.height));\r
+                               }\r
+                               posD = d;\r
+                       }\r
+               }\r
+               \r
+               protected abstract boolean updatePosition(double d);\r
+               \r
+               protected void setPosition(double d) {\r
+                       if (d == posD)\r
+                               return;\r
+                       _setPosition(d);                                                \r
+               }\r
+               \r
+               private void _setPosition(double d) {\r
+                       Rectangle r = getClientArea();\r
+                       posD = d;\r
+                       if (posD >= 0.0) {\r
+                               if ((style & SWT.HORIZONTAL) > 0) {\r
+                                       pos = (int)(d * (double)r.width);\r
+                               } else {\r
+                                       pos = (int)(d * (double)r.height);\r
+                               }\r
+                       } else {\r
+                               pos = -1;\r
+                       }\r
+               }\r
+               \r
+               Rectangle prevClip;\r
+               @Override\r
+               protected void paintGradient(GC gc, Rectangle clip) {\r
+                       super.paintGradient(gc, clip);\r
+                       if (!clip.equals(prevClip)) {\r
+                               prevClip = clip;\r
+                               _setPosition(posD);\r
+                       }\r
+                       \r
+                       if (pos >= 0) {\r
+                               org.eclipse.swt.graphics.Color white = new org.eclipse.swt.graphics.Color(gc.getDevice(), 255,255,255);\r
+                               org.eclipse.swt.graphics.Color black = new org.eclipse.swt.graphics.Color(gc.getDevice(), 0, 0, 0);\r
+                               gc.setForeground(black);\r
+                               gc.setBackground(white);\r
+                               int x;\r
+                               int y;\r
+                               if ((style & SWT.HORIZONTAL) > 0) {\r
+                                       x = pos;\r
+                                       y = clip.height / 2;\r
+                               } else {\r
+                                       x = clip.width / 2;\r
+                                       y = pos;\r
+                               }\r
+                               gc.fillOval(x-sized2, y-sized2, size, size);\r
+                               gc.drawOval(x-sized2, y-sized2, size, size);\r
+                               \r
+                               white.dispose();\r
+                               black.dispose();\r
+                       }\r
+               }\r
+               \r
        }\r
 }\r