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