+/*******************************************************************************\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
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.viewers.ISelectionChangedListener;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.jface.viewers.SelectionChangedEvent;\r
+import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.events.SelectionListener;\r
+import org.eclipse.swt.graphics.RGB;\r
+import org.eclipse.swt.layout.FillLayout;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.Composite;\r
+\r
+/**\r
+ * Widget to create and edit color gradients\r
+ * \r
+ * @author Marko Luukkainen\r
+ *\r
+ */\r
+public class ColorGradientComposite2 extends Composite implements ISelectionChangedListener{ \r
+ \r
+ private ColorGradientAdjustingCanvas gradientComposite;\r
+ private Button addButton;\r
+ private Button editButton;\r
+ private Button removeButton;\r
+ private Button rgbButton;\r
+ private Button hsvButton;\r
+ private int type = ColorGradient.RGB;\r
+ \r
+ private ArrayList<ColorValue> values = new ArrayList<ColorValue>();\r
+ \r
+ public ColorGradientComposite2(Composite parent, int style) {\r
+ super(parent,style);\r
+ GridLayout layout = new GridLayout(2,false);\r
+ this.setLayout(layout);\r
+ gradientComposite = new ColorGradientAdjustingCanvas(this,SWT.HORIZONTAL);\r
+ \r
+ gradientComposite.addSelectionChangedListener(this);\r
+ \r
+ Composite typeComposite = new Composite(this, SWT.NONE);\r
+ \r
+ typeComposite.setLayout(new GridLayout(1,false));\r
+ rgbButton = new Button(typeComposite,SWT.RADIO);\r
+ rgbButton.setSelection(true);\r
+ rgbButton.addSelectionListener(new SelectionListener() {\r
+ public void widgetDefaultSelected(SelectionEvent e) {\r
+ widgetSelected(e);\r
+ }\r
+ public void widgetSelected(SelectionEvent e) {\r
+ rgbButton.setSelection(true);\r
+ hsvButton.setSelection(false);\r
+ type = ColorGradient.RGB;\r
+ gradientComposite.setGradient(new ColorGradient(values,type));\r
+ }\r
+ });\r
+ rgbButton.setText("RGB");\r
+ hsvButton = new Button(typeComposite,SWT.RADIO);\r
+ hsvButton.addSelectionListener(new SelectionListener() {\r
+ public void widgetDefaultSelected(SelectionEvent e) {\r
+ widgetSelected(e);\r
+ }\r
+ public void widgetSelected(SelectionEvent e) {\r
+ hsvButton.setSelection(true);\r
+ rgbButton.setSelection(false);\r
+ type = ColorGradient.HSV;\r
+ gradientComposite.setGradient(new ColorGradient(values,type));\r
+ }\r
+ });\r
+ hsvButton.setText("HSV"); \r
+ \r
+ Composite buttonComposite = new Composite(this,SWT.NONE);\r
+\r
+ buttonComposite.setLayout(new FillLayout(SWT.HORIZONTAL));\r
+ \r
+ addButton = new Button(buttonComposite,SWT.PUSH);\r
+ addButton.setText("Add new color");\r
+ addButton.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { \r
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { \r
+ RGB rgb = openDialog(null);\r
+ if (rgb != null) {\r
+ Color c = new Color(rgb.red,rgb.green,rgb.blue);\r
+ Double value;\r
+ if (values.size() == 0) {\r
+ value = 0.0;\r
+ } else if (values.size() == 1) {\r
+ value = 100.0;\r
+ } else {\r
+ StructuredSelection selection = (StructuredSelection)gradientComposite.getSelection();\r
+ if (selection.size() == 1) {\r
+ // add new color next to the selection\r
+ ColorValue v = (ColorValue)selection.getFirstElement();\r
+ int index = values.indexOf(v);\r
+ if (index == values.size() -1) {\r
+ index--;\r
+ }\r
+ value = (values.get(index+1).getValue()-values.get(index).getValue())*0.5;\r
+ value += values.get(index).getValue();\r
+ } else {\r
+ // add new color to largest gap\r
+ int index = 0;\r
+ double r = 0.0;\r
+ for (int i = 0; i < values.size() -1; i++) {\r
+ double v1 = values.get(i).getValue();\r
+ double v2 = values.get(i+1).getValue();\r
+ double vr = v2 -v1;\r
+ if (vr > r) {\r
+ r=vr;\r
+ index = i;\r
+ }\r
+ }\r
+ value = values.get(index).getValue() + r *0.5;\r
+ }\r
+ }\r
+ addColor(c,value);\r
+ }\r
+ }\r
+ });\r
+ editButton = new Button(buttonComposite,SWT.PUSH);\r
+ editButton.setText("Edit color");\r
+ editButton.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { \r
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { \r
+ \r
+ Object obj = ((StructuredSelection)gradientComposite.getSelection()).getFirstElement();\r
+ if (obj == null)\r
+ return;\r
+ if (obj instanceof ColorValue) {\r
+ RGB rgb = openDialog(((ColorValue)obj).getColor().getRgb());\r
+ if (rgb != null) {\r
+ modifyColorValueColor((ColorValue)obj,rgb);\r
+ }\r
+ } \r
+ \r
+ }\r
+ });\r
+ editButton.setEnabled(false);\r
+ removeButton = new Button(buttonComposite,SWT.PUSH);\r
+ removeButton.setText("Remove color");\r
+ removeButton.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { \r
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { \r
+ Object o = ((StructuredSelection)gradientComposite.getSelection()).getFirstElement();\r
+ if (o == null)\r
+ return;\r
+ if (o instanceof ColorValue) {\r
+ values.remove(o);\r
+ updateWidgets();\r
+ } \r
+ \r
+ }\r
+ });\r
+ removeButton.setEnabled(false);\r
+ \r
+ GridDataFactory.fillDefaults().span(1, 1).grab(true, false).align(SWT.FILL, SWT.CENTER).hint(SWT.DEFAULT, 32).applyTo(gradientComposite);\r
+ GridDataFactory.fillDefaults().grab(false, true).align(SWT.LEFT, SWT.FILL).applyTo(typeComposite);\r
+ GridDataFactory.fillDefaults().span(1, 1).grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(buttonComposite); \r
+ }\r
+ \r
+ protected RGB openDialog(RGB selection) {\r
+// ColorDialog dialog = new ColorDialog(ColorGradientComposite2.this.getShell(), SWT.NONE);\r
+// if (selection != null)\r
+// dialog.setRGB(selection);\r
+// RGB rgb = dialog.open();\r
+// return rgb;\r
+ org.simantics.utils.ui.color.ColorDialog dialog = new org.simantics.utils.ui.color.ColorDialog(getShell());\r
+ if (selection != null) {\r
+ Color color = new Color(selection);\r
+ dialog.setInitialValue(color);\r
+ }\r
+ if (dialog.open() == org.simantics.utils.ui.color.ColorDialog.OK) {\r
+ Color color = dialog.getColor();\r
+ return color.getRgb();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public void addColor(Color color, double value) {\r
+ addColor(new ColorValue(color,value));\r
+ }\r
+ \r
+ public void addColor(ColorValue value) {\r
+ values.add(value);\r
+ updateWidgets();\r
+ }\r
+ \r
+ private void updateWidgets() {\r
+ Collections.sort(values,new ColorValueComparator()); \r
+ gradientComposite.setGradient(new ColorGradient(values,type));\r
+ }\r
+\r
+ public ColorGradient getGradient() {\r
+ return new ColorGradient(values,type);\r
+ }\r
+\r
+ public void dispose() {\r
+ super.dispose();\r
+ }\r
+ \r
+ public void setGradient(ColorGradient gradient) {\r
+ values.clear();\r
+ type = gradient.getType();\r
+ for (ColorValue value : gradient.getColorValues())\r
+ addColor(value);\r
+ if (type == ColorGradient.HSV) {\r
+ rgbButton.setSelection(false);\r
+ hsvButton.setSelection(true);\r
+ } else if (type == ColorGradient.RGB) {\r
+ hsvButton.setSelection(false);\r
+ rgbButton.setSelection(true);\r
+ }\r
+ \r
+ }\r
+ \r
+ private void modifyColorValueColor(ColorValue cValue, RGB rgb) {\r
+ values.remove(cValue);;\r
+ Color newColor = new Color(rgb.red,rgb.green,rgb.blue);\r
+ ColorValue newCValue = new ColorValue(newColor,cValue.getValue());\r
+ values.add(newCValue);\r
+ updateWidgets();\r
+ }\r
+ \r
+ /**\r
+ * Enables and disables "Edit color" and "Remove color" buttons depending on selected item\r
+ */\r
+ public void selectionChanged(SelectionChangedEvent event) {\r
+ Object obj = ((IStructuredSelection)event.getSelection()).getFirstElement();\r
+ if (obj == null) {\r
+ editButton.setEnabled(false);\r
+ removeButton.setEnabled(false);\r
+ } else {\r
+ editButton.setEnabled(true);\r
+ int index = values.indexOf(obj);\r
+ if (index > 0 && index < values.size() -1)\r
+ removeButton.setEnabled(true);\r
+ else\r
+ removeButton.setEnabled(false);\r
+ }\r
+ }\r
+ \r
+}\r
+\r
+ \r