2e7be182ee44b0bc24cb8a082128c201a002f84d
[scilab.git] / scilab / modules / graphic_objects / src / cpp / webutils.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2016 - Scilab Enterprises - Antoine ELIAS
4 *
5 * Copyright (C) 2012 - 2016 - Scilab Enterprises
6 *
7 * This file is hereby licensed under the terms of the GNU GPL v2.0,
8 * pursuant to article 5.3.4 of the CeCILL v.2.1.
9 * This file was originally licensed under the terms of the CeCILL v2.1,
10 * and continues to be available under such terms.
11 * For more information, see the COPYING file which you should have received
12 * along with this program.
13 *
14 */
15
16 #include <string.h>
17 #include <iostream>
18 #include <cmath>
19 #include "webutils.hxx"
20
21 extern "C"
22 {
23 #include "setGraphicObjectProperty.h"
24 #include "getGraphicObjectProperty.h"
25 #include "graphicObjectProperties.h"
26 #include "LayoutType.h"
27 #include "BorderLayoutType.h"
28 }
29
30 WebUtils::SETTER WebUtils::setter;
31 WebUtils::WAITING_PROP WebUtils::waitprop;
32
33 int WebUtils::getIntProperty(int uid, int prop)
34 {
35     int val = 0;
36     int* pVal = &val;
37     getGraphicObjectProperty(uid, prop, jni_int, (void **)&pVal);
38     return val;
39 }
40
41 bool WebUtils::getBoolProperty(int uid, int prop)
42 {
43     int val = 0;
44     int* pVal = &val;
45     getGraphicObjectProperty(uid, prop, jni_bool, (void **)&pVal);
46     return val != 0;
47 }
48
49 double WebUtils::getDoubleProperty(int uid, int prop)
50 {
51     double val = 0;
52     double* pVal = &val;
53     getGraphicObjectProperty(uid, prop, jni_double, (void **)&pVal);
54     return val;
55 }
56
57 void WebUtils::getDoubleVectorProterty(int uid, int prop, std::vector<double>& vect)
58 {
59     double* values = NULL;
60     getGraphicObjectProperty(uid, prop, jni_double_vector, (void**)&values);
61
62     int size = (int)vect.size();
63     memcpy(vect.data(), values, size * sizeof(double));
64     releaseGraphicObjectProperty(prop, values, jni_double_vector, size);
65 }
66
67 void WebUtils::getIntVectorProterty(int uid, int prop, std::vector<int>& vect)
68 {
69     int* values = NULL;
70     getGraphicObjectProperty(uid, prop, jni_int_vector, (void**)&values);
71
72     int size = (int)vect.size();
73     memcpy(vect.data(), values, size * sizeof(int));
74     releaseGraphicObjectProperty(prop, values, jni_int_vector, size);
75 }
76
77 std::string WebUtils::getStringProperty(int uid, int prop)
78 {
79     std::string str;
80     char* val = NULL;
81     getGraphicObjectProperty(uid, prop, jni_string, (void**)&val);
82     str = val;
83     releaseGraphicObjectProperty(prop, val, jni_string, 1);
84     return str;
85 }
86
87 void WebUtils::getStringVectorProperty(int uid, int prop, std::vector<std::string>& vect)
88 {
89     char **pstString = NULL;
90     getGraphicObjectProperty(uid, prop, jni_string_vector, (void **)&pstString);
91
92     int size = (int)vect.size();
93     for (int i = 0; i < size; ++i)
94     {
95         vect[i] = pstString[i];
96     }
97
98     releaseGraphicObjectProperty(prop, pstString, jni_string_vector, size);
99 }
100
101 bool WebUtils::setStringProperty(int uid, int prop, const std::string& value)
102 {
103     setGraphicObjectProperty(uid, prop, value.data(), jni_string, 1);
104     return true;
105 }
106
107 bool WebUtils::setStringVectorProperty(int uid, int prop, const std::vector<std::string>& values)
108 {
109     int size = (int)values.size();
110     std::vector<const char*> c(size, NULL);
111     for (int i = 0; i < size; ++i)
112     {
113         c[i] = values[i].data();
114     }
115
116     setGraphicObjectProperty(uid, prop, (void**)c.data(), jni_string_vector, size);
117     return true;
118 }
119
120 bool WebUtils::setDoubleVectorProperty(int uid, int prop, const std::vector<double>& values)
121 {
122     setGraphicObjectProperty(uid, prop, values.data(), jni_double_vector, (int)values.size());
123     return true;
124 }
125
126 std::string WebUtils::getIdString(int uid, const std::string& suffix)
127 {
128     return "'uid" + std::to_string(uid) + suffix + "'";
129 }
130
131 std::string WebUtils::getElementById(int uid, const std::string& suffix)
132 {
133     return "document.getElementById(" + getIdString(uid, suffix) + ");";
134 }
135
136 std::string WebUtils::createElement(const std::string& type)
137 {
138     return "document.createElement('" + type + "');";
139 }
140
141 std::string WebUtils::getColor(const std::vector<double>& c)
142 {
143     if (c[0] == -1)
144     {
145         return "''";
146     }
147
148     std::string str("'rgb(");
149
150     //use abs to convert [-1 -1 -1 ] to (255, 255, 255)
151     str += std::to_string((int)std::abs(c[0] * 255));
152     for (int i = 1; i < c.size(); ++i)
153     {
154         str += ", " + std::to_string((int)std::abs(c[i] * 255));
155     }
156
157     str += ")'";
158
159     return str;
160 }
161
162 std::string WebUtils::getSubPadding(int val)
163 {
164     if (val)
165     {
166         return std::to_string(val) + "px ";
167     }
168
169     return "0 ";
170 }
171
172 std::string WebUtils::getPadding(int t, int r, int b, int l)
173 {
174     std::string ret;
175
176     ret += getSubPadding(t);
177     ret += getSubPadding(r);
178     ret += getSubPadding(b);
179     ret += getSubPadding(l);
180
181     return ret;
182 }
183
184 bool WebUtils::isManaged(int uid)
185 {
186     int type = getType(uid);
187     switch (type)
188     {
189         case __GO_FIGURE__:
190         case __GO_UICONTROL__:
191             return true;
192         default:
193             return false;
194     }
195 }
196
197 //commons
198 int WebUtils::getType(int uid)
199 {
200     return getIntProperty(uid, __GO_TYPE__);
201 }
202
203 int WebUtils::getStyle(int uid)
204 {
205     return getIntProperty(uid, __GO_STYLE__);
206 }
207
208 bool WebUtils::hasValidParent(int uid)
209 {
210     return getParent(uid) != 0;
211 }
212
213 int WebUtils::getParent(int uid)
214 {
215     return getIntProperty(uid, __GO_PARENT__);
216 }
217
218 void WebUtils::setParent(int uid, std::ostringstream& ostr, bool append)
219 {
220     int parent = getParent(uid);
221
222     if (append == false)
223     {
224         ostr << "var __child__ = " << getElementById(uid) << std::endl;
225     }
226
227     ostr << "var __parent__ = " << getElementById(parent) << std::endl;
228     ostr << "__parent__.appendChild(__child__);" << std::endl;
229
230     if (hasStyle(parent, __GO_UI_TAB__))
231     {
232         //add button and properties for tab
233         addTabChild(parent, uid, ostr);
234     }
235
236     if (getUILayout(parent) == LAYOUT_BORDER && hasStyle(parent, __GO_UI_TAB__) == false)
237     {
238         //force update of border position, especially for center
239         addInWaitingQueue(uid, __GO_UI_BORDER_PREFERREDSIZE__);
240     }
241
242     setWaitingProperties(uid, ostr, true);
243 }
244
245 void WebUtils::getFigureSize(int uid, std::vector<int>& vect)
246 {
247     int fig = getFigureId(uid);
248     vect.resize(2, 0);
249     getIntVectorProterty(fig, __GO_AXES_SIZE__, vect);
250 }
251
252 void WebUtils::setFigureSize(int uid, std::ostringstream& ostr, bool append)
253 {
254     std::vector<int> size;
255     getFigureSize(uid, size);
256
257     if (append == false)
258     {
259         ostr << "var __child__ = " << getElementById(uid) << std::endl;
260     }
261     ostr << "__child__.style.width = '" << size[0] << "px';" << std::endl;
262     ostr << "__child__.style.height = '" << size[1] << "px';" << std::endl;
263 }
264
265 int WebUtils::getFigureId(int uid)
266 {
267     int id = uid;
268     while (isFigure(id) == false)
269     {
270         id = getParent(id);
271     }
272
273     return id;
274 }
275
276 void WebUtils::getUIPosition(int uid, std::vector<double>& vect)
277 {
278     vect.resize(4, 0.);
279     getDoubleVectorProterty(uid, __GO_POSITION__, vect);
280 }
281
282 void WebUtils::getUIString(int uid, std::vector<std::string> & vect)
283 {
284     int size = getIntProperty(uid, __GO_UI_STRING_SIZE__);
285     //int col = getIntProperty(uid, __GO_UI_STRING_COLNB__);
286     vect.resize(size, "");
287     getStringVectorProperty(uid, __GO_UI_STRING__, vect);
288 }
289
290
291 void WebUtils::setUIPosition(int uid, std::ostringstream& ostr, bool append)
292 {
293     std::vector<double> pos;
294     getUIPosition(uid, pos);
295
296     if (append == false)
297     {
298         ostr << "var __child__ = " << getElementById(uid) << std::endl;
299     }
300
301     ostr << "__child__.style.left = '" << (int)pos[0] << "px';" << std::endl;
302     ostr << "__child__.style.bottom = '" << (int)pos[1] << "px';" << std::endl;
303     ostr << "__child__.style.width = '" << (int)pos[2] << "px';" << std::endl;
304     ostr << "__child__.style.height = '" << (int)pos[3] << "px';" << std::endl;
305
306     //to ensure vertical alignement, adapt style.line-height
307     if (hasStyle(uid, __GO_UI_TEXT__) || hasStyle(uid, __GO_UI_CHECKBOX__) || hasStyle(uid, __GO_UI_RADIOBUTTON__))
308     {
309         std::string v;
310         getUIVerticalAlignment(uid, v);
311         if (v == "middle")
312         {
313             ostr << "__child__.style.lineHeight = '" << (int)pos[3] << "px';" << std::endl;
314         }
315         else
316         {
317             ostr << "__child__.style.lineHeight = 'initial';" << std::endl;
318         }
319     }
320 }
321
322 void WebUtils::setUIString(int uid, std::ostringstream& ostr, bool append)
323 {
324     std::vector<std::string> s;
325     getUIString(uid, s);
326     if (s.size() == 0)
327     {
328         s.push_back("");
329     }
330
331     switch (getStyle(uid))
332     {
333         case __GO_UI_CHECKBOX__:
334         case __GO_UI_RADIOBUTTON__:
335         {
336             if (append == false)
337             {
338                 ostr << "var __child__ = " << getElementById(uid) << std::endl;
339             }
340
341             ostr << "var __label__ = " << getElementById(uid, "_label") << std::endl;
342             ostr << "__label__.innerHTML = '" << s[0] << "';" << std::endl;
343             break;
344         }
345
346         case __GO_UI_POPUPMENU__ :
347         case __GO_UI_LISTBOX__:
348         {
349             if (append == false)
350             {
351                 ostr << "var __child__ = " << getElementById(uid) << std::endl;
352             }
353
354             //remove previous values
355             ostr << "while (__child__.length) {__child__.remove(0);}" << std::endl;
356
357             ostr << "var option;" << std::endl;
358             int size = (int)s.size();
359             for (int i = 0; i < size; ++i)
360             {
361                 ostr << "option = new Option('" << s[i] << "');" << std::endl;
362                 ostr << "__child__.add(option);" << std::endl;
363             }
364
365             if (hasStyle(uid, __GO_UI_LISTBOX__))
366             {
367                 //switch to listbox instead of combobox
368                 ostr << "__child__.size = 2;" << std::endl;
369             }
370             break;
371         }
372
373         case __GO_UI_TAB__:
374         {
375             //nothing to do
376             break;
377         }
378
379         case __GO_UI_FRAME__:
380         {
381             //if parent is a GO_UI_TAB, change value of button
382             if (hasStyle(getParent(uid), __GO_UI_TAB__))
383             {
384                 if (append == false)
385                 {
386                     ostr << "var __child__ = " << getElementById(uid) << std::endl;
387                 }
388
389                 ostr << "var __btn__ = " + getElementById(uid, "_btn") << std::endl;
390                 ostr << "__btn__.value = '" << s[0] << "';" << std::endl;
391             }
392             break;
393         }
394
395         default:
396         {
397             if (append == false)
398             {
399                 ostr << "var __child__ = " << getElementById(uid) << std::endl;
400             }
401
402             if (isInputType(uid))
403             {
404                 ostr << "__child__.value = '" << s[0] << "';" << std::endl;
405             }
406             else
407             {
408                 ostr << "__child__.innerHTML = '" << s[0] << "';" << std::endl;
409             }
410             break;
411         }
412     }
413     
414     {
415     }
416 }
417
418 bool WebUtils::getVisible(int uid)
419 {
420     return getBoolProperty(uid, __GO_VISIBLE__);
421 }
422
423 void WebUtils::setVisible(int uid, std::ostringstream& ostr, bool append)
424 {
425     //reverse flag value
426     std::string v = getVisible(uid) ? "inherit" : "hidden";
427     if (append == false)
428     {
429         ostr << "var __child__ = " << getElementById(uid) << std::endl;
430     }
431
432     ostr << "__child__.style.visibility  = '" << v << "';" << std::endl;
433 }
434
435 bool WebUtils::getUIEnable(int uid)
436 {
437     return getBoolProperty(uid, __GO_UI_ENABLE__);
438 }
439
440 void WebUtils::setUIEnable(int uid, std::ostringstream& ostr, bool append)
441 {
442     //reverse flag value
443     std::string v = getUIEnable(uid) ? "false" : "true";
444     if (append == false)
445     {
446         ostr << "var __child__ = " << getElementById(uid) << std::endl;
447     }
448
449     ostr << "__child__.disabled  = " << v << ";" << std::endl;
450 }
451
452 bool WebUtils::getUIBackgroundColor(int uid, std::vector<double>& vect)
453 {
454     vect.resize(3, 0.);
455     getDoubleVectorProterty(uid, __GO_UI_BACKGROUNDCOLOR__, vect);
456     return true;
457 }
458
459 void WebUtils::setUIBackgroundColor(int uid, std::ostringstream& ostr, bool append)
460 {
461     std::vector<double> c;
462     getUIBackgroundColor(uid, c);
463     if (append == false)
464     {
465         ostr << "var __child__ = " << getElementById(uid) << std::endl;
466     }
467
468     ostr << "__child__.style.backgroundColor  = " << getColor(c) << ";" << std::endl;
469 }
470
471 bool WebUtils::getUIFontAngle(int uid, std::string& val)
472 {
473     val = getStringProperty(uid, __GO_UI_FONTANGLE__);
474     return true;
475 }
476
477 void WebUtils::setUIFontAngle(int uid, std::ostringstream& ostr, bool append)
478 {
479     std::string angle;
480     getUIFontAngle(uid, angle);
481     if (append == false)
482     {
483         ostr << "var __child__ = " << getElementById(uid) << std::endl;
484     }
485
486     ostr << "__child__.style.fontStyle  = '" << angle << "';" << std::endl;
487 }
488
489 bool WebUtils::getUIFontName(int uid, std::string& val)
490 {
491     val = getStringProperty(uid, __GO_UI_FONTNAME__);
492     return true;
493 }
494
495 void WebUtils::setUIFontName(int uid, std::ostringstream& ostr, bool append)
496 {
497     std::string font;
498     getUIFontName(uid, font);
499     if (append == false)
500     {
501         ostr << "var __child__ = " << getElementById(uid) << std::endl;
502     }
503
504     ostr << "__child__.style.fontFamily  = '" << font << "','serif' ;" << std::endl;
505 }
506
507 bool WebUtils::getUIFontUnits(int uid, std::string& val)
508 {
509     val =  getStringProperty(uid, __GO_UI_FONTUNITS__);
510     return true;
511 }
512
513 double WebUtils::getUIFontSize(int uid)
514 {
515     return getDoubleProperty(uid, __GO_UI_FONTSIZE__);
516 }
517
518 void WebUtils::setUIFontSize(int uid, std::ostringstream& ostr, bool append)
519 {
520     int size = (int)getUIFontSize(uid);
521
522     std::string units;
523     getUIFontUnits(uid, units);
524
525     if (units == "pixels")
526     {
527         units = "px";
528     }
529     else //"points"
530     {
531         units = "pt";
532         size = (int)(size * 0.75);
533     }
534
535     if (append == false)
536     {
537         ostr << "var __child__ = " << getElementById(uid) << std::endl;
538     }
539
540     ostr << "__child__.style.fontSize  = '" << size << units << "';" << std::endl;
541 }
542
543 bool WebUtils::getUIFontWeight(int uid, std::string& val)
544 {
545     val = getStringProperty(uid, __GO_UI_FONTWEIGHT__);
546     return true;
547 }
548
549 void WebUtils::setUIFontWeight(int uid, std::ostringstream& ostr, bool append)
550 {
551     std::string weight;
552     getUIFontWeight(uid, weight);
553
554     if (append == false)
555     {
556         ostr << "var __child__ = " << getElementById(uid) << std::endl;
557     }
558
559     ostr << "__child__.style.fontWeight  = '" << weight << "';" << std::endl;
560 }
561
562 bool WebUtils::getUIForegroundColor(int uid, std::vector<double>& vect)
563 {
564     vect.resize(3, 0.);
565     getDoubleVectorProterty(uid, __GO_UI_FOREGROUNDCOLOR__, vect);
566     return true;
567 }
568
569 void WebUtils::setUIForegroundColor(int uid, std::ostringstream& ostr, bool append)
570 {
571     std::vector<double> c;
572     getUIForegroundColor(uid, c);
573
574     if (append == false)
575     {
576         ostr << "var __child__ = " << getElementById(uid) << std::endl;
577     }
578
579     ostr << "__child__.style.color  = " << getColor(c) << ";" << std::endl;
580 }
581
582 bool WebUtils::getUIHorizontalAlignment(int uid, std::string& val)
583 {
584     val = getStringProperty(uid, __GO_UI_HORIZONTALALIGNMENT__);
585     return true;
586 }
587
588 void WebUtils::setUIHorizontalAlignment(int uid, std::ostringstream& ostr, bool append)
589 {
590     std::string align;
591     getUIHorizontalAlignment(uid, align);
592
593     if (append == false)
594     {
595         ostr << "var __child__ = " << getElementById(uid) << std::endl;
596     }
597
598     ostr << "__child__.style.textAlign  = '" << align << "';" << std::endl;
599 }
600
601 bool WebUtils::getUIRelief(int uid, std::string& val)
602 {
603     val = getStringProperty(uid, __GO_UI_RELIEF__);
604     return true;
605 }
606
607 void WebUtils::setUIRelief(int uid, std::ostringstream& ostr, bool append)
608 {
609 }
610
611 bool WebUtils::getUIVerticalAlignment(int uid, std::string& val)
612 {
613     val = getStringProperty(uid, __GO_UI_VERTICALALIGNMENT__);
614     return true;
615 }
616
617 void WebUtils::setUIVerticalAlignment(int uid, std::ostringstream& ostr, bool append)
618 {
619 }
620
621 int WebUtils::getUILayout(int uid)
622 {
623     return getIntProperty(uid, __GO_LAYOUT__);
624     return true;
625 }
626
627 void WebUtils::setUILayout(int uid, std::ostringstream& ostr, bool append)
628 {
629     if (isFigure(uid) || hasStyle(uid, __GO_UI_FRAME__))
630     {
631         //TODO clean previous layout before create new one
632
633         if (append == false)
634         {
635             ostr << "var __child__ = " << getElementById(uid) << ";" << std::endl;
636         }
637
638         int layout = getUILayout(uid);
639         switch (layout)
640         {
641             case LAYOUT_BORDER:
642             {
643                 //create a table ( ascii art powa ! )
644                 //+---------------------+
645                 //|         TOP         |
646                 //+---+-------------+---+
647                 //| L |             | R |
648                 //| E |             | I |
649                 //| F |   CENTER    | G |
650                 //| T |             | H |
651                 //|   |             | T |
652                 //+---+-------------+---+
653                 //|       BOTTOM        |
654                 //+---------------------+
655
656                 //table
657                 ostr << "var __table__ = " << createElement("TABLE") << std::endl;
658                 ostr << "__table__.id = " << getIdString(uid, "_table") << ";" << std::endl;
659                 ostr << "__table__.style.margin = '0';" << std::endl;
660                 ostr << "__table__.style.padding = '0';" << std::endl;
661                 ostr << "__table__.style.width = '100%';" << std::endl;
662                 ostr << "__table__.style.height = '100%';" << std::endl;
663                 ostr << "__table__.style.borderCollapse = 'collapse';" << std::endl;
664
665                 //rows
666                 ostr << "var __tr_top__ = " << createElement("TR") << std::endl;
667                 ostr << "var __tr_middle__ = " << createElement("TR") << std::endl;
668                 ostr << "var __tr_bottom__ = " << createElement("TR") << std::endl;
669
670                 //cell in rows
671                 ostr << "var __td_top__ = " << createElement("TD") << std::endl;
672                 ostr << "__td_top__.colSpan = '3';" << std::endl;
673                 ostr << "__td_top__.id = " << getIdString(uid, "_top") << ";" << std::endl;
674                 ostr << "__td_top__.style.width = '100%';" << std::endl;
675
676                 ostr << "var __td_left__ = " << createElement("TD") << std::endl;
677                 ostr << "__td_left__.id = " << getIdString(uid, "_left") << ";" << std::endl;
678                 ostr << "__td_left__.style.height = '100%';" << std::endl;
679
680                 ostr << "var __td_center__ = " << createElement("TD") << std::endl;
681                 ostr << "__td_center__.id = " << getIdString(uid, "_center") << ";" << std::endl;
682                 ostr << "__td_center__.style.width = '100%';" << std::endl;
683                 ostr << "__td_center__.style.height = '100%';" << std::endl;
684
685                 ostr << "var __td_right__ = " << createElement("TD") << std::endl;
686                 ostr << "__td_right__.id = " << getIdString(uid, "_right") << ";" << std::endl;
687                 ostr << "__td_right__.style.height = '100%';" << std::endl;
688
689                 ostr << "var __td_bottom__ = " << createElement("TD") << std::endl;
690                 ostr << "__td_bottom__.colSpan = '3';" << std::endl;
691                 ostr << "__td_bottom__.id = " << getIdString(uid, "_bottom") << ";" << std::endl;
692                 ostr << "__td_bottom__.style.width = '100%';" << std::endl;
693
694                 //hierarchy
695
696                 //td in tr
697                 ostr << "__tr_top__.appendChild(__td_top__);" << std::endl;
698                 ostr << "__tr_middle__.appendChild(__td_left__);" << std::endl;
699                 ostr << "__tr_middle__.appendChild(__td_center__);" << std::endl;
700                 ostr << "__tr_middle__.appendChild(__td_right__);" << std::endl;
701                 ostr << "__tr_bottom__.appendChild(__td_bottom__);" << std::endl;
702
703                 //tr in table
704                 ostr << "__table__.appendChild(__tr_top__);" << std::endl;
705                 ostr << "__table__.appendChild(__tr_middle__);" << std::endl;
706                 ostr << "__table__.appendChild(__tr_bottom__);" << std::endl;
707
708                 //table in parent
709                 ostr << "__child__.appendChild(__table__);" << std::endl;
710
711                 break;
712             }
713             case LAYOUT_GRID:
714             {
715                 break;
716             }
717             case LAYOUT_GRIDBAG:
718             {
719                 //add empty table
720                 ostr << "var __table__ = " << createElement("TABLE") << std::endl;
721                 ostr << "__table__.id = " << getIdString(uid, "_table") << ";" << std::endl;
722                 ostr << "__table__.style.margin = '0';" << std::endl;
723                 ostr << "__table__.style.padding = '0';" << std::endl;
724                 ostr << "__table__.style.width = '100%';" << std::endl;
725                 ostr << "__table__.style.height = '100%';" << std::endl;
726                 ostr << "__table__.style.borderCollapse = 'collapse';" << std::endl;
727
728                 //table in parent
729                 ostr << "__child__.appendChild(__table__);" << std::endl;
730                 break;
731             }
732             default:
733             case LAYOUT_NONE:
734             {
735                 break;
736             }
737
738         }
739     }
740 }
741
742 double WebUtils::getUIMin(int uid)
743 {
744     return getDoubleProperty(uid, __GO_UI_MIN__);
745 }
746
747 void WebUtils::setUIMin(int uid, std::ostringstream& ostr, bool append)
748 {
749     if (hasStyle(uid, __GO_UI_SPINNER__) || hasStyle(uid, __GO_UI_SLIDER__))
750     {
751         double min = getUIMin(uid);
752
753         if (append == false)
754         {
755             ostr << "var __child__ = " << getElementById(uid) << std::endl;
756         }
757
758         ostr << "__child__.min  = '" << min << "';" << std::endl;
759     }
760 }
761
762 double WebUtils::getUIMax(int uid)
763 {
764     return getDoubleProperty(uid, __GO_UI_MAX__);
765 }
766
767 void WebUtils::setUIMax(int uid, std::ostringstream& ostr, bool append)
768 {
769     if (hasStyle(uid, __GO_UI_SPINNER__) || hasStyle(uid, __GO_UI_SLIDER__))
770     {
771         double max = getUIMax(uid);
772
773         if (append == false)
774         {
775             ostr << "var __child__ = " << getElementById(uid) << std::endl;
776         }
777
778         ostr << "__child__.max  = '" << max << "';" << std::endl;
779     }
780 }
781
782 double WebUtils::getUIStep(int uid)
783 {
784     std::vector<double> step(2, 0.);
785     getDoubleVectorProterty(uid, __GO_UI_SLIDERSTEP__, step);
786     return step[0];
787 }
788
789 void WebUtils::setUIStep(int uid, std::ostringstream& ostr, bool append)
790 {
791     if (hasStyle(uid, __GO_UI_SPINNER__) || hasStyle(uid, __GO_UI_SLIDER__))
792     {
793         double step = getUIStep(uid);
794
795         if (append == false)
796         {
797             ostr << "var __child__ = " << getElementById(uid) << std::endl;
798         }
799
800         ostr << "__child__.step  = '" << step << "';" << std::endl;
801     }
802 }
803
804 bool WebUtils::getUIValue(int uid, std::vector<double>& vect)
805 {
806     int size = getIntProperty(uid, __GO_UI_VALUE_SIZE__);
807     vect.resize(size, 0.);
808     getDoubleVectorProterty(uid, __GO_UI_VALUE__, vect);
809     return true;
810 }
811
812 void WebUtils::setUIValue(int uid, std::ostringstream& ostr, bool append)
813 {
814     switch (getStyle(uid))
815     {
816         case __GO_UI_SPINNER__:
817         case __GO_UI_SLIDER__:
818         {
819             std::vector<double> values;
820             getUIValue(uid, values);
821             if (values.size() == 0)
822             {
823                 values.push_back(0);
824             }
825
826             if (append == false)
827             {
828                 ostr << "var __child__ = " << getElementById(uid) << std::endl;
829             }
830
831             ostr << "__child__.value  = '" << values[0] << "';" << std::endl;
832             break;
833         }
834
835         case __GO_UI_TAB__:
836         {
837             std::vector<double> values;
838             getUIValue(uid, values);
839             if (values.size() == 0)
840             {
841                 values.push_back(0);
842             }
843
844             if (append == false)
845             {
846                 ostr << "var __child__ = " << getElementById(uid) << std::endl;
847             }
848
849             ostr << "tabSelectHelper(__child__, " << values[0] << ");" << std::endl;
850             break;
851         }
852     }
853 }
854
855 void WebUtils::getUIBorderPreferredSize(int uid, std::vector<int>& vect)
856 {
857     vect.resize(2, 0);
858     getIntVectorProterty(uid, __GO_UI_BORDER_PREFERREDSIZE__, vect);
859 }
860
861 void WebUtils::getUIBorderPadding(int uid, std::vector<int>& vect)
862 {
863     vect.resize(2, 0);
864     getIntVectorProterty(uid, __GO_BORDER_OPT_PADDING__, vect);
865 }
866
867 int WebUtils::getUIBorderPosition(int uid)
868 {
869     return getIntProperty(uid, __GO_UI_BORDER_POSITION__);
870 }
871
872 void WebUtils::setUIBorder(int uid, std::ostringstream& ostr, bool append)
873 {
874     int parent = getParent(uid);
875     //std::cerr << "setUIBorder : " << uid << " -> " << parent << std::endl;
876     std::string position;
877     std::string padding;
878     int border = getUIBorderPosition(uid);
879
880     std::vector<int> pad;
881     getUIBorderPadding(parent, pad);
882
883     std::vector<int> size;
884     getUIBorderPreferredSize(uid, size);
885
886
887
888     if (append == false)
889     {
890         ostr << "var __child__ = " << getElementById(uid) << std::endl;
891     }
892
893     switch (border)
894     {
895         default:
896         case BORDER_CENTER:
897             position = "_center";
898             ostr << "__child__.style.width = '100%';" << std::endl;
899             ostr << "__child__.style.height = '100%';" << std::endl;
900             padding = getPadding(0, 0, 0, 0);
901             break;
902         case BORDER_BOTTOM:
903             position = "_bottom";
904             ostr << "__child__.style.width = '100%';" << std::endl;
905
906             if (size[1] == -1)
907             {
908                 ostr << "__child__.style.height = 'inherit';" << std::endl;
909             }
910             else
911             {
912                 ostr << "__child__.style.height = '" << getSubPadding(size[1]) << "';" << std::endl;
913             }
914
915             padding = getPadding(pad[1], 0, 0, 0);
916             break;
917         case BORDER_TOP:
918             position = "_top";
919             ostr << "__child__.style.width = '100%';" << std::endl;
920
921             if (size[1] == -1)
922             {
923                 ostr << "__child__.style.height = 'inherit';" << std::endl;
924             }
925             else
926             {
927                 ostr << "__child__.style.height = '" << getSubPadding(size[1]) << "';" << std::endl;
928             }
929
930             padding = getPadding(0, 0, pad[1], 0);
931             break;
932         case BORDER_LEFT:
933             position = "_left";
934
935             if (size[0] == -1)
936             {
937                 ostr << "__child__.style.width = 'inherit';" << std::endl;
938             }
939             else
940             {
941                 ostr << "__child__.style.width = '" << getSubPadding(size[0]) << "';" << std::endl;
942             }
943
944             ostr << "__child__.style.height = '100%';" << std::endl;
945             padding = getPadding(0, pad[0], 0, 0);
946             break;
947         case BORDER_RIGHT:
948             position = "_right";
949
950             if (size[0] == -1)
951             {
952                 ostr << "__child__.style.width = 'inherit';" << std::endl;
953             }
954             else
955             {
956                 ostr << "__child__.style.width = '" << getSubPadding(size[0]) << "';" << std::endl;
957             }
958
959             ostr << "__child__.style.height = '100%';" << std::endl;
960             padding = getPadding(0, 0, 0, pad[0]);
961             break;
962     }
963
964
965     //move child in targeted cell
966     ostr << "__parent__ = " << getElementById(parent, position) << std::endl;
967     ostr << "__parent__.appendChild(__child__);" << std::endl;
968     ostr << "__parent__.style.padding = '" << padding << "';" << std::endl;
969
970     //to well perform positionning, we must clear some default properties
971     //position left, right, width, height,
972
973     ostr << "__child__.style.position = 'inherit';" << std::endl;
974     ostr << "__child__.style.left = 'inherit';" << std::endl;
975     ostr << "__child__.style.bottom = 'inherit';" << std::endl;
976 }
977
978 void WebUtils::getUIGridBagGrid(int uid, std::vector<int>& vect)
979 {
980     vect.resize(4, 0);
981     getIntVectorProterty(uid, __GO_UI_GRIDBAG_GRID__, vect);
982 }
983
984
985 void WebUtils::setUIGridBag(int uid, std::ostringstream& ostr, bool append)
986 {
987     int parent = getParent(uid);
988     std::vector<int> grid;
989     getUIGridBagGrid(uid, grid);
990
991     if (append == false)
992     {
993         ostr << "var __child__ = " << getElementById(uid) << std::endl;
994     }
995
996     ostr << "__child__.style.position = 'inherit';" << std::endl;
997     ostr << "__child__.style.left = 'inherit';" << std::endl;
998     ostr << "__child__.style.bottom = 'inherit';" << std::endl;
999     ostr << "__child__.style.width = '100%';" << std::endl;
1000     ostr << "__child__.style.height = '100%';" << std::endl;
1001     //we have to create a td with grid information and add it to the good cell ( or create if not exist ! )
1002
1003     //build td child
1004     std::string td;
1005     td = "var __td__ = " + createElement("TD");
1006
1007     std::string name("_" + std::to_string(grid[0]) + "_" + std::to_string(grid[1]));
1008     td += "__td__.id = " + getIdString(parent, name) + ";";
1009
1010     if (grid[2] != 1)
1011     {
1012         td += "__td__.colSpan = '" + std::to_string(grid[2]) + "';";
1013     }
1014
1015     if (grid[3] != 1)
1016     {
1017         td += "__td__.rowSpan = '" + std::to_string(grid[3]) + "';";
1018     }
1019
1020     td += "__td__.appendChild(__child__);";
1021
1022     //build or get tr
1023     name = "_" + std::to_string(grid[1]);
1024     std::string tr;
1025     tr = "var __tr__ = " + getElementById(parent, name);
1026     tr += "var __table__ = " + getElementById(parent, "_table");
1027     tr += "if(__tr__ == null){";
1028     tr += "__tr__ = " + createElement("TR");
1029     tr += "__tr__.id = " + getIdString(parent, name) + ";";
1030     tr += "gridbagHelperTR(__table__, __tr__, " + std::to_string(grid[1]) + ");";
1031     tr += "}";
1032     tr += "gridbagHelperTD(__tr__,__td__, " + std::to_string(grid[0]) + ");";
1033
1034     //to force refresh of table, move it to another component and restore it
1035     std::string tricktoforcerefresh("var __scilab__ = document.getElementById('scilab');");
1036     tricktoforcerefresh += "__scilab__.appendChild(__table__);";
1037     tricktoforcerefresh += "var __parent__ = " + getElementById(parent);
1038     tricktoforcerefresh += "__parent__.appendChild(__table__);";
1039
1040
1041     ostr << td << std::endl;
1042     ostr << tr << std::endl;
1043     ostr << tricktoforcerefresh << std::endl;
1044 }
1045
1046 bool WebUtils::hasCallback(int uid)
1047 {
1048     return getStringProperty(uid, __GO_CALLBACK__) != "";
1049 }
1050
1051 void WebUtils::setCallback(int uid, std::ostringstream& ostr, bool append)
1052 {
1053     if (append == false)
1054     {
1055         ostr << "var __child__ = " << getElementById(uid) << std::endl;
1056     }
1057
1058     std::string event;
1059     std::string func;
1060     switch (getStyle(uid))
1061     {
1062         case __GO_UI_PUSHBUTTON__ :
1063             event = "click";
1064             func = "onPushButton";
1065             break;
1066         case __GO_UI_CHECKBOX__:
1067             event = "click";
1068             func = "onCheckBox";
1069             break;
1070         case __GO_UI_RADIOBUTTON__:
1071             event = "click";
1072             func = "onRadioButton";
1073             break;
1074         case __GO_UI_LISTBOX__:
1075             event = "change";
1076             func = "onListBox";
1077             break;
1078         case __GO_UI_POPUPMENU__:
1079             event = "change";
1080             func = "onComboBox";
1081             break;
1082         /*
1083                 case __GO_UI_TAB__:
1084                     event = "click";
1085                     func = "onPushButton";
1086                     break;
1087         */
1088         case __GO_UI_SLIDER__:
1089             event = "input";
1090             func = "onSlider";
1091             break;
1092         case __GO_UI_EDIT__:
1093             event = "input";
1094             func = "onEditBox";
1095             break;
1096         case __GO_UI_SPINNER__:
1097             event = "input";
1098             func = "onSpinner";
1099             break;
1100         default :
1101             return;
1102     }
1103
1104     //add callback listener
1105     ostr << "__child__.addEventListener('" << event << "', " << func << ");" << std::endl;
1106 }
1107
1108 //is
1109 bool WebUtils::isInputType(int uid)
1110 {
1111     switch (getStyle(uid))
1112     {
1113         case __GO_UI_EDIT__ :
1114         case __GO_UI_SLIDER__:
1115         case __GO_UI_SPINNER__ :
1116             return true;
1117         default :
1118             return false;
1119     }
1120 }
1121
1122 bool WebUtils::hasStyle(int uid, int style)
1123 {
1124     if (isUIcontrol(uid))
1125     {
1126         return getStyle(uid) == style;
1127     }
1128
1129     return false;
1130 }
1131
1132 bool WebUtils::isFigure(int uid)
1133 {
1134     return getType(uid) == __GO_FIGURE__;
1135 }
1136
1137 bool WebUtils::isUIcontrol(int uid)
1138 {
1139     return getType(uid) == __GO_UICONTROL__;
1140 }
1141
1142 bool WebUtils::isButton(int uid)
1143 {
1144     return hasStyle(uid, __GO_UI_PUSHBUTTON__);
1145 }
1146
1147
1148 //create
1149 bool WebUtils::createFigure(int uid, std::ostringstream& ostr)
1150 {
1151     //set figure uid to help children to find it
1152     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1153     ostr << "var __temp__ = " << createElement("DIV") << std::endl;
1154     ostr << "__temp__.id = " << getIdString(uid) << ";" << std::endl;
1155     ostr << "__temp__.className = 'GO_FIGURE';" << std::endl;
1156     ostr << "__parent__.innerHTML += '<br>';" << std::endl;
1157     ostr << "__parent__.appendChild(__temp__);" << std::endl;
1158     ostr << "__parent__.innerHTML += '<br>';" << std::endl;
1159     return true;
1160 }
1161
1162 bool WebUtils::createUIControl(int uid, std::ostringstream& ostr)
1163 {
1164     int style = getStyle(uid);
1165     switch (style)
1166     {
1167         case __GO_UI_FRAME__:
1168             return createFrame(uid, ostr);
1169         case __GO_UI_PUSHBUTTON__:
1170             return createPushButton(uid, ostr);
1171         case __GO_UI_TEXT__:
1172             return createText(uid, ostr);
1173         case __GO_UI_EDIT__:
1174             return createEdit(uid, ostr);
1175         case __GO_UI_CHECKBOX__:
1176             return createCheckbox(uid, ostr);
1177         case __GO_UI_RADIOBUTTON__:
1178             return createRadio(uid, ostr);
1179         case __GO_UI_SLIDER__:
1180             return createSlider(uid, ostr);
1181         case __GO_UI_LISTBOX__:
1182             return createListbox(uid, ostr);
1183         case __GO_UI_POPUPMENU__:
1184             return createCombobox(uid, ostr);
1185         case __GO_UI_SPINNER__:
1186             return createSpinner(uid, ostr);
1187         case __GO_UI_TAB__:
1188             return createTab(uid, ostr);
1189         default:
1190             return false;
1191     }
1192 }
1193
1194 bool WebUtils::createCommonIUControl(int uid, const std::string& htmlType, const std::string& cssClass, std::ostringstream& ostr)
1195 {
1196     //create a button, with no parent, wait update with _GO_PARENT to update it
1197     ostr << "var __temp__ = " << createElement(htmlType) << std::endl;
1198     ostr << "__temp__.id = " << getIdString(uid) << ";" << std::endl;
1199     ostr << "__temp__.className = '" << cssClass << "';" << std::endl;
1200
1201     return true;
1202 }
1203
1204 bool WebUtils::createPushButton(int uid, std::ostringstream& ostr)
1205 {
1206     //create a <button>
1207     createCommonIUControl(uid, "BUTTON", "GO_PUSHBUTTON", ostr);
1208     //add item temporary in main scilabview div waiting __GO_PARENT__ update
1209     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1210     ostr << "__parent__.appendChild(__temp__);" << std::endl;
1211
1212     return true;
1213 }
1214
1215 bool WebUtils::createFrame(int uid, std::ostringstream& ostr)
1216 {
1217     //create a <div>
1218     createCommonIUControl(uid, "DIV", "GO_FRAME", ostr);
1219     //add item temporary in main div waiting __GO_PARENT__ update
1220     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1221     ostr << "__parent__.appendChild(__temp__);" << std::endl;
1222
1223     return true;
1224 }
1225
1226 bool WebUtils::createText(int uid, std::ostringstream& ostr)
1227 {
1228     //create a <div>
1229     createCommonIUControl(uid, "LABEL", "GO_TEXT", ostr);
1230     //add item temporary in main div waiting __GO_PARENT__ update
1231     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1232     ostr << "__parent__.appendChild(__temp__);" << std::endl;
1233
1234     return true;
1235 }
1236
1237 bool WebUtils::createEdit(int uid, std::ostringstream& ostr)
1238 {
1239     //create a <input>
1240     createCommonIUControl(uid, "INPUT", "GO_EDIT", ostr);
1241     ostr << "__temp__.type = 'text';" << std::endl;
1242     //add item temporary in main div waiting __GO_PARENT__ update
1243     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1244     ostr << "__parent__.appendChild(__temp__);" << std::endl;
1245
1246     return true;
1247 }
1248
1249 bool WebUtils::createCheckbox(int uid, std::ostringstream& ostr)
1250 {
1251     //create a <input>
1252
1253     //for checkbox we need to create 3 elements.
1254
1255     //a div to enclose others
1256     ostr << "var __main__ = " << createElement("DIV") << std::endl;
1257     ostr << "__main__.id = " << getIdString(uid) << ";" << std::endl;
1258     ostr << "__main__.className = 'GO_CHECKBOX';" << std::endl;
1259     //add item temporary in main div waiting __GO_PARENT__ update
1260     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1261     ostr << "__parent__.appendChild(__main__);" << std::endl;
1262
1263     //the checkbox itself
1264     ostr << "var __temp__ = " << createElement("INPUT") << std::endl;
1265     ostr << "__temp__.className = 'GO_CHECKBOX_CHECKBOX';" << std::endl;
1266     ostr << "__temp__.type = 'checkbox';" << std::endl;
1267     ostr << "__temp__.id = " << getIdString(uid, "_checkbox") << ";" << std::endl;
1268     //add item temporary in main div waiting __GO_PARENT__ update
1269     ostr << "__main__.appendChild(__temp__);" << std::endl;
1270
1271     //the label of the checkbox
1272     ostr << "var __label__ = " << createElement("LABEL") << std::endl;
1273     ostr << "__label__.id = " << getIdString(uid, "_label") << ";" << std::endl;
1274     ostr << "__label__.className = 'GO_CHECKBOX_LABEL';" << std::endl;
1275     ostr << "__label__.htmlFor = " << getIdString(uid, "_checkbox") << ";" << std::endl;
1276     //add item temporary in main div waiting __GO_PARENT__ update
1277     ostr << "__main__.appendChild(__label__);" << std::endl;
1278
1279     return true;
1280 }
1281
1282 bool WebUtils::createRadio(int uid, std::ostringstream& ostr)
1283 {
1284     //create a <input>
1285
1286     //for radio we need to create 3 elements.
1287
1288     //a div to enclose others
1289     ostr << "var __main__ = " << createElement("DIV") << std::endl;
1290     ostr << "__main__.id = " << getIdString(uid) << ";" << std::endl;
1291     ostr << "__main__.className = 'GO_RADIO';" << std::endl;
1292     //add item temporary in main div waiting __GO_PARENT__ update
1293     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1294     ostr << "__parent__.appendChild(__main__)" << std::endl;
1295
1296     //the radio itself
1297     ostr << "var __temp__ = " << createElement("INPUT") << std::endl;
1298     ostr << "__temp__.className = 'GO_RADIO_RADIO';" << std::endl;
1299     ostr << "__temp__.type = 'radio';" << std::endl;
1300     ostr << "__temp__.id = " << getIdString(uid, "_radio") << ";" << std::endl;
1301     //add item temporary in main div waiting __GO_PARENT__ update
1302     ostr << "__main__.appendChild(__temp__);" << std::endl;
1303
1304     //the label of the checkbox
1305     ostr << "var __label__ = " << createElement("LABEL") << std::endl;
1306     ostr << "__label__.id = " << getIdString(uid, "_label") << ";" << std::endl;
1307     ostr << "__label__.className = 'GO_RADIO_LABEL';" << std::endl;
1308     ostr << "__label__.htmlFor = " << getIdString(uid, "_radio") << ";" << std::endl;
1309     //add item temporary in main div waiting __GO_PARENT__ update
1310     ostr << "__main__.appendChild(__label__);" << std::endl;
1311
1312     return true;
1313 }
1314
1315 bool WebUtils::createSlider(int uid, std::ostringstream& ostr)
1316 {
1317     //create a <input>
1318     createCommonIUControl(uid, "INPUT", "GO_SLIDER", ostr);
1319     ostr << "__temp__.type = 'range';" << std::endl;
1320     //add item temporary in main div waiting __GO_PARENT__ update
1321     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1322     ostr << "__parent__.appendChild(__temp__);" << std::endl;
1323
1324     return true;
1325 }
1326
1327 bool WebUtils::createListbox(int uid, std::ostringstream& ostr)
1328 {
1329     //create a <input>
1330     createCommonIUControl(uid, "SELECT", "GO_LISTBOX", ostr);
1331     //add item temporary in main div waiting __GO_PARENT__ update
1332     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1333     ostr << "__parent__.appendChild(__temp__);" << std::endl;
1334
1335     return true;
1336 }
1337
1338 bool WebUtils::createCombobox(int uid, std::ostringstream& ostr)
1339 {
1340     //create a <input>
1341     createCommonIUControl(uid, "SELECT", "GO_COMBOBOX", ostr);
1342     ostr << "__temp__.size = 1;" << std::endl;
1343     //add item temporary in main div waiting __GO_PARENT__ update
1344     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1345     ostr << "__parent__.appendChild(__temp__);" << std::endl;
1346
1347     return true;
1348 }
1349
1350 bool WebUtils::createSpinner(int uid, std::ostringstream& ostr)
1351 {
1352     //create a <input>
1353     createCommonIUControl(uid, "INPUT", "GO_SPINNER", ostr);
1354     ostr << "__temp__.type = 'number';" << std::endl;
1355     //add item temporary in main div waiting __GO_PARENT__ update
1356     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1357     ostr << "__parent__.appendChild(__temp__);" << std::endl;
1358
1359     return true;
1360 }
1361
1362 bool WebUtils::createTab(int uid, std::ostringstream& ostr)
1363 {
1364     //create a <input>
1365     createCommonIUControl(uid, "DIV", "GO_TAB", ostr);
1366
1367     //create a list
1368     ostr << "var __ul__ = " << createElement("UL") << std::endl;
1369     ostr << "__ul__.id = " << getIdString(uid, "_ul") << ";" << std::endl;
1370     ostr << "__temp__.appendChild(__ul__);" << std::endl;
1371
1372
1373     //add item temporary in main div waiting __GO_PARENT__ update
1374     ostr << "var __parent__ = document.getElementById('scilab');" << std::endl;
1375     ostr << "__parent__.appendChild(__temp__);" << std::endl;
1376
1377     return true;
1378 }
1379
1380 bool WebUtils::addTabChild(int uid, int child, std::ostringstream& ostr)
1381 {
1382     std::vector<std::string> vect;
1383
1384     //create il
1385     ostr << "var __li__ = " << createElement("LI") << std::endl;
1386     ostr << "__li__.id = " << getIdString(child, "_li") << ";" << std::endl;
1387
1388     //create input button
1389     ostr << "var __btn__ = " << createElement("INPUT") << std::endl;
1390     ostr << "__btn__.id = " << getIdString(child, "_btn") << ";" << std::endl;
1391     ostr << "__btn__.type = 'button';" << std::endl;
1392     ostr << "__btn__.addEventListener('click', onTab);" << std::endl;
1393
1394     //add button in il
1395     ostr << "__li__.appendChild(__btn__);" << std::endl;
1396
1397     //add il as first child in ul
1398     ostr << "var __ul__ = " << getElementById(uid, "_ul") << std::endl;
1399     ostr << "__ul__.insertBefore(__li__, __ul__.firstChild);" << std::endl;
1400
1401     //update child properties
1402     ostr << "__child__.style.position = 'inherit';" << std::endl;
1403     ostr << "__child__.style.left = 'inherit';" << std::endl;
1404     ostr << "__child__.style.bottom = 'inherit';" << std::endl;
1405     ostr << "__child__.style.width = '100%';" << std::endl;
1406     ostr << "__child__.style.height = '100%';" << std::endl;
1407
1408     //be carefull, we change __child__ to tab uid instead of frame uid
1409     setUIValue(uid, ostr);
1410     return true;
1411 }
1412
1413
1414 bool WebUtils::deleteObject(int uid, std::ostringstream& ostr)
1415 {
1416     ostr << "var __child__ = " << getElementById(uid) << std::endl;
1417     ostr << "__child__.parentNode.removeChild(__child__);" << std::endl;
1418
1419     return true;
1420 }
1421
1422 bool WebUtils::updateDefaultProperties(int uid, std::ostringstream& ostr)
1423 {
1424     //visible
1425     setVisible(uid, ostr);
1426
1427     //backgoundcolor
1428     setUIBackgroundColor(uid, ostr, true);
1429
1430     //enable
1431     setUIEnable(uid, ostr, true);
1432
1433     //fontangle
1434     setUIFontAngle(uid, ostr, true);
1435
1436     //fontname
1437     setUIFontName(uid, ostr, true);
1438
1439     //fontsize & fontunits
1440     setUIFontSize(uid, ostr, true);
1441
1442     //fontweight
1443     setUIFontWeight(uid, ostr, true);
1444
1445     //foregroundcolor
1446     setUIForegroundColor(uid, ostr, true);
1447
1448     //horizontalalignment
1449     setUIHorizontalAlignment(uid, ostr, true);
1450
1451     //relief ?
1452     setUIRelief(uid, ostr, true);
1453
1454     //string
1455     setUIString(uid, ostr, true);
1456
1457     //verticalalignment
1458     setUIVerticalAlignment(uid, ostr, true);
1459
1460     //position
1461     setUIPosition(uid, ostr, true);
1462
1463     //layout ?
1464     setUILayout(uid, ostr, true);
1465
1466     //min
1467     setUIMin(uid, ostr, true);
1468
1469     //max
1470     setUIMax(uid, ostr, true);
1471
1472     //step
1473     setUIStep(uid, ostr, true);
1474
1475     //vaue
1476     setUIValue(uid, ostr, true);
1477
1478     //set callback uses to update values from web view
1479     setCallback(uid, ostr, true);
1480
1481     return true;
1482 }
1483
1484 bool WebUtils::set(int prop, int uid, std::ostringstream& ostr, bool append)
1485 {
1486     SETTER::iterator it = setter.find(prop);
1487     if (it != setter.end())
1488     {
1489         it->second(uid, ostr, append);
1490
1491         return true;
1492     }
1493
1494     return false;
1495 }
1496
1497 void WebUtils::fillSetter()
1498 {
1499     setter[__GO_PARENT__] = WebUtils::setParent;
1500     setter[__GO_POSITION__] = WebUtils::setUIPosition;
1501     setter[__GO_SIZE__] = WebUtils::setFigureSize;
1502     setter[__GO_UI_STRING__] = WebUtils::setUIString;
1503     setter[__GO_VISIBLE__] = WebUtils::setVisible;
1504     setter[__GO_UI_ENABLE__] = WebUtils::setUIEnable;
1505     setter[__GO_UI_BACKGROUNDCOLOR__] = WebUtils::setUIBackgroundColor;
1506     setter[__GO_UI_FONTANGLE__] = WebUtils::setUIFontAngle;
1507     setter[__GO_UI_FONTNAME__] = WebUtils::setUIFontName;
1508     setter[__GO_UI_FONTSIZE__] = WebUtils::setUIFontSize;
1509     setter[__GO_UI_FONTWEIGHT__] = WebUtils::setUIFontWeight;
1510     setter[__GO_UI_FOREGROUNDCOLOR__] = WebUtils::setUIForegroundColor;
1511     setter[__GO_UI_HORIZONTALALIGNMENT__] = WebUtils::setUIHorizontalAlignment;
1512     setter[__GO_UI_RELIEF__] = WebUtils::setUIRelief;
1513     setter[__GO_UI_VERTICALALIGNMENT__] = WebUtils::setUIVerticalAlignment;
1514     setter[__GO_LAYOUT__] = WebUtils::setUILayout;
1515     setter[__GO_UI_MIN__] = WebUtils::setUIMin;
1516     setter[__GO_UI_MAX__] = WebUtils::setUIMax;
1517     setter[__GO_UI_SLIDERSTEP__] = WebUtils::setUIStep;
1518     setter[__GO_UI_VALUE__] = WebUtils::setUIValue;
1519     //preferred size is the last property to be set for border constraints
1520     setter[__GO_UI_BORDER_PREFERREDSIZE__] = WebUtils::setUIBorder;
1521     //preferred size is the last property to be set for gridbag constraints
1522     setter[__GO_UI_GRIDBAG_PREFERREDSIZE__] = WebUtils::setUIGridBag;
1523     //setter[__GO_CALLBACK__] = WebUtils::setCallback;
1524 }
1525
1526 bool WebUtils::updateValue(int uid, const std::string& value)
1527 {
1528     if (hasStyle(uid, __GO_UI_EDIT__))
1529     {
1530         std::vector<std::string> v(1, value);
1531         setStringVectorProperty(uid, __GO_UI_STRING__, v);
1532     }
1533
1534     return false;
1535 }
1536
1537 bool WebUtils::updateValue(int uid, const std::vector<double>& values)
1538 {
1539     setDoubleVectorProperty(uid, __GO_UI_VALUE__, values);
1540     return false;
1541 }
1542
1543 bool WebUtils::updateValue(int uid, double value)
1544 {
1545     std::vector<double> v(1, value);
1546     setDoubleVectorProperty(uid, __GO_UI_VALUE__, v);
1547     return false;
1548 }
1549
1550 bool WebUtils::updateValue(int uid, bool value)
1551 {
1552     std::vector<double> v(1, value ? getUIMax(uid) : getUIMin(uid));
1553     setDoubleVectorProperty(uid, __GO_UI_VALUE__, v);
1554     return false;
1555 }
1556
1557 void WebUtils::addInWaitingQueue(int uid, int prop)
1558 {
1559     std::cerr << "add in queue : " << uid << "(" << prop << ")" << std::endl;
1560     waitprop[uid].push_back(prop);
1561 }
1562
1563 void WebUtils::setWaitingProperties(int uid, std::ostringstream& ostr, bool append)
1564 {
1565     WAITING_PROP::iterator it = waitprop.find(uid);
1566     if (it != waitprop.end())
1567     {
1568         for (int prop : it->second)
1569         {
1570             set(prop, uid, ostr, append);
1571         }
1572         waitprop.erase(it);
1573     }
1574 }