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