UIW: return correct color values
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / uiwidget / ObjectToScilabConverters.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.gui.uiwidget;
14
15 import java.awt.Color;
16 import java.awt.Cursor;
17 import java.awt.Dimension;
18 import java.awt.Insets;
19 import java.awt.LayoutManager;
20 import java.awt.Point;
21 import java.awt.Rectangle;
22 import java.awt.geom.Rectangle2D;
23 import java.io.File;
24 import java.net.URL;
25 import java.util.HashMap;
26 import java.util.Map;
27
28 import javax.swing.Icon;
29 import javax.swing.ImageIcon;
30 import javax.swing.KeyStroke;
31
32 import org.scilab.modules.gui.events.callback.CommonCallBack;
33 import org.scilab.modules.gui.utils.Position;
34 import org.scilab.modules.gui.utils.Size;
35 import org.scilab.modules.types.ScilabHandle;
36 import org.scilab.modules.types.ScilabStackPutter;
37 import org.scilab.modules.gui.uiwidget.callback.UICallback;
38
39 /**
40  * Class to provide easy way to convert a Java object into a Scilab variable and to put the result
41  * on the Scilab stack at the given position
42  */
43 public final class ObjectToScilabConverters {
44
45     private static final Map<Class, ObjectConverter> converters = new HashMap<Class, ObjectConverter>();
46
47     /**
48      * Put the Java object o on the Scilab stack at the position stackPos
49      * An ObjetConverter is searched and if none has been found an empty matrix is put
50      * @param o the Java object to convert and put.
51      * @param stackPos the Scilab stack position.
52      */
53     public static void putOnScilabStack(Object o, int stackPos) {
54         if (o == null) {
55             ScilabStackPutter.putEmpty(stackPos);
56         } else {
57             final Class clazz = o.getClass();
58             ObjectConverter converter;
59             if (o instanceof UIComponent) {
60                 converter = converters.get(UIComponent.class);
61             } else {
62                 converter = converters.get(clazz);
63             }
64
65             if (converter == null) {
66                 converter = getConverter(clazz);
67             }
68
69             if (converter == null) {
70                 ScilabStackPutter.putEmpty(stackPos);
71             } else {
72                 converter.convert(o, stackPos);
73             }
74         }
75     }
76
77     /**
78      * Get a converter for derived class
79      * @param clazz the class
80      * @return a converter
81      */
82     private static final ObjectConverter getConverter(Class clazz) {
83         for (Map.Entry<Class, ObjectConverter> entry : converters.entrySet()) {
84             Class key = entry.getKey();
85             if (key != Object.class && key.isAssignableFrom(clazz)) {
86                 return entry.getValue();
87             }
88         }
89
90         return null;
91     }
92
93     /**
94      * Interface to implement to parse an attribute String into a Java object
95      */
96     public static interface ObjectConverter {
97
98         /**
99          * Convert an object
100          * @param o the Object to put on the Scilab stack
101          */
102         public void convert(Object o, int stackPos);
103     }
104
105     static {
106         converters.put(Integer.class, new ObjectConverter() {
107             public void convert(Object o, int stackPos) {
108                 ScilabStackPutter.put(stackPos, (double) ((Integer) o).intValue());
109             }
110         });
111         converters.put(int[].class, new ObjectConverter() {
112             public void convert(Object o, int stackPos) {
113                 ScilabStackPutter.put(stackPos, (int[]) o, false, false);
114             }
115         });
116         converters.put(int[][].class, new ObjectConverter() {
117             public void convert(Object o, int stackPos) {
118                 ScilabStackPutter.put(stackPos, (int[][]) o, false, true);
119             }
120         });
121         converters.put(Double.class, new ObjectConverter() {
122             public void convert(Object o, int stackPos) {
123                 ScilabStackPutter.put(stackPos, ((Double) o).doubleValue());
124             }
125         });
126         converters.put(double[].class, new ObjectConverter() {
127             public void convert(Object o, int stackPos) {
128                 ScilabStackPutter.put(stackPos, (double[]) o, false);
129             }
130         });
131         converters.put(Double[].class, new ObjectConverter() {
132             public void convert(Object o, int stackPos) {
133                 Double[] d = (Double[]) o;
134                 double[] dd = new double[d.length];
135                 for (int i = 0; i < dd.length; i++) {
136                     dd[i] = d[i];
137                 }
138                 ScilabStackPutter.put(stackPos, dd, false);
139             }
140         });
141         converters.put(double[][].class, new ObjectConverter() {
142             public void convert(Object o, int stackPos) {
143                 ScilabStackPutter.put(stackPos, (double[][]) o, true);
144             }
145         });
146         converters.put(Boolean.class, new ObjectConverter() {
147             public void convert(Object o, int stackPos) {
148                 ScilabStackPutter.put(stackPos, ((Boolean) o).booleanValue());
149             }
150         });
151         converters.put(boolean[].class, new ObjectConverter() {
152             public void convert(Object o, int stackPos) {
153                 ScilabStackPutter.put(stackPos, (boolean[]) o, false);
154             }
155         });
156         converters.put(boolean[][].class, new ObjectConverter() {
157             public void convert(Object o, int stackPos) {
158                 ScilabStackPutter.put(stackPos, (boolean[][]) o, true);
159             }
160         });
161         converters.put(Float.class, new ObjectConverter() {
162             public void convert(Object o, int stackPos) {
163                 ScilabStackPutter.put(stackPos, (double) ((Float) o).floatValue());
164             }
165         });
166         converters.put(String.class, new ObjectConverter() {
167             public void convert(Object o, int stackPos) {
168                 ScilabStackPutter.put(stackPos, (String) o);
169             }
170         });
171         converters.put(String[].class, new ObjectConverter() {
172             public void convert(Object o, int stackPos) {
173                 ScilabStackPutter.put(stackPos, (String[]) o, false);
174             }
175         });
176         converters.put(String[][].class, new ObjectConverter() {
177             public void convert(Object o, int stackPos) {
178                 ScilabStackPutter.put(stackPos, (String[][]) o, true);
179             }
180         });
181         converters.put(Object.class, new ObjectConverter() {
182             public void convert(Object o, int stackPos) {
183                 ScilabStackPutter.put(stackPos, o.toString());
184             }
185         });
186         converters.put(Object[].class, new ObjectConverter() {
187             public void convert(Object o, int stackPos) {
188                 String[] strs = new String[((Object[]) o).length];
189                 for (int i = 0; i < strs.length; i++) {
190                     Object ob = ((Object[]) o)[i];
191                     strs[i] = ob == null ? "" : ob.toString();
192                 }
193                 ScilabStackPutter.put(stackPos, strs, false);
194             }
195         });
196         converters.put(Object[][].class, new ObjectConverter() {
197             public void convert(Object o, int stackPos) {
198                 String[][] strs = new String[((Object[][]) o).length][((Object[][]) o)[0].length];
199                 for (int i = 0; i < strs.length; i++) {
200                     for (int j = 0; j < strs[0].length; j++) {
201                         Object ob = ((Object[][]) o)[i][j];
202                         strs[i][j] = ob == null ? "" : ob.toString();
203                     }
204                 }
205                 ScilabStackPutter.put(stackPos, strs, true);
206             }
207         });
208         converters.put(Color.class, new ObjectConverter() {
209             public void convert(Object o, int stackPos) {
210                 Color c = (Color) o;
211                 float[] cc = new float[4];
212                 c.getRGBComponents(cc);
213                 ScilabStackPutter.put(stackPos, new double[] {(double) cc[0], (double) cc[1], (double) cc[2], (double) cc[3]} , false);
214             }
215         });
216         converters.put(Icon.class, new ObjectConverter() {
217             public void convert(Object o, int stackPos) {
218                 if (o instanceof ImageIcon) {
219                     ScilabStackPutter.put(stackPos, ((ImageIcon) o).getDescription());
220                 } else {
221                     ScilabStackPutter.put(stackPos, "Cannot convert " + o.toString());
222                 }
223             }
224         });
225         converters.put(ImageIcon.class, new ObjectConverter() {
226             public void convert(Object o, int stackPos) {
227                 ScilabStackPutter.put(stackPos, ((ImageIcon) o).getDescription());
228             }
229         });
230         converters.put(LayoutManager.class, new ObjectConverter() {
231             public void convert(Object o, int stackPos) {
232                 if (o instanceof LayoutManager) {
233                     ScilabStackPutter.put(stackPos, UILayoutFactory.getStringRepresentation((LayoutManager) o));
234                 } else {
235                     ScilabStackPutter.put(stackPos, "Cannot convert " + o.toString());
236                 }
237             }
238         });
239         converters.put(Insets.class, new ObjectConverter() {
240             public void convert(Object o, int stackPos) {
241                 Insets i = (Insets) o;
242                 ScilabStackPutter.put(stackPos, new double[] {(double) i.top, (double) i.left, (double) i.bottom, (double) i.right} , false);
243             }
244         });
245         converters.put(Rectangle.class, new ObjectConverter() {
246             public void convert(Object o, int stackPos) {
247                 Rectangle r = (Rectangle) o;
248                 ScilabStackPutter.put(stackPos, new double[] {(double) r.x, (double) r.y, (double) r.width, (double) r.height} , false);
249             }
250         });
251         converters.put(Rectangle2D.Double.class, new ObjectConverter() {
252             public void convert(Object o, int stackPos) {
253                 Rectangle2D.Double r = (Rectangle2D.Double) o;
254                 ScilabStackPutter.put(stackPos, new double[] {r.x, r.y, r.width, r.height} , false);
255             }
256         });
257         converters.put(Dimension.class, new ObjectConverter() {
258             public void convert(Object o, int stackPos) {
259                 Dimension d = (Dimension) o;
260                 ScilabStackPutter.put(stackPos, new double[] {(double) d.width, (double) d.height} , false);
261             }
262         });
263         converters.put(Point.class, new ObjectConverter() {
264             public void convert(Object o, int stackPos) {
265                 Point p = (Point) o;
266                 ScilabStackPutter.put(stackPos, new double[] {(double) p.x, (double) p.y} , false);
267             }
268         });
269         converters.put(Position.class, new ObjectConverter() {
270             public void convert(Object o, int stackPos) {
271                 Position p = (Position) o;
272                 ScilabStackPutter.put(stackPos, new double[] {(double) p.getX(), (double) p.getY()} , false);
273             }
274         });
275         converters.put(Size.class, new ObjectConverter() {
276             public void convert(Object o, int stackPos) {
277                 Size s = (Size) o;
278                 ScilabStackPutter.put(stackPos, new double[] {(double) s.getWidth(), (double) s.getHeight()} , false);
279             }
280         });
281         converters.put(CommonCallBack.class, new ObjectConverter() {
282             public void convert(Object o, int stackPos) {
283                 CommonCallBack cb = (CommonCallBack) o;
284                 ScilabStackPutter.put(stackPos, cb.getCommand());
285             }
286         });
287         converters.put(UIComponent.class, new ObjectConverter() {
288             public void convert(Object o, int stackPos) {
289                 UIComponent ui = (UIComponent) o;
290                 ScilabHandle handle = new ScilabHandle((long) (-ui.getUid() - 1));
291                 ScilabStackPutter.put(stackPos, handle);
292             }
293         });
294         converters.put(UIComponent[].class, new ObjectConverter() {
295             public void convert(Object o, int stackPos) {
296                 UIComponent[] uis = (UIComponent[]) o;
297                 long[][] hdls = new long[1][uis.length];
298                 for (int i = 0; i < uis.length; i++) {
299                     hdls[0][i] = (long) (-uis[i].getUid() - 1);
300                 }
301                 ScilabHandle handle = new ScilabHandle(hdls);
302                 ScilabStackPutter.put(stackPos, handle);
303             }
304         });
305         converters.put(File.class, new ObjectConverter() {
306             public void convert(Object o, int stackPos) {
307                 ScilabStackPutter.put(stackPos, o.toString());
308             }
309         });
310         converters.put(URL.class, new ObjectConverter() {
311             public void convert(Object o, int stackPos) {
312                 ScilabStackPutter.put(stackPos, o.toString());
313             }
314         });
315         converters.put(Cursor.class, new ObjectConverter() {
316             public void convert(Object o, int stackPos) {
317                 ScilabStackPutter.put(stackPos, UICursorFactory.getString((Cursor) o));
318             }
319         });
320         converters.put(KeyStroke.class, new ObjectConverter() {
321             public void convert(Object o, int stackPos) {
322                 KeyStroke ks = (KeyStroke) o;
323                 String s = o.toString();
324                 int pos = s.lastIndexOf(' ');
325                 if (pos != -1) {
326                     String key = s.substring(pos + 1);
327                     pos = s.lastIndexOf(' ', pos - 1);
328                     if (pos != -1) {
329                         s = s.substring(0, pos);
330                         ScilabStackPutter.put(stackPos, s + " " + key);
331                     } else {
332                         ScilabStackPutter.put(stackPos, key);
333                     }
334                 } else {
335                     ScilabStackPutter.put(stackPos, new double[0], false);
336                 }
337             }
338         });
339         converters.put(UICallback.class, new ObjectConverter() {
340             public void convert(Object o, int stackPos) {
341                 ScilabStackPutter.put(stackPos, o.toString());
342             }
343         });
344     }
345 }