]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorGradientAdjustingCanvas.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.utils.ui / src / org / simantics / utils / ui / color / ColorGradientAdjustingCanvas.java
index ea8983f3cf5028833b258750a8c9f694b7c09f3d..e59b5a70bedde32a50c045778e39bfe5746f8c16 100644 (file)
-/*******************************************************************************\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 java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.ISelectionProvider;\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.MouseEvent;\r
-import org.eclipse.swt.events.MouseListener;\r
-import org.eclipse.swt.events.MouseMoveListener;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.graphics.GC;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.graphics.Rectangle;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Display;\r
-\r
-/**\r
- * \r
- * Canvas that shows color gradients and color positions.\r
- * Without READ_ONLY style the canvas allows user to drag color positions.\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class ColorGradientAdjustingCanvas extends ColorGradientCanvas implements ISelectionProvider{\r
-       \r
-       ColorValue[] values;\r
-       int last;\r
-       int coords[];\r
-       int size = 8;\r
-       int sized2 = 4;\r
-       int width;\r
-       int height;\r
-       \r
-       int selectedValueIndex = -1;\r
-       \r
-       public ColorGradientAdjustingCanvas(Composite parent, int style) {\r
-               super(parent,style|SWT.DOUBLE_BUFFERED|SWT.NO_BACKGROUND);\r
-               addMouseListener(new MouseListener() {\r
-                       \r
-                       @Override\r
-                       public void mouseUp(MouseEvent e) {\r
-                               \r
-                       }\r
-                       \r
-                       @Override\r
-                       public void mouseDown(MouseEvent e) {\r
-                               // store and reset selection\r
-                               int prev = selectedValueIndex;\r
-                               selectedValueIndex = -1;\r
-                               \r
-                               // locate closest ColorValue, and select it.\r
-                               int d = Integer.MAX_VALUE;\r
-                               for (int i = 0; i <= last; i++) {\r
-                                       int x = coords[i*2];\r
-                               int y = coords[i*2+1];\r
-                               int dx = Math.abs(x - e.x);\r
-                               int dy = Math.abs(y - e.y);\r
-                               if ((dx < size) &&\r
-                                       (dy < size)) {\r
-                                       int dd = dx+dy;\r
-                                       if (dd < d) {\r
-                                               selectedValueIndex = i;\r
-                                               d = dd;\r
-                                       }\r
-                               }\r
-                               }\r
-                               // if selection was changed, update it.\r
-                               if (prev != selectedValueIndex) {\r
-                                       updateSelection();\r
-                                       redraw();\r
-                               }\r
-                       }\r
-                       \r
-                       @Override\r
-                       public void mouseDoubleClick(MouseEvent e) {\r
-                               \r
-                       }\r
-               });\r
-               if ((style&SWT.READ_ONLY) == 0) {\r
-                       addMouseMoveListener(new MouseMoveListener() {\r
-                               \r
-                               @Override\r
-                               public void mouseMove(MouseEvent e) {\r
-                                       if ((e.stateMask & SWT.BUTTON1)>0) {\r
-                                               if (selectedValueIndex > 0 && selectedValueIndex < last) {\r
-                                                       double d;\r
-                                                       if ((ColorGradientAdjustingCanvas.this.style | SWT.HORIZONTAL) > 0) {\r
-                                                               d = (double)e.x/(double)width;\r
-                                                       } else {\r
-                                                               d = (double)e.y/(double)height;\r
-                                                       }\r
-                                                       double r = max-min;\r
-                                                       d *= r;\r
-                                                       d += min;\r
-                                                       double offset = r*0.015;\r
-                                                       if (d <= values[selectedValueIndex-1].getValue()+offset)\r
-                                                               d = values[selectedValueIndex-1].getValue()+offset;\r
-                                                       else if (d >= values[selectedValueIndex+1].getValue()-offset)\r
-                                                               d = values[selectedValueIndex+1].getValue()-offset;\r
-                                                       values[selectedValueIndex]._setValue(d);\r
-                                                       calculateCoords(width, height);\r
-                                                       redraw();\r
-                                               }\r
-                                       }\r
-                                       \r
-                               }\r
-                       });\r
-               }\r
-\r
-       }\r
-       \r
-       public void setGradient(ColorGradient gradient) {\r
-               int prevSize = 0;\r
-               if (values != null)\r
-                       prevSize = values.length;\r
-               \r
-               values = gradient.getColorValueArray();\r
-               last = values.length-1;\r
-               coords = new int[values.length*2];\r
-               super.setGradient(gradient);\r
-               if (selectedValueIndex >= 0 && prevSize != values.length) {\r
-                       selectedValueIndex = -1;\r
-                       updateSelection();\r
-               } else {\r
-                       updateSelection();\r
-               }\r
-       }\r
-       \r
-       double min;\r
-       double max;\r
-       \r
-       private void calculateCoords(int width, int height) {\r
-               this.width = width;\r
-               this.height = height;\r
-               \r
-               min = values[0].getValue();\r
-               max = values[last].getValue();\r
-               \r
-               if ((ColorGradientAdjustingCanvas.this.style & SWT.HORIZONTAL) > 0) {\r
-                       for (int i = 0; i <= last ; i++) {\r
-                               int y = height / 2;\r
-                               double d =  values[i].getValue();\r
-                               int x = (int)(((d-min)/(max-min))*(double)width);\r
-                               coords[i*2] = x;\r
-                               coords[i*2+1] = y;\r
-                       }\r
-               } else {\r
-                       for (int i = 0; i <= last ; i++) {\r
-                               int x = width / 2;\r
-                               double d =  values[i].getValue();\r
-                               int y = (int)(((d-min)/(max-min))*(double)height);\r
-                               coords[i*2] = x;\r
-                               coords[i*2+1] = y;\r
-                       }\r
-               }\r
-       }\r
-\r
-       \r
-       @Override\r
-       protected void paintGradient(GC gc, Rectangle clip) {\r
-               if (values != null && values.length > 0) {\r
-                       Image image = gradient.getGradientImage(clip.width,clip.height,ColorGradientAdjustingCanvas.this.style);\r
-                       gc.drawImage(image, 0, 0);\r
-                       image.dispose();        \r
-                       calculateCoords(clip.width, clip.height);\r
-\r
-                       Color white = new Color(gc.getDevice(), 255,255,255);\r
-                       Color yellow = new Color(gc.getDevice(), 255,230,0);\r
-                       Color black = new Color(gc.getDevice(), 0, 0, 0);\r
-                       for (int i = 0; i <= last ; i++) {\r
-                               int x = coords[i*2];\r
-                               int y = coords[i*2+1];\r
-                               gc.setForeground(black);\r
-                               if (selectedValueIndex == i)\r
-                                       gc.setBackground(yellow);\r
-                               else\r
-                                       gc.setBackground(white);\r
-                               if (i == 0 || i == last ) {\r
-                                       gc.fillRectangle(x-sized2, y-sized2, size, size);\r
-                                       gc.drawRectangle(x-sized2, y-sized2, size, size);\r
-                               } else {\r
-                                       gc.fillOval(x-sized2, y-sized2, size, size);\r
-                                       gc.drawOval(x-sized2, y-sized2, size, size);\r
-                               }\r
-                       }\r
-                       \r
-                       white.dispose();\r
-                       black.dispose();\r
-                       yellow.dispose();\r
-               } else {\r
-                       gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
-                       gc.fillRectangle(clip);\r
-               }\r
-       }\r
-       \r
-       private ISelection selection = new StructuredSelection();\r
-       private List<ISelectionChangedListener> listeners = new ArrayList<>();\r
-\r
-       @Override\r
-       public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
-               listeners.add(listener);\r
-       }\r
-\r
-       @Override\r
-       public ISelection getSelection() {\r
-       return selection;\r
-       }\r
-\r
-       @Override\r
-       public void removeSelectionChangedListener(ISelectionChangedListener listener) {\r
-               listeners.remove(listener);\r
-       }\r
-\r
-       @Override\r
-       public void setSelection(ISelection selection) {\r
-               ColorValue value = (ColorValue)((StructuredSelection)selection).getFirstElement();\r
-               selectedValueIndex = gradient.getColorValues().indexOf(value);\r
-       }\r
-       \r
-       private void updateSelection() {\r
-               if (selectedValueIndex < 0)\r
-                       selection = new StructuredSelection();\r
-               else\r
-                       selection = new StructuredSelection(values[selectedValueIndex]);\r
-               \r
-               for (ISelectionChangedListener l : listeners) {\r
-                       l.selectionChanged(new SelectionChangedEvent(this, selection));\r
-               }\r
-       }\r
-       \r
-       public int getPointSize() {\r
-               return size;\r
-       }\r
-       \r
-       public void setPointSize(int size) {\r
-               this.size = size;\r
-               this.sized2 = size/2;\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.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * 
+ * Canvas that shows color gradients and color positions.
+ * Without READ_ONLY style the canvas allows user to drag color positions.
+ * 
+ * @author Marko Luukkainen
+ *
+ */
+public class ColorGradientAdjustingCanvas extends ColorGradientCanvas implements ISelectionProvider{
+       
+       ColorValue[] values;
+       int last;
+       int coords[];
+       int size = 8;
+       int sized2 = 4;
+       int width;
+       int height;
+       
+       int selectedValueIndex = -1;
+       
+       public ColorGradientAdjustingCanvas(Composite parent, int style) {
+               super(parent,style|SWT.DOUBLE_BUFFERED|SWT.NO_BACKGROUND);
+               addMouseListener(new MouseListener() {
+                       
+                       @Override
+                       public void mouseUp(MouseEvent e) {
+                               
+                       }
+                       
+                       @Override
+                       public void mouseDown(MouseEvent e) {
+                               // store and reset selection
+                               int prev = selectedValueIndex;
+                               selectedValueIndex = -1;
+                               
+                               // locate closest ColorValue, and select it.
+                               int d = Integer.MAX_VALUE;
+                               for (int i = 0; i <= last; i++) {
+                                       int x = coords[i*2];
+                               int y = coords[i*2+1];
+                               int dx = Math.abs(x - e.x);
+                               int dy = Math.abs(y - e.y);
+                               if ((dx < size) &&
+                                       (dy < size)) {
+                                       int dd = dx+dy;
+                                       if (dd < d) {
+                                               selectedValueIndex = i;
+                                               d = dd;
+                                       }
+                               }
+                               }
+                               // if selection was changed, update it.
+                               if (prev != selectedValueIndex) {
+                                       updateSelection();
+                                       redraw();
+                               }
+                       }
+                       
+                       @Override
+                       public void mouseDoubleClick(MouseEvent e) {
+                               
+                       }
+               });
+               if ((style&SWT.READ_ONLY) == 0) {
+                       addMouseMoveListener(new MouseMoveListener() {
+                               
+                               @Override
+                               public void mouseMove(MouseEvent e) {
+                                       if ((e.stateMask & SWT.BUTTON1)>0) {
+                                               if (selectedValueIndex > 0 && selectedValueIndex < last) {
+                                                       double d;
+                                                       if ((ColorGradientAdjustingCanvas.this.style | SWT.HORIZONTAL) > 0) {
+                                                               d = (double)e.x/(double)width;
+                                                       } else {
+                                                               d = (double)e.y/(double)height;
+                                                       }
+                                                       double r = max-min;
+                                                       d *= r;
+                                                       d += min;
+                                                       double offset = r*0.015;
+                                                       if (d <= values[selectedValueIndex-1].getValue()+offset)
+                                                               d = values[selectedValueIndex-1].getValue()+offset;
+                                                       else if (d >= values[selectedValueIndex+1].getValue()-offset)
+                                                               d = values[selectedValueIndex+1].getValue()-offset;
+                                                       values[selectedValueIndex]._setValue(d);
+                                                       calculateCoords(width, height);
+                                                       redraw();
+                                               }
+                                       }
+                                       
+                               }
+                       });
+               }
+
+       }
+       
+       public void setGradient(ColorGradient gradient) {
+               int prevSize = 0;
+               if (values != null)
+                       prevSize = values.length;
+               
+               values = gradient.getColorValueArray();
+               last = values.length-1;
+               coords = new int[values.length*2];
+               super.setGradient(gradient);
+               if (selectedValueIndex >= 0 && prevSize != values.length) {
+                       selectedValueIndex = -1;
+                       updateSelection();
+               } else {
+                       updateSelection();
+               }
+       }
+       
+       double min;
+       double max;
+       
+       private void calculateCoords(int width, int height) {
+               this.width = width;
+               this.height = height;
+               
+               min = values[0].getValue();
+               max = values[last].getValue();
+               
+               if ((ColorGradientAdjustingCanvas.this.style & SWT.HORIZONTAL) > 0) {
+                       for (int i = 0; i <= last ; i++) {
+                               int y = height / 2;
+                               double d =  values[i].getValue();
+                               int x = (int)(((d-min)/(max-min))*(double)width);
+                               coords[i*2] = x;
+                               coords[i*2+1] = y;
+                       }
+               } else {
+                       for (int i = 0; i <= last ; i++) {
+                               int x = width / 2;
+                               double d =  values[i].getValue();
+                               int y = (int)(((d-min)/(max-min))*(double)height);
+                               coords[i*2] = x;
+                               coords[i*2+1] = y;
+                       }
+               }
+       }
+
+       
+       @Override
+       protected void paintGradient(GC gc, Rectangle clip) {
+               if (values != null && values.length > 0) {
+                       Image image = gradient.getGradientImage(clip.width,clip.height,ColorGradientAdjustingCanvas.this.style);
+                       gc.drawImage(image, 0, 0);
+                       image.dispose();        
+                       calculateCoords(clip.width, clip.height);
+
+                       Color white = new Color(gc.getDevice(), 255,255,255);
+                       Color yellow = new Color(gc.getDevice(), 255,230,0);
+                       Color black = new Color(gc.getDevice(), 0, 0, 0);
+                       for (int i = 0; i <= last ; i++) {
+                               int x = coords[i*2];
+                               int y = coords[i*2+1];
+                               gc.setForeground(black);
+                               if (selectedValueIndex == i)
+                                       gc.setBackground(yellow);
+                               else
+                                       gc.setBackground(white);
+                               if (i == 0 || i == last ) {
+                                       gc.fillRectangle(x-sized2, y-sized2, size, size);
+                                       gc.drawRectangle(x-sized2, y-sized2, size, size);
+                               } else {
+                                       gc.fillOval(x-sized2, y-sized2, size, size);
+                                       gc.drawOval(x-sized2, y-sized2, size, size);
+                               }
+                       }
+                       
+                       white.dispose();
+                       black.dispose();
+                       yellow.dispose();
+               } else {
+                       gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+                       gc.fillRectangle(clip);
+               }
+       }
+       
+       private ISelection selection = new StructuredSelection();
+       private List<ISelectionChangedListener> listeners = new ArrayList<>();
+
+       @Override
+       public void addSelectionChangedListener(ISelectionChangedListener listener) {
+               listeners.add(listener);
+       }
+
+       @Override
+       public ISelection getSelection() {
+       return selection;
+       }
+
+       @Override
+       public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+               listeners.remove(listener);
+       }
+
+       @Override
+       public void setSelection(ISelection selection) {
+               ColorValue value = (ColorValue)((StructuredSelection)selection).getFirstElement();
+               selectedValueIndex = gradient.getColorValues().indexOf(value);
+       }
+       
+       private void updateSelection() {
+               if (selectedValueIndex < 0)
+                       selection = new StructuredSelection();
+               else
+                       selection = new StructuredSelection(values[selectedValueIndex]);
+               
+               for (ISelectionChangedListener l : listeners) {
+                       l.selectionChanged(new SelectionChangedEvent(this, selection));
+               }
+       }
+       
+       public int getPointSize() {
+               return size;
+       }
+       
+       public void setPointSize(int size) {
+               this.size = size;
+               this.sized2 = size/2;
+       }
+       
+
+}