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