From ea0ec0099a6400a80a4bae0f726e8a1e6522ee86 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 12 Apr 2015 14:44:45 +0000 Subject: - 'Leave chat' button bar's menu item isn't shown for non-chat windows; - implementation of CustomButtonData became local for buttonsbar.cpp; - code cleaning; - version bump git-svn-id: http://svn.miranda-ng.org/main/trunk@12776 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/TabSRMM/src/TSButton.cpp | 1 - plugins/TabSRMM/src/buttonbar.h | 48 +- plugins/TabSRMM/src/buttonsbar.cpp | 1799 +++++++++++++++-------------- plugins/TabSRMM/src/generic_msghandlers.h | 3 - plugins/TabSRMM/src/msgdialog.cpp | 237 ++-- plugins/TabSRMM/src/msgdlgutils.cpp | 5 +- plugins/TabSRMM/src/themes.cpp | 7 + plugins/TabSRMM/src/themes.h | 1 + plugins/TabSRMM/src/version.h | 2 +- 9 files changed, 1045 insertions(+), 1058 deletions(-) (limited to 'plugins/TabSRMM/src') diff --git a/plugins/TabSRMM/src/TSButton.cpp b/plugins/TabSRMM/src/TSButton.cpp index fd81fd31a3..dc98af0044 100644 --- a/plugins/TabSRMM/src/TSButton.cpp +++ b/plugins/TabSRMM/src/TSButton.cpp @@ -519,5 +519,4 @@ void CustomizeButton(HWND hwndButton) TSButtonCtrl *bct = (TSButtonCtrl*)GetWindowLongPtr(hwndButton, 0); if (bct) bct->hThemeToolbar = (M.isAero() || IsWinVerVistaPlus()) ? OpenThemeData(bct->hwnd, L"MENU") : OpenThemeData(bct->hwnd, L"TOOLBAR"); - } diff --git a/plugins/TabSRMM/src/buttonbar.h b/plugins/TabSRMM/src/buttonbar.h index ada8201f1e..2c1e8ff78b 100644 --- a/plugins/TabSRMM/src/buttonbar.h +++ b/plugins/TabSRMM/src/buttonbar.h @@ -1,49 +1,10 @@ #ifndef _BUTTONSBAR_H #define _BUTTONSBAR_H - + #define MIN_CBUTTONID 4000 #define MAX_CBUTTONID 5000 -#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() - { - mir_free(pszModuleName); - mir_free(ptszTooltip); - } - - DWORD dwPosition; // default order pos of button, counted from window edge (left or right) - - DWORD dwButtonOrigID; // id of button used while button creation and to store button info in DB - char *pszModuleName; // module name without spaces and underline symbols (e.g. "tabsrmm") - - DWORD dwButtonCID; - DWORD dwArrowCID; // only use with BBBF_ISARROWBUTTON flag - - TCHAR *ptszTooltip; // button's tooltip - - int iButtonWidth; // must be 22 for regular button and 33 for button with arrow - HANDLE hIcon; // Handle to icolib registred icon - - bool bIMButton, bChatButton; - bool bCanBeHidden, bHidden, bAutoHidden, bSeparator, bDisabled, bPushButton; - bool bLSided, bRSided; - BYTE opFlags; -}; - -static INT_PTR CB_ModifyButton(WPARAM wParam, LPARAM lParam); -static INT_PTR CB_RemoveButton(WPARAM wParam, LPARAM lParam); -static INT_PTR CB_AddButton(WPARAM wParam, LPARAM lParam); -static INT_PTR CB_GetButtonState(WPARAM wParam, LPARAM lParam); -static INT_PTR CB_SetButtonState(WPARAM wParam, LPARAM lParam); -static void CB_GetButtonSettings(MCONTACT hContact, CustomButtonData *cbd); - +struct CustomButtonData; void CB_WriteButtonSettings(MCONTACT hContact, CustomButtonData *cbd); void CB_DeInitCustomButtons(); @@ -51,9 +12,12 @@ void CB_InitCustomButtons(); void CB_InitDefaultButtons(); void CB_ReInitCustomButtons(); -/* MinGW doesn't like this struct declatations below */ void BB_UpdateIcons(HWND hdlg); void BB_RefreshTheme(const TWindowData *dat); +BOOL BB_SetButtonsPos(TWindowData *dat); +void BB_RedrawButtons(TWindowData *dat); +void BB_CustomButtonClick(TWindowData *dat, DWORD idFrom, HWND hwndFrom, BOOL code); + void CB_DestroyAllButtons(HWND hwndDlg); void CB_DestroyButton(HWND hwndDlg, TWindowData *dat, DWORD dwButtonCID, DWORD dwFlags); void CB_ChangeButton(HWND hwndDlg, TWindowData *dat, CustomButtonData* cbd); diff --git a/plugins/TabSRMM/src/buttonsbar.cpp b/plugins/TabSRMM/src/buttonsbar.cpp index 152e488718..7713ba0bdd 100644 --- a/plugins/TabSRMM/src/buttonsbar.cpp +++ b/plugins/TabSRMM/src/buttonsbar.cpp @@ -1,5 +1,40 @@ #include "commonheaders.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() + { + mir_free(m_pszModuleName); + mir_free(m_ptszTooltip); + } + + 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 + char *m_pszModuleName; // module name without spaces and underline symbols (e.g. "tabsrmm") + + DWORD m_dwButtonCID; + DWORD m_dwArrowCID; // only use with BBBF_ISARROWBUTTON flag + + TCHAR *m_ptszTooltip; // 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_bLSided, m_bRSided; + BYTE m_opFlags; +}; + static HANDLE hButtonsBarAddButton; static HANDLE hButtonsBarRemoveButton; static HANDLE hButtonsBarGetButtonState; @@ -14,7 +49,7 @@ static LIST RButtonsList(1, NumericKeySortT), LButtonsList(1, DWORD LastCID = 4000; DWORD dwSepCount = 0; -static mir_cs ToolBarCS; +static mir_cs csToolBar; static void wipeList(LIST &list) { @@ -26,121 +61,42 @@ static void wipeList(LIST &list) static int sstSortButtons(const void *p1, const void *p2) { - return (*(CustomButtonData**)p1)->dwPosition - (*(CustomButtonData**)p2)->dwPosition; -} - -void CB_InitCustomButtons() -{ - dwSepCount = M.GetDword("TabSRMM_Toolbar", "SeparatorsCount", 0); - - hButtonsBarAddButton = CreateServiceFunction(MS_BB_ADDBUTTON, CB_AddButton); - hButtonsBarRemoveButton = CreateServiceFunction(MS_BB_REMOVEBUTTON, CB_RemoveButton); - hButtonsBarModifyButton = CreateServiceFunction(MS_BB_MODIFYBUTTON, CB_ModifyButton); - hButtonsBarGetButtonState = CreateServiceFunction(MS_BB_GETBUTTONSTATE, CB_GetButtonState); - hButtonsBarSetButtonState = CreateServiceFunction(MS_BB_SETBUTTONSTATE, CB_SetButtonState); - - hHookToolBarLoadedEvt = CreateHookableEvent(ME_MSG_TOOLBARLOADED); - hHookButtonPressedEvt = CreateHookableEvent(ME_MSG_BUTTONPRESSED); -} - -void CB_DeInitCustomButtons() -{ - wipeList(LButtonsList); - wipeList(RButtonsList); - - DestroyHookableEvent(hHookToolBarLoadedEvt); - DestroyHookableEvent(hHookButtonPressedEvt); - DestroyServiceFunction(hButtonsBarAddButton); - DestroyServiceFunction(hButtonsBarRemoveButton); - DestroyServiceFunction(hButtonsBarModifyButton); - DestroyServiceFunction(hButtonsBarGetButtonState); - DestroyServiceFunction(hButtonsBarSetButtonState); -} - -void CB_DestroyAllButtons(HWND hwndDlg) -{ - HWND hwndBtn = NULL; - for (int i = 0; i < LButtonsList.getCount(); i++) { - CustomButtonData *cbd = LButtonsList[i]; - hwndBtn = GetDlgItem(hwndDlg, cbd->dwButtonCID); - if (hwndBtn) - DestroyWindow(hwndBtn); - } - - for (int i = 0; i < RButtonsList.getCount(); i++) { - CustomButtonData *cbd = RButtonsList[i]; - hwndBtn = GetDlgItem(hwndDlg, cbd->dwButtonCID); - if (hwndBtn) - DestroyWindow(hwndBtn); - } -} - -void CB_DestroyButton(HWND hwndDlg, TWindowData *dat, DWORD dwButtonCID, DWORD dwFlags) -{ - HWND hwndBtn = GetDlgItem(hwndDlg, dwButtonCID); - RECT rc = { 0 }; - if (hwndBtn) { - GetClientRect(hwndBtn, &rc); - if (dwFlags & BBBF_ISLSIDEBUTTON) - dat->bbLSideWidth -= rc.right; - else if (dwFlags & BBBF_ISRSIDEBUTTON) - dat->bbRSideWidth -= rc.right; - - DestroyWindow(hwndBtn); - BB_SetButtonsPos(dat); - } -} - -void CB_ChangeButton(HWND hwndDlg, TWindowData *dat, CustomButtonData *cbd) -{ - HWND hwndBtn = GetDlgItem(hwndDlg, cbd->dwButtonCID); - if (hwndBtn) { - if (cbd->hIcon) - SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)Skin_GetIconByHandle(cbd->hIcon)); - if (cbd->ptszTooltip) - SendMessage(hwndBtn, BUTTONADDTOOLTIP, (WPARAM)cbd->ptszTooltip, BATF_TCHAR); - SendMessage(hwndBtn, BUTTONSETCONTAINER, (LPARAM)dat->pContainer, 0); - SetWindowTextA(hwndBtn, cbd->pszModuleName); - } + return (*(CustomButtonData**)p1)->m_dwPosition - (*(CustomButtonData**)p2)->m_dwPosition; } -void CB_ReInitCustomButtons() +static void CB_GetButtonSettings(MCONTACT hContact, CustomButtonData *cbd) { - for (int i = 0; i < LButtonsList.getCount(); i++) { - CustomButtonData *cbd = LButtonsList[i]; - - if (cbd->opFlags & BBSF_NTBSWAPED || cbd->opFlags & BBSF_NTBDESTRUCT) { - cbd->opFlags ^= BBSF_NTBSWAPED; - - if (!(cbd->opFlags & BBSF_NTBDESTRUCT)) - RButtonsList.insert(cbd); + DBVARIANT dbv = { 0 }; + char SettingName[1024]; + char* token = NULL; - LButtonsList.remove(i); - i--; - } - } + //modulename_buttonID, position_inIM_inCHAT_isLSide_isRSide_CanBeHidden - for (int i = 0; i < RButtonsList.getCount(); i++) { - CustomButtonData* cbd = RButtonsList[i]; - if (cbd->opFlags & BBSF_NTBSWAPED || cbd->opFlags & BBSF_NTBDESTRUCT) { - cbd->opFlags ^= BBSF_NTBSWAPED; + mir_snprintf(SettingName, SIZEOF(SettingName), "%s_%d", cbd->m_pszModuleName, cbd->m_dwButtonOrigID); - if (!(cbd->opFlags & BBSF_NTBDESTRUCT)) - LButtonsList.insert(cbd); + 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, "_"); + cbd->m_bLSided = atoi(token) != 0; + token = strtok(NULL, "_"); + cbd->m_bRSided = atoi(token) != 0; + token = strtok(NULL, "_"); + cbd->m_bCanBeHidden = atoi(token) != 0; - RButtonsList.remove(i); - i--; - } + db_free(&dbv); } - M.BroadcastMessage(DM_BBNEEDUPDATE, 0, 0); - M.BroadcastMessage(DM_LOADBUTTONBARICONS, 0, 0); } -void CB_HardReInit() +static void CB_HardReInit() { M.BroadcastMessage(DM_CBDESTROY, 0, 0); { - mir_cslock lck(ToolBarCS); + mir_cslock lck(csToolBar); wipeList(LButtonsList); wipeList(RButtonsList); } @@ -158,54 +114,53 @@ static INT_PTR CB_AddButton(WPARAM, LPARAM lParam) return 1; CustomButtonData *cbd = new CustomButtonData(); - if (!bbdi->iButtonWidth && (bbdi->bbbFlags & BBBF_ISARROWBUTTON)) - cbd->iButtonWidth = DPISCALEX_S(34); + cbd->m_iButtonWidth = DPISCALEX_S(34); else if (!bbdi->iButtonWidth) - cbd->iButtonWidth = DPISCALEX_S(22); + cbd->m_iButtonWidth = DPISCALEX_S(22); else - cbd->iButtonWidth = DPISCALEX_S(bbdi->iButtonWidth); + cbd->m_iButtonWidth = DPISCALEX_S(bbdi->iButtonWidth); - cbd->pszModuleName = mir_strdup(bbdi->pszModuleName); + cbd->m_pszModuleName = mir_strdup(bbdi->pszModuleName); if (bbdi->ptszTooltip) { if (bbdi->bbbFlags & BBBF_ANSITOOLTIP) - cbd->ptszTooltip = mir_a2u(bbdi->pszTooltip); + cbd->m_ptszTooltip = mir_a2u(bbdi->pszTooltip); else - cbd->ptszTooltip = mir_tstrdup(bbdi->ptszTooltip); + cbd->m_ptszTooltip = mir_tstrdup(bbdi->ptszTooltip); } - else cbd->ptszTooltip = NULL; - - cbd->dwButtonOrigID = bbdi->dwButtonID; - cbd->hIcon = bbdi->hIcon; - cbd->dwPosition = bbdi->dwDefPos; - cbd->dwButtonCID = (bbdi->bbbFlags & BBBF_CREATEBYID) ? bbdi->dwButtonID : LastCID; - //ugly workaround for smileys plugins - cbd->dwArrowCID = (bbdi->bbbFlags & BBBF_ISARROWBUTTON) ? (cbd->dwButtonCID == IDOK ? IDC_SENDMENU : (cbd->dwButtonCID + 1)) : 0; - cbd->bHidden = (bbdi->bbbFlags & BBBF_HIDDEN) != 0; - cbd->bLSided = (bbdi->bbbFlags & BBBF_ISLSIDEBUTTON) != 0; - cbd->bRSided = (bbdi->bbbFlags & BBBF_ISRSIDEBUTTON) != 0; - cbd->bCanBeHidden = (bbdi->bbbFlags & BBBF_CANBEHIDDEN) != 0; - cbd->bSeparator = (bbdi->bbbFlags & BBBF_ISDUMMYBUTTON) != 0; - cbd->bChatButton = (bbdi->bbbFlags & BBBF_ISCHATBUTTON) != 0; - cbd->bIMButton = (bbdi->bbbFlags & BBBF_ISIMBUTTON) != 0; - cbd->bDisabled = (bbdi->bbbFlags & BBBF_DISABLED) != 0; - cbd->bPushButton = (bbdi->bbbFlags & BBBF_ISPUSHBUTTON) != 0; + else cbd->m_ptszTooltip = NULL; + + 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_bLSided = (bbdi->bbbFlags & BBBF_ISLSIDEBUTTON) != 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; CB_GetButtonSettings(NULL, cbd); - if (cbd->bLSided) + if (cbd->m_bLSided) LButtonsList.insert(cbd); - else if (cbd->bRSided) + else if (cbd->m_bRSided) RButtonsList.insert(cbd); else { delete cbd; return 1; } - if (cbd->dwButtonCID != cbd->dwButtonOrigID) + if (cbd->m_dwButtonCID != cbd->m_dwButtonOrigID) LastCID++; - if (cbd->dwArrowCID == LastCID) + if (cbd->m_dwArrowCID == LastCID) LastCID++; M.BroadcastMessage(DM_BBNEEDUPDATE, 0, 0); @@ -223,17 +178,17 @@ static INT_PTR CB_GetButtonState(WPARAM wParam, LPARAM lParam) bbdi->bbbFlags = 0; for (int i = 0; i < LButtonsList.getCount(); i++) { CustomButtonData *cbd = LButtonsList[i]; - if (!strcmp(cbd->pszModuleName, bbdi->pszModuleName) && (cbd->dwButtonOrigID == bbdi->dwButtonID)) { + if (!strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && (cbd->m_dwButtonOrigID == bbdi->dwButtonID)) { realbutton = true; - tempCID = cbd->dwButtonCID; + tempCID = cbd->m_dwButtonCID; } } if (!realbutton) for (int i = 0; i < RButtonsList.getCount(); i++) { CustomButtonData* cbd = RButtonsList[i]; - if (!strcmp(cbd->pszModuleName, bbdi->pszModuleName) && (cbd->dwButtonOrigID == bbdi->dwButtonID)) { + if (!strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && (cbd->m_dwButtonOrigID == bbdi->dwButtonID)) { realbutton = true; - tempCID = cbd->dwButtonCID; + tempCID = cbd->m_dwButtonCID; } } @@ -259,17 +214,17 @@ static INT_PTR CB_SetButtonState(WPARAM wParam, LPARAM lParam) BBButton *bbdi = (BBButton *)lParam; for (int i = 0; i < LButtonsList.getCount(); i++) { CustomButtonData *cbd = LButtonsList[i]; - if (!strcmp(cbd->pszModuleName, bbdi->pszModuleName) && (cbd->dwButtonOrigID == bbdi->dwButtonID)) { + if (!strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && (cbd->m_dwButtonOrigID == bbdi->dwButtonID)) { realbutton = true; - tempCID = cbd->dwButtonCID; + tempCID = cbd->m_dwButtonCID; } } if (!realbutton) for (int i = 0; i < RButtonsList.getCount(); i++) { CustomButtonData* cbd = RButtonsList[i]; - if (!strcmp(cbd->pszModuleName, bbdi->pszModuleName) && (cbd->dwButtonOrigID == bbdi->dwButtonID)) { + if (!strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && (cbd->m_dwButtonOrigID == bbdi->dwButtonID)) { realbutton = true; - tempCID = cbd->dwButtonCID; + tempCID = cbd->m_dwButtonCID; } } @@ -303,13 +258,13 @@ static INT_PTR CB_RemoveButton(WPARAM, LPARAM lParam) DWORD tempCID = 0; DWORD dwFlags = 0; { - mir_cslock lck(ToolBarCS); + mir_cslock lck(csToolBar); for (int i = LButtonsList.getCount() - 1; i >= 0; i--) { CustomButtonData *cbd = LButtonsList[i]; - if (!strcmp(cbd->pszModuleName, bbdi->pszModuleName) && cbd->dwButtonOrigID == bbdi->dwButtonID) { - tempCID = cbd->dwButtonCID; - dwFlags = cbd->bLSided ? BBBF_ISLSIDEBUTTON : BBBF_ISRSIDEBUTTON; + if (!strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && cbd->m_dwButtonOrigID == bbdi->dwButtonID) { + tempCID = cbd->m_dwButtonCID; + dwFlags = cbd->m_bLSided ? BBBF_ISLSIDEBUTTON : BBBF_ISRSIDEBUTTON; LButtonsList.remove(i); } } @@ -317,9 +272,9 @@ static INT_PTR CB_RemoveButton(WPARAM, LPARAM lParam) if (!tempCID) { for (int i = RButtonsList.getCount() - 1; i >= 0; i--) { CustomButtonData *cbd = RButtonsList[i]; - if (!strcmp(cbd->pszModuleName, bbdi->pszModuleName) && cbd->dwButtonOrigID == bbdi->dwButtonID) { - tempCID = cbd->dwButtonCID; - dwFlags = cbd->bLSided ? BBBF_ISLSIDEBUTTON : BBBF_ISRSIDEBUTTON; + if (!strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && cbd->m_dwButtonOrigID == bbdi->dwButtonID) { + tempCID = cbd->m_dwButtonCID; + dwFlags = cbd->m_bLSided ? BBBF_ISLSIDEBUTTON : BBBF_ISRSIDEBUTTON; RButtonsList.remove(i); } } @@ -340,11 +295,11 @@ static INT_PTR CB_ModifyButton(WPARAM, LPARAM lParam) bool bFound = false; CustomButtonData *cbd = NULL; { - mir_cslock lck(ToolBarCS); + mir_cslock lck(csToolBar); for (int i = 0; i < LButtonsList.getCount(); i++) { cbd = LButtonsList[i]; - if (!strcmp(cbd->pszModuleName, bbdi->pszModuleName) && (cbd->dwButtonOrigID == bbdi->dwButtonID)) { + if (!strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && (cbd->m_dwButtonOrigID == bbdi->dwButtonID)) { bFound = true; break; } @@ -353,7 +308,7 @@ static INT_PTR CB_ModifyButton(WPARAM, LPARAM lParam) if (!bFound) { for (int i = 0; i < RButtonsList.getCount(); i++) { cbd = RButtonsList[i]; - if (!strcmp(cbd->pszModuleName, bbdi->pszModuleName) && (cbd->dwButtonOrigID == bbdi->dwButtonID)) { + if (!strcmp(cbd->m_pszModuleName, bbdi->pszModuleName) && (cbd->m_dwButtonOrigID == bbdi->dwButtonID)) { bFound = true; break; } @@ -362,22 +317,22 @@ static INT_PTR CB_ModifyButton(WPARAM, LPARAM lParam) if (bFound) { if (bbdi->pszTooltip) { - mir_free(cbd->ptszTooltip); + mir_free(cbd->m_ptszTooltip); if (bbdi->bbbFlags & BBBF_ANSITOOLTIP) - cbd->ptszTooltip = mir_a2u(bbdi->pszTooltip); + cbd->m_ptszTooltip = mir_a2u(bbdi->pszTooltip); else - cbd->ptszTooltip = mir_tstrdup(bbdi->ptszTooltip); + cbd->m_ptszTooltip = mir_tstrdup(bbdi->ptszTooltip); } if (bbdi->hIcon) - cbd->hIcon = bbdi->hIcon; + cbd->m_hIcon = bbdi->hIcon; if (bbdi->bbbFlags) { - cbd->bHidden = (bbdi->bbbFlags & BBBF_HIDDEN) != 0; - cbd->bLSided = (bbdi->bbbFlags & BBBF_ISLSIDEBUTTON) != 0; - cbd->bRSided = (bbdi->bbbFlags & BBBF_ISRSIDEBUTTON) != 0; - cbd->bCanBeHidden = (bbdi->bbbFlags & BBBF_CANBEHIDDEN) != 0; - cbd->bChatButton = (bbdi->bbbFlags & BBBF_ISCHATBUTTON) != 0; - cbd->bIMButton = (bbdi->bbbFlags & BBBF_ISIMBUTTON) != 0; - cbd->bDisabled = (bbdi->bbbFlags & BBBF_DISABLED) != 0; + cbd->m_bHidden = (bbdi->bbbFlags & BBBF_HIDDEN) != 0; + cbd->m_bLSided = (bbdi->bbbFlags & BBBF_ISLSIDEBUTTON) != 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; } } } @@ -387,417 +342,503 @@ static INT_PTR CB_ModifyButton(WPARAM, LPARAM lParam) return 0; } -void BB_UpdateIcons(HWND hdlg) +static void BB_RegisterSeparators() { - HWND hwndBtn = NULL; - - for (int i = 0; i < LButtonsList.getCount(); i++) { - CustomButtonData *cbd = LButtonsList[i]; - if (cbd) { - if (!cbd->bSeparator) - hwndBtn = GetDlgItem(hdlg, cbd->dwButtonCID); - - if (hwndBtn && cbd->hIcon) - SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)Skin_GetIconByHandle(cbd->hIcon)); - } - } - - hwndBtn = NULL; - for (int i = 0; i < RButtonsList.getCount(); i++) { - CustomButtonData *cbd = RButtonsList[i]; - if (cbd) { - if (!cbd->bSeparator) - hwndBtn = GetDlgItem(hdlg, cbd->dwButtonCID); - - if (hwndBtn && cbd->hIcon) - SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)Skin_GetIconByHandle(cbd->hIcon)); - } + BBButton bbd = { 0 }; + DWORD i = 0; + bbd.cbSize = sizeof(BBButton); + bbd.pszModuleName = "Tabsrmm_sep"; + for (; dwSepCount > i; i++) { + bbd.bbbFlags = BBBF_ISDUMMYBUTTON | BBBF_ISIMBUTTON | BBBF_ISLSIDEBUTTON; + bbd.dwButtonID = i + 1; + bbd.dwDefPos = 410 + i; + CB_AddButton(0, (LPARAM)&bbd); } } -void TSAPI BB_InitDlgButtons(TWindowData *dat) -{ - if (dat == 0) - return; - HWND hdlg = dat->hwnd; - if (hdlg == 0) - return; - RECT rect; - int lwidth = 0, rwidth = 0; - RECT rcSplitter; - POINT ptSplitter; - int splitterY; - BYTE gap = DPISCALEX_S(PluginConfig.m_iButtonsBarGap); - BOOL isThemed = TRUE; - - if (CSkin::m_skinEnabled && !SkinItems[ID_EXTBKBUTTONSNPRESSED].IGNORED && - !SkinItems[ID_EXTBKBUTTONSPRESSED].IGNORED && !SkinItems[ID_EXTBKBUTTONSMOUSEOVER].IGNORED) { - isThemed = FALSE; - } +#define MIDDLE_SEPARATOR _T(">-------M-------<") - GetWindowRect(GetDlgItem(hdlg, (dat->bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); - ptSplitter.x = 0; - ptSplitter.y = rcSplitter.top; - ScreenToClient(hdlg, &ptSplitter); +static int SaveTree(HWND hToolBarTree) +{ + bool RSide = false; + int count = 10; + DWORD loc_sepcout = 0; + TCHAR strbuf[128]; - GetClientRect(hdlg, &rect); - splitterY = ptSplitter.y - DPISCALEY_S(1); + TVITEM tvi; + tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_HANDLE; + tvi.hItem = TreeView_GetRoot(hToolBarTree); + tvi.pszText = strbuf; + tvi.cchTextMax = SIZEOF(strbuf); + { + mir_cslock lck(csToolBar); - HWND hwndBtn = NULL; + while (tvi.hItem != NULL) { + TreeView_GetItem(hToolBarTree, &tvi); - for (int i = 0; i < RButtonsList.getCount(); i++) { - CustomButtonData *cbd = RButtonsList[i]; - if (((dat->bType == SESSIONTYPE_IM && cbd->bIMButton) || (dat->bType == SESSIONTYPE_CHAT && cbd->bChatButton))) { - if (!cbd->bHidden) - rwidth += cbd->iButtonWidth + gap; - if (!cbd->bHidden && !cbd->bCanBeHidden) - dat->iButtonBarReallyNeeds += cbd->iButtonWidth + gap; - if (!cbd->bSeparator && !GetDlgItem(hdlg, cbd->dwButtonCID)) { - hwndBtn = CreateWindowEx(0, _T("MButtonClass"), _T(""), WS_CHILD | WS_VISIBLE | WS_TABSTOP, rect.right - rwidth + gap, splitterY, cbd->iButtonWidth, DPISCALEY_S(22), hdlg, (HMENU)cbd->dwButtonCID, g_hInst, NULL); - CustomizeButton(hwndBtn); - } - if (!cbd->bSeparator && hwndBtn) { - SendMessage(hwndBtn, BUTTONSETASFLATBTN, TRUE, 0); - SendMessage(hwndBtn, BUTTONSETASTHEMEDBTN, isThemed != 0, 0); - if (cbd->hIcon) - SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)Skin_GetIconByHandle(cbd->hIcon)); - if (cbd->ptszTooltip) - SendMessage(hwndBtn, BUTTONADDTOOLTIP, (WPARAM)TranslateTS(cbd->ptszTooltip), BATF_TCHAR); - SendMessage(hwndBtn, BUTTONSETCONTAINER, (LPARAM)dat->pContainer, 0); - SendMessage(hwndBtn, BUTTONSETASTOOLBARBUTTON, TRUE, 0); - - if (hwndBtn && cbd->dwArrowCID) - SendMessage(hwndBtn, BUTTONSETARROW, cbd->dwArrowCID, 0); - if (hwndBtn && cbd->bPushButton) - SendMessage(hwndBtn, BUTTONSETASPUSHBTN, TRUE, 0); + if (_tcscmp(tvi.pszText, MIDDLE_SEPARATOR) == 0) { + RSide = true; + count = TreeView_GetCount(hToolBarTree) * 10 - count; + tvi.hItem = TreeView_GetNextSibling(hToolBarTree, tvi.hItem); + continue; } - } - else if (GetDlgItem(hdlg, cbd->dwButtonCID)) - DestroyWindow(GetDlgItem(hdlg, cbd->dwButtonCID)); - - if (cbd->bDisabled) - EnableWindow(hwndBtn, 0); - if (cbd->bHidden) - ShowWindow(hwndBtn, SW_HIDE); + 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_bLSided) { + cbd->m_bLSided = false; + cbd->m_bRSided = true; + cbd->m_opFlags |= BBSF_NTBSWAPED; + } + else if (!RSide && cbd->m_bRSided) { + cbd->m_bLSided = true; + 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 && !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 && !strcmp(cbd->m_pszModuleName, "Tabsrmm_sep")) { + cbd->m_bHidden = 0; + cbd->m_opFlags &= ~BBSF_NTBDESTRUCT; + ++loc_sepcout; + } + } - hwndBtn = NULL; + cbd->m_dwPosition = (DWORD)count; + CB_WriteButtonSettings(NULL, cbd); - for (int i = 0; i < LButtonsList.getCount(); i++) { - CustomButtonData *cbd = LButtonsList[i]; - if (((dat->bType == SESSIONTYPE_IM && cbd->bIMButton) || (dat->bType == SESSIONTYPE_CHAT && cbd->bChatButton))) { - if (!cbd->bSeparator && !GetDlgItem(hdlg, cbd->dwButtonCID)) { - hwndBtn = CreateWindowEx(0, _T("MButtonClass"), _T(""), WS_CHILD | WS_VISIBLE | WS_TABSTOP, 2 + lwidth, splitterY, - cbd->iButtonWidth, DPISCALEY_S(22), hdlg, (HMENU)cbd->dwButtonCID, g_hInst, NULL); - CustomizeButton(hwndBtn); - } - if (!cbd->bHidden) - lwidth += cbd->iButtonWidth + gap; - if (!cbd->bHidden && !cbd->bCanBeHidden) - dat->iButtonBarReallyNeeds += cbd->iButtonWidth + gap; - if (!cbd->bSeparator && hwndBtn) { - SendMessage(hwndBtn, BUTTONSETASFLATBTN, TRUE, 0); - SendMessage(hwndBtn, BUTTONSETASTHEMEDBTN, isThemed != 0, 0); - if (cbd->hIcon) - SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)Skin_GetIconByHandle(cbd->hIcon)); - if (cbd->ptszTooltip) - SendMessage(hwndBtn, BUTTONADDTOOLTIP, (WPARAM)TranslateTS(cbd->ptszTooltip), BATF_TCHAR); - SendMessage(hwndBtn, BUTTONSETCONTAINER, (LPARAM)dat->pContainer, 0); - SendMessage(hwndBtn, BUTTONSETASTOOLBARBUTTON, TRUE, 0); - - if (hwndBtn && cbd->dwArrowCID) - SendMessage(hwndBtn, BUTTONSETARROW, cbd->dwArrowCID, 0); - if (hwndBtn && cbd->bPushButton) - SendMessage(hwndBtn, BUTTONSETASPUSHBTN, TRUE, 0); + 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; } - else if (GetDlgItem(hdlg, cbd->dwButtonCID)) - DestroyWindow(GetDlgItem(hdlg, cbd->dwButtonCID)); - if (cbd->bDisabled) - EnableWindow(hwndBtn, 0); - if (cbd->bHidden) - ShowWindow(hwndBtn, SW_HIDE); + qsort(LButtonsList.getArray(), LButtonsList.getCount(), sizeof(void*), sstSortButtons); + qsort(RButtonsList.getArray(), RButtonsList.getCount(), sizeof(void*), sstSortButtons); } - - dat->bbLSideWidth = lwidth; - dat->bbRSideWidth = rwidth; + db_set_dw(0, "TabSRMM_Toolbar", "SeparatorsCount", loc_sepcout); + dwSepCount = loc_sepcout; + return 1; } -void TSAPI BB_RedrawButtons(TWindowData *dat) -{ - for (int i = 0; i < LButtonsList.getCount(); i++) { - CustomButtonData *cbd = LButtonsList[i]; - HWND hwnd = GetDlgItem(dat->hwnd, cbd->dwButtonCID); - if (hwnd) - InvalidateRect(hwnd, 0, TRUE); - } - - for (int i = 0; i < RButtonsList.getCount(); i++) { - CustomButtonData *cbd = RButtonsList[i]; - HWND hwnd = GetDlgItem(dat->hwnd, cbd->dwButtonCID); - if (hwnd) - InvalidateRect(hwnd, 0, TRUE); - } - - HWND hwndToggleSideBar = GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_TOGGLESIDEBAR : IDC_CHAT_TOGGLESIDEBAR); - if (hwndToggleSideBar && IsWindow(hwndToggleSideBar)) - InvalidateRect(hwndToggleSideBar, 0, TRUE); -} +HIMAGELIST himgl = NULL; -BOOL TSAPI BB_SetButtonsPos(TWindowData *dat) +static int BuildMenuObjectsTree(HWND hToolBarTree) { + HTREEITEM hti; + int iImage = 0; - if (!dat || !IsWindowVisible(dat->hwnd)) - return 0; - - HWND hwnd = dat->hwnd; - RECT rect; - int i; - HWND hwndBtn = 0; + TVINSERTSTRUCT tvis; + tvis.hParent = NULL; + tvis.hInsertAfter = TVI_LAST; + tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_IMAGE; - BYTE gap = DPISCALEX_S(PluginConfig.m_iButtonsBarGap); - bool showToolbar = !(dat->pContainer->dwFlags & CNT_HIDETOOLBAR); - bool bBottomToolbar = (dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR) != 0; + TreeView_DeleteAllItems(hToolBarTree); - HWND hwndToggleSideBar = GetDlgItem(hwnd, dat->bType == SESSIONTYPE_IM ? IDC_TOGGLESIDEBAR : IDC_CHAT_TOGGLESIDEBAR); - ShowWindow(hwndToggleSideBar, (showToolbar && dat->pContainer->SideBar->isActive()) ? SW_SHOW : SW_HIDE); + himgl = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 2, 2); + ImageList_AddIcon(himgl, LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT)); + ImageList_Destroy(TreeView_GetImageList(hToolBarTree, TVSIL_NORMAL)); + TreeView_SetImageList(hToolBarTree, himgl, TVSIL_NORMAL); - HDWP hdwp = BeginDeferWindowPos(LButtonsList.getCount() + RButtonsList.getCount() + 1); + if ((RButtonsList.getCount() + LButtonsList.getCount()) == 0) + return FALSE; - mir_cslock lck(ToolBarCS); + mir_cslock lck(csToolBar); - RECT rcSplitter; - GetWindowRect(GetDlgItem(hwnd, (dat->bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); + for (int i = 0; i < LButtonsList.getCount(); i++) { + CustomButtonData *cbd = LButtonsList[i]; + tvis.item.lParam = (LPARAM)cbd; - POINT ptSplitter = { 0, rcSplitter.top }; - ScreenToClient(hwnd, &ptSplitter); - - GetClientRect(hwnd, &rect); - - int splitterY = (!bBottomToolbar) ? ptSplitter.y - DPISCALEY_S(1) : rect.bottom; - int tempL = dat->bbLSideWidth, tempR = dat->bbRSideWidth; - int lwidth = 0, rwidth = 0; - int iOff = DPISCALEY_S((PluginConfig.m_DPIscaleY > 1.0) ? (dat->bType == SESSIONTYPE_IM ? 22 : 23) : 22); - - int foravatar = 0; - if ((rect.bottom - ptSplitter.y - (rcSplitter.bottom - rcSplitter.top) /*- DPISCALEY(2)*/ - (bBottomToolbar ? DPISCALEY_S(24) : 0) < dat->pic.cy - DPISCALEY_S(2)) && dat->bShowAvatar && !PluginConfig.m_bAlwaysFullToolbarWidth) - foravatar = dat->pic.cx + gap; + if (cbd->m_bSeparator) { + tvis.item.pszText = TranslateT(""); + tvis.item.iImage = tvis.item.iSelectedImage = 0; + } + else { + tvis.item.pszText = TranslateTS(cbd->m_ptszTooltip); + iImage = ImageList_AddIcon(himgl, Skin_GetIconByHandle(cbd->m_hIcon)); + tvis.item.iImage = tvis.item.iSelectedImage = iImage; + } + cbd->m_opFlags = 0; + hti = TreeView_InsertItem(hToolBarTree, &tvis); - if ((dat->pContainer->dwFlags & CNT_SIDEBAR) && (dat->pContainer->SideBar->getFlags() & CSideBar::SIDEBARORIENTATION_LEFT)) { - if (NULL != hwndToggleSideBar) /* Wine fix. */ - hdwp = DeferWindowPos(hdwp, hwndToggleSideBar, NULL, 4, 2 + splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); - lwidth += 10; - tempL -= 10; + TreeView_SetCheckState(hToolBarTree, hti, (cbd->m_bIMButton || cbd->m_bChatButton)); } - for (i = 0; i < LButtonsList.getCount(); i++) { - CustomButtonData *cbd = LButtonsList[i]; - if (((dat->bType == SESSIONTYPE_IM) && cbd->bIMButton) || ((dat->bType == SESSIONTYPE_CHAT) && cbd->bChatButton)) { - hwndBtn = GetDlgItem(hwnd, cbd->dwButtonCID); - - if (!showToolbar) { - ShowWindow(hwndBtn, SW_HIDE); - if (NULL != hwndBtn) /* Wine fix. */ - hdwp = DeferWindowPos(hdwp, hwndBtn, NULL, lwidth, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); - if (IsWindowVisible(hwndBtn) || (cbd->bSeparator && !(cbd->bAutoHidden || cbd->bHidden))) - lwidth += cbd->iButtonWidth + gap; - if (!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn) && !cbd->bAutoHidden) - cbd->bAutoHidden = 1; - continue; - } - if (!cbd->bCanBeHidden && !cbd->bHidden && !(!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn) && !cbd->bAutoHidden)) { - ShowWindow(hwndBtn, SW_SHOW); - cbd->bAutoHidden = 0; - } + tvis.item.lParam = 0; + tvis.item.mask |= TVIF_STATE; + tvis.item.pszText = MIDDLE_SEPARATOR; + tvis.item.stateMask = TVIS_BOLD; + tvis.item.state = TVIS_BOLD; + tvis.item.iImage = tvis.item.iSelectedImage = -1; + hti = TreeView_InsertItem(hToolBarTree, &tvis); + TreeView_SetCheckState(hToolBarTree, hti, 1); - if (!cbd->bSeparator && !IsWindowVisible(hwndBtn) && !IsWindowEnabled(hwndBtn) && !cbd->bAutoHidden) - tempL -= cbd->iButtonWidth + gap; + for (int i = RButtonsList.getCount() - 1; i >= 0; i--) { + CustomButtonData *cbd = RButtonsList[i]; + tvis.item.lParam = (LPARAM)cbd; - if (cbd->bCanBeHidden && !cbd->bHidden && (cbd->bSeparator || !((!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn)) && !cbd->bAutoHidden))) { - if (tempL + tempR > (rect.right - foravatar)) { - ShowWindow(hwndBtn, SW_HIDE); - cbd->bAutoHidden = 1; - tempL -= cbd->iButtonWidth + gap; - } - else if (cbd->bAutoHidden) { - ShowWindow(hwndBtn, SW_SHOW); - cbd->bAutoHidden = 0; - } - } - if (NULL != hwndBtn) /* Wine fix. */ - hdwp = DeferWindowPos(hdwp, hwndBtn, NULL, lwidth, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE);// SWP_NOCOPYBITS); - if (IsWindowVisible(hwndBtn) || (cbd->bSeparator && !(cbd->bAutoHidden || cbd->bHidden))) - lwidth += cbd->iButtonWidth + gap; + if (cbd->m_bSeparator) { + tvis.item.pszText = TranslateT(""); + tvis.item.iImage = tvis.item.iSelectedImage = -1; } + else { + tvis.item.pszText = TranslateTS(cbd->m_ptszTooltip); + iImage = ImageList_AddIcon(himgl, Skin_GetIconByHandle(cbd->m_hIcon)); + tvis.item.iImage = tvis.item.iSelectedImage = iImage; + } + tvis.item.state = 0; + cbd->m_opFlags = 0; + hti = TreeView_InsertItem(hToolBarTree, &tvis); + TreeView_SetCheckState(hToolBarTree, hti, (cbd->m_bIMButton || cbd->m_bChatButton)); } - if ((dat->pContainer->dwFlags & CNT_SIDEBAR) && (dat->pContainer->SideBar->getFlags() & CSideBar::SIDEBARORIENTATION_RIGHT)) { - if (NULL != hwndToggleSideBar) /* Wine fix. */ - hdwp = DeferWindowPos(hdwp, hwndToggleSideBar, NULL, rect.right - foravatar - 10, 2 + splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); - rwidth += 12; - tempR -= 12; - } + return 1; +} - for (i = 0; i < RButtonsList.getCount(); i++) { - CustomButtonData *cbd = RButtonsList[i]; - if (((dat->bType == SESSIONTYPE_IM) && cbd->bIMButton) || ((dat->bType == SESSIONTYPE_CHAT) && cbd->bChatButton)) { - hwndBtn = GetDlgItem(hwnd, cbd->dwButtonCID); +BOOL drag = FALSE, bOptionsInit = TRUE; +HANDLE hDragItem = NULL; +HWND hToolBarTree = NULL; - if (!showToolbar) { - ShowWindow(hwndBtn, SW_HIDE); - if (IsWindowVisible(hwndBtn) || (cbd->bSeparator && !(cbd->bAutoHidden || cbd->bHidden))) - rwidth += cbd->iButtonWidth + gap; - if (NULL != hwndBtn) /* Wine fix. */ - hdwp = DeferWindowPos(hdwp, hwndBtn, NULL, rect.right - foravatar - rwidth + gap, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); - if (!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn) && !cbd->bAutoHidden) - cbd->bAutoHidden = 1; - continue; - } - if (!cbd->bCanBeHidden && !cbd->bHidden && !((!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn)) && !cbd->bAutoHidden)) { - ShowWindow(hwndBtn, SW_SHOW); - cbd->bAutoHidden = 0; - } +INT_PTR CALLBACK DlgProcToolBar(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + HTREEITEM hti; - if (!cbd->bSeparator && !IsWindowVisible(hwndBtn) && !IsWindowEnabled(hwndBtn) && !cbd->bAutoHidden) - tempR -= cbd->iButtonWidth + gap; + 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); + } - if (cbd->bCanBeHidden && !cbd->bHidden && (cbd->bSeparator || !((!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn)) && !cbd->bAutoHidden))) { - if (tempL + tempR > (rect.right - foravatar)) { - ShowWindow(hwndBtn, SW_HIDE); - cbd->bAutoHidden = 1; - tempR -= cbd->iButtonWidth + gap; - } - else if (cbd->bAutoHidden) { - ShowWindow(hwndBtn, SW_SHOW); - cbd->bAutoHidden = 0; - } - } + Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, false); + Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, false); + Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, false); - if (IsWindowVisible(hwndBtn) || (cbd->bSeparator && !(cbd->bAutoHidden || cbd->bHidden))) - rwidth += cbd->iButtonWidth + gap; - if (NULL != hwndBtn) /* Wine fix. */ - hdwp = DeferWindowPos(hdwp, hwndBtn, NULL, rect.right - foravatar - rwidth + gap, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); - } - } - return EndDeferWindowPos(hdwp); -} + 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; -void TSAPI BB_CustomButtonClick(TWindowData *dat, DWORD idFrom, HWND hwndFrom, BOOL code) -{ - RECT rc; - int i; - BOOL bFromArrow = 0; - CustomButtonClickData cbcd = { 0 }; + case WM_LBUTTONUP: + if (drag) { + TreeView_SetInsertMark(hToolBarTree, NULL, 0); + drag = 0; + ReleaseCapture(); - GetWindowRect(hwndFrom, &rc); - cbcd.pt.x = rc.left; - cbcd.pt.y = rc.bottom; + 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; - for (i = 0; i < LButtonsList.getCount(); i++) { - CustomButtonData* cbd = LButtonsList[i]; - if (cbd->dwButtonCID == idFrom) { - cbcd.pszModule = cbd->pszModuleName; - cbcd.dwButtonId = cbd->dwButtonOrigID; - } - else if (cbd->dwArrowCID == idFrom) { - bFromArrow = 1; - cbcd.pszModule = cbd->pszModuleName; - cbcd.dwButtonId = cbd->dwButtonOrigID; + 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; + TCHAR 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 = SIZEOF(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; - if (!cbcd.pszModule) - for (i = 0; i < RButtonsList.getCount(); i++) { - CustomButtonData* cbd = RButtonsList[i]; - if (cbd->dwButtonCID == idFrom) { - cbcd.pszModule = cbd->pszModuleName; - cbcd.dwButtonId = cbd->dwButtonOrigID; + 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 (cbd->dwArrowCID == idFrom) { - bFromArrow = 1; - cbcd.pszModule = cbd->pszModuleName; - cbcd.dwButtonId = cbd->dwButtonOrigID; + 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; - cbcd.cbSize = sizeof(CustomButtonClickData); - cbcd.hwndFrom = dat->hwnd; - cbcd.hContact = dat->hContact; - cbcd.flags = (code ? BBCF_RIGHTBUTTON : 0) | (GetKeyState(VK_SHIFT) & 0x8000 ? BBCF_SHIFTPRESSED : 0) | (GetKeyState(VK_CONTROL) & 0x8000 ? BBCF_CONTROLPRESSED : 0) | (bFromArrow ? BBCF_ARROWCLICKED : 0); - - NotifyEventHooks(hHookButtonPressedEvt, dat->hContact, (LPARAM)&cbcd); -} - + 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); -void CB_GetButtonSettings(MCONTACT hContact, CustomButtonData *cbd) -{ - DBVARIANT dbv = { 0 }; - char SettingName[1024]; - char* token = NULL; + switch (LOWORD(wParam)) { + case IDC_BBRESET: + CallService(MS_DB_MODULE_DELETE, NULL, LPARAM("TabSRMM_Toolbar")); + CB_HardReInit(); + BuildMenuObjectsTree(hToolBarTree); + break; - //modulename_buttonID, position_inIM_inCHAT_isLSide_isRSide_CanBeHidden + case IDC_SEPARATOR: + hti = TreeView_GetSelection(hToolBarTree); + if (!hti) + hti = TVI_FIRST; - mir_snprintf(SettingName, SIZEOF(SettingName), "%s_%d", cbd->pszModuleName, cbd->dwButtonOrigID); + CustomButtonData *cbd = new CustomButtonData(); + cbd->m_bSeparator = cbd->m_bHidden = cbd->m_bIMButton = cbd->m_bLSided = true; + cbd->m_dwButtonOrigID = ++dwSepCount; + cbd->m_pszModuleName = "Tabsrmm_sep"; + cbd->m_iButtonWidth = 22; + cbd->m_opFlags = BBSF_NTBDESTRUCT; + LButtonsList.insert(cbd); - if (!db_get_s(hContact, "TabSRMM_Toolbar", SettingName, &dbv)) { - token = strtok(dbv.pszVal, "_"); - cbd->dwPosition = (DWORD)atoi(token); - token = strtok(NULL, "_"); - cbd->bIMButton = atoi(token) != 0; - token = strtok(NULL, "_"); - cbd->bChatButton = atoi(token) != 0; - token = strtok(NULL, "_"); - cbd->bLSided = atoi(token) != 0; - token = strtok(NULL, "_"); - cbd->bRSided = atoi(token) != 0; - token = strtok(NULL, "_"); - cbd->bCanBeHidden = atoi(token) != 0; + TVINSERTSTRUCT tvis; + tvis.hParent = NULL; + tvis.hInsertAfter = hti; + tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; - db_free(&dbv); - } -} + tvis.item.pszText = TranslateT(""); + tvis.item.iImage = tvis.item.iSelectedImage = -1; + tvis.item.lParam = (LPARAM)cbd; + hti = TreeView_InsertItem(hToolBarTree, &tvis); -void CB_WriteButtonSettings(MCONTACT hContact, CustomButtonData *cbd) -{ - char SettingName[1024]; - char SettingParameter[1024]; + TreeView_SetCheckState(hToolBarTree, hti, (cbd->m_bIMButton || cbd->m_bChatButton)); + } + break; - //modulename_buttonID, position_inIM_inCHAT_isLSide_isRSide_CanBeHidden + 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; - mir_snprintf(SettingName, SIZEOF(SettingName), "%s_%d", cbd->pszModuleName, cbd->dwButtonOrigID); - mir_snprintf(SettingParameter, SIZEOF(SettingParameter), "%d_%u_%u_%u_%u_%u", cbd->dwPosition, cbd->bIMButton, cbd->bChatButton, cbd->bLSided, cbd->bRSided, cbd->bCanBeHidden); - if (!(cbd->opFlags & BBSF_NTBDESTRUCT)) - db_set_s(hContact, "TabSRMM_Toolbar", SettingName, SettingParameter); - else - db_unset(hContact, "TabSRMM_Toolbar", SettingName); + case PSN_APPLY: + hti = TreeView_GetSelection(hToolBarTree); + if (hti) { + TVITEM tvi; + tvi.mask = TVIF_HANDLE | TVIF_PARAM; + tvi.hItem = hti; + 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_BEGINDRAGA: + case TVN_BEGINDRAGW: + SetCapture(hwndDlg); + drag = 1; + hDragItem = ((LPNMTREEVIEW)lParam)->itemNew.hItem; + TreeView_SelectItem(hToolBarTree, hDragItem); + break; + + case TVN_SELCHANGINGA: + case TVN_SELCHANGINGW: + hti = TreeView_GetSelection(hToolBarTree); + if (hti != NULL) { + TCHAR strbuf[128]; + + TVITEM tvi; + tvi.hItem = hti; + tvi.pszText = strbuf; + tvi.cchTextMax = SIZEOF(strbuf); + tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_PARAM; + TreeView_GetItem(hToolBarTree, &tvi); + + if (tvi.lParam == 0 || !TreeView_GetCheckState(hToolBarTree, tvi.hItem) || !_tcscmp(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_SELCHANGEDW: + case TVN_SELCHANGEDA: + hti = TreeView_GetSelection(hToolBarTree); + if (hti != NULL) { + TCHAR strbuf[128]; + + TVITEM tvi; + tvi.pszText = strbuf; + tvi.cchTextMax = SIZEOF(strbuf); + tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_PARAM; + tvi.hItem = hti; + TreeView_GetItem(hToolBarTree, &tvi); + + if (!TreeView_GetCheckState(hToolBarTree, tvi.hItem) || !_tcscmp(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 BB_RegisterSeparators() +///////////////////////////////////////////////////////////////////////////////////////// + +void CustomButtonData::Accustom(HWND hwndBtn, TWindowData *dat) { - BBButton bbd = { 0 }; - DWORD i = 0; - bbd.cbSize = sizeof(BBButton); - bbd.pszModuleName = "Tabsrmm_sep"; - for (; dwSepCount > i; i++) { - bbd.bbbFlags = BBBF_ISDUMMYBUTTON | BBBF_ISIMBUTTON | BBBF_ISLSIDEBUTTON; - bbd.dwButtonID = i + 1; - bbd.dwDefPos = 410 + i; - CB_AddButton(0, (LPARAM)&bbd); + SendMessage(hwndBtn, BUTTONSETASFLATBTN, TRUE, 0); + SendMessage(hwndBtn, BUTTONSETASTHEMEDBTN, CSkin::IsThemed(), 0); + if (m_hIcon) + SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)Skin_GetIconByHandle(m_hIcon)); + if (m_ptszTooltip) + SendMessage(hwndBtn, BUTTONADDTOOLTIP, (WPARAM)TranslateTS(m_ptszTooltip), BATF_TCHAR); + 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); } } -void BB_RefreshTheme(const TWindowData *dat) +///////////////////////////////////////////////////////////////////////////////////////// +// Global functions + +void CB_WriteButtonSettings(MCONTACT hContact, CustomButtonData *cbd) { - for (int i = 0; i < RButtonsList.getCount(); i++) { - CustomButtonData* cbd = RButtonsList[i]; - SendDlgItemMessage(dat->hwnd, cbd->dwButtonCID, WM_THEMECHANGED, 0, 0); - } - for (int i = 0; i < LButtonsList.getCount(); i++) { - CustomButtonData* cbd = LButtonsList[i]; - SendDlgItemMessage(dat->hwnd, cbd->dwButtonCID, WM_THEMECHANGED, 0, 0); - } + char SettingName[1024]; + char SettingParameter[1024]; + + //modulename_buttonID, position_inIM_inCHAT_isLSide_isRSide_CanBeHidden + + mir_snprintf(SettingName, SIZEOF(SettingName), "%s_%d", cbd->m_pszModuleName, cbd->m_dwButtonOrigID); + mir_snprintf(SettingParameter, SIZEOF(SettingParameter), "%d_%u_%u_%u_%u_%u", cbd->m_dwPosition, cbd->m_bIMButton, cbd->m_bChatButton, cbd->m_bLSided, 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() @@ -975,451 +1016,435 @@ void CB_InitDefaultButtons() BB_RegisterSeparators(); } -#define MIDDLE_SEPARATOR _T(">-------M-------<") - -static int SaveTree(HWND hToolBarTree) +void CB_ReInitCustomButtons() { - bool RSide = false; - int count = 10; - DWORD loc_sepcout = 0; - TCHAR strbuf[128]; - - TVITEM tvi; - tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_HANDLE; - tvi.hItem = TreeView_GetRoot(hToolBarTree); - tvi.pszText = strbuf; - tvi.cchTextMax = SIZEOF(strbuf); - { - mir_cslock lck(ToolBarCS); + for (int i = 0; i < LButtonsList.getCount();) { + CustomButtonData *cbd = LButtonsList[i]; - while (tvi.hItem != NULL) { - TreeView_GetItem(hToolBarTree, &tvi); + if (cbd->m_opFlags & (BBSF_NTBSWAPED | BBSF_NTBDESTRUCT)) { + cbd->m_opFlags ^= BBSF_NTBSWAPED; - if (_tcscmp(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->opFlags) { - cbd->bIMButton = (cbd->opFlags & BBSF_IMBUTTON) != 0; - cbd->bChatButton = (cbd->opFlags & BBSF_CHATBUTTON) != 0; - cbd->bCanBeHidden = (cbd->opFlags & BBSF_CANBEHIDDEN) != 0; - } - if (RSide && cbd->bLSided) { - cbd->bLSided = false; - cbd->bRSided = true; - cbd->opFlags |= BBSF_NTBSWAPED; - } - else if (!RSide && cbd->bRSided) { - cbd->bLSided = true; - cbd->bRSided = false; - cbd->opFlags |= BBSF_NTBSWAPED; - } - if (!TreeView_GetCheckState(hToolBarTree, tvi.hItem)) { - cbd->bIMButton = false; - cbd->bChatButton = false; + if (!(cbd->m_opFlags & BBSF_NTBDESTRUCT)) + RButtonsList.insert(cbd); - if (cbd->bSeparator && !strcmp(cbd->pszModuleName, "Tabsrmm_sep")) - cbd->opFlags = BBSF_NTBDESTRUCT; - } - else { - if (!cbd->bIMButton && !cbd->bChatButton) - cbd->bIMButton = true; - if (cbd->bSeparator && !strcmp(cbd->pszModuleName, "Tabsrmm_sep")) { - cbd->bHidden = 0; - cbd->opFlags &= ~BBSF_NTBDESTRUCT; - ++loc_sepcout; - } - } + LButtonsList.remove(i); + } + else i++; + } - cbd->dwPosition = (DWORD)count; - CB_WriteButtonSettings(NULL, cbd); + for (int i = 0; i < RButtonsList.getCount();) { + CustomButtonData* cbd = RButtonsList[i]; + if (cbd->m_opFlags & (BBSF_NTBSWAPED | BBSF_NTBDESTRUCT)) { + cbd->m_opFlags ^= BBSF_NTBSWAPED; - if (!(cbd->opFlags & BBSF_NTBDESTRUCT)) - (RSide) ? (count -= 10) : (count += 10); - } + if (!(cbd->m_opFlags & BBSF_NTBDESTRUCT)) + LButtonsList.insert(cbd); - HTREEITEM hItem = TreeView_GetNextSibling(hToolBarTree, tvi.hItem); - if (cbd->opFlags & BBSF_NTBDESTRUCT) - TreeView_DeleteItem(hToolBarTree, tvi.hItem); - tvi.hItem = hItem; + RButtonsList.remove(i); } - - qsort(LButtonsList.getArray(), LButtonsList.getCount(), sizeof(void*), sstSortButtons); - qsort(RButtonsList.getArray(), RButtonsList.getCount(), sizeof(void*), sstSortButtons); + else i++; } - db_set_dw(0, "TabSRMM_Toolbar", "SeparatorsCount", loc_sepcout); - dwSepCount = loc_sepcout; - return 1; + M.BroadcastMessage(DM_BBNEEDUPDATE, 0, 0); + M.BroadcastMessage(DM_LOADBUTTONBARICONS, 0, 0); } -HIMAGELIST himgl = NULL; - -static int BuildMenuObjectsTree(HWND hToolBarTree) +void BB_InitDlgButtons(TWindowData *dat) { - 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); + if (dat == 0) + return; + HWND hdlg = dat->hwnd; + if (hdlg == 0) + return; + RECT rect; + int lwidth = 0, rwidth = 0; + RECT rcSplitter; + POINT ptSplitter; + int splitterY; + BYTE gap = DPISCALEX_S(PluginConfig.m_iButtonsBarGap); - himgl = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 2, 2); - ImageList_AddIcon(himgl, LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT)); - ImageList_Destroy(TreeView_GetImageList(hToolBarTree, TVSIL_NORMAL)); - TreeView_SetImageList(hToolBarTree, himgl, TVSIL_NORMAL); + GetWindowRect(GetDlgItem(hdlg, (dat->bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); + ptSplitter.x = 0; + ptSplitter.y = rcSplitter.top; + ScreenToClient(hdlg, &ptSplitter); - if ((RButtonsList.getCount() + LButtonsList.getCount()) == 0) - return FALSE; + GetClientRect(hdlg, &rect); + splitterY = ptSplitter.y - DPISCALEY_S(1); - mir_cslock lck(ToolBarCS); + HWND hwndBtn = NULL; - for (int i = 0; i < LButtonsList.getCount(); i++) { - CustomButtonData *cbd = LButtonsList[i]; - tvis.item.lParam = (LPARAM)cbd; - - if (cbd->bSeparator) { - tvis.item.pszText = TranslateT(""); - tvis.item.iImage = tvis.item.iSelectedImage = 0; - } - else { - tvis.item.pszText = TranslateTS(cbd->ptszTooltip); - iImage = ImageList_AddIcon(himgl, Skin_GetIconByHandle(cbd->hIcon)); - tvis.item.iImage = tvis.item.iSelectedImage = iImage; + for (int i = 0; i < RButtonsList.getCount(); i++) { + CustomButtonData *cbd = RButtonsList[i]; + if (((dat->bType == SESSIONTYPE_IM && cbd->m_bIMButton) || (dat->bType == SESSIONTYPE_CHAT && cbd->m_bChatButton))) { + if (!cbd->m_bHidden) + rwidth += cbd->m_iButtonWidth + gap; + if (!cbd->m_bHidden && !cbd->m_bCanBeHidden) + dat->iButtonBarReallyNeeds += cbd->m_iButtonWidth + gap; + if (!cbd->m_bSeparator && !GetDlgItem(hdlg, cbd->m_dwButtonCID)) { + hwndBtn = CreateWindowEx(0, _T("MButtonClass"), _T(""), WS_CHILD | WS_VISIBLE | WS_TABSTOP, rect.right - rwidth + gap, 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); } - cbd->opFlags = 0; - hti = TreeView_InsertItem(hToolBarTree, &tvis); + else if (GetDlgItem(hdlg, cbd->m_dwButtonCID)) + DestroyWindow(GetDlgItem(hdlg, cbd->m_dwButtonCID)); - TreeView_SetCheckState(hToolBarTree, hti, (cbd->bIMButton || cbd->bChatButton)); - } + if (cbd->m_bDisabled) + EnableWindow(hwndBtn, 0); + if (cbd->m_bHidden) + ShowWindow(hwndBtn, SW_HIDE); - tvis.item.lParam = 0; - tvis.item.mask |= TVIF_STATE; - tvis.item.pszText = MIDDLE_SEPARATOR; - tvis.item.stateMask = TVIS_BOLD; - tvis.item.state = TVIS_BOLD; - tvis.item.iImage = tvis.item.iSelectedImage = -1; - hti = TreeView_InsertItem(hToolBarTree, &tvis); - TreeView_SetCheckState(hToolBarTree, hti, 1); + } - for (int i = RButtonsList.getCount() - 1; i >= 0; i--) { - CustomButtonData *cbd = RButtonsList[i]; - tvis.item.lParam = (LPARAM)cbd; + hwndBtn = NULL; - if (cbd->bSeparator) { - tvis.item.pszText = TranslateT(""); - tvis.item.iImage = tvis.item.iSelectedImage = -1; - } - else { - tvis.item.pszText = TranslateTS(cbd->ptszTooltip); - iImage = ImageList_AddIcon(himgl, Skin_GetIconByHandle(cbd->hIcon)); - tvis.item.iImage = tvis.item.iSelectedImage = iImage; + for (int i = 0; i < LButtonsList.getCount(); i++) { + CustomButtonData *cbd = LButtonsList[i]; + if (((dat->bType == SESSIONTYPE_IM && cbd->m_bIMButton) || (dat->bType == SESSIONTYPE_CHAT && cbd->m_bChatButton))) { + if (!cbd->m_bSeparator && !GetDlgItem(hdlg, cbd->m_dwButtonCID)) { + hwndBtn = CreateWindowEx(0, _T("MButtonClass"), _T(""), WS_CHILD | WS_VISIBLE | WS_TABSTOP, 2 + lwidth, splitterY, + cbd->m_iButtonWidth, DPISCALEY_S(22), hdlg, (HMENU)cbd->m_dwButtonCID, g_hInst, NULL); + CustomizeButton(hwndBtn); + } + if (!cbd->m_bHidden) + lwidth += cbd->m_iButtonWidth + gap; + if (!cbd->m_bHidden && !cbd->m_bCanBeHidden) + dat->iButtonBarReallyNeeds += cbd->m_iButtonWidth + gap; + if (!cbd->m_bSeparator && hwndBtn) + cbd->Accustom(hwndBtn, dat); } - tvis.item.state = 0; - cbd->opFlags = 0; - hti = TreeView_InsertItem(hToolBarTree, &tvis); - TreeView_SetCheckState(hToolBarTree, hti, (cbd->bIMButton || cbd->bChatButton)); + else if (GetDlgItem(hdlg, cbd->m_dwButtonCID)) + DestroyWindow(GetDlgItem(hdlg, cbd->m_dwButtonCID)); + + if (cbd->m_bDisabled) + EnableWindow(hwndBtn, 0); + if (cbd->m_bHidden) + ShowWindow(hwndBtn, SW_HIDE); } - return 1; + dat->bbLSideWidth = lwidth; + dat->bbRSideWidth = rwidth; } +void BB_RedrawButtons(TWindowData *dat) +{ + for (int i = 0; i < LButtonsList.getCount(); i++) { + CustomButtonData *cbd = LButtonsList[i]; + HWND hwnd = GetDlgItem(dat->hwnd, cbd->m_dwButtonCID); + if (hwnd) + InvalidateRect(hwnd, 0, TRUE); + } -BOOL drag = FALSE, bOptionsInit = TRUE; -HANDLE hDragItem = NULL; -HWND hToolBarTree = NULL; + for (int i = 0; i < RButtonsList.getCount(); i++) { + CustomButtonData *cbd = RButtonsList[i]; + HWND hwnd = GetDlgItem(dat->hwnd, cbd->m_dwButtonCID); + if (hwnd) + InvalidateRect(hwnd, 0, TRUE); + } -INT_PTR CALLBACK DlgProcToolBar(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) + HWND hwndToggleSideBar = GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_TOGGLESIDEBAR : IDC_CHAT_TOGGLESIDEBAR); + if (hwndToggleSideBar && IsWindow(hwndToggleSideBar)) + InvalidateRect(hwndToggleSideBar, 0, TRUE); +} + +void BB_UpdateIcons(HWND hdlg) { - HTREEITEM hti; + HWND hwndBtn = NULL; - 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); + for (int i = 0; i < LButtonsList.getCount(); i++) { + CustomButtonData *cbd = LButtonsList[i]; + if (cbd) { + if (!cbd->m_bSeparator) + hwndBtn = GetDlgItem(hdlg, cbd->m_dwButtonCID); + + if (hwndBtn && cbd->m_hIcon) + SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)Skin_GetIconByHandle(cbd->m_hIcon)); } - { - mir_cslock lck(ToolBarCS); - BuildMenuObjectsTree(hToolBarTree); + } + + hwndBtn = NULL; + for (int i = 0; i < RButtonsList.getCount(); i++) { + CustomButtonData *cbd = RButtonsList[i]; + if (cbd) { + if (!cbd->m_bSeparator) + hwndBtn = GetDlgItem(hdlg, cbd->m_dwButtonCID); + + if (hwndBtn && cbd->m_hIcon) + SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)Skin_GetIconByHandle(cbd->m_hIcon)); } + } +} - Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, false); +void BB_RefreshTheme(const TWindowData *dat) +{ + for (int i = 0; i < RButtonsList.getCount(); i++) { + CustomButtonData* cbd = RButtonsList[i]; + SendDlgItemMessage(dat->hwnd, cbd->m_dwButtonCID, WM_THEMECHANGED, 0, 0); + } + for (int i = 0; i < LButtonsList.getCount(); i++) { + CustomButtonData* cbd = LButtonsList[i]; + SendDlgItemMessage(dat->hwnd, cbd->m_dwButtonCID, WM_THEMECHANGED, 0, 0); + } +} - 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; +BOOL BB_SetButtonsPos(TWindowData *dat) +{ + if (!dat || !IsWindowVisible(dat->hwnd)) + return 0; - case WM_LBUTTONUP: - if (drag) { - TreeView_SetInsertMark(hToolBarTree, NULL, 0); - drag = 0; - ReleaseCapture(); + HWND hwnd = dat->hwnd; + RECT rect; + int i; + HWND hwndBtn = 0; - 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; + BYTE gap = DPISCALEX_S(PluginConfig.m_iButtonsBarGap); + bool showToolbar = !(dat->pContainer->dwFlags & CNT_HIDETOOLBAR); + bool bBottomToolbar = (dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR) != 0; - 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; - TCHAR 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 = SIZEOF(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; + HWND hwndToggleSideBar = GetDlgItem(hwnd, dat->bType == SESSIONTYPE_IM ? IDC_TOGGLESIDEBAR : IDC_CHAT_TOGGLESIDEBAR); + ShowWindow(hwndToggleSideBar, (showToolbar && dat->pContainer->SideBar->isActive()) ? SW_SHOW : SW_HIDE); - 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; + HDWP hdwp = BeginDeferWindowPos(LButtonsList.getCount() + RButtonsList.getCount() + 1); - 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); + mir_cslock lck(csToolBar); - switch (LOWORD(wParam)) { - case IDC_BBRESET: - CallService(MS_DB_MODULE_DELETE, NULL, LPARAM("TabSRMM_Toolbar")); - CB_HardReInit(); - BuildMenuObjectsTree(hToolBarTree); - break; + RECT rcSplitter; + GetWindowRect(GetDlgItem(hwnd, (dat->bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); - case IDC_SEPARATOR: - hti = TreeView_GetSelection(hToolBarTree); - if (!hti) - hti = TVI_FIRST; + POINT ptSplitter = { 0, rcSplitter.top }; + ScreenToClient(hwnd, &ptSplitter); - CustomButtonData *cbd = new CustomButtonData(); - cbd->bSeparator = cbd->bHidden = cbd->bIMButton = cbd->bLSided = true; - cbd->dwButtonOrigID = ++dwSepCount; - cbd->pszModuleName = "Tabsrmm_sep"; - cbd->iButtonWidth = 22; - cbd->opFlags = BBSF_NTBDESTRUCT; - LButtonsList.insert(cbd); + GetClientRect(hwnd, &rect); - TVINSERTSTRUCT tvis; - tvis.hParent = NULL; - tvis.hInsertAfter = hti; - tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; + int splitterY = (!bBottomToolbar) ? ptSplitter.y - DPISCALEY_S(1) : rect.bottom; + int tempL = dat->bbLSideWidth, tempR = dat->bbRSideWidth; + int lwidth = 0, rwidth = 0; + int iOff = DPISCALEY_S((PluginConfig.m_DPIscaleY > 1.0) ? (dat->bType == SESSIONTYPE_IM ? 22 : 23) : 22); - tvis.item.pszText = TranslateT(""); - tvis.item.iImage = tvis.item.iSelectedImage = -1; - tvis.item.lParam = (LPARAM)cbd; - hti = TreeView_InsertItem(hToolBarTree, &tvis); + int foravatar = 0; + if ((rect.bottom - ptSplitter.y - (rcSplitter.bottom - rcSplitter.top) /*- DPISCALEY(2)*/ - (bBottomToolbar ? DPISCALEY_S(24) : 0) < dat->pic.cy - DPISCALEY_S(2)) && dat->bShowAvatar && !PluginConfig.m_bAlwaysFullToolbarWidth) + foravatar = dat->pic.cx + gap; - TreeView_SetCheckState(hToolBarTree, hti, (cbd->bIMButton || cbd->bChatButton)); - } - break; + if ((dat->pContainer->dwFlags & CNT_SIDEBAR) && (dat->pContainer->SideBar->getFlags() & CSideBar::SIDEBARORIENTATION_LEFT)) { + if (NULL != hwndToggleSideBar) /* Wine fix. */ + hdwp = DeferWindowPos(hdwp, hwndToggleSideBar, NULL, 4, 2 + splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); + lwidth += 10; + tempL -= 10; + } - 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; + for (i = 0; i < LButtonsList.getCount(); i++) { + CustomButtonData *cbd = LButtonsList[i]; + if (((dat->bType == SESSIONTYPE_IM) && cbd->m_bIMButton) || ((dat->bType == SESSIONTYPE_CHAT) && cbd->m_bChatButton)) { + hwndBtn = GetDlgItem(hwnd, cbd->m_dwButtonCID); - case PSN_APPLY: - hti = TreeView_GetSelection(hToolBarTree); - if (hti) { - TVITEM tvi; - tvi.mask = TVIF_HANDLE | TVIF_PARAM; - tvi.hItem = hti; - TreeView_GetItem(hToolBarTree, &tvi); + if (!showToolbar) { + ShowWindow(hwndBtn, SW_HIDE); + if (NULL != hwndBtn) /* Wine fix. */ + hdwp = DeferWindowPos(hdwp, hwndBtn, NULL, lwidth, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); + if (IsWindowVisible(hwndBtn) || (cbd->m_bSeparator && !(cbd->m_bAutoHidden || cbd->m_bHidden))) + lwidth += cbd->m_iButtonWidth + gap; + if (!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn) && !cbd->m_bAutoHidden) + cbd->m_bAutoHidden = 1; + continue; + } + if (!cbd->m_bCanBeHidden && !cbd->m_bHidden && !(!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn) && !cbd->m_bAutoHidden)) { + ShowWindow(hwndBtn, SW_SHOW); + cbd->m_bAutoHidden = 0; + } - if (tvi.lParam) { - CustomButtonData *cbd = (CustomButtonData*)tvi.lParam; - if (cbd) { - cbd->bIMButton = IsDlgButtonChecked(hwndDlg, IDC_IMCHECK) != 0; - cbd->bChatButton = IsDlgButtonChecked(hwndDlg, IDC_CHATCHECK) != 0; - cbd->bCanBeHidden = IsDlgButtonChecked(hwndDlg, IDC_CANBEHIDDEN) != 0; - } - } - } + if (!cbd->m_bSeparator && !IsWindowVisible(hwndBtn) && !IsWindowEnabled(hwndBtn) && !cbd->m_bAutoHidden) + tempL -= cbd->m_iButtonWidth + gap; - SaveTree(hToolBarTree); - CB_ReInitCustomButtons(); - PluginConfig.m_iButtonsBarGap = (BYTE)SendDlgItemMessage(hwndDlg, IDC_SPIN1, UDM_GETPOS, 0, 0); + if (cbd->m_bCanBeHidden && !cbd->m_bHidden && (cbd->m_bSeparator || !((!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn)) && !cbd->m_bAutoHidden))) { + if (tempL + tempR > (rect.right - foravatar)) { + ShowWindow(hwndBtn, SW_HIDE); + cbd->m_bAutoHidden = 1; + tempL -= cbd->m_iButtonWidth + gap; + } + else if (cbd->m_bAutoHidden) { + ShowWindow(hwndBtn, SW_SHOW); + cbd->m_bAutoHidden = 0; + } + } + if (NULL != hwndBtn) /* Wine fix. */ + hdwp = DeferWindowPos(hdwp, hwndBtn, NULL, lwidth, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE);// SWP_NOCOPYBITS); + if (IsWindowVisible(hwndBtn) || (cbd->m_bSeparator && !(cbd->m_bAutoHidden || cbd->m_bHidden))) + lwidth += cbd->m_iButtonWidth + gap; + } + } - if (PluginConfig.m_iButtonsBarGap != M.GetByte("ButtonsBarGap", 1)) - M.BroadcastMessageAsync(WM_SIZE, 0, 0); + if ((dat->pContainer->dwFlags & CNT_SIDEBAR) && (dat->pContainer->SideBar->getFlags() & CSideBar::SIDEBARORIENTATION_RIGHT)) { + if (NULL != hwndToggleSideBar) /* Wine fix. */ + hdwp = DeferWindowPos(hdwp, hwndToggleSideBar, NULL, rect.right - foravatar - 10, 2 + splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); + rwidth += 12; + tempR -= 12; + } - db_set_b(0, SRMSGMOD_T, "ButtonsBarGap", PluginConfig.m_iButtonsBarGap); + for (i = 0; i < RButtonsList.getCount(); i++) { + CustomButtonData *cbd = RButtonsList[i]; + if (((dat->bType == SESSIONTYPE_IM) && cbd->m_bIMButton) || ((dat->bType == SESSIONTYPE_CHAT) && cbd->m_bChatButton)) { + hwndBtn = GetDlgItem(hwnd, cbd->m_dwButtonCID); - BuildMenuObjectsTree((HWND)hToolBarTree); - Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, false); - return 1; + if (!showToolbar) { + ShowWindow(hwndBtn, SW_HIDE); + if (IsWindowVisible(hwndBtn) || (cbd->m_bSeparator && !(cbd->m_bAutoHidden || cbd->m_bHidden))) + rwidth += cbd->m_iButtonWidth + gap; + if (NULL != hwndBtn) /* Wine fix. */ + hdwp = DeferWindowPos(hdwp, hwndBtn, NULL, rect.right - foravatar - rwidth + gap, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); + if (!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn) && !cbd->m_bAutoHidden) + cbd->m_bAutoHidden = 1; + continue; + } + if (!cbd->m_bCanBeHidden && !cbd->m_bHidden && !((!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn)) && !cbd->m_bAutoHidden)) { + ShowWindow(hwndBtn, SW_SHOW); + cbd->m_bAutoHidden = 0; } - break; - case IDC_TOOLBARTREE: - switch (((LPNMHDR)lParam)->code) { - case TVN_BEGINDRAGA: - case TVN_BEGINDRAGW: - SetCapture(hwndDlg); - drag = 1; - hDragItem = ((LPNMTREEVIEW)lParam)->itemNew.hItem; - TreeView_SelectItem(hToolBarTree, hDragItem); - break; + if (!cbd->m_bSeparator && !IsWindowVisible(hwndBtn) && !IsWindowEnabled(hwndBtn) && !cbd->m_bAutoHidden) + tempR -= cbd->m_iButtonWidth + gap; - case TVN_SELCHANGINGA: - case TVN_SELCHANGINGW: - hti = TreeView_GetSelection(hToolBarTree); - if (hti != NULL) { - TCHAR strbuf[128]; + if (cbd->m_bCanBeHidden && !cbd->m_bHidden && (cbd->m_bSeparator || !((!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn)) && !cbd->m_bAutoHidden))) { + if (tempL + tempR > (rect.right - foravatar)) { + ShowWindow(hwndBtn, SW_HIDE); + cbd->m_bAutoHidden = 1; + tempR -= cbd->m_iButtonWidth + gap; + } + else if (cbd->m_bAutoHidden) { + ShowWindow(hwndBtn, SW_SHOW); + cbd->m_bAutoHidden = 0; + } + } - TVITEM tvi; - tvi.hItem = hti; - tvi.pszText = strbuf; - tvi.cchTextMax = SIZEOF(strbuf); - tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_PARAM; - TreeView_GetItem(hToolBarTree, &tvi); + if (IsWindowVisible(hwndBtn) || (cbd->m_bSeparator && !(cbd->m_bAutoHidden || cbd->m_bHidden))) + rwidth += cbd->m_iButtonWidth + gap; + if (NULL != hwndBtn) /* Wine fix. */ + hdwp = DeferWindowPos(hdwp, hwndBtn, NULL, rect.right - foravatar - rwidth + gap, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); + } + } + return EndDeferWindowPos(hdwp); +} - if (tvi.lParam == 0 || !TreeView_GetCheckState(hToolBarTree, tvi.hItem) || !_tcscmp(tvi.pszText, MIDDLE_SEPARATOR)) - break; +void BB_CustomButtonClick(TWindowData *dat, DWORD idFrom, HWND hwndFrom, BOOL code) +{ + RECT rc; + int i; + BOOL bFromArrow = 0; + CustomButtonClickData cbcd = { 0 }; - CustomButtonData *cbd = (CustomButtonData*)tvi.lParam; - if (cbd) { - cbd->opFlags = (IsDlgButtonChecked(hwndDlg, IDC_IMCHECK)) ? BBSF_IMBUTTON : 0; - cbd->opFlags |= (IsDlgButtonChecked(hwndDlg, IDC_CHATCHECK)) ? BBSF_CHATBUTTON : 0; - cbd->opFlags |= (IsDlgButtonChecked(hwndDlg, IDC_CANBEHIDDEN)) ? BBSF_CANBEHIDDEN : 0; + GetWindowRect(hwndFrom, &rc); + cbcd.pt.x = rc.left; + cbcd.pt.y = rc.bottom; - cbd->bIMButton = IsDlgButtonChecked(hwndDlg, IDC_IMCHECK) != 0; - cbd->bChatButton = IsDlgButtonChecked(hwndDlg, IDC_CHATCHECK) != 0; - cbd->bCanBeHidden = IsDlgButtonChecked(hwndDlg, IDC_CANBEHIDDEN) != 0; - } - } - break; + for (i = 0; i < LButtonsList.getCount(); i++) { + CustomButtonData* cbd = LButtonsList[i]; + if (cbd->m_dwButtonCID == idFrom) { + cbcd.pszModule = cbd->m_pszModuleName; + cbcd.dwButtonId = cbd->m_dwButtonOrigID; + } + else if (cbd->m_dwArrowCID == idFrom) { + bFromArrow = 1; + cbcd.pszModule = cbd->m_pszModuleName; + cbcd.dwButtonId = cbd->m_dwButtonOrigID; + } + } - case TVN_SELCHANGEDW: - case TVN_SELCHANGEDA: - hti = TreeView_GetSelection(hToolBarTree); - if (hti != NULL) { - TCHAR strbuf[128]; + if (!cbcd.pszModule) + for (i = 0; i < RButtonsList.getCount(); i++) { + CustomButtonData* cbd = RButtonsList[i]; + if (cbd->m_dwButtonCID == idFrom) { + cbcd.pszModule = cbd->m_pszModuleName; + cbcd.dwButtonId = cbd->m_dwButtonOrigID; + } + else if (cbd->m_dwArrowCID == idFrom) { + bFromArrow = 1; + cbcd.pszModule = cbd->m_pszModuleName; + cbcd.dwButtonId = cbd->m_dwButtonOrigID; + } + } - TVITEM tvi; - tvi.pszText = strbuf; - tvi.cchTextMax = SIZEOF(strbuf); - tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_PARAM; - tvi.hItem = hti; - TreeView_GetItem(hToolBarTree, &tvi); + cbcd.cbSize = sizeof(CustomButtonClickData); + cbcd.hwndFrom = dat->hwnd; + cbcd.hContact = dat->hContact; + cbcd.flags = (code ? BBCF_RIGHTBUTTON : 0) | (GetKeyState(VK_SHIFT) & 0x8000 ? BBCF_SHIFTPRESSED : 0) | (GetKeyState(VK_CONTROL) & 0x8000 ? BBCF_CONTROLPRESSED : 0) | (bFromArrow ? BBCF_ARROWCLICKED : 0); - if (!TreeView_GetCheckState(hToolBarTree, tvi.hItem) || !_tcscmp(tvi.pszText, MIDDLE_SEPARATOR)) { - Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, false); - Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, false); - break; - } + NotifyEventHooks(hHookButtonPressedEvt, dat->hContact, (LPARAM)&cbcd); +} - if (tvi.lParam == 0) - break; +void CB_DestroyAllButtons(HWND hwndDlg) +{ + HWND hwndBtn = NULL; + for (int i = 0; i < LButtonsList.getCount(); i++) { + CustomButtonData *cbd = LButtonsList[i]; + hwndBtn = GetDlgItem(hwndDlg, cbd->m_dwButtonCID); + if (hwndBtn) + DestroyWindow(hwndBtn); + } - 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->bIMButton) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHATCHECK, (cbd->bChatButton) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CANBEHIDDEN, (cbd->bCanBeHidden) ? BST_CHECKED : BST_UNCHECKED); - } - } - break; + for (int i = 0; i < RButtonsList.getCount(); i++) { + CustomButtonData *cbd = RButtonsList[i]; + hwndBtn = GetDlgItem(hwndDlg, cbd->m_dwButtonCID); + if (hwndBtn) + DestroyWindow(hwndBtn); + } +} - 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; +void CB_DestroyButton(HWND hwndDlg, TWindowData *dat, DWORD dwButtonCID, DWORD dwFlags) +{ + HWND hwndBtn = GetDlgItem(hwndDlg, dwButtonCID); + RECT rc = { 0 }; + if (hwndBtn) { + GetClientRect(hwndBtn, &rc); + if (dwFlags & BBBF_ISLSIDEBUTTON) + dat->bbLSideWidth -= rc.right; + else if (dwFlags & BBBF_ISRSIDEBUTTON) + dat->bbRSideWidth -= rc.right; - 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; + DestroyWindow(hwndBtn); + BB_SetButtonsPos(dat); } +} - return FALSE; +void CB_ChangeButton(HWND hwndDlg, TWindowData *dat, CustomButtonData *cbd) +{ + HWND hwndBtn = GetDlgItem(hwndDlg, cbd->m_dwButtonCID); + if (hwndBtn) { + if (cbd->m_hIcon) + SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)Skin_GetIconByHandle(cbd->m_hIcon)); + if (cbd->m_ptszTooltip) + SendMessage(hwndBtn, BUTTONADDTOOLTIP, (WPARAM)cbd->m_ptszTooltip, BATF_TCHAR); + SendMessage(hwndBtn, BUTTONSETCONTAINER, (LPARAM)dat->pContainer, 0); + SetWindowTextA(hwndBtn, cbd->m_pszModuleName); + } } + +///////////////////////////////////////////////////////////////////////////////////////// +// Module init procedure + +void CB_InitCustomButtons() +{ + dwSepCount = M.GetDword("TabSRMM_Toolbar", "SeparatorsCount", 0); + + hButtonsBarAddButton = CreateServiceFunction(MS_BB_ADDBUTTON, CB_AddButton); + hButtonsBarRemoveButton = CreateServiceFunction(MS_BB_REMOVEBUTTON, CB_RemoveButton); + hButtonsBarModifyButton = CreateServiceFunction(MS_BB_MODIFYBUTTON, CB_ModifyButton); + hButtonsBarGetButtonState = CreateServiceFunction(MS_BB_GETBUTTONSTATE, CB_GetButtonState); + hButtonsBarSetButtonState = CreateServiceFunction(MS_BB_SETBUTTONSTATE, CB_SetButtonState); + + hHookToolBarLoadedEvt = CreateHookableEvent(ME_MSG_TOOLBARLOADED); + hHookButtonPressedEvt = CreateHookableEvent(ME_MSG_BUTTONPRESSED); +} + +void CB_DeInitCustomButtons() +{ + wipeList(LButtonsList); + wipeList(RButtonsList); + + DestroyHookableEvent(hHookToolBarLoadedEvt); + DestroyHookableEvent(hHookButtonPressedEvt); + DestroyServiceFunction(hButtonsBarAddButton); + DestroyServiceFunction(hButtonsBarRemoveButton); + DestroyServiceFunction(hButtonsBarModifyButton); + DestroyServiceFunction(hButtonsBarGetButtonState); + DestroyServiceFunction(hButtonsBarSetButtonState); +} + diff --git a/plugins/TabSRMM/src/generic_msghandlers.h b/plugins/TabSRMM/src/generic_msghandlers.h index 40fc324e76..5b2812f9c1 100644 --- a/plugins/TabSRMM/src/generic_msghandlers.h +++ b/plugins/TabSRMM/src/generic_msghandlers.h @@ -44,9 +44,6 @@ void TSAPI DM_NotifyTyping(TWindowData *dat, int mode); int TSAPI DM_SplitterGlobalEvent(TWindowData *dat, WPARAM wParam, LPARAM lParam); void TSAPI BB_InitDlgButtons(TWindowData *dat); -BOOL TSAPI BB_SetButtonsPos(TWindowData *dat); -void TSAPI BB_RedrawButtons(TWindowData *dat); -void TSAPI BB_CustomButtonClick(TWindowData *dat, DWORD idFrom, HWND hwndFrom, BOOL code); void TSAPI DM_EventAdded(TWindowData *dat, WPARAM wParam, LPARAM lParam); void TSAPI DM_InitRichEdit(TWindowData *dat); LRESULT TSAPI DM_ContainerCmdHandler(TContainerData *pContainer, UINT cmd, WPARAM wParam, LPARAM lParam); diff --git a/plugins/TabSRMM/src/msgdialog.cpp b/plugins/TabSRMM/src/msgdialog.cpp index e0648f09e3..46b54a9efc 100644 --- a/plugins/TabSRMM/src/msgdialog.cpp +++ b/plugins/TabSRMM/src/msgdialog.cpp @@ -1307,16 +1307,11 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP BB_InitDlgButtons(dat); SendMessage(hwndDlg, DM_LOADBUTTONBARICONS, 0, 0); - BOOL isThemed = TRUE; - if (CSkin::m_skinEnabled && !SkinItems[ID_EXTBKBUTTONSNPRESSED].IGNORED && - !SkinItems[ID_EXTBKBUTTONSPRESSED].IGNORED && !SkinItems[ID_EXTBKBUTTONSMOUSEOVER].IGNORED) - isThemed = FALSE; - SendDlgItemMessage(hwndDlg, IDC_ADD, BUTTONSETASFLATBTN, TRUE, 0); SendDlgItemMessage(hwndDlg, IDC_CANCELADD, BUTTONSETASFLATBTN, TRUE, 0); SendDlgItemMessage(hwndDlg, IDC_TOGGLESIDEBAR, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_TOGGLESIDEBAR, BUTTONSETASTHEMEDBTN, isThemed, 0); + SendDlgItemMessage(hwndDlg, IDC_TOGGLESIDEBAR, BUTTONSETASTHEMEDBTN, CSkin::IsThemed(), 0); SendDlgItemMessage(hwndDlg, IDC_TOGGLESIDEBAR, BUTTONSETCONTAINER, (LPARAM)m_pContainer, 0); SendDlgItemMessage(hwndDlg, IDC_TOGGLESIDEBAR, BUTTONSETASTOOLBARBUTTON, TRUE, 0); @@ -1570,12 +1565,10 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP case WM_PAINT: // in skinned mode only, draw the background elements for the 2 richedit controls // this allows border-less textboxes to appear "skinned" and blended with the background - { PAINTSTRUCT ps; BeginPaint(hwndDlg, &ps); EndPaint(hwndDlg, &ps); - } - return 0; + return 0; case WM_SIZE: if (!IsIconic(hwndDlg)) { @@ -1754,32 +1747,32 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP CWarning::show(CWarning::WARN_NO_SENDLATER, MB_OK | MB_ICONINFORMATION, TranslateT("Configuration issue|The unattended send feature is disabled. The \\b1 send later\\b0 and \\b1 send to multiple contacts\\b0 features depend on it.\n\nYou must enable it under \\b1Options->Message sessions->Advanced tweaks\\b0. Changing this option requires a restart.")); return _dlgReturn(hwndDlg, 1); case TABSRMM_HK_TOGGLERTL: - { - DWORD dwGlobal = M.GetDword("mwflags", MWF_LOG_DEFAULT); - DWORD dwMask = M.GetDword(dat->hContact, "mwmask", 0); - DWORD dwFlags = M.GetDword(dat->hContact, "mwflags", 0); - dat->dwFlags ^= MWF_LOG_RTL; - if ((dwGlobal & MWF_LOG_RTL) != (dat->dwFlags & MWF_LOG_RTL)) { - dwMask |= MWF_LOG_RTL; - dwFlags |= (dat->dwFlags & MWF_LOG_RTL); - } - else { - dwMask &= ~MWF_LOG_RTL; - dwFlags &= ~MWF_LOG_RTL; - } - if (dwMask) { - db_set_dw(dat->hContact, SRMSGMOD_T, "mwmask", dwMask); - db_set_dw(dat->hContact, SRMSGMOD_T, "mwflags", dwFlags); - } - else { - db_unset(dat->hContact, SRMSGMOD_T, "mwmask"); - db_unset(dat->hContact, SRMSGMOD_T, "mwflags"); + { + DWORD dwGlobal = M.GetDword("mwflags", MWF_LOG_DEFAULT); + DWORD dwMask = M.GetDword(dat->hContact, "mwmask", 0); + DWORD dwFlags = M.GetDword(dat->hContact, "mwflags", 0); + + if ((dwGlobal & MWF_LOG_RTL) != (dat->dwFlags & MWF_LOG_RTL)) { + dwMask |= MWF_LOG_RTL; + dwFlags |= (dat->dwFlags & MWF_LOG_RTL); + } + else { + dwMask &= ~MWF_LOG_RTL; + dwFlags &= ~MWF_LOG_RTL; + } + if (dwMask) { + db_set_dw(dat->hContact, SRMSGMOD_T, "mwmask", dwMask); + db_set_dw(dat->hContact, SRMSGMOD_T, "mwflags", dwFlags); + } + else { + db_unset(dat->hContact, SRMSGMOD_T, "mwmask"); + db_unset(dat->hContact, SRMSGMOD_T, "mwflags"); + } + SendMessage(hwndDlg, DM_OPTIONSAPPLIED, 0, 0); + SendMessage(hwndDlg, DM_DEFERREDREMAKELOG, (WPARAM)hwndDlg, 0); } - SendMessage(hwndDlg, DM_OPTIONSAPPLIED, 0, 0); - SendMessage(hwndDlg, DM_DEFERREDREMAKELOG, (WPARAM)hwndDlg, 0); - } - return _dlgReturn(hwndDlg, 1); + return _dlgReturn(hwndDlg, 1); case TABSRMM_HK_TOGGLEMULTISEND: dat->sendMode ^= SMODE_MULTIPLE; @@ -1990,16 +1983,16 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP } switch (msg) { case WM_LBUTTONDOWN: - { - HCURSOR hCur = GetCursor(); - m_pContainer->MenuBar->Cancel(); - if (hCur == LoadCursor(NULL, IDC_SIZENS) || hCur == LoadCursor(NULL, IDC_SIZEWE) - || hCur == LoadCursor(NULL, IDC_SIZENESW) || hCur == LoadCursor(NULL, IDC_SIZENWSE)) { - SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE); - return TRUE; + { + HCURSOR hCur = GetCursor(); + m_pContainer->MenuBar->Cancel(); + if (hCur == LoadCursor(NULL, IDC_SIZENS) || hCur == LoadCursor(NULL, IDC_SIZEWE) + || hCur == LoadCursor(NULL, IDC_SIZENESW) || hCur == LoadCursor(NULL, IDC_SIZENWSE)) { + SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE); + return TRUE; + } } break; - } // auto-select-and-copy handling... // if enabled, releasing the lmb with an active selection automatically copies the selection @@ -2343,19 +2336,19 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP return 0; case DM_SCROLLIEVIEW: - { - IEVIEWWINDOW iew = { sizeof(iew) }; - iew.iType = IEW_SCROLLBOTTOM; - if (dat->hwndIEView) { - iew.hwnd = dat->hwndIEView; - CallService(MS_IEVIEW_WINDOW, 0, (LPARAM)&iew); - } - else if (dat->hwndHPP) { - iew.hwnd = dat->hwndHPP; - CallService(MS_HPP_EG_WINDOW, 0, (LPARAM)&iew); + { + IEVIEWWINDOW iew = { sizeof(iew) }; + iew.iType = IEW_SCROLLBOTTOM; + if (dat->hwndIEView) { + iew.hwnd = dat->hwndIEView; + CallService(MS_IEVIEW_WINDOW, 0, (LPARAM)&iew); + } + else if (dat->hwndHPP) { + iew.hwnd = dat->hwndHPP; + CallService(MS_HPP_EG_WINDOW, 0, (LPARAM)&iew); + } } - } - return 0; + return 0; case HM_DBEVENTADDED: // this is called whenever a new event has been added to the database. @@ -2477,32 +2470,32 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP } return 0; - // return timestamp (in ticks) of last recent message which has not been read yet. - // 0 if there is none - // lParam = pointer to a dword receiving the value. + // return timestamp (in ticks) of last recent message which has not been read yet. + // 0 if there is none + // lParam = pointer to a dword receiving the value. case DM_QUERYLASTUNREAD: - { - DWORD *pdw = (DWORD *)lParam; - if (pdw) - *pdw = dat->dwTickLastEvent; - } - return 0; + { + DWORD *pdw = (DWORD *)lParam; + if (pdw) + *pdw = dat->dwTickLastEvent; + } + return 0; case DM_QUERYCONTAINER: - { - TContainerData **pc = (TContainerData **)lParam; - if (pc) - *pc = m_pContainer; - } - return 0; + { + TContainerData **pc = (TContainerData **)lParam; + if (pc) + *pc = m_pContainer; + } + return 0; case DM_QUERYHCONTACT: - { - MCONTACT *phContact = (MCONTACT*)lParam; - if (phContact) - *phContact = dat->hContact; - } - return 0; + { + MCONTACT *phContact = (MCONTACT*)lParam; + if (phContact) + *phContact = dat->hContact; + } + return 0; case DM_UPDATELASTMESSAGE: DM_UpdateLastMessage(dat); @@ -2572,48 +2565,48 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP break; case WM_RBUTTONUP: - { - RECT rcPicture, rcPanelNick = { 0 }; - int menuID = 0; + { + RECT rcPicture, rcPanelNick = { 0 }; + int menuID = 0; - GetWindowRect(GetDlgItem(hwndDlg, IDC_CONTACTPIC), &rcPicture); - rcPanelNick.left = rcPanelNick.right - 30; - GetCursorPos(&pt); + GetWindowRect(GetDlgItem(hwndDlg, IDC_CONTACTPIC), &rcPicture); + rcPanelNick.left = rcPanelNick.right - 30; + GetCursorPos(&pt); - if (dat->Panel->invokeConfigDialog(pt)) - break; + if (dat->Panel->invokeConfigDialog(pt)) + break; - if (PtInRect(&rcPicture, pt)) - menuID = MENU_PICMENU; + if (PtInRect(&rcPicture, pt)) + menuID = MENU_PICMENU; - if ((menuID == MENU_PICMENU && ((dat->ace ? dat->ace->hbmPic : PluginConfig.g_hbmUnknown) || dat->hOwnPic) && dat->bShowAvatar != 0)) { - HMENU submenu = GetSubMenu(m_pContainer->hMenuContext, 1); - GetCursorPos(&pt); - MsgWindowUpdateMenu(dat, submenu, menuID); - int iSelection = TrackPopupMenu(submenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL); - MsgWindowMenuHandler(dat, iSelection, menuID); - break; - } + if ((menuID == MENU_PICMENU && ((dat->ace ? dat->ace->hbmPic : PluginConfig.g_hbmUnknown) || dat->hOwnPic) && dat->bShowAvatar != 0)) { + HMENU submenu = GetSubMenu(m_pContainer->hMenuContext, 1); + GetCursorPos(&pt); + MsgWindowUpdateMenu(dat, submenu, menuID); + int iSelection = TrackPopupMenu(submenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL); + MsgWindowMenuHandler(dat, iSelection, menuID); + break; + } - HMENU subMenu = GetSubMenu(m_pContainer->hMenuContext, 0); - MsgWindowUpdateMenu(dat, subMenu, MENU_TABCONTEXT); + HMENU subMenu = GetSubMenu(m_pContainer->hMenuContext, 0); + MsgWindowUpdateMenu(dat, subMenu, MENU_TABCONTEXT); - int iSelection = TrackPopupMenu(subMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL); - if (iSelection >= IDM_CONTAINERMENU) { - char szIndex[10]; - char *szKey = "TAB_ContainersW"; + int iSelection = TrackPopupMenu(subMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL); + if (iSelection >= IDM_CONTAINERMENU) { + char szIndex[10]; + char *szKey = "TAB_ContainersW"; - mir_snprintf(szIndex, SIZEOF(szIndex), "%d", iSelection - IDM_CONTAINERMENU); - if (iSelection - IDM_CONTAINERMENU >= 0) { - ptrT val(db_get_tsa(NULL, szKey, szIndex)); - if (val) - SendMessage(hwndDlg, DM_CONTAINERSELECTED, 0, (LPARAM)val); + mir_snprintf(szIndex, SIZEOF(szIndex), "%d", iSelection - IDM_CONTAINERMENU); + if (iSelection - IDM_CONTAINERMENU >= 0) { + ptrT val(db_get_tsa(NULL, szKey, szIndex)); + if (val) + SendMessage(hwndDlg, DM_CONTAINERSELECTED, 0, (LPARAM)val); + } + break; } - break; + MsgWindowMenuHandler(dat, iSelection, MENU_TABCONTEXT); } - MsgWindowMenuHandler(dat, iSelection, MENU_TABCONTEXT); - } - break; + break; case WM_MOUSEMOVE: GetCursorPos(&pt); @@ -2622,15 +2615,15 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP break; case WM_MEASUREITEM: - { - LPMEASUREITEMSTRUCT lpmi = (LPMEASUREITEMSTRUCT)lParam; - if (dat->Panel->isHovered()) { - lpmi->itemHeight = 0; - lpmi->itemWidth = 6; - return TRUE; + { + LPMEASUREITEMSTRUCT lpmi = (LPMEASUREITEMSTRUCT)lParam; + if (dat->Panel->isHovered()) { + lpmi->itemHeight = 0; + lpmi->itemWidth = 6; + return TRUE; + } } - } - return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); + return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); case WM_NCHITTEST: SendMessage(hwndContainer, WM_NCHITTEST, wParam, lParam); @@ -2640,14 +2633,14 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP return MsgWindowDrawHandler(wParam, lParam, dat); case WM_APPCOMMAND: - { - DWORD cmd = GET_APPCOMMAND_LPARAM(lParam); - if (cmd == APPCOMMAND_BROWSER_BACKWARD || cmd == APPCOMMAND_BROWSER_FORWARD) { - SendMessage(hwndContainer, DM_SELECTTAB, cmd == APPCOMMAND_BROWSER_BACKWARD ? DM_SELECT_PREV : DM_SELECT_NEXT, 0); - return 1; + { + DWORD cmd = GET_APPCOMMAND_LPARAM(lParam); + if (cmd == APPCOMMAND_BROWSER_BACKWARD || cmd == APPCOMMAND_BROWSER_FORWARD) { + SendMessage(hwndContainer, DM_SELECTTAB, cmd == APPCOMMAND_BROWSER_BACKWARD ? DM_SELECT_PREV : DM_SELECT_NEXT, 0); + return 1; + } } - } - break; + break; case WM_COMMAND: if (!dat) diff --git a/plugins/TabSRMM/src/msgdlgutils.cpp b/plugins/TabSRMM/src/msgdlgutils.cpp index 394bad89f2..60723882b5 100644 --- a/plugins/TabSRMM/src/msgdlgutils.cpp +++ b/plugins/TabSRMM/src/msgdlgutils.cpp @@ -254,7 +254,8 @@ int TSAPI MsgWindowUpdateMenu(TWindowData *dat, HMENU submenu, int menuID) bool bInfoPanel = dat->Panel->isActive(); if (menuID == MENU_TABCONTEXT) { - EnableMenuItem(submenu, ID_TABMENU_ATTACHTOCONTAINER, M.GetByte("useclistgroups", 0) || M.GetByte("singlewinmode", 0) ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(submenu, ID_TABMENU_LEAVECHATROOM, (dat->bType == SESSIONTYPE_CHAT && ProtoServiceExists(dat->szProto, PS_LEAVECHAT)) ? MF_ENABLED : MF_DISABLED); + EnableMenuItem(submenu, ID_TABMENU_ATTACHTOCONTAINER, (M.GetByte("useclistgroups", 0) || M.GetByte("singlewinmode", 0)) ? MF_GRAYED : MF_ENABLED); EnableMenuItem(submenu, ID_TABMENU_CLEARSAVEDTABPOSITION, (M.GetDword(dat->hContact, "tabindex", -1) != -1) ? MF_ENABLED : MF_GRAYED); } else if (menuID == MENU_PICMENU) { @@ -332,7 +333,7 @@ int TSAPI MsgWindowMenuHandler(TWindowData *dat, int selection, int menuId) case ID_TABMENU_LEAVECHATROOM: if (dat && dat->bType == SESSIONTYPE_CHAT) { SESSION_INFO *si = dat->si; - if ((si != NULL) && (dat->hContact != NULL)) { + if (si != NULL && dat->hContact != NULL) { char *szProto = GetContactProto(dat->hContact); if (szProto) CallProtoService(szProto, PS_LEAVECHAT, dat->hContact, 0); diff --git a/plugins/TabSRMM/src/themes.cpp b/plugins/TabSRMM/src/themes.cpp index 8829380568..d32fd28c82 100644 --- a/plugins/TabSRMM/src/themes.cpp +++ b/plugins/TabSRMM/src/themes.cpp @@ -2504,3 +2504,10 @@ void CSkin::FillBack(const HDC hdc, RECT* rc) else ::FillRect(hdc, rc, GetSysColorBrush(COLOR_3DFACE)); } + +///////////////////////////////////////////////////////////////////////////////////////// + +bool CSkin::IsThemed() +{ + return !(m_skinEnabled && !SkinItems[ID_EXTBKBUTTONSNPRESSED].IGNORED && !SkinItems[ID_EXTBKBUTTONSPRESSED].IGNORED && !SkinItems[ID_EXTBKBUTTONSMOUSEOVER].IGNORED); +} diff --git a/plugins/TabSRMM/src/themes.h b/plugins/TabSRMM/src/themes.h index eadcd8239e..e115a1ccd8 100644 --- a/plugins/TabSRMM/src/themes.h +++ b/plugins/TabSRMM/src/themes.h @@ -302,6 +302,7 @@ public: static bool __fastcall DrawItem(const HDC hdc, const RECT *rc, const CSkinItem *item); static void TSAPI UpdateToolbarBG(TWindowData *dat); static void TSAPI FillBack(const HDC hdc, RECT* rc); + static bool TSAPI IsThemed(void); public: static bool m_DisableScrollbars, m_bClipBorder; diff --git a/plugins/TabSRMM/src/version.h b/plugins/TabSRMM/src/version.h index dbc32d2397..639fb59ad0 100644 --- a/plugins/TabSRMM/src/version.h +++ b/plugins/TabSRMM/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 3 #define __MINOR_VERSION 4 #define __RELEASE_NUM 0 -#define __BUILD_NUM 9 +#define __BUILD_NUM 10 #include -- cgit v1.2.3