*******************************************************************************/\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
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