diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Wasabi/api/wnd/popup.h | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Wasabi/api/wnd/popup.h')
-rw-r--r-- | Src/Wasabi/api/wnd/popup.h | 341 |
1 files changed, 341 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wnd/popup.h b/Src/Wasabi/api/wnd/popup.h new file mode 100644 index 00000000..9ee6d7f9 --- /dev/null +++ b/Src/Wasabi/api/wnd/popup.h @@ -0,0 +1,341 @@ +// PopupMenu NONPORTABLE, NewPopupMenu portable +#ifndef _POPUP_H +#define _POPUP_H + +#include <wasabicfg.h> +#include <bfc/string/StringW.h> +#include <bfc/PtrList.h> +#include <api/locales/xlatstr.h> +//#define WANT_NEW_POPUPMENU + +class PopupMenu; + +class PopupMenuCallback +{ +public: + virtual PopupMenu *popupMenuCallback(PopupMenu *parent, intptr_t param) = 0; // returns the new popupmenu to be displayed +}; + +enum { POPUP_ANCHOR_UL, POPUP_ANCHOR_LL, POPUP_ANCHOR_UR, POPUP_ANCHOR_LR }; + +#ifndef WASABI_WANT_FF_POPUP + +class PopupMenuEntry +{ +public: + PopupMenuEntry(const wchar_t *txt, int cmd, PopupMenu *_submenu, int _checked, int _disabled, PopupMenuCallback *cb = NULL, int cbparam = 0) : text(_(txt)), command(cmd), submenu(_submenu), checked(_checked), disabled(_disabled), callback(cb), callbackparam(cbparam) {} // txt = null for separators and menus, cmd = -1 for separators and submenus, if submenu == null && cmd == -1 and text == NULL then it's a separator + virtual ~PopupMenuEntry() {} + int getCommand() { return command; } + const wchar_t *getText() { return text; } + PopupMenu *getSubmenu() { return submenu; } + int getChecked() { return checked; } + int getDisabled() { return disabled; } + int isSeparator() { return command == -1 && submenu == NULL && text == NULL; } + int isSubmenu() { return (command == -1 && submenu != NULL) || callback; } + void setChecked(int check) { checked = check; } + void setDisabled(int disable) { disabled = disable; } + PopupMenuCallback *getCallback() { return callback; } + int getCallbackParam() { return callbackparam; } +private: + StringW text; + int command; + PopupMenu *submenu; + int checked; + int disabled; + PopupMenuCallback *callback; + int callbackparam; +}; + +class SortMenuEntries +{ +public: + static int compareItem(PopupMenuEntry *p1, PopupMenuEntry *p2) + { + if (p1->getCommand() < p2->getCommand()) return -1; + if (p1->getCommand() > p2->getCommand()) return 1; + return 0; + } + static int compareAttrib(const wchar_t *attrib, PopupMenuEntry *item) + { + int c = *(int *)attrib; + if (c < item->getCommand()) return -1; + if (c > item->getCommand()) return 1; + return 0; + } +}; + + +class PopupMenu +{ +public: + PopupMenu(); + PopupMenu(ifc_window *parent); + PopupMenu(PopupMenu *parent); + ~PopupMenu(); + + virtual void addSubMenu(PopupMenu *menu, const wchar_t *text, int disabled = FALSE); + virtual void addSubMenuCallback(const wchar_t *text, PopupMenuCallback *cb, int param); + virtual void addCommand(const wchar_t *text, int command, int checked = 0, int disabled = 0, int addpos = -1); + virtual void addSeparator(int addpos = -1); + virtual void checkCommand(int cmd, int check); + virtual void disableCommand(int cmd, int disable); + virtual int popAtXY(int x, int y, int native = 0); + virtual int popAnchored(int type = POPUP_ANCHOR_LL); // dropped off the sourceWnd given above + virtual int popAtMouse(); + virtual int getNumCommands(); + virtual const wchar_t *getCommandText(int command); + OSMENUHANDLE getOSMenuHandle(); + virtual void abort(); + +private: + void rebuildMenu(); + void invalidateMenu(); // no virtual please (it's called in the destructor) + ifc_window *getParent() { return parent; } + + PtrList<PopupMenuEntry> entries; + PtrListQuickSorted<PopupMenuEntry, SortMenuEntries> sortedentries; + OSMENUHANDLE hmenu; + ifc_window *parent; +}; + +#else // WASABI_WANT_FF_POPUP + +#include "../bfc/basewnd.h" +#include "../bfc/ptrlist.h" +#include <tataki/bitmap/autobitmap.h> +#include "../studio/skincb.h" + +#define POPUP_TIMERID 1171 + +class PopupMenu; +class ButtonWnd; +class MenuButtonSurface; + +class _PopupMenu +{ +public: + virtual ~_PopupMenu() {} + + virtual void addSubMenu(PopupMenu *menu, const wchar_t *text, int disabled = FALSE) = 0; + virtual void addSubMenuImage(PopupMenu *menu, const wchar_t *bitmap, const wchar_t *pushedbitmap = 0, const wchar_t *highlightbitmap = 0) = 0; + virtual void addSubMenuCallback(const wchar_t *text, PopupMenuCallback *cb, int param) = 0; + + virtual void addCommand(const char *text, int command, int checked = 0, int disabled = 0, int addpos = -1) = 0; + virtual void addCommandImage(const wchar_t *bitmap, const wchar_t *pushedbitmap, const wchar_t *highlightbitmap, int command, int checked, int disabled, int addpos = -1) = 0; + virtual void addSeparator(int addpos = -1) = 0; + + virtual void checkCommand(int cmd, int check) = 0; + virtual void disableCommand(int cmd, int disable) = 0; + + virtual int popAtXY(int x, int y) = 0; + virtual int popAnchored(int type = POPUP_ANCHOR_LL) = 0; // dropped off the sourceWnd given above + virtual int popAtMouse() = 0; + virtual void showAtXY(int x, int y, int *rc, int revside = 0, int parentW = 0) = 0; + virtual int getNumCommands() = 0; + virtual const wchar_t *getCommandText(int command) = 0; + virtual void onPostPop(intptr_t result) = 0; + virtual void selectFirst() = 0; +}; + +#ifndef WANT_NEW_POPUPMENU + +#define POPUPMENU_PARENT BaseWnd + +class PopupMenu : public _PopupMenu, public POPUPMENU_PARENT, public SkinCallbackI +{ +public: + PopupMenu(ifc_window *sourceWnd); + PopupMenu(HWND sourceWnd); + PopupMenu(PopupMenu *sourceWnd); + PopupMenu(); + virtual ~PopupMenu(); + + void addSubMenu(PopupMenu *menu, const wchar_t *text, int disabled = FALSE); + void addSubMenuImage(PopupMenu *menu, const wchar_t *bitmap, const wchar_t *pushedbitmap = 0, const wchar_t *highlightbitmap = 0); + void addSubMenuCallback(const wchar_t *text, PopupMenuCallback *cb, int param); + + void addCommand(const wchar_t *text, int command, int checked = 0, int disabled = 0, int addpos = -1); + void addCommandImage(const wchar_t *bitmap, const wchar_t *pushedbitmap, const wchar_t *highlightbitmap, int command, int checked, int disabled, int addpos = -1); + void addSeparator(int addpos = -1); + + void checkCommand(int cmd, int check); + void disableCommand(int cmd, int disable); + + int popAtXY(int x, int y); + int popAnchored(int type = POPUP_ANCHOR_LL); // dropped off the sourceWnd given above + int popAtMouse(); + int getNumCommands(); + + virtual int bypassModal() { return 1; } + + const wchar_t *getCommandText(int command); + + virtual int onPaint(Canvas *canvas); + + virtual int childNotify(ifc_window *child, int msg, intptr_t param1 = 0, intptr_t param2 = 0); + + virtual int onLeftButtonDown(int x, int y); + virtual int onRightButtonDown(int x, int y); + virtual int onMouseMove(int x, int y); // only called when mouse captured + virtual int onLeftButtonUp(int x, int y); + virtual int onRightButtonUp(int x, int y); + virtual void timerCallback(int id); + + virtual int onKillFocus(); + + virtual int skincb_onCheckPreventSwitch(const char *skinname); + + virtual int onKeyDown(int code); + + virtual void navigate(int p, int f = 0); // 1 = next, -1 = previous, 0 = self (open submenu or run action) + + virtual void onSetVisible(int p); + virtual void selectFirst(); + virtual int onSysKeyDown(int code, int d); + + virtual void abort(); + + virtual void setFriendlyId(const wchar_t *id); + virtual MenuButtonSurface *getNextFriend() { return chainmenu; } + +protected: + virtual int onInit(); + + void invalidateItem(int i); + String translateButtonText(const wchar_t *text); + + virtual void onPostPop(intptr_t result) {} + + // used internally, as well as by parent Popups. + void showAtXY(int x, int y, int *rc, int revside = 0, int parentW = 0); + void hide(); + int isMine(int x, int y); +private: + int getWhichItem(POINT &p); + void onButtonUp(int wb, int x, int y); + void onButtonDown(int wb, int x, int y); + void resetTimer(int p); + void initMenuCallback(int item); + + int bdown; + int lastitem; + int rcode; + int *rcp; + typedef struct + { + int cmd; + ButtonWnd *butt; + PopupMenu *menu; + PopupMenuCallback *cb; + int issep; + int cbparam; + } + ItemT; + PtrList<ItemT> items; + ifc_window *parentRootWnd; + HWND parentWnd; + AutoSkinBitmap tex, ful, fur, fll, flr, fl, fr, ft, fb, sr, sl, sc; + int openmenuid; + int timerset; + int timeritem; + int popupdelay; + int reverse_side; + ifc_window *init_with; + int disable_autopop; + int kbdhooked; + int toplevelmenu; + POINT lastxy; + int keyctrl; + String friendid; + MenuButtonSurface *chainmenu; + +#ifdef WASABI_COMPILE_SKIN + String switchskinto; +#endif +}; + +#else + +#include "guiobjwnd.h" +#include "script/c_script/c_grouplist.h" +#include "../bfc/popexitcb.h" +#include "../bfc/notifmsg.h" + +#define POPUPMENU_PARENT GuiObjectWnd + +enum { + POPUPITEM_TYPE_TEXT = 0, + POPUPITEM_TYPE_IMAGE, + POPUPITEM_TYPE_SEPARATOR, +}; + +typedef struct +{ + int type; + int cmd; + PopupMenu *menu; + PopupMenuCallback *cb; + String txt; + int checked; + int disabled; + int cbparam; +} +ItemT; + +class PopupMenu : public _PopupMenu, public POPUPMENU_PARENT, public PopupExitCallbackI +{ +public: + PopupMenu(ifc_window *sourceWnd); + // PopupMenu(HWND sourceWnd); + PopupMenu(PopupMenu *sourceWnd); + PopupMenu(); + virtual ~PopupMenu(); + + virtual void addSubMenu(PopupMenu *menu, const wchar_t *text, int disabled = FALSE); + virtual void addSubMenuImage(PopupMenu *menu, const wchar_t *bitmap, const wchar_t *pushedbitmap = 0, const wchar_t *highlightbitmap = 0) {} + virtual void addSubMenuCallback(const wchar_t *text, PopupMenuCallback *cb, int param); + + virtual void addCommand(const wchar_t *text, int command, int checked = 0, int disabled = 0, int addpos = -1); + virtual void addCommandImage(const wchar_t *bitmap, const wchar_t *pushedbitmap, const wchar_t *highlightbitmap, int command, int checked, int disabled, int addpos = -1) {} + virtual void addSeparator(int addpos = -1) {} + + virtual void checkCommand(int cmd, int check) {} + virtual void disableCommand(int cmd, int disable) {} + + virtual int popAtXY(int x, int y); + virtual int popAnchored(int type = POPUP_ANCHOR_LL); + virtual int popAtMouse(); + virtual void showAtXY(int x, int y, int *rc, int revside = 0, int parentW = 0); + virtual int getNumCommands() { return 0;} + virtual const wchar_t *getCommandText(int command) { return NULL; } + virtual void onPostPop(intptr_t result) {} + + virtual int onInit(); + + virtual void onNewContent(); + + virtual int popupexitcb_onExitPopup(); + virtual ifc_dependent *popupexit_getDependencyPtr() { return getDependencyPtr(); } + +private: + + virtual int bypassModal() { return 1; } + String translateButtonText(const wchar_t *text); + void fillContent(); + void addItem(ItemT *item); + void initMenuCallback(int item); + + void myInit(); + int reverse_side; + int rcode; + + PtrList<ItemT> items; + int menuchecks; + int submenus; + C_GroupList *c_grouplist; + int totalheight, totalwidth; +}; + +#endif +#endif // WASABI_WANT_FF_POPUP +#endif
\ No newline at end of file |