diff options
author | George Hazan <ghazan@miranda.im> | 2016-12-01 19:33:16 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2016-12-01 19:33:35 +0300 |
commit | 06fc3d811d71a44b92d45e1263e5fb0099a7304e (patch) | |
tree | cbcdafbcddacab601a6d47321ec09aac5d5e5c0c /plugins/TabSRMM/src/buttonsbar.cpp | |
parent | bd408d296ccfa16dba379f3820a2007ff6963a6a (diff) |
toolbar icons processing code moved to mir_app
Diffstat (limited to 'plugins/TabSRMM/src/buttonsbar.cpp')
-rw-r--r-- | plugins/TabSRMM/src/buttonsbar.cpp | 918 |
1 files changed, 62 insertions, 856 deletions
diff --git a/plugins/TabSRMM/src/buttonsbar.cpp b/plugins/TabSRMM/src/buttonsbar.cpp index 969977083e..c44e2cba44 100644 --- a/plugins/TabSRMM/src/buttonsbar.cpp +++ b/plugins/TabSRMM/src/buttonsbar.cpp @@ -1,786 +1,27 @@ #include "stdafx.h" -#define BBSF_IMBUTTON (1<<0) -#define BBSF_CHATBUTTON (1<<1) -#define BBSF_CANBEHIDDEN (1<<2) -#define BBSF_NTBSWAPED (1<<3) -#define BBSF_NTBDESTRUCT (1<<4) - -struct CustomButtonData : public MZeroedObject -{ - ~CustomButtonData() - {} - - void Accustom(HWND hwnd, TWindowData *dat); - - DWORD m_dwPosition; // default order pos of button, counted from window edge (left or right) - - DWORD m_dwButtonOrigID; // id of button used while button creation and to store button info in DB - ptrA m_pszModuleName; // module name without spaces and underline symbols (e.g. "tabsrmm") - - DWORD m_dwButtonCID; - DWORD m_dwArrowCID; // only use with BBBF_ISARROWBUTTON flag - - ptrW m_pwszTooltip; // button's tooltip - - int m_iButtonWidth; // must be 22 for regular button and 33 for button with arrow - HANDLE m_hIcon; // Handle to icolib registred icon - - bool m_bIMButton, m_bChatButton; - bool m_bCanBeHidden, m_bHidden, m_bAutoHidden, m_bSeparator, m_bDisabled, m_bPushButton; - bool m_bRSided; - BYTE m_opFlags; -}; - HANDLE hHookButtonPressedEvt; -HANDLE hHookToolBarLoadedEvt; - -static int SortButtons(const CustomButtonData *p1, const CustomButtonData *p2) -{ - if (p1->m_bRSided != p2->m_bRSided) - return (p2->m_bRSided) ? -1 : 1; - return p1->m_dwPosition - p2->m_dwPosition; -} - -static LIST<CustomButtonData> arButtonsList(1, SortButtons); - -DWORD LastCID = 4000; -DWORD dwSepCount = 0; - -static mir_cs csToolBar; - -static void wipeList(LIST<CustomButtonData> &list) -{ - for (int i = list.getCount() - 1; i >= 0; i--) { - delete list[i]; - list.remove(i); - } -} - -static int sstSortButtons(const void *p1, const void *p2) -{ - CustomButtonData *pb1 = *(CustomButtonData**)p1, *pb2 = *(CustomButtonData**)p2; - if (pb1->m_bRSided != pb2->m_bRSided) - return (pb2->m_bRSided) ? -1 : 1; - return pb1->m_dwPosition - pb2->m_dwPosition; -} - -static void CB_GetButtonSettings(MCONTACT hContact, CustomButtonData *cbd) -{ - DBVARIANT dbv = { 0 }; - char SettingName[1024]; - char* token = NULL; - - // modulename_buttonID, position_inIM_inCHAT_isLSide_isRSide_CanBeHidden - - mir_snprintf(SettingName, "%s_%d", cbd->m_pszModuleName, cbd->m_dwButtonOrigID); - - if (!db_get_s(hContact, "TabSRMM_Toolbar", SettingName, &dbv)) { - token = strtok(dbv.pszVal, "_"); - cbd->m_dwPosition = (DWORD)atoi(token); - token = strtok(NULL, "_"); - cbd->m_bIMButton = atoi(token) != 0; - token = strtok(NULL, "_"); - cbd->m_bChatButton = atoi(token) != 0; - token = strtok(NULL, "_"); - token = strtok(NULL, "_"); - cbd->m_bRSided = atoi(token) != 0; - token = strtok(NULL, "_"); - cbd->m_bCanBeHidden = atoi(token) != 0; - - db_free(&dbv); - } -} - -static void CB_HardReInit() -{ - M.BroadcastMessage(DM_CBDESTROY, 0, 0); - { - mir_cslock lck(csToolBar); - wipeList(arButtonsList); - } - LastCID = 4000; - dwSepCount = 0; - - CB_InitDefaultButtons(); - NotifyEventHooks(hHookToolBarLoadedEvt, 0, 0); -} - -static INT_PTR CB_AddButton(WPARAM, LPARAM lParam) -{ - BBButton *bbdi = (BBButton *)lParam; - if (!bbdi || bbdi->cbSize != sizeof(BBButton)) - return 1; - - CustomButtonData *cbd = new CustomButtonData(); - if (!bbdi->iButtonWidth && (bbdi->bbbFlags & BBBF_ISARROWBUTTON)) - cbd->m_iButtonWidth = DPISCALEX_S(34); - else if (!bbdi->iButtonWidth) - cbd->m_iButtonWidth = DPISCALEX_S(22); - else - cbd->m_iButtonWidth = DPISCALEX_S(bbdi->iButtonWidth); - - cbd->m_pszModuleName = mir_strdup(bbdi->pszModuleName); - cbd->m_pwszTooltip = mir_wstrdup(bbdi->pwszTooltip); - - cbd->m_dwButtonOrigID = bbdi->dwButtonID; - cbd->m_hIcon = bbdi->hIcon; - cbd->m_dwPosition = bbdi->dwDefPos; - cbd->m_dwButtonCID = (bbdi->bbbFlags & BBBF_CREATEBYID) ? bbdi->dwButtonID : LastCID; - // ugly workaround for smileys plugins - cbd->m_dwArrowCID = (bbdi->bbbFlags & BBBF_ISARROWBUTTON) ? (cbd->m_dwButtonCID == IDOK ? IDC_SENDMENU : (cbd->m_dwButtonCID + 1)) : 0; - cbd->m_bHidden = (bbdi->bbbFlags & BBBF_HIDDEN) != 0; - cbd->m_bRSided = (bbdi->bbbFlags & BBBF_ISRSIDEBUTTON) != 0; - cbd->m_bCanBeHidden = (bbdi->bbbFlags & BBBF_CANBEHIDDEN) != 0; - cbd->m_bSeparator = (bbdi->bbbFlags & BBBF_ISDUMMYBUTTON) != 0; - cbd->m_bChatButton = (bbdi->bbbFlags & BBBF_ISCHATBUTTON) != 0; - cbd->m_bIMButton = (bbdi->bbbFlags & BBBF_ISIMBUTTON) != 0; - cbd->m_bDisabled = (bbdi->bbbFlags & BBBF_DISABLED) != 0; - cbd->m_bPushButton = (bbdi->bbbFlags & BBBF_ISPUSHBUTTON) != 0; - - // download database settings - CB_GetButtonSettings(NULL, cbd); - - arButtonsList.insert(cbd); - - if (cbd->m_dwButtonCID != cbd->m_dwButtonOrigID) - LastCID++; - if (cbd->m_dwArrowCID == LastCID) - LastCID++; - - M.BroadcastMessage(DM_BBNEEDUPDATE, 0, 0); - return 0; -} - -static INT_PTR CB_GetButtonState(WPARAM wParam, LPARAM lParam) -{ - if (wParam == 0 || lParam == 0) - return 1; - - DWORD tempCID = 0; - bool realbutton = false; - BBButton *bbdi = (BBButton *)lParam; - bbdi->bbbFlags = 0; - for (int i = 0; i < arButtonsList.getCount(); i++) { - CustomButtonData *cbd = arButtonsList[i]; - if (!mir_strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && (cbd->m_dwButtonOrigID == bbdi->dwButtonID)) { - realbutton = true; - tempCID = cbd->m_dwButtonCID; - } - } - if (!realbutton) - return 1; - - HWND hwndDlg = M.FindWindow(wParam); - if (!hwndDlg) - return 1; - - HWND hwndBtn = GetDlgItem(hwndDlg, tempCID); - bbdi->bbbFlags = (IsDlgButtonChecked(hwndDlg, tempCID) ? BBSF_PUSHED : BBSF_RELEASED) | (IsWindowVisible(hwndBtn) ? 0 : BBSF_HIDDEN) | (IsWindowEnabled(hwndBtn) ? 0 : BBSF_DISABLED); - return 0; -} - -static INT_PTR CB_SetButtonState(WPARAM wParam, LPARAM lParam) -{ - if (wParam == 0 || lParam == 0) - return 1; - - bool realbutton = false; - DWORD tempCID = 0; - BBButton *bbdi = (BBButton *)lParam; - for (int i = 0; i < arButtonsList.getCount(); i++) { - CustomButtonData *cbd = arButtonsList[i]; - if (!mir_strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && (cbd->m_dwButtonOrigID == bbdi->dwButtonID)) { - realbutton = true; - tempCID = cbd->m_dwButtonCID; - } - } - if (!realbutton) - return 1; - - HWND hwndDlg = M.FindWindow(wParam); - if (!hwndDlg) - return 1; - - SetDlgItemTextA(hwndDlg, tempCID, bbdi->pszModuleName); - if (bbdi->hIcon) - SendDlgItemMessage(hwndDlg, tempCID, BM_SETIMAGE, IMAGE_ICON, (LPARAM)IcoLib_GetIconByHandle(bbdi->hIcon)); - if (bbdi->pwszTooltip) - SendDlgItemMessage(hwndDlg, tempCID, BUTTONADDTOOLTIP, (WPARAM)bbdi->pwszTooltip, BATF_UNICODE); - if (bbdi->bbbFlags) { - Utils::showDlgControl(hwndDlg, tempCID, (bbdi->bbbFlags & BBSF_HIDDEN) ? SW_HIDE : SW_SHOW); - Utils::enableDlgControl(hwndDlg, tempCID, !(bbdi->bbbFlags & BBSF_DISABLED)); - CheckDlgButton(hwndDlg, tempCID, (bbdi->bbbFlags & BBSF_PUSHED) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, tempCID, (bbdi->bbbFlags & BBSF_RELEASED) ? BST_UNCHECKED : BST_CHECKED); - } - return 0; -} - -static INT_PTR CB_RemoveButton(WPARAM, LPARAM lParam) -{ - BBButton *bbdi = (BBButton*)lParam; - if (!bbdi) - return 1; - - CustomButtonData *pFound = NULL; - { - mir_cslock lck(csToolBar); - - for (int i = arButtonsList.getCount() - 1; i >= 0; i--) { - CustomButtonData *cbd = arButtonsList[i]; - if (!mir_strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && cbd->m_dwButtonOrigID == bbdi->dwButtonID) { - pFound = cbd; - arButtonsList.remove(i); - } - } - } - - if (pFound) { - M.BroadcastMessage(DM_CBDESTROY, pFound->m_dwButtonCID, pFound->m_bRSided ? BBBF_ISRSIDEBUTTON : ~BBBF_ISRSIDEBUTTON); - delete pFound; - } - return 0; -} - -static INT_PTR CB_ModifyButton(WPARAM, LPARAM lParam) -{ - BBButton *bbdi = (BBButton *)lParam; - if (!bbdi) - return 1; - - bool bFound = false; - CustomButtonData *cbd = NULL; - { - mir_cslock lck(csToolBar); - - for (int i = 0; i < arButtonsList.getCount(); i++) { - cbd = arButtonsList[i]; - if (!mir_strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && (cbd->m_dwButtonOrigID == bbdi->dwButtonID)) { - bFound = true; - break; - } - } - - if (bFound) { - if (bbdi->pwszTooltip) - cbd->m_pwszTooltip = mir_wstrdup(bbdi->pwszTooltip); - if (bbdi->hIcon) - cbd->m_hIcon = bbdi->hIcon; - if (bbdi->bbbFlags) { - cbd->m_bHidden = (bbdi->bbbFlags & BBBF_HIDDEN) != 0; - cbd->m_bRSided = (bbdi->bbbFlags & BBBF_ISRSIDEBUTTON) != 0; - cbd->m_bCanBeHidden = (bbdi->bbbFlags & BBBF_CANBEHIDDEN) != 0; - cbd->m_bChatButton = (bbdi->bbbFlags & BBBF_ISCHATBUTTON) != 0; - cbd->m_bIMButton = (bbdi->bbbFlags & BBBF_ISIMBUTTON) != 0; - cbd->m_bDisabled = (bbdi->bbbFlags & BBBF_DISABLED) != 0; - } - } - } - - if (bFound) - M.BroadcastMessage(DM_BBNEEDUPDATE, 0, (LPARAM)cbd); - return 0; -} - -static void BB_RegisterSeparators() -{ - BBButton bbd = { 0 }; - DWORD i = 0; - bbd.cbSize = sizeof(BBButton); - bbd.pszModuleName = "Tabsrmm_sep"; - for (; dwSepCount > i; i++) { - bbd.bbbFlags = BBBF_ISDUMMYBUTTON | BBBF_ISIMBUTTON; - bbd.dwButtonID = i + 1; - bbd.dwDefPos = 410 + i; - CB_AddButton(0, (LPARAM)&bbd); - } -} - -#define MIDDLE_SEPARATOR L">-------M-------<" - -static int SaveTree(HWND hToolBarTree) -{ - bool RSide = false; - int count = 10; - DWORD loc_sepcout = 0; - wchar_t strbuf[128]; - - TVITEM tvi; - tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_HANDLE; - tvi.hItem = TreeView_GetRoot(hToolBarTree); - tvi.pszText = strbuf; - tvi.cchTextMax = _countof(strbuf); - { - mir_cslock lck(csToolBar); - - while (tvi.hItem != NULL) { - TreeView_GetItem(hToolBarTree, &tvi); - - if (mir_wstrcmp(tvi.pszText, MIDDLE_SEPARATOR) == 0) { - RSide = true; - count = TreeView_GetCount(hToolBarTree) * 10 - count; - tvi.hItem = TreeView_GetNextSibling(hToolBarTree, tvi.hItem); - continue; - } - CustomButtonData *cbd = (CustomButtonData*)tvi.lParam; - if (cbd) { - if (cbd->m_opFlags) { - cbd->m_bIMButton = (cbd->m_opFlags & BBSF_IMBUTTON) != 0; - cbd->m_bChatButton = (cbd->m_opFlags & BBSF_CHATBUTTON) != 0; - cbd->m_bCanBeHidden = (cbd->m_opFlags & BBSF_CANBEHIDDEN) != 0; - } - if (RSide && !cbd->m_bRSided) { - cbd->m_bRSided = true; - cbd->m_opFlags |= BBSF_NTBSWAPED; - } - else if (!RSide && cbd->m_bRSided) { - cbd->m_bRSided = false; - cbd->m_opFlags |= BBSF_NTBSWAPED; - } - if (!TreeView_GetCheckState(hToolBarTree, tvi.hItem)) { - cbd->m_bIMButton = false; - cbd->m_bChatButton = false; - - if (cbd->m_bSeparator && !mir_strcmp(cbd->m_pszModuleName, "Tabsrmm_sep")) - cbd->m_opFlags = BBSF_NTBDESTRUCT; - } - else { - if (!cbd->m_bIMButton && !cbd->m_bChatButton) - cbd->m_bIMButton = true; - if (cbd->m_bSeparator && !mir_strcmp(cbd->m_pszModuleName, "Tabsrmm_sep")) { - cbd->m_bHidden = 0; - cbd->m_opFlags &= ~BBSF_NTBDESTRUCT; - ++loc_sepcout; - } - } - - cbd->m_dwPosition = (DWORD)count; - CB_WriteButtonSettings(NULL, cbd); - - if (!(cbd->m_opFlags & BBSF_NTBDESTRUCT)) - (RSide) ? (count -= 10) : (count += 10); - } - - HTREEITEM hItem = TreeView_GetNextSibling(hToolBarTree, tvi.hItem); - if (cbd->m_opFlags & BBSF_NTBDESTRUCT) - TreeView_DeleteItem(hToolBarTree, tvi.hItem); - tvi.hItem = hItem; - } - - qsort(arButtonsList.getArray(), arButtonsList.getCount(), sizeof(void*), sstSortButtons); - } - db_set_dw(0, "TabSRMM_Toolbar", "SeparatorsCount", loc_sepcout); - dwSepCount = loc_sepcout; - return 1; -} - -HIMAGELIST himgl = NULL; - -static int BuildMenuObjectsTree(HWND hToolBarTree) -{ - HTREEITEM hti; - int iImage = 0; - - TVINSERTSTRUCT tvis; - tvis.hParent = NULL; - tvis.hInsertAfter = TVI_LAST; - tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_IMAGE; - - TreeView_DeleteAllItems(hToolBarTree); - - himgl = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 2, 2); - ImageList_AddIcon(himgl, Skin_LoadIcon(SKINICON_OTHER_SMALLDOT)); - ImageList_Destroy(TreeView_GetImageList(hToolBarTree, TVSIL_NORMAL)); - TreeView_SetImageList(hToolBarTree, himgl, TVSIL_NORMAL); - - if (arButtonsList.getCount() == 0) - return FALSE; - - bool bPrevSide = false; - mir_cslock lck(csToolBar); - - for (int i = 0; i < arButtonsList.getCount(); i++) { - CustomButtonData *cbd = arButtonsList[i]; - - if (bPrevSide != cbd->m_bRSided) { - bPrevSide = true; - - TVINSERTSTRUCT tvis2 = {}; - tvis.hInsertAfter = TVI_LAST; - tvis2.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_IMAGE | TVIF_STATE; - tvis2.item.pszText = MIDDLE_SEPARATOR; - tvis2.item.stateMask = TVIS_BOLD; - tvis2.item.state = TVIS_BOLD; - tvis2.item.iImage = tvis.item.iSelectedImage = -1; - tvis.hInsertAfter = hti = TreeView_InsertItem(hToolBarTree, &tvis2); - TreeView_SetCheckState(hToolBarTree, hti, 1); - } - - tvis.item.lParam = (LPARAM)cbd; - - if (cbd->m_bSeparator) { - tvis.item.pszText = TranslateT("<Separator>"); - tvis.item.iImage = tvis.item.iSelectedImage = 0; - } - else { - tvis.item.pszText = TranslateW(cbd->m_pwszTooltip); - iImage = ImageList_AddIcon(himgl, IcoLib_GetIconByHandle(cbd->m_hIcon)); - tvis.item.iImage = tvis.item.iSelectedImage = iImage; - } - cbd->m_opFlags = 0; - hti = TreeView_InsertItem(hToolBarTree, &tvis); - - TreeView_SetCheckState(hToolBarTree, hti, (cbd->m_bIMButton || cbd->m_bChatButton)); - } - - return 1; -} - -BOOL drag = FALSE, bOptionsInit = TRUE; -HANDLE hDragItem = NULL; -HWND hToolBarTree = NULL; - -INT_PTR CALLBACK DlgProcToolBar(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - HTREEITEM hItem; - - switch (uMsg) { - case WM_INITDIALOG: - hToolBarTree = GetDlgItem(hwndDlg, IDC_TOOLBARTREE); - { - LONG_PTR style = GetWindowLongPtr(hToolBarTree, GWL_STYLE); - style ^= TVS_CHECKBOXES; - SetWindowLongPtr(hToolBarTree, GWL_STYLE, style); - style |= TVS_CHECKBOXES; - style |= TVS_NOHSCROLL; - SetWindowLongPtr(hToolBarTree, GWL_STYLE, style); - } - { - mir_cslock lck(csToolBar); - BuildMenuObjectsTree(hToolBarTree); - } - - Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, false); - - SendDlgItemMessage(hwndDlg, IDC_SPIN1, UDM_SETRANGE, 0, MAKELONG(10, 0)); - SendDlgItemMessage(hwndDlg, IDC_SPIN1, UDM_SETPOS, 0, MAKELONG(PluginConfig.m_iButtonsBarGap, 0)); - TranslateDialogDefault(hwndDlg); - bOptionsInit = FALSE; - break; - - case WM_LBUTTONUP: - if (drag) { - TreeView_SetInsertMark(hToolBarTree, NULL, 0); - drag = 0; - ReleaseCapture(); - - TVHITTESTINFO hti; - hti.pt.x = (short)LOWORD(lParam); - hti.pt.y = (short)HIWORD(lParam); - ClientToScreen(hwndDlg, &hti.pt); - ScreenToClient(hToolBarTree, &hti.pt); - hti.pt.y -= TreeView_GetItemHeight(hToolBarTree) / 2; - TreeView_HitTest(hToolBarTree, &hti); - if (hDragItem == hti.hItem) break; - if (hti.flags & TVHT_ABOVE) - hti.hItem = TVI_FIRST; - - TVITEM tvi; - tvi.mask = TVIF_HANDLE | TVIF_PARAM; - tvi.hItem = (HTREEITEM)hDragItem; - TreeView_GetItem(hToolBarTree, &tvi); - if (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT) || (hti.hItem == TVI_FIRST)) { - TVINSERTSTRUCT tvis; - wchar_t strbuf[128]; - tvis.item.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_STATE; - tvis.item.stateMask = 0xFFFFFFFF; - tvis.item.pszText = strbuf; - tvis.item.cchTextMax = _countof(strbuf); - tvis.item.hItem = (HTREEITEM)hDragItem; - TreeView_GetItem(hToolBarTree, &tvis.item); - TreeView_DeleteItem(hToolBarTree, hDragItem); - tvis.hParent = NULL; - tvis.hInsertAfter = hti.hItem; - TreeView_SelectItem(hToolBarTree, TreeView_InsertItem(hToolBarTree, &tvis)); - SendMessage((GetParent(hwndDlg)), PSM_CHANGED, 0, 0); - } - } - break; - - case WM_MOUSEMOVE: - if (drag) { - TVHITTESTINFO hti; - hti.pt.x = (short)LOWORD(lParam); - hti.pt.y = (short)HIWORD(lParam); - ClientToScreen(hwndDlg, &hti.pt); - ScreenToClient(hToolBarTree, &hti.pt); - TreeView_HitTest(hToolBarTree, &hti); - if (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT)) { - HTREEITEM it = hti.hItem; - hti.pt.y -= TreeView_GetItemHeight(hToolBarTree) / 2; - TreeView_HitTest(hToolBarTree, &hti); - if (!(hti.flags & TVHT_ABOVE)) - TreeView_SetInsertMark(hToolBarTree, hti.hItem, 1); - else - TreeView_SetInsertMark(hToolBarTree, it, 0); - } - else { - if (hti.flags & TVHT_ABOVE) SendMessage(hToolBarTree, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), 0); - if (hti.flags & TVHT_BELOW) SendMessage(hToolBarTree, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); - TreeView_SetInsertMark(hToolBarTree, NULL, 0); - } - } - break; - - case WM_COMMAND: - if (HIWORD(wParam) == BN_CLICKED && GetFocus() == (HWND)lParam && (HWND)lParam != hToolBarTree) - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - if ((HIWORD(wParam) == EN_CHANGE) && ((HWND)lParam == GetFocus())) - if (!bOptionsInit) - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - - switch (LOWORD(wParam)) { - case IDC_BBRESET: - db_delete_module(NULL, "TabSRMM_Toolbar"); - CB_HardReInit(); - BuildMenuObjectsTree(hToolBarTree); - break; - - case IDC_SEPARATOR: - hItem = TreeView_GetSelection(hToolBarTree); - if (!hItem) - hItem = TVI_FIRST; - - CustomButtonData *cbd = new CustomButtonData(); - cbd->m_bSeparator = cbd->m_bHidden = cbd->m_bIMButton = true; - cbd->m_dwButtonOrigID = ++dwSepCount; - cbd->m_pszModuleName = "Tabsrmm_sep"; - cbd->m_iButtonWidth = 22; - cbd->m_opFlags = BBSF_NTBDESTRUCT; - arButtonsList.insert(cbd); - - TVINSERTSTRUCT tvis; - tvis.hParent = NULL; - tvis.hInsertAfter = hItem; - tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; - - tvis.item.pszText = TranslateT("<Separator>"); - tvis.item.iImage = tvis.item.iSelectedImage = -1; - tvis.item.lParam = (LPARAM)cbd; - hItem = TreeView_InsertItem(hToolBarTree, &tvis); - - TreeView_SetCheckState(hToolBarTree, hItem, (cbd->m_bIMButton || cbd->m_bChatButton)); - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->idFrom) { - case 0: - switch (((LPNMHDR)lParam)->code) { - case PSN_RESET: - CB_ReInitCustomButtons(); - dwSepCount = M.GetDword("TabSRMM_Toolbar", "SeparatorsCount", 0); - return 1; - - case PSN_APPLY: - hItem = TreeView_GetSelection(hToolBarTree); - if (hItem) { - TVITEM tvi; - tvi.mask = TVIF_HANDLE | TVIF_PARAM; - tvi.hItem = hItem; - TreeView_GetItem(hToolBarTree, &tvi); - - if (tvi.lParam) { - CustomButtonData *cbd = (CustomButtonData*)tvi.lParam; - if (cbd) { - cbd->m_bIMButton = IsDlgButtonChecked(hwndDlg, IDC_IMCHECK) != 0; - cbd->m_bChatButton = IsDlgButtonChecked(hwndDlg, IDC_CHATCHECK) != 0; - cbd->m_bCanBeHidden = IsDlgButtonChecked(hwndDlg, IDC_CANBEHIDDEN) != 0; - } - } - } - - SaveTree(hToolBarTree); - CB_ReInitCustomButtons(); - PluginConfig.m_iButtonsBarGap = (BYTE)SendDlgItemMessage(hwndDlg, IDC_SPIN1, UDM_GETPOS, 0, 0); - - if (PluginConfig.m_iButtonsBarGap != M.GetByte("ButtonsBarGap", 1)) - M.BroadcastMessageAsync(WM_SIZE, 0, 0); - - db_set_b(0, SRMSGMOD_T, "ButtonsBarGap", PluginConfig.m_iButtonsBarGap); - - BuildMenuObjectsTree((HWND)hToolBarTree); - Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, false); - return 1; - } - break; - - case IDC_TOOLBARTREE: - switch (((LPNMHDR)lParam)->code) { - case TVN_BEGINDRAG: - SetCapture(hwndDlg); - drag = 1; - hDragItem = ((LPNMTREEVIEW)lParam)->itemNew.hItem; - TreeView_SelectItem(hToolBarTree, hDragItem); - break; - - case TVN_SELCHANGING: - hItem = TreeView_GetSelection(hToolBarTree); - if (hItem != NULL) { - wchar_t strbuf[128]; - - TVITEM tvi; - tvi.hItem = hItem; - tvi.pszText = strbuf; - tvi.cchTextMax = _countof(strbuf); - tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_PARAM; - TreeView_GetItem(hToolBarTree, &tvi); - - if (tvi.lParam == 0 || !TreeView_GetCheckState(hToolBarTree, tvi.hItem) || !mir_wstrcmp(tvi.pszText, MIDDLE_SEPARATOR)) - break; - - CustomButtonData *cbd = (CustomButtonData*)tvi.lParam; - if (cbd) { - cbd->m_opFlags = (IsDlgButtonChecked(hwndDlg, IDC_IMCHECK)) ? BBSF_IMBUTTON : 0; - cbd->m_opFlags |= (IsDlgButtonChecked(hwndDlg, IDC_CHATCHECK)) ? BBSF_CHATBUTTON : 0; - cbd->m_opFlags |= (IsDlgButtonChecked(hwndDlg, IDC_CANBEHIDDEN)) ? BBSF_CANBEHIDDEN : 0; - - cbd->m_bIMButton = IsDlgButtonChecked(hwndDlg, IDC_IMCHECK) != 0; - cbd->m_bChatButton = IsDlgButtonChecked(hwndDlg, IDC_CHATCHECK) != 0; - cbd->m_bCanBeHidden = IsDlgButtonChecked(hwndDlg, IDC_CANBEHIDDEN) != 0; - } - } - break; - - case TVN_SELCHANGED: - hItem = TreeView_GetSelection(hToolBarTree); - if (hItem != NULL) { - wchar_t strbuf[128]; - - TVITEM tvi; - tvi.pszText = strbuf; - tvi.cchTextMax = _countof(strbuf); - tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_PARAM; - tvi.hItem = hItem; - TreeView_GetItem(hToolBarTree, &tvi); - - if (!TreeView_GetCheckState(hToolBarTree, tvi.hItem) || !mir_wstrcmp(tvi.pszText, MIDDLE_SEPARATOR)) { - Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, false); - break; - } - - if (tvi.lParam == 0) - break; - - CustomButtonData *cbd = (CustomButtonData*)tvi.lParam; - if (cbd) { - Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, true); - Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, true); - Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, true); - CheckDlgButton(hwndDlg, IDC_IMCHECK, (cbd->m_bIMButton) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHATCHECK, (cbd->m_bChatButton) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CANBEHIDDEN, (cbd->m_bCanBeHidden) ? BST_CHECKED : BST_UNCHECKED); - } - } - break; - - case NM_CLICK: - TVHITTESTINFO hti = { 0 }; - GetCursorPos(&hti.pt); - ScreenToClient(hToolBarTree, &hti.pt); - if (TreeView_HitTest(hToolBarTree, &hti)) { - if (hti.flags&TVHT_ONITEMSTATEICON) { - SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0); - if (TreeView_GetCheckState(hToolBarTree, hti.hItem)) { - Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, false); - CheckDlgButton(hwndDlg, IDC_IMCHECK, BST_CHECKED); - } - else { - Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, true); - Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, true); - Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, true); - } - TreeView_SelectItem(hToolBarTree, hti.hItem); - } - } - } - } - break; - - case WM_DESTROY: - HIMAGELIST hIml = TreeView_GetImageList(GetDlgItem(hwndDlg, IDC_TOOLBARTREE), TVSIL_NORMAL); - ImageList_Destroy(hIml); - hIml = TreeView_GetImageList(GetDlgItem(hwndDlg, IDC_TOOLBARTREE), TVSIL_STATE); - ImageList_Destroy(hIml); - break; - } - - return FALSE; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -void CustomButtonData::Accustom(HWND hwndBtn, TWindowData *dat) -{ - SendMessage(hwndBtn, BUTTONSETASFLATBTN, TRUE, 0); - SendMessage(hwndBtn, BUTTONSETASTHEMEDBTN, CSkin::IsThemed(), 0); - if (m_hIcon) - SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)IcoLib_GetIconByHandle(m_hIcon)); - if (m_pwszTooltip) - SendMessage(hwndBtn, BUTTONADDTOOLTIP, (WPARAM)TranslateW(m_pwszTooltip), BATF_UNICODE); - SendMessage(hwndBtn, BUTTONSETCONTAINER, (LPARAM)dat->pContainer, 0); - SendMessage(hwndBtn, BUTTONSETASTOOLBARBUTTON, TRUE, 0); - - if (hwndBtn) { - if (m_dwArrowCID) SendMessage(hwndBtn, BUTTONSETARROW, m_dwArrowCID, 0); - if (m_bPushButton) SendMessage(hwndBtn, BUTTONSETASPUSHBTN, TRUE, 0); - } -} ///////////////////////////////////////////////////////////////////////////////////////// // Global functions -void CB_WriteButtonSettings(MCONTACT hContact, CustomButtonData *cbd) +static int CB_InitDefaultButtons(WPARAM, LPARAM) { - char SettingName[1024]; - char SettingParameter[1024]; - - //modulename_buttonID, position_inIM_inCHAT_isLSide_isRSide_CanBeHidden - - mir_snprintf(SettingName, "%s_%d", cbd->m_pszModuleName, cbd->m_dwButtonOrigID); - mir_snprintf(SettingParameter, "%d_%u_%u_%u_%u_%u", cbd->m_dwPosition, cbd->m_bIMButton, cbd->m_bChatButton, 0, cbd->m_bRSided, cbd->m_bCanBeHidden); - if (!(cbd->m_opFlags & BBSF_NTBDESTRUCT)) - db_set_s(hContact, "TabSRMM_Toolbar", SettingName, SettingParameter); - else - db_unset(hContact, "TabSRMM_Toolbar", SettingName); -} - -void CB_InitDefaultButtons() -{ - BBButton bbd = { 0 }; - bbd.cbSize = sizeof(BBButton); + BBButton bbd = {}; bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISARROWBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_PROTOCOL; bbd.dwDefPos = 10; bbd.hIcon = Skin_GetIconHandle(SKINICON_OTHER_CONNECTING); bbd.pszModuleName = "Tabsrmm"; bbd.pwszTooltip = LPGENW("Protocol button"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISARROWBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_NAME; bbd.dwDefPos = 20; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[20]; bbd.pwszTooltip = LPGENW("Info button"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); if (PluginConfig.g_SmileyAddAvail) { bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISCHATBUTTON | BBBF_CREATEBYID; @@ -789,7 +30,7 @@ void CB_InitDefaultButtons() bbd.dwDefPos = 30; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[9]; bbd.pwszTooltip = LPGENW("Insert emoticon"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); } bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISCHATBUTTON | BBBF_ISPUSHBUTTON | BBBF_CANBEHIDDEN | BBBF_CREATEBYID; @@ -797,28 +38,28 @@ void CB_InitDefaultButtons() bbd.dwDefPos = 40; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[10]; bbd.pwszTooltip = LPGENW("Bold text"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISCHATBUTTON | BBBF_ISPUSHBUTTON | BBBF_CANBEHIDDEN | BBBF_CREATEBYID; bbd.dwButtonID = IDC_FONTITALIC; bbd.dwDefPos = 50; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[11]; bbd.pwszTooltip = LPGENW("Italic text"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISCHATBUTTON | BBBF_ISPUSHBUTTON | BBBF_CANBEHIDDEN | BBBF_CREATEBYID; bbd.dwButtonID = IDC_FONTUNDERLINE; bbd.dwDefPos = 60; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[12]; bbd.pwszTooltip = LPGENW("Underlined text"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISPUSHBUTTON | BBBF_CANBEHIDDEN | BBBF_CREATEBYID; bbd.dwButtonID = IDC_FONTSTRIKEOUT; bbd.dwDefPos = 70; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[15]; bbd.pwszTooltip = LPGENW("Strike-through text"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISCHATBUTTON | BBBF_ISRSIDEBUTTON | BBBF_ISARROWBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDOK; @@ -826,7 +67,7 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 51; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[6]; bbd.pwszTooltip = LPGENW("Send message\nClick dropdown arrow for sending options"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISCHATBUTTON | BBBF_ISRSIDEBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_SAVE; @@ -834,7 +75,7 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 0; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[8]; bbd.pwszTooltip = LPGENW("Close session"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISRSIDEBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_QUOTE; @@ -842,7 +83,7 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 0; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[4]; bbd.pwszTooltip = LPGENW("Quote last message OR selected text"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISRSIDEBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_TIME; @@ -850,7 +91,7 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 0; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[2]; bbd.pwszTooltip = LPGENW("Message log options"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISCHATBUTTON | BBBF_ISRSIDEBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_HISTORY; @@ -858,7 +99,7 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 0; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[0]; bbd.pwszTooltip = LPGENW("View user's history"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISRSIDEBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_PIC; @@ -866,7 +107,7 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 0; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[7]; bbd.pwszTooltip = LPGENW("Edit user notes"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); // chat buttons bbd.bbbFlags = BBBF_ISCHATBUTTON | BBBF_ISDUMMYBUTTON; @@ -876,17 +117,17 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 22; bbd.hIcon = 0; bbd.pwszTooltip = 0; - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISCHATBUTTON | BBBF_ISDUMMYBUTTON; bbd.dwButtonID = 2; bbd.dwDefPos = 22; - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISCHATBUTTON | BBBF_ISDUMMYBUTTON; bbd.dwButtonID = 3; bbd.dwDefPos = 71; - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISCHATBUTTON | BBBF_ISPUSHBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_COLOR; @@ -894,7 +135,7 @@ void CB_InitDefaultButtons() bbd.dwDefPos = 80; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[14]; bbd.pwszTooltip = LPGENW("Select font color"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISCHATBUTTON | BBBF_ISPUSHBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_BKGCOLOR; @@ -902,7 +143,7 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 22; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[16]; bbd.pwszTooltip = LPGENW("Change background color"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISCHATBUTTON | BBBF_ISRSIDEBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_SHOWNICKLIST; @@ -910,7 +151,7 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 22; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[19]; bbd.pwszTooltip = LPGENW("Toggle nick list"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISCHATBUTTON | BBBF_ISRSIDEBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_FILTER; @@ -918,7 +159,7 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 22; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[18]; bbd.pwszTooltip = LPGENW("Event filter - right click to setup, left click to activate/deactivate"); - CB_AddButton(0, (LPARAM)&bbd); + Srmm_AddButton(&bbd); bbd.bbbFlags = BBBF_ISCHATBUTTON | BBBF_ISRSIDEBUTTON | BBBF_CREATEBYID; bbd.dwButtonID = IDC_CHANMGR; @@ -926,27 +167,9 @@ void CB_InitDefaultButtons() bbd.iButtonWidth = 22; bbd.hIcon = PluginConfig.g_buttonBarIconHandles[17]; bbd.pwszTooltip = LPGENW("Channel manager"); - CB_AddButton(0, (LPARAM)&bbd); - - BB_RegisterSeparators(); -} - -void CB_ReInitCustomButtons() -{ - for (int i = arButtonsList.getCount()-1; i >= 0; i--) { - CustomButtonData *cbd = arButtonsList[i]; - - if (cbd->m_opFlags & (BBSF_NTBSWAPED | BBSF_NTBDESTRUCT)) { - cbd->m_opFlags ^= BBSF_NTBSWAPED; - - if (cbd->m_opFlags & BBSF_NTBDESTRUCT) - arButtonsList.remove(i); - } - } - qsort(arButtonsList.getArray(), arButtonsList.getCount(), sizeof(void*), sstSortButtons); - - M.BroadcastMessage(DM_BBNEEDUPDATE, 0, 0); - M.BroadcastMessage(DM_LOADBUTTONBARICONS, 0, 0); + Srmm_AddButton(&bbd); + + return 0; } void BB_InitDlgButtons(TWindowData *dat) @@ -960,7 +183,7 @@ void BB_InitDlgButtons(TWindowData *dat) RECT rcSplitter; POINT ptSplitter; int splitterY; - BYTE gap = DPISCALEX_S(PluginConfig.m_iButtonsBarGap); + BYTE gap = DPISCALEX_S(db_get_b(NULL, SRMSGMOD, "ButtonsBarGap", 1)); GetWindowRect(GetDlgItem(hdlg, (dat->bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); ptSplitter.x = 0; @@ -973,8 +196,8 @@ void BB_InitDlgButtons(TWindowData *dat) HWND hwndBtn = NULL; dat->bbLSideWidth = dat->bbRSideWidth = 0; - for (int i = 0; i < arButtonsList.getCount(); i++) { - CustomButtonData *cbd = arButtonsList[i]; + CustomButtonData *cbd; + for (int i = 0; cbd = Srmm_GetNthButton(i); i++) { if (((dat->bType == SESSIONTYPE_IM && cbd->m_bIMButton) || (dat->bType == SESSIONTYPE_CHAT && cbd->m_bChatButton))) { if (!cbd->m_bHidden) { if (cbd->m_bRSided) @@ -989,8 +212,23 @@ void BB_InitDlgButtons(TWindowData *dat) hwndBtn = CreateWindowEx(0, L"MButtonClass", L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP, x, splitterY, cbd->m_iButtonWidth, DPISCALEY_S(22), hdlg, (HMENU)cbd->m_dwButtonCID, g_hInst, NULL); CustomizeButton(hwndBtn); } - if (!cbd->m_bSeparator && hwndBtn) - cbd->Accustom(hwndBtn, dat); + if (!cbd->m_bSeparator && hwndBtn) { + SendMessage(hwndBtn, BUTTONSETASFLATBTN, TRUE, 0); + SendMessage(hwndBtn, BUTTONSETASTHEMEDBTN, CSkin::IsThemed(), 0); + if (cbd->m_hIcon) + SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)IcoLib_GetIconByHandle(cbd->m_hIcon)); + if (cbd->m_pwszTooltip) + SendMessage(hwndBtn, BUTTONADDTOOLTIP, (WPARAM)TranslateW(cbd->m_pwszTooltip), BATF_UNICODE); + SendMessage(hwndBtn, BUTTONSETCONTAINER, (LPARAM)dat->pContainer, 0); + SendMessage(hwndBtn, BUTTONSETASTOOLBARBUTTON, TRUE, 0); + + if (hwndBtn) { + if (cbd->m_dwArrowCID) + SendMessage(hwndBtn, BUTTONSETARROW, cbd->m_dwArrowCID, 0); + if (cbd->m_bPushButton) + SendMessage(hwndBtn, BUTTONSETASPUSHBTN, TRUE, 0); + } + } } else if (GetDlgItem(hdlg, cbd->m_dwButtonCID)) DestroyWindow(GetDlgItem(hdlg, cbd->m_dwButtonCID)); @@ -1005,36 +243,18 @@ void BB_InitDlgButtons(TWindowData *dat) void BB_RedrawButtons(TWindowData *dat) { - for (int i = 0; i < arButtonsList.getCount(); i++) { - CustomButtonData *cbd = arButtonsList[i]; - HWND hwnd = GetDlgItem(dat->hwnd, cbd->m_dwButtonCID); - if (hwnd) - InvalidateRect(hwnd, 0, TRUE); - } + Srmm_RedrawToolbarIcons(dat->hwnd); - HWND hwndToggleSideBar = GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_TOGGLESIDEBAR : IDC_CHAT_TOGGLESIDEBAR); + HWND hwndToggleSideBar = GetDlgItem(dat->hwnd, IDC_TOGGLESIDEBAR); if (hwndToggleSideBar && IsWindow(hwndToggleSideBar)) InvalidateRect(hwndToggleSideBar, 0, TRUE); } -void BB_UpdateIcons(HWND hdlg) -{ - for (int i = 0; i < arButtonsList.getCount(); i++) { - CustomButtonData *cbd = arButtonsList[i]; - if (cbd) { - if (!cbd->m_bSeparator) { - HWND hwndBtn = GetDlgItem(hdlg, cbd->m_dwButtonCID); - if (hwndBtn && cbd->m_hIcon) - SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)IcoLib_GetIconByHandle(cbd->m_hIcon)); - } - } - } -} - void BB_RefreshTheme(const TWindowData *dat) { - for (int i = 0; i < arButtonsList.getCount(); i++) - SendDlgItemMessage(dat->hwnd, arButtonsList[i]->m_dwButtonCID, WM_THEMECHANGED, 0, 0); + CustomButtonData *cbd; + for (int i = 0; cbd = Srmm_GetNthButton(i); i++) + SendDlgItemMessage(dat->hwnd, cbd->m_dwButtonCID, WM_THEMECHANGED, 0, 0); } BOOL BB_SetButtonsPos(TWindowData *dat) @@ -1044,19 +264,16 @@ BOOL BB_SetButtonsPos(TWindowData *dat) HWND hwnd = dat->hwnd; RECT rect; - int i; HWND hwndBtn = 0; - BYTE gap = DPISCALEX_S(PluginConfig.m_iButtonsBarGap); + BYTE gap = DPISCALEX_S(db_get_b(NULL, SRMSGMOD, "ButtonsBarGap", 1)); bool showToolbar = !(dat->pContainer->dwFlags & CNT_HIDETOOLBAR); bool bBottomToolbar = (dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR) != 0; - HWND hwndToggleSideBar = GetDlgItem(hwnd, dat->bType == SESSIONTYPE_IM ? IDC_TOGGLESIDEBAR : IDC_CHAT_TOGGLESIDEBAR); + HWND hwndToggleSideBar = GetDlgItem(hwnd, IDC_TOGGLESIDEBAR); ShowWindow(hwndToggleSideBar, (showToolbar && dat->pContainer->SideBar->isActive()) ? SW_SHOW : SW_HIDE); - HDWP hdwp = BeginDeferWindowPos(arButtonsList.getCount() + 1); - - mir_cslock lck(csToolBar); + HDWP hdwp = BeginDeferWindowPos(Srmm_GetButtonCount() + 1); RECT rcSplitter; GetWindowRect(GetDlgItem(hwnd, (dat->bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); @@ -1082,8 +299,8 @@ BOOL BB_SetButtonsPos(TWindowData *dat) tempL -= 10; } - for (i = 0; i < arButtonsList.getCount(); i++) { - CustomButtonData *cbd = arButtonsList[i]; + CustomButtonData *cbd; + for (int i = 0; cbd = Srmm_GetNthButton(i); i++) { if (cbd->m_bRSided) // filter only left buttons continue; @@ -1133,8 +350,7 @@ BOOL BB_SetButtonsPos(TWindowData *dat) tempR -= 12; } - for (i = 0; i < arButtonsList.getCount(); i++) { - CustomButtonData *cbd = arButtonsList[i]; + for (int i = 0; cbd = Srmm_GetNthButton(i); i++) { if (!cbd->m_bRSided) // filter only right buttons continue; @@ -1192,8 +408,8 @@ void BB_CustomButtonClick(TWindowData *dat, DWORD idFrom, HWND hwndFrom, BOOL co cbcd.pt.x = rc.left; cbcd.pt.y = rc.bottom; - for (int i = 0; i < arButtonsList.getCount(); i++) { - CustomButtonData *cbd = arButtonsList[i]; + CustomButtonData *cbd; + for (int i = 0; cbd = Srmm_GetNthButton(i); i++) { if (cbd->m_dwButtonCID == idFrom) { cbcd.pszModule = cbd->m_pszModuleName; cbcd.dwButtonId = cbd->m_dwButtonOrigID; @@ -1214,8 +430,8 @@ void BB_CustomButtonClick(TWindowData *dat, DWORD idFrom, HWND hwndFrom, BOOL co void CB_DestroyAllButtons(HWND hwndDlg) { - for (int i = 0; i < arButtonsList.getCount(); i++) { - CustomButtonData *cbd = arButtonsList[i]; + CustomButtonData *cbd; + for (int i = 0; cbd = Srmm_GetNthButton(i); i++) { HWND hwndBtn = GetDlgItem(hwndDlg, cbd->m_dwButtonCID); if (hwndBtn) DestroyWindow(hwndBtn); @@ -1258,22 +474,12 @@ void CB_ChangeButton(HWND hwndDlg, TWindowData *dat, CustomButtonData *cbd) void CB_InitCustomButtons() { - dwSepCount = M.GetDword("TabSRMM_Toolbar", "SeparatorsCount", 0); - - CreateServiceFunction(MS_BB_ADDBUTTON, CB_AddButton); - CreateServiceFunction(MS_BB_REMOVEBUTTON, CB_RemoveButton); - CreateServiceFunction(MS_BB_MODIFYBUTTON, CB_ModifyButton); - CreateServiceFunction(MS_BB_GETBUTTONSTATE, CB_GetButtonState); - CreateServiceFunction(MS_BB_SETBUTTONSTATE, CB_SetButtonState); - - hHookToolBarLoadedEvt = CreateHookableEvent(ME_MSG_TOOLBARLOADED); hHookButtonPressedEvt = CreateHookableEvent(ME_MSG_BUTTONPRESSED); + + HookEvent(ME_MSG_TOOLBARLOADED, CB_InitDefaultButtons); } void CB_DeInitCustomButtons() { - wipeList(arButtonsList); - - DestroyHookableEvent(hHookToolBarLoadedEvt); DestroyHookableEvent(hHookButtonPressedEvt); } |