--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.utils.ui.color;\r
+\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.MouseEvent;\r
+import org.eclipse.swt.events.MouseListener;\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.Composite;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Text;\r
+\r
+/**\r
+ * \r
+ * Widget to edit colors\r
+ * \r
+ * @author Marko Luukkainen\r
+ *\r
+ */\r
+public class ColorComposite extends Composite{\r
+ \r
+ \r
+ private Color color = new Color(255,255,255);\r
+ private ColorGradient rGradient;\r
+ private ColorGradient gGradient;\r
+ private ColorGradient bGradient;\r
+ private ColorGradient colorGradient;\r
+ \r
+ Text rText;\r
+ Text gText;\r
+ Text bText;\r
+ ColorGradientCanvas rCanvas;\r
+ ColorGradientCanvas gCanvas;\r
+ ColorGradientCanvas bCanvas;\r
+ ColorGradientCanvas colorCanvas;\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
+ 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
+ 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
+ void setValue(int value) {\r
+ Color newColor = new Color(value,color.getG(),color.getB());\r
+ updateColor(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
+ 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
+ void setValue(int value) {\r
+ Color newColor = new Color(color.getR(),value,color.getB());\r
+ updateColor(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
+ 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
+ void setValue(int value) {\r
+ Color newColor = new Color(color.getR(),color.getG(),value);\r
+ updateColor(newColor);\r
+ };\r
+ });\r
+ updateWidgets();\r
+ \r
+ }\r
+ \r
+ private abstract class ColorSelectListener implements MouseListener {\r
+ private Canvas canvas;\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
+ \r
+ }\r
+ public void mouseUp(MouseEvent e) {\r
+ \r
+ }\r
+ \r
+ abstract void setValue(int value);\r
+ }\r
+ \r
+ private void updateColor(Color color) {\r
+ this.color = color;\r
+ updateWidgets();\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
+ colorGradient = new ColorGradient(new ColorValue[]{\r
+ new ColorValue(new Color(color.getR(),color.getG(),color.getB()),0.0)});\r
+ \r
+ }\r
+ \r
+ private void updateWidgets() {\r
+ updateGradients();\r
+ rCanvas.setGradient(rGradient);\r
+ gCanvas.setGradient(gGradient);\r
+ bCanvas.setGradient(bGradient);\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
+}\r