add axes in web view
[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 #ifdef _MSC_VER
17 #include <io.h>
18 #endif
19 #include <string.h>
20 #include <iostream>
21 #include <cmath>
22 #include "webutils.hxx"
23
24 extern "C"
25 {
26 #include "setGraphicObjectProperty.h"
27 #include "getGraphicObjectProperty.h"
28 #include "graphicObjectProperties.h"
29 #include "deleteGraphicObject.h"
30 #include "LayoutType.h"
31 #include "BorderLayoutType.h"
32 #include "FrameBorderType.h"
33 #include "copyfile.h"
34 #include "charEncoding.h"
35 #include "sci_malloc.h"
36 }
37
38 WebUtils::SETTER WebUtils::setterUIControl;
39 WebUtils::SETTER WebUtils::setterFigure;
40 WebUtils::SETTER WebUtils::setterAxes;
41 WebUtils::WAITING_PROP WebUtils::waitprop;
42 std::string WebUtils::imagePath;
43
44 int WebUtils::getIntProperty(int uid, int prop)
45 {
46     int val = 0;
47     int* pVal = &val;
48     getGraphicObjectProperty(uid, prop, jni_int, (void **)&pVal);
49     return val;
50 }
51
52 bool WebUtils::getBoolProperty(int uid, int prop)
53 {
54     int val = 0;
55     int* pVal = &val;
56     getGraphicObjectProperty(uid, prop, jni_bool, (void **)&pVal);
57     return val != 0;
58 }
59
60 double WebUtils::getDoubleProperty(int uid, int prop)
61 {
62     double val = 0;
63     double* pVal = &val;
64     getGraphicObjectProperty(uid, prop, jni_double, (void **)&pVal);
65     return val;
66 }
67
68 void WebUtils::getDoubleVectorProterty(int uid, int prop, std::vector<double>& vect)
69 {
70     double* values = NULL;
71     getGraphicObjectProperty(uid, prop, jni_double_vector, (void**)&values);
72
73     int size = (int)vect.size();
74     memcpy(vect.data(), values, size * sizeof(double));
75     releaseGraphicObjectProperty(prop, values, jni_double_vector, size);
76 }
77
78 void WebUtils::getIntVectorProterty(int uid, int prop, std::vector<int>& vect)
79 {
80     int* values = NULL;
81     getGraphicObjectProperty(uid, prop, jni_int_vector, (void**)&values);
82
83     int size = (int)vect.size();
84     memcpy(vect.data(), values, size * sizeof(int));
85     releaseGraphicObjectProperty(prop, values, jni_int_vector, size);
86 }
87
88 std::string WebUtils::getStringProperty(int uid, int prop)
89 {
90     std::string str;
91     char* val = NULL;
92     getGraphicObjectProperty(uid, prop, jni_string, (void**)&val);
93     str = val;
94     releaseGraphicObjectProperty(prop, val, jni_string, 1);
95     return str;
96 }
97
98 void WebUtils::getStringVectorProperty(int uid, int prop, std::vector<std::string>& vect)
99 {
100     char **pstString = NULL;
101     getGraphicObjectProperty(uid, prop, jni_string_vector, (void **)&pstString);
102
103     int size = (int)vect.size();
104     for (int i = 0; i < size; ++i)
105     {
106         vect[i] = pstString[i];
107     }
108
109     releaseGraphicObjectProperty(prop, pstString, jni_string_vector, size);
110 }
111
112 bool WebUtils::setStringProperty(int uid, int prop, const std::string& value)
113 {
114     setGraphicObjectProperty(uid, prop, value.data(), jni_string, 1);
115     return true;
116 }
117
118 bool WebUtils::setStringVectorProperty(int uid, int prop, const std::vector<std::string>& values)
119 {
120     int size = (int)values.size();
121     std::vector<const char*> c(size, NULL);
122     for (int i = 0; i < size; ++i)
123     {
124         c[i] = values[i].data();
125     }
126
127     setGraphicObjectProperty(uid, prop, (void**)c.data(), jni_string_vector, size);
128     return true;
129 }
130
131 bool WebUtils::setDoubleVectorProperty(int uid, int prop, const std::vector<double>& values)
132 {
133     setGraphicObjectProperty(uid, prop, values.data(), jni_double_vector, (int)values.size());
134     return true;
135 }
136
137 std::string WebUtils::getColor(const std::vector<double>& c)
138 {
139     if (c[0] == -1)
140     {
141         return "''";
142     }
143
144     std::string str("'rgb(");
145
146     //use abs to convert [-1 -1 -1 ] to (255, 255, 255)
147     str += std::to_string((int)std::abs(c[0] * 255));
148     for (int i = 1; i < c.size(); ++i)
149     {
150         str += ", " + std::to_string((int)std::abs(c[i] * 255));
151     }
152
153     str += ")'";
154
155     return str;
156 }
157
158 void WebUtils::setImagePath(const std::string& path)
159 {
160     imagePath = path;
161 }
162
163 std::string WebUtils::getImagePath()
164 {
165     return imagePath;
166 }
167
168 bool WebUtils::isManaged(int uid)
169 {
170     int type = getType(uid);
171     switch (type)
172     {
173         case __GO_FIGURE__:
174         case __GO_UICONTROL__:
175         case __GO_AXIS__:
176             return true;
177         default:
178             return false;
179     }
180 }
181
182 //commons
183 int WebUtils::getType(int uid)
184 {
185     return getIntProperty(uid, __GO_TYPE__);
186 }
187
188 int WebUtils::getStyle(int uid)
189 {
190     return getIntProperty(uid, __GO_STYLE__);
191 }
192
193 bool WebUtils::hasValidParent(int uid)
194 {
195     return getParent(uid) != 0;
196 }
197
198 int WebUtils::getParent(int uid)
199 {
200     return getIntProperty(uid, __GO_PARENT__);
201 }
202
203 void WebUtils::setParent(int uid, std::ostringstream& ostr)
204 {
205     int parent = getParent(uid);
206
207     ostr << "setParent(" << uid << ", " << parent << ");";
208
209     if (hasStyle(parent, __GO_UI_TAB__))
210     {
211         //add button and properties for tab
212         addTabChild(parent, uid, ostr);
213     }
214
215     if (getUILayout(parent) == LAYOUT_BORDER && hasStyle(parent, __GO_UI_TAB__) == false)
216     {
217         //force update of border position, especially for center
218         addInWaitingQueue(uid, __GO_UI_BORDER_POSITION__);
219     }
220
221     setWaitingProperties(uid, ostr);
222 }
223
224 void WebUtils::getFigureSize(int uid, std::vector<int>& vect)
225 {
226     int fig = getFigureId(uid);
227     vect.resize(2, 0);
228     getIntVectorProterty(fig, __GO_AXES_SIZE__, vect);
229 }
230
231 void WebUtils::setFigureSize(int uid, std::ostringstream& ostr)
232 {
233     std::vector<int> size;
234     getFigureSize(uid, size);
235
236     ostr << "setFigureSize('" << uid << "', [" << size[0] << ", " << size[1] << "]);";
237 }
238
239 void WebUtils::getFigureName(int uid, std::string& val)
240 {
241     val = getStringProperty(uid, __GO_NAME__);
242 }
243
244 void WebUtils::setFigureName(int uid, std::ostringstream& ostr)
245 {
246     std::string val;
247     getFigureName(uid, val);
248
249     ostr << "setFigureName('" << uid << "', '" << val << "');";
250 }
251
252
253 int WebUtils::getFigureId(int uid)
254 {
255     int id = uid;
256     while (isFigure(id) == false)
257     {
258         id = getParent(id);
259     }
260
261     return id;
262 }
263
264 void WebUtils::getUIUnits(int uid, std::string& val)
265 {
266     val = getStringProperty(uid, __GO_UI_UNITS__);
267 }
268
269 void WebUtils::getUIPosition(int uid, std::vector<double>& vect)
270 {
271     vect.resize(4, 0.);
272     getDoubleVectorProterty(uid, __GO_POSITION__, vect);
273 }
274
275 void WebUtils::getUIString(int uid, std::vector<std::string> & vect)
276 {
277     int size = getIntProperty(uid, __GO_UI_STRING_SIZE__);
278     //int col = getIntProperty(uid, __GO_UI_STRING_COLNB__);
279     vect.resize(size, "");
280     getStringVectorProperty(uid, __GO_UI_STRING__, vect);
281 }
282
283
284 void WebUtils::setUIPosition(int uid, std::ostringstream& ostr)
285 {
286     std::string units;
287     getUIUnits(uid, units);
288     std::vector<double> pos;
289     getUIPosition(uid, pos);
290
291     ostr << "setUIPosition('" << uid << "', [" << pos[0] << ", " << pos[1] << ", " << pos[2] << ", " << pos[3] << "], '" << units << "');";
292
293     //to ensure vertical alignement, adapt style.line-height
294     if (hasStyle(uid, __GO_UI_TEXT__) || hasStyle(uid, __GO_UI_CHECKBOX__) || hasStyle(uid, __GO_UI_RADIOBUTTON__))
295     {
296         std::string v;
297         getUIVerticalAlignment(uid, v);
298         std::string value;
299         if (v == "middle")
300         {
301             value = std::to_string((int)pos[3]) + "px";
302         }
303         else
304         {
305             value = "initial";
306         }
307
308         ostr << "setUIVerticalAlignment('" << uid << "', '" << value << "');";
309     }
310 }
311
312 void WebUtils::setUIString(int uid, std::ostringstream& ostr)
313 {
314     std::vector<std::string> s;
315     getUIString(uid, s);
316     int size = (int)s.size();
317
318     std::string strings = "[";
319     if (size)
320     {
321         strings += ("'" + s[0] + "'");
322         for (int i = 1; i < size; ++i)
323         {
324             strings += ", ";
325             strings += ("'" + s[i] + "'");
326         }
327     }
328     else
329     {
330         strings += "''";
331     }
332
333     strings += "]";
334
335     int parent = getParent(uid);
336
337     ostr << "setUIString('" << uid << "', " + strings + ", '" << parent << "');";
338 }
339
340 bool WebUtils::getVisible(int uid)
341 {
342     return getBoolProperty(uid, __GO_VISIBLE__);
343 }
344
345 void WebUtils::setVisible(int uid, std::ostringstream& ostr)
346 {
347     //reverse flag value
348     std::string v = getVisible(uid) ? "inherit" : "hidden";
349     ostr << "setVisible('" << uid << "', '" + v << "');";
350 }
351
352 bool WebUtils::getUIEnable(int uid)
353 {
354     return getBoolProperty(uid, __GO_UI_ENABLE__);
355 }
356
357 void WebUtils::setUIEnable(int uid, std::ostringstream& ostr)
358 {
359     //reverse flag value
360     std::string v = getUIEnable(uid) ? "true" : "false";
361     ostr << "setUIEnable('" << uid << "', " + v << ");";
362 }
363
364 bool WebUtils::getUIBackgroundColor(int uid, std::vector<double>& vect)
365 {
366     vect.resize(3, 0.);
367     getDoubleVectorProterty(uid, __GO_UI_BACKGROUNDCOLOR__, vect);
368     return true;
369 }
370
371 void WebUtils::setUIBackgroundColor(int uid, std::ostringstream& ostr)
372 {
373     std::vector<double> c;
374     getUIBackgroundColor(uid, c);
375     ostr << "setUIBackgroundColor('" << uid << "', " + getColor(c) << ");";
376 }
377
378 bool WebUtils::getUIFontAngle(int uid, std::string& val)
379 {
380     val = getStringProperty(uid, __GO_UI_FONTANGLE__);
381     return true;
382 }
383
384 void WebUtils::setUIFontAngle(int uid, std::ostringstream& ostr)
385 {
386     std::string angle;
387     getUIFontAngle(uid, angle);
388     ostr << "setUIFontAngle('" << uid << "', '" + angle << "');";
389 }
390
391 bool WebUtils::getUIFontName(int uid, std::string& val)
392 {
393     val = getStringProperty(uid, __GO_UI_FONTNAME__);
394     return true;
395 }
396
397 void WebUtils::setUIFontName(int uid, std::ostringstream& ostr)
398 {
399     std::string font;
400     getUIFontName(uid, font);
401     ostr << "setUIFontName('" << uid << "', '" + font << "');";
402 }
403
404 bool WebUtils::getUIFontUnits(int uid, std::string& val)
405 {
406     val =  getStringProperty(uid, __GO_UI_FONTUNITS__);
407     return true;
408 }
409
410 double WebUtils::getUIFontSize(int uid)
411 {
412     return getDoubleProperty(uid, __GO_UI_FONTSIZE__);
413 }
414
415 void WebUtils::setUIFontSize(int uid, std::ostringstream& ostr)
416 {
417     int size = (int)getUIFontSize(uid);
418
419     std::string units;
420     getUIFontUnits(uid, units);
421
422     if (units == "pixels")
423     {
424         units = "px";
425     }
426     else //"points"
427     {
428         units = "pt";
429         size = (int)(size * 0.75);
430     }
431
432     ostr << "setUIFontSize('" << uid << "', '" << size << units << "');";
433
434 }
435
436 bool WebUtils::getUIFontWeight(int uid, std::string& val)
437 {
438     val = getStringProperty(uid, __GO_UI_FONTWEIGHT__);
439     return true;
440 }
441
442 void WebUtils::setUIFontWeight(int uid, std::ostringstream& ostr)
443 {
444     std::string weight;
445     getUIFontWeight(uid, weight);
446     ostr << "setUIFontWeight('" << uid << "', '" << weight << "');";
447 }
448
449 bool WebUtils::getUIForegroundColor(int uid, std::vector<double>& vect)
450 {
451     vect.resize(3, 0.);
452     getDoubleVectorProterty(uid, __GO_UI_FOREGROUNDCOLOR__, vect);
453     return true;
454 }
455
456 void WebUtils::setUIForegroundColor(int uid, std::ostringstream& ostr)
457 {
458     std::vector<double> c;
459     getUIForegroundColor(uid, c);
460     ostr << "setUIForegroundColor('" << uid << "', " + getColor(c) << ");";
461 }
462
463 bool WebUtils::getUIHorizontalAlignment(int uid, std::string& val)
464 {
465     val = getStringProperty(uid, __GO_UI_HORIZONTALALIGNMENT__);
466     return true;
467 }
468
469 void WebUtils::setUIHorizontalAlignment(int uid, std::ostringstream& ostr)
470 {
471     std::string align;
472     getUIHorizontalAlignment(uid, align);
473     ostr << "setUIHorizontalAlignment('" << uid << "', '" + align << "');";
474 }
475
476 bool WebUtils::getUIRelief(int uid, std::string& val)
477 {
478     val = getStringProperty(uid, __GO_UI_RELIEF__);
479     return true;
480 }
481
482 void WebUtils::setUIRelief(int uid, std::ostringstream& ostr)
483 {
484 }
485
486 bool WebUtils::getUIVerticalAlignment(int uid, std::string& val)
487 {
488     val = getStringProperty(uid, __GO_UI_VERTICALALIGNMENT__);
489     return true;
490 }
491
492 void WebUtils::setUIVerticalAlignment(int uid, std::ostringstream& ostr)
493 {
494     std::string align;
495     getUIVerticalAlignment(uid, align);
496     ostr << "setUIVerticalAlignment('" << uid << "', '" + align << "');";
497 }
498
499 int WebUtils::getUILayout(int uid)
500 {
501     return getIntProperty(uid, __GO_LAYOUT__);
502 }
503
504 void WebUtils::setUILayout(int uid, std::ostringstream& ostr)
505 {
506     if (isFigure(uid) || hasStyle(uid, __GO_UI_FRAME__))
507     {
508         //TODO clean previous layout before create new one
509         ostr << "setUILayout('" << uid << "', " << getUILayout(uid) << ");";
510     }
511 }
512
513 double WebUtils::getUIMin(int uid)
514 {
515     return getDoubleProperty(uid, __GO_UI_MIN__);
516 }
517
518 void WebUtils::setUIMin(int uid, std::ostringstream& ostr)
519 {
520     if (hasStyle(uid, __GO_UI_SPINNER__) || hasStyle(uid, __GO_UI_SLIDER__))
521     {
522         ostr << "setUIMin('" << uid << "', '" << getUIMin(uid) << "');";
523     }
524 }
525
526 double WebUtils::getUIMax(int uid)
527 {
528     return getDoubleProperty(uid, __GO_UI_MAX__);
529 }
530
531 void WebUtils::setUIMax(int uid, std::ostringstream& ostr)
532 {
533     if (hasStyle(uid, __GO_UI_SPINNER__) || hasStyle(uid, __GO_UI_SLIDER__))
534     {
535         ostr << "setUIMax('" << uid << "', '" << getUIMax(uid) << "');";
536     }
537 }
538
539 double WebUtils::getUIStep(int uid)
540 {
541     std::vector<double> step(2, 0.);
542     getDoubleVectorProterty(uid, __GO_UI_SLIDERSTEP__, step);
543     return step[0];
544 }
545
546 void WebUtils::setUIStep(int uid, std::ostringstream& ostr)
547 {
548     if (hasStyle(uid, __GO_UI_SPINNER__) || hasStyle(uid, __GO_UI_SLIDER__))
549     {
550         ostr << "setUIStep('" << uid << "', '" << getUIStep(uid) << "');";
551     }
552 }
553
554 bool WebUtils::getUIValue(int uid, std::vector<double>& vect)
555 {
556     int size = getIntProperty(uid, __GO_UI_VALUE_SIZE__);
557     vect.resize(size, 0.);
558     getDoubleVectorProterty(uid, __GO_UI_VALUE__, vect);
559     return true;
560 }
561
562 void WebUtils::setUIValue(int uid, std::ostringstream& ostr)
563 {
564     std::vector<double> values;
565     getUIValue(uid, values);
566     if (values.size() == 0)
567     {
568         values.push_back(0);
569     }
570
571     ostr << "setUIValue('" << uid << "', " << values[0] << ");";
572 }
573
574 void WebUtils::getUIBorderPreferredSize(int uid, std::vector<int>& vect)
575 {
576     vect.resize(2, 0);
577     getIntVectorProterty(uid, __GO_UI_BORDER_PREFERREDSIZE__, vect);
578 }
579
580 void WebUtils::getUIBorderPadding(int uid, std::vector<int>& vect)
581 {
582     vect.resize(2, 0);
583     getIntVectorProterty(uid, __GO_BORDER_OPT_PADDING__, vect);
584 }
585
586 int WebUtils::getUIBorderPosition(int uid)
587 {
588     return getIntProperty(uid, __GO_UI_BORDER_POSITION__);
589 }
590
591 void WebUtils::setUIBorder(int uid, std::ostringstream& ostr)
592 {
593     std::vector<int> pad;
594     std::vector<int> size;
595     int parent = getParent(uid);
596     int border = getUIBorderPosition(uid);
597     getUIBorderPadding(parent, pad);
598     getUIBorderPreferredSize(uid, size);
599
600     ostr << "setUIBorder('" << uid << "', '" << parent << "', " << border << ", [";
601     ostr << pad[0] << ", " << pad[1];
602     ostr << "], [" << size[0] << ", " << size[1] << "]);";
603 }
604
605 void WebUtils::getUIGridBagGrid(int uid, std::vector<int>& vect)
606 {
607     vect.resize(4, 0);
608     getIntVectorProterty(uid, __GO_UI_GRIDBAG_GRID__, vect);
609 }
610
611
612 void WebUtils::setUIGridBag(int uid, std::ostringstream& ostr)
613 {
614     int parent = getParent(uid);
615     std::vector<int> grid;
616     getUIGridBagGrid(uid, grid);
617
618     ostr << "setUIGridBag('" << uid << "', '" << parent << "', ['";
619     ostr << grid[0] << "', '" << grid[1] << "', '" << grid[2] << "', '" << grid[3] << "']);";
620 }
621
622 void WebUtils::setUIFrameBorder(int uid, std::ostringstream& ostr)
623 {
624     std::string text;
625     std::string position;
626     std::string alignment;
627     std::string fontName;
628     std::string fontStyle;
629     std::string fontSize;
630     std::string fontWeight;
631     std::string fontColor;
632
633     int border = getIntProperty(uid, __GO_UI_FRAME_BORDER__);
634     int style = getIntProperty(border, __GO_UI_FRAME_BORDER_STYLE__);
635     int parent = getParent(uid);
636
637     if (style == TITLED)
638     {
639         text = getStringProperty(border, __GO_TITLE__);
640         int pos = getIntProperty(border, __GO_UI_FRAME_BORDER_POSITION__);
641         switch (pos)
642         {
643             case 0:
644             case 1:
645             case 2:
646                 position = "top";
647                 break;
648             case 3:
649             case 4:
650             case 5:
651                 position = "bottom";
652                 break;
653         }
654
655         int justification = getIntProperty(border, __GO_UI_FRAME_BORDER_JUSTIFICATION__);
656         switch (justification)
657         {
658             default:
659             case 1:
660                 alignment = "left";
661                 break;
662             case 2:
663                 alignment = "center";
664                 break;
665             case 3:
666                 alignment = "right";
667                 break;
668         }
669
670         //fontname
671         fontName = getStringProperty(border, __GO_UI_FONTNAME__);
672
673         //font style/angle
674         fontStyle = getStringProperty(border, __GO_UI_FONTANGLE__);
675
676         //fontSize
677         int size = getIntProperty(border, __GO_UI_FONTSIZE__);
678         fontSize = std::to_string(size);
679
680         //fontWeight
681         fontWeight = getStringProperty(border, __GO_UI_FONTWEIGHT__);
682
683         //color
684         fontColor = getStringProperty(border, __GO_UI_FRAME_BORDER_COLOR__);
685
686     }
687
688     //build struct
689     std::string var = "{";
690     var += "text:'" + text + "',";
691     var += "position:'" + position + "',";
692     var += "alignment:'" + alignment + "',";
693     var += "fontName:'" + fontName + "',";
694     var += "fontStyle:'" + fontStyle + "',";
695     var += "fontSize:'" + fontSize + "',";
696     var += "fontWeight:'" + fontWeight + "',";
697     var += "fontColor:'" + fontColor + "'}";
698
699     ostr << "setUIFrameBorder('" << uid << "', " << var << ");";
700 }
701
702 bool WebUtils::getUIIcon(int uid, std::string& val)
703 {
704     val = getStringProperty(uid, __GO_UI_ICON__);
705     return true;
706 }
707
708 void WebUtils::setUIIcon(int uid, std::ostringstream& ostr)
709 {
710     std::string icon;
711     getUIIcon(uid, icon);
712     std::vector<std::string> str;
713     getUIString(uid, str);
714     if (str.empty())
715     {
716         str.push_back("");
717     }
718
719     size_t found = icon.find_last_of(".");
720     std::string tmpname = icon;
721
722     if (found != std::string::npos)
723     {
724         std::string ext = icon.substr(found);
725
726         tmpname = std::tmpnam(nullptr);
727         tmpname = "images/" + tmpname.substr(1) + ext;
728
729         //copy image file to web server path
730         wchar_t* src = to_wide_string(icon.data());
731         wchar_t* dst = to_wide_string((getImagePath() + tmpname).data());
732
733         CopyFileFunction(dst, src);
734         FREE(src);
735         FREE(dst);
736     }
737     ostr << "setUIIcon('" << uid << "', '" << tmpname << "', '" << str[0] << "');";
738 }
739
740 bool WebUtils::hasCallback(int uid)
741 {
742     return getStringProperty(uid, __GO_CALLBACK__) != "";
743 }
744
745 void WebUtils::setCallback(int uid, std::ostringstream& ostr)
746 {
747     ostr << "setCallback('" << uid << "');";
748 }
749
750 bool WebUtils::getUIGroupName(int uid, std::string& val)
751 {
752     val = getStringProperty(uid, __GO_UI_GROUP_NAME__);
753     return true;
754 }
755
756 void WebUtils::setUIGroupName(int uid, std::ostringstream& ostr)
757 {
758     std::string val;
759     getUIGroupName(uid, val);
760
761     ostr << "setUIGroupName('" << uid << "', '" << val << "');";
762 }
763
764 //is
765 bool WebUtils::isInputType(int uid)
766 {
767     switch (getStyle(uid))
768     {
769         case __GO_UI_EDIT__ :
770         case __GO_UI_SLIDER__:
771         case __GO_UI_SPINNER__ :
772             return true;
773         default :
774             return false;
775     }
776 }
777
778 bool WebUtils::hasStyle(int uid, int style)
779 {
780     if (isUIcontrol(uid))
781     {
782         return getStyle(uid) == style;
783     }
784
785     return false;
786 }
787
788 bool WebUtils::isFigure(int uid)
789 {
790     return getType(uid) == __GO_FIGURE__;
791 }
792
793 bool WebUtils::isUIcontrol(int uid)
794 {
795     return getType(uid) == __GO_UICONTROL__;
796 }
797
798 bool WebUtils::isButton(int uid)
799 {
800     return hasStyle(uid, __GO_UI_PUSHBUTTON__);
801 }
802
803
804 //create
805 bool WebUtils::createFigure(int uid, std::ostringstream& ostr)
806 {
807     ostr << "__temp__ = createFigure('" << uid << "');";
808     return true;
809 }
810
811 bool WebUtils::createAxes(int uid, std::ostringstream& ostr)
812 {
813     ostr << "__temp__ = createAxes('" << uid << "');";
814     return true;
815 }
816
817 bool WebUtils::createUIControl(int uid, std::ostringstream& ostr)
818 {
819     int style = getStyle(uid);
820     switch (style)
821     {
822         case __GO_UI_FRAME__:
823             return createFrame(uid, ostr);
824         case __GO_UI_PUSHBUTTON__:
825             return createPushButton(uid, ostr);
826         case __GO_UI_TEXT__:
827             return createText(uid, ostr);
828         case __GO_UI_EDIT__:
829             return createEdit(uid, ostr);
830         case __GO_UI_CHECKBOX__:
831             return createCheckbox(uid, ostr);
832         case __GO_UI_RADIOBUTTON__:
833             return createRadio(uid, ostr);
834         case __GO_UI_SLIDER__:
835             return createSlider(uid, ostr);
836         case __GO_UI_LISTBOX__:
837             return createListbox(uid, ostr);
838         case __GO_UI_POPUPMENU__:
839             return createCombobox(uid, ostr);
840         case __GO_UI_SPINNER__:
841             return createSpinner(uid, ostr);
842         case __GO_UI_TAB__:
843             return createTab(uid, ostr);
844         default:
845             return false;
846     }
847 }
848
849 bool WebUtils::createPushButton(int uid, std::ostringstream& ostr)
850 {
851     ostr << "var __temp__ = createPushButton(" + std::to_string(uid) + ");" << std::endl;
852     return true;
853 }
854
855 bool WebUtils::createFrame(int uid, std::ostringstream& ostr)
856 {
857     ostr << "var __temp__ = createFrame(" + std::to_string(uid) + ");" << std::endl;
858     return true;
859 }
860
861 bool WebUtils::createText(int uid, std::ostringstream& ostr)
862 {
863     ostr << "var __temp__ = createText(" + std::to_string(uid) + ");" << std::endl;
864     return true;
865 }
866
867 bool WebUtils::createEdit(int uid, std::ostringstream& ostr)
868 {
869     ostr << "var __temp__ = createEdit(" + std::to_string(uid) + ");" << std::endl;
870     return true;
871 }
872
873 bool WebUtils::createCheckbox(int uid, std::ostringstream& ostr)
874 {
875     ostr << "var __temp__ = createCheckbox(" + std::to_string(uid) + ");" << std::endl;
876     return true;
877 }
878
879 bool WebUtils::createRadio(int uid, std::ostringstream& ostr)
880 {
881     ostr << "var __temp__ = createRadio(" + std::to_string(uid) + ");" << std::endl;
882     return true;
883 }
884
885 bool WebUtils::createSlider(int uid, std::ostringstream& ostr)
886 {
887     ostr << "var __temp__ = createSlider(" + std::to_string(uid) + ");" << std::endl;
888     return true;
889 }
890
891 bool WebUtils::createListbox(int uid, std::ostringstream& ostr)
892 {
893     ostr << "var __temp__ = createListbox(" + std::to_string(uid) + ");" << std::endl;
894     return true;
895 }
896
897 bool WebUtils::createCombobox(int uid, std::ostringstream& ostr)
898 {
899     ostr << "var __temp__ = createCombobox(" + std::to_string(uid) + ");" << std::endl;
900     return true;
901 }
902
903 bool WebUtils::createSpinner(int uid, std::ostringstream& ostr)
904 {
905     ostr << "var __temp__ = createSpinner(" + std::to_string(uid) + ");" << std::endl;
906     return true;
907 }
908
909 bool WebUtils::createTab(int uid, std::ostringstream& ostr)
910 {
911     ostr << "var __temp__ = createTab(" << uid << ");" << std::endl;
912     return true;
913 }
914
915 bool WebUtils::addTabChild(int uid, int child, std::ostringstream& ostr)
916 {
917     ostr << "addTabHelper(" << uid << ", " << child << ");";
918     setUIValue(uid, ostr);
919     return true;
920 }
921
922
923 bool WebUtils::deleteObject(int uid, std::ostringstream& ostr)
924 {
925     ostr << "deleteObject(" << uid << ");";
926     return true;
927 }
928
929 void WebUtils::deleteGraphicObject(int uid)
930 {
931     ::deleteGraphicObject(uid);
932 }
933
934 bool WebUtils::updateDefaultProperties(int uid, std::ostringstream& ostr)
935 {
936     //visible
937     setVisible(uid, ostr);
938
939     //backgoundcolor
940     setUIBackgroundColor(uid, ostr);
941
942     //enable
943     setUIEnable(uid, ostr);
944
945     //fontangle
946     setUIFontAngle(uid, ostr);
947
948     //fontname
949     setUIFontName(uid, ostr);
950
951     //fontsize & fontunits
952     setUIFontSize(uid, ostr);
953
954     //fontweight
955     setUIFontWeight(uid, ostr);
956
957     //foregroundcolor
958     setUIForegroundColor(uid, ostr);
959
960     //horizontalalignment
961     setUIHorizontalAlignment(uid, ostr);
962
963     //relief ?
964     setUIRelief(uid, ostr);
965
966     //string
967     setUIString(uid, ostr);
968
969     //verticalalignment
970     setUIVerticalAlignment(uid, ostr);
971
972     //position
973     setUIPosition(uid, ostr);
974
975     //layout ?
976     setUILayout(uid, ostr);
977
978     //min
979     setUIMin(uid, ostr);
980
981     //max
982     setUIMax(uid, ostr);
983
984     //step
985     setUIStep(uid, ostr);
986
987     //vaue
988     setUIValue(uid, ostr);
989
990     //set callback uses to update values from web view
991     setCallback(uid, ostr);
992
993     return true;
994 }
995
996 bool WebUtils::setUIControlProperty(int prop, int uid, std::ostringstream& ostr)
997 {
998     return setProperty(setterUIControl, prop, uid, ostr);
999 }
1000
1001 bool WebUtils::setFigureProperty(int prop, int uid, std::ostringstream& ostr)
1002 {
1003     return setProperty(setterFigure, prop, uid, ostr);
1004 }
1005
1006 bool WebUtils::setAxesProperty(int prop, int uid, std::ostringstream& ostr)
1007 {
1008     return setProperty(setterAxes, prop, uid, ostr);
1009 }
1010
1011 bool WebUtils::setProperty(const SETTER& setter, int prop, int uid, std::ostringstream& ostr)
1012 {
1013     SETTER::const_iterator it = setter.find(prop);
1014     if (it != setter.end())
1015     {
1016         it->second(uid, ostr);
1017
1018         return true;
1019     }
1020
1021     return false;
1022 }
1023
1024 void WebUtils::fillSetters()
1025 {
1026     setterUIControl[__GO_PARENT__] = WebUtils::setParent;
1027     setterUIControl[__GO_POSITION__] = WebUtils::setUIPosition;
1028     setterUIControl[__GO_SIZE__] = WebUtils::setFigureSize;
1029     setterUIControl[__GO_UI_STRING__] = WebUtils::setUIString;
1030     setterUIControl[__GO_VISIBLE__] = WebUtils::setVisible;
1031     setterUIControl[__GO_UI_ENABLE__] = WebUtils::setUIEnable;
1032     setterUIControl[__GO_UI_BACKGROUNDCOLOR__] = WebUtils::setUIBackgroundColor;
1033     setterUIControl[__GO_UI_FONTANGLE__] = WebUtils::setUIFontAngle;
1034     setterUIControl[__GO_UI_FONTNAME__] = WebUtils::setUIFontName;
1035     setterUIControl[__GO_UI_FONTSIZE__] = WebUtils::setUIFontSize;
1036     setterUIControl[__GO_UI_FONTWEIGHT__] = WebUtils::setUIFontWeight;
1037     setterUIControl[__GO_UI_FOREGROUNDCOLOR__] = WebUtils::setUIForegroundColor;
1038     setterUIControl[__GO_UI_HORIZONTALALIGNMENT__] = WebUtils::setUIHorizontalAlignment;
1039     setterUIControl[__GO_UI_RELIEF__] = WebUtils::setUIRelief;
1040     setterUIControl[__GO_UI_VERTICALALIGNMENT__] = WebUtils::setUIVerticalAlignment;
1041     setterUIControl[__GO_LAYOUT__] = WebUtils::setUILayout;
1042     setterUIControl[__GO_UI_MIN__] = WebUtils::setUIMin;
1043     setterUIControl[__GO_UI_MAX__] = WebUtils::setUIMax;
1044     setterUIControl[__GO_UI_SLIDERSTEP__] = WebUtils::setUIStep;
1045     setterUIControl[__GO_UI_VALUE__] = WebUtils::setUIValue;
1046     //preferred size is the last property to be set for border constraints
1047     setterUIControl[__GO_UI_BORDER_POSITION__] = WebUtils::setUIBorder;
1048     //preferred size is the last property to be set for gridbag constraints
1049     setterUIControl[__GO_UI_GRIDBAG_GRID__] = WebUtils::setUIGridBag;
1050     setterUIControl[__GO_UI_FRAME_BORDER__] = WebUtils::setUIFrameBorder;
1051     setterUIControl[__GO_UI_ICON__] = WebUtils::setUIIcon;
1052     setterUIControl[__GO_UI_GROUP_NAME__] = WebUtils::setUIGroupName;
1053
1054     //figure props
1055     setterFigure[__GO_AXES_SIZE__] = WebUtils::setFigureSize;
1056     setterFigure[__GO_NAME__] = WebUtils::setFigureName;
1057     setterFigure[__GO_LAYOUT__] = WebUtils::setUILayout;
1058     setterFigure[__GO_VISIBLE__] = WebUtils::setVisible;
1059
1060     //axes props
1061     setterAxes[__GO_PARENT__] = WebUtils::setParent;
1062 }
1063
1064 bool WebUtils::updateValue(int uid, const std::string& value)
1065 {
1066     if (hasStyle(uid, __GO_UI_EDIT__))
1067     {
1068         std::vector<std::string> v(1, value);
1069         setStringVectorProperty(uid, __GO_UI_STRING__, v);
1070     }
1071
1072     return true;
1073 }
1074
1075 bool WebUtils::updateValue(int uid, const std::vector<double>& values)
1076 {
1077     setDoubleVectorProperty(uid, __GO_UI_VALUE__, values);
1078     return true;
1079 }
1080
1081 bool WebUtils::updateValue(int uid, double value)
1082 {
1083     std::vector<double> v(1, value);
1084     setDoubleVectorProperty(uid, __GO_UI_VALUE__, v);
1085     return true;
1086 }
1087
1088 bool WebUtils::updateValue(int uid, bool value)
1089 {
1090     std::vector<double> v(1, value ? getUIMax(uid) : getUIMin(uid));
1091     setDoubleVectorProperty(uid, __GO_UI_VALUE__, v);
1092     return true;
1093 }
1094
1095 void WebUtils::addInWaitingQueue(int uid, int prop)
1096 {
1097     waitprop[uid].push_back(prop);
1098 }
1099
1100 void WebUtils::setWaitingProperties(int uid, std::ostringstream& ostr)
1101 {
1102     WAITING_PROP::iterator it = waitprop.find(uid);
1103     if (it != waitprop.end())
1104     {
1105         for (int prop : it->second)
1106         {
1107             setUIControlProperty(prop, uid, ostr);
1108         }
1109         waitprop.erase(it);
1110     }
1111 }