123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- #include <precomp.h>
- #include "msgbox.h"
- #include <api/wndmgr/skinwnd.h>
- #include <api/wnd/wndclass/guiobjwnd.h>
- #include <api/script/scriptguid.h>
- #include <api/script/objects/c_script/c_container.h>
- #include <api/script/objects/c_script/c_text.h>
- #include <api/script/objects/c_script/c_button.h>
- _btnstruct msgboxbtns[] =
- {
- { L"<<", MSGBOX_PREVIOUS },
- { L"OK", MSGBOX_OK },
- { L"Yes", MSGBOX_YES },
- { L"All", MSGBOX_ALL },
- { L"No", MSGBOX_NO },
- { L">>", MSGBOX_NEXT },
- { L"Cancel", MSGBOX_CANCEL },
- };
- MsgBox::MsgBox(const wchar_t *_text, const wchar_t *_title, int _flags, const wchar_t *notanymore)
- {
- text = _text;
- title = _title;
- flags = _flags;
- #ifdef WIN32
- #ifdef _DEBUG
- DebugStringW(L"msgbox: %s: %s", title, text.getValue());
- #endif
- #endif
- notanymore_id = notanymore;
- sw = NULL;
- if (flags == 0) flags = MSGBOX_OK;
- }
- MsgBox::~MsgBox()
- {
- foreach(buttons)
- WASABI_API_SKIN->xui_delete(buttons.getfor());
- endfor
- }
- int MsgBox::run()
- {
- int _r = -1;
- #ifdef WASABI_COMPILE_CONFIG
- if (!notanymore_id.isempty())
- {
- StringPrintfW txt(L"msgbox_defaultvalue_%s", notanymore_id);
- if ((GetKeyState(VK_SHIFT) & 0x8000))
- WASABI_API_CONFIG->setIntPublic(txt, -1);
- _r = WASABI_API_CONFIG->getIntPublic(txt, -1);
- }
- #endif
- if (_r == -1)
- {
- sw = new SkinWnd(L"msgbox.custom.group", L"modal", FALSE, NULL, 1, 1);
- if (!sw->getWindow()) return -1;
- ifc_window *grp = sw->getWindow();
- ifc_window *l = grp->getDesktopParent();
- GuiObject *_p = sw->findObject(L"msgbox.custom.group");
- //CUT: api_window *p = _p->guiobject_getRootWnd();
- C_Container cont(sw->getContainer());
- cont.setName(title);
- createButtons();
- int min_w = reposButtons();
- GuiObject *go_txt = sw->findObject(L"msgbox.text");
- if (go_txt != NULL)
- {
- GuiObject *to = go_txt->guiobject_findObject(L"wasabi.text");
- GuiObject *gto = sw->findObject(L"text");
- if (to != NULL && gto != NULL)
- {
- go_txt->guiobject_setXmlParam(L"text", text);
- C_GuiObject t(*go_txt);
- int _w = t.getAutoWidth();
- int _h = t.getAutoHeight();
- to->guiobject_setXmlParam(L"w", StringPrintfW(_w));
- to->guiobject_setXmlParam(L"h", StringPrintfW(_h));
- to->guiobject_setXmlParam(L"relatw", L"0");
- to->guiobject_setXmlParam(L"relath", L"0");
- int x, rx, w, rw;
- int y, ry, h, rh;
- int gtow, gtoh;
- go_txt->guiobject_getGuiPosition(&x, &y, &w, &h, &rx, &ry, &rw, &rh);
- if (rw == 1)
- _w += -w;
- else
- _w += x * 2;
- if (rh == 1)
- _h += -h;
- else
- _h += y * 2;
- gtow = _w;
- gtoh = _h;
- GuiObject *grpo = grp->getGuiObject();
- ASSERT(grpo != NULL);
- gto->guiobject_getGuiPosition(&x, &y, &w, &h, &rx, &ry, &rw, &rh);
- if (rw == 1)
- _w += -w;
- else
- _w += x * 2;
- if (rh == 1)
- _h += -h;
- else
- _h += y * 2;
- gto->guiobject_setXmlParam(L"w", StringPrintfW(gtow));
- gto->guiobject_setXmlParam(L"h", StringPrintfW(gtoh));
- grpo->guiobject_setXmlParam(L"w", StringPrintfW(_w));
- grpo->guiobject_setXmlParam(L"h", StringPrintfW(_h));
- grpo->guiobject_setXmlParam(L"lockminmax", L"1");
- grpo->guiobject_setXmlParam(L"propagatesize", L"1");
- XmlObject *xl = static_cast<XmlObject *>(l->getInterface(xmlObjectGuid));
- xl->setXmlParam(L"minimum_h", StringPrintfW(L"%d", _h));
- xl->setXmlParam(L"minimum_w", StringPrintfW(L"%d", (_w < min_w) ? min_w : _w));
- }
- }
- if (!notanymore_id.isempty())
- {
- GuiObject *o = WASABI_API_SKIN->xui_new(L"Wasabi:CheckBox"); // that'll be deleted automatically when our parent group destroys
- if (o != NULL)
- {
- ifc_window *w = o->guiobject_getRootWnd();
- C_GuiObject go(*o);
- go.init(_p->guiobject_getScriptObject());
- o->guiobject_setXmlParam(L"text", L"Do not show this message anymore");
- o->guiobject_setXmlParam(L"y", L"-50");
- o->guiobject_setXmlParam(L"relaty", L"1");
- o->guiobject_setXmlParam(L"x", L"12");
- o->guiobject_setXmlParam(L"relatx", L"0");
- o->guiobject_setXmlParam(L"w", L"-24");
- o->guiobject_setXmlParam(L"relatw", L"1");
- min_w = MAX(w->getPreferences(SUGGESTED_W), min_w);
- }
- }
- sw->notifyMinMaxChanged();
- reposButtons();
- _r = sw->runModal(1);
- }
- #ifdef WASABI_COMPILE_CONFIG
- if (!notanymore_id.isempty() && _r != -1 && sw != NULL)
- {
- GuiObject *o = sw->findObject(L"checkbox.toggle");
- if (o != NULL)
- {
- C_Button b(*o);
- if (b.getActivated())
- {
- StringPrintfW txt(L"msgbox_defaultvalue_%s", notanymore_id);
- WASABI_API_CONFIG->setIntPublic(txt, _r);
- }
- }
- }
- #endif
- if (sw) sw->destroy(); sw = NULL;
- return _r;
- }
- void MsgBox::addButton(const wchar_t *text, int retcode)
- {
- GuiObject *o = WASABI_API_SKIN->xui_new(L"Wasabi:Button"); // that wil NOT be deleted automatically when our parent group destroys because we did not init with guiobject
- if (o != NULL)
- {
- o->guiobject_setXmlParam(L"action", L"endmodal");
- o->guiobject_setXmlParam(L"retcode", StringPrintfW(retcode));
- o->guiobject_setXmlParam(L"text", text);
- buttons.addItem(o);
- }
- }
- void MsgBox::createButtons()
- {
- GuiObject *_p = sw->findObject(L"msgbox.custom.group");
- if (!_p) return ;
- ASSERT(buttons.getNumItems() == 0);
- buttons.deleteAll();
- for (int i = 0;i < sizeof(msgboxbtns) / sizeof(_btnstruct);i++)
- {
- if (flags & msgboxbtns[i].id)
- {
- addButton(msgboxbtns[i].txt, msgboxbtns[i].id);
- }
- }
- ifc_window *p = _p->guiobject_getRootWnd();
- foreach(buttons)
- ifc_window *wnd = buttons.getfor()->guiobject_getRootWnd();
- if (wnd != NULL)
- {
- wnd->setStartHidden(1);
- wnd->setParent(p);
- wnd->init(p);
- }
- endfor;
- }
- int MsgBox::reposButtons()
- {
- RECT r;
- GuiObject *_p = sw->findObject(L"msgbox.custom.group");
- ifc_window *p = _p->guiobject_getRootWnd();
- p->getClientRect(&r);
- int shift = 0;
- //CUT: int _w = 0;
- //CUT: int _h = 0;
- for (int i = buttons.getNumItems() - 1;i >= 0;i--)
- {
- ifc_window *wnd = buttons.enumItem(i)->guiobject_getRootWnd();
- if (wnd != NULL)
- {
- int _w = wnd->getPreferences(SUGGESTED_W);
- int _h = wnd->getPreferences(SUGGESTED_H);
- if (_w == AUTOWH) _w = -1;
- int w = MAX(_w, 64);
- wnd->resize(r.right - w - 16 - shift, r.bottom - 8 - _h, w, _h);
- _w = MAX(w, _w);
- _h = MAX(_h, _h);
- shift += w + 4;
- }
- }
- foreach(buttons)
- ifc_window *wnd = buttons.getfor()->guiobject_getRootWnd();
- if (wnd != NULL)
- wnd->setVisible(1);
- endfor;
- return shift;
- }
|