From 6b3ded37e4a4825be2df3612bdcbb7dfc00a1800 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 4 Mar 2014 20:41:13 +0000 Subject: HistoryStats sources git-svn-id: http://svn.miranda-ng.org/main/trunk@8397 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/!NotAdopted/HistoryStats/optionsctrlimpl.h | 447 +++++++++++++++++++++ 1 file changed, 447 insertions(+) create mode 100644 plugins/!NotAdopted/HistoryStats/optionsctrlimpl.h (limited to 'plugins/!NotAdopted/HistoryStats/optionsctrlimpl.h') diff --git a/plugins/!NotAdopted/HistoryStats/optionsctrlimpl.h b/plugins/!NotAdopted/HistoryStats/optionsctrlimpl.h new file mode 100644 index 0000000000..43313ac195 --- /dev/null +++ b/plugins/!NotAdopted/HistoryStats/optionsctrlimpl.h @@ -0,0 +1,447 @@ +#if !defined(HISTORYSTATS_GUARD_OPTIONSCTRLIMPL_H) +#define HISTORYSTATS_GUARD_OPTIONSCTRLIMPL_H + +#include "_globals.h" +#include "optionsctrldefs.h" + +#include + +#include "utils.h" + +/* + * OptionsCtrlImpl + */ + +class OptionsCtrlImpl + : public OptionsCtrlDefs + , private pattern::NotCopyable +{ +private: + enum ItemType { + itGroup, + itCheck, + itRadio, + itEdit, + itCombo, + itButton, + itDateTime, + itColor, + }; + + enum StateIcon { + // C = checked + // U = unchecked + // G = greyed + siCheckU = 0, + siCheckC = 1, + siCheckUG = 2, + siCheckCG = 3, + siRadioU = 4, + siRadioC = 5, + siRadioUG = 6, + siRadioCG = 7, + siEdit = 8, + siEditG = 9, + siCombo = 10, + siComboG = 11, + siFolder = 12, + siFolderG = 13, + siButton = 14, + siButtonG = 15, + siDateTime = 16, + siDateTimeG = 17, + siColor = 0, + siColorG = 2, + }; + + enum ChildControl { + ccTree = 100, + ccEdit = 101, + ccCombo = 102, + ccButton = 103, + ccDateTime = 104, + ccColor = 105, + }; + + class Item + { + public: + OptionsCtrlImpl* m_pCtrl; + HTREEITEM m_hItem; + int m_nRef; + ItemType m_ItemType; + bool m_bEnabled; + bool m_bDisableChilds; + ext::string m_strLabel; + DWORD m_dwData; + + protected: + explicit Item(OptionsCtrlImpl* pCtrl, ItemType ItemType, const mu_text* szLabel, DWORD dwFlags, DWORD dwData); + + void enableChilds(bool bEnable); + + public: + virtual ~Item() { } + + virtual void onToggle() { } + virtual void onSelect() { } + virtual void onDeselect() { } + virtual void onActivate() { } + + virtual void setEnabled(bool bEnable) = 0; + virtual void childAdded(Item* pChild) = 0; + + virtual void setLabel(const mu_text* szLabel); + virtual const mu_text* getLabel() { return m_strLabel.c_str(); } + }; + + class Group + : public Item + { + public: + bool m_bDrawLine; + + public: + explicit Group(OptionsCtrlImpl* pCtrl, Item* pParent, const mu_text* szLabel, DWORD dwFlags, DWORD dwData); + + virtual void setEnabled(bool bEnable); + virtual void childAdded(Item* pChild); + + }; + + class Check + : public Item + { + public: + bool m_bChecked; + bool m_bDisableChildsOnUncheck; + + private: + int getStateImage(); + bool getChildEnable(); + void updateItem(); + + public: + explicit Check(OptionsCtrlImpl* pCtrl, Item* pParent, const mu_text* szLabel, DWORD dwFlags, DWORD dwData); + + virtual void onToggle(); + + virtual void setEnabled(bool bEnable) { m_bEnabled = bEnable; updateItem(); } + virtual void childAdded(Item* pChild); + + bool isChecked() { return m_bChecked; } + void setChecked(bool bCheck) { m_bChecked = bCheck; updateItem(); } + }; + + class Radio; // forward declaration for RadioSiblings + + class RadioSiblings + { + friend class Radio; // for join()/leave() + + public: + std::vector m_Radios; + int m_nRadios; + int m_nChecked; + + private: + int join(Radio* pRadio); + bool leave(int nRadio); + + public: + explicit RadioSiblings() : m_nRadios(0), m_nChecked(-1) { } + + int getChecked() { return m_nChecked; } + bool isChecked(int nRadio) { return (m_nChecked == nRadio); } + void setChecked(int nRadio); + }; + + class Radio + : public Item + { + friend class RadioSiblings; // for updateItem() + + public: + bool m_bDisableChildsOnUncheck; + int m_nIndex; + RadioSiblings* m_pSiblings; + + private: + bool getChildEnable(bool bChecked); + void updateItem(); + + public: + explicit Radio(OptionsCtrlImpl* pCtrl, Item* pParent, Radio* pSibling, const mu_text* szLabel, DWORD dwFlags, DWORD dwData); + virtual ~Radio(); + + virtual void onToggle(); + + virtual void setEnabled(bool bEnable) { m_bEnabled = bEnable; updateItem(); } + virtual void childAdded(Item* pChild); + + bool isChecked() { return m_pSiblings->isChecked(m_nIndex); } + void setChecked() { m_pSiblings->setChecked(m_nIndex); } + }; + + class Edit + : public Item + { + public: + bool m_bNumber; + ext::string m_strEdit; + HWND m_hEditWnd; + + private: + ext::string getEditText(); + ext::string getCombinedText(); + + public: + explicit Edit(OptionsCtrlImpl* pCtrl, Item* pParent, const mu_text* szLabel, const mu_text* szEdit, DWORD dwFlags, DWORD dwData); + + virtual void onToggle() { onActivate(); } + virtual void onSelect(); + virtual void onDeselect(); + virtual void onActivate(); + + virtual void setEnabled(bool bEnable); + virtual void childAdded(Item* pChild); + + virtual void setLabel(const mu_text* szLabel); + + const mu_text* getString(); + void setString(const mu_text* szString); + int getNumber() { return _ttoi(getString()); } + void setNumber(int nNumber) { setString(utils::intToString(nNumber).c_str()); } + }; + + class Combo + : public Item + { + public: + bool m_bDisableChildsOnIndex0; + int m_nSelected; + std::vector m_Items; + HWND m_hComboWnd; + + private: + void enableChildsCombo(); + bool getChildEnable(); + int getComboSel(); + ext::string getCombinedText(); + + public: + explicit Combo(OptionsCtrlImpl* pCtrl, Item* pParent, const mu_text* szLabel, DWORD dwFlags, DWORD dwData); + + virtual void onToggle() { onActivate(); } + virtual void onSelect(); + virtual void onDeselect(); + virtual void onActivate(); + + virtual void setEnabled(bool bEnable); + virtual void childAdded(Item* pChild); + + virtual void setLabel(const mu_text* szLabel); + + void addItem(const mu_text* szItem); + int getSelected(); + void setSelected(int nSelect); + void onSelChanged(); + }; + + class Button + : public Item + { + public: + ext::string m_strButton; + HWND m_hButtonWnd; + + public: + explicit Button(OptionsCtrlImpl* pCtrl, Item* pParent, const mu_text* szLabel, const mu_text* szButton, DWORD dwFlags, DWORD dwData); + + virtual void onToggle() { onActivate(); } + virtual void onSelect(); + virtual void onDeselect(); + virtual void onActivate(); + + virtual void setEnabled(bool bEnable); + virtual void childAdded(Item* pChild); + + virtual void setLabel(const mu_text* szLabel); + }; + + class DateTime + : public Item + { + public: + static ext::string getDTFormatString(const ext::string& strFormat); + static SYSTEMTIME toSystemTime(DWORD dwTimestamp); + static DWORD fromSystemTime(const SYSTEMTIME& st); + + public: + bool m_bDisableChildsOnNone; + bool m_bAllowNone; + ext::string m_strFormat; + ext::string m_strFormatDT; + bool m_bNone; + DWORD m_dwTimestamp; + HWND m_hDateTimeWnd; + + private: + void enableChildsDateTime(); + bool getChildEnable(); + DWORD getTimestampValue(); + bool getTimestampNone(); + ext::string getCombinedText(); + + public: + explicit DateTime(OptionsCtrlImpl* pCtrl, Item* pParent, const mu_text* szLabel, const mu_text* szFormat, DWORD dwTimestamp, DWORD dwFlags, DWORD dwData); + + virtual void onToggle() { onActivate(); } + virtual void onSelect(); + virtual void onDeselect(); + virtual void onActivate(); + + virtual void setEnabled(bool bEnable); + virtual void childAdded(Item* pChild); + + virtual void setLabel(const mu_text* szLabel); + + bool isNone(); + void setNone(); + DWORD getTimestamp(); + void setTimestamp(DWORD dwTimestamp); + void onDateTimeChange(); + bool isMonthCalVisible(); + }; + + class Color + : public Item + { + public: + COLORREF m_crColor; + HWND m_hColorWnd; + + private: + COLORREF getColorValue(); + + public: + explicit Color(OptionsCtrlImpl* pCtrl, Item* pParent, const mu_text* szLabel, COLORREF crColor, DWORD dwFlags, DWORD dwData); + + virtual void onToggle() { onActivate(); } + virtual void onSelect(); + virtual void onDeselect(); + virtual void onActivate(); + + virtual void setEnabled(bool bEnable); + virtual void childAdded(Item* pChild); + + virtual void setLabel(const mu_text* szLabel); + + COLORREF getColor(); + void setColor(COLORREF crColor); + void onColorChange(); + }; + +private: + static const mu_text* m_ClassName; + static HIMAGELIST m_hStateIcons; + static int m_nStateIconsRef; + +private: + static LRESULT CALLBACK staticWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + static LRESULT CALLBACK staticTreeProc(HWND hTree, UINT msg, WPARAM wParam, LPARAM lParam); + static void staticInitStateImages(); + static void staticFreeStateImages(); + static void staticUpdateStateImages(LPARAM lParam); + +public: + static bool registerClass(); + static void unregisterClass(); + +private: + HWND m_hWnd; + int m_nOwnId; + HWND m_hTree; + WNDPROC m_pfnOldTreeProc; + bool m_bModified; + HTREEITEM m_hDragItem; + +private: + explicit OptionsCtrlImpl(HWND hWnd, int nOwnId); + explicit OptionsCtrlImpl(const OptionsCtrlImpl& other); // no implementation + const OptionsCtrlImpl& operator =(const OptionsCtrlImpl& other); // no implementation + ~OptionsCtrlImpl(); + +private: + LRESULT onWMCreate(CREATESTRUCT* pCS); + void onWMDestroy(); + void onNMClick(); + LRESULT onNMCustomDraw(NMTVCUSTOMDRAW* pNMCustomDraw); + void onNMKillFocus(); + LRESULT onTVNItemExpanding(NMTREEVIEW* pNMTreeView); + void onTVNDeleteItem(NMTREEVIEW* pNMTreeView); + void onTVNSelChanging(NMTREEVIEW* pNMTreeView); + void onTVNSelChanged(NMTREEVIEW* pNMTreeView); + void onTVNBeginDrag(NMTREEVIEW* pNMTreeView); + void onWMMouseMove(const POINT& pt); + void onWMLButtonUp(const POINT& pt); + void onENChange(); + void onCBNSelChange(); + void onBNClicked(); + void onDTNDateTimeChange(); + void onCPNColorChanged(); + void onTreeWMLButtonDown(UINT nFlags, POINTS point); + void onTreeWMChar(UINT nChar, UINT nRepCnt, UINT nFlags); + void onTreeWMKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); + void onTreeXScroll(); + HTREEITEM onOCMInsertGroup(HTREEITEM hParent, OCGROUP* pGroup); + HTREEITEM onOCMInsertCheck(HTREEITEM hParent, OCCHECK* pCheck); + HTREEITEM onOCMInsertRadio(HTREEITEM hParent, OCRADIO* pRadio); + HTREEITEM onOCMInsertEdit(HTREEITEM hParent, OCEDIT* pEdit); + HTREEITEM onOCMInsertCombo(HTREEITEM hParent, OCCOMBO* pCombo); + HTREEITEM onOCMInsertButton(HTREEITEM hParent, OCBUTTON* pButton); + HTREEITEM onOCMInsertDateTime(HTREEITEM hParent, OCDATETIME* pDateTime); + HTREEITEM onOCMInsertColor(HTREEITEM hParent, OCCOLOR* pColor); + const mu_text* onOCMGetItemLabel(HTREEITEM hItem); + void onOCMSetItemLabel(HTREEITEM hItem, const mu_text* szLabel); + bool onOCMIsItemEnabled(HTREEITEM hItem); + void onOCMEnableItem(HTREEITEM hItem, bool bEnable); + DWORD onOCMGetItemData(HTREEITEM hItem); + void onOCMSetItemData(HTREEITEM hItem, DWORD dwData); + bool onOCMIsItemChecked(HTREEITEM hItem); + void onOCMCheckItem(HTREEITEM hItem, bool bCheck); + int onOCMGetRadioChecked(HTREEITEM hRadio); + void onOCMSetRadioChecked(HTREEITEM hRadio, int nCheck); + int onOCMGetEditNumber(HTREEITEM hEdit); + void onOCMSetEditNumber(HTREEITEM hEdit, int nNumber); + const mu_text* onOCMGetEditString(HTREEITEM hEdit); + void onOCMSetEditString(HTREEITEM hEdit, const mu_text *szString); + void onOCMAddComboItem(HTREEITEM hCombo, const mu_text* szItem); + int onOCMGetComboSelected(HTREEITEM hCombo); + void onOCMSetComboSelected(HTREEITEM hCombo, int nSelect); + void onOCMEnsureVisible(HTREEITEM hItem); + void onOCMDeleteAllItems(); + HTREEITEM onOCMGetSelection(); + void onOCMSelectItem(HTREEITEM hItem); + HTREEITEM onOCMGetItem(HTREEITEM hItem, DWORD dwFlag); + void onOCMDeleteItem(HTREEITEM hItem); + void onOCMMoveItem(HTREEITEM& hItem, HTREEITEM hInsertAfter); + bool onOCMIsDateTimeNone(HTREEITEM hDateTime); + void onOCMSetDateTimeNone(HTREEITEM hDateTime); + DWORD onOCMGetDateTime(HTREEITEM hDateTime, BOOL* pbNone); + void onOCMSetDateTime(HTREEITEM hDateTime, DWORD dwTimestamp); + COLORREF onOCMGetItemColor(HTREEITEM hColor); + void onOCMSetItemColor(HTREEITEM hColor, COLORREF crColor); + +private: + void insertItem(Item* pParent, Item* pItem, const mu_text* szNodeText, DWORD dwFlags, int iImage); + void setModified(Item* pItem, bool bModified = true); + bool isItemValid(HTREEITEM hItem); + Item* getItem(HTREEITEM hItem); + void setItem(HTREEITEM hItem, Item* pItem); + void setStateImage(HTREEITEM hItem, int iImage); + void setNodeText(HTREEITEM hItem, const mu_text* szNodeText); + bool getItemFreeRect(HTREEITEM hItem, RECT& outRect); +}; + +#endif // HISTORYSTATS_GUARD_OPTIONSCTRLIMPL_H \ No newline at end of file -- cgit v1.2.3