ba7ddf7ef0215f620c51536ad8c0ffba278fde33
[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             boolean makeRelationShip = true;
267
268             // make sure it's element node.
269             if (childNode.getNodeType() == Node.ELEMENT_NODE) {
270                 // get node name and value
271                 int nodeType = nameToGO.get(childNode.getNodeName());
272                 switch (nodeType) {
273                     case __GO_FIGURE__: {
274                         child = createFigure(childNode);
275                         figure = child;
276                         break;
277                     }
278
279                     case __GO_UI_CHECKBOX__:
280                     case __GO_UI_EDIT__:
281                     case __GO_UI_FRAME__:
282                     case __GO_UI_IMAGE__:
283                     case __GO_UI_LAYER__:
284                     case __GO_UI_LISTBOX__:
285                     case __GO_UI_POPUPMENU__:
286                     case __GO_UI_PUSHBUTTON__:
287                     case __GO_UI_RADIOBUTTON__:
288                     case __GO_UI_SLIDER__:
289                     case __GO_UI_TABLE__:
290                     case __GO_UI_TAB__:
291                     case __GO_UI_TEXT__: {
292                         child = createUiControl(nodeType, parent, childNode);
293                         break;
294                     }
295
296                     case __GO_AXES__ : {
297                         child = Builder.createSubWin(parent);
298                         break;
299                     }
300
301                     case __GO_UI_FRAME_BORDER__: {
302                         makeRelationShip = false;
303                         child = createBorder(childNode);
304                         GraphicController.getController().setProperty(parent, __GO_UI_FRAME_BORDER__, child);
305                         break;
306                     }
307
308                     case __NODE_OUT__: {
309                         makeRelationShip = false;
310                         //                        child = createBorder(childNode);
311                         //                        GraphicController.getController().setProperty(parent, __GO_UI_FRAME_BORDER_OUT_BORDER__, child);
312                         break;
313                     }
314
315                     case __NODE_IN__: {
316                         makeRelationShip = false;
317                         //                        child = createBorder(childNode);
318                         //                        GraphicController.getController().setProperty(parent, __GO_UI_FRAME_BORDER_IN_BORDER__, child);
319                         break;
320                     }
321
322                     case __NODE_TITLE__: {
323                         makeRelationShip = false;
324                         //                        child = createBorder(childNode);
325                         //                        GraphicController.getController().setProperty(parent, __GO_UI_FRAME_BORDER_TITLE__, child);
326                         break;
327                     }
328
329                     case __NODE_SCILABGUI__ : {
330                         //check version
331                         Node nodeVersion = childNode.getAttributes().getNamedItem("version");
332                         double version = Double.parseDouble(nodeVersion.getNodeValue());
333                         if (version > 1.0) {
334                             //call version manager ^^
335                         }
336
337                         Integer console = Console.getConsole().getIdentifier();
338                         //set usedeprecatedskin flag
339                         setBooleanAttribute(console, __GO_USEDEPRECATEDLF__, childNode.getAttributes(), "usedeprecatedskin");
340                         break;
341                     }
342
343                     case __GO_UICONTEXTMENU__: {
344                         break;
345                     }
346                     case __GO_UIMENU__: {
347                         child = createUiMenu(parent, childNode);
348                         break;
349                     }
350
351
352                     default: {
353                         break;
354                     }
355                 }
356
357                 if (makeRelationShip && parent != 0 && child != 0) {
358                     GraphicController.getController().setGraphicObjectRelationship(parent, child);
359                 }
360
361                 if (childNode.hasChildNodes()) {
362                     parseNode(child, childNode.getChildNodes());
363                 }
364
365             }
366         }
367     }
368
369     private Integer createBorder(Node node) {
370         GraphicController controller = GraphicController.getController();
371         Integer uib = controller.askObject(GraphicObject.getTypeFromName(__GO_UI_FRAME_BORDER__));
372
373         NamedNodeMap attr = node.getAttributes();
374
375         Node styleNode = attr.getNamedItem("style");
376         if (styleNode != null) {
377             Integer style = FrameBorderType.stringToEnum(styleNode.getNodeValue()).ordinal();
378             controller.setProperty(uib, __GO_UI_FRAME_BORDER_STYLE__, style);
379             attr.removeNamedItem("style");
380         }
381
382         for (int i = 0 ; i < attr.getLength() ; i++) {
383             Node prop = attr.item(i);
384             Pair<Integer, ModelType> pair = BorderPropToGO.get(prop.getNodeName());
385
386             ModelType modelType = pair.getSecond();
387             switch (modelType) {
388                 case BOOLEAN:
389                     controller.setProperty(uib, pair.getFirst(), getAttributeAsBoolean(prop.getNodeValue()));
390                     break;
391                 case BOOLEAN_ARRAY :
392                     controller.setProperty(uib, pair.getFirst(), getAttributeAsBooleanArray(prop.getNodeValue()));
393                     break;
394                 case DOUBLE:
395                     controller.setProperty(uib, pair.getFirst(), getAttributeAsDouble(prop.getNodeValue()));
396                     break;
397                 case DOUBLE_ARRAY:
398                     controller.setProperty(uib, pair.getFirst(), getAttributeAsDoubleArray(prop.getNodeValue()));
399                     break;
400                 case INTEGER:
401                     controller.setProperty(uib, pair.getFirst(), getAttributeAsInteger(prop.getNodeValue()));
402                     break;
403                 case INTEGER_ARRAY:
404                     controller.setProperty(uib, pair.getFirst(), getAttributeAsIntegerArray(prop.getNodeValue()));
405                     break;
406                 case STRING:
407                     controller.setProperty(uib, pair.getFirst(), getAttributeAsString(prop.getNodeValue()));
408                     break;
409                 case STRING_ARRAY:
410                     controller.setProperty(uib, pair.getFirst(), getAttributeAsStringArray(prop.getNodeValue()));
411                     break;
412                 default:
413                     System.out.println("missing type");
414                     break;
415             }
416         }
417
418         //manage children here to avoid trouble on draw without children in SwingView
419         if (node.hasChildNodes()) {
420             NodeList list = node.getChildNodes();
421             for (int i = 0 ; i < list.getLength() ; i++) {
422                 Node childNode = list.item(i);
423                 if (childNode.getNodeType() == Node.ELEMENT_NODE) {
424                     Integer child = createBorder(childNode);
425                     String nodeName = childNode.getNodeName();
426                     if (nodeName.equals("title")) {
427                         GraphicController.getController().setProperty(uib, __GO_UI_FRAME_BORDER_TITLE__, child);
428                     } else if (nodeName.equals("out")) {
429                         GraphicController.getController().setProperty(uib, __GO_UI_FRAME_BORDER_OUT_BORDER__, child);
430                     } else if (nodeName.equals("in")) {
431                         GraphicController.getController().setProperty(uib, __GO_UI_FRAME_BORDER_IN_BORDER__, child);
432                     }
433                 }
434             }
435         }
436         return uib;
437     }
438
439     private Integer createFigure(Node node) {
440         GraphicController controller = GraphicController.getController();
441         Boolean dockable = true;
442         Integer menubar = 1;
443         Integer toolbar = 1;
444         Boolean default_axes = true;
445
446         NamedNodeMap attr = node.getAttributes();
447         //dockable
448         Node tempnode = attr.getNamedItem("dockable");
449         if (tempnode != null) {
450             dockable = getAttributeAsBoolean(tempnode.getNodeValue());
451             attr.removeNamedItem("dockable");
452         }
453         //menubar
454         tempnode = attr.getNamedItem("menubar");
455         if (tempnode != null) {
456             menubar = getAttributeAsInteger(tempnode.getNodeValue());
457             attr.removeNamedItem("menubar");
458         }
459         //toolbar
460         tempnode = attr.getNamedItem("toolbar");
461         if (tempnode != null) {
462             toolbar = getAttributeAsInteger(tempnode.getNodeValue());
463             attr.removeNamedItem("toolbar");
464         }
465         //default_axes
466         tempnode = attr.getNamedItem("default_axes");
467         if (tempnode != null) {
468             default_axes = getAttributeAsBoolean(tempnode.getNodeValue());
469             attr.removeNamedItem("default_axes");
470         }
471         //visible
472         tempnode = attr.getNamedItem("visible");
473         if (tempnode != null) {
474             figVisible = getAttributeAsBoolean(tempnode.getNodeValue());
475             attr.removeNamedItem("visible");
476         }
477
478         Integer fig = Builder.createFigure(dockable, menubar, toolbar, default_axes, false);
479
480         for (int i = 0 ; i < attr.getLength() ; i++) {
481             Node prop = attr.item(i);
482             Pair<Integer, ModelType> pair = figPropToGO.get(prop.getNodeName());
483
484             ModelType type = pair.getSecond();
485             switch (type) {
486                 case BOOLEAN:
487                     controller.setProperty(fig, pair.getFirst(), getAttributeAsBoolean(prop.getNodeValue()));
488                     break;
489                 case BOOLEAN_ARRAY:
490                     controller.setProperty(fig, pair.getFirst(), getAttributeAsBooleanArray(prop.getNodeValue()));
491                     break;
492                 case DOUBLE:
493                     controller.setProperty(fig, pair.getFirst(), getAttributeAsDouble(prop.getNodeValue()));
494                     break;
495                 case DOUBLE_ARRAY:
496                     controller.setProperty(fig, pair.getFirst(), getAttributeAsDoubleArray(prop.getNodeValue()));
497                     break;
498                 case INTEGER:
499                     controller.setProperty(fig, pair.getFirst(), getAttributeAsInteger(prop.getNodeValue()));
500                     break;
501                 case INTEGER_ARRAY:
502                     controller.setProperty(fig, pair.getFirst(), getAttributeAsIntegerArray(prop.getNodeValue()));
503                     break;
504                 case STRING:
505                     controller.setProperty(fig, pair.getFirst(), getAttributeAsString(prop.getNodeValue()));
506                     break;
507                 case STRING_ARRAY:
508                     controller.setProperty(fig, pair.getFirst(), getAttributeAsStringArray(prop.getNodeValue()));
509                     break;
510                 default:
511                     System.out.println("missing type");
512                     break;
513             }
514         }
515
516         return fig;
517     }
518
519     private Integer createUiControl(Integer type, Integer parent, Node node) {
520         GraphicController controller = GraphicController.getController();
521         NamedNodeMap attr = node.getAttributes();
522
523         /*for frame we have to take care of scrollable property*/
524         if (type == __GO_UI_FRAME__) {
525             Node item = attr.getNamedItem("scrollable");
526             if (item != null && item.getNodeValue().equals("on")) {
527                 type = __GO_UI_FRAME_SCROLLABLE__;
528             }
529         }
530
531         Integer uic = GraphicController.getController().askObject(GraphicObject.getTypeFromName(type));
532         controller.setProperty(uic, __GO_VISIBLE__, true);
533
534         for (int i = 0 ; i < attr.getLength() ; i++) {
535             Node prop = attr.item(i);
536             Pair<Integer, ModelType> pair = UiPropToGO.get(prop.getNodeName());
537
538             ModelType modelType = pair.getSecond();
539             switch (modelType) {
540                 case BOOLEAN:
541                     controller.setProperty(uic, pair.getFirst(), getAttributeAsBoolean(prop.getNodeValue()));
542                     break;
543                 case BOOLEAN_ARRAY :
544                     controller.setProperty(uic, pair.getFirst(), getAttributeAsBooleanArray(prop.getNodeValue()));
545                     break;
546                 case DOUBLE:
547                     controller.setProperty(uic, pair.getFirst(), getAttributeAsDouble(prop.getNodeValue()));
548                     break;
549                 case DOUBLE_ARRAY:
550                     controller.setProperty(uic, pair.getFirst(), getAttributeAsDoubleArray(prop.getNodeValue()));
551                     break;
552                 case INTEGER:
553                     controller.setProperty(uic, pair.getFirst(), getAttributeAsInteger(prop.getNodeValue()));
554                     break;
555                 case INTEGER_ARRAY:
556                     controller.setProperty(uic, pair.getFirst(), getAttributeAsIntegerArray(prop.getNodeValue()));
557                     break;
558                 case STRING:
559                     controller.setProperty(uic, pair.getFirst(), getAttributeAsString(prop.getNodeValue()));
560                     break;
561                 case STRING_ARRAY:
562                     controller.setProperty(uic, pair.getFirst(), getAttributeAsStringArray(prop.getNodeValue()));
563                     break;
564                 default:
565                     System.out.println("missing type");
566                     break;
567             }
568         }
569
570         return uic;
571     }
572
573     private Integer createUiMenu(Integer parent, Node node) {
574         GraphicController controller = GraphicController.getController();
575         NamedNodeMap attr = node.getAttributes();
576
577         Integer uim = GraphicController.getController().askObject(GraphicObject.getTypeFromName(__GO_UIMENU__));
578         controller.setProperty(uim, __GO_VISIBLE__, true);
579
580         for (int i = 0 ; i < attr.getLength() ; i++) {
581             Node prop = attr.item(i);
582             Pair<Integer, ModelType> pair = MenuPropToGO.get(prop.getNodeName());
583             System.out.println("node : " + prop.getNodeName());
584             ModelType modelType = pair.getSecond();
585             switch (modelType) {
586                 case BOOLEAN:
587                     controller.setProperty(uim, pair.getFirst(), getAttributeAsBoolean(prop.getNodeValue()));
588                     break;
589                 case BOOLEAN_ARRAY :
590                     controller.setProperty(uim, pair.getFirst(), getAttributeAsBooleanArray(prop.getNodeValue()));
591                     break;
592                 case DOUBLE:
593                     controller.setProperty(uim, pair.getFirst(), getAttributeAsDouble(prop.getNodeValue()));
594                     break;
595                 case DOUBLE_ARRAY:
596                     controller.setProperty(uim, pair.getFirst(), getAttributeAsDoubleArray(prop.getNodeValue()));
597                     break;
598                 case INTEGER:
599                     controller.setProperty(uim, pair.getFirst(), getAttributeAsInteger(prop.getNodeValue()));
600                     break;
601                 case INTEGER_ARRAY:
602                     controller.setProperty(uim, pair.getFirst(), getAttributeAsIntegerArray(prop.getNodeValue()));
603                     break;
604                 case STRING:
605                     controller.setProperty(uim, pair.getFirst(), getAttributeAsString(prop.getNodeValue()));
606                     break;
607                 case STRING_ARRAY:
608                     controller.setProperty(uim, pair.getFirst(), getAttributeAsStringArray(prop.getNodeValue()));
609                     break;
610                 default:
611                     System.out.println("missing type");
612                     break;
613             }
614         }
615
616         return uim;
617     }
618
619     private Boolean getAttributeAsBoolean(String val) {
620         if (val == null) {
621             return null;
622         }
623
624         if (val.equals("on")) {
625             return true;
626         }
627
628         if (val.equals("off")) {
629             return false;
630         }
631
632         return false;
633     }
634
635     private void setBooleanAttribute(Integer id, int property, NamedNodeMap attributes, String attr) {
636         Node node = attributes.getNamedItem(attr);
637         if (node != null) {
638             Boolean b = getAttributeAsBoolean(node.getNodeValue());
639             if (b != null) {
640                 GraphicController.getController().setProperty(id, property, b);
641             }
642         }
643     }
644
645     private Double getAttributeAsDouble(String val) {
646         if (val == null) {
647             return null;
648         }
649
650         return Double.parseDouble(val);
651     }
652
653     private Integer getAttributeAsInteger(String val) {
654         if (val == null) {
655             return null;
656         }
657
658         return Integer.parseInt(val);
659     }
660
661     private String getAttributeAsString(String val) {
662         return val;
663     }
664
665     private Boolean[] getAttributeAsBooleanArray(String val) {
666
667         if (val == null) {
668             return new Boolean[] {};
669         }
670
671         StringTokenizer token = new StringTokenizer(val, ",");
672
673         Boolean[] b = new Boolean[token.countTokens()];
674         int i = 0;
675         while (token.hasMoreElements()) {
676             String s = token.nextToken();
677             if (s.equals("on")) {
678                 b[i++] = true;
679             } else {
680                 b[i++] = false;
681             }
682         }
683
684         return b;
685     }
686
687     private Double[] getAttributeAsDoubleArray(String val) {
688
689         if (val == null) {
690             return new Double[] {};
691         }
692
693         StringTokenizer token = new StringTokenizer(val, ",");
694
695         Double[] d = new Double[token.countTokens()];
696         int i = 0;
697         while (token.hasMoreElements()) {
698             String s = token.nextToken();
699             d[i++] = Double.parseDouble(s);
700         }
701
702         return d;
703     }
704
705     private Integer[] getAttributeAsIntegerArray(String val) {
706
707         if (val == null) {
708             return new Integer[] {};
709         }
710
711         StringTokenizer token = new StringTokenizer(val, ",");
712
713         Integer[] integer = new Integer[token.countTokens()];
714         int i = 0;
715         while (token.hasMoreElements()) {
716             String s = token.nextToken();
717             integer[i++] = Integer.parseInt(s);
718         }
719
720         return integer;
721     }
722
723     private String[] getAttributeAsStringArray(String val) {
724
725         if (val == null) {
726             return null;
727         }
728
729         StringTokenizer token = new StringTokenizer(val, ",");
730
731         String[] s = new String[token.countTokens()];
732         int i = 0;
733         while (token.hasMoreElements()) {
734             s[i++] = token.nextToken();
735         }
736
737         return s;
738     }
739 }