during clone recursion on frameborder set new uid in parent ( frame or frameborder )
[scilab.git] / scilab / modules / graphic_objects / src / java / org / scilab / modules / graphic_objects / xmlloader / XMLDomLoader.java
1 package org.scilab.modules.graphic_objects.xmlloader;
2
3 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.*;
4
5 import java.io.File;
6 import java.util.HashMap;
7 import java.util.StringTokenizer;
8
9 import javax.xml.parsers.DocumentBuilder;
10 import javax.xml.parsers.DocumentBuilderFactory;
11
12 import org.scilab.modules.commons.CommonFileUtils;
13 import org.scilab.modules.commons.gui.FindIconHelper;
14 import org.scilab.modules.graphic_objects.builder.Builder;
15 import org.scilab.modules.graphic_objects.console.Console;
16 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
17 import org.scilab.modules.graphic_objects.graphicObject.GraphicObject;
18 import org.scilab.modules.graphic_objects.uicontrol.frame.border.FrameBorderType;
19 import org.w3c.dom.Document;
20 import org.w3c.dom.NamedNodeMap;
21 import org.w3c.dom.Node;
22 import org.w3c.dom.NodeList;
23
24 public class XMLDomLoader {
25
26     private enum ModelType {
27         BOOLEAN, BOOLEAN_ARRAY, DOUBLE, DOUBLE_ARRAY, STRING, STRING_ARRAY, INTEGER, INTEGER_ARRAY;
28     };
29
30     private static final int __NODE_SCILABGUI__ = -10;
31     private static final int __NODE_OUT__       = -20;
32     private static final int __NODE_IN__        = -30;
33     private static final int __NODE_TITLE__     = -40;
34
35     private static HashMap<String, Integer> nameToGO = new HashMap<String, Integer>();
36
37     private static HashMap<String, Pair<Integer, ModelType>> figPropToGO = new HashMap<String, Pair<Integer, ModelType>>();
38     private static HashMap<String, Pair<Integer, ModelType>> UiPropToGO = new HashMap<String, Pair<Integer, ModelType>>();
39     private static HashMap<String, Pair<Integer, ModelType>> MenuPropToGO = new HashMap<String, Pair<Integer, ModelType>>();
40     private static HashMap<String, Pair<Integer, ModelType>> BorderPropToGO = new HashMap<String, Pair<Integer, ModelType>>();
41
42
43     static {
44         // init map to convert control name to id
45         nameToGO.put("figure", __GO_FIGURE__);
46         nameToGO.put("frame", __GO_UI_FRAME__);
47         nameToGO.put("layer", __GO_UI_LAYER__);
48         nameToGO.put("pushbutton", __GO_UI_PUSHBUTTON__);
49         nameToGO.put("text", __GO_UI_TEXT__);
50         nameToGO.put("checkbox", __GO_UI_CHECKBOX__);
51         nameToGO.put("textfield", __GO_UI_EDIT__);
52         nameToGO.put("edit", __GO_UI_EDIT__);
53         nameToGO.put("image", __GO_UI_IMAGE__);
54         nameToGO.put("picture", __GO_UI_IMAGE__);
55         nameToGO.put("listbox", __GO_UI_LISTBOX__);
56         nameToGO.put("popupmenu", __GO_UI_POPUPMENU__);
57         nameToGO.put("radiobutton", __GO_UI_RADIOBUTTON__);
58         nameToGO.put("slider", __GO_UI_SLIDER__);
59         nameToGO.put("table", __GO_UI_TABLE__);
60         nameToGO.put("tab", __GO_UI_TAB__);
61
62         nameToGO.put("menu", __GO_UIMENU__);
63         nameToGO.put("contextmenu", __GO_UICONTEXTMENU__);
64
65         nameToGO.put("axes", __GO_AXES__);
66
67         nameToGO.put("borders", __GO_UI_FRAME_BORDER__);
68         nameToGO.put("out", __NODE_OUT__);
69         nameToGO.put("in", __NODE_IN__);
70         nameToGO.put("title", __NODE_TITLE__);
71
72         /* system */
73         nameToGO.put("scilabgui", __NODE_SCILABGUI__);
74
75         //fill map of property -> {GO, ModelType}
76
77         //figure property list
78         figPropToGO.put("figure_position", new Pair<Integer, ModelType>(__GO_POSITION__, ModelType.INTEGER_ARRAY));
79         figPropToGO.put("figure_size", new Pair<Integer, ModelType>(__GO_SIZE__, ModelType.INTEGER_ARRAY));
80         figPropToGO.put("axes_size", new Pair<Integer, ModelType>(__GO_AXES_SIZE__, ModelType.INTEGER_ARRAY));
81         figPropToGO.put("auto_resize", new Pair<Integer, ModelType>(__GO_AUTORESIZE__, ModelType.BOOLEAN));
82         figPropToGO.put("view_port", new Pair<Integer, ModelType>(__GO_VIEWPORT__, ModelType.INTEGER_ARRAY));
83         figPropToGO.put("figure_name", new Pair<Integer, ModelType>(__GO_NAME__, ModelType.STRING));
84         figPropToGO.put("figure_id", new Pair<Integer, ModelType>(__GO_ID__, ModelType.INTEGER));
85         figPropToGO.put("info_message", new Pair<Integer, ModelType>(__GO_INFO_MESSAGE__, ModelType.STRING));
86         figPropToGO.put("pixel_drawing_mode", new Pair<Integer, ModelType>(__GO_PIXEL_DRAWING_MODE__, ModelType.STRING));
87         figPropToGO.put("anti_aliasing", new Pair<Integer, ModelType>(__GO_ANTIALIASING__, ModelType.BOOLEAN));
88         figPropToGO.put("immediate_drawing", new Pair<Integer, ModelType>(__GO_IMMEDIATE_DRAWING__, ModelType.BOOLEAN));
89         figPropToGO.put("background", new Pair<Integer, ModelType>(__GO_BACKGROUND__, ModelType.INTEGER));
90         figPropToGO.put("visible", new Pair<Integer, ModelType>(__GO_VISIBLE__, ModelType.BOOLEAN));
91         figPropToGO.put("rotation_style", new Pair<Integer, ModelType>(__GO_ROTATION_TYPE__, ModelType.STRING));
92         figPropToGO.put("event_handler", new Pair<Integer, ModelType>(__GO_EVENTHANDLER_NAME__, ModelType.STRING));
93         figPropToGO.put("event_handler_enable", new Pair<Integer, ModelType>(__GO_EVENTHANDLER_ENABLE__, ModelType.BOOLEAN));
94         figPropToGO.put("resizefcn", new Pair<Integer, ModelType>(__GO_RESIZEFCN__, ModelType.STRING));
95         figPropToGO.put("closerequestfcn", new Pair<Integer, ModelType>(__GO_CLOSEREQUESTFCN__, ModelType.STRING));
96         figPropToGO.put("resize", new Pair<Integer, ModelType>(__GO_RESIZE__, ModelType.BOOLEAN));
97         figPropToGO.put("toolbar", new Pair<Integer, ModelType>(__GO_TOOLBAR__, ModelType.INTEGER));
98         figPropToGO.put("toolbar_visible", new Pair<Integer, ModelType>(__GO_TOOLBAR_VISIBLE__, ModelType.BOOLEAN));
99         figPropToGO.put("menubar", new Pair<Integer, ModelType>(__GO_MENUBAR__, ModelType.INTEGER));
100         figPropToGO.put("menubar_visible", new Pair<Integer, ModelType>(__GO_MENUBAR_VISIBLE__, ModelType.BOOLEAN));
101         figPropToGO.put("infobar_visible", new Pair<Integer, ModelType>(__GO_INFOBAR_VISIBLE__, ModelType.BOOLEAN));
102         figPropToGO.put("dockable", new Pair<Integer, ModelType>(__GO_DOCKABLE__, ModelType.BOOLEAN));
103         figPropToGO.put("layout", new Pair<Integer, ModelType>(__GO_LAYOUT__, ModelType.INTEGER));
104         figPropToGO.put("default_axes", new Pair<Integer, ModelType>(__GO_DEFAULT_AXES__, ModelType.BOOLEAN));
105         figPropToGO.put("icon", new Pair<Integer, ModelType>(__GO_UI_ICON__, ModelType.STRING));
106         figPropToGO.put("tag", new Pair<Integer, ModelType>(__GO_TAG__, ModelType.STRING));
107         figPropToGO.put("grid_opt_grid", new Pair<Integer, ModelType>(__GO_GRID_OPT_GRID__, ModelType.INTEGER_ARRAY));
108         figPropToGO.put("grid_opt_padding", new Pair<Integer, ModelType>(__GO_GRID_OPT_PADDING__, ModelType.INTEGER_ARRAY));
109         figPropToGO.put("border_opt_padding", new Pair<Integer, ModelType>(__GO_BORDER_OPT_PADDING__, ModelType.INTEGER_ARRAY));
110
111         //uicontrol property list
112         UiPropToGO.put("position", new Pair<Integer, ModelType>(__GO_POSITION__, ModelType.INTEGER));
113         UiPropToGO.put("backgroundcolor", new Pair<Integer, ModelType>(__GO_UI_BACKGROUNDCOLOR__, ModelType.DOUBLE_ARRAY));
114         UiPropToGO.put("enable", new Pair<Integer, ModelType>(__GO_UI_ENABLE__, ModelType.BOOLEAN));
115         UiPropToGO.put("fontangle", new Pair<Integer, ModelType>(__GO_UI_FONTANGLE__, ModelType.STRING));
116         UiPropToGO.put("fontname", new Pair<Integer, ModelType>(__GO_UI_FONTNAME__, ModelType.STRING));
117         UiPropToGO.put("fontsize", new Pair<Integer, ModelType>(__GO_UI_FONTSIZE__, ModelType.DOUBLE));
118         UiPropToGO.put("fontunits", new Pair<Integer, ModelType>(__GO_UI_FONTUNITS__, ModelType.STRING));
119         UiPropToGO.put("fontweight", new Pair<Integer, ModelType>(__GO_UI_FONTWEIGHT__, ModelType.STRING));
120         UiPropToGO.put("foregroundcolor", new Pair<Integer, ModelType>(__GO_UI_FOREGROUNDCOLOR__, ModelType.INTEGER_ARRAY));
121         UiPropToGO.put("horizontalalignment", new Pair<Integer, ModelType>(__GO_UI_HORIZONTALALIGNMENT__, ModelType.STRING));
122         UiPropToGO.put("listboxtop", new Pair<Integer, ModelType>(__GO_UI_LISTBOXTOP__, ModelType.INTEGER_ARRAY));
123         UiPropToGO.put("max", new Pair<Integer, ModelType>(__GO_UI_MAX__, ModelType.DOUBLE));
124         UiPropToGO.put("min", new Pair<Integer, ModelType>(__GO_UI_MIN__, ModelType.DOUBLE));
125         UiPropToGO.put("position", new Pair<Integer, ModelType>(__GO_POSITION__, ModelType.DOUBLE_ARRAY));
126         UiPropToGO.put("relief", new Pair<Integer, ModelType>(__GO_UI_RELIEF__, ModelType.STRING));
127         UiPropToGO.put("sliderstep", new Pair<Integer, ModelType>(__GO_UI_SLIDERSTEP__, ModelType.DOUBLE_ARRAY));
128         UiPropToGO.put("string", new Pair<Integer, ModelType>(__GO_UI_STRING__, ModelType.STRING_ARRAY));
129         UiPropToGO.put("tooltipstring", new Pair<Integer, ModelType>(__GO_UI_TOOLTIPSTRING__, ModelType.STRING_ARRAY));
130         UiPropToGO.put("units", new Pair<Integer, ModelType>(__GO_UI_UNITS__, ModelType.STRING));
131         UiPropToGO.put("value", new Pair<Integer, ModelType>(__GO_UI_VALUE__, ModelType.DOUBLE_ARRAY));
132         UiPropToGO.put("verticalalignment", new Pair<Integer, ModelType>(__GO_UI_VERTICALALIGNMENT__, ModelType.STRING));
133         UiPropToGO.put("visible", new Pair<Integer, ModelType>(__GO_VISIBLE__, ModelType.BOOLEAN));
134         UiPropToGO.put("layout", new Pair<Integer, ModelType>(__GO_LAYOUT__, ModelType.INTEGER));
135         UiPropToGO.put("callback", new Pair<Integer, ModelType>(__GO_CALLBACK__, ModelType.STRING));
136         UiPropToGO.put("callback_type", new Pair<Integer, ModelType>(__GO_CALLBACKTYPE__, ModelType.INTEGER));
137         UiPropToGO.put("gridbaggrid", new Pair<Integer, ModelType>(__GO_UI_GRIDBAG_GRID__, ModelType.INTEGER_ARRAY));
138         UiPropToGO.put("gridbagweight", new Pair<Integer, ModelType>(__GO_UI_GRIDBAG_WEIGHT__, ModelType.DOUBLE_ARRAY));
139         UiPropToGO.put("gridbagfill", new Pair<Integer, ModelType>(__GO_UI_GRIDBAG_FILL__, ModelType.INTEGER));
140         UiPropToGO.put("gridbaganchor", new Pair<Integer, ModelType>(__GO_UI_GRIDBAG_ANCHOR__, ModelType.INTEGER));
141         UiPropToGO.put("gridbagpadding", new Pair<Integer, ModelType>(__GO_UI_GRIDBAG_PADDING__, ModelType.INTEGER_ARRAY));
142         UiPropToGO.put("gridbagpreferredsize", new Pair<Integer, ModelType>(__GO_UI_GRIDBAG_PREFERREDSIZE__, ModelType.INTEGER_ARRAY));
143         UiPropToGO.put("borderposition", new Pair<Integer, ModelType>(__GO_UI_BORDER_POSITION__, ModelType.INTEGER));
144         UiPropToGO.put("borderpreferredsize", new Pair<Integer, ModelType>(__GO_UI_BORDER_PREFERREDSIZE__, ModelType.INTEGER_ARRAY));
145         UiPropToGO.put("margins", new Pair<Integer, ModelType>(__GO_MARGINS__, ModelType.DOUBLE_ARRAY));
146         UiPropToGO.put("groupname", new Pair<Integer, ModelType>(__GO_UI_GROUP_NAME__, ModelType.STRING));
147         UiPropToGO.put("icon", new Pair<Integer, ModelType>(__GO_UI_ICON__, ModelType.STRING));
148         UiPropToGO.put("scrollable", new Pair<Integer, ModelType>(__GO_UI_SCROLLABLE__, ModelType.BOOLEAN));
149         UiPropToGO.put("gridoptgrid", new Pair<Integer, ModelType>(__GO_GRID_OPT_GRID__, ModelType.INTEGER_ARRAY));
150         UiPropToGO.put("gridoptpadding", new Pair<Integer, ModelType>(__GO_GRID_OPT_PADDING__, ModelType.INTEGER_ARRAY));
151         UiPropToGO.put("borderoptpadding", new Pair<Integer, ModelType>(__GO_BORDER_OPT_PADDING__, ModelType.INTEGER_ARRAY));
152         UiPropToGO.put("tag", new Pair<Integer, ModelType>(__GO_TAG__, ModelType.STRING));
153
154         //border property list
155         BorderPropToGO.put("style", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_STYLE__, ModelType.INTEGER));
156         BorderPropToGO.put("type", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_TYPE__, ModelType.INTEGER));
157         BorderPropToGO.put("position", new Pair<Integer, ModelType>(__GO_POSITION__, ModelType.DOUBLE_ARRAY));
158         BorderPropToGO.put("hlout", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_HIGHLIGHT_OUT__, ModelType.STRING));
159         BorderPropToGO.put("hlin", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_HIGHLIGHT_IN__, ModelType.STRING));
160         BorderPropToGO.put("shadowout", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_SHADOW_OUT__, ModelType.STRING));
161         BorderPropToGO.put("shadowin", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_SHADOW_IN__, ModelType.STRING));
162         BorderPropToGO.put("titleposition", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_POSITION__, ModelType.DOUBLE_ARRAY));
163         BorderPropToGO.put("hl", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_HIGHLIGHT_OUT__, ModelType.STRING));
164         BorderPropToGO.put("shadow", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_SHADOW_OUT__, ModelType.STRING));
165         BorderPropToGO.put("color", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_COLOR__, ModelType.STRING));
166         BorderPropToGO.put("thickness", new Pair<Integer, ModelType>(__GO_LINE_THICKNESS__, ModelType.INTEGER));
167         BorderPropToGO.put("rounded", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_ROUNDED__, ModelType.BOOLEAN));
168         BorderPropToGO.put("title", new Pair<Integer, ModelType>(__GO_TITLE__, ModelType.STRING));
169         BorderPropToGO.put("justification", new Pair<Integer, ModelType>(__GO_UI_FRAME_BORDER_JUSTIFICATION__, ModelType.INTEGER));
170         BorderPropToGO.put("fontangle", new Pair<Integer, ModelType>(__GO_UI_FONTANGLE__, ModelType.STRING));
171         BorderPropToGO.put("fontname", new Pair<Integer, ModelType>(__GO_UI_FONTNAME__, ModelType.STRING));
172         BorderPropToGO.put("fontsize", new Pair<Integer, ModelType>(__GO_UI_FONTSIZE__, ModelType.INTEGER));
173         BorderPropToGO.put("fontweight", new Pair<Integer, ModelType>(__GO_UI_FONTWEIGHT__, ModelType.STRING));
174
175         MenuPropToGO.put("enable", new Pair<Integer, ModelType>(__GO_UI_ENABLE__, ModelType.BOOLEAN));
176         MenuPropToGO.put("foreground", new Pair<Integer, ModelType>(__GO_UI_FOREGROUNDCOLOR__, ModelType.DOUBLE_ARRAY));
177         MenuPropToGO.put("label", new Pair<Integer, ModelType>(__GO_UI_LABEL__, ModelType.STRING));
178         MenuPropToGO.put("hidden", new Pair<Integer, ModelType>(__GO_HIDDEN__, ModelType.BOOLEAN));
179         MenuPropToGO.put("visible", new Pair<Integer, ModelType>(__GO_VISIBLE__, ModelType.BOOLEAN));
180         MenuPropToGO.put("callback", new Pair<Integer, ModelType>(__GO_CALLBACK__, ModelType.STRING));
181         MenuPropToGO.put("callback_type", new Pair<Integer, ModelType>(__GO_CALLBACKTYPE__, ModelType.INTEGER));
182         MenuPropToGO.put("checked", new Pair<Integer, ModelType>(__GO_UI_CHECKED__, ModelType.BOOLEAN));
183         MenuPropToGO.put("icon", new Pair<Integer, ModelType>(__GO_UI_ICON__, ModelType.STRING));
184         MenuPropToGO.put("tag", new Pair<Integer, ModelType>(__GO_TAG__, ModelType.STRING));
185     }
186
187     private String filename = "";
188     private Integer figure = 0;
189     private Boolean figVisible = true;
190
191     public XMLDomLoader(String filename) {
192         this.filename = filename;
193     }
194
195     public int parse() {
196         return parse(filename);
197     }
198
199     public int parse(String filename) {
200         try {
201             this.filename = filename;
202             File f = new File(filename);
203             String currentPath = "";
204
205             if (f.exists()) {
206                 //add filename filepath in ScilabSwingUtilities paths
207                 if (f.isAbsolute()) {
208                     String filePath = f.getAbsolutePath();
209                     currentPath = filePath.substring(0, filePath.lastIndexOf(File.separator));
210                     FindIconHelper.addThemePath(currentPath);
211                 } else {
212                     String initialDirectoryPath = CommonFileUtils.getCWD();
213                     String filePath = "";
214                     Integer index = filename.lastIndexOf(File.separator);
215                     if (index != -1) {
216                         filePath = filename.substring(0, index);
217                     }
218
219                     currentPath = initialDirectoryPath + File.separator + filePath;
220                     FindIconHelper.addThemePath(currentPath);
221
222                     f = new File(currentPath + File.separator + filename);
223                 }
224             } else {
225                 //try to find file in currentPath
226                 if (f.isAbsolute()) {
227                     //failed
228                     return 1;
229                 } else {
230                     String initialDirectoryPath = CommonFileUtils.getCWD();
231                     String filePath = "";
232                     Integer index = filename.lastIndexOf(File.separator);
233                     if (index != -1) {
234                         filePath = filename.substring(0, index);
235                     }
236
237                     currentPath = initialDirectoryPath + File.separator + filePath;
238                 }
239
240                 f = new File(currentPath + File.separator + filename);
241                 if (f.exists() == false) {
242                     return 1;
243                 }
244             }
245
246             DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
247             Document doc = dBuilder.parse(f);
248             doc.getDocumentElement().normalize();
249
250             if (doc.hasChildNodes()) {
251                 parseNode(0, doc.getChildNodes());
252             }
253         } catch (Exception e) {
254             e.printStackTrace();
255         }
256
257         //update visible property of main window
258         GraphicController.getController().setProperty(figure, __GO_VISIBLE__, figVisible);
259         return figure;
260     }
261
262     private void parseNode(Integer parent, NodeList nodes) {
263         for (int i = nodes.getLength() - 1 ; i >= 0;  i--) {
264             Node childNode = nodes.item(i);
265             Integer child = 0;
266
267             // make sure it's element node.
268             if (childNode.getNodeType() == Node.ELEMENT_NODE) {
269                 // get node name and value
270                 int nodeType = nameToGO.get(childNode.getNodeName());
271                 switch (nodeType) {
272                     case __GO_FIGURE__: {
273                         child = createFigure(childNode);
274                         figure = child;
275                         break;
276                     }
277
278                     case __GO_UI_CHECKBOX__:
279                     case __GO_UI_EDIT__:
280                     case __GO_UI_FRAME__:
281                     case __GO_UI_IMAGE__:
282                     case __GO_UI_LAYER__:
283                     case __GO_UI_LISTBOX__:
284                     case __GO_UI_POPUPMENU__:
285                     case __GO_UI_PUSHBUTTON__:
286                     case __GO_UI_RADIOBUTTON__:
287                     case __GO_UI_SLIDER__:
288                     case __GO_UI_TABLE__:
289                     case __GO_UI_TAB__:
290                     case __GO_UI_TEXT__: {
291                         child = createUiControl(nodeType, parent, childNode);
292                         break;
293                     }
294
295                     case __GO_AXES__ : {
296                         child = Builder.createSubWin(parent);
297                         break;
298                     }
299
300                     case __GO_UI_FRAME_BORDER__: {
301                         child = createBorder(childNode);
302                         GraphicController.getController().setProperty(parent, __GO_UI_FRAME_BORDER__, child);
303                         break;
304                     }
305
306                     case __NODE_OUT__: {
307                         break;
308                     }
309
310                     case __NODE_IN__: {
311                         break;
312                     }
313
314                     case __NODE_TITLE__: {
315                         break;
316                     }
317
318                     case __NODE_SCILABGUI__ : {
319                         //check version
320                         Node nodeVersion = childNode.getAttributes().getNamedItem("version");
321                         double version = Double.parseDouble(nodeVersion.getNodeValue());
322                         if (version > 1.0) {
323                             //call version manager ^^
324                         }
325
326                         Integer console = Console.getConsole().getIdentifier();
327                         //set usedeprecatedskin flag
328                         setBooleanAttribute(console, __GO_USEDEPRECATEDLF__, childNode.getAttributes(), "usedeprecatedskin");
329                         break;
330                     }
331
332                     case __GO_UICONTEXTMENU__: {
333                         break;
334                     }
335                     case __GO_UIMENU__: {
336                         child = createUiMenu(parent, childNode);
337                         break;
338                     }
339
340
341                     default: {
342                         break;
343                     }
344                 }
345
346                 if (parent != 0 && child != 0) {
347                     GraphicController.getController().setGraphicObjectRelationship(parent, child);
348                 }
349
350                 if (childNode.hasChildNodes()) {
351                     parseNode(child, childNode.getChildNodes());
352                 }
353
354             }
355         }
356     }
357
358     private Integer createBorder(Node node) {
359         GraphicController controller = GraphicController.getController();
360         Integer uib = controller.askObject(GraphicObject.getTypeFromName(__GO_UI_FRAME_BORDER__));
361
362         NamedNodeMap attr = node.getAttributes();
363
364         Node styleNode = attr.getNamedItem("style");
365         if (styleNode != null) {
366             Integer style = FrameBorderType.stringToEnum(styleNode.getNodeValue()).ordinal();
367             controller.setProperty(uib, __GO_UI_FRAME_BORDER_STYLE__, style);
368             attr.removeNamedItem("style");
369         }
370
371         //frame borders are always hidden
372         controller.setProperty(uib,  __GO_HIDDEN__, true);
373
374         for (int i = 0 ; i < attr.getLength() ; i++) {
375             Node prop = attr.item(i);
376             Pair<Integer, ModelType> pair = BorderPropToGO.get(prop.getNodeName());
377
378             ModelType modelType = pair.getSecond();
379             switch (modelType) {
380                 case BOOLEAN:
381                     controller.setProperty(uib, pair.getFirst(), getAttributeAsBoolean(prop.getNodeValue()));
382                     break;
383                 case BOOLEAN_ARRAY :
384                     controller.setProperty(uib, pair.getFirst(), getAttributeAsBooleanArray(prop.getNodeValue()));
385                     break;
386                 case DOUBLE:
387                     controller.setProperty(uib, pair.getFirst(), getAttributeAsDouble(prop.getNodeValue()));
388                     break;
389                 case DOUBLE_ARRAY:
390                     controller.setProperty(uib, pair.getFirst(), getAttributeAsDoubleArray(prop.getNodeValue()));
391                     break;
392                 case INTEGER:
393                     controller.setProperty(uib, pair.getFirst(), getAttributeAsInteger(prop.getNodeValue()));
394                     break;
395                 case INTEGER_ARRAY:
396                     controller.setProperty(uib, pair.getFirst(), getAttributeAsIntegerArray(prop.getNodeValue()));
397                     break;
398                 case STRING:
399                     controller.setProperty(uib, pair.getFirst(), getAttributeAsString(prop.getNodeValue()));
400                     break;
401                 case STRING_ARRAY:
402                     controller.setProperty(uib, pair.getFirst(), getAttributeAsStringArray(prop.getNodeValue()));
403                     break;
404                 default:
405                     System.out.println("missing type");
406                     break;
407             }
408         }
409
410         //manage children here to avoid trouble on draw without children in SwingView
411         if (node.hasChildNodes()) {
412             NodeList list = node.getChildNodes();
413             for (int i = 0 ; i < list.getLength() ; i++) {
414                 Node childNode = list.item(i);
415                 if (childNode.getNodeType() == Node.ELEMENT_NODE) {
416                     Integer child = createBorder(childNode);
417                     String nodeName = childNode.getNodeName();
418                     if (nodeName.equals("title")) {
419                         GraphicController.getController().setProperty(uib, __GO_UI_FRAME_BORDER_TITLE__, child);
420                         GraphicController.getController().setGraphicObjectRelationship(uib, child);
421                     } else if (nodeName.equals("out")) {
422                         GraphicController.getController().setProperty(uib, __GO_UI_FRAME_BORDER_OUT_BORDER__, child);
423                         GraphicController.getController().setGraphicObjectRelationship(uib, child);
424                     } else if (nodeName.equals("in")) {
425                         GraphicController.getController().setProperty(uib, __GO_UI_FRAME_BORDER_IN_BORDER__, child);
426                         GraphicController.getController().setGraphicObjectRelationship(uib, child);
427                     }
428                 }
429             }
430         }
431         return uib;
432     }
433
434     private Integer createFigure(Node node) {
435         GraphicController controller = GraphicController.getController();
436         Boolean dockable = true;
437         Integer menubar = 1;
438         Integer toolbar = 1;
439         Boolean default_axes = true;
440
441         NamedNodeMap attr = node.getAttributes();
442         //dockable
443         Node tempnode = attr.getNamedItem("dockable");
444         if (tempnode != null) {
445             dockable = getAttributeAsBoolean(tempnode.getNodeValue());
446             attr.removeNamedItem("dockable");
447         }
448         //menubar
449         tempnode = attr.getNamedItem("menubar");
450         if (tempnode != null) {
451             menubar = getAttributeAsInteger(tempnode.getNodeValue());
452             attr.removeNamedItem("menubar");
453         }
454         //toolbar
455         tempnode = attr.getNamedItem("toolbar");
456         if (tempnode != null) {
457             toolbar = getAttributeAsInteger(tempnode.getNodeValue());
458             attr.removeNamedItem("toolbar");
459         }
460         //default_axes
461         tempnode = attr.getNamedItem("default_axes");
462         if (tempnode != null) {
463             default_axes = getAttributeAsBoolean(tempnode.getNodeValue());
464             attr.removeNamedItem("default_axes");
465         }
466         //visible
467         tempnode = attr.getNamedItem("visible");
468         if (tempnode != null) {
469             figVisible = getAttributeAsBoolean(tempnode.getNodeValue());
470             attr.removeNamedItem("visible");
471         }
472
473         Integer fig = Builder.createFigure(dockable, menubar, toolbar, default_axes, false);
474
475         for (int i = 0 ; i < attr.getLength() ; i++) {
476             Node prop = attr.item(i);
477             Pair<Integer, ModelType> pair = figPropToGO.get(prop.getNodeName());
478
479             ModelType type = pair.getSecond();
480             switch (type) {
481                 case BOOLEAN:
482                     controller.setProperty(fig, pair.getFirst(), getAttributeAsBoolean(prop.getNodeValue()));
483                     break;
484                 case BOOLEAN_ARRAY:
485                     controller.setProperty(fig, pair.getFirst(), getAttributeAsBooleanArray(prop.getNodeValue()));
486                     break;
487                 case DOUBLE:
488                     controller.setProperty(fig, pair.getFirst(), getAttributeAsDouble(prop.getNodeValue()));
489                     break;
490                 case DOUBLE_ARRAY:
491                     controller.setProperty(fig, pair.getFirst(), getAttributeAsDoubleArray(prop.getNodeValue()));
492                     break;
493                 case INTEGER:
494                     controller.setProperty(fig, pair.getFirst(), getAttributeAsInteger(prop.getNodeValue()));
495                     break;
496                 case INTEGER_ARRAY:
497                     controller.setProperty(fig, pair.getFirst(), getAttributeAsIntegerArray(prop.getNodeValue()));
498                     break;
499                 case STRING:
500                     controller.setProperty(fig, pair.getFirst(), getAttributeAsString(prop.getNodeValue()));
501                     break;
502                 case STRING_ARRAY:
503                     controller.setProperty(fig, pair.getFirst(), getAttributeAsStringArray(prop.getNodeValue()));
504                     break;
505                 default:
506                     System.out.println("missing type");
507                     break;
508             }
509         }
510
511         return fig;
512     }
513
514     private Integer createUiControl(Integer type, Integer parent, Node node) {
515         GraphicController controller = GraphicController.getController();
516         NamedNodeMap attr = node.getAttributes();
517
518         /*for frame we have to take care of scrollable property*/
519         if (type == __GO_UI_FRAME__) {
520             Node item = attr.getNamedItem("scrollable");
521             if (item != null && item.getNodeValue().equals("on")) {
522                 type = __GO_UI_FRAME_SCROLLABLE__;
523             }
524         }
525
526         Integer uic = GraphicController.getController().askObject(GraphicObject.getTypeFromName(type));
527         controller.setProperty(uic, __GO_VISIBLE__, true);
528
529         for (int i = 0 ; i < attr.getLength() ; i++) {
530             Node prop = attr.item(i);
531             Pair<Integer, ModelType> pair = UiPropToGO.get(prop.getNodeName());
532
533             ModelType modelType = pair.getSecond();
534             switch (modelType) {
535                 case BOOLEAN:
536                     controller.setProperty(uic, pair.getFirst(), getAttributeAsBoolean(prop.getNodeValue()));
537                     break;
538                 case BOOLEAN_ARRAY :
539                     controller.setProperty(uic, pair.getFirst(), getAttributeAsBooleanArray(prop.getNodeValue()));
540                     break;
541                 case DOUBLE:
542                     controller.setProperty(uic, pair.getFirst(), getAttributeAsDouble(prop.getNodeValue()));
543                     break;
544                 case DOUBLE_ARRAY:
545                     controller.setProperty(uic, pair.getFirst(), getAttributeAsDoubleArray(prop.getNodeValue()));
546                     break;
547                 case INTEGER:
548                     controller.setProperty(uic, pair.getFirst(), getAttributeAsInteger(prop.getNodeValue()));
549                     break;
550                 case INTEGER_ARRAY:
551                     controller.setProperty(uic, pair.getFirst(), getAttributeAsIntegerArray(prop.getNodeValue()));
552                     break;
553                 case STRING:
554                     controller.setProperty(uic, pair.getFirst(), getAttributeAsString(prop.getNodeValue()));
555                     break;
556                 case STRING_ARRAY:
557                     controller.setProperty(uic, pair.getFirst(), getAttributeAsStringArray(prop.getNodeValue()));
558                     break;
559                 default:
560                     System.out.println("missing type");
561                     break;
562             }
563         }
564
565         return uic;
566     }
567
568     private Integer createUiMenu(Integer parent, Node node) {
569         GraphicController controller = GraphicController.getController();
570         NamedNodeMap attr = node.getAttributes();
571
572         Integer uim = GraphicController.getController().askObject(GraphicObject.getTypeFromName(__GO_UIMENU__));
573         controller.setProperty(uim, __GO_VISIBLE__, true);
574
575         for (int i = 0 ; i < attr.getLength() ; i++) {
576             Node prop = attr.item(i);
577             Pair<Integer, ModelType> pair = MenuPropToGO.get(prop.getNodeName());
578             System.out.println("node : " + prop.getNodeName());
579             ModelType modelType = pair.getSecond();
580             switch (modelType) {
581                 case BOOLEAN:
582                     controller.setProperty(uim, pair.getFirst(), getAttributeAsBoolean(prop.getNodeValue()));
583                     break;
584                 case BOOLEAN_ARRAY :
585                     controller.setProperty(uim, pair.getFirst(), getAttributeAsBooleanArray(prop.getNodeValue()));
586                     break;
587                 case DOUBLE:
588                     controller.setProperty(uim, pair.getFirst(), getAttributeAsDouble(prop.getNodeValue()));
589                     break;
590                 case DOUBLE_ARRAY:
591                     controller.setProperty(uim, pair.getFirst(), getAttributeAsDoubleArray(prop.getNodeValue()));
592                     break;
593                 case INTEGER:
594                     controller.setProperty(uim, pair.getFirst(), getAttributeAsInteger(prop.getNodeValue()));
595                     break;
596                 case INTEGER_ARRAY:
597                     controller.setProperty(uim, pair.getFirst(), getAttributeAsIntegerArray(prop.getNodeValue()));
598                     break;
599                 case STRING:
600                     controller.setProperty(uim, pair.getFirst(), getAttributeAsString(prop.getNodeValue()));
601                     break;
602                 case STRING_ARRAY:
603                     controller.setProperty(uim, pair.getFirst(), getAttributeAsStringArray(prop.getNodeValue()));
604                     break;
605                 default:
606                     System.out.println("missing type");
607                     break;
608             }
609         }
610
611         return uim;
612     }
613
614     private Boolean getAttributeAsBoolean(String val) {
615         if (val == null) {
616             return null;
617         }
618
619         if (val.equals("on")) {
620             return true;
621         }
622
623         if (val.equals("off")) {
624             return false;
625         }
626
627         return false;
628     }
629
630     private void setBooleanAttribute(Integer id, int property, NamedNodeMap attributes, String attr) {
631         Node node = attributes.getNamedItem(attr);
632         if (node != null) {
633             Boolean b = getAttributeAsBoolean(node.getNodeValue());
634             if (b != null) {
635                 GraphicController.getController().setProperty(id, property, b);
636             }
637         }
638     }
639
640     private Double getAttributeAsDouble(String val) {
641         if (val == null) {
642             return null;
643         }
644
645         return Double.parseDouble(val);
646     }
647
648     private Integer getAttributeAsInteger(String val) {
649         if (val == null) {
650             return null;
651         }
652
653         return Integer.parseInt(val);
654     }
655
656     private String getAttributeAsString(String val) {
657         return val;
658     }
659
660     private Boolean[] getAttributeAsBooleanArray(String val) {
661
662         if (val == null) {
663             return new Boolean[] {};
664         }
665
666         StringTokenizer token = new StringTokenizer(val, ",");
667
668         Boolean[] b = new Boolean[token.countTokens()];
669         int i = 0;
670         while (token.hasMoreElements()) {
671             String s = token.nextToken();
672             if (s.equals("on")) {
673                 b[i++] = true;
674             } else {
675                 b[i++] = false;
676             }
677         }
678
679         return b;
680     }
681
682     private Double[] getAttributeAsDoubleArray(String val) {
683
684         if (val == null) {
685             return new Double[] {};
686         }
687
688         StringTokenizer token = new StringTokenizer(val, ",");
689
690         Double[] d = new Double[token.countTokens()];
691         int i = 0;
692         while (token.hasMoreElements()) {
693             String s = token.nextToken();
694             d[i++] = Double.parseDouble(s);
695         }
696
697         return d;
698     }
699
700     private Integer[] getAttributeAsIntegerArray(String val) {
701
702         if (val == null) {
703             return new Integer[] {};
704         }
705
706         StringTokenizer token = new StringTokenizer(val, ",");
707
708         Integer[] integer = new Integer[token.countTokens()];
709         int i = 0;
710         while (token.hasMoreElements()) {
711             String s = token.nextToken();
712             integer[i++] = Integer.parseInt(s);
713         }
714
715         return integer;
716     }
717
718     private String[] getAttributeAsStringArray(String val) {
719
720         if (val == null) {
721             return null;
722         }
723
724         StringTokenizer token = new StringTokenizer(val, ",");
725
726         String[] s = new String[token.countTokens()];
727         int i = 0;
728         while (token.hasMoreElements()) {
729             s[i++] = token.nextToken();
730         }
731
732         return s;
733     }
734 }