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