diff options
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/title.cpp')
-rw-r--r-- | Src/Wasabi/api/skin/widgets/title.cpp | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/Src/Wasabi/api/skin/widgets/title.cpp b/Src/Wasabi/api/skin/widgets/title.cpp new file mode 100644 index 00000000..92acf4d7 --- /dev/null +++ b/Src/Wasabi/api/skin/widgets/title.cpp @@ -0,0 +1,261 @@ +#include <precomp.h> +#include "title.h" +#include <api/wndmgr/layout.h> +#include <api/wnd/paintset.h> +#include <api/skin/widgets/text.h> +#include <api/locales/xlatstr.h> +#include <api/wnd/cwndtrack.h> +#include <api/util/varmgr.h> +#include <api/wnd/PaintCanvas.h> + +#define DC_MAXIMIZE 0x9831 + +const wchar_t titleBarXuiObjectStr[] = L"TitleBar"; // This is the xml tag +char titleBarXuiSvcName[] = "TitleBar xui object"; // this is the name of the xuiservice +XMLParamPair Title::params[] = { + {TITLE_SETBORDER, L"BORDER"}, + {TITLE_SETDBLCLKACTION, L"DBLCLICKACTION"}, + {TITLE_SETMAXIMIZE, L"MAXIMIZE"}, + {TITLE_SETSTREAKS, L"STREAKS"}, + {TITLE_SETTITLE, L"TITLE"}, + }; +Title::Title() +{ + getScriptObject()->vcpu_setInterface(titleGuid, (void *)static_cast<Title *>(this)); + getScriptObject()->vcpu_setClassName(L"Title"); + getScriptObject()->vcpu_setController(titleController); + dostreaks = 1; + doborder = 1; + m_maximize = 0; + getGuiObject()->guiobject_setMover(1); + xuihandle = newXuiHandle(); + CreateXMLParameters(xuihandle); +} + +void Title::CreateXMLParameters(int master_handle) +{ + //TITLE_PARENT::CreateXMLParameters(master_handle); + int numParams = sizeof(params) / sizeof(params[0]); + hintNumberOfParams(xuihandle, numParams); + for (int i = 0;i < numParams;i++) + addParam(xuihandle, params[i], XUI_ATTRIBUTE_IMPLIED); +} + +Title::~Title() +{} + +int Title::setXuiParam(int _xuihandle, int attrid, const wchar_t *name, const wchar_t *strval) +{ + if (xuihandle != _xuihandle) return TITLE_PARENT::setXuiParam(_xuihandle, attrid, name, strval); + switch (attrid) + { + case TITLE_SETTITLE: + setTitle(strval); + break; + case TITLE_SETSTREAKS: + setStreaks(WTOI(strval)); + break; + case TITLE_SETBORDER: + setBorder(WTOI(strval)); + break; + case TITLE_SETMAXIMIZE: + m_maximize = WTOI(strval); + break; + case TITLE_SETDBLCLKACTION: + dblClickAction = strval; + break; + default: + return 0; + } + return 1; +} + +void Title::setStreaks(int s) +{ + if (s == dostreaks) return ; + dostreaks = s; + invalidate(); +} + +void Title::setBorder(int b) +{ + if (b == doborder) return ; + doborder = b; + invalidate(); +} + +int Title::getPreferences(int what) +{ + if (what == SUGGESTED_W) return 128; + if (what == SUGGESTED_H) return 22; + return TITLE_PARENT::getPreferences(what); +} + +int Title::onPaint(Canvas *canvas) +{ + const wchar_t *tempname = title; + //StringW tempname(title); + PaintCanvas paintcanvas; + if (canvas == NULL) + { + if (!paintcanvas.beginPaint(this)) return 0; + canvas = &paintcanvas; + } + TITLE_PARENT::onPaint(canvas); + +#ifdef WA3COMPATIBILITY + //tempname = PublicVarManager::translate(title, getGuiObject()); +#else + tempname = title; +#endif + + +#ifdef WASABI_COMPILE_PAINTSETS + RECT pr(TITLE_PARENT::clientRect()); + const wchar_t *t = NULL; + switch(wantTranslation()) + { + case 0: + t = tempname; + break; + case 1: + t = _(tempname); + break; + case 2: + t = __(tempname); + break; + } + paintset_renderTitle(t, canvas, &pr, getPaintingAlpha(), dostreaks, doborder); +#endif + + + return 1; +} + +void Title::setTitle(const wchar_t *t) +{ + title = t; + title.toupper(); +} + +const wchar_t *Title::getTitle() +{ + return title; +} + +int Title::onLeftButtonDblClk(int x, int y) +{ + if (m_maximize) + postDeferredCallback(DC_MAXIMIZE, 0); + else + { +#ifdef WASABI_COMPILE_WNDMGR + if (dblClickAction) + { + const wchar_t *toCheck = L"SWITCH;"; + if (!WCSNICMP(dblClickAction, toCheck, 7)) + { + onLeftButtonUp(x, y); + getGuiObject()->guiobject_getParentGroup()->getParentContainer()->switchToLayout(dblClickAction.getValue() + 7); + } + } +#endif + + } + ifc_window *b = getParent(); + if (b) + return b->onLeftButtonDblClk(x, y); + return TITLE_PARENT::onLeftButtonDblClk(x, y); +} + +int Title::onDeferredCallback(intptr_t param1, intptr_t param2) +{ + switch (param1) + { +#ifdef WASABI_COMPILE_WNDMGR + case DC_MAXIMIZE: + Container *c = getGuiObject()->guiobject_getParentGroup()->getParentContainer(); + if (c) + { + Layout *l = c->getCurrentLayout(); + if (l) + { + if (l->isMaximized()) l->restore(); + else l->maximize(); + } + } + return 1; +#endif + + } + return TITLE_PARENT::onDeferredCallback(param1, param2); +} + +TitleScriptController _titleController; +TitleScriptController *titleController = &_titleController; + + +// -- Functions table ------------------------------------- +function_descriptor_struct TitleScriptController::exportedFunction[] = { + {L"fake", 0, (void*)Title::script_vcpu_fake }, + }; + +const wchar_t *TitleScriptController::getClassName() +{ + return L"Title"; +} + +const wchar_t *TitleScriptController::getAncestorClassName() +{ + return L"GuiObject"; +} + +ScriptObject *TitleScriptController::instantiate() +{ + Title *t = new Title; + ASSERT(t != NULL); + return t->getScriptObject(); +} + +void TitleScriptController::destroy(ScriptObject *o) +{ + Title *t = static_cast<Title *>(o->vcpu_getInterface(titleGuid)); + ASSERT(t != NULL); + delete t; +} + +void *TitleScriptController::encapsulate(ScriptObject *o) +{ + return NULL; // no encapsulation for title yet +} + +void TitleScriptController::deencapsulate(void *o) +{} + +int TitleScriptController::getNumFunctions() +{ + return sizeof(exportedFunction) / sizeof(function_descriptor_struct); +} + +const function_descriptor_struct *TitleScriptController::getExportedFunctions() +{ + return exportedFunction; +} + +GUID TitleScriptController::getClassGuid() +{ + return titleGuid; +} + + +const wchar_t *Title::vcpu_getClassName() +{ + return L"Title"; +} + +scriptVar Title::script_vcpu_fake(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) +{ + SCRIPT_FUNCTION_INIT + RETURN_SCRIPT_VOID; +} + |