#ifndef __DROPDOWNLIST_H #define __DROPDOWNLIST_H #include #include #include #include #include #include #define DROPDOWNLIST_PARENT EmbeddedXuiObject class DDLClicksCallback; class DDLKeyCallback; class svc_textFeed; /** Class @short @author Nullsoft @ver 1.0 @see */ class DDLEntry { public: /** Method @see @ret @param */ DDLEntry(const wchar_t *txt) : text(txt), id(id_gen++) { } const wchar_t *getText() { return text; } /** Method @see @ret @param */ int getId() { return id; } private: StringW text; int id; static int id_gen; }; /** Class @short @author Nullsoft @ver 1.0 @see */ class SortDDLEntries{ public: static int compareItem(DDLEntry *p1, DDLEntry *p2) { return WCSICMP(p1->getText(), p2->getText()); } static int compareAttrib(const wchar_t *attrib, DDLEntry *item) { return WCSICMP(attrib, item->getText()); } }; /** Class @short @author Nullsoft @ver 1.0 @see */ class DropDownList : public DROPDOWNLIST_PARENT, public PopupExitCallbackI, public FeedWatcher, public DependentViewerI { public: /** Method @see @ret @param */ DropDownList(); /** Method @see @ret @param */ virtual ~DropDownList(); /** Method @see @ret @param */ virtual int onInit(); /** Method @see @ret @param */ void clickCallback(); void escapeCallback(); /** Method @see @ret @param */ #ifdef WASABI_COMPILE_CONFIG virtual int onReloadConfig(); #endif /** Method @see @ret @param */ virtual void abstract_onNewContent(); /** Method @see @ret @param */ virtual void setListHeight(int h) { height = h; } /** Method @see @ret @param */ virtual int popupexitcb_onExitPopup(); virtual api_dependent *popupexit_getDependencyPtr() { return rootwnd_getDependencyPtr(); } /** Method @see @ret @param */ void openList(); /** Method @see @ret @param */ void closeList(); void setItems(const wchar_t *lotsofitems); int addItem(const wchar_t *text); /** Method @see @ret @param */ void delItem(int id); int findItem(const wchar_t *text); int getNumItems() { return items.getNumItems(); } DDLEntry *enumItem(int i) { return items.enumItem(i); } /** Method @see @ret @param */ void selectItem(int id, int hover=0); const wchar_t *getItemText(int id); int getSelected() { return selected; } const wchar_t *getSelectedText() { int a = getSelected(); if (a == -1) return getCustomText(); return getItemText(a); } virtual const wchar_t *getCustomText() { return noitemtext; } /** Method @see @ret @param */ virtual void deleteAllItems(); /** Method @see @ret @param */ virtual void onSelect(int id, int hover=0); virtual void setNoItemText(const wchar_t *txt); /** Method @see @ret @param */ virtual int childNotify(ifc_window *child, int msg, intptr_t param1=0, intptr_t param2=0); /** Method @see @ret @param */ virtual int onDeferredCallback(intptr_t p1, intptr_t p2); /** Method @see @ret @param */ virtual int viewer_onItemDeleted(api_dependent *item); virtual void feedwatcher_onSetFeed(svc_textFeed *svc); virtual void feedwatcher_onFeedChange(const wchar_t *data); virtual int onAction(const wchar_t *action, const wchar_t *param=NULL, int x=-1, int y=-1, intptr_t p1=0, intptr_t p2=0, void *data=NULL, size_t datalen=0, ifc_window *source=NULL); /** Method @see @ret @param */ virtual void selectDefault(); virtual void setMaxItems(int _maxitems) { maxitems = _maxitems; } virtual int getMaxItems() { return maxitems; } virtual int wantTrapButton() { return 1; } virtual int wantTrapText() { return 1; } virtual int wantFocus() { return 1; } virtual const wchar_t *dropdownlist_getMainGroupId() { return L"wasabi.dropdownlist.main.group"; } virtual const wchar_t *dropdownlist_getListGroupId() { return L"wasabi.dropdownlist.list.group"; } virtual const wchar_t *dropdownlist_getTextId() { return L"dropdownlist.text"; } virtual const wchar_t *dropdownlist_getButtonId() { return L"dropdownlist.button"; } virtual const wchar_t *dropdownlist_getListId() { return L"dropdownlist.list"; } virtual void updateTextInControl(const wchar_t *txt); virtual int setXuiParam(int xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value); virtual const wchar_t *embeddedxui_getContentId() { return dropdownlist_getMainGroupId(); } virtual const wchar_t *embeddedxui_getEmbeddedObjectId() { return dropdownlist_getTextId(); } int isListOpen() { return list_group != NULL; }; virtual int wantAutoSort() { return 1; } virtual void dropdownlist_onCloseList(); virtual void dropdownlist_onOpenList(); virtual void dropdownlist_onConfigureList(GuiObject *o); virtual int onKeyDown(int keyCode); virtual int onKeyUp(int keyCode); virtual int onAcceleratorEvent(const wchar_t *name); virtual void onPreCloseList() {} virtual void onPreOpenList() {} protected: /*static */void CreateXMLParameters(int master_handle); private: enum { DROPDOWNLIST_SETITEMS = 0, DROPDOWNLIST_SETFEED, DROPDOWNLIST_SELECT, DROPDOWNLIST_LISTHEIGHT, DROPDOWNLIST_MAXITEMS, DROPDOWNLIST_SETLISTANTIALIAS, }; int myxuihandle; static XMLParamPair params[]; private: #ifdef WASABI_COMPILE_CONFIG void updateTextFromConfig(); #endif /** Method @see @ret @param */ void trapControls(); /** Method @see @ret @param */ void setListParams(); /** Method @see @ret @param */ void doCloseList(int cb=1); DDLClicksCallback *clicks_button; DDLClicksCallback *clicks_text; DDLKeyCallback *list_key; ifc_window *list_group; PtrListInsertSorted items; int selected; int height; int maxitems; StringW noitemtext; int trap_click; api_dependent *group_dep; ifc_window *action_list; int disable_cfg_event; ifc_window *listif; int listAntialias; }; /** Class @short @author Nullsoft @ver 1.0 @see */ class DDLClicksCallback : public H_GuiObject { public: /** Method @see @ret @param */ DDLClicksCallback(ScriptObject *trap, DropDownList *_callback) : /** Method @see @ret @param */ callback(_callback), H_GuiObject(trap) { } /** Method @see @ret @param */ virtual void hook_onLeftButtonDown(int x, int y) { callback->clickCallback(); } virtual void hook_onChar(wchar_t c) { #ifdef _WIN32 if (c == VK_SPACE || c == VK_RETURN) callback->clickCallback(); #else #warning port me #endif } private: DropDownList *callback; }; class DDLKeyCallback : public H_GuiObject { public: /** Method @see @ret @param */ DDLKeyCallback(ScriptObject *trap, DropDownList *_callback) : /** Method @see @ret @param */ callback(_callback), H_GuiObject(trap) { } /** Method @see @ret @param */ virtual void hook_onChar(wchar_t c) { #ifdef _WIN32 if (c == VK_ESCAPE) callback->escapeCallback(); #else #warning port me #endif } private: DropDownList *callback; }; // ----------------------------------------------------------------------- class DropDownListScriptController: public ScriptObjectControllerI { public: virtual const wchar_t *getClassName() { return L"DropDownList"; } virtual const wchar_t *getAncestorClassName() { return L"ObjectEmbedder"; } virtual ScriptObjectController *getAncestorController() { return WASABI_API_MAKI->maki_getController(embeddedXuiGuid); } virtual int getNumFunctions(); virtual const function_descriptor_struct *getExportedFunctions(); virtual GUID getClassGuid() { return dropDownListGuid; } virtual ScriptObject *instantiate(); virtual void destroy(ScriptObject *o); virtual void *encapsulate(ScriptObject *o); virtual void deencapsulate(void *o); // public cause it's called by the xui object. static scriptVar DropDownList_onSelect(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar id, scriptVar hover); private: static function_descriptor_struct exportedFunction[]; static scriptVar DropDownList_getItemSelected(SCRIPT_FUNCTION_PARAMS, ScriptObject *o); static /*void*/ scriptVar DropDownList_setListHeight(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, /*int*/ scriptVar h); static /*void*/ scriptVar DropDownList_openList(SCRIPT_FUNCTION_PARAMS, ScriptObject *o); static /*void*/ scriptVar DropDownList_closeList(SCRIPT_FUNCTION_PARAMS, ScriptObject *o); static /*void*/ scriptVar DropDownList_setItems(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, /*String*/ scriptVar lotsofitems); static /*int*/ scriptVar DropDownList_addItem(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, /*String*/ scriptVar text); static /*void*/ scriptVar DropDownList_delItem(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, /*int*/ scriptVar id); static /*int*/ scriptVar DropDownList_findItem(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, /*String*/ scriptVar text); static /*int*/ scriptVar DropDownList_getNumItems(SCRIPT_FUNCTION_PARAMS, ScriptObject *o); static /*void*/ scriptVar DropDownList_selectItem(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, /*int*/ scriptVar id, /*int*/ scriptVar hover); static /*String*/ scriptVar DropDownList_getItemText(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, /*int*/ scriptVar id); static /*int*/ scriptVar DropDownList_getSelected(SCRIPT_FUNCTION_PARAMS, ScriptObject *o); static /*String*/ scriptVar DropDownList_getSelectedText(SCRIPT_FUNCTION_PARAMS, ScriptObject *o); static /*String*/ scriptVar DropDownList_getCustomText(SCRIPT_FUNCTION_PARAMS, ScriptObject *o); static /*void*/ scriptVar DropDownList_deleteAllItems(SCRIPT_FUNCTION_PARAMS, ScriptObject *o); static /*void*/ scriptVar DropDownList_setNoItemText(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, /*String*/ scriptVar txt); }; extern COMEXP DropDownListScriptController *dropDownListController; #endif