]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorGradientComposite2.java
Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.utils.ui / src / org / simantics / utils / ui / color / ColorGradientComposite2.java
diff --git a/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorGradientComposite2.java b/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorGradientComposite2.java
new file mode 100644 (file)
index 0000000..497407b
--- /dev/null
@@ -0,0 +1,258 @@
+/*******************************************************************************\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