aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/skin/widgets/group.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/group.cpp')
-rw-r--r--Src/Wasabi/api/skin/widgets/group.cpp1753
1 files changed, 1753 insertions, 0 deletions
diff --git a/Src/Wasabi/api/skin/widgets/group.cpp b/Src/Wasabi/api/skin/widgets/group.cpp
new file mode 100644
index 00000000..d0827ef5
--- /dev/null
+++ b/Src/Wasabi/api/skin/widgets/group.cpp
@@ -0,0 +1,1753 @@
+#include <precomp.h>
+#include <tataki/bitmap/bitmap.h>
+#include <api/wnd/popup.h>
+#include <api/wndmgr/layout.h>
+#include <api/skin/skinparse.h>
+//#include <api/skin/widgets/button.h>
+//#include <api/core/buttons.h>
+#include <api/wnd/wndtrack.h>
+#include <api/wac/compon.h>
+#include <api/skin/skin.h>
+#include <api/wnd/notifmsg.h>
+#include <api/config/items/intarray.h>
+#include <api/config/items/cfgitem.h>
+#include <api/config/items/attribute.h>
+#include <api/wndmgr/layout.h>
+#include <api/script/script.h>
+#include <api/script/scriptmgr.h>
+#include <bfc/util/profiler.h>
+#include <api/wndmgr/resize.h>
+#include <bfc/wasabi_std_wnd.h>
+#include <api/wnd/PaintCanvas.h>
+
+#ifndef WM_MOUSEWHEEL
+#define WM_MOUSEWHEEL 0x20A
+#endif
+
+const wchar_t groupXuiObjectStr[] = L"Group"; // This is the xml tag
+char groupXuiSvcName[] = "Group xui object"; // this is the name of the xuiservice
+
+#ifdef WASABI_COMPILE_CONFIG
+const wchar_t cfgGroupXuiObjectStr[] = L"CfgGroup"; // This is the xml tag
+char cfgGroupXuiSvcName[] = "CfgGroup xui object"; // this is the name of the xuiservice
+#endif
+
+XMLParamPair Group::groupParams[] =
+ {
+ {XUIGROUP_AUTOHEIGHTSOURCE, L"AUTOHEIGHTSOURCE"},
+ {XUIGROUP_AUTOWIDTHSOURCE, L"AUTOWIDTHSOURCE"},
+ {XUIGROUP_BACKGROUND, L"BACKGROUND"},
+ {XUIGROUP_DRAWBACKGROUND, L"DRAWBACKGROUND"},
+ {XUIGROUP_DEFAULT_W, L"DEFAULT_W"},
+ {XUIGROUP_DEFAULT_H, L"DEFAULT_H"},
+ {XUIGROUP_DESIGN_H, L"DESIGN_H"},
+ {XUIGROUP_DESIGN_W, L"DESIGN_W"},
+ {XUIGROUP_EMBED_XUI, L"EMBED_XUI"},
+ {XUIGROUP_INHERIT_CONTENT, L"INHERIT_CONTENT"},
+ {XUIGROUP_INHERIT_GROUP, L"INHERIT_GROUP"},
+ {XUIGROUP_INSTANCEID, L"INSTANCEID"},
+ {XUIGROUP_LOCKMINMAX, L"LOCKMINMAX"},
+ {XUIGROUP_MAXIMUM_H, L"MAXIMUM_H"},
+ {XUIGROUP_MAXIMUM_W, L"MAXIMUM_W"},
+ {XUIGROUP_MINIMUM_H, L"MINIMUM_H"},
+ {XUIGROUP_MINIMUM_W, L"MINIMUM_W"},
+ {XUIGROUP_NAME, L"NAME"},
+ {XUIGROUP_PROPAGATESIZE, L"PROPAGATESIZE"},
+ {XUIGROUP_XUITAG, L"XUITAG"},
+ };
+
+Group::Group()
+{
+ scripts_enabled = 1;
+ getScriptObject()->vcpu_setInterface(groupGuid, (void *)static_cast<Group *>(this));
+ getScriptObject()->vcpu_setClassName(L"Group");
+ getScriptObject()->vcpu_setController(groupController);
+ background = NULL;
+ skinpart = 0;
+ captured = 0; resizing = 0;
+ x = 0; y = 0;
+ size_w = 0; size_h = 0;
+ lockminmax = 0;
+ propagatesize = 0;
+ reg = NULL;
+ default_h = AUTOWH;
+ default_w = AUTOWH;
+ // allreg = NULL;
+ // subregionlayers = new PtrList<api_window>;
+ // subregiongroups = new PtrList<api_window>;
+ deleting = 0;
+ moving = 0;
+ drawbackground = 0;
+ groupmaxheight = AUTOWH;
+ groupmaxwidth = AUTOWH;
+ groupminheight = AUTOWH;
+ groupminwidth = AUTOWH;
+ // regionop = 0;
+ // allsubreg = NULL;
+ groups.addItem(this);
+ scaledreg = NULL;
+ scaledregionvalid = 0;
+ autoregionop = 1;
+ setRectRgn(0);
+ disable_update_pos = 0;
+ no_init_on_addchild = 0;
+ lastheightsource = lastwidthsource = NULL;
+ lastgetwidthbasedon = lastgetheightbasedon = AUTOWH;
+ content_item = NULL;
+
+ xuihandle = newXuiHandle();
+ CreateXMLParameters(xuihandle);
+
+ design_w = AUTOWH;
+ design_h = AUTOWH;
+}
+
+void Group::CreateXMLParameters(int master_handle)
+{
+ //GROUP_PARENT::CreateXMLParameters(master_handle);
+ int numParams = sizeof(groupParams) / sizeof(groupParams[0]);
+ hintNumberOfParams(xuihandle, numParams);
+ for (int i = 0;i < numParams;i++)
+ {
+ addParam(xuihandle, groupParams[i], XUI_ATTRIBUTE_IMPLIED);
+ }
+}
+
+Group::~Group()
+{
+ deleteScripts();
+ deleting = 1;
+ WASABI_API_WND->skin_unregisterBaseTextureWindow(this);
+ while (gui_objects.getNumItems() > 0)
+ {
+ SkinParser::destroyGuiObject(gui_objects.enumItem(0));
+ gui_objects.removeByPos(0);
+ }
+ delete background;
+ delete reg;
+ delete scaledreg;
+ xuiparams.deleteAll();
+ /* subregionlayers->removeAll();
+ delete subregionlayers;
+ subregiongroups->removeAll();
+ delete subregiongroups;*/
+ groups.removeItem(this);
+ WASABI_API_SYSCB->syscb_deregisterCallback(static_cast<WndCallbackI*>(this));
+}
+
+int Group::isGroup(Group *o)
+{
+ return groups.haveItem(o);
+}
+
+int Group::setXmlParam(const wchar_t *paramname, const wchar_t *strvalue)
+{
+ if (!WCSICMP(paramname, L"id") && !instanceid.isempty())
+ return GROUP_PARENT::setXmlParam(paramname, instanceid);
+ return GROUP_PARENT::setXmlParam(paramname, strvalue);
+}
+
+int Group::setXuiParam(int _xuihandle, int xuiid, const wchar_t *paramname, const wchar_t *strvalue)
+{
+ if (xuihandle == _xuihandle)
+ {
+ switch (xuiid)
+ {
+ case XUIGROUP_INSTANCEID:
+ instanceid = strvalue;
+ getGuiObject()->guiobject_setId(instanceid);
+ return 1;
+ case XUIGROUP_BACKGROUND:
+ setBaseTexture(strvalue);
+ setDrawBackground(1);
+ return 1;
+ case XUIGROUP_DRAWBACKGROUND:
+ setDrawBackground(WTOI(strvalue));
+ return 1;
+ case XUIGROUP_DEFAULT_W:
+ {
+ int w = WTOI(strvalue);
+ //getGuiObject()->guiobject_setGuiPosition(NULL, NULL, &w, NULL, NULL, NULL, NULL, NULL);
+ default_w = w;
+ return 1;
+ }
+ case XUIGROUP_DEFAULT_H:
+ {
+ int h = WTOI(strvalue);
+ //getGuiObject()->guiobject_setGuiPosition(NULL, NULL, NULL, &h, NULL, NULL, NULL, NULL);
+ default_h = h;
+ return 1;
+ }
+
+ case XUIGROUP_MAXIMUM_H:
+ groupmaxheight = WTOI(strvalue);
+ return 1;
+ case XUIGROUP_MAXIMUM_W:
+ groupmaxwidth = WTOI(strvalue);
+ return 1;
+ case XUIGROUP_MINIMUM_H:
+ groupminheight = WTOI(strvalue);
+ return 1;
+ case XUIGROUP_MINIMUM_W:
+ groupminwidth = WTOI(strvalue);
+ return 1;
+ case XUIGROUP_PROPAGATESIZE:
+ propagatesize = WTOI(strvalue);
+ return 1;
+ case XUIGROUP_LOCKMINMAX:
+ lockminmax = WTOI(strvalue);
+ return 1;
+ case XUIGROUP_NAME:
+ setName(strvalue);
+ return 1;
+ case XUIGROUP_AUTOWIDTHSOURCE:
+ setAutoWidthSource(strvalue);
+ return 1;
+ case XUIGROUP_AUTOHEIGHTSOURCE:
+ setAutoHeightSource(strvalue);
+ return 1;
+ case XUIGROUP_EMBED_XUI:
+ xui_embedded_id = strvalue;
+ return 1;
+ case XUIGROUP_XUITAG:
+ return 1;
+ case XUIGROUP_INHERIT_GROUP:
+ return 1;
+ case XUIGROUP_INHERIT_CONTENT:
+ return 1;
+ case XUIGROUP_DESIGN_W:
+ setDesignWidth(WTOI(strvalue));
+ return 1;
+ case XUIGROUP_DESIGN_H:
+ setDesignHeight(WTOI(strvalue));
+ return 1;
+ }
+ }
+ return GROUP_PARENT::setXuiParam(_xuihandle, xuiid, paramname, strvalue);
+}
+
+void Group::setDesignWidth(int w)
+{
+ design_w = w;
+ if (isPostOnInit())
+ onResize();
+}
+
+void Group::setDesignHeight(int h)
+{
+ design_h = h;
+ if (isPostOnInit())
+ onResize();
+}
+
+int Group::getDesignWidth()
+{
+ return design_w;
+}
+
+int Group::getDesignHeight()
+{
+ return design_h;
+}
+
+int Group::onPostedMove()
+{
+ return GROUP_PARENT::onPostedMove();
+}
+
+#ifdef WASABI_COMPILE_WNDMGR
+void Group::beginMove()
+{
+ if (getGuiObject()->guiobject_getParentGroup())
+ getGuiObject()->guiobject_getParentGroup()->beginMove();
+}
+
+void Group::beginScale()
+{
+ if (getGuiObject()->guiobject_getParentGroup())
+ getGuiObject()->guiobject_getParentGroup()->beginScale();
+}
+
+void Group::beginResize()
+{
+ if (getGuiObject()->guiobject_getParentGroup())
+ getGuiObject()->guiobject_getParentGroup()->beginResize();
+}
+
+void Group::endMove()
+{
+ if (getGuiObject()->guiobject_getParentGroup())
+ getGuiObject()->guiobject_getParentGroup()->endMove();
+}
+
+void Group::endScale()
+{
+ if (getGuiObject()->guiobject_getParentGroup())
+ getGuiObject()->guiobject_getParentGroup()->endScale();
+}
+
+void Group::endResize()
+{
+ if (getGuiObject()->guiobject_getParentGroup())
+ getGuiObject()->guiobject_getParentGroup()->endResize();
+}
+#endif
+
+void Group::onMinMaxEnforcerChanged()
+{
+ if (!isPostOnInit()) return ;
+ int min_x = getPreferences(MINIMUM_W);
+ int min_y = getPreferences(MINIMUM_H);
+ int max_x = getPreferences(MAXIMUM_W);
+ int max_y = getPreferences(MAXIMUM_H);
+ int sug_x = getPreferences(SUGGESTED_W);
+ int sug_y = getPreferences(SUGGESTED_H);
+ min_x = MAX(RESIZE_MINW, min_x);
+ min_y = MAX(RESIZE_MINH, min_y);
+
+ RECT r;
+ POINT pt;
+ getClientRect(&r);
+ int w = r.right - r.left;
+ int h = r.bottom - r.top;
+ getPosition(&pt);
+ if ((w < min_x || h < min_y || w > max_x || h > max_y) && (w != sug_x || h != sug_y))
+ {
+ //DebugString("reapplying minmax constraints\n");
+ resize(pt.x, pt.y, sug_x, sug_y);
+ }
+}
+
+#ifdef WASABI_COMPILE_WNDMGR
+void Group::mouseResize(int x, int y, int resizeway)
+{ // screen coords!
+
+ int min_x = getPreferences(MINIMUM_W);
+ int min_y = getPreferences(MINIMUM_H);
+ int max_x = getPreferences(MAXIMUM_W);
+ int max_y = getPreferences(MAXIMUM_H);
+ int sug_x = getPreferences(SUGGESTED_W);
+ int sug_y = getPreferences(SUGGESTED_H);
+
+ if (max_x != AUTOWH && min_x != AUTOWH && max_x < min_x) max_x = min_x;
+ if (max_y != AUTOWH && min_y != AUTOWH && max_y < min_y) max_y = min_y;
+ if (min_x != AUTOWH && max_x != AUTOWH && min_x > max_x) min_x = max_x;
+ if (min_y != AUTOWH && max_y != AUTOWH && min_y > max_y) min_y = max_y;
+ if (sug_x != AUTOWH && min_x != AUTOWH && sug_x < min_x) sug_x = min_x;
+ if (sug_y != AUTOWH && min_y != AUTOWH && sug_y < min_y) sug_y = min_y;
+ if (sug_x != AUTOWH && max_x != AUTOWH && sug_x > max_x) sug_x = max_x;
+ if (sug_y != AUTOWH && max_y != AUTOWH && sug_y > max_y) sug_y = max_y;
+
+ beginResize();
+
+ int mask = 0;
+ if (resizeway & RESIZE_BOTTOM)
+ {
+ mask |= BOTTOM;
+ }
+ if (resizeway & RESIZE_RIGHT)
+ {
+ mask |= RIGHT;
+ }
+ if (resizeway & RESIZE_TOP)
+ {
+ mask |= TOP;
+ }
+ if (resizeway & RESIZE_LEFT)
+ {
+ mask |= LEFT;
+ }
+
+ min_x = MAX(RESIZE_MINW, min_x);
+ min_y = MAX(RESIZE_MINH, min_y);
+
+ if (renderRatioActive())
+ {
+ if (min_x != AUTOWH) multRatio(&min_x);
+ if (min_y != AUTOWH) multRatio(NULL, &min_y);
+ if (max_x != AUTOWH) multRatio(&max_x);
+ if (max_y != AUTOWH) multRatio(NULL, &max_y);
+ if (sug_x != AUTOWH) multRatio(&sug_x);
+ if (sug_y != AUTOWH) multRatio(NULL, &sug_y);
+ }
+
+ if (min_x == AUTOWH) min_x = -1;
+ if (max_x == AUTOWH) max_x = -1;
+ if (min_y == AUTOWH) min_y = -1;
+ if (max_y == AUTOWH) max_y = -1;
+ if (sug_x == AUTOWH) sug_x = -1;
+ if (sug_y == AUTOWH) sug_y = -1;
+
+ resizeClass rsize(this, min_x, min_y, max_x, max_y, sug_x, sug_y);
+ if (rsize.resizeWindow(this, mask | NOINTERSECT))
+ {
+ RECT r = rsize.getRect();
+
+ if (renderRatioActive())
+ {
+ r.right = (int)(((double)(r.right - r.left) / getRenderRatio()) + r.left + 0.5f);
+ r.bottom = (int)(((double)(r.bottom - r.top) / getRenderRatio()) + r.top + 0.5f);
+ }
+
+ int _min_x = getPreferences(MINIMUM_W);
+ int _min_y = getPreferences(MINIMUM_H);
+ int _max_x = getPreferences(MAXIMUM_W);
+ int _max_y = getPreferences(MAXIMUM_H);
+
+ if (_max_x != AUTOWH && _min_x != AUTOWH && _max_x < _min_x) _max_x = _min_x;
+ if (_max_y != AUTOWH && _min_y != AUTOWH && _max_y < _min_y) _max_y = _min_y;
+ if (_min_x != AUTOWH && _max_x != AUTOWH && _min_x > _max_x) _min_x = _max_x;
+ if (_min_y != AUTOWH && _max_y != AUTOWH && _min_y > _max_y) _min_y = _max_y;
+
+ if (r.right - r.left < _min_x) r.right = r.left + _min_x;
+ if (r.bottom - r.top < _min_y) r.bottom = r.top + _min_y;
+ if (r.right - r.left > _max_x) r.right = r.left + _max_x;
+ if (r.bottom - r.top > _max_y) r.bottom = r.top + _max_y;
+
+ resizeToRect(&r);
+ invalidate();
+ endResize();
+ }
+}
+#endif
+
+void Group::setAutoWidthSource(const wchar_t *obj)
+{
+ autowidthsource = obj;
+}
+
+void Group::setAutoHeightSource(const wchar_t *obj)
+{
+ autoheightsource = obj;
+}
+
+int Group::getAutoWidth()
+{
+ return default_w == AUTOWH ? GROUP_PARENT::getPreferences(SUGGESTED_W) : default_w;
+}
+
+int Group::getAutoHeight()
+{
+ return default_h == AUTOWH ? GROUP_PARENT::getPreferences(SUGGESTED_H) : default_h;
+}
+
+int Group::getWidthBasedOn(GuiObject *o)
+{
+ if (o == NULL)
+ {
+ if (lastwidthsource == NULL)
+ {
+ if (!autowidthsource.isempty())
+ {
+ lastwidthsource = getObject(autowidthsource);
+ }
+ }
+ o = lastwidthsource;
+ }
+ if (o == NULL) return AUTOWH;
+ if (lastgetwidthbasedon != AUTOWH) return lastgetwidthbasedon;
+ int x, rx, w, rw;
+ o->guiobject_getGuiPosition(&x, NULL, &w, NULL, &rx, NULL, &rw, NULL);
+ int p = o->guiobject_getAutoWidth();
+if (w == AUTOWH) { w = p; rw = 0; }
+ if (rx == 0 && rw == 1)
+ lastgetwidthbasedon = p - w;
+ else if (rx == 0 && rw == 0)
+ lastgetwidthbasedon = p + x;
+ else
+ lastgetwidthbasedon = AUTOWH;
+
+ return lastgetwidthbasedon;
+}
+
+int Group::getHeightBasedOn(GuiObject *o)
+{
+ if (o == NULL)
+ {
+ if (lastheightsource == NULL)
+ {
+ if (!autoheightsource.isempty())
+ {
+ lastheightsource = getObject(autoheightsource);
+ }
+ }
+ o = lastheightsource;
+ }
+ if (o == NULL) return AUTOWH;
+ if (lastgetheightbasedon != AUTOWH) return lastgetheightbasedon;
+ int y, ry, h, rh;
+ o->guiobject_getGuiPosition(NULL, &y, NULL, &h, NULL, &ry, NULL, &rh);
+ int p = o->guiobject_getAutoHeight();
+if (h == AUTOWH) { h = p; rh = 0; }
+ if (ry == 0 && rh == 1)
+ lastgetheightbasedon = p - h;
+ else if (ry == 0 && rh == 0)
+ lastgetheightbasedon = h + y;
+ else
+ lastgetheightbasedon = AUTOWH;
+
+ return lastgetheightbasedon;
+}
+
+int Group::getPreferences(int what)
+{
+ int _what = what;
+ if (lockminmax)
+ {
+ if (_what == MAXIMUM_W || _what == MINIMUM_W)
+ _what = SUGGESTED_W;
+ if (_what == MAXIMUM_H || _what == MINIMUM_H)
+ _what = SUGGESTED_H;
+ }
+ switch (_what)
+ {
+ case SUGGESTED_W:
+ {
+ int w, rw;
+ getGuiObject()->guiobject_getGuiPosition(NULL, NULL, &w, NULL, NULL, NULL, &rw, NULL);
+
+ if (w == AUTOWH)
+ w = getWidthBasedOn();
+
+ if (w == AUTOWH || rw == 1)
+ w = getAutoWidth();
+
+ if (w == AUTOWH && getBaseTexture())
+ w = getBaseTexture()->getWidth();
+
+ if (groupmaxwidth != AUTOWH)
+ {
+ if (groupminwidth != AUTOWH)
+ {
+ return MIN(groupmaxwidth, MAX(groupminwidth, w));
+ }
+ else
+ {
+ return MIN(groupmaxwidth, w);
+ }
+ }
+ else if (groupminwidth != AUTOWH)
+ {
+ return MAX(groupminwidth, w);
+ }
+ return w;
+ }
+ case SUGGESTED_H:
+ {
+ int h, rh;
+ getGuiObject()->guiobject_getGuiPosition(NULL, NULL, NULL, &h, NULL, NULL, NULL, &rh);
+
+ if (h == AUTOWH)
+ h = getHeightBasedOn();
+
+ if (h == AUTOWH || rh == 1)
+ h = getAutoHeight();
+
+ if (h == AUTOWH && getBaseTexture())
+ h = getBaseTexture()->getHeight();
+
+ if (groupmaxheight != AUTOWH)
+ {
+ if (groupminheight != AUTOWH)
+ {
+ return MIN(groupmaxheight, MAX(groupminheight, h));
+ }
+ else
+ {
+ return MIN(groupmaxheight, h);
+ }
+ }
+ else if (groupminheight != AUTOWH)
+ {
+ return MAX(groupminheight, h);
+ }
+ return h;
+ }
+ case MAXIMUM_H:
+ {
+ int h = GROUP_PARENT::getPreferences(what);
+
+ if (h != AUTOWH)
+ return MIN(h, groupmaxheight);
+
+ return groupmaxheight;
+ }
+ case MAXIMUM_W:
+ {
+ int w = GROUP_PARENT::getPreferences(what);
+
+ if (w != AUTOWH)
+ return MIN(w, groupmaxwidth);
+
+ return groupmaxwidth;
+ }
+ case MINIMUM_H:
+ {
+ int h = GROUP_PARENT::getPreferences(what);
+
+ if (h != AUTOWH)
+ return MAX(h, groupminheight);
+
+ return groupminheight;
+ }
+ case MINIMUM_W:
+ {
+ int w = GROUP_PARENT::getPreferences(what);
+
+ if (w != AUTOWH)
+ return MAX(w, groupminwidth);
+
+ return groupminwidth;
+ }
+ }
+ return GROUP_PARENT::getPreferences(what);
+}
+
+void Group::updatePos(GuiObject *o, RECT *r2)
+{
+
+ if (disable_update_pos) return ;
+
+ RECT r;
+ if (r2 == NULL)
+ {
+ getClientRect(&r);
+ r2 = &r;
+ }
+
+
+ double d = getRenderRatio();
+ int w, h;
+ int ox, oy, ow, oh, orx, ory, orw, orh;
+ int ox1, ox2, oy1, oy2, oanchor;
+
+ if (o->guiobject_getAnchoragePosition(&ox1, &oy1, &ox2, &oy2, &oanchor))
+ {
+ // anchorage values have not been translated into native values yet, do it now
+ int x, y, w, h, rx, ry, rw, rh;
+ x = y = w = h = rx = ry = rw = rh = AUTOWH;
+ int lw = ox2 - ox1;
+ int lh = oy2 - oy1;
+ int iw = getDesignWidth();
+ int ih = getDesignHeight();
+ if (iw == AUTOWH || ih == AUTOWH)
+ {
+ Wasabi::Std::messageBox(L"anchor coordinate system used without design size for the parent group.\nYour parent group needs the design_w/design_h parameters if you are using x1/y1/x2/y2/anchor parameters on one of its children\nDefaulting to 320x200", L"XML Error", 0);
+ iw = 320;
+ ih = 200;
+ }
+ int right_m = iw - ox2;
+ int bottom_m = ih - oy2;
+
+ if ((oanchor & ANCHOR_LEFT) == 0 && (oanchor & ANCHOR_RIGHT) == 0) oanchor |= ANCHOR_LEFT;
+ if ((oanchor & ANCHOR_TOP) == 0 && (oanchor & ANCHOR_BOTTOM) == 0) oanchor |= ANCHOR_TOP;
+
+ if (oanchor & ANCHOR_LEFT)
+ {
+ x = ox1;
+ rx = 0;
+ if (oanchor & ANCHOR_RIGHT)
+ {
+ w = -((iw - ox2) + ox1);
+ rw = 1;
+ }
+ else
+ {
+ w = lw;
+ rw = 0;
+ }
+ }
+ else
+ {
+ if (oanchor & ANCHOR_RIGHT)
+ {
+ x = -(right_m + lw);
+ rx = 1;
+ w = lw;
+ rw = 0;
+ }
+ }
+ if (oanchor & ANCHOR_TOP)
+ {
+ y = oy1;
+ ry = 0;
+ if (oanchor & ANCHOR_BOTTOM)
+ {
+ h = -((ih - oy2) + oy1);
+ rh = 1;
+ }
+ else
+ {
+ h = lh;
+ rh = 0;
+ }
+ }
+ else
+ {
+ if (oanchor & ANCHOR_BOTTOM)
+ {
+ y = -(bottom_m + lh);
+ ry = 1;
+ h = lh;
+ rh = 0;
+ }
+ }
+ disable_update_pos = 1;
+ o->guiobject_setGuiPosition(&x, &y, &w, &h, &rx, &ry, &rw, &rh);
+ o->guiobject_validateAnchorage();
+ disable_update_pos = 0;
+ }
+
+ o->guiobject_getGuiPosition(&ox, &oy, &ow, &oh, &orx, &ory, &orw, &orh);
+ if (ow == AUTOWH) { ow = o->guiobject_getAutoWidth(); orw = 0; }
+ if (oh == AUTOWH) { oh = o->guiobject_getAutoHeight(); orh = 0; }
+
+ TextInfoCanvas fontInfoCanvas(this);
+ double fontScale = fontInfoCanvas.getSystemFontScale();
+ if (o->guiobject_getAutoSysMetricsX())
+ ox = (int)((float)ox * fontScale);
+
+ if (o->guiobject_getAutoSysMetricsY())
+ oy = (int)((float)oy * fontScale);
+
+ if (o->guiobject_getAutoSysMetricsW())
+ ow = (int)((float)ow * fontScale);
+
+ if (o->guiobject_getAutoSysMetricsH())
+ oh = (int)((float)oh * fontScale);
+
+ if (!o->guiobject_getRootWnd()->handleRatio())
+ {
+ if (orw == 1)
+ w = (int)((float)(r2->right - r2->left + ow) * d);
+ else if (orw == 2)
+ w = (int)(((float)(r2->right - r2->left) * ((float)ow / 100.0f)) * d);
+ else
+ w = (int)((float)(ow) * d);
+ if (orh == 1)
+ h = (int)((float)(r2->bottom - r2->top + oh) * d);
+ else if (orh == 2)
+ h = (int)(((float)(r2->bottom - r2->top) * ((float)oh / 100.0f)) * d);
+ else
+ h = (int)((float)(oh) * d);
+ if (orx == 1)
+ x = (int)((float)(r2->right - r2->left + ox) * d);
+ else if (orx == 2)
+ x = (int)(((float)(r2->right - r2->left) * ((float)ox / 100.0f)) * d);
+ else
+ x = (int)((float)(ox) * d);
+ if (ory == 1)
+ y = (int)((float)(r2->bottom - r2->top + oy) * d);
+ else if (ory == 2)
+ y = (int)(((float)(r2->bottom - r2->top) * ((float)oy / 100.0f)) * d);
+ else
+ y = (int)((float)(oy) * d);
+ x += (int)((float)(r2->left) * d);
+ y += (int)((float)(r2->top) * d);
+ }
+ else
+ {
+ if (orw == 1)
+ w = r2->right - r2->left + ow;
+ else if (orw == 2)
+ w = (int)((float)(r2->right - r2->left) * ((float)ow / 100.0f));
+ else
+ w = ow;
+ if (orh == 1)
+ h = r2->bottom - r2->top + oh;
+ else if (orh == 2)
+ h = (int)((float)(r2->bottom - r2->top) * ((float)oh / 100.0f));
+ else
+ h = oh;
+ if (orx == 1)
+ x = r2->right - r2->left + ox;
+ else if (orx == 2)
+ x = (int)((float)(r2->right - r2->left) * ((float)ox / 100.0f));
+ else
+ x = ox;
+ if (ory == 1)
+ y = r2->bottom - r2->top + oy;
+ else if (ory == 2)
+ y = (int)((float)(r2->bottom - r2->top) * ((float)oy / 100.0f));
+ else
+ y = oy;
+ x += r2->left;
+ y += r2->top;
+ }
+
+ o->guiobject_getRootWnd()->resize(x, y, w, h);
+}
+
+
+int Group::onResize()
+{
+ GROUP_PARENT::onResize();
+ if (!isInited()) return 1;
+
+ RECT wr;
+ getWindowRect(&wr);
+ RECT r2;
+ getClientRect(&r2);
+ size_w = r2.right - r2.left; size_h = r2.bottom - r2.top;
+ for (int i = 0;i < gui_objects.getNumItems();i++)
+ {
+ GuiObject *o = gui_objects.enumItem(i);
+ updatePos(o, &r2);
+ }
+ invalidateScaledReg();
+ return 1;
+}
+
+void Group::invalidateScaledReg()
+{
+ scaledregionvalid = 0;
+ invalidateWindowRegion();
+}
+
+int Group::onInit()
+{
+ GROUP_PARENT::onInit();
+
+ WASABI_API_SYSCB->syscb_registerCallback(static_cast<WndCallbackI*>(this));
+
+ disable_update_pos = 1;
+ no_init_on_addchild = 1;
+
+ const wchar_t *id = getGroupContentId();
+ SkinItem *item = getGroupContentSkinItem();
+ if ((id && *id) || item != NULL)
+ {
+ SkinParser::fillGroup(this, id, item, 0, 1, scripts_enabled);
+ }
+
+ disable_update_pos = 0;
+ no_init_on_addchild = 0;
+
+ onFillGroup();
+
+ return 1;
+}
+
+void Group::onFillGroup()
+{
+ reloadDefaults();
+ if (xui_embedded_id.len() > 0)
+ embeddedxui_onNewEmbeddedContent();
+}
+
+int Group::onGroupChange(const wchar_t *id)
+{
+ GROUP_PARENT::onGroupChange(id);
+
+ if (!isInited()) return 1;
+ const wchar_t *cid = getGroupContentId();
+ SkinItem *item = getGroupContentSkinItem();
+ if (!(cid && *cid) || item != NULL) return 1;
+
+ if (!WCSICMP(id, cid)) return 1;
+
+ deleteScripts();
+
+ WASABI_API_WND->skin_unregisterBaseTextureWindow(this);
+ while (gui_objects.getNumItems() > 0)
+ {
+ SkinParser::destroyGuiObject(gui_objects.enumItem(0));
+ }
+
+ delete background; background = NULL;
+ delete reg; reg = NULL;
+ delete scaledreg; scaledreg = NULL;
+
+ disable_update_pos = 1;
+ no_init_on_addchild = 1;
+
+ SkinParser::fillGroup(this, cid, item, 0, 1, scripts_enabled);
+
+ disable_update_pos = 0;
+ no_init_on_addchild = 0;
+
+ onFillGroup();
+ if (isInited())
+ onResize();
+
+ getGuiObject()->guiobject_onStartup();
+
+ return 1;
+}
+
+void Group::reloadDefaults()
+{
+ getGuiObject()->guiobject_getGuiPosition(NULL, NULL, &size_w, &size_h, NULL, NULL, NULL, NULL);
+ if (size_w == AUTOWH && size_h == AUTOWH)
+ {
+ /* if (!background) {
+ size_w = 250;
+ size_h = 100;
+ } else {
+ size_w = background->getWidth();
+ size_h = background->getHeight();
+ }*/
+ if (background)
+ {
+ setPreferences(SUGGESTED_W, background->getWidth());
+ setPreferences(SUGGESTED_H, background->getHeight());
+ }
+ size_w = GROUP_PARENT::getPreferences(SUGGESTED_W);
+ size_h = GROUP_PARENT::getPreferences(SUGGESTED_H);
+ }
+ //setName(getGuiObject()->guiobject_getId());
+
+ if (propagatesize)
+ {
+ Layout *l = getGuiObject()->guiobject_getParentLayout();
+ if (l) l->addMinMaxEnforcer(this);
+ }
+
+ int i;
+ for (i = 0;i < gui_objects.getNumItems();i++)
+ {
+
+ GuiObject *o = gui_objects.enumItem(i);
+
+ if (o->guiobject_getParentGroup())
+ {
+ o->guiobject_getRootWnd()->setParent(o->guiobject_getParentGroup());
+ if (!o->guiobject_getRootWnd()->isInited())
+ {
+ o->guiobject_getRootWnd()->init(o->guiobject_getParentGroup());
+ o->guiobject_getParentGroup()->onCreateObject(getGuiObject());
+ }
+ }
+ }
+
+ /* if (getGuiObject()->guiobject_getParentGroup() && regionop)
+ getGuiObject()->guiobject_getParentGroup()->addSubRegionGroup(this);*/
+
+ invalidateWindowRegion();
+
+ startScripts();
+
+ for (i = 0;i < gui_objects.getNumItems();i++)
+ {
+ GuiObject *o = gui_objects.enumItem(i);
+ o->guiobject_onStartup();
+ }
+
+ autoResize();
+
+ const wchar_t *name = getName();
+ if (name != NULL)
+ onSetName();
+}
+
+void Group::startScripts()
+{
+ for (int i = 0;i < getNumScripts();i++)
+ {
+ int vcpuid = enumScript(i);
+ SystemObject *o = SOM::getSystemObjectByScriptId(vcpuid);
+ if (o != NULL)
+ {
+ o->onLoad();
+ foreach(xuiparams)
+ XuiParam *p = xuiparams.getfor();
+ o->onSetXuiParam(p->param, p->value);
+ endfor;
+ }
+ }
+}
+
+int Group::onPaint(Canvas *canvas)
+{
+ PaintCanvas paintcanvas;
+ if (canvas == NULL)
+ {
+ if (!paintcanvas.beginPaint(this)) return 0;
+ canvas = &paintcanvas;
+ }
+ GROUP_PARENT::onPaint(canvas);
+ RECT r;
+ if (!canvas->getClipBox(&r))
+ getClientRect(&r);
+
+
+ if (getDrawBackground()) RenderBaseTexture(canvas, r);
+ return 1;
+}
+
+ifc_window *Group::getBaseTextureWindow()
+{
+ if (reg && !reg->isEmpty()) return this;
+ if (getParent()) return getParent()->getBaseTextureWindow();
+ return this;
+}
+
+void Group::autoResize()
+{
+ int w = getWidthBasedOn();
+ int h = getHeightBasedOn();
+ if (h == AUTOWH && w == AUTOWH) return ;
+ resize(NOCHANGE, NOCHANGE, w == AUTOWH ? NOCHANGE : w, h == AUTOWH ? NOCHANGE : h);
+}
+
+int Group::childNotify(ifc_window *child, int msg, intptr_t p1, intptr_t p2)
+{
+ if (msg == ChildNotify::AUTOWHCHANGED)
+ {
+ if (lastwidthsource && child == lastwidthsource->guiobject_getRootWnd() ||
+ lastheightsource && child == lastheightsource->guiobject_getRootWnd())
+ {
+ lastgetwidthbasedon = AUTOWH;
+ lastgetheightbasedon = AUTOWH;
+ autoResize();
+ }
+ }
+ if (!getParent())
+ return 0;
+ return getParent()->childNotify(child, msg, p1, p2);
+}
+
+
+void Group::sendNotifyToAllChildren(int notifymsg, intptr_t param1, intptr_t param2)
+{
+ for (int i = 0;i < gui_objects.getNumItems();i++)
+ gui_objects.enumItem(i)->guiobject_getRootWnd()->childNotify(this, notifymsg, param1, param2);
+}
+
+void Group::addScript(int scriptid)
+{
+ scripts.addItem(scriptid);
+}
+
+int Group::getNumScripts()
+{
+ return scripts.getNumItems();
+}
+
+int Group::enumScript(int n)
+{
+ return scripts.enumItem(n);
+}
+
+void Group::deleteScripts()
+{
+ for (int i = 0;i < scripts.getNumItems();i++)
+ Script::unloadScript(scripts.enumItem(i));
+ scripts.removeAll();
+}
+
+SkinBitmap *Group::getBaseTexture()
+{
+ if (!background) return NULL;
+ return background->getBitmap();
+}
+
+void Group::setBaseTexture(const wchar_t *b, int regis)
+{
+ backgroundstr = b;
+ if (regis) WASABI_API_WND->skin_unregisterBaseTextureWindow(this);
+ delete background;
+ background = NULL;
+ if (b != NULL && *b)
+ {
+ background = new AutoSkinBitmap();
+ background->setBitmap(b);
+#ifdef _WIN32
+ RegionI r(background->getBitmap());
+ setRegion(&r);
+#else
+#warning port me!
+#endif
+
+ if (regis) WASABI_API_WND->skin_registerBaseTextureWindow(this, b);
+ }
+ else
+ {
+ delete reg;
+ reg = NULL;
+ delete scaledreg;
+ scaledreg = NULL;
+ invalidateWindowRegion();
+ }
+
+}
+
+const wchar_t *Group::getBackgroundStr()
+{
+ return backgroundstr;
+}
+
+int Group::onUnknownXuiParam(const wchar_t *xmlattributename, const wchar_t *value)
+{
+ int r = GROUP_PARENT::onUnknownXuiParam(xmlattributename, value);
+ if (r == 0)
+ {
+ if (!isInited())
+ {
+ xuiparams.addItem(new XuiParam(xmlattributename, value));
+ }
+ else
+ {
+ for (int i = 0;i < getNumScripts();i++)
+ {
+ int vcpuid = enumScript(i);
+ SystemObject *o = SOM::getSystemObjectByScriptId(vcpuid);
+ if (o != NULL) o->onSetXuiParam(xmlattributename, value);
+ }
+ }
+ }
+ return r;
+}
+
+api_region *Group::getRegion()
+{
+ ensureScaledRegValid();
+ return scaledreg;
+}
+
+void Group::ensureScaledRegValid()
+{
+ if (!scaledregionvalid)
+ {
+ scaledregionvalid = 1;
+ if (!reg) return ;
+ if (!scaledreg) scaledreg = new RegionI;
+ scaledreg->empty();
+ scaledreg->addRegion(reg);
+ RECT rr;
+ getNonClientRect(&rr);
+ if (background)
+ {
+ float w = (float)(rr.right - rr.left) / (float)background->getWidth();
+ float h = (float)(rr.bottom - rr.top) / (float)background->getHeight();
+ if (w && h && (ABS(w - 1.0f) > 0.01f || ABS(h - 1.0f) > 0.01f))
+ scaledreg->scale(w, h, 1);
+ else if (w == 0 || h == 0)
+ {
+ RECT r = {0, 0, 0, 0};
+ scaledreg->setRect(&r);
+ }
+ }
+ }
+}
+
+void Group::setRegion(api_region *r)
+{
+ ASSERT(r != NULL);
+ if (!reg) reg = new RegionI;
+
+ reg->empty();
+ reg->addRegion(r); // background
+
+ invalidateWindowRegion();
+ invalidateScaledReg();
+}
+
+Container *Group::getParentContainer()
+{
+ if (!getGuiObject()->guiobject_getParentGroup())
+ {
+ ifc_window *r = getDesktopParent();
+ if (r != NULL)
+ {
+ //ASSERT(r != NULL);
+ Layout *l = static_cast<Layout *>(r->getInterface(layoutGuid));
+ if (!l) return NULL;
+ return l->getParentContainer();
+ }
+ }
+ Group *g = getGuiObject()->guiobject_getParentGroup();
+ if (g) return g->getParentContainer();
+ return NULL;
+}
+
+ifc_window *Group::enumObjects(int i)
+{
+ if (i >= gui_objects.getNumItems()) return NULL;
+ return gui_objects.enumItem(i)->guiobject_getRootWnd();
+}
+
+int Group::getNumObjects()
+{
+ return gui_objects.getNumItems();
+}
+
+void Group::addChild(GuiObject *g)
+{
+ gui_objects.addItem(g);
+ script_objects.addItem((ScriptObject *)g);
+ g->guiobject_setParentGroup(this);
+ g->guiobject_getRootWnd()->setParent(this);
+ if (!no_init_on_addchild && isInited()
+ && !g->guiobject_getRootWnd()->isInited())
+ g->guiobject_getRootWnd()->init(this);
+}
+
+void Group::removeChild(GuiObject *g)
+{
+ if (!deleting)
+ gui_objects.removeItem(g);
+ script_objects.removeItem((ScriptObject *)g);
+}
+
+void Group::onCreateObject(GuiObject *o)
+{
+ script_vcpu_onCreateObject(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_OBJECT(o->guiobject_getScriptObject()));
+}
+
+int Group::getDrawBackground()
+{
+ return drawbackground;
+}
+
+void Group::setDrawBackground(int t)
+{
+ drawbackground = t;
+}
+
+int Group::isLayout()
+{
+ return 0;
+}
+
+int Group::isDesktopAlphaSafe()
+{
+ if (!Wasabi::Std::Wnd::isDesktopAlphaAvailable()) return 0;
+ for (int i = 0;i < getNumObjects();i++)
+ {
+ ifc_window *w = enumObjects(i);
+ Group *cg = static_cast<Group *>(w);
+ if (Group::isGroup(cg))
+ if (!cg->isDesktopAlphaSafe()) return 0;
+ if (!w->handleDesktopAlpha()) return 0;
+ }
+ return 1;
+}
+
+int Group::isTransparencySafe(int excludeme)
+{
+ if (!Wasabi::Std::Wnd::isTransparencyAvailable()) return 0;
+ if (!excludeme && isTransparencyForcedOff()) return 0;
+ for (int i = 0;i < getNumObjects();i++)
+ {
+ ifc_window *w = enumObjects(i);
+ Group *cg = static_cast<Group *>(w);
+ if (Group::isGroup(cg))
+ if (!cg->isTransparencySafe()) return 0;
+ if (!w->handleTransparency()) return 0;
+ }
+ return 1;
+}
+
+GuiObject *Group::getObject(const wchar_t *id)
+{
+ for (int i = 0;i < script_objects.getNumItems();i++)
+ {
+ if (!WCSICMP(id, gui_objects.enumItem(i)->guiobject_getId()))
+ {
+ return gui_objects.enumItem(i);
+ }
+ }
+ return NULL;
+}
+
+void Group::setGroupContent(const wchar_t *id, SkinItem *item, int allowscripts)
+{
+ content_id = id;
+ content_item = item;
+ scripts_enabled = allowscripts;
+}
+
+const wchar_t *Group::getGroupContentId()
+{
+ return content_id;
+}
+
+SkinItem *Group::getGroupContentSkinItem()
+{
+ return content_item;
+}
+
+ScriptObject *Group::script_cast(GUID g)
+{
+ GuiObject *o = embeddedxui_getEmbeddedObject();
+ if (o != NULL)
+ {
+ void *r = o->guiobject_getScriptObject()->vcpu_getInterface(g);
+ if (r != NULL)
+ {
+ return o->guiobject_getScriptObject();
+ }
+ }
+ return NULL;
+}
+
+// -----------------------------------------------------------------------
+
+GroupScriptController _groupController;
+GroupScriptController *groupController = &_groupController;
+
+// -- Functions table -------------------------------------
+function_descriptor_struct GroupScriptController::exportedFunction[] = {
+ {L"getObject", 1, (void*)Group::script_vcpu_getObject },
+ {L"enumObject", 1, (void*)Group::script_vcpu_enumObject },
+ {L"getNumObjects", 0, (void*)Group::script_vcpu_getNumObjects },
+ {L"onCreateObject", 1, (void*)Group::script_vcpu_onCreateObject },
+ {L"getMousePosX", 0, (void*)Group::script_vcpu_getMousePosX },
+ {L"getMousePosY", 0, (void*)Group::script_vcpu_getMousePosY },
+ {L"isLayout", 0, (void*)Group::script_vcpu_isLayout },
+ {L"autoResize", 0, (void*)Group::script_vcpu_autoResize},
+ };
+// --------------------------------------------------------
+
+ScriptObject *GroupScriptController::cast(ScriptObject *o, GUID g)
+{
+ Group *grp = static_cast<Group *>(o->vcpu_getInterface(groupGuid));
+ if (grp != NULL)
+ return grp->script_cast(g);
+ return NULL;
+}
+
+const wchar_t *GroupScriptController::getClassName()
+{
+ return L"Group";
+}
+
+const wchar_t *GroupScriptController::getAncestorClassName()
+{
+ return L"GuiObject";
+}
+
+int GroupScriptController::getInstantiable()
+{
+ return 1;
+}
+
+ScriptObject *GroupScriptController::instantiate()
+{
+ return NULL;
+}
+
+void GroupScriptController::destroy(ScriptObject *o)
+{}
+
+void *GroupScriptController::encapsulate(ScriptObject *o)
+{
+ return NULL;
+}
+
+void GroupScriptController::deencapsulate(void *o)
+{}
+
+int GroupScriptController::getNumFunctions()
+{
+ return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
+}
+
+const function_descriptor_struct *GroupScriptController::getExportedFunctions()
+{
+ return exportedFunction;
+}
+
+GUID GroupScriptController::getClassGuid()
+{
+ return groupGuid;
+}
+
+
+const wchar_t *Group::vcpu_getClassName()
+{
+ return L"Group";
+}
+
+
+void Group::addObject(GuiObject *o)
+{
+ addChild(o);
+}
+
+void Group::removeObject(GuiObject *o)
+{
+ removeChild(o);
+}
+
+void Group::setRegionOp(int o)
+{
+ GROUP_PARENT::setRegionOp(o);
+ autoregionop = 0;
+}
+
+void Group::invalidateWindowRegion()
+{
+ GROUP_PARENT::invalidateWindowRegion();
+ if (!isInited() || isLayout()) return ;
+ if (autoregionop)
+ {
+ int yes = 0;
+ for (int i = 0;i < gui_objects.getNumItems();i++)
+ {
+ if (gui_objects.enumItem(i)->guiobject_getRegionOp() != REGIONOP_NONE)
+ {
+ yes = 1;
+ break;
+ }
+ }
+ if (yes)
+ GROUP_PARENT::setRegionOp(REGIONOP_OR);
+ else
+ GROUP_PARENT::setRegionOp(REGIONOP_NONE);
+ }
+}
+
+// VCPU
+
+scriptVar Group::script_vcpu_onCreateObject(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar ob)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS1(o, groupController, ob);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT1(o, ob);
+}
+
+// Get an object from its ID
+scriptVar Group::script_vcpu_getObject(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar obj)
+{
+ SCRIPT_FUNCTION_INIT
+ ASSERT(obj.type == SCRIPT_STRING); // compiler discarded
+ Group *g = static_cast<Group *>(o->vcpu_getInterface(groupGuid));
+ GuiObject *ob = NULL;
+ if (g)
+ ob = g->getObject(GET_SCRIPT_STRING(obj));
+ return MAKE_SCRIPT_OBJECT(ob ? ob->guiobject_getScriptObject() : NULL);
+}
+
+scriptVar Group::script_vcpu_getMousePosX(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Group *g = static_cast<Group *>(o->vcpu_getInterface(groupGuid));
+ if (g)
+ {
+ POINT pt;
+ Wasabi::Std::getMousePos(&pt);
+ g->screenToClient(&pt);
+ return MAKE_SCRIPT_INT(pt.x);
+ }
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar Group::script_vcpu_getMousePosY(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Group *g = static_cast<Group *>(o->vcpu_getInterface(groupGuid));
+ if (g)
+ {
+ POINT pt;
+ Wasabi::Std::getMousePos(&pt);
+ g->screenToClient(&pt);
+ return MAKE_SCRIPT_INT(pt.y);
+ }
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar Group::script_vcpu_getNumObjects(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Group *g = static_cast<Group *>(o->vcpu_getInterface(groupGuid));
+ if (g) return MAKE_SCRIPT_INT(g->getNumObjects());
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar Group::script_vcpu_enumObject(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar i)
+{
+ SCRIPT_FUNCTION_INIT
+ Group *g = static_cast<Group *>(o->vcpu_getInterface(groupGuid));
+ GuiObject *obj = NULL;
+ if (g)
+ obj = g->gui_objects.enumItem(GET_SCRIPT_INT(i));
+ return MAKE_SCRIPT_OBJECT(obj ? obj->guiobject_getScriptObject() : NULL);
+}
+
+scriptVar Group::script_vcpu_isLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Group *g = static_cast<Group *>(o->vcpu_getInterface(groupGuid));
+ return MAKE_SCRIPT_BOOLEAN(g ? g->isLayout() : NULL);
+}
+
+scriptVar Group::script_vcpu_autoResize(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Group *g = static_cast<Group *>(o->vcpu_getInterface(groupGuid));
+ if (g != NULL) g->autoResize();
+ RETURN_SCRIPT_VOID
+}
+
+#ifdef WASABI_COMPILE_CONFIG
+
+int Group::isCfgGroup(Group *ptr)
+{
+ CfgGroup *g = static_cast<CfgGroup *>(ptr);
+ return cfggrouplist.haveItem(g);
+}
+
+#endif
+
+PtrList<CfgGroup> Group::cfggrouplist;
+PtrList<Group> Group::groups;
+
+// ---------------------------------------------------------------
+// Config Groups
+
+
+#ifdef WASABI_COMPILE_CONFIG
+
+CfgGroup::CfgGroup()
+{
+ getScriptObject()->vcpu_setInterface(cfgGroupGuid, (void *)static_cast<CfgGroup *>(this));
+ getScriptObject()->vcpu_setClassName(L"CfgGroup");
+ getScriptObject()->vcpu_setController(cfgGroupController);
+ cfgitem = NULL;
+ cfggrouplist.addItem(this);
+}
+
+CfgGroup::~CfgGroup()
+{
+ if (cfgitem) viewer_delViewItem(cfgitem);
+ cfggrouplist.removeItem(this);
+}
+
+const wchar_t *CfgGroup::vcpu_getClassName()
+{
+ return L"CfgGroup";
+}
+
+void CfgGroup::setAttr(CfgItem *item, const wchar_t *name)
+{
+ if (cfgitem) viewer_delViewItem(cfgitem);
+ cfgitem = item;
+ attrname = name;
+ if (cfgitem != NULL)
+ {
+ wchar_t t[256] = L"";
+ nsGUID::toCharW(cfgitem->getGuid(), t);
+ cfgguid = t;
+ }
+ if (cfgitem) viewer_addViewItem(cfgitem);
+ dataChanged();
+}
+
+int CfgGroup::viewer_onEvent(CfgItem *item, int event, intptr_t param, void *ptr, size_t ptrlen)
+{
+ dataChanged();
+ return 1;
+}
+
+int CfgGroup::onInit()
+{
+ int r = Group::onInit();
+ dataChanged();
+ return r;
+}
+
+void CfgGroup::dataChanged()
+{
+ script_vcpu_onCfgChanged(SCRIPT_CALL, getScriptObject());
+}
+
+CfgItem *CfgGroup::getCfgItem()
+{
+ return cfgitem;
+}
+
+const wchar_t *CfgGroup::getAttributeName()
+{
+ return attrname;
+}
+
+scriptVar CfgGroup::script_vcpu_cfgGetInt(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ CfgGroup *cg = static_cast<CfgGroup *>(o->vcpu_getInterface(cfgGroupGuid));
+ if (cg)
+ {
+ CfgItem *i = cg->getCfgItem();
+ const wchar_t *attrname = cg->getAttributeName();
+ if (o != NULL && attrname != NULL)
+ return MAKE_SCRIPT_INT(i->getDataAsInt(attrname, 0));
+ }
+ return MAKE_SCRIPT_INT(0);
+}
+
+scriptVar CfgGroup::script_vcpu_cfgSetInt(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar v)
+{
+ SCRIPT_FUNCTION_INIT
+ ASSERT(SOM::isNumeric(&v));
+ CfgGroup *cg = static_cast<CfgGroup *>(o->vcpu_getInterface(cfgGroupGuid));
+ if (cg)
+ {
+ CfgItem *i = cg->getCfgItem();
+ const wchar_t *attrname = cg->getAttributeName();
+ if (o != NULL && attrname != NULL)
+ {
+ i->setDataAsInt(attrname, GET_SCRIPT_INT(v));
+ }
+ }
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar CfgGroup::script_vcpu_cfgGetString(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ CfgGroup *cg = static_cast<CfgGroup *>(o->vcpu_getInterface(cfgGroupGuid));
+ if (cg)
+ {
+ CfgItem *i = cg->getCfgItem();
+ const wchar_t *a = cg->getAttributeName();
+ *txt = 0;
+ if (!i || !a)
+ return MAKE_SCRIPT_STRING(txt);
+ if (o != NULL && a != NULL)
+ {
+ i->getData(a, txt, 512);
+ }
+ return MAKE_SCRIPT_STRING(txt);
+ }
+ return MAKE_SCRIPT_STRING(L"");
+}
+
+scriptVar CfgGroup::script_vcpu_cfgSetString(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar v)
+{
+ SCRIPT_FUNCTION_INIT
+ ASSERT(!SOM::isNumeric(&v));
+ CfgGroup *cg = static_cast<CfgGroup *>(o->vcpu_getInterface(cfgGroupGuid));
+ if (cg)
+ {
+ CfgItem *i = cg->getCfgItem();
+ const wchar_t *a = cg->getAttributeName();
+ if (!i || !a) RETURN_SCRIPT_VOID;
+ if (o != NULL && a != NULL)
+ {
+ i->setData(a, GET_SCRIPT_STRING(v));
+ }
+ }
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar CfgGroup::script_vcpu_cfgGetFloat(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ CfgGroup *cg = static_cast<CfgGroup *>(o->vcpu_getInterface(cfgGroupGuid));
+ if (cg)
+ {
+ CfgItem *i = cg->getCfgItem();
+ const wchar_t *attrname = cg->getAttributeName();
+ if (o != NULL && attrname != NULL)
+ return MAKE_SCRIPT_FLOAT((float)i->getDataAsFloat(attrname, 0));
+ }
+ return MAKE_SCRIPT_FLOAT(0);
+}
+
+scriptVar CfgGroup::script_vcpu_cfgSetFloat(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar v)
+{
+ SCRIPT_FUNCTION_INIT
+ ASSERT(SOM::isNumeric(&v));
+ CfgGroup *cg = static_cast<CfgGroup *>(o->vcpu_getInterface(cfgGroupGuid));
+ if (cg)
+ {
+ CfgItem *i = cg->getCfgItem();
+ const wchar_t *attrname = cg->getAttributeName();
+ if (o != NULL && attrname != NULL)
+ {
+ i->setDataAsFloat(attrname, GET_SCRIPT_FLOAT(v));
+ }
+ }
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar CfgGroup::script_vcpu_cfgGetName(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ CfgGroup *cg = static_cast<CfgGroup *>(o->vcpu_getInterface(cfgGroupGuid));
+
+ if (cg)
+ {
+ return MAKE_SCRIPT_STRING(cg->getAttributeName());
+ }
+ return MAKE_SCRIPT_STRING(L"");
+}
+
+scriptVar CfgGroup::script_vcpu_cfgGetGuid(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ CfgGroup *cg = static_cast<CfgGroup *>(o->vcpu_getInterface(cfgGroupGuid));
+ if (cg)
+ return MAKE_SCRIPT_STRING(cg->getCfgGuid());
+ return MAKE_SCRIPT_STRING(L"");
+}
+
+
+scriptVar CfgGroup::script_vcpu_onCfgChanged(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS0(o, cfgGroupController);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT0(o);
+}
+
+CfgGroupScriptController _cfgGroupController;
+CfgGroupScriptController *cfgGroupController = &_cfgGroupController;
+
+// -- Functions table -------------------------------------
+function_descriptor_struct CfgGroupScriptController::exportedFunction[] = {
+ {L"cfgGetInt", 0, (void*)CfgGroup::script_vcpu_cfgGetInt },
+ {L"cfgSetInt", 1, (void*)CfgGroup::script_vcpu_cfgSetInt },
+ {L"cfgGetFloat", 0, (void*)CfgGroup::script_vcpu_cfgGetFloat },
+ {L"cfgSetFloat", 1, (void*)CfgGroup::script_vcpu_cfgSetFloat },
+ {L"cfgGetString", 0, (void*)CfgGroup::script_vcpu_cfgGetString },
+ {L"cfgSetString", 1, (void*)CfgGroup::script_vcpu_cfgSetString },
+ {L"onCfgChanged", 0, (void*)CfgGroup::script_vcpu_onCfgChanged },
+ {L"cfgGetName", 0, (void*)CfgGroup::script_vcpu_cfgGetName },
+ {L"cfgGetGuid", 0, (void*)CfgGroup::script_vcpu_cfgGetGuid},
+ };
+
+/*SET_HIERARCHY(Group, SCRIPT_LAYOUT);
+SET_HIERARCHY2(Group, SCRIPT_LAYOUT, LAYOUT_SCRIPTPARENT);*/
+
+const wchar_t *CfgGroupScriptController::getClassName()
+{
+ return L"CfgGroup";
+}
+
+const wchar_t *CfgGroupScriptController::getAncestorClassName()
+{
+ return L"Group";
+}
+
+int CfgGroupScriptController::getInstantiable()
+{
+ return 1;
+}
+
+ScriptObject *CfgGroupScriptController::instantiate()
+{
+ return NULL;
+}
+
+int CfgGroupScriptController::getNumFunctions()
+{
+ return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
+}
+
+const function_descriptor_struct *CfgGroupScriptController::getExportedFunctions()
+{
+ return exportedFunction;
+}
+
+GUID CfgGroupScriptController::getClassGuid()
+{
+ return cfgGroupGuid;
+}
+
+wchar_t CfgGroup::txt[512] = L"";
+
+#endif // config