#include #include "msgbox.h" #include #include #include #include #include #include _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(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; }