From 76cbb63e192079281d7c4b51ed8318b245b6b39b Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 28 Feb 2017 22:50:58 +0300 Subject: TabSrmm -> UI classes --- plugins/TabSRMM/res/chat.rc | 5 +- plugins/TabSRMM/src/TSButton.cpp | 8 +- plugins/TabSRMM/src/buttonbar.h | 11 - plugins/TabSRMM/src/buttonsbar.cpp | 88 +- plugins/TabSRMM/src/chat/chat.h | 12 +- plugins/TabSRMM/src/chat/chat_resource.h | 4 +- plugins/TabSRMM/src/chat/log.cpp | 13 +- plugins/TabSRMM/src/chat/main.cpp | 4 +- plugins/TabSRMM/src/chat/services.cpp | 17 +- plugins/TabSRMM/src/chat/tools.cpp | 14 +- plugins/TabSRMM/src/chat/window.cpp | 1358 ++++++++------- plugins/TabSRMM/src/contactcache.cpp | 4 +- plugins/TabSRMM/src/contactcache.h | 8 +- plugins/TabSRMM/src/container.cpp | 70 +- plugins/TabSRMM/src/controls.cpp | 32 +- plugins/TabSRMM/src/eventpopups.cpp | 10 +- plugins/TabSRMM/src/functions.h | 19 +- plugins/TabSRMM/src/generic_msghandlers.cpp | 504 +++--- plugins/TabSRMM/src/generic_msghandlers.h | 41 +- plugins/TabSRMM/src/globals.cpp | 6 +- plugins/TabSRMM/src/globals.h | 2 +- plugins/TabSRMM/src/hotkeyhandler.cpp | 18 +- plugins/TabSRMM/src/infopanel.cpp | 328 ++-- plugins/TabSRMM/src/infopanel.h | 8 +- plugins/TabSRMM/src/mim.cpp | 4 +- plugins/TabSRMM/src/msgdialog.cpp | 2391 +++++++++++++-------------- plugins/TabSRMM/src/msgdlgutils.cpp | 852 +++++----- plugins/TabSRMM/src/msgdlgutils.h | 42 +- plugins/TabSRMM/src/msglog.cpp | 81 +- plugins/TabSRMM/src/msgs.cpp | 57 +- plugins/TabSRMM/src/msgs.h | 178 +- plugins/TabSRMM/src/selectcontainer.cpp | 2 +- plugins/TabSRMM/src/sendqueue.cpp | 108 +- plugins/TabSRMM/src/sendqueue.h | 28 +- plugins/TabSRMM/src/sidebar.cpp | 66 +- plugins/TabSRMM/src/sidebar.h | 24 +- plugins/TabSRMM/src/stdafx.h | 4 +- plugins/TabSRMM/src/tabctrl.cpp | 46 +- plugins/TabSRMM/src/taskbar.cpp | 30 +- plugins/TabSRMM/src/taskbar.h | 12 +- plugins/TabSRMM/src/templates.cpp | 20 +- plugins/TabSRMM/src/themeio.cpp | 2 +- plugins/TabSRMM/src/themes.cpp | 176 +- plugins/TabSRMM/src/themes.h | 18 +- plugins/TabSRMM/src/userprefs.cpp | 67 +- plugins/TabSRMM/src/utils.cpp | 32 +- plugins/TabSRMM/src/utils.h | 12 +- plugins/TabSRMM/src/version.h | 6 +- 48 files changed, 3346 insertions(+), 3496 deletions(-) (limited to 'plugins') diff --git a/plugins/TabSRMM/res/chat.rc b/plugins/TabSRMM/res/chat.rc index 83d84cb11e..b19880376f 100644 --- a/plugins/TabSRMM/res/chat.rc +++ b/plugins/TabSRMM/res/chat.rc @@ -1,6 +1,7 @@ // Microsoft Visual C++ generated resource script. // #include "..\src\chat\chat_resource.h" +#include "..\src\resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// @@ -30,8 +31,8 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "",IDC_SPLITTERX,"Static",SS_ENHMETAFILE,172,23,10,73 CONTROL "",IDC_SPLITTERY,"Static",SS_ENHMETAFILE,0,132,251,6 - CONTROL "",IDC_CHAT_MESSAGE,"RichEdit50W",WS_VSCROLL | WS_TABSTOP | 0x1144,0,128,127,12,WS_EX_STATICEDGE - CONTROL "",IDC_CHAT_LOG,"RichEdit50W",WS_VSCROLL | 0x844,8,23,164,72,WS_EX_STATICEDGE + CONTROL "",IDC_MESSAGE,"RichEdit50W",WS_VSCROLL | WS_TABSTOP | 0x1144,0,128,127,12,WS_EX_STATICEDGE + CONTROL "",IDC_LOG,"RichEdit50W",WS_VSCROLL | 0x844,8,23,164,72,WS_EX_STATICEDGE LISTBOX IDC_LIST,182,23,69,73,LBS_MULTIPLESEL | LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | LBS_NODATA | NOT WS_BORDER | WS_VSCROLL | WS_TABSTOP,WS_EX_STATICEDGE CONTROL "",IDC_PANELSPLITTER,"Static",SS_ENHMETAFILE,0,32,252,1,WS_EX_TRANSPARENT END diff --git a/plugins/TabSRMM/src/TSButton.cpp b/plugins/TabSRMM/src/TSButton.cpp index 8a0825003b..c43e67ece5 100644 --- a/plugins/TabSRMM/src/TSButton.cpp +++ b/plugins/TabSRMM/src/TSButton.cpp @@ -97,7 +97,7 @@ static void PaintWorker(TSButtonCtrl *ctl, HDC hdcPaint) if (ctl == NULL || hdcPaint == NULL) return; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(GetParent(ctl->hwnd), GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(GetParent(ctl->hwnd), GWLP_USERDATA); if (dat == NULL) return; @@ -154,7 +154,7 @@ static void PaintWorker(TSButtonCtrl *ctl, HDC hdcPaint) GetWindowRect(ctl->hwnd, &rcWin); POINT pt; pt.x = rcWin.left; - ScreenToClient(dat->hwnd, &pt); + ScreenToClient(dat->GetHwnd(), &pt); BitBlt(hdcMem, 0, 0, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, dat->pContainer->cachedToolbarDC, pt.x, 1, SRCCOPY); } @@ -420,7 +420,7 @@ static LRESULT CALLBACK TSButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, L case WM_MBUTTONUP: if (bct->sitem) if (bct->sitem->getDat()) - SendMessage(bct->sitem->getDat()->hwnd, WM_CLOSE, 1, 0); + SendMessage(bct->sitem->getDat()->GetHwnd(), WM_CLOSE, 1, 0); break; case WM_LBUTTONDOWN: @@ -451,7 +451,7 @@ static LRESULT CALLBACK TSButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, L case WM_LBUTTONUP: if (bct->sitem) { if (bct->sitem->testCloseButton() != -1) { - SendMessage(bct->sitem->getDat()->hwnd, WM_CLOSE, 1, 0); + SendMessage(bct->sitem->getDat()->GetHwnd(), WM_CLOSE, 1, 0); return TRUE; } } diff --git a/plugins/TabSRMM/src/buttonbar.h b/plugins/TabSRMM/src/buttonbar.h index b29538554e..d0863d6b65 100644 --- a/plugins/TabSRMM/src/buttonbar.h +++ b/plugins/TabSRMM/src/buttonbar.h @@ -1,17 +1,6 @@ #ifndef _BUTTONSBAR_H #define _BUTTONSBAR_H -struct TWindowData; - void CB_InitCustomButtons(); -void BB_InitDlgButtons(TWindowData *dat); -void BB_RefreshTheme(const TWindowData *dat); -BOOL BB_SetButtonsPos(TWindowData *dat); -void BB_RedrawButtons(TWindowData *dat); - -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); - #endif diff --git a/plugins/TabSRMM/src/buttonsbar.cpp b/plugins/TabSRMM/src/buttonsbar.cpp index 0c9c79ba8f..8af676e0e0 100644 --- a/plugins/TabSRMM/src/buttonsbar.cpp +++ b/plugins/TabSRMM/src/buttonsbar.cpp @@ -140,42 +140,36 @@ static int CB_InitDefaultButtons(WPARAM, LPARAM) return 0; } -void BB_InitDlgButtons(TWindowData *dat) +void CTabBaseDlg::BB_InitDlgButtons() { - if (dat == 0) - return; - HWND hdlg = dat->hwnd; - if (hdlg == 0) - return; - BYTE gap = DPISCALEX_S(db_get_b(NULL, SRMSGMOD, "ButtonsBarGap", 1)); RECT rcSplitter; - GetWindowRect(GetDlgItem(hdlg, (dat->bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); + GetWindowRect(GetDlgItem(m_hwnd, (bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); POINT ptSplitter = { 0, rcSplitter.top }; - ScreenToClient(hdlg, &ptSplitter); + ScreenToClient(m_hwnd, &ptSplitter); RECT rect; - GetClientRect(hdlg, &rect); + GetClientRect(m_hwnd, &rect); - dat->bbLSideWidth = dat->bbRSideWidth = 0; + bbLSideWidth = bbRSideWidth = 0; - Srmm_CreateToolbarIcons(hdlg, (dat->bType == SESSIONTYPE_IM) ? BBBF_ISIMBUTTON : BBBF_ISCHATBUTTON); + Srmm_CreateToolbarIcons(m_hwnd, (bType == SESSIONTYPE_IM) ? BBBF_ISIMBUTTON : BBBF_ISCHATBUTTON); CustomButtonData *cbd; for (int i = 0; cbd = Srmm_GetNthButton(i); i++) { - HWND hwndButton = GetDlgItem(hdlg, cbd->m_dwButtonCID); + HWND hwndButton = GetDlgItem(m_hwnd, cbd->m_dwButtonCID); if (hwndButton == NULL) continue; if (!cbd->m_bHidden) { if (cbd->m_bRSided) - dat->bbRSideWidth += cbd->m_iButtonWidth + gap; + bbRSideWidth += cbd->m_iButtonWidth + gap; else - dat->bbLSideWidth += cbd->m_iButtonWidth + gap; + bbLSideWidth += cbd->m_iButtonWidth + gap; } if (!cbd->m_bHidden && !cbd->m_bCanBeHidden) - dat->iButtonBarReallyNeeds += cbd->m_iButtonWidth + gap; + iButtonBarReallyNeeds += cbd->m_iButtonWidth + gap; if (cbd->m_bSeparator) continue; @@ -186,47 +180,47 @@ void BB_InitDlgButtons(TWindowData *dat) SendMessage(hwndButton, BUTTONSETARROW, (cbd->m_dwButtonCID == IDOK) ? IDC_SENDMENU : cbd->m_dwArrowCID, 0); SendMessage(hwndButton, BUTTONSETASTHEMEDBTN, CSkin::IsThemed(), 0); - SendMessage(hwndButton, BUTTONSETCONTAINER, (LPARAM)dat->pContainer, 0); + SendMessage(hwndButton, BUTTONSETCONTAINER, (LPARAM)pContainer, 0); SendMessage(hwndButton, BUTTONSETASTOOLBARBUTTON, TRUE, 0); } } -void BB_RedrawButtons(TWindowData *dat) +void CTabBaseDlg::BB_RedrawButtons() { - Srmm_RedrawToolbarIcons(dat->hwnd); + Srmm_RedrawToolbarIcons(m_hwnd); - HWND hwndToggleSideBar = GetDlgItem(dat->hwnd, IDC_TOGGLESIDEBAR); + HWND hwndToggleSideBar = GetDlgItem(m_hwnd, IDC_TOGGLESIDEBAR); if (hwndToggleSideBar && IsWindow(hwndToggleSideBar)) InvalidateRect(hwndToggleSideBar, 0, TRUE); } -void BB_RefreshTheme(const TWindowData *dat) +void CTabBaseDlg::BB_RefreshTheme() { CustomButtonData *cbd; for (int i = 0; cbd = Srmm_GetNthButton(i); i++) - SendDlgItemMessage(dat->hwnd, cbd->m_dwButtonCID, WM_THEMECHANGED, 0, 0); + SendDlgItemMessage(m_hwnd, cbd->m_dwButtonCID, WM_THEMECHANGED, 0, 0); } -BOOL BB_SetButtonsPos(TWindowData *dat) +BOOL CTabBaseDlg::BB_SetButtonsPos() { - if (!dat || !IsWindowVisible(dat->hwnd)) + if (!m_hwnd || !IsWindowVisible(m_hwnd)) return 0; - HWND hwnd = dat->hwnd; + HWND hwnd = m_hwnd; RECT rect; HWND hwndButton = 0; BYTE gap = DPISCALEX_S(db_get_b(NULL, SRMSGMOD, "ButtonsBarGap", 1)); - bool showToolbar = !(dat->pContainer->dwFlags & CNT_HIDETOOLBAR); - bool bBottomToolbar = (dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR) != 0; + bool showToolbar = !(pContainer->dwFlags & CNT_HIDETOOLBAR); + bool bBottomToolbar = (pContainer->dwFlags & CNT_BOTTOMTOOLBAR) != 0; HWND hwndToggleSideBar = GetDlgItem(hwnd, IDC_TOGGLESIDEBAR); - ShowWindow(hwndToggleSideBar, (showToolbar && dat->pContainer->SideBar->isActive()) ? SW_SHOW : SW_HIDE); + ShowWindow(hwndToggleSideBar, (showToolbar && pContainer->SideBar->isActive()) ? SW_SHOW : SW_HIDE); HDWP hdwp = BeginDeferWindowPos(Srmm_GetButtonCount() + 1); RECT rcSplitter; - GetWindowRect(GetDlgItem(hwnd, (dat->bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); + GetWindowRect(GetDlgItem(hwnd, (bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); POINT ptSplitter = { 0, rcSplitter.top }; ScreenToClient(hwnd, &ptSplitter); @@ -234,15 +228,15 @@ BOOL BB_SetButtonsPos(TWindowData *dat) GetClientRect(hwnd, &rect); int splitterY = (!bBottomToolbar) ? ptSplitter.y - DPISCALEY_S(1) : rect.bottom; - int tempL = dat->bbLSideWidth, tempR = dat->bbRSideWidth; + int tempL = bbLSideWidth, tempR = bbRSideWidth; int lwidth = 0, rwidth = 0; - int iOff = DPISCALEY_S((PluginConfig.m_DPIscaleY > 1.0) ? (dat->bType == SESSIONTYPE_IM ? 22 : 23) : 22); + int iOff = DPISCALEY_S((PluginConfig.m_DPIscaleY > 1.0) ? (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 ((rect.bottom - ptSplitter.y - (rcSplitter.bottom - rcSplitter.top) /*- DPISCALEY(2)*/ - (bBottomToolbar ? DPISCALEY_S(24) : 0) < pic.cy - DPISCALEY_S(2)) && bShowAvatar && !PluginConfig.m_bAlwaysFullToolbarWidth) + foravatar = pic.cx + gap; - if ((dat->pContainer->dwFlags & CNT_SIDEBAR) && (dat->pContainer->SideBar->getFlags() & CSideBar::SIDEBARORIENTATION_LEFT)) { + if ((pContainer->dwFlags & CNT_SIDEBAR) && (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; @@ -254,7 +248,7 @@ BOOL BB_SetButtonsPos(TWindowData *dat) if (cbd->m_bRSided) // filter only left buttons continue; - if (((dat->bType == SESSIONTYPE_IM) && cbd->m_bIMButton) || ((dat->bType == SESSIONTYPE_CHAT) && cbd->m_bChatButton)) { + if (((bType == SESSIONTYPE_IM) && cbd->m_bIMButton) || ((bType == SESSIONTYPE_CHAT) && cbd->m_bChatButton)) { hwndButton = GetDlgItem(hwnd, cbd->m_dwButtonCID); if (!showToolbar) { @@ -293,7 +287,7 @@ BOOL BB_SetButtonsPos(TWindowData *dat) } } - if ((dat->pContainer->dwFlags & CNT_SIDEBAR) && (dat->pContainer->SideBar->getFlags() & CSideBar::SIDEBARORIENTATION_RIGHT)) { + if ((pContainer->dwFlags & CNT_SIDEBAR) && (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; @@ -304,7 +298,7 @@ BOOL BB_SetButtonsPos(TWindowData *dat) if (!cbd->m_bRSided) // filter only right buttons continue; - if (((dat->bType == SESSIONTYPE_IM) && cbd->m_bIMButton) || ((dat->bType == SESSIONTYPE_CHAT) && cbd->m_bChatButton)) { + if (((bType == SESSIONTYPE_IM) && cbd->m_bIMButton) || ((bType == SESSIONTYPE_CHAT) && cbd->m_bChatButton)) { hwndButton = GetDlgItem(hwnd, cbd->m_dwButtonCID); if (!showToolbar) { @@ -346,36 +340,36 @@ BOOL BB_SetButtonsPos(TWindowData *dat) return EndDeferWindowPos(hdwp); } -void CB_DestroyAllButtons(HWND hwndDlg) +void CTabBaseDlg::CB_DestroyAllButtons() { CustomButtonData *cbd; for (int i = 0; cbd = Srmm_GetNthButton(i); i++) { - HWND hwndButton = GetDlgItem(hwndDlg, cbd->m_dwButtonCID); + HWND hwndButton = GetDlgItem(m_hwnd, cbd->m_dwButtonCID); if (hwndButton) DestroyWindow(hwndButton); } } -void CB_DestroyButton(HWND hwndDlg, TWindowData *dat, DWORD dwButtonCID, DWORD dwFlags) +void CTabBaseDlg::CB_DestroyButton(DWORD dwButtonCID, DWORD dwFlags) { - HWND hwndButton = GetDlgItem(hwndDlg, dwButtonCID); + HWND hwndButton = GetDlgItem(m_hwnd, dwButtonCID); if (hwndButton == NULL) return; RECT rc = { 0 }; GetClientRect(hwndButton, &rc); if (dwFlags & BBBF_ISRSIDEBUTTON) - dat->bbRSideWidth -= rc.right; + bbRSideWidth -= rc.right; else - dat->bbLSideWidth -= rc.right; + bbLSideWidth -= rc.right; DestroyWindow(hwndButton); - BB_SetButtonsPos(dat); + BB_SetButtonsPos(); } -void CB_ChangeButton(HWND hwndDlg, TWindowData *dat, CustomButtonData *cbd) +void CTabBaseDlg::CB_ChangeButton(CustomButtonData *cbd) { - HWND hwndButton = GetDlgItem(hwndDlg, cbd->m_dwButtonCID); + HWND hwndButton = GetDlgItem(m_hwnd, cbd->m_dwButtonCID); if (hwndButton == NULL) return; @@ -383,7 +377,7 @@ void CB_ChangeButton(HWND hwndDlg, TWindowData *dat, CustomButtonData *cbd) SendMessage(hwndButton, BM_SETIMAGE, IMAGE_ICON, (LPARAM)IcoLib_GetIconByHandle(cbd->m_hIcon)); if (cbd->m_pwszTooltip) SendMessage(hwndButton, BUTTONADDTOOLTIP, (WPARAM)cbd->m_pwszTooltip, BATF_UNICODE); - SendMessage(hwndButton, BUTTONSETCONTAINER, (LPARAM)dat->pContainer, 0); + SendMessage(hwndButton, BUTTONSETCONTAINER, (LPARAM)pContainer, 0); SetWindowTextA(hwndButton, cbd->m_pszModuleName); } diff --git a/plugins/TabSRMM/src/chat/chat.h b/plugins/TabSRMM/src/chat/chat.h index f4ef815a72..e38ee9c643 100644 --- a/plugins/TabSRMM/src/chat/chat.h +++ b/plugins/TabSRMM/src/chat/chat.h @@ -46,7 +46,7 @@ typedef struct { class CMUCHighlight; -//structs +// structs struct MODULEINFO : public GCModuleInfoBase { @@ -57,7 +57,7 @@ struct MODULEINFO : public GCModuleInfoBase struct SESSION_INFO : public GCSessionInfoBase { - TWindowData *dat; + CChatRoomDlg *dat; TContainerData *pContainer; int iLogTrayFlags, iLogPopupFlags, iDiskLogFlags; @@ -67,8 +67,8 @@ struct SESSION_INFO : public GCSessionInfoBase struct LOGSTREAMDATA : public GCLogStreamDataBase { - int crCount; - TWindowData *dat; + int crCount; + CChatRoomDlg *dat; }; struct TMUCSettings : public GlobalLogSettingsBase @@ -111,11 +111,9 @@ extern CHAT_MANAGER saveCI; ////////////////////////////////////////////////////////////////////////////////// // log.c -void Log_StreamInEvent(HWND hwndDlg, LOGINFO* lin, SESSION_INFO *si, bool bRedraw); -char* Log_CreateRtfHeader(MODULEINFO *mi); +char* Log_CreateRtfHeader(MODULEINFO *mi); // window.c -INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); int GetTextPixelSize(wchar_t* pszText, HFONT hFont, bool bWidth); // options.c diff --git a/plugins/TabSRMM/src/chat/chat_resource.h b/plugins/TabSRMM/src/chat/chat_resource.h index 07916d6f51..79207f3db8 100644 --- a/plugins/TabSRMM/src/chat/chat_resource.h +++ b/plugins/TabSRMM/src/chat/chat_resource.h @@ -11,11 +11,8 @@ #define IDD_OPTIONS3 407 #define IDD_OPTIONS4 408 #define IDD_ADDHIGHLIGHT 409 -#define IDC_CHAT_LOG 1005 -#define IDC_SPLITTERX 1006 #define IDC_SMILEY 1007 #define IDC_SPLITTERY 1008 -#define IDC_CHAT_MESSAGE 1009 #define IDC_FILTER 1013 #define IDC_CHANMGR 1014 #define IDC_SHOWNICKLIST 1015 @@ -39,6 +36,7 @@ #define IDC_LIMIT 1050 #define IDC_LOGTIMESTAMP 1051 #define IDC_GROUP 1057 +#define IDC_SPLITTERX 1058 #define IDC_CHAT_RADIO1 1061 #define IDC_RADIO2 1062 #define IDC_RADIO3 1063 diff --git a/plugins/TabSRMM/src/chat/log.cpp b/plugins/TabSRMM/src/chat/log.cpp index 8ecb13e423..ace05686ba 100644 --- a/plugins/TabSRMM/src/chat/log.cpp +++ b/plugins/TabSRMM/src/chat/log.cpp @@ -260,7 +260,7 @@ static void LogEventIEView(LOGSTREAMDATA *streamData, wchar_t *ptszNick) event.cbSize = sizeof(event); event.dwFlags = 0; event.hwnd = streamData->dat->hwndIEView ? streamData->dat->hwndIEView : streamData->dat->hwndHPP; - event.hContact = streamData->dat->hContact; + event.hContact = streamData->dat->m_hContact; event.codepage = streamData->dat->codePage; event.pszProto = streamData->si->pszModule; event.iType = IEE_LOG_MEM_EVENTS; @@ -857,16 +857,15 @@ static DWORD CALLBACK Log_StreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG return 0; } -void Log_StreamInEvent(HWND hwndDlg, LOGINFO* lin, SESSION_INFO *si, bool bRedraw) +void CChatRoomDlg::StreamInEvents(LOGINFO* lin, SESSION_INFO *si, bool bRedraw) { CHARRANGE oldsel, sel, newsel; POINT point = { 0 }; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - if (hwndDlg == 0 || lin == 0 || si == 0 || dat == 0) + if (m_hwnd == 0 || lin == 0 || si == 0) return; - HWND hwndRich = GetDlgItem(hwndDlg, IDC_CHAT_LOG); + HWND hwndRich = GetDlgItem(m_hwnd, IDC_LOG); LOGSTREAMDATA streamData; memset(&streamData, 0, sizeof(streamData)); @@ -874,7 +873,7 @@ void Log_StreamInEvent(HWND hwndDlg, LOGINFO* lin, SESSION_INFO *si, bool bRedra streamData.si = si; streamData.lin = lin; streamData.bStripFormat = FALSE; - streamData.dat = dat; + streamData.dat = this; if (!bRedraw && (si->iType == GCW_CHATROOM || si->iType == GCW_PRIVMESS) && si->bFilterEnabled && (si->iLogFilterFlags & lin->iType) == 0) return; @@ -888,7 +887,7 @@ void Log_StreamInEvent(HWND hwndDlg, LOGINFO* lin, SESSION_INFO *si, bool bRedra SCROLLINFO scroll = { 0 }; scroll.cbSize = sizeof(SCROLLINFO); scroll.fMask = SIF_RANGE | SIF_POS | SIF_PAGE; - GetScrollInfo(GetDlgItem(hwndDlg, IDC_CHAT_LOG), SB_VERT, &scroll); + GetScrollInfo(GetDlgItem(m_hwnd, IDC_LOG), SB_VERT, &scroll); SendMessage(hwndRich, EM_GETSCROLLPOS, 0, (LPARAM)&point); // do not scroll to bottom if there is a selection diff --git a/plugins/TabSRMM/src/chat/main.cpp b/plugins/TabSRMM/src/chat/main.cpp index 072337c2cc..f34f5d18ad 100644 --- a/plugins/TabSRMM/src/chat/main.cpp +++ b/plugins/TabSRMM/src/chat/main.cpp @@ -64,7 +64,7 @@ static void OnNewUser(SESSION_INFO *si, USERINFO*) if (si->hWnd) { SendMessage(si->hWnd, GC_UPDATENICKLIST, 0, 0); if (si->dat) - GetMyNick(si->dat); + si->dat->GetMyNick(); } } @@ -72,7 +72,7 @@ static void OnChangeNick(SESSION_INFO *si) { if (si->hWnd) { if (si->dat) - GetMyNick(si->dat); + si->dat->GetMyNick(); SendMessage(si->hWnd, GC_UPDATESTATUSBAR, 0, 0); } } diff --git a/plugins/TabSRMM/src/chat/services.cpp b/plugins/TabSRMM/src/chat/services.cpp index 0ddb66652c..c5735a6a8d 100644 --- a/plugins/TabSRMM/src/chat/services.cpp +++ b/plugins/TabSRMM/src/chat/services.cpp @@ -45,8 +45,6 @@ HWND CreateNewRoom(TContainerData *pContainer, SESSION_INFO *si, BOOL bActivateT TNewWindowData newData = { 0 }; newData.hContact = hContact; - newData.isWchar = 0; - newData.szInitialText = NULL; memset(&newData.item, 0, sizeof(newData.item)); wchar_t *contactName = pcli->pfnGetContactDisplayName(newData.hContact, 0); @@ -65,7 +63,7 @@ HWND CreateNewRoom(TContainerData *pContainer, SESSION_INFO *si, BOOL bActivateT newData.item.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM; newData.item.iImage = 0; - HWND hwndTab = GetDlgItem(pContainer->hwnd, 1159); + HWND hwndTab = GetDlgItem(pContainer->hwnd, IDC_MSGTABS); // hide the active tab if (pContainer->hwndActive && bActivateTab) @@ -81,9 +79,9 @@ HWND CreateNewRoom(TContainerData *pContainer, SESSION_INFO *si, BOOL bActivateT item.mask = TCIF_PARAM; TabCtrl_GetItem(hwndTab, i, &item); HWND hwnd = (HWND)item.lParam; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (dat) { - int relPos = M.GetDword(dat->hContact, "tabindex", i * 100); + int relPos = M.GetDword(dat->m_hContact, "tabindex", i * 100); if (iTabIndex_wanted <= relPos) pContainer->iTabIndex = i; } @@ -101,9 +99,14 @@ HWND CreateNewRoom(TContainerData *pContainer, SESSION_INFO *si, BOOL bActivateT pContainer->iChilds++; newData.bWantPopup = bWantPopup; newData.si = si; - HWND hwndNew = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_CHANNEL), GetDlgItem(pContainer->hwnd, 1159), RoomWndProc, (LPARAM)&newData); + + CChatRoomDlg *pDlg = new CChatRoomDlg(&newData); + pDlg->SetParent(GetDlgItem(pContainer->hwnd, IDC_MSGTABS)); + pDlg->Show(); + + HWND hwndNew = pDlg->GetHwnd(); if (pContainer->dwFlags & CNT_SIDEBAR) { - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndNew, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwndNew, GWLP_USERDATA); if (dat) pContainer->SideBar->addSession(dat, pContainer->iTabIndex); } diff --git a/plugins/TabSRMM/src/chat/tools.cpp b/plugins/TabSRMM/src/chat/tools.cpp index 9be9b80567..566d506377 100644 --- a/plugins/TabSRMM/src/chat/tools.cpp +++ b/plugins/TabSRMM/src/chat/tools.cpp @@ -141,7 +141,7 @@ BOOL DoPopup(SESSION_INFO *si, GCEVENT *gce) if (si == NULL || !(iEvent & si->iLogPopupFlags)) return true; - TWindowData *dat = si->dat; + CTabBaseDlg *dat = si->dat; TContainerData *pContainer = dat ? dat->pContainer : NULL; wchar_t *bbStart, *bbEnd; @@ -215,7 +215,7 @@ void DoFlashAndSoundWorker(FLASH_PARAMS* p) if (si == 0) return; - TWindowData *dat = 0; + CTabBaseDlg *dat = 0; if (si->hWnd) { dat = si->dat; if (dat) { @@ -240,7 +240,7 @@ void DoFlashAndSoundWorker(FLASH_PARAMS* p) if (dat->iFlashIcon != pci->hIcons[ICON_HIGHLIGHT] && dat->iFlashIcon != pci->hIcons[ICON_MESSAGE]) dat->iFlashIcon = p->hNotifyIcon; } - dat->mayFlashTab = TRUE; + dat->m_bCanFlashTab = TRUE; SetTimer(si->hWnd, TIMERID_FLASHWND, TIMEOUT_FLASHWND, NULL); } } @@ -257,7 +257,7 @@ void DoFlashAndSoundWorker(FLASH_PARAMS* p) TabCtrl_SetCurSel(hwndTab, iItem); ShowWindow(dat->pContainer->hwndActive, SW_HIDE); dat->pContainer->hwndActive = si->hWnd; - SendMessage(dat->pContainer->hwnd, DM_UPDATETITLE, dat->hContact, 0); + SendMessage(dat->pContainer->hwnd, DM_UPDATETITLE, dat->m_hContact, 0); dat->pContainer->dwFlags |= CNT_DEFERREDTABSELECT; } } @@ -299,7 +299,7 @@ BOOL DoSoundsFlashPopupTrayStuff(SESSION_INFO *si, GCEVENT *gce, BOOL bHighlight if (gce == 0 || si == 0 || gce->bIsMe || si->iType == GCW_SERVER) return FALSE; - TWindowData *dat = NULL; + CTabBaseDlg *dat = NULL; FLASH_PARAMS *params = (FLASH_PARAMS*)mir_calloc(sizeof(FLASH_PARAMS)); params->hContact = si->hContact; params->bInactive = TRUE; @@ -328,7 +328,7 @@ BOOL DoSoundsFlashPopupTrayStuff(SESSION_INFO *si, GCEVENT *gce, BOOL bHighlight if (dat && g_Settings.bAnnoyingHighlight && params->bInactive && dat->pContainer->hwnd != GetForegroundWindow()) { wParamForHighLight = 2; - params->hWnd = dat->hwnd; + params->hWnd = dat->GetHwnd(); } if (dat || !nen_options.iMUCDisable) @@ -518,7 +518,7 @@ UINT CreateGCMenu(HWND hwndDlg, HMENU *hMenu, int iIndex, POINT pt, SESSION_INFO gcmi.pszUID = pszUID; if (iIndex == 1) { - int i = GetRichTextLength(GetDlgItem(hwndDlg, IDC_CHAT_LOG)); + int i = GetRichTextLength(GetDlgItem(hwndDlg, IDC_LOG)); EnableMenuItem(*hMenu, ID_CLEARLOG, MF_ENABLED); EnableMenuItem(*hMenu, ID_COPYALL, MF_ENABLED); diff --git a/plugins/TabSRMM/src/chat/window.cpp b/plugins/TabSRMM/src/chat/window.cpp index 3d932bcf5d..c0873157fa 100644 --- a/plugins/TabSRMM/src/chat/window.cpp +++ b/plugins/TabSRMM/src/chat/window.cpp @@ -118,14 +118,14 @@ static BOOL CheckCustomLink(HWND hwndDlg, POINT *ptClient, UINT uMsg, WPARAM wPa if (bIsCustomLink) { ENLINK enlink = { 0 }; enlink.nmhdr.hwndFrom = hwndDlg; - enlink.nmhdr.idFrom = IDC_CHAT_LOG; + enlink.nmhdr.idFrom = IDC_LOG; enlink.nmhdr.code = EN_LINK; enlink.msg = uMsg; enlink.wParam = wParam; enlink.lParam = lParam; enlink.chrg.cpMin = cpMin; enlink.chrg.cpMax = cpMax; - SendMessage(GetParent(hwndDlg), WM_NOTIFY, IDC_CHAT_LOG, (LPARAM)&enlink); + SendMessage(GetParent(hwndDlg), WM_NOTIFY, IDC_LOG, (LPARAM)&enlink); } return bIsCustomLink; } @@ -148,22 +148,18 @@ bool IsStringValidLink(wchar_t *pszText) // called whenever a group chat tab becomes active(either by switching tabs or activating a // container window -static void Chat_UpdateWindowState(TWindowData *dat, UINT msg) +void CChatRoomDlg::UpdateWindowState(UINT msg) { - if (dat == NULL) - return; - - SESSION_INFO *si = dat->si; if (si == NULL) return; - HWND hwndDlg = dat->hwnd; + HWND hwndDlg = GetHwnd(); HWND hwndTab = GetParent(hwndDlg); if (msg == WM_ACTIVATE) { - if (dat->pContainer->dwFlags & CNT_TRANSPARENCY) { - DWORD trans = LOWORD(dat->pContainer->settings->dwTransparency); - SetLayeredWindowAttributes(dat->pContainer->hwnd, CSkin::m_ContainerColorKey, (BYTE)trans, (dat->pContainer->dwFlags & CNT_TRANSPARENCY ? LWA_ALPHA : 0)); + if (pContainer->dwFlags & CNT_TRANSPARENCY) { + DWORD trans = LOWORD(pContainer->settings->dwTransparency); + SetLayeredWindowAttributes(pContainer->hwnd, CSkin::m_ContainerColorKey, (BYTE)trans, (pContainer->dwFlags & CNT_TRANSPARENCY ? LWA_ALPHA : 0)); } } @@ -179,78 +175,78 @@ static void Chat_UpdateWindowState(TWindowData *dat, UINT msg) } } - if (dat->bIsAutosizingInput && dat->iInputAreaHeight == -1) { - dat->iInputAreaHeight = 0; - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_REQUESTRESIZE, 0, 0); + if (bIsAutosizingInput && iInputAreaHeight == -1) { + iInputAreaHeight = 0; + SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_REQUESTRESIZE, 0, 0); } - dat->Panel->dismissConfig(); - dat->dwUnread = 0; - if (dat->pWnd) { - dat->pWnd->activateTab(); - dat->pWnd->setOverlayIcon(0, true); + Panel->dismissConfig(); + dwUnread = 0; + if (pWnd) { + pWnd->activateTab(); + pWnd->setOverlayIcon(0, true); } - if (dat->pContainer->hwndSaved == hwndDlg || dat->bWasDeleted) + if (pContainer->hwndSaved == hwndDlg || m_bWasDeleted) return; - dat->pContainer->hwndSaved = hwndDlg; + pContainer->hwndSaved = hwndDlg; pci->SetActiveSession(si->ptszID, si->pszModule); - dat->hTabIcon = dat->hTabStatusIcon; + hTabIcon = hTabStatusIcon; - if (dat->iTabID >= 0) { + if (iTabID >= 0) { if (db_get_w(si->hContact, si->pszModule, "ApparentMode", 0) != 0) db_set_w(si->hContact, si->pszModule, "ApparentMode", 0); if (pcli->pfnGetEvent(si->hContact, 0)) pcli->pfnRemoveEvent(si->hContact, GC_FAKE_EVENT); SendMessage(hwndDlg, GC_UPDATETITLE, 0, 1); - dat->dwTickLastEvent = 0; - dat->dwFlags &= ~MWF_DIVIDERSET; - if (KillTimer(hwndDlg, TIMERID_FLASHWND) || dat->iFlashIcon) { - FlashTab(dat, hwndTab, dat->iTabID, &dat->bTabFlash, FALSE, dat->hTabIcon); - dat->mayFlashTab = FALSE; - dat->iFlashIcon = 0; + dwTickLastEvent = 0; + dwFlags &= ~MWF_DIVIDERSET; + if (KillTimer(hwndDlg, TIMERID_FLASHWND) || iFlashIcon) { + FlashTab(false); + m_bCanFlashTab = FALSE; + iFlashIcon = 0; } - if (dat->pContainer->dwFlashingStarted != 0) { - FlashContainer(dat->pContainer, 0, 0); - dat->pContainer->dwFlashingStarted = 0; + if (pContainer->dwFlashingStarted != 0) { + FlashContainer(pContainer, 0, 0); + pContainer->dwFlashingStarted = 0; } - dat->pContainer->dwFlags &= ~CNT_NEED_UPDATETITLE; + pContainer->dwFlags &= ~CNT_NEED_UPDATETITLE; - if (dat->dwFlags & MWF_NEEDCHECKSIZE) + if (dwFlags & MWF_NEEDCHECKSIZE) PostMessage(hwndDlg, DM_SAVESIZE, 0, 0); if (PluginConfig.m_bAutoLocaleSupport) { - if (dat->hkl == 0) - DM_LoadLocale(dat); + if (hkl == 0) + DM_LoadLocale(this); else SendMessage(hwndDlg, DM_SETLOCALE, 0, 0); } - SetFocus(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)); - dat->dwLastActivity = GetTickCount(); - dat->pContainer->dwLastActivity = dat->dwLastActivity; - dat->pContainer->MenuBar->configureMenu(); - UpdateTrayMenuState(dat, FALSE); - DM_SetDBButtonStates(hwndDlg, dat); - - if (dat->dwFlagsEx & MWF_EX_DELAYEDSPLITTER) { - dat->dwFlagsEx &= ~MWF_EX_DELAYEDSPLITTER; - ShowWindow(dat->pContainer->hwnd, SW_RESTORE); - PostMessage(hwndDlg, DM_SPLITTERGLOBALEVENT, dat->wParam, dat->lParam); + SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); + dwLastActivity = GetTickCount(); + pContainer->dwLastActivity = dwLastActivity; + pContainer->MenuBar->configureMenu(); + UpdateTrayMenuState(this, FALSE); + DM_SetDBButtonStates(); + + if (dwFlagsEx & MWF_EX_DELAYEDSPLITTER) { + dwFlagsEx &= ~MWF_EX_DELAYEDSPLITTER; + ShowWindow(pContainer->hwnd, SW_RESTORE); + PostMessage(hwndDlg, DM_SPLITTERGLOBALEVENT, wParam, lParam); PostMessage(hwndDlg, WM_SIZE, 0, 0); - dat->wParam = dat->lParam = 0; + wParam = lParam = 0; } } - BB_SetButtonsPos(dat); + BB_SetButtonsPos(); if (M.isAero()) InvalidateRect(hwndTab, NULL, FALSE); - if (dat->pContainer->dwFlags & CNT_SIDEBAR) - dat->pContainer->SideBar->setActiveItem(dat); + if (pContainer->dwFlags & CNT_SIDEBAR) + pContainer->SideBar->setActiveItem(this); - if (dat->pWnd) - dat->pWnd->Invalidate(); + if (pWnd) + pWnd->Invalidate(); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -270,73 +266,45 @@ static void InitButtons(HWND hwndDlg, SESSION_INFO *si) } } -static void Chat_ResizeIeView(const TWindowData *dat) -{ - int iMode = dat->hwndIEView ? 1 : 2; - HWND hwndDlg = dat->hwnd; - - RECT rcRichEdit; - GetWindowRect(GetDlgItem(hwndDlg, IDC_CHAT_LOG), &rcRichEdit); - - POINT pt = { rcRichEdit.left, rcRichEdit.top }; - ScreenToClient(hwndDlg, &pt); - - IEVIEWWINDOW ieWindow = { sizeof(ieWindow) }; - ieWindow.iType = IEW_SETPOS; - ieWindow.parent = hwndDlg; - ieWindow.hwnd = iMode == 1 ? dat->hwndIEView : dat->hwndHPP; - ieWindow.x = pt.x; - ieWindow.y = pt.y; - ieWindow.cx = rcRichEdit.right - rcRichEdit.left; - ieWindow.cy = rcRichEdit.bottom - rcRichEdit.top; - if (ieWindow.cx != 0 && ieWindow.cy != 0) - CallService(iMode == 1 ? MS_IEVIEW_WINDOW : MS_HPP_EG_WINDOW, 0, (LPARAM)&ieWindow); -} - ///////////////////////////////////////////////////////////////////////////////////////// // resizer callback for the group chat session window.Called from Mirandas dialog // resizing service -static int RoomWndResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL *urc) +int CChatRoomDlg::Resizer(UTILRESIZECONTROL *urc) { - RECT rc, rcTabs; - SESSION_INFO *si = (SESSION_INFO*)lParam; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - - bool bToolbar = !(dat->pContainer->dwFlags & CNT_HIDETOOLBAR); - bool bBottomToolbar = dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR ? 1 : 0; + bool bToolbar = !(pContainer->dwFlags & CNT_HIDETOOLBAR); + bool bBottomToolbar = pContainer->dwFlags & CNT_BOTTOMTOOLBAR ? 1 : 0; bool bNick = si->iType != GCW_SERVER && si->bNicklistEnabled; - bool bInfoPanel = dat->Panel->isActive(); - int panelHeight = dat->Panel->getHeight() + 1; - - rc.bottom = rc.top = rc.left = rc.right = 0; + bool bInfoPanel = Panel->isActive(); + int panelHeight = Panel->getHeight() + 1; - GetClientRect(hwndDlg, &rcTabs); + RECT rcTabs; + GetClientRect(m_hwnd, &rcTabs); - if (dat->bIsAutosizingInput) - Utils::showDlgControl(hwndDlg, IDC_SPLITTERY, SW_HIDE); + if (bIsAutosizingInput) + Utils::showDlgControl(m_hwnd, IDC_SPLITTERY, SW_HIDE); if (si->iType != GCW_SERVER) { - Utils::showDlgControl(hwndDlg, IDC_LIST, si->bNicklistEnabled ? SW_SHOW : SW_HIDE); - Utils::showDlgControl(hwndDlg, IDC_SPLITTERX, si->bNicklistEnabled ? SW_SHOW : SW_HIDE); + Utils::showDlgControl(m_hwnd, IDC_LIST, si->bNicklistEnabled ? SW_SHOW : SW_HIDE); + Utils::showDlgControl(m_hwnd, IDC_SPLITTERX, si->bNicklistEnabled ? SW_SHOW : SW_HIDE); - Utils::enableDlgControl(hwndDlg, IDC_SHOWNICKLIST, true); - Utils::enableDlgControl(hwndDlg, IDC_FILTER, true); + Utils::enableDlgControl(m_hwnd, IDC_SHOWNICKLIST, true); + Utils::enableDlgControl(m_hwnd, IDC_FILTER, true); if (si->iType == GCW_CHATROOM) { MODULEINFO* tmp = pci->MM_FindModule(si->pszModule); if (tmp) - Utils::enableDlgControl(hwndDlg, IDC_CHANMGR, tmp->bChanMgr); + Utils::enableDlgControl(m_hwnd, IDC_CHANMGR, tmp->bChanMgr); } } else { - Utils::showDlgControl(hwndDlg, IDC_LIST, SW_HIDE); - Utils::showDlgControl(hwndDlg, IDC_SPLITTERX, SW_HIDE); + Utils::showDlgControl(m_hwnd, IDC_LIST, SW_HIDE); + Utils::showDlgControl(m_hwnd, IDC_SPLITTERX, SW_HIDE); } if (si->iType == GCW_SERVER) { - Utils::enableDlgControl(hwndDlg, IDC_SHOWNICKLIST, false); - Utils::enableDlgControl(hwndDlg, IDC_FILTER, false); - Utils::enableDlgControl(hwndDlg, IDC_CHANMGR, false); + Utils::enableDlgControl(m_hwnd, IDC_SHOWNICKLIST, false); + Utils::enableDlgControl(m_hwnd, IDC_FILTER, false); + Utils::enableDlgControl(m_hwnd, IDC_CHANMGR, false); } switch (urc->wId) { @@ -345,7 +313,7 @@ static int RoomWndResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL *urc) urc->rcItem.top = panelHeight - 2; return RD_ANCHORX_WIDTH | RD_ANCHORY_TOP; - case IDC_CHAT_LOG: + case IDC_LOG: urc->rcItem.top = 0; urc->rcItem.left = 0; urc->rcItem.right = bNick ? urc->dlgNewSize.cx - si->iSplitterX : urc->dlgNewSize.cx; @@ -399,12 +367,12 @@ static int RoomWndResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL *urc) urc->rcItem.top++; return RD_ANCHORX_CUSTOM | RD_ANCHORY_CUSTOM; - case IDC_CHAT_MESSAGE: + case IDC_MESSAGE: urc->rcItem.right = urc->dlgNewSize.cx; urc->rcItem.top = urc->dlgNewSize.cy - si->iSplitterY + 3; urc->rcItem.bottom = urc->dlgNewSize.cy; // - 1 ; - if (dat->bIsAutosizingInput) + if (bIsAutosizingInput) urc->rcItem.top -= DPISCALEY_S(1); if (bBottomToolbar && bToolbar) @@ -517,18 +485,17 @@ LBL_SkipEnd: static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndParent = GetParent(hwnd); - TWindowData *mwdat = (TWindowData*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); - + CTabBaseDlg *mwdat = (CTabBaseDlg*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); MESSAGESUBDATA *dat = (MESSAGESUBDATA*)GetWindowLongPtr(hwnd, GWLP_USERDATA); - if (mwdat->fkeyProcessed && (msg == WM_KEYUP)) { - GetKeyboardState(mwdat->kstate); - if (!(mwdat->kstate[VK_CONTROL] & 0x80) && !(mwdat->kstate[VK_SHIFT] & 0x80)) - mwdat->fkeyProcessed = false; - return 0; - } + if (mwdat != nullptr) + if (mwdat->fkeyProcessed && (msg == WM_KEYUP)) { + GetKeyboardState(mwdat->kstate); + if (!(mwdat->kstate[VK_CONTROL] & 0x80) && !(mwdat->kstate[VK_SHIFT] & 0x80)) + mwdat->fkeyProcessed = false; + return 0; + } - SESSION_INFO *si = (SESSION_INFO*)mwdat->si; switch (msg) { case WM_NCCALCSIZE: return CSkin::NcCalcRichEditFrame(hwnd, mwdat, ID_EXTBKINPUTAREA, msg, wParam, lParam, MessageSubclassProc); @@ -551,7 +518,7 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, RemoveMenu(hSubMenu, 8, MF_BYPOSITION); RemoveMenu(hSubMenu, 4, MF_BYPOSITION); - MODULEINFO *mi = pci->MM_FindModule(si->pszModule); + MODULEINFO *mi = pci->MM_FindModule(mwdat->si->pszModule); EnableMenuItem(hSubMenu, IDM_PASTEFORMATTED, MF_BYCOMMAND | ((mi && mi->bBold) ? MF_ENABLED : MF_GRAYED)); TranslateMenu(hSubMenu); @@ -565,7 +532,7 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, MessageWindowPopupData mwpd = { sizeof(mwpd) }; mwpd.uType = MSG_WINDOWPOPUP_SHOWING; mwpd.uFlags = MSG_WINDOWPOPUP_INPUT; - mwpd.hContact = mwdat->hContact; + mwpd.hContact = mwdat->m_hContact; mwpd.hwnd = hwnd; mwpd.hMenu = hSubMenu; mwpd.pt = pt; @@ -610,14 +577,14 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, case WM_SYSKEYUP: if (wParam == VK_MENU) { - ProcessHotkeysByMsgFilter(hwnd, msg, wParam, lParam, IDC_CHAT_MESSAGE); + ProcessHotkeysByMsgFilter(hwnd, msg, wParam, lParam, IDC_MESSAGE); return 0; } break; case WM_SYSKEYDOWN: mwdat->fkeyProcessed = false; - if (ProcessHotkeysByMsgFilter(hwnd, msg, wParam, lParam, IDC_CHAT_MESSAGE)) { + if (ProcessHotkeysByMsgFilter(hwnd, msg, wParam, lParam, IDC_MESSAGE)) { mwdat->fkeyProcessed = true; return 0; } @@ -638,14 +605,14 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, break; case WM_CHAR: - BOOL isShift, isAlt, isCtrl; - KbdState(mwdat, isShift, isCtrl, isAlt); + bool isShift, isAlt, isCtrl; + mwdat->KbdState(isShift, isCtrl, isAlt); if (PluginConfig.m_bSoundOnTyping && !isAlt &&!isCtrl&&!(mwdat->pContainer->dwFlags&CNT_NOSOUND) && wParam != VK_ESCAPE&&!(wParam == VK_TAB&&PluginConfig.m_bAllowTab)) SkinPlaySound("SoundOnTyping"); if (isCtrl && !isAlt && !isShift) { - MODULEINFO *mi = pci->MM_FindModule(si->pszModule); + MODULEINFO *mi = pci->MM_FindModule(mwdat->si->pszModule); if (mi == NULL) return 0; @@ -702,7 +669,7 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, break; case WM_KEYDOWN: - KbdState(mwdat, isShift, isCtrl, isAlt); + mwdat->KbdState(isShift, isCtrl, isAlt); // sound on typing.. if (PluginConfig.m_bSoundOnTyping && !isAlt && wParam == VK_DELETE) @@ -740,7 +707,7 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, else if (wParam == VK_DOWN) wp = MAKEWPARAM(SB_LINEDOWN, 0); - SendDlgItemMessage(hwndParent, IDC_CHAT_LOG, WM_VSCROLL, wp, 0); + SendDlgItemMessage(hwndParent, IDC_LOG, WM_VSCROLL, wp, 0); return 0; } } @@ -789,14 +756,14 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, } if (wParam == VK_TAB && !isCtrl && !isShift) { //tab-autocomplete SendMessage(hwnd, WM_SETREDRAW, FALSE, 0); - bool fCompleted = TabAutoComplete(hwnd, dat, si); + bool fCompleted = TabAutoComplete(hwnd, dat, mwdat->si); SendMessage(hwnd, WM_SETREDRAW, TRUE, 0); RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); if (!fCompleted && !PluginConfig.m_bAllowTab) { - if ((GetSendButtonState(mwdat->hwnd) != PBS_DISABLED)) - SetFocus(GetDlgItem(mwdat->hwnd, IDOK)); + if ((GetSendButtonState(mwdat->GetHwnd()) != PBS_DISABLED)) + SetFocus(GetDlgItem(mwdat->GetHwnd(), IDOK)); else - SetFocus(GetDlgItem(mwdat->hwnd, IDC_CHAT_LOG)); + SetFocus(GetDlgItem(mwdat->GetHwnd(), IDC_LOG)); } return 0; } @@ -814,15 +781,15 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, if (wParam == VK_NEXT || wParam == VK_PRIOR) { HWND htemp = hwndParent; - SendDlgItemMessage(htemp, IDC_CHAT_LOG, msg, wParam, lParam); + SendDlgItemMessage(htemp, IDC_LOG, msg, wParam, lParam); dat->lastEnterTime = 0; return 0; } if (wParam == VK_UP && isCtrl && !isAlt) { - char *lpPrevCmd = pci->SM_GetPrevCommand(si->ptszID, si->pszModule); + char *lpPrevCmd = pci->SM_GetPrevCommand(mwdat->si->ptszID, mwdat->si->pszModule); - if (!si->lpCurrentCommand || !si->lpCurrentCommand->last) { + if (!mwdat->si->lpCurrentCommand || !mwdat->si->lpCurrentCommand->last) { // Next command is not defined. It means currently entered text is not saved in the history and it // need to be saved in the window context. char *enteredText = Message_GetFromStream(hwndParent); @@ -864,7 +831,7 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, ste.flags = ST_DEFAULT; ste.codepage = CP_ACP; - char *lpPrevCmd = pci->SM_GetNextCommand(si->ptszID, si->pszModule); + char *lpPrevCmd = pci->SM_GetNextCommand(mwdat->si->ptszID, mwdat->si->pszModule); if (lpPrevCmd) SendMessage(hwnd, EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)lpPrevCmd); else if (mwdat->enteredText) { @@ -906,17 +873,17 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, cf.dwEffects = 0; SendMessage(hwnd, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); { - MODULEINFO *mi = pci->MM_FindModule(si->pszModule); + MODULEINFO *mi = pci->MM_FindModule(mwdat->si->pszModule); if (mi == NULL) break; if (mi->bColor) { - int index = Chat_GetColorIndex(si->pszModule, cf.crTextColor); + int index = Chat_GetColorIndex(mwdat->si->pszModule, cf.crTextColor); UINT u = IsDlgButtonChecked(GetParent(hwnd), IDC_COLOR); if (index >= 0) { - si->bFGSet = TRUE; - si->iFG = index; + mwdat->si->bFGSet = TRUE; + mwdat->si->iFG = index; } if (u == BST_UNCHECKED && cf.crTextColor != cr) @@ -926,13 +893,13 @@ static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, } if (mi->bBkgColor) { - int index = Chat_GetColorIndex(si->pszModule, cf.crBackColor); + int index = Chat_GetColorIndex(mwdat->si->pszModule, cf.crBackColor); COLORREF crB = (COLORREF)M.GetDword(FONTMODULE, "inputbg", SRMSGDEFSET_BKGCOLOUR); UINT u = IsDlgButtonChecked(hwndParent, IDC_BKGCOLOR); if (index >= 0) { - si->bBGSet = TRUE; - si->iBG = index; + mwdat->si->bBGSet = TRUE; + mwdat->si->iBG = index; } if (u == BST_UNCHECKED && cf.crBackColor != crB) @@ -1158,7 +1125,7 @@ static LRESULT CALLBACK ButtonSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, L static LRESULT CALLBACK LogSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndParent = GetParent(hwnd); - TWindowData *mwdat = (TWindowData*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); + CSrmmWindow *mwdat = (CSrmmWindow*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); switch (msg) { case WM_NCCALCSIZE: @@ -1202,7 +1169,7 @@ static LRESULT CALLBACK LogSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR SendMessage(hwnd, WM_COPY, 0, 0); sel.cpMin = sel.cpMax; SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); - SetFocus(GetDlgItem(hwndParent, IDC_CHAT_MESSAGE)); + SetFocus(GetDlgItem(hwndParent, IDC_MESSAGE)); } } break; @@ -1218,14 +1185,14 @@ static LRESULT CALLBACK LogSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR case WM_SYSKEYUP: if (wParam == VK_MENU) { - ProcessHotkeysByMsgFilter(hwnd, msg, wParam, lParam, IDC_CHAT_LOG); + ProcessHotkeysByMsgFilter(hwnd, msg, wParam, lParam, IDC_LOG); return 0; } break; case WM_SYSKEYDOWN: mwdat->fkeyProcessed = false; - if (ProcessHotkeysByMsgFilter(hwnd, msg, wParam, lParam, IDC_CHAT_LOG)) { + if (ProcessHotkeysByMsgFilter(hwnd, msg, wParam, lParam, IDC_LOG)) { mwdat->fkeyProcessed = true; return 0; } @@ -1250,13 +1217,13 @@ static LRESULT CALLBACK LogSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR break; case WM_CHAR: - BOOL isCtrl, isShift, isAlt; - KbdState(mwdat, isShift, isCtrl, isAlt); + bool isCtrl, isShift, isAlt; + mwdat->KbdState(isShift, isCtrl, isAlt); if (wParam == 0x03 && isCtrl) // Ctrl+C return DM_WMCopyHandler(hwnd, LogSubclassProc, msg, wParam, lParam); - SetFocus(GetDlgItem(hwndParent, IDC_CHAT_MESSAGE)); - SendDlgItemMessage(hwndParent, IDC_CHAT_MESSAGE, WM_CHAR, wParam, lParam); + SetFocus(GetDlgItem(hwndParent, IDC_MESSAGE)); + SendDlgItemMessage(hwndParent, IDC_MESSAGE, WM_CHAR, wParam, lParam); break; } @@ -1269,7 +1236,7 @@ static LRESULT CALLBACK LogSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR static LRESULT CALLBACK NicklistSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndParent = GetParent(hwnd); - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); switch (msg) { case WM_NCCALCSIZE: @@ -1569,175 +1536,239 @@ static void __cdecl phase2(void * lParam) // the actual group chat session window procedure.Handles the entire chat session window // which is usually a (tabbed) child of a container class window. -INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +CChatRoomDlg::CChatRoomDlg(TNewWindowData *pData) + : CTabBaseDlg(pData, IDD_CHANNEL) { - SESSION_INFO *si = NULL; - HWND hwndTab = GetParent(hwndDlg); - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - if (dat) - si = dat->si; + bType = SESSIONTYPE_CHAT; + Panel = new CInfoPanel(this); +} - if (dat == NULL && (uMsg == WM_ACTIVATE || uMsg == WM_SETFOCUS)) - return 0; +void CChatRoomDlg::OnInitDialog() +{ + SetWindowLongPtr(m_hwnd, GWLP_USERDATA, (LONG_PTR)this); + + si = newData->si; + m_hContact = si->hContact; + szProto = GetContactProto(si->hContact); + + cache = CContactCache::getContactCache(m_hContact); + cache->updateNick(); + cache->updateUIN(); + newData->item.lParam = (LPARAM)m_hwnd; + TabCtrl_SetItem(m_hwndParent, newData->iTabID, &newData->item); + iTabID = newData->iTabID; + pContainer = newData->pContainer; + si->pContainer = newData->pContainer; + si->hWnd = m_hwnd; + si->dat = this; + bIsAutosizingInput = IsAutoSplitEnabled(); + fLimitedUpdate = false; + iInputAreaHeight = -1; + if (!pContainer->settings->fPrivate) + si->iSplitterY = g_Settings.iSplitterY; + else { + if (M.GetByte(CHAT_MODULE, "SyncSplitter", 0)) + si->iSplitterY = pContainer->settings->splitterPos - DPISCALEY_S(23); + else + si->iSplitterY = g_Settings.iSplitterY; + } + + if (bIsAutosizingInput) + si->iSplitterY = GetDefaultMinimumInputHeight(); + + CProxyWindow::add(this); + + // Typing support for GCW_PRIVMESS sessions + if (si->iType == GCW_PRIVMESS) { + nTypeMode = PROTOTYPE_SELFTYPING_OFF; + SetTimer(m_hwnd, TIMERID_TYPE, 1000, NULL); + } + + Panel->getVisibility(); + Panel->Configure(); + M.AddWindow(m_hwnd, m_hContact); + BroadCastContainer(pContainer, DM_REFRESHTABINDEX, 0, 0); + + SendDlgItemMessage(m_hwnd, IDC_LOG, EM_SETOLECALLBACK, 0, (LPARAM)&reOleCallback); + SendDlgItemMessage(m_hwnd, IDC_LOG, EM_AUTOURLDETECT, 1, 0); + SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_PANELSPLITTER), GWLP_WNDPROC, (LONG_PTR)SplitterSubclassProc); + TABSRMM_FireEvent(m_hContact, m_hwnd, MSG_WINDOW_EVT_OPENING, 0); + + int mask = (int)SendDlgItemMessage(m_hwnd, IDC_LOG, EM_GETEVENTMASK, 0, 0); + SendDlgItemMessage(m_hwnd, IDC_LOG, EM_SETEVENTMASK, 0, mask | ENM_LINK | ENM_MOUSEEVENTS | ENM_KEYEVENTS); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_SETEVENTMASK, 0, ENM_REQUESTRESIZE | ENM_MOUSEEVENTS | ENM_SCROLL | ENM_KEYEVENTS | ENM_CHANGE); + SendDlgItemMessage(m_hwnd, IDC_LOG, EM_LIMITTEXT, 0x7FFFFFFF, 0); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(3, 3)); + SendDlgItemMessage(m_hwnd, IDC_LOG, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(3, 3)); + Panel->loadHeight(); + + if (PluginConfig.g_hMenuTrayUnread != 0 && m_hContact != 0 && szProto != NULL) + UpdateTrayMenu(0, wStatus, szProto, szStatus, m_hContact, FALSE); + + DM_ThemeChanged(); + SendDlgItemMessage(m_hwnd, IDC_LOG, EM_HIDESELECTION, TRUE, 0); + + GetMYUIN(); + GetMyNick(); + + HWND hwndBtn = CreateWindowEx(0, L"MButtonClass", L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, 0, 6, DPISCALEY_S(20), m_hwnd, (HMENU)IDC_TOGGLESIDEBAR, g_hInst, NULL); + CustomizeButton(hwndBtn); + SendMessage(hwndBtn, BUTTONSETASTHEMEDBTN, 1, 0); + SendMessage(hwndBtn, BUTTONSETCONTAINER, (LPARAM)pContainer, 0); + SendMessage(hwndBtn, BUTTONSETASFLATBTN, FALSE, 0); + SendMessage(hwndBtn, BUTTONSETASTOOLBARBUTTON, TRUE, 0); + SendMessage(hwndBtn, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Expand or collapse the side bar"), BATF_UNICODE); + + DM_InitTip(); + BB_InitDlgButtons(); + SendMessage(m_hwnd, WM_CBD_LOADICONS, 0, 0); + + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_SPLITTERX), SplitterSubclassProc); + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_SPLITTERY), SplitterSubclassProc); + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_LIST), NicklistSubclassProc); + mir_subclassWindow(m_log.GetHwnd(), LogSubclassProc); + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_FILTER), ButtonSubclassProc); + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_COLOR), ButtonSubclassProc); + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_BKGCOLOR), ButtonSubclassProc); + + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_MESSAGE), MessageSubclassProc); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_SUBCLASSED, 0, 0); + + SendMessage(m_hwnd, GC_SETWNDPROPS, 0, 0); + SendMessage(m_hwnd, GC_UPDATESTATUSBAR, 0, 0); + SendMessage(m_hwnd, GC_UPDATETITLE, 0, 1); - CHARFORMAT2 cf; - POINT pt, tmp, cur; RECT rc; + SendMessage(pContainer->hwnd, DM_QUERYCLIENTAREA, 0, (LPARAM)&rc); + SetWindowPos(m_hwnd, HWND_TOP, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), 0); + ShowWindow(m_hwnd, SW_SHOW); + PostMessage(m_hwnd, GC_UPDATENICKLIST, 0, 0); + pContainer->hwndActive = m_hwnd; + TABSRMM_FireEvent(m_hContact, m_hwnd, MSG_WINDOW_EVT_OPEN, 0); +} - switch (uMsg) { - case WM_INITDIALOG: - dat = (TWindowData*)mir_calloc(sizeof(TWindowData)); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); - { - TNewWindowData *newData = (TNewWindowData*)lParam; - dat->si = si = newData->si; - dat->hContact = si->hContact; - dat->szProto = GetContactProto(si->hContact); - dat->bType = SESSIONTYPE_CHAT; - dat->Panel = new CInfoPanel(dat); - - dat->cache = CContactCache::getContactCache(dat->hContact); - dat->cache->updateNick(); - dat->cache->updateUIN(); - newData->item.lParam = (LPARAM)hwndDlg; - TabCtrl_SetItem(hwndTab, newData->iTabID, &newData->item); - dat->iTabID = newData->iTabID; - dat->pContainer = newData->pContainer; - si->pContainer = newData->pContainer; - dat->hwnd = hwndDlg; - si->hWnd = hwndDlg; - si->dat = dat; - dat->bIsAutosizingInput = IsAutoSplitEnabled(dat); - dat->fLimitedUpdate = false; - dat->iInputAreaHeight = -1; - if (!dat->pContainer->settings->fPrivate) - si->iSplitterY = g_Settings.iSplitterY; - else { - if (M.GetByte(CHAT_MODULE, "SyncSplitter", 0)) - si->iSplitterY = dat->pContainer->settings->splitterPos - DPISCALEY_S(23); - else - si->iSplitterY = g_Settings.iSplitterY; - } +void CChatRoomDlg::OnDestroy() +{ + // Typing support for GCW_PRIVMESS sessions + if (si->iType == GCW_PRIVMESS) + if (nTypeMode == PROTOTYPE_SELFTYPING_ON) + DM_NotifyTyping(PROTOTYPE_SELFTYPING_OFF); - if (dat->bIsAutosizingInput) - si->iSplitterY = GetDefaultMinimumInputHeight(dat); + if (pcli->pfnGetEvent(si->hContact, 0)) + pcli->pfnRemoveEvent(si->hContact, GC_FAKE_EVENT); + si->wState &= ~STATE_TALK; + si->hWnd = NULL; + si->dat = NULL; + si->pContainer = NULL; + si = NULL; - CProxyWindow::add(dat); + TABSRMM_FireEvent(m_hContact, m_hwnd, MSG_WINDOW_EVT_CLOSING, 0); - // Typing support for GCW_PRIVMESS sessions - if (si->iType == GCW_PRIVMESS) { - dat->nTypeMode = PROTOTYPE_SELFTYPING_OFF; - SetTimer(hwndDlg, TIMERID_TYPE, 1000, NULL); - } + if (!bIsAutosizingInput) + db_set_w(NULL, CHAT_MODULE, "SplitterX", (WORD)g_Settings.iSplitterX); + + if (pContainer->settings->fPrivate && !IsAutoSplitEnabled()) + db_set_w(NULL, CHAT_MODULE, "splitY", (WORD)g_Settings.iSplitterY); - dat->Panel->getVisibility(); - dat->Panel->Configure(); - M.AddWindow(hwndDlg, dat->hContact); - BroadCastContainer(dat->pContainer, DM_REFRESHTABINDEX, 0, 0); + DM_FreeTheme(); - SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_SETOLECALLBACK, 0, (LPARAM)&reOleCallback); - SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_AUTOURLDETECT, 1, 0); - SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PANELSPLITTER), GWLP_WNDPROC, (LONG_PTR)SplitterSubclassProc); - TABSRMM_FireEvent(dat->hContact, hwndDlg, MSG_WINDOW_EVT_OPENING, 0); + UpdateTrayMenuState(this, FALSE); // remove me from the tray menu (if still there) + if (PluginConfig.g_hMenuTrayUnread) + DeleteMenu(PluginConfig.g_hMenuTrayUnread, (UINT_PTR)m_hContact, MF_BYCOMMAND); - int mask = (int)SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_GETEVENTMASK, 0, 0); - SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_SETEVENTMASK, 0, mask | ENM_LINK | ENM_MOUSEEVENTS | ENM_KEYEVENTS); - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_SETEVENTMASK, 0, ENM_REQUESTRESIZE | ENM_MOUSEEVENTS | ENM_SCROLL | ENM_KEYEVENTS | ENM_CHANGE); - SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_LIMITTEXT, 0x7FFFFFFF, 0); - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(3, 3)); - SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(3, 3)); - dat->Panel->loadHeight(); + if (hSmileyIcon) + DestroyIcon(hSmileyIcon); - if (PluginConfig.g_hMenuTrayUnread != 0 && dat->hContact != 0 && dat->szProto != NULL) - UpdateTrayMenu(0, dat->wStatus, dat->szProto, dat->szStatus, dat->hContact, FALSE); + if (hwndTip) + DestroyWindow(hwndTip); - DM_ThemeChanged(dat); - SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_HIDESELECTION, TRUE, 0); + if (hCurHyperlinkHand) + DestroyCursor(hCurHyperlinkHand); + + int i = GetTabIndexFromHWND(m_hwndParent, m_hwnd); + if (i >= 0) { + SendMessage(m_hwndParent, WM_USER + 100, 0, 0); // clean up tooltip + TabCtrl_DeleteItem(m_hwndParent, i); + BroadCastContainer(pContainer, DM_REFRESHTABINDEX, 0, 0); + iTabID = -1; + } + if (pWnd) { + delete pWnd; + pWnd = 0; + } + if (sbCustom) { + delete sbCustom; + sbCustom = 0; + } - GetMYUIN(dat); - GetMyNick(dat); + M.RemoveWindow(m_hwnd); - HWND hwndBtn = CreateWindowEx(0, L"MButtonClass", L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, 0, 6, DPISCALEY_S(20), hwndDlg, (HMENU)IDC_TOGGLESIDEBAR, g_hInst, NULL); - CustomizeButton(hwndBtn); - SendMessage(hwndBtn, BUTTONSETASTHEMEDBTN, 1, 0); - SendMessage(hwndBtn, BUTTONSETCONTAINER, (LPARAM)dat->pContainer, 0); - SendMessage(hwndBtn, BUTTONSETASFLATBTN, FALSE, 0); - SendMessage(hwndBtn, BUTTONSETASTOOLBARBUTTON, TRUE, 0); - SendMessage(hwndBtn, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Expand or collapse the side bar"), BATF_UNICODE); + TABSRMM_FireEvent(m_hContact, m_hwnd, MSG_WINDOW_EVT_CLOSE, 0); - DM_InitTip(dat); - BB_InitDlgButtons(dat); - SendMessage(hwndDlg, WM_CBD_LOADICONS, 0, 0); + memset((void*)&pContainer->mOld, -1000, sizeof(MARGINS)); + PostMessage(pContainer->hwnd, WM_SIZE, 0, 1); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_SPLITTERX), SplitterSubclassProc); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_SPLITTERY), SplitterSubclassProc); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_LIST), NicklistSubclassProc); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_CHAT_LOG), LogSubclassProc); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_FILTER), ButtonSubclassProc); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_COLOR), ButtonSubclassProc); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_BKGCOLOR), ButtonSubclassProc); + delete Panel; - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE), MessageSubclassProc); - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_SUBCLASSED, 0, 0); + if (pContainer->dwFlags & CNT_SIDEBAR) + pContainer->SideBar->removeSession(this); + mir_free(enteredText); + SetWindowLongPtr(m_hwnd, GWLP_USERDATA, 0); +} - SendMessage(hwndDlg, GC_SETWNDPROPS, 0, 0); - SendMessage(hwndDlg, GC_UPDATESTATUSBAR, 0, 0); - SendMessage(hwndDlg, GC_UPDATETITLE, 0, 1); +INT_PTR CChatRoomDlg::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if (si == NULL && (uMsg == WM_ACTIVATE || uMsg == WM_SETFOCUS)) + return 0; - SendMessage(dat->pContainer->hwnd, DM_QUERYCLIENTAREA, 0, (LPARAM)&rc); - SetWindowPos(hwndDlg, HWND_TOP, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), 0); - ShowWindow(hwndDlg, SW_SHOW); - PostMessage(hwndDlg, GC_UPDATENICKLIST, 0, 0); - dat->pContainer->hwndActive = hwndDlg; - TABSRMM_FireEvent(dat->hContact, hwndDlg, MSG_WINDOW_EVT_OPEN, 0); - } - break; + CHARFORMAT2 cf; + POINT pt, tmp, cur; + RECT rc; + switch (uMsg) { case WM_SETFOCUS: if (CMimAPI::m_shutDown) break; - Chat_UpdateWindowState(dat, WM_SETFOCUS); - SetFocus(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)); + UpdateWindowState(WM_SETFOCUS); + SetFocus(GetDlgItem(m_hwnd, IDC_MESSAGE)); return 1; case WM_TIMECHANGE: - PostMessage(hwndDlg, GC_REDRAWLOG, 0, 0); + PostMessage(m_hwnd, GC_REDRAWLOG, 0, 0); break; case WM_CBD_LOADICONS: - Srmm_UpdateToolbarIcons(hwndDlg); + Srmm_UpdateToolbarIcons(m_hwnd); return 0; case GC_SETWNDPROPS: - InitButtons(hwndDlg, si); - SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_SETBKGNDCOLOR, 0, M.GetDword(FONTMODULE, SRMSGSET_BKGCOLOUR, SRMSGDEFSET_BKGCOLOUR)); + InitButtons(m_hwnd, si); + SendDlgItemMessage(m_hwnd, IDC_LOG, EM_SETBKGNDCOLOR, 0, M.GetDword(FONTMODULE, SRMSGSET_BKGCOLOUR, SRMSGDEFSET_BKGCOLOUR)); - DM_InitRichEdit(dat); - SendDlgItemMessage(hwndDlg, IDOK, BUTTONSETASNORMAL, TRUE, 0); + DM_InitRichEdit(this); + SendDlgItemMessage(m_hwnd, IDOK, BUTTONSETASNORMAL, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_LIST, LB_SETITEMHEIGHT, 0, (LPARAM)g_Settings.iNickListFontHeight); - InvalidateRect(GetDlgItem(hwndDlg, IDC_LIST), NULL, TRUE); + SendDlgItemMessage(m_hwnd, IDC_LIST, LB_SETITEMHEIGHT, 0, (LPARAM)g_Settings.iNickListFontHeight); + InvalidateRect(GetDlgItem(m_hwnd, IDC_LIST), NULL, TRUE); - SendDlgItemMessage(hwndDlg, IDC_FILTER, BUTTONSETOVERLAYICON, + SendDlgItemMessage(m_hwnd, IDC_FILTER, BUTTONSETOVERLAYICON, (LPARAM)(si->bFilterEnabled ? PluginConfig.g_iconOverlayEnabled : PluginConfig.g_iconOverlayDisabled), 0); - SendMessage(hwndDlg, WM_SIZE, 0, 0); - SendMessage(hwndDlg, GC_REDRAWLOG2, 0, 0); + SendMessage(m_hwnd, WM_SIZE, 0, 0); + SendMessage(m_hwnd, GC_REDRAWLOG2, 0, 0); break; case DM_UPDATETITLE: - return SendMessage(hwndDlg, GC_UPDATETITLE, wParam, lParam); - case GC_UPDATETITLE: - if (!dat->bWasDeleted) { - dat->wStatus = si->wStatus; + if (!m_bWasDeleted) { + wStatus = si->wStatus; - const wchar_t *szNick = dat->cache->getNick(); + const wchar_t *szNick = cache->getNick(); if (mir_wstrlen(szNick) > 0) { if (M.GetByte("cuttitle", 0)) - CutContactName(szNick, dat->newtitle, _countof(dat->newtitle)); + CutContactName(szNick, newtitle, _countof(newtitle)); else - wcsncpy_s(dat->newtitle, szNick, _TRUNCATE); + wcsncpy_s(newtitle, szNick, _TRUNCATE); } wchar_t szTemp[100]; @@ -1745,13 +1776,13 @@ INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar switch (si->iType) { case GCW_CHATROOM: - hIcon = Skin_LoadProtoIcon(si->pszModule, (dat->wStatus <= ID_STATUS_OFFLINE) ? ID_STATUS_OFFLINE : dat->wStatus); + hIcon = Skin_LoadProtoIcon(si->pszModule, (wStatus <= ID_STATUS_OFFLINE) ? ID_STATUS_OFFLINE : wStatus); mir_snwprintf(szTemp, (si->nUsersInNicklist == 1) ? TranslateT("%s: chat room (%u user%s)") : TranslateT("%s: chat room (%u users%s)"), szNick, si->nUsersInNicklist, si->bFilterEnabled ? TranslateT(", event filter active") : L""); break; case GCW_PRIVMESS: - hIcon = Skin_LoadProtoIcon(si->pszModule, (dat->wStatus <= ID_STATUS_OFFLINE) ? ID_STATUS_OFFLINE : dat->wStatus); + hIcon = Skin_LoadProtoIcon(si->pszModule, (wStatus <= ID_STATUS_OFFLINE) ? ID_STATUS_OFFLINE : wStatus); if (si->nUsersInNicklist == 1) mir_snwprintf(szTemp, TranslateT("%s: message session"), szNick); else @@ -1763,36 +1794,36 @@ INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar break; } - if (dat->pWnd) { - dat->pWnd->updateTitle(dat->newtitle); - dat->pWnd->updateIcon(hIcon); + if (pWnd) { + pWnd->updateTitle(newtitle); + pWnd->updateIcon(hIcon); } - dat->hTabStatusIcon = hIcon; + hTabStatusIcon = hIcon; if (lParam) - dat->hTabIcon = dat->hTabStatusIcon; + hTabIcon = hTabStatusIcon; - if (dat->cache->getStatus() != dat->cache->getOldStatus()) { - wcsncpy_s(dat->szStatus, pcli->pfnGetStatusModeDescription(dat->wStatus, 0), _TRUNCATE); + if (cache->getStatus() != cache->getOldStatus()) { + wcsncpy_s(szStatus, pcli->pfnGetStatusModeDescription(wStatus, 0), _TRUNCATE); TCITEM item = { 0 }; item.mask = TCIF_TEXT; - item.pszText = dat->newtitle; - TabCtrl_SetItem(hwndTab, dat->iTabID, &item); + item.pszText = newtitle; + TabCtrl_SetItem(m_hwndParent, iTabID, &item); } - SetWindowText(hwndDlg, szTemp); - if (dat->pContainer->hwndActive == hwndDlg) { - SendMessage(dat->pContainer->hwnd, DM_UPDATETITLE, (WPARAM)hwndDlg, 1); - SendMessage(hwndDlg, GC_UPDATESTATUSBAR, 0, 0); + SetWindowText(m_hwnd, szTemp); + if (pContainer->hwndActive == m_hwnd) { + SendMessage(pContainer->hwnd, DM_UPDATETITLE, (WPARAM)m_hwnd, 1); + SendMessage(m_hwnd, GC_UPDATESTATUSBAR, 0, 0); } } break; case GC_UPDATESTATUSBAR: - if (dat->bWasDeleted) + if (m_bWasDeleted) return 0; - if (dat->pContainer->hwndActive != hwndDlg || dat->pContainer->hwndStatus == 0 || CMimAPI::m_shutDown || dat->szStatusBar[0]) + if (pContainer->hwndActive != m_hwnd || pContainer->hwndStatus == 0 || CMimAPI::m_shutDown || szStatusBar[0]) break; if (si->pszModule != NULL) { @@ -1807,10 +1838,10 @@ INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar break; int x = 12; - x += GetTextPixelSize(mi->ptszModDispName, (HFONT)SendMessage(dat->pContainer->hwndStatus, WM_GETFONT, 0, 0), TRUE); + x += GetTextPixelSize(mi->ptszModDispName, (HFONT)SendMessage(pContainer->hwndStatus, WM_GETFONT, 0, 0), TRUE); x += GetSystemMetrics(SM_CXSMICON); - if (dat->Panel->isActive()) { + if (Panel->isActive()) { time_t now = time(0); DWORD diff = (now - mi->idleTimeStamp) / 60; @@ -1827,7 +1858,7 @@ INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar } else mir_snwprintf(mi->tszIdleMsg, TranslateT(", %d %s idle"), diff, diff > 1 ? TranslateT("minutes") : TranslateT("minute")); } - mir_snwprintf(szFinalStatusBarText, TranslateT("%s on %s%s"), dat->szMyNickname, mi->ptszModDispName, mi->tszIdleMsg); + mir_snwprintf(szFinalStatusBarText, TranslateT("%s on %s%s"), szMyNickname, mi->ptszModDispName, mi->tszIdleMsg); } else { if (si->ptszStatusbarText) @@ -1835,52 +1866,52 @@ INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar else wcsncpy_s(szFinalStatusBarText, mi->ptszModDispName, _TRUNCATE); } - SendMessage(dat->pContainer->hwndStatus, SB_SETTEXT, 0, (LPARAM)szFinalStatusBarText); - UpdateStatusBar(dat); - dat->Panel->Invalidate(); - if (dat->pWnd) - dat->pWnd->Invalidate(); + SendMessage(pContainer->hwndStatus, SB_SETTEXT, 0, (LPARAM)szFinalStatusBarText); + UpdateStatusBar(); + Panel->Invalidate(); + if (pWnd) + pWnd->Invalidate(); return TRUE; } break; case WM_SIZE: - if (dat->ipFieldHeight == 0) - dat->ipFieldHeight = CInfoPanel::m_ipConfig.height1; + if (ipFieldHeight == 0) + ipFieldHeight = CInfoPanel::m_ipConfig.height1; if (wParam == SIZE_MAXIMIZED) - PostMessage(hwndDlg, GC_SCROLLTOBOTTOM, 0, 0); + PostMessage(m_hwnd, GC_SCROLLTOBOTTOM, 0, 0); - if (!IsIconic(hwndDlg)) { - int panelHeight = dat->Panel->getHeight() + 1; + if (!IsIconic(m_hwnd)) { + int panelHeight = Panel->getHeight() + 1; - GetClientRect(hwndDlg, &rc); + GetClientRect(m_hwnd, &rc); int cx = rc.right; - Utils_ResizeDialog(hwndDlg, g_hInst, MAKEINTRESOURCEA(IDD_CHANNEL), RoomWndResize, (LPARAM)si); + CTabBaseDlg::DlgProc(uMsg, 0, 0); // call basic window resizer - BB_SetButtonsPos(dat); + BB_SetButtonsPos(); rc.left = panelHeight <= CInfoPanel::LEFT_OFFSET_LOGO ? panelHeight : CInfoPanel::LEFT_OFFSET_LOGO; rc.right = cx; rc.top = 1; - rc.bottom = (panelHeight > CInfoPanel::DEGRADE_THRESHOLD ? rc.top + dat->ipFieldHeight - 2 : panelHeight - 1); - dat->rcNick = rc; + rc.bottom = (panelHeight > CInfoPanel::DEGRADE_THRESHOLD ? rc.top + ipFieldHeight - 2 : panelHeight - 1); + rcNick = rc; rc.left = panelHeight <= CInfoPanel::LEFT_OFFSET_LOGO ? panelHeight : CInfoPanel::LEFT_OFFSET_LOGO; rc.right = cx; rc.bottom = panelHeight - 2; - rc.top = dat->rcNick.bottom + 1; - dat->rcUIN = rc; + rc.top = rcNick.bottom + 1; + rcUIN = rc; - if (dat->hwndIEView || dat->hwndHPP) - Chat_ResizeIeView(dat); - DetermineMinHeight(dat); + if (hwndIEView || hwndHPP) + ResizeIeView(); + DetermineMinHeight(); } - break; + return 0; case GC_REDRAWWINDOW: - InvalidateRect(hwndDlg, NULL, TRUE); + InvalidateRect(m_hwnd, NULL, TRUE); break; case GC_REDRAWLOG: @@ -1896,49 +1927,49 @@ INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar if ((si->iType != GCW_CHATROOM && si->iType != GCW_PRIVMESS) || !si->bFilterEnabled || (si->iLogFilterFlags&pLog->iType) != 0) index++; } - Log_StreamInEvent(hwndDlg, pLog, si, TRUE); + StreamInEvents(pLog, si, TRUE); mir_forkthread(phase2, si); } - else Log_StreamInEvent(hwndDlg, si->pLogEnd, si, TRUE); + else StreamInEvents(si->pLogEnd, si, TRUE); } - else SendMessage(hwndDlg, GC_CONTROL_MSG, WINDOW_CLEARLOG, 0); + else SendMessage(m_hwnd, GC_CONTROL_MSG, WINDOW_CLEARLOG, 0); break; case GC_REDRAWLOG2: si->LastTime = 0; if (si->pLog) - Log_StreamInEvent(hwndDlg, si->pLogEnd, si, TRUE); + StreamInEvents(si->pLogEnd, si, TRUE); break; case GC_ADDLOG: if (g_Settings.bUseDividers && g_Settings.bDividersUsePopupConfig) { - if (!MessageWindowOpened(0, (LPARAM)hwndDlg)) - SendMessage(hwndDlg, DM_ADDDIVIDER, 0, 0); + if (!MessageWindowOpened(0, (LPARAM)m_hwnd)) + SendMessage(m_hwnd, DM_ADDDIVIDER, 0, 0); } else if (g_Settings.bUseDividers) { - bool bInactive = (GetForegroundWindow() != dat->pContainer->hwnd || GetActiveWindow() != dat->pContainer->hwnd); + bool bInactive = (GetForegroundWindow() != pContainer->hwnd || GetActiveWindow() != pContainer->hwnd); if (bInactive) - SendMessage(hwndDlg, DM_ADDDIVIDER, 0, 0); - else if (dat->pContainer->hwndActive != hwndDlg) - SendMessage(hwndDlg, DM_ADDDIVIDER, 0, 0); + SendMessage(m_hwnd, DM_ADDDIVIDER, 0, 0); + else if (pContainer->hwndActive != m_hwnd) + SendMessage(m_hwnd, DM_ADDDIVIDER, 0, 0); } if (si->pLogEnd) - Log_StreamInEvent(hwndDlg, si->pLog, si, FALSE); + StreamInEvents(si->pLog, si, FALSE); else - SendMessage(hwndDlg, GC_CONTROL_MSG, WINDOW_CLEARLOG, 0); + SendMessage(m_hwnd, GC_CONTROL_MSG, WINDOW_CLEARLOG, 0); break; case DM_TYPING: // Typing support for GCW_PRIVMESS sessions if (si->iType == GCW_PRIVMESS) { - int preTyping = dat->nTypeSecs != 0; - dat->nTypeSecs = (int)lParam > 0 ? (int)lParam : 0; + int preTyping = nTypeSecs != 0; + nTypeSecs = (int)lParam > 0 ? (int)lParam : 0; - if (dat->nTypeSecs) - dat->bShowTyping = 0; + if (nTypeSecs) + bShowTyping = 0; - SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, preTyping); + SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, preTyping); } return TRUE; @@ -1950,7 +1981,7 @@ INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar { MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *)lParam; if (mis->CtlType == ODT_MENU) { - if (dat->Panel->isHovered()) { + if (Panel->isHovered()) { mis->itemHeight = 0; mis->itemWidth = 6; return TRUE; @@ -1965,7 +1996,7 @@ INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar { DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam; if (dis->CtlType == ODT_MENU) { - if (dat->Panel->isHovered()) { + if (Panel->isHovered()) { DrawMenuItem(dis, (HICON)dis->itemData, 0); return TRUE; } @@ -2066,36 +2097,36 @@ INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar { DWORD idFrom = GetDlgCtrlID((HWND)wParam); if (idFrom >= MIN_CBUTTONID && idFrom <= MAX_CBUTTONID) - Srmm_ClickToolbarIcon(dat->hContact, idFrom, (HWND)wParam, 1); + Srmm_ClickToolbarIcon(m_hContact, idFrom, (HWND)wParam, 1); } break; case GC_UPDATENICKLIST: { - int i = SendDlgItemMessage(hwndDlg, IDC_LIST, LB_GETTOPINDEX, 0, 0); - SendDlgItemMessage(hwndDlg, IDC_LIST, LB_SETCOUNT, si->nUsersInNicklist, 0); - SendDlgItemMessage(hwndDlg, IDC_LIST, LB_SETTOPINDEX, i, 0); - SendMessage(hwndDlg, GC_UPDATETITLE, 0, 0); + int i = SendDlgItemMessage(m_hwnd, IDC_LIST, LB_GETTOPINDEX, 0, 0); + SendDlgItemMessage(m_hwnd, IDC_LIST, LB_SETCOUNT, si->nUsersInNicklist, 0); + SendDlgItemMessage(m_hwnd, IDC_LIST, LB_SETTOPINDEX, i, 0); + SendMessage(m_hwnd, GC_UPDATETITLE, 0, 0); } break; case GC_CONTROL_MSG: switch (wParam) { case SESSION_OFFLINE: - SendMessage(hwndDlg, GC_UPDATESTATUSBAR, 0, 0); + SendMessage(m_hwnd, GC_UPDATESTATUSBAR, 0, 0); SendMessage(si->hWnd, GC_UPDATENICKLIST, 0, 0); return TRUE; case SESSION_ONLINE: - SendMessage(hwndDlg, GC_UPDATESTATUSBAR, 0, 0); + SendMessage(m_hwnd, GC_UPDATESTATUSBAR, 0, 0); return TRUE; case WINDOW_HIDDEN: - SendMessage(hwndDlg, GC_CLOSEWINDOW, 0, 1); + SendMessage(m_hwnd, GC_CLOSEWINDOW, 0, 1); return TRUE; case WINDOW_CLEARLOG: - SetDlgItemText(hwndDlg, IDC_CHAT_LOG, L""); + SetDlgItemText(m_hwnd, IDC_LOG, L""); return TRUE; case SESSION_TERMINATE: @@ -2103,25 +2134,25 @@ INT_PTR CALLBACK RoomWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar pcli->pfnRemoveEvent(si->hContact, GC_FAKE_EVENT); si->wState &= ~STATE_TALK; - dat->bWasDeleted = 1; + m_bWasDeleted = true; db_set_w(si->hContact, si->pszModule, "ApparentMode", 0); - SendMessage(hwndDlg, GC_CLOSEWINDOW, 0, lParam == 2 ? lParam : 1); + SendMessage(m_hwnd, GC_CLOSEWINDOW, 0, lParam == 2 ? lParam : 1); return TRUE; case WINDOW_MINIMIZE: - ShowWindow(hwndDlg, SW_MINIMIZE); + ShowWindow(m_hwnd, SW_MINIMIZE); LABEL_SHOWWINDOW: - SendMessage(hwndDlg, WM_SIZE, 0, 0); - SendMessage(hwndDlg, GC_REDRAWLOG, 0, 0); - SendMessage(hwndDlg, GC_UPDATENICKLIST, 0, 0); - SendMessage(hwndDlg, GC_UPDATESTATUSBAR, 0, 0); - ShowWindow(hwndDlg, SW_SHOW); - SendMessage(hwndDlg, WM_SIZE, 0, 0); - SetForegroundWindow(hwndDlg); + SendMessage(m_hwnd, WM_SIZE, 0, 0); + SendMessage(m_hwnd, GC_REDRAWLOG, 0, 0); + SendMessage(m_hwnd, GC_UPDATENICKLIST, 0, 0); + SendMessage(m_hwnd, GC_UPDATESTATUSBAR, 0, 0); + ShowWindow(m_hwnd, SW_SHOW); + SendMessage(m_hwnd, WM_SIZE, 0, 0); + SetForegroundWindow(m_hwnd); return TRUE; case WINDOW_MAXIMIZE: - ShowWindow(hwndDlg, SW_MAXIMIZE); + ShowWindow(m_hwnd, SW_MAXIMIZE); goto LABEL_SHOWWINDOW; case SESSION_INITDONE: @@ -2130,8 +2161,8 @@ LABEL_SHOWWINDOW: // fall through case WINDOW_VISIBLE: - if (IsIconic(hwndDlg)) - ShowWindow(hwndDlg, SW_NORMAL); + if (IsIconic(m_hwnd)) + ShowWindow(m_hwnd, SW_NORMAL); goto LABEL_SHOWWINDOW; } break; @@ -2139,11 +2170,11 @@ LABEL_SHOWWINDOW: case DM_SPLITTERMOVED: RECT rcLog; { - GetWindowRect(GetDlgItem(hwndDlg, IDC_CHAT_LOG), &rcLog); - if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_SPLITTERX)) { - GetClientRect(hwndDlg, &rc); + GetWindowRect(m_log.GetHwnd(), &rcLog); + if ((HWND)lParam == GetDlgItem(m_hwnd, IDC_SPLITTERX)) { + GetClientRect(m_hwnd, &rc); pt.x = wParam, pt.y = 0; - ScreenToClient(hwndDlg, &pt); + ScreenToClient(m_hwnd, &pt); si->iSplitterX = rc.right - pt.x + 1; if (si->iSplitterX < 35) @@ -2151,13 +2182,13 @@ LABEL_SHOWWINDOW: if (si->iSplitterX > rc.right - rc.left - 35) si->iSplitterX = rc.right - rc.left - 35; g_Settings.iSplitterX = si->iSplitterX; - SendMessage(dat->hwnd, WM_SIZE, 0, 0); + SendMessage(GetHwnd(), WM_SIZE, 0, 0); } - else if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_SPLITTERY) || lParam == -1) { - GetClientRect(hwndDlg, &rc); - rc.top += (dat->Panel->isActive() ? dat->Panel->getHeight() + 40 : 30); + else if ((HWND)lParam == GetDlgItem(m_hwnd, IDC_SPLITTERY) || lParam == -1) { + GetClientRect(m_hwnd, &rc); + rc.top += (Panel->isActive() ? Panel->getHeight() + 40 : 30); pt.x = 0, pt.y = wParam; - ScreenToClient(hwndDlg, &pt); + ScreenToClient(m_hwnd, &pt); si->iSplitterY = rc.bottom - pt.y + DPISCALEY_S(1); if (si->iSplitterY < DPISCALEY_S(23)) @@ -2165,19 +2196,19 @@ LABEL_SHOWWINDOW: if (si->iSplitterY > rc.bottom - rc.top - DPISCALEY_S(40)) si->iSplitterY = rc.bottom - rc.top - DPISCALEY_S(40); g_Settings.iSplitterY = si->iSplitterY; - CSkin::UpdateToolbarBG(dat); - SendMessage(dat->hwnd, WM_SIZE, 0, 0); + UpdateToolbarBG(); + SendMessage(GetHwnd(), WM_SIZE, 0, 0); } - else if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_PANELSPLITTER)) { + else if ((HWND)lParam == GetDlgItem(m_hwnd, IDC_PANELSPLITTER)) { pt.x = 0, pt.y = wParam; - ScreenToClient(hwndDlg, &pt); - GetClientRect(GetDlgItem(hwndDlg, IDC_CHAT_LOG), &rc); + ScreenToClient(m_hwnd, &pt); + GetClientRect(m_log.GetHwnd(), &rc); if ((pt.y + 2 >= MIN_PANELHEIGHT + 2) && (pt.y + 2 < 100) && (pt.y + 2 < rc.bottom - 30)) - dat->Panel->setHeight(pt.y + 2); - RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE); + Panel->setHeight(pt.y + 2); + RedrawWindow(m_hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE); if (M.isAero()) - InvalidateRect(GetParent(hwndDlg), NULL, FALSE); - SendMessage(hwndDlg, WM_SIZE, DM_SPLITTERMOVED, 0); + InvalidateRect(m_hwndParent, NULL, FALSE); + SendMessage(m_hwnd, WM_SIZE, DM_SPLITTERMOVED, 0); break; } } @@ -2200,143 +2231,143 @@ LABEL_SHOWWINDOW: case GC_CHANGEFILTERFLAG: if (si->iLogFilterFlags == 0 && si->bFilterEnabled) - SendMessage(hwndDlg, WM_COMMAND, IDC_FILTER, 0); + SendMessage(m_hwnd, WM_COMMAND, IDC_FILTER, 0); break; case GC_SHOWFILTERMENU: - si->hwndStatus = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_FILTER), dat->pContainer->hwnd, FilterWndProc, (LPARAM)si); + si->hwndStatus = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_FILTER), pContainer->hwnd, FilterWndProc, (LPARAM)si); TranslateDialogDefault(si->hwndStatus); RECT rcFilter; GetClientRect(si->hwndStatus, &rcFilter); - GetWindowRect(GetDlgItem(hwndDlg, IDC_CHAT_LOG), &rcLog); + GetWindowRect(m_log.GetHwnd(), &rcLog); pt.x = rcLog.right; pt.y = rcLog.bottom; - ScreenToClient(dat->pContainer->hwnd, &pt); + ScreenToClient(pContainer->hwnd, &pt); SetWindowPos(si->hwndStatus, HWND_TOP, pt.x - rcFilter.right, pt.y - rcFilter.bottom, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); break; case DM_SPLITTERGLOBALEVENT: - DM_SplitterGlobalEvent(dat, wParam, lParam); + DM_SplitterGlobalEvent(this, wParam, lParam); return 0; case GC_SHOWCOLORCHOOSER: - pci->ColorChooser(si, lParam == IDC_COLOR, hwndDlg, GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE), GetDlgItem(hwndDlg, lParam)); + pci->ColorChooser(si, lParam == IDC_COLOR, m_hwnd, GetDlgItem(m_hwnd, IDC_MESSAGE), GetDlgItem(m_hwnd, lParam)); break; case GC_SCROLLTOBOTTOM: - DM_ScrollToBottom(dat, wParam, lParam); + DM_ScrollToBottom(this, wParam, lParam); return 0; case WM_TIMER: if (wParam == TIMERID_FLASHWND) - if (dat->mayFlashTab) - FlashTab(dat, hwndTab, dat->iTabID, &dat->bTabFlash, TRUE, dat->hTabIcon); + if (m_bCanFlashTab) + FlashTab(true); // Typing support for GCW_PRIVMESS sessions if (si->iType == GCW_PRIVMESS && wParam == TIMERID_TYPE) - DM_Typing(dat); + DM_Typing(this); break; case WM_ACTIVATE: if (LOWORD(wParam) != WA_ACTIVE) { - dat->pContainer->hwndSaved = 0; + pContainer->hwndSaved = 0; break; } // fall through case WM_MOUSEACTIVATE: - Chat_UpdateWindowState(dat, WM_ACTIVATE); + UpdateWindowState(WM_ACTIVATE); return 1; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case EN_MSGFILTER: - BOOL isShift, isCtrl, isMenu; + bool isShift, isCtrl, isMenu; { UINT msg = ((MSGFILTER *)lParam)->msg; WPARAM wp = ((MSGFILTER *)lParam)->wParam; LPARAM lp = ((MSGFILTER *)lParam)->lParam; - KbdState(dat, isShift, isCtrl, isMenu); + KbdState(isShift, isCtrl, isMenu); MSG message; - message.hwnd = hwndDlg; + message.hwnd = m_hwnd; message.message = msg; message.lParam = lp; message.wParam = wp; if (msg == WM_SYSKEYUP) { if (wp == VK_MENU) - if (!dat->fkeyProcessed && !(GetKeyState(VK_CONTROL) & 0x8000) && !(GetKeyState(VK_SHIFT) & 0x8000) && !(lp & (1 << 24))) - dat->pContainer->MenuBar->autoShow(); + if (!fkeyProcessed && !(GetKeyState(VK_CONTROL) & 0x8000) && !(GetKeyState(VK_SHIFT) & 0x8000) && !(lp & (1 << 24))) + pContainer->MenuBar->autoShow(); - return _dlgReturn(hwndDlg, 0); + return _dlgReturn(m_hwnd, 0); } if (msg == WM_MOUSEMOVE) { GetCursorPos(&pt); - DM_DismissTip(dat, pt); - dat->Panel->trackMouse(pt); + DM_DismissTip(this, pt); + Panel->trackMouse(pt); break; } if (msg == WM_KEYDOWN) { if ((wp == VK_INSERT && isShift && !isCtrl && !isMenu) || (wp == 'V' && !isShift && !isMenu && isCtrl)) { - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_PASTESPECIAL, CF_UNICODETEXT, 0); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_PASTESPECIAL, CF_UNICODETEXT, 0); ((MSGFILTER*)lParam)->msg = WM_NULL; ((MSGFILTER*)lParam)->wParam = 0; ((MSGFILTER*)lParam)->lParam = 0; - return _dlgReturn(hwndDlg, 1); + return _dlgReturn(m_hwnd, 1); } } if (msg == WM_LBUTTONDOWN || msg == WM_RBUTTONDOWN || msg == WM_MBUTTONDOWN) - dat->pContainer->MenuBar->Cancel(); + pContainer->MenuBar->Cancel(); if ((msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN) && !(GetKeyState(VK_RMENU) & 0x8000)) { - if (DM_GenericHotkeysCheck(&message, dat)) { - dat->fkeyProcessed = true; - return _dlgReturn(hwndDlg, 1); + if (DM_GenericHotkeysCheck(&message, this)) { + fkeyProcessed = true; + return _dlgReturn(m_hwnd, 1); } LRESULT mim_hotkey_check = CallService(MS_HOTKEY_CHECK, (WPARAM)&message, (LPARAM)(TABSRMM_HK_SECTION_GC)); if (mim_hotkey_check) - dat->fkeyProcessed = true; + fkeyProcessed = true; switch (mim_hotkey_check) { case TABSRMM_HK_CHANNELMGR: - SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_CHANMGR, BN_CLICKED), 0); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_CHANMGR, BN_CLICKED), 0); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_FILTERTOGGLE: - SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_FILTER, BN_CLICKED), 0); - InvalidateRect(GetDlgItem(hwndDlg, IDC_FILTER), NULL, TRUE); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_FILTER, BN_CLICKED), 0); + InvalidateRect(GetDlgItem(m_hwnd, IDC_FILTER), NULL, TRUE); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_LISTTOGGLE: - SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_SHOWNICKLIST, BN_CLICKED), 0); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_SHOWNICKLIST, BN_CLICKED), 0); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_MUC_SHOWSERVER: if (si->iType != GCW_SERVER) - pci->DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_MESSAGE, NULL, L"/servershow", 0); - return _dlgReturn(hwndDlg, 1); + pci->DoEventHookAsync(m_hwnd, si->ptszID, si->pszModule, GC_USER_MESSAGE, NULL, L"/servershow", 0); + return _dlgReturn(m_hwnd, 1); } } - if (msg == WM_KEYDOWN && ((NMHDR*)lParam)->idFrom != IDC_CHAT_MESSAGE) { + if (msg == WM_KEYDOWN && ((NMHDR*)lParam)->idFrom != IDC_MESSAGE) { if ((wp == VK_NEXT && isCtrl && !isShift) || (wp == VK_TAB && isCtrl && !isShift)) // CTRL-TAB (switch tab/window) - SendMessage(dat->pContainer->hwnd, DM_SELECTTAB, DM_SELECT_NEXT, 0); + SendMessage(pContainer->hwnd, DM_SELECTTAB, DM_SELECT_NEXT, 0); else if ((wp == VK_PRIOR && isCtrl && !isShift) || (wp == VK_TAB && isCtrl && isShift)) // CTRL_SHIFT-TAB (switch tab/window) - SendMessage(dat->pContainer->hwnd, DM_SELECTTAB, DM_SELECT_PREV, 0); + SendMessage(pContainer->hwnd, DM_SELECTTAB, DM_SELECT_PREV, 0); } if (msg == WM_KEYDOWN && wp == VK_TAB) { - if (((NMHDR*)lParam)->idFrom == IDC_CHAT_LOG) { - SetFocus(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)); - return _dlgReturn(hwndDlg, 1); + if (((NMHDR*)lParam)->idFrom == IDC_LOG) { + SetFocus(GetDlgItem(m_hwnd, IDC_MESSAGE)); + return _dlgReturn(m_hwnd, 1); } } - if (((LPNMHDR)lParam)->idFrom == IDC_CHAT_LOG && ((MSGFILTER *)lParam)->msg == WM_RBUTTONUP) { + if (((LPNMHDR)lParam)->idFrom == IDC_LOG && ((MSGFILTER *)lParam)->msg == WM_RBUTTONUP) { CHARRANGE sel, all = { 0, -1 }; pt.x = LOWORD(((ENLINK*)lParam)->lParam), pt.y = HIWORD(((ENLINK*)lParam)->lParam); @@ -2346,13 +2377,13 @@ LABEL_SHOWWINDOW: wchar_t *pszWord = (wchar_t*)_alloca(8192); pszWord[0] = '\0'; POINTL ptl = { pt.x, pt.y }; - ScreenToClient(GetDlgItem(hwndDlg, IDC_CHAT_LOG), (LPPOINT)&ptl); - int iCharIndex = SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_CHARFROMPOS, 0, (LPARAM)&ptl); + ScreenToClient(m_log.GetHwnd(), (LPPOINT)&ptl); + int iCharIndex = SendDlgItemMessage(m_hwnd, IDC_LOG, EM_CHARFROMPOS, 0, (LPARAM)&ptl); if (iCharIndex < 0) break; - int start = SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_FINDWORDBREAK, WB_LEFT, iCharIndex); - int end = SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_FINDWORDBREAK, WB_RIGHT, iCharIndex); + int start = SendDlgItemMessage(m_hwnd, IDC_LOG, EM_FINDWORDBREAK, WB_LEFT, iCharIndex); + int end = SendDlgItemMessage(m_hwnd, IDC_LOG, EM_FINDWORDBREAK, WB_RIGHT, iCharIndex); if (end - start > 0) { static char szTrimString[] = ":;,.!?\'\"><()[]- \r\n"; @@ -2364,7 +2395,7 @@ LABEL_SHOWWINDOW: TEXTRANGE tr = { 0 }; tr.chrg = cr; tr.lpstrText = (wchar_t*)pszWord; - int iRes = SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_GETTEXTRANGE, 0, (LPARAM)&tr); + int iRes = SendDlgItemMessage(m_hwnd, IDC_LOG, EM_GETTEXTRANGE, 0, (LPARAM)&tr); if (iRes > 0) { size_t iLen = mir_wstrlen(pszWord) - 1; @@ -2376,10 +2407,10 @@ LABEL_SHOWWINDOW: } HMENU hMenu = 0; - UINT uID = CreateGCMenu(hwndDlg, &hMenu, 1, pt, si, NULL, pszWord); + UINT uID = CreateGCMenu(m_hwnd, &hMenu, 1, pt, si, NULL, pszWord); switch (uID) { case 0: - PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0); + PostMessage(m_hwnd, WM_MOUSEACTIVATE, 0, 0); break; case ID_COPYALL: @@ -2387,30 +2418,30 @@ LABEL_SHOWWINDOW: SendMessage(((LPNMHDR)lParam)->hwndFrom, EM_EXSETSEL, 0, (LPARAM)&all); SendMessage(((LPNMHDR)lParam)->hwndFrom, WM_COPY, 0, 0); SendMessage(((LPNMHDR)lParam)->hwndFrom, EM_EXSETSEL, 0, (LPARAM)&sel); - PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0); + PostMessage(m_hwnd, WM_MOUSEACTIVATE, 0, 0); break; case ID_CLEARLOG: - ClearLog(dat); + ClearLog(); break; case ID_SEARCH_GOOGLE: if (pszWord[0]) Utils_OpenUrlW(CMStringW(FORMAT, L"http://www.google.com/search?q=%s", pszWord)); - PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0); + PostMessage(m_hwnd, WM_MOUSEACTIVATE, 0, 0); break; case ID_SEARCH_WIKIPEDIA: if (pszWord[0]) Utils_OpenUrlW(CMStringW(FORMAT, L"http://en.wikipedia.org/wiki/%s", pszWord)); - PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0); + PostMessage(m_hwnd, WM_MOUSEACTIVATE, 0, 0); break; default: - PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0); - pci->DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_LOGMENU, NULL, NULL, (LPARAM)uID); + PostMessage(m_hwnd, WM_MOUSEACTIVATE, 0, 0); + pci->DoEventHookAsync(m_hwnd, si->ptszID, si->pszModule, GC_USER_LOGMENU, NULL, NULL, (LPARAM)uID); break; } @@ -2420,12 +2451,12 @@ LABEL_SHOWWINDOW: break; case EN_REQUESTRESIZE: - if (((LPNMHDR)lParam)->idFrom == IDC_CHAT_MESSAGE) - DM_HandleAutoSizeRequest(dat, (REQRESIZE *)lParam); + if (((LPNMHDR)lParam)->idFrom == IDC_MESSAGE) + DM_HandleAutoSizeRequest(this, (REQRESIZE *)lParam); break; case EN_LINK: - if (((LPNMHDR)lParam)->idFrom == IDC_CHAT_LOG) { + if (((LPNMHDR)lParam)->idFrom == IDC_LOG) { switch (((ENLINK*)lParam)->msg) { case WM_SETCURSOR: if (g_Settings.bClickableNicks) { @@ -2444,7 +2475,7 @@ LABEL_SHOWWINDOW: SendMessage(((LPNMHDR)lParam)->hwndFrom, EM_EXGETSEL, 0, (LPARAM)&sel); if (sel.cpMin == sel.cpMax) { UINT msg = ((ENLINK*)lParam)->msg; - dat->pContainer->MenuBar->Cancel(); + pContainer->MenuBar->Cancel(); TEXTRANGE tr; tr.lpstrText = NULL; @@ -2460,7 +2491,7 @@ LABEL_SHOWWINDOW: pt.x = (short)LOWORD(((ENLINK*)lParam)->lParam); pt.y = (short)HIWORD(((ENLINK*)lParam)->lParam); ClientToScreen(((NMHDR*)lParam)->hwndFrom, &pt); - switch (TrackPopupMenu(hSubMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL)) { + switch (TrackPopupMenu(hSubMenu, TPM_RETURNCMD, pt.x, pt.y, 0, m_hwnd, NULL)) { case ID_NEW: Utils_OpenUrlW(tr.lpstrText); break; @@ -2468,8 +2499,8 @@ LABEL_SHOWWINDOW: Utils_OpenUrlW(tr.lpstrText,false); break; case ID_COPY: - Utils::CopyToClipBoard(tr.lpstrText, hwndDlg); - SetFocus(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)); + Utils::CopyToClipBoard(tr.lpstrText, m_hwnd); + SetFocus(GetDlgItem(m_hwnd, IDC_MESSAGE)); break; } mir_free(tr.lpstrText); @@ -2477,7 +2508,7 @@ LABEL_SHOWWINDOW: } if (((ENLINK*)lParam)->msg == WM_LBUTTONUP) { Utils_OpenUrlW(tr.lpstrText); - SetFocus(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)); + SetFocus(GetDlgItem(m_hwnd, IDC_MESSAGE)); mir_free(tr.lpstrText); return TRUE; } @@ -2494,17 +2525,17 @@ LABEL_SHOWWINDOW: pt.y = (short)HIWORD(((ENLINK*)lParam)->lParam); ClientToScreen(((NMHDR*)lParam)->hwndFrom, &pt); memcpy(&uiNew, ui, sizeof(USERINFO)); - UINT uID = CreateGCMenu(hwndDlg, &hMenu, 0, pt, si, uiNew.pszUID, uiNew.pszNick); + UINT uID = CreateGCMenu(m_hwnd, &hMenu, 0, pt, si, uiNew.pszUID, uiNew.pszNick); switch (uID) { case 0: break; case ID_MESS: - pci->DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_PRIVMESS, ui, NULL, 0); + pci->DoEventHookAsync(m_hwnd, si->ptszID, si->pszModule, GC_USER_PRIVMESS, ui, NULL, 0); break; default: - pci->DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_NICKLISTMENU, ui, NULL, (LPARAM)uID); + pci->DoEventHookAsync(m_hwnd, si->ptszID, si->pszModule, GC_USER_NICKLISTMENU, ui, NULL, (LPARAM)uID); break; } DestroyGCMenu(&hMenu, 1); @@ -2514,7 +2545,7 @@ LABEL_SHOWWINDOW: } else if (msg == WM_LBUTTONUP) { CHARRANGE chr; - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_EXGETSEL, 0, (LPARAM)&chr); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_EXGETSEL, 0, (LPARAM)&chr); wchar_t tszAplTmpl[] = L"%s:"; size_t bufSize = mir_wstrlen(tr.lpstrText) + mir_wstrlen(tszAplTmpl) + 3; @@ -2526,7 +2557,7 @@ LABEL_SHOWWINDOW: // prepend nick with space if needed tr2.chrg.cpMin = chr.cpMin - 1; tr2.chrg.cpMax = chr.cpMin; - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_GETTEXTRANGE, 0, (LPARAM)&tr2); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_GETTEXTRANGE, 0, (LPARAM)&tr2); if (!iswspace(*tr2.lpstrText)) *tszTmp++ = ' '; mir_wstrcpy(tszTmp, tr.lpstrText); @@ -2540,7 +2571,7 @@ LABEL_SHOWWINDOW: tr2.chrg.cpMax = chr.cpMax + 1; // if there is no space after selection, // or there is nothing after selection at all... - if (!SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_GETTEXTRANGE, 0, (LPARAM)&tr2) || !iswspace(*tr2.lpstrText)) { + if (!SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_GETTEXTRANGE, 0, (LPARAM)&tr2) || !iswspace(*tr2.lpstrText)) { tszAppeal[st++] = ' '; tszAppeal[st++] = '\0'; } @@ -2549,12 +2580,12 @@ LABEL_SHOWWINDOW: tszAppeal[st++] = ' '; tszAppeal[st++] = '\0'; } - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_REPLACESEL, FALSE, (LPARAM)tszAppeal); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_REPLACESEL, FALSE, (LPARAM)tszAppeal); mir_free((void*)tr2.lpstrText); mir_free((void*)tszAppeal); } } - SetFocus(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)); + SetFocus(GetDlgItem(m_hwnd, IDC_MESSAGE)); mir_free(tr.lpstrText); return TRUE; } @@ -2567,35 +2598,35 @@ LABEL_SHOWWINDOW: case WM_LBUTTONDOWN: GetCursorPos(&tmp); - if (!dat->Panel->isHovered()) { + if (!Panel->isHovered()) { cur.x = (SHORT)tmp.x; cur.y = (SHORT)tmp.y; - SendMessage(dat->pContainer->hwnd, WM_NCLBUTTONDOWN, HTCAPTION, *((LPARAM*)(&cur))); + SendMessage(pContainer->hwnd, WM_NCLBUTTONDOWN, HTCAPTION, *((LPARAM*)(&cur))); } break; case WM_LBUTTONUP: GetCursorPos(&tmp); - if (dat->Panel->isHovered()) - dat->Panel->handleClick(tmp); + if (Panel->isHovered()) + Panel->handleClick(tmp); else { cur.x = (SHORT)tmp.x; cur.y = (SHORT)tmp.y; - SendMessage(dat->pContainer->hwnd, WM_NCLBUTTONUP, HTCAPTION, *((LPARAM*)(&cur))); + SendMessage(pContainer->hwnd, WM_NCLBUTTONUP, HTCAPTION, *((LPARAM*)(&cur))); } break; case WM_MOUSEMOVE: GetCursorPos(&pt); - DM_DismissTip(dat, pt); - dat->Panel->trackMouse(pt); + DM_DismissTip(this, pt); + Panel->trackMouse(pt); break; case WM_APPCOMMAND: { DWORD cmd = GET_APPCOMMAND_LPARAM(lParam); if (cmd == APPCOMMAND_BROWSER_BACKWARD || cmd == APPCOMMAND_BROWSER_FORWARD) { - SendMessage(dat->pContainer->hwnd, DM_SELECTTAB, cmd == APPCOMMAND_BROWSER_BACKWARD ? DM_SELECT_PREV : DM_SELECT_NEXT, 0); + SendMessage(pContainer->hwnd, DM_SELECTTAB, cmd == APPCOMMAND_BROWSER_BACKWARD ? DM_SELECT_PREV : DM_SELECT_NEXT, 0); return 1; } } @@ -2603,7 +2634,7 @@ LABEL_SHOWWINDOW: case WM_COMMAND: if (LOWORD(wParam) >= MIN_CBUTTONID && LOWORD(wParam) <= MAX_CBUTTONID){ - Srmm_ClickToolbarIcon(dat->hContact, LOWORD(wParam), GetDlgItem(hwndDlg, LOWORD(wParam)), 0); + Srmm_ClickToolbarIcon(m_hContact, LOWORD(wParam), GetDlgItem(m_hwnd, LOWORD(wParam)), 0); break; } @@ -2613,13 +2644,13 @@ LABEL_SHOWWINDOW: TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(GetMessagePos()); hti.pt.y = (short)HIWORD(GetMessagePos()); - ScreenToClient(GetDlgItem(hwndDlg, IDC_LIST), &hti.pt); + ScreenToClient(GetDlgItem(m_hwnd, IDC_LIST), &hti.pt); - int item = LOWORD(SendDlgItemMessage(hwndDlg, IDC_LIST, LB_ITEMFROMPOINT, 0, MAKELPARAM(hti.pt.x, hti.pt.y))); + int item = LOWORD(SendDlgItemMessage(m_hwnd, IDC_LIST, LB_ITEMFROMPOINT, 0, MAKELPARAM(hti.pt.x, hti.pt.y))); USERINFO *ui = pci->UM_FindUserFromIndex(si->pUsers, item); if (ui) { if (g_Settings.bDoubleClick4Privat ? GetKeyState(VK_SHIFT) & 0x8000 : !(GetKeyState(VK_SHIFT) & 0x8000)) { - LRESULT lResult = (LRESULT)SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_GETSEL, 0, 0); + LRESULT lResult = (LRESULT)SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_GETSEL, 0, 0); int start = LOWORD(lResult); CMStringW tszName; if (start == 0) @@ -2627,113 +2658,113 @@ LABEL_SHOWWINDOW: else tszName.Format(L"%s ", ui->pszNick); - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_REPLACESEL, FALSE, (LPARAM)tszName.GetString()); - PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0); - SetFocus(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_REPLACESEL, FALSE, (LPARAM)tszName.GetString()); + PostMessage(m_hwnd, WM_MOUSEACTIVATE, 0, 0); + SetFocus(GetDlgItem(m_hwnd, IDC_MESSAGE)); } - else pci->DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_PRIVMESS, ui, NULL, 0); + else pci->DoEventHookAsync(m_hwnd, si->ptszID, si->pszModule, GC_USER_PRIVMESS, ui, NULL, 0); } return TRUE; } if (HIWORD(wParam) == LBN_KILLFOCUS) - RedrawWindow(GetDlgItem(hwndDlg, IDC_LIST), NULL, NULL, RDW_INVALIDATE); + RedrawWindow(GetDlgItem(m_hwnd, IDC_LIST), NULL, NULL, RDW_INVALIDATE); break; case IDC_TOGGLESIDEBAR: - SendMessage(dat->pContainer->hwnd, WM_COMMAND, IDC_TOGGLESIDEBAR, 0); + SendMessage(pContainer->hwnd, WM_COMMAND, IDC_TOGGLESIDEBAR, 0); break; case IDCANCEL: - ShowWindow(dat->pContainer->hwnd, SW_MINIMIZE); + ShowWindow(pContainer->hwnd, SW_MINIMIZE); return FALSE; case IDOK: - if (GetSendButtonState(hwndDlg) != PBS_DISABLED) { + if (GetSendButtonState(m_hwnd) != PBS_DISABLED) { MODULEINFO *mi = pci->MM_FindModule(si->pszModule); if (mi == NULL) break; - ptrA pszRtf(Message_GetFromStream(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE))); + ptrA pszRtf(Message_GetFromStream(GetDlgItem(m_hwnd, IDC_MESSAGE))); pci->SM_AddCommand(si->ptszID, si->pszModule, pszRtf); CMStringW ptszText(ptrW(mir_utf8decodeW(pszRtf))); if (ptszText.IsEmpty()) break; - DoRtfToTags(si->dat, ptszText, mi->nColorCount, mi->crColors); + si->dat->DoRtfToTags(ptszText, mi->nColorCount, mi->crColors); ptszText.Trim(); ptszText.Replace(L"%", L"%%"); if (mi->bAckMsg) { - Utils::enableDlgControl(hwndDlg, IDC_CHAT_MESSAGE, false); - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_SETREADONLY, TRUE, 0); + Utils::enableDlgControl(m_hwnd, IDC_MESSAGE, false); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_SETREADONLY, TRUE, 0); } - else SetDlgItemText(hwndDlg, IDC_CHAT_MESSAGE, L""); + else SetDlgItemText(m_hwnd, IDC_MESSAGE, L""); - Utils::enableDlgControl(hwndDlg, IDOK, false); + Utils::enableDlgControl(m_hwnd, IDOK, false); // Typing support for GCW_PRIVMESS sessions if (si->iType == GCW_PRIVMESS) - if (dat->nTypeMode == PROTOTYPE_SELFTYPING_ON) - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_OFF); + if (nTypeMode == PROTOTYPE_SELFTYPING_ON) + DM_NotifyTyping(PROTOTYPE_SELFTYPING_OFF); bool fSound = true; if (ptszText[0] == '/' || si->iType == GCW_SERVER) fSound = false; - pci->DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_MESSAGE, NULL, ptszText, 0); + pci->DoEventHookAsync(m_hwnd, si->ptszID, si->pszModule, GC_USER_MESSAGE, NULL, ptszText, 0); mi->idleTimeStamp = time(0); mi->lastIdleCheck = 0; pci->SM_BroadcastMessage(si->pszModule, GC_UPDATESTATUSBAR, 0, 1, TRUE); - if (dat->pContainer) - if (fSound && !nen_options.iNoSounds && !(dat->pContainer->dwFlags & CNT_NOSOUND)) + if (pContainer) + if (fSound && !nen_options.iNoSounds && !(pContainer->dwFlags & CNT_NOSOUND)) SkinPlaySound("ChatSent"); - SetFocus(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)); + SetFocus(GetDlgItem(m_hwnd, IDC_MESSAGE)); } break; case IDC_SHOWNICKLIST: - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_SHOWNICKLIST))) + if (!IsWindowEnabled(GetDlgItem(m_hwnd, IDC_SHOWNICKLIST))) break; if (si->iType == GCW_SERVER) break; si->bNicklistEnabled = !si->bNicklistEnabled; - SendMessage(hwndDlg, WM_SIZE, 0, 0); + SendMessage(m_hwnd, WM_SIZE, 0, 0); if (CSkin::m_skinEnabled) - InvalidateRect(hwndDlg, NULL, TRUE); - PostMessage(hwndDlg, GC_SCROLLTOBOTTOM, 0, 0); + InvalidateRect(m_hwnd, NULL, TRUE); + PostMessage(m_hwnd, GC_SCROLLTOBOTTOM, 0, 0); break; - case IDC_CHAT_MESSAGE: + case IDC_MESSAGE: if (HIWORD(wParam) == EN_CHANGE) { - if (dat->pContainer->hwndActive == hwndDlg) - UpdateReadChars(dat); - dat->dwLastActivity = GetTickCount(); - dat->pContainer->dwLastActivity = dat->dwLastActivity; - SendDlgItemMessage(hwndDlg, IDOK, BUTTONSETASNORMAL, GetRichTextLength(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)) != 0, 0); - Utils::enableDlgControl(hwndDlg, IDOK, GetRichTextLength(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)) != 0); + if (pContainer->hwndActive == m_hwnd) + UpdateReadChars(); + dwLastActivity = GetTickCount(); + pContainer->dwLastActivity = dwLastActivity; + SendDlgItemMessage(m_hwnd, IDOK, BUTTONSETASNORMAL, GetRichTextLength(GetDlgItem(m_hwnd, IDC_MESSAGE)) != 0, 0); + Utils::enableDlgControl(m_hwnd, IDOK, GetRichTextLength(GetDlgItem(m_hwnd, IDC_MESSAGE)) != 0); // Typing support for GCW_PRIVMESS sessions if (si->iType == GCW_PRIVMESS) { if (!(GetKeyState(VK_CONTROL) & 0x8000)) { - dat->nLastTyping = GetTickCount(); - if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE))) { - if (dat->nTypeMode == PROTOTYPE_SELFTYPING_OFF) { - if (!(dat->dwFlags & MWF_INITMODE)) - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_ON); + nLastTyping = GetTickCount(); + if (GetWindowTextLength(GetDlgItem(m_hwnd, IDC_MESSAGE))) { + if (nTypeMode == PROTOTYPE_SELFTYPING_OFF) { + if (!(dwFlags & MWF_INITMODE)) + DM_NotifyTyping(PROTOTYPE_SELFTYPING_ON); } } - else if (dat->nTypeMode == PROTOTYPE_SELFTYPING_ON) - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_OFF); + else if (nTypeMode == PROTOTYPE_SELFTYPING_ON) + DM_NotifyTyping(PROTOTYPE_SELFTYPING_OFF); } } } break; case IDC_CHAT_HISTORY: - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_CHAT_HISTORY))) { + if (IsWindowEnabled(GetDlgItem(m_hwnd, IDC_CHAT_HISTORY))) { MODULEINFO *pInfo = pci->MM_FindModule(si->pszModule); if (ServiceExists("MSP/HTMLlog/ViewLog") && strstr(si->pszModule, "IRC")) { char szName[MAX_PATH]; @@ -2742,22 +2773,22 @@ LABEL_SHOWWINDOW: CallService("MSP/HTMLlog/ViewLog", (WPARAM)si->pszModule, (LPARAM)szName); } else if (pInfo) - ShellExecute(hwndDlg, NULL, pci->GetChatLogsFilename(si, 0), NULL, NULL, SW_SHOW); + ShellExecute(m_hwnd, NULL, pci->GetChatLogsFilename(si, 0), NULL, NULL, SW_SHOW); } break; case IDC_CHAT_CLOSE: - SendMessage(hwndDlg, WM_CLOSE, 0, 1); + SendMessage(m_hwnd, WM_CLOSE, 0, 1); break; case IDC_CHANMGR: - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_CHANMGR))) + if (!IsWindowEnabled(GetDlgItem(m_hwnd, IDC_CHANMGR))) break; - pci->DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_CHANMGR, NULL, NULL, 0); + pci->DoEventHookAsync(m_hwnd, si->ptszID, si->pszModule, GC_USER_CHANMGR, NULL, NULL, 0); break; case IDC_FILTER: - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_FILTER))) + if (!IsWindowEnabled(GetDlgItem(m_hwnd, IDC_FILTER))) break; if (si->iLogFilterFlags == 0 && !si->bFilterEnabled) { @@ -2766,15 +2797,15 @@ LABEL_SHOWWINDOW: } else si->bFilterEnabled = !si->bFilterEnabled; - SendDlgItemMessage(hwndDlg, IDC_FILTER, BUTTONSETOVERLAYICON, + SendDlgItemMessage(m_hwnd, IDC_FILTER, BUTTONSETOVERLAYICON, (LPARAM)(si->bFilterEnabled ? PluginConfig.g_iconOverlayEnabled : PluginConfig.g_iconOverlayDisabled), 0); if (si->bFilterEnabled && M.GetByte(CHAT_MODULE, "RightClickFilter", 0) == 0) { - SendMessage(hwndDlg, GC_SHOWFILTERMENU, 0, 0); + SendMessage(m_hwnd, GC_SHOWFILTERMENU, 0, 0); break; } - SendMessage(hwndDlg, GC_REDRAWLOG, 0, 0); - SendMessage(hwndDlg, GC_UPDATETITLE, 0, 0); + SendMessage(m_hwnd, GC_REDRAWLOG, 0, 0); + SendMessage(m_hwnd, GC_UPDATETITLE, 0, 0); db_set_b(si->hContact, CHAT_MODULE, "FilterEnabled", (BYTE)si->bFilterEnabled); break; @@ -2782,22 +2813,22 @@ LABEL_SHOWWINDOW: cf.cbSize = sizeof(CHARFORMAT2); cf.dwEffects = 0; - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BKGCOLOR))) + if (!IsWindowEnabled(GetDlgItem(m_hwnd, IDC_BKGCOLOR))) break; - if (IsDlgButtonChecked(hwndDlg, IDC_BKGCOLOR)) { + if (IsDlgButtonChecked(m_hwnd, IDC_BKGCOLOR)) { if (M.GetByte(CHAT_MODULE, "RightClickFilter", 0) == 0) - SendMessage(hwndDlg, GC_SHOWCOLORCHOOSER, 0, IDC_BKGCOLOR); + SendMessage(m_hwnd, GC_SHOWCOLORCHOOSER, 0, IDC_BKGCOLOR); else if (si->bBGSet) { cf.dwMask = CFM_BACKCOLOR; cf.crBackColor = pci->MM_FindModule(si->pszModule)->crColors[si->iBG]; - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); } } else { cf.dwMask = CFM_BACKCOLOR; cf.crBackColor = (COLORREF)M.GetDword(FONTMODULE, "inputbg", SRMSGDEFSET_BKGCOLOUR); - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); } break; @@ -2805,16 +2836,16 @@ LABEL_SHOWWINDOW: cf.cbSize = sizeof(CHARFORMAT2); cf.dwEffects = 0; - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_COLOR))) + if (!IsWindowEnabled(GetDlgItem(m_hwnd, IDC_COLOR))) break; - if (IsDlgButtonChecked(hwndDlg, IDC_COLOR)) { + if (IsDlgButtonChecked(m_hwnd, IDC_COLOR)) { if (M.GetByte(CHAT_MODULE, "RightClickFilter", 0) == 0) - SendMessage(hwndDlg, GC_SHOWCOLORCHOOSER, 0, IDC_COLOR); + SendMessage(m_hwnd, GC_SHOWCOLORCHOOSER, 0, IDC_COLOR); else if (si->bFGSet) { cf.dwMask = CFM_COLOR; cf.crTextColor = pci->MM_FindModule(si->pszModule)->crColors[si->iFG]; - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); } } else { @@ -2822,7 +2853,7 @@ LABEL_SHOWWINDOW: LoadLogfont(MSGFONTID_MESSAGEAREA, NULL, &cr, FONTMODULE); cf.dwMask = CFM_COLOR; cf.crTextColor = cr; - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); } break; @@ -2833,33 +2864,33 @@ LABEL_SHOWWINDOW: cf.dwMask = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE; cf.dwEffects = 0; - if (LOWORD(wParam) == IDC_CHAT_BOLD && !IsWindowEnabled(GetDlgItem(hwndDlg, IDC_CHAT_BOLD))) + if (LOWORD(wParam) == IDC_CHAT_BOLD && !IsWindowEnabled(GetDlgItem(m_hwnd, IDC_CHAT_BOLD))) break; - if (LOWORD(wParam) == IDC_ITALICS && !IsWindowEnabled(GetDlgItem(hwndDlg, IDC_ITALICS))) + if (LOWORD(wParam) == IDC_ITALICS && !IsWindowEnabled(GetDlgItem(m_hwnd, IDC_ITALICS))) break; - if (LOWORD(wParam) == IDC_CHAT_UNDERLINE && !IsWindowEnabled(GetDlgItem(hwndDlg, IDC_CHAT_UNDERLINE))) + if (LOWORD(wParam) == IDC_CHAT_UNDERLINE && !IsWindowEnabled(GetDlgItem(m_hwnd, IDC_CHAT_UNDERLINE))) break; - if (IsDlgButtonChecked(hwndDlg, IDC_CHAT_BOLD)) + if (IsDlgButtonChecked(m_hwnd, IDC_CHAT_BOLD)) cf.dwEffects |= CFE_BOLD; - if (IsDlgButtonChecked(hwndDlg, IDC_ITALICS)) + if (IsDlgButtonChecked(m_hwnd, IDC_ITALICS)) cf.dwEffects |= CFE_ITALIC; - if (IsDlgButtonChecked(hwndDlg, IDC_CHAT_UNDERLINE)) + if (IsDlgButtonChecked(m_hwnd, IDC_CHAT_UNDERLINE)) cf.dwEffects |= CFE_UNDERLINE; - SendDlgItemMessage(hwndDlg, IDC_CHAT_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); break; case IDC_SELFTYPING: // Typing support for GCW_PRIVMESS sessions if (si->iType == GCW_PRIVMESS) { - if (dat->hContact) { - int iCurrentTypingMode = db_get_b(dat->hContact, SRMSGMOD, SRMSGSET_TYPING, M.GetByte(SRMSGMOD, SRMSGSET_TYPINGNEW, SRMSGDEFSET_TYPINGNEW)); + if (m_hContact) { + int iCurrentTypingMode = db_get_b(m_hContact, SRMSGMOD, SRMSGSET_TYPING, M.GetByte(SRMSGMOD, SRMSGSET_TYPINGNEW, SRMSGDEFSET_TYPINGNEW)); - if (dat->nTypeMode == PROTOTYPE_SELFTYPING_ON && iCurrentTypingMode) { - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_OFF); - dat->nTypeMode = PROTOTYPE_SELFTYPING_OFF; + if (nTypeMode == PROTOTYPE_SELFTYPING_ON && iCurrentTypingMode) { + DM_NotifyTyping(PROTOTYPE_SELFTYPING_OFF); + nTypeMode = PROTOTYPE_SELFTYPING_OFF; } - db_set_b(dat->hContact, SRMSGMOD, SRMSGSET_TYPING, (BYTE)!iCurrentTypingMode); + db_set_b(m_hContact, SRMSGMOD, SRMSGSET_TYPING, (BYTE)!iCurrentTypingMode); } } break; @@ -2867,7 +2898,7 @@ LABEL_SHOWWINDOW: break; case WM_KEYDOWN: - SetFocus(GetDlgItem(hwndDlg, IDC_CHAT_MESSAGE)); + SetFocus(GetDlgItem(m_hwnd, IDC_MESSAGE)); break; case WM_MOVE: @@ -2878,12 +2909,12 @@ LABEL_SHOWWINDOW: { HDC hdc = (HDC)wParam; UINT item_ids[3] = { ID_EXTBKUSERLIST, ID_EXTBKHISTORY, ID_EXTBKINPUTAREA }; - UINT ctl_ids[3] = { IDC_LIST, IDC_CHAT_LOG, IDC_CHAT_MESSAGE }; + UINT ctl_ids[3] = { IDC_LIST, IDC_LOG, IDC_MESSAGE }; HANDLE hbp = 0; HDC hdcMem = 0; HBITMAP hbm, hbmOld; - GetClientRect(hwndDlg, &rcClient); + GetClientRect(m_hwnd, &rcClient); LONG cx = rcClient.right - rcClient.left; LONG cy = rcClient.bottom - rcClient.top; @@ -2898,14 +2929,14 @@ LABEL_SHOWWINDOW: } if (CSkin::m_skinEnabled && !M.isAero()) { - CSkin::SkinDrawBG(hwndDlg, dat->pContainer->hwnd, dat->pContainer, &rcClient, hdcMem); + CSkin::SkinDrawBG(m_hwnd, pContainer->hwnd, pContainer, &rcClient, hdcMem); for (int i = 0; i < 3; i++) { CSkinItem *item = &SkinItems[item_ids[i]]; if (!item->IGNORED) { - GetWindowRect(GetDlgItem(hwndDlg, ctl_ids[i]), &rcWindow); + GetWindowRect(GetDlgItem(m_hwnd, ctl_ids[i]), &rcWindow); pt.x = rcWindow.left; pt.y = rcWindow.top; - ScreenToClient(hwndDlg, &pt); + ScreenToClient(m_hwnd, &pt); rc.left = pt.x - item->MARGIN_LEFT; rc.top = pt.y - item->MARGIN_TOP; rc.right = rc.left + item->MARGIN_RIGHT + (rcWindow.right - rcWindow.left) + item->MARGIN_LEFT; @@ -2919,18 +2950,18 @@ LABEL_SHOWWINDOW: if (M.isAero()) { LONG temp = rcClient.bottom; - rcClient.bottom = dat->Panel->isActive() ? dat->Panel->getHeight() + 5 : 5; + rcClient.bottom = Panel->isActive() ? Panel->getHeight() + 5 : 5; FillRect(hdcMem, &rcClient, (HBRUSH)GetStockObject(BLACK_BRUSH)); rcClient.bottom = temp; } } - GetClientRect(hwndDlg, &rc); - dat->Panel->renderBG(hdcMem, rc, &SkinItems[ID_EXTBKINFOPANELBG], M.isAero()); - dat->Panel->renderContent(hdcMem); + GetClientRect(m_hwnd, &rc); + Panel->renderBG(hdcMem, rc, &SkinItems[ID_EXTBKINFOPANELBG], M.isAero()); + Panel->renderContent(hdcMem); if (!CSkin::m_skinEnabled) - CSkin::RenderToolbarBG(dat, hdcMem, rcClient); + RenderToolbarBG(hdcMem, rcClient); if (hbp) CSkin::FinalizeBufferedPaint(hbp, &rcClient); @@ -2940,8 +2971,8 @@ LABEL_SHOWWINDOW: DeleteObject(hbm); DeleteDC(hdcMem); } - if (!dat->fLimitedUpdate) - SetAeroMargins(dat->pContainer); + if (!fLimitedUpdate) + SetAeroMargins(pContainer); } return TRUE; @@ -2952,27 +2983,27 @@ LABEL_SHOWWINDOW: case WM_PAINT: PAINTSTRUCT ps; - BeginPaint(hwndDlg, &ps); - EndPaint(hwndDlg, &ps); + BeginPaint(m_hwnd, &ps); + EndPaint(m_hwnd, &ps); return 0; case DM_SETINFOPANEL: - CInfoPanel::setPanelHandler(dat, wParam, lParam); + CInfoPanel::setPanelHandler(this, wParam, lParam); return 0; case DM_INVALIDATEPANEL: - if (dat->Panel) - dat->Panel->Invalidate(true); + if (Panel) + Panel->Invalidate(true); return 0; case WM_RBUTTONUP: GetCursorPos(&pt); - if (!dat->Panel->invokeConfigDialog(pt)) { + if (!Panel->invokeConfigDialog(pt)) { HMENU subMenu = GetSubMenu(PluginConfig.g_hMenuContext, 0); - MsgWindowUpdateMenu(dat, subMenu, MENU_TABCONTEXT); + MsgWindowUpdateMenu(subMenu, MENU_TABCONTEXT); - int iSelection = TrackPopupMenu(subMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL); + int iSelection = TrackPopupMenu(subMenu, TPM_RETURNCMD, pt.x, pt.y, 0, m_hwnd, NULL); if (iSelection >= IDM_CONTAINERMENU) { DBVARIANT dbv = { 0 }; char szIndex[10]; @@ -2980,34 +3011,36 @@ LABEL_SHOWWINDOW: mir_snprintf(szIndex, "%d", iSelection - IDM_CONTAINERMENU); if (iSelection - IDM_CONTAINERMENU >= 0) { if (!db_get_ws(NULL, szKey, szIndex, &dbv)) { - SendMessage(hwndDlg, DM_CONTAINERSELECTED, 0, (LPARAM)dbv.ptszVal); + SendMessage(m_hwnd, DM_CONTAINERSELECTED, 0, (LPARAM)dbv.ptszVal); db_free(&dbv); } } break; } - MsgWindowMenuHandler(dat, iSelection, MENU_TABCONTEXT); + MsgWindowMenuHandler(iSelection, MENU_TABCONTEXT); } break; case WM_LBUTTONDBLCLK: if (LOWORD(lParam) < 30) - PostMessage(hwndDlg, GC_SCROLLTOBOTTOM, 0, 0); + PostMessage(m_hwnd, GC_SCROLLTOBOTTOM, 0, 0); break; case WM_CLOSE: if (wParam == 0 && lParam == 0) { if (PluginConfig.m_EscapeCloses == 1) { - SendMessage(dat->pContainer->hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); + SendMessage(pContainer->hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); return TRUE; } if (PluginConfig.m_bHideOnClose && PluginConfig.m_EscapeCloses == 2) { - ShowWindow(dat->pContainer->hwnd, SW_HIDE); + ShowWindow(pContainer->hwnd, SW_HIDE); return TRUE; } - _dlgReturn(hwndDlg, TRUE); + _dlgReturn(m_hwnd, TRUE); } - SendMessage(hwndDlg, GC_CLOSEWINDOW, 0, 1); + SendMessage(m_hwnd, GC_CLOSEWINDOW, 0, 1); + if (lParam) // forced close not to be handled by the core + return 0; break; case DM_CONTAINERSELECTED: @@ -3015,17 +3048,17 @@ LABEL_SHOWWINDOW: wchar_t *szNewName = (wchar_t*)lParam; if (!mir_wstrcmp(szNewName, TranslateT("Default container"))) szNewName = CGlobals::m_default_container_name; - int iOldItems = TabCtrl_GetItemCount(hwndTab); - if (!wcsncmp(dat->pContainer->szName, szNewName, CONTAINER_NAMELEN)) + int iOldItems = TabCtrl_GetItemCount(m_hwndParent); + if (!wcsncmp(pContainer->szName, szNewName, CONTAINER_NAMELEN)) break; TContainerData *pNewContainer = FindContainerByName(szNewName); if (pNewContainer == NULL) - if ((pNewContainer = CreateContainer(szNewName, FALSE, dat->hContact)) == NULL) + if ((pNewContainer = CreateContainer(szNewName, FALSE, m_hContact)) == NULL) break; - db_set_ws(dat->hContact, SRMSGMOD_T, "containerW", szNewName); - PostMessage(PluginConfig.g_hwndHotkeyHandler, DM_DOCREATETAB_CHAT, (WPARAM)pNewContainer, (LPARAM)hwndDlg); + db_set_ws(m_hContact, SRMSGMOD_T, "containerW", szNewName); + PostMessage(PluginConfig.g_hwndHotkeyHandler, DM_DOCREATETAB_CHAT, (WPARAM)pNewContainer, (LPARAM)m_hwnd); if (iOldItems > 1) // there were more than 1 tab, container is still valid - SendMessage(dat->pContainer->hwndActive, WM_SIZE, 0, 0); + SendMessage(pContainer->hwndActive, WM_SIZE, 0, 0); SetForegroundWindow(pNewContainer->hwnd); SetActiveWindow(pNewContainer->hwnd); } @@ -3034,262 +3067,185 @@ LABEL_SHOWWINDOW: // container API support functions case DM_QUERYCONTAINER: if (lParam) - *(TContainerData**)lParam = dat->pContainer; + *(TContainerData**)lParam = pContainer; return 0; case DM_QUERYHCONTACT: if (lParam) - *(MCONTACT*)lParam = dat->hContact; + *(MCONTACT*)lParam = m_hContact; return 0; case GC_CLOSEWINDOW: { - TContainerData *pContainer = dat->pContainer; bool bForced = (lParam == 2); - int iTabs = TabCtrl_GetItemCount(hwndTab); + int iTabs = TabCtrl_GetItemCount(m_hwndParent); if (iTabs == 1 && CMimAPI::m_shutDown == 0) { - SendMessage(GetParent(GetParent(hwndDlg)), WM_CLOSE, 0, 1); + SendMessage(GetParent(m_hwndParent), WM_CLOSE, 0, 1); return 1; } - dat->pContainer->iChilds--; - int i = GetTabIndexFromHWND(hwndTab, hwndDlg); + pContainer->iChilds--; + int i = GetTabIndexFromHWND(m_hwndParent, m_hwnd); // after closing a tab, we need to activate the tab to the left side of // the previously open tab. // normally, this tab has the same index after the deletion of the formerly active tab // unless, of course, we closed the last (rightmost) tab. - if (!dat->pContainer->bDontSmartClose && iTabs > 1 && !bForced) { + if (!pContainer->bDontSmartClose && iTabs > 1 && !bForced) { if (i == iTabs - 1) i--; else i++; - TabCtrl_SetCurSel(hwndTab, i); + TabCtrl_SetCurSel(m_hwndParent, i); TCITEM item = { 0 }; item.mask = TCIF_PARAM; - TabCtrl_GetItem(hwndTab, i, &item); // retrieve dialog hwnd for the now active tab... - dat->pContainer->hwndActive = (HWND)item.lParam; + TabCtrl_GetItem(m_hwndParent, i, &item); // retrieve dialog hwnd for the now active tab... + pContainer->hwndActive = (HWND)item.lParam; - SendMessage(dat->pContainer->hwnd, DM_QUERYCLIENTAREA, 0, (LPARAM)&rc); - SetWindowPos(dat->pContainer->hwndActive, HWND_TOP, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), SWP_SHOWWINDOW); + SendMessage(pContainer->hwnd, DM_QUERYCLIENTAREA, 0, (LPARAM)&rc); + SetWindowPos(pContainer->hwndActive, HWND_TOP, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), SWP_SHOWWINDOW); ShowWindow((HWND)item.lParam, SW_SHOW); - SetForegroundWindow(dat->pContainer->hwndActive); - SetFocus(dat->pContainer->hwndActive); - SendMessage(dat->pContainer->hwnd, WM_SIZE, 0, 0); + SetForegroundWindow(pContainer->hwndActive); + SetFocus(pContainer->hwndActive); + SendMessage(pContainer->hwnd, WM_SIZE, 0, 0); } if (iTabs == 1) - SendMessage(GetParent(GetParent(hwndDlg)), WM_CLOSE, 0, 1); + SendMessage(GetParent(m_hwndParent), WM_CLOSE, 0, 1); else { PostMessage(pContainer->hwnd, WM_SIZE, 0, 0); - DestroyWindow(hwndDlg); + Close(); } } return 0; case DM_SETLOCALE: - if (dat->dwFlags & MWF_WASBACKGROUNDCREATE) + if (dwFlags & MWF_WASBACKGROUNDCREATE) break; - if (dat->pContainer->hwndActive == hwndDlg && PluginConfig.m_bAutoLocaleSupport && dat->hContact != 0 && dat->pContainer->hwnd == GetForegroundWindow() && dat->pContainer->hwnd == GetActiveWindow()) { + if (pContainer->hwndActive == m_hwnd && PluginConfig.m_bAutoLocaleSupport && m_hContact != 0 && pContainer->hwnd == GetForegroundWindow() && pContainer->hwnd == GetActiveWindow()) { if (lParam) - dat->hkl = (HKL)lParam; + hkl = (HKL)lParam; - if (dat->hkl) - ActivateKeyboardLayout(dat->hkl, 0); + if (hkl) + ActivateKeyboardLayout(hkl, 0); } return 0; case DM_SAVESIZE: - if (dat->dwFlags & MWF_NEEDCHECKSIZE) + if (dwFlags & MWF_NEEDCHECKSIZE) lParam = 0; - dat->dwFlags &= ~MWF_NEEDCHECKSIZE; - if (dat->dwFlags & MWF_WASBACKGROUNDCREATE) - dat->dwFlags &= ~MWF_INITMODE; + dwFlags &= ~MWF_NEEDCHECKSIZE; + if (dwFlags & MWF_WASBACKGROUNDCREATE) + dwFlags &= ~MWF_INITMODE; - SendMessage(dat->pContainer->hwnd, DM_QUERYCLIENTAREA, 0, (LPARAM)&rcClient); - MoveWindow(hwndDlg, rcClient.left, rcClient.top, (rcClient.right - rcClient.left), (rcClient.bottom - rcClient.top), TRUE); + SendMessage(pContainer->hwnd, DM_QUERYCLIENTAREA, 0, (LPARAM)&rcClient); + MoveWindow(m_hwnd, rcClient.left, rcClient.top, (rcClient.right - rcClient.left), (rcClient.bottom - rcClient.top), TRUE); - if (dat->dwFlags & MWF_WASBACKGROUNDCREATE) { - dat->dwFlags &= ~MWF_WASBACKGROUNDCREATE; - SendMessage(hwndDlg, WM_SIZE, 0, 0); + if (dwFlags & MWF_WASBACKGROUNDCREATE) { + dwFlags &= ~MWF_WASBACKGROUNDCREATE; + SendMessage(m_hwnd, WM_SIZE, 0, 0); pt.x = pt.y = 0; - SendDlgItemMessage(hwndDlg, IDC_CHAT_LOG, EM_SETSCROLLPOS, 0, (LPARAM)&pt); + SendDlgItemMessage(m_hwnd, IDC_LOG, EM_SETSCROLLPOS, 0, (LPARAM)&pt); if (PluginConfig.m_bAutoLocaleSupport) { - if (dat->hkl == 0) - DM_LoadLocale(dat); + if (hkl == 0) + DM_LoadLocale(this); else - PostMessage(hwndDlg, DM_SETLOCALE, 0, 0); + PostMessage(m_hwnd, DM_SETLOCALE, 0, 0); } } else { - SendMessage(hwndDlg, WM_SIZE, 0, 0); + SendMessage(m_hwnd, WM_SIZE, 0, 0); if (lParam == 0) - PostMessage(hwndDlg, GC_SCROLLTOBOTTOM, 1, 1); + PostMessage(m_hwnd, GC_SCROLLTOBOTTOM, 1, 1); } return 0; case DM_GETWINDOWSTATE: { UINT state = MSG_WINDOW_STATE_EXISTS; - if (IsWindowVisible(hwndDlg)) + if (IsWindowVisible(m_hwnd)) state |= MSG_WINDOW_STATE_VISIBLE; - if (GetForegroundWindow() == dat->pContainer->hwnd) + if (GetForegroundWindow() == pContainer->hwnd) state |= MSG_WINDOW_STATE_FOCUS; - if (IsIconic(dat->pContainer->hwnd)) + if (IsIconic(pContainer->hwnd)) state |= MSG_WINDOW_STATE_ICONIC; - SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, state); + SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, state); } return TRUE; case DM_ADDDIVIDER: - if (!(dat->dwFlags & MWF_DIVIDERSET) && g_Settings.bUseDividers) { - if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_CHAT_LOG)) > 0) { - dat->dwFlags |= MWF_DIVIDERWANTED; - dat->dwFlags |= MWF_DIVIDERSET; - } - } + if (!(dwFlags & MWF_DIVIDERSET) && g_Settings.bUseDividers) + if (GetWindowTextLength(m_log.GetHwnd()) > 0) + dwFlags |= MWF_DIVIDERWANTED | MWF_DIVIDERSET; return 0; case DM_CHECKSIZE: - dat->dwFlags |= MWF_NEEDCHECKSIZE; + dwFlags |= MWF_NEEDCHECKSIZE; return 0; case DM_REFRESHTABINDEX: - dat->iTabID = GetTabIndexFromHWND(GetParent(hwndDlg), hwndDlg); + iTabID = GetTabIndexFromHWND(m_hwndParent, m_hwnd); return 0; case DM_STATUSBARCHANGED: - UpdateStatusBar(dat); + UpdateStatusBar(); break; case WM_CBD_UPDATED: if (lParam) - CB_ChangeButton(hwndDlg, dat, (CustomButtonData*)lParam); + CB_ChangeButton((CustomButtonData*)lParam); else - BB_InitDlgButtons(dat); + BB_InitDlgButtons(); - BB_SetButtonsPos(dat); + BB_SetButtonsPos(); return 0; case WM_CBD_REMOVED: if (lParam) - CB_DestroyButton(hwndDlg, dat, (DWORD)wParam, (DWORD)lParam); + CB_DestroyButton((DWORD)wParam, (DWORD)lParam); else - CB_DestroyAllButtons(hwndDlg); + CB_DestroyAllButtons(); break; case DM_CONFIGURETOOLBAR: - SendMessage(hwndDlg, WM_SIZE, 0, 0); + SendMessage(m_hwnd, WM_SIZE, 0, 0); break; case DM_SMILEYOPTIONSCHANGED: - SendMessage(hwndDlg, GC_REDRAWLOG, 0, 1); + SendMessage(m_hwnd, GC_REDRAWLOG, 0, 1); break; case EM_THEMECHANGED: - DM_FreeTheme(dat); - return DM_ThemeChanged(dat); + DM_FreeTheme(); + DM_ThemeChanged(); + return 0; case WM_DWMCOMPOSITIONCHANGED: - BB_RefreshTheme(dat); - memset((void*)&dat->pContainer->mOld, -1000, sizeof(MARGINS)); - CProxyWindow::verify(dat); + BB_RefreshTheme(); + memset(&pContainer->mOld, -1000, sizeof(MARGINS)); + CProxyWindow::verify(this); break; case DM_ACTIVATEME: - ActivateExistingTab(dat->pContainer, hwndDlg); + ActivateExistingTab(pContainer, m_hwnd); return 0; case DM_ACTIVATETOOLTIP: - if (!IsIconic(dat->pContainer->hwnd) && dat->pContainer->hwndActive == hwndDlg) - dat->Panel->showTip(wParam, lParam); + if (!IsIconic(pContainer->hwnd) && pContainer->hwndActive == m_hwnd) + Panel->showTip(wParam, lParam); break; case DM_SAVEMESSAGELOG: - DM_SaveLogAsRTF(dat); + DM_SaveLogAsRTF(this); return 0; case DM_CHECKAUTOHIDE: - DM_CheckAutoHide(dat, wParam, lParam); + DM_CheckAutoHide(this, wParam, lParam); return 0; - - case WM_NCDESTROY: - if (dat) { - memset((void*)&dat->pContainer->mOld, -1000, sizeof(MARGINS)); - PostMessage(dat->pContainer->hwnd, WM_SIZE, 0, 1); - delete dat->Panel; - if (dat->pContainer->dwFlags & CNT_SIDEBAR) - dat->pContainer->SideBar->removeSession(dat); - mir_free(dat->enteredText); - mir_free(dat); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); - } - break; - - case WM_DESTROY: - if (si == NULL) - break; - - if (pcli->pfnGetEvent(si->hContact, 0)) - pcli->pfnRemoveEvent(si->hContact, GC_FAKE_EVENT); - si->wState &= ~STATE_TALK; - si->hWnd = NULL; - si->dat = NULL; - si->pContainer = NULL; - dat->si = NULL; - - TABSRMM_FireEvent(dat->hContact, hwndDlg, MSG_WINDOW_EVT_CLOSING, 0); - - if (!dat->bIsAutosizingInput) - db_set_w(NULL, CHAT_MODULE, "SplitterX", (WORD)g_Settings.iSplitterX); - - if (dat->pContainer->settings->fPrivate && !IsAutoSplitEnabled(dat)) - db_set_w(NULL, CHAT_MODULE, "splitY", (WORD)g_Settings.iSplitterY); - - // Typing support for GCW_PRIVMESS sessions - if (si->iType == GCW_PRIVMESS) - if (dat->nTypeMode == PROTOTYPE_SELFTYPING_ON) - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_OFF); - - DM_FreeTheme(dat); - - UpdateTrayMenuState(dat, FALSE); // remove me from the tray menu (if still there) - if (PluginConfig.g_hMenuTrayUnread) - DeleteMenu(PluginConfig.g_hMenuTrayUnread, (UINT_PTR)dat->hContact, MF_BYCOMMAND); - - if (dat->hSmileyIcon) - DestroyIcon(dat->hSmileyIcon); - - if (dat->hwndTip) - DestroyWindow(dat->hwndTip); - - if (hCurHyperlinkHand) - DestroyCursor(hCurHyperlinkHand); - - int i = GetTabIndexFromHWND(hwndTab, hwndDlg); - if (i >= 0) { - SendMessage(hwndTab, WM_USER + 100, 0, 0); // clean up tooltip - TabCtrl_DeleteItem(hwndTab, i); - BroadCastContainer(dat->pContainer, DM_REFRESHTABINDEX, 0, 0); - dat->iTabID = -1; - } - if (dat->pWnd) { - delete dat->pWnd; - dat->pWnd = 0; - } - if (dat->sbCustom) { - delete dat->sbCustom; - dat->sbCustom = 0; - } - - M.RemoveWindow(hwndDlg); - - TABSRMM_FireEvent(dat->hContact, hwndDlg, MSG_WINDOW_EVT_CLOSE, 0); - break; } - return FALSE; + return CTabBaseDlg::DlgProc(uMsg, wParam, lParam); } diff --git a/plugins/TabSRMM/src/contactcache.cpp b/plugins/TabSRMM/src/contactcache.cpp index 62a490d9dd..0728b81e00 100644 --- a/plugins/TabSRMM/src/contactcache.cpp +++ b/plugins/TabSRMM/src/contactcache.cpp @@ -209,7 +209,7 @@ void CContactCache::allocStats() * @param hwnd: window handle * @param dat: _MessageWindowData - window data structure */ -void CContactCache::setWindowData(const HWND hwnd, TWindowData *dat) +void CContactCache::setWindowData(const HWND hwnd, CSrmmWindow *dat) { m_hwnd = hwnd; m_dat = dat; @@ -535,7 +535,7 @@ HICON CContactCache::getIcon(int &iSize) const if (m_dat->dwFlags & MWF_ERRORSTATE) return PluginConfig.g_iconErr; - if (m_dat->mayFlashTab) + if (m_dat->m_bCanFlashTab) return m_dat->iFlashIcon; if (m_dat->si && m_dat->iFlashIcon) { diff --git a/plugins/TabSRMM/src/contactcache.h b/plugins/TabSRMM/src/contactcache.h index 2dfa05670d..d1f7e2ddb2 100644 --- a/plugins/TabSRMM/src/contactcache.h +++ b/plugins/TabSRMM/src/contactcache.h @@ -84,13 +84,13 @@ struct CContactCache : public MZeroedObject __forceinline LPCWSTR getXStatusMsg() const { return m_xStatusMsg; } __forceinline LPCWSTR getListeningInfo() const { return m_ListeningInfo; } __forceinline BYTE getXStatusId() const { return m_xStatus; } - __forceinline HWND getWindowData(TWindowData*& dat) const { dat = m_dat; return m_hwnd; } + __forceinline HWND getWindowData(CSrmmWindow* &dat) const { dat = m_dat; return m_hwnd; } __forceinline HWND getHwnd() const { return m_hwnd; } __forceinline DWORD getSessionStart() const { return m_stats->started; } __forceinline int getSessionMsgCount() const { return (int)m_stats->messageCount; } - __forceinline TWindowData* getDat() const { return m_dat; } + __forceinline CSrmmWindow* getDat() const { return m_dat; } int getStatus(void) const { @@ -107,7 +107,7 @@ struct CContactCache : public MZeroedObject void updateMeta(); bool updateUIN(); void updateStatusMsg(const char *szKey = 0); - void setWindowData(const HWND hwnd = 0, TWindowData *dat = 0); + void setWindowData(const HWND hwnd = 0, CSrmmWindow *dat = 0); void resetMeta(); void closeWindow(); void deletedHandler(); @@ -146,7 +146,7 @@ private: int m_nMax; int m_iHistoryCurrent, m_iHistoryTop, m_iHistorySize; - TWindowData *m_dat; + CSrmmWindow *m_dat; TSessionStats *m_stats; TInputHistory *m_history; DBCachedContact *cc; diff --git a/plugins/TabSRMM/src/container.cpp b/plugins/TabSRMM/src/container.cpp index 744f053d2c..910266fc49 100644 --- a/plugins/TabSRMM/src/container.cpp +++ b/plugins/TabSRMM/src/container.cpp @@ -55,22 +55,22 @@ void TSAPI SetAeroMargins(TContainerData *pContainer) return; } - TWindowData *dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); if (!dat) return; RECT rcWnd; if (dat->bType == SESSIONTYPE_IM) { if (dat->Panel->isActive()) - GetWindowRect(GetDlgItem(dat->hwnd, IDC_LOG), &rcWnd); + GetWindowRect(GetDlgItem(dat->GetHwnd(), IDC_LOG), &rcWnd); else - GetWindowRect(dat->hwnd, &rcWnd); + GetWindowRect(dat->GetHwnd(), &rcWnd); } else { if (dat->Panel->isActive()) - GetWindowRect(GetDlgItem(dat->hwnd, IDC_CHAT_LOG), &rcWnd); + GetWindowRect(GetDlgItem(dat->GetHwnd(), IDC_LOG), &rcWnd); else - GetWindowRect(dat->hwnd, &rcWnd); + GetWindowRect(dat->GetHwnd(), &rcWnd); } POINT pt = { rcWnd.left, rcWnd.top }; @@ -81,7 +81,7 @@ void TSAPI SetAeroMargins(TContainerData *pContainer) pContainer->MenuBar->setAero(true); // bottom part - GetWindowRect(dat->hwnd, &rcWnd); + GetWindowRect(dat->GetHwnd(), &rcWnd); pt.x = rcWnd.left; LONG sbar_left, sbar_right; @@ -447,7 +447,7 @@ static INT_PTR CALLBACK DlgProcContainer(HWND hwndDlg, UINT msg, WPARAM wParam, RECT rc; POINT pt; MCONTACT hContact; - TWindowData *dat; + CTabBaseDlg *dat; TContainerData *pContainer = (TContainerData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); BOOL bSkinned = CSkin::m_skinEnabled ? TRUE : FALSE; @@ -612,7 +612,7 @@ static INT_PTR CALLBACK DlgProcContainer(HWND hwndDlg, UINT msg, WPARAM wParam, pContainer->MenuBar->getClientRect(); if (pContainer->hwndStatus) { - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); SendMessage(pContainer->hwndStatus, WM_USER + 101, 0, (LPARAM)dat); RECT rcs; @@ -664,7 +664,7 @@ static INT_PTR CALLBACK DlgProcContainer(HWND hwndDlg, UINT msg, WPARAM wParam, SetWindowPos((HWND)tci.lParam, 0, rcClient.left, rcClient.top, (rcClient.right - rcClient.left), (rcClient.bottom - rcClient.top), SWP_NOSENDCHANGING | SWP_NOACTIVATE/*|SWP_NOCOPYBITS*/); if (!pContainer->bSizingLoop && sizeChanged) { - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); DM_ScrollToBottom(dat, 0, 1); } } @@ -728,7 +728,7 @@ static INT_PTR CALLBACK DlgProcContainer(HWND hwndDlg, UINT msg, WPARAM wParam, else nPanel = nm->dwItemSpec; panel_found: if (nPanel == 2) { - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); SendMessage(pContainer->hwndStatus, SB_GETRECT, nPanel, (LPARAM)&rc); if (dat) CheckStatusIconClick(dat, nm->pt, rc, 2, ((LPNMHDR)lParam)->code); @@ -786,17 +786,17 @@ panel_found: tci.mask = TCIF_PARAM; TabCtrl_GetItem(hwndTab, iItem, &tci); if (tci.lParam && IsWindow((HWND)tci.lParam)) - dat = (TWindowData*)GetWindowLongPtr((HWND)tci.lParam, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr((HWND)tci.lParam, GWLP_USERDATA); } // sent from a sidebar button (RMB click) instead of the tab control else if (((LPNMHDR)lParam)->idFrom == 5000) { TSideBarNotify* n = reinterpret_cast(lParam); - dat = const_cast(n->dat); + dat = const_cast(n->dat); fFromSidebar = true; } if (dat) - MsgWindowUpdateMenu(dat, subMenu, MENU_TABCONTEXT); + dat->MsgWindowUpdateMenu(subMenu, MENU_TABCONTEXT); int iSelection = TrackPopupMenu(subMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL); if (iSelection >= IDM_CONTAINERMENU) { @@ -812,7 +812,7 @@ panel_found: switch (iSelection) { case ID_TABMENU_CLOSETAB: if (fFromSidebar) - SendMessage(dat->hwnd, WM_CLOSE, 1, 0); + SendMessage(dat->GetHwnd(), WM_CLOSE, 1, 0); else SendMessage(hwndDlg, DM_CLOSETABATMOUSE, 0, (LPARAM)&pt); break; @@ -820,18 +820,18 @@ panel_found: CloseOtherTabs(hwndTab, *dat); break; case ID_TABMENU_SAVETABPOSITION: - db_set_dw(dat->hContact, SRMSGMOD_T, "tabindex", dat->iTabID * 100); + db_set_dw(dat->m_hContact, SRMSGMOD_T, "tabindex", dat->iTabID * 100); break; case ID_TABMENU_CLEARSAVEDTABPOSITION: - db_unset(dat->hContact, SRMSGMOD_T, "tabindex"); + db_unset(dat->m_hContact, SRMSGMOD_T, "tabindex"); break; case ID_TABMENU_LEAVECHATROOM: if (dat && dat->bType == SESSIONTYPE_CHAT) { SESSION_INFO *si = dat->si; - if (si && dat->hContact) { - char *szProto = GetContactProto(dat->hContact); + if (si && dat->m_hContact) { + char *szProto = GetContactProto(dat->m_hContact); if (szProto) - CallProtoService(szProto, PS_LEAVECHAT, dat->hContact, 0); + CallProtoService(szProto, PS_LEAVECHAT, dat->m_hContact, 0); } } break; @@ -862,15 +862,15 @@ panel_found: bool fProcessMainMenu = pContainer->MenuBar->isMainMenu(); pContainer->MenuBar->Cancel(); - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); DWORD dwOldFlags = pContainer->dwFlags; if (dat) { if (fProcessContactMenu) - return Clist_MenuProcessCommand(LOWORD(wParam), MPCF_CONTACTMENU, dat->hContact); + return Clist_MenuProcessCommand(LOWORD(wParam), MPCF_CONTACTMENU, dat->m_hContact); if (fProcessMainMenu) return Clist_MenuProcessCommand(LOWORD(wParam), MPCF_MAINMENU, 0); - if (MsgWindowMenuHandler(dat, LOWORD(wParam), MENU_PICMENU) == 1) + if (dat->MsgWindowMenuHandler(LOWORD(wParam), MENU_PICMENU) == 1) break; } SendMessage(pContainer->hwndActive, DM_QUERYHCONTACT, 0, (LPARAM)&hContact); @@ -931,7 +931,7 @@ panel_found: case WM_EXITSIZEMOVE: GetClientRect(hwndTab, &rc); if (!((rc.right - rc.left) == pContainer->oldSize.cx && (rc.bottom - rc.top) == pContainer->oldSize.cy)) { - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); DM_ScrollToBottom(dat, 0, 0); SendMessage(pContainer->hwndActive, WM_SIZE, 0, 0); } @@ -1006,7 +1006,7 @@ panel_found: if (lParam) { // lParam != 0 means sent by a chat window wchar_t szText[512]; - dat = (TWindowData*)GetWindowLongPtr((HWND)wParam, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr((HWND)wParam, GWLP_USERDATA); GetWindowText((HWND)wParam, szText, _countof(szText)); szText[_countof(szText) - 1] = 0; SetWindowText(hwndDlg, szText); @@ -1019,7 +1019,7 @@ panel_found: SendMessage(pContainer->hwndActive, DM_QUERYHCONTACT, 0, (LPARAM)&hContact); else break; - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); } else { HWND hwnd = M.FindWindow(wParam); @@ -1032,7 +1032,7 @@ panel_found: } hContact = wParam; if (hwnd && hContact) - dat = (TWindowData*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA); } if (dat) { SendMessage(hwndDlg, DM_SETICON, (WPARAM)dat, (LPARAM)(dat->hXStatusIcon ? dat->hXStatusIcon : dat->hTabStatusIcon)); @@ -1052,13 +1052,13 @@ panel_found: PostMessage(hwndDlg, WM_CLOSE, 1, 0); } - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); if (dat && dat->bType == SESSIONTYPE_IM) { if (dat->idle && pContainer->hwndActive && IsWindow(pContainer->hwndActive)) dat->Panel->Invalidate(TRUE); } else if (dat) - SendMessage(dat->hwnd, GC_UPDATESTATUSBAR, 0, 0); + SendMessage(dat->GetHwnd(), GC_UPDATESTATUSBAR, 0, 0); } break; @@ -1090,7 +1090,7 @@ panel_found: memset((void*)&pContainer->mOld, -1000, sizeof(MARGINS)); break; case SC_MINIMIZE: - dat = reinterpret_cast(GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA)); + dat = reinterpret_cast(GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA)); if (dat) { GetWindowRect(pContainer->hwndActive, &pContainer->rcLogSaved); pContainer->ptLogSaved.x = pContainer->rcLogSaved.left; @@ -1397,7 +1397,7 @@ panel_found: SetWindowPos(hwndDlg, 0, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_NOCOPYBITS); RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW); if (pContainer->hwndActive != 0) { - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); DM_ScrollToBottom(dat, 0, 0); } } @@ -1497,7 +1497,7 @@ panel_found: case DM_SETICON: { - dat = (TWindowData*)wParam; + dat = (CSrmmWindow*)wParam; HICON hIconMsg = PluginConfig.g_IconMsgEvent; HICON hIconBig = (dat && dat->cache) ? Skin_LoadProtoIcon(dat->cache->getProto(), dat->cache->getStatus(), true) : 0; @@ -1567,7 +1567,7 @@ panel_found: { DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam; if (dis->hwndItem == pContainer->hwndStatus && !(pContainer->dwFlags & CNT_NOSTATUSBAR)) { - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); if (dat) DrawStatusIcons(dat, dis->hDC, dis->rcItem, 2); return TRUE; @@ -1854,11 +1854,11 @@ int TSAPI ActivateTabFromHWND(HWND hwndTab, HWND hwnd) } // enumerates tabs and closes all of them, but the one in dat -void TSAPI CloseOtherTabs(HWND hwndTab, TWindowData &dat) +void TSAPI CloseOtherTabs(HWND hwndTab, CTabBaseDlg &dat) { for (int idxt = 0; idxt < dat.pContainer->iChilds;) { HWND otherTab = GetHWNDFromTabIndex(hwndTab, idxt); - if (otherTab != NULL && otherTab != dat.hwnd) + if (otherTab != NULL && otherTab != dat.GetHwnd()) SendMessage(otherTab, WM_CLOSE, 1, 0); else ++idxt; @@ -2193,7 +2193,7 @@ void TSAPI BroadCastContainer(const TContainerData *pContainer, UINT message, WP if (bType == SESSIONTYPE_ANY) SendMessage((HWND)item.lParam, message, wParam, lParam); else { - TWindowData *dat = (TWindowData*)GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA); if (dat && dat->bType == bType) SendMessage((HWND)item.lParam, message, wParam, lParam); } diff --git a/plugins/TabSRMM/src/controls.cpp b/plugins/TabSRMM/src/controls.cpp index f72b9ea871..369ed45b21 100644 --- a/plugins/TabSRMM/src/controls.cpp +++ b/plugins/TabSRMM/src/controls.cpp @@ -384,9 +384,9 @@ void CMenuBar::invoke(const int id) m_isContactMenu = m_isMainMenu = false; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(m_pContainer->hwndActive, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(m_pContainer->hwndActive, GWLP_USERDATA); - MCONTACT hContact = dat ? dat->hContact : 0; + MCONTACT hContact = dat ? dat->m_hContact : 0; if (index == 3 && hContact != 0) { hMenu = Menu_BuildContactMenu(hContact); @@ -438,7 +438,7 @@ void CMenuBar::Cancel(void) void CMenuBar::updateState(const HMENU hMenu) const { - TWindowData *dat = (TWindowData*)GetWindowLongPtr(m_pContainer->hwndActive, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(m_pContainer->hwndActive, GWLP_USERDATA); if (dat) { ::CheckMenuItem(hMenu, ID_VIEW_SHOWMENUBAR, MF_BYCOMMAND | m_pContainer->dwFlags & CNT_NOMENUBAR ? MF_UNCHECKED : MF_CHECKED); ::CheckMenuItem(hMenu, ID_VIEW_SHOWSTATUSBAR, MF_BYCOMMAND | m_pContainer->dwFlags & CNT_NOSTATUSBAR ? MF_UNCHECKED : MF_CHECKED); @@ -477,7 +477,7 @@ void CMenuBar::updateState(const HMENU hMenu) const void CMenuBar::configureMenu() const { - TWindowData *dat = (TWindowData*)::GetWindowLongPtr(m_pContainer->hwndActive, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)::GetWindowLongPtr(m_pContainer->hwndActive, GWLP_USERDATA); if (dat) { bool fChat = (dat->bType == SESSIONTYPE_CHAT); @@ -486,7 +486,7 @@ void CMenuBar::configureMenu() const ::SendMessage(m_hwndToolbar, TB_SETSTATE, 105, fChat ? TBSTATE_HIDDEN : TBSTATE_ENABLED); if (dat->bType == SESSIONTYPE_IM) - ::EnableWindow(GetDlgItem(dat->hwnd, IDC_TIME), TRUE); + ::EnableWindow(GetDlgItem(dat->GetHwnd(), IDC_TIME), TRUE); } } @@ -673,7 +673,7 @@ RECT rcLastStatusBarClick; // remembers click (down event) point for status b LONG_PTR CALLBACK StatusBarSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { TContainerData *pContainer = (TContainerData*)GetWindowLongPtr(GetParent(hWnd), GWLP_USERDATA); - TWindowData *dat = NULL; + CSrmmWindow *dat = NULL; POINT pt; if (OldStatusBarproc == 0) { @@ -732,7 +732,7 @@ LONG_PTR CALLBACK StatusBarSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPAR HANDLE hTheme = bAero ? OpenThemeData(hWnd, L"ButtonStyle") : 0; if (pContainer) - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); RECT rcClient; GetClientRect(hWnd, &rcClient); @@ -837,7 +837,7 @@ LONG_PTR CALLBACK StatusBarSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPAR wchar_t szText[1024]; szText[0] = 0; LRESULT result = SendMessage(hWnd, SB_GETTEXT, i, (LPARAM)szText); if (i == 2 && pContainer) { - TWindowData *pDat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + CSrmmWindow *pDat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); if (pDat) DrawStatusIcons(pDat, hdcMem, itemRect, 2); } @@ -885,9 +885,9 @@ LONG_PTR CALLBACK StatusBarSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPAR case WM_USER + 101: { int list_icons = 0; - dat = (TWindowData*)lParam; + dat = (CSrmmWindow*)lParam; if (dat) - while (Srmm_GetNthIcon(dat->hContact, list_icons)) + while (Srmm_GetNthIcon(dat->m_hContact, list_icons)) list_icons++; SendMessage(hWnd, WM_SIZE, 0, 0); @@ -948,7 +948,7 @@ LONG_PTR CALLBACK StatusBarSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPAR GetCursorPos(&pt); if (pt.x != ptMouse.x || pt.y != ptMouse.y) break; - dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); if (dat != NULL) { RECT rc; SIZE size; @@ -960,7 +960,7 @@ LONG_PTR CALLBACK StatusBarSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPAR SendMessage(hWnd, SB_GETRECT, 2, (LPARAM)&rc); if (PtInRect(&rc, pt)) { unsigned int iconNum = (pt.x - rc.left) / (PluginConfig.m_smcxicon + 2); - StatusIconData *sid = Srmm_GetNthIcon(dat->hContact, iconNum); + StatusIconData *sid = Srmm_GetNthIcon(dat->m_hContact, iconNum); if (sid == NULL) break; @@ -970,7 +970,7 @@ LONG_PTR CALLBACK StatusBarSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPAR pContainer->dwFlags & CNT_NOSOUND ? TranslateT("disabled") : TranslateT("enabled")); else if (sid->dwId == MSG_ICON_UTN && (dat->bType == SESSIONTYPE_IM || dat->si->iType == GCW_PRIVMESS)) { - int mtnStatus = db_get_b(dat->hContact, SRMSGMOD, SRMSGSET_TYPING, M.GetByte(SRMSGMOD, SRMSGSET_TYPINGNEW, SRMSGDEFSET_TYPINGNEW)); + int mtnStatus = db_get_b(dat->m_hContact, SRMSGMOD, SRMSGSET_TYPING, M.GetByte(SRMSGMOD, SRMSGSET_TYPINGNEW, SRMSGDEFSET_TYPINGNEW)); mir_snwprintf(wBuf, TranslateT("Sending typing notifications is %s."), mtnStatus ? TranslateT("enabled") : TranslateT("disabled")); } @@ -989,10 +989,10 @@ LONG_PTR CALLBACK StatusBarSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPAR if (PtInRect(&rc, pt)) { int iLength = 0; GETTEXTLENGTHEX gtxl = { 0 }; - int iQueued = db_get_dw(dat->hContact, "SendLater", "count", 0); + int iQueued = db_get_dw(dat->m_hContact, "SendLater", "count", 0); gtxl.codepage = CP_UTF8; gtxl.flags = GTL_DEFAULT | GTL_PRECISE | GTL_NUMBYTES; - iLength = SendDlgItemMessage(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_MESSAGE : IDC_CHAT_MESSAGE, EM_GETTEXTLENGTHEX, (WPARAM)>xl, 0); + iLength = SendDlgItemMessage(dat->GetHwnd(), dat->bType == SESSIONTYPE_IM ? IDC_MESSAGE : IDC_MESSAGE, EM_GETTEXTLENGTHEX, (WPARAM)>xl, 0); tooltip_active = TRUE; const wchar_t *szFormat = TranslateT("There are %d pending send jobs. Message length: %d bytes, message length limit: %d bytes\n\n%d messages are queued for later delivery"); @@ -1010,7 +1010,7 @@ LONG_PTR CALLBACK StatusBarSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPAR if (PtInRect(&rc, pt) && ((rc.right - rc.left) < size.cx)) { if (dat->bType == SESSIONTYPE_CHAT) { - ptrW tszTopic(db_get_wsa(dat->hContact, dat->szProto, "Topic")); + ptrW tszTopic(db_get_wsa(dat->m_hContact, dat->szProto, "Topic")); if (tszTopic != NULL) { tooltip_active = TRUE; CallService("mToolTip/ShowTipW", tszTopic, (LPARAM)&ti); diff --git a/plugins/TabSRMM/src/eventpopups.cpp b/plugins/TabSRMM/src/eventpopups.cpp index dca01dc9c6..45b446550f 100644 --- a/plugins/TabSRMM/src/eventpopups.cpp +++ b/plugins/TabSRMM/src/eventpopups.cpp @@ -653,9 +653,9 @@ static int TSAPI PopupPreview(NEN_OPTIONS *pluginOptions) // updates the menu entry... // bForced is used to only update the status, nickname etc. and does NOT update the unread count -void TSAPI UpdateTrayMenuState(TWindowData *dat, BOOL bForced) +void TSAPI UpdateTrayMenuState(CTabBaseDlg *dat, BOOL bForced) { - if (PluginConfig.g_hMenuTrayUnread == 0 || dat->hContact == NULL) + if (PluginConfig.g_hMenuTrayUnread == 0 || dat->m_hContact == NULL) return; MENUITEMINFO mii = { 0 }; @@ -665,7 +665,7 @@ void TSAPI UpdateTrayMenuState(TWindowData *dat, BOOL bForced) const wchar_t *tszProto = dat->cache->getRealAccount(); assert(tszProto != 0); - GetMenuItemInfo(PluginConfig.g_hMenuTrayUnread, (UINT_PTR)dat->hContact, FALSE, &mii); + GetMenuItemInfo(PluginConfig.g_hMenuTrayUnread, (UINT_PTR)dat->m_hContact, FALSE, &mii); if (!bForced) PluginConfig.m_UnreadInTray -= (mii.dwItemData & 0x0000ffff); if (mii.dwItemData > 0 || bForced) { @@ -680,11 +680,11 @@ void TSAPI UpdateTrayMenuState(TWindowData *dat, BOOL bForced) mii.cch = (int)mir_wstrlen(szMenuEntry) + 1; } mii.hbmpItem = HBMMENU_CALLBACK; - SetMenuItemInfo(PluginConfig.g_hMenuTrayUnread, (UINT_PTR)dat->hContact, FALSE, &mii); + SetMenuItemInfo(PluginConfig.g_hMenuTrayUnread, (UINT_PTR)dat->m_hContact, FALSE, &mii); } // if we want tray support, add the contact to the list of unread sessions in the tray menu -int TSAPI UpdateTrayMenu(const TWindowData *dat, WORD wStatus, const char *szProto, const wchar_t *szStatus, MCONTACT hContact, DWORD fromEvent) +int TSAPI UpdateTrayMenu(const CTabBaseDlg *dat, WORD wStatus, const char *szProto, const wchar_t *szStatus, MCONTACT hContact, DWORD fromEvent) { if (!PluginConfig.g_hMenuTrayUnread || hContact == 0 || szProto == NULL) return 0; diff --git a/plugins/TabSRMM/src/functions.h b/plugins/TabSRMM/src/functions.h index dd3532fbdb..631ad8de83 100644 --- a/plugins/TabSRMM/src/functions.h +++ b/plugins/TabSRMM/src/functions.h @@ -50,7 +50,7 @@ LONG_PTR CALLBACK HotkeyHandlerDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LP int TSAPI NEN_ReadOptions(NEN_OPTIONS *options); int TSAPI NEN_WriteOptions(NEN_OPTIONS *options); -int TSAPI UpdateTrayMenu(const TWindowData *dat, WORD wStatus, const char *szProto, const wchar_t *szStatus, MCONTACT hContact, DWORD fromEvent); +int TSAPI UpdateTrayMenu(const CTabBaseDlg *dat, WORD wStatus, const char *szProto, const wchar_t *szStatus, MCONTACT hContact, DWORD fromEvent); void TSAPI DeletePopupsForContact(MCONTACT hContact, DWORD dwMask); /* @@ -59,7 +59,7 @@ void TSAPI DeletePopupsForContact(MCONTACT hContact, DWORD dwMask); void TSAPI CreateSystrayIcon(int create); void TSAPI FlashTrayIcon(HICON hIcon); -void TSAPI UpdateTrayMenuState(TWindowData *dat, BOOL bForced); +void TSAPI UpdateTrayMenuState(CTabBaseDlg *dat, BOOL bForced); void TSAPI LoadFavoritesAndRecent(); void TSAPI AddContactToFavorites(MCONTACT hContact, const wchar_t *szNickname, const char *szProto, wchar_t *szStatus, WORD wStatus, HICON hIcon, BOOL mode, HMENU hMenu); @@ -83,7 +83,7 @@ TContainerData* TSAPI FindContainerByName(const wchar_t *name); int TSAPI GetTabIndexFromHWND(HWND hwndTab, HWND hwnd); HWND TSAPI GetHWNDFromTabIndex(HWND hwndTab, int idx); int TSAPI GetTabItemFromMouse(HWND hwndTab, POINT *pt); -void TSAPI CloseOtherTabs(HWND hwndTab, TWindowData &dat); +void TSAPI CloseOtherTabs(HWND hwndTab, CTabBaseDlg &dat); int TSAPI ActivateTabFromHWND(HWND hwndTab, HWND hwnd); void TSAPI AdjustTabClientRect(TContainerData *pContainer, RECT *rc); void TSAPI ReflashContainer(TContainerData *pContainer); @@ -117,13 +117,10 @@ void TSAPI CacheLogFonts(); void TSAPI LoadIconTheme(); void TSAPI RTF_CTableInit(); -INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); - int DbEventIsForMsgWindow(DBEVENTINFO *dbei); int TSAPI InitOptions(void); int TSAPI DbEventIsShown(DBEVENTINFO *dbei); -void TSAPI StreamInEvents(HWND hwndDlg, MEVENT hDbEventFirst, int count, int fAppend, DBEVENTINFO *dbei_s); void TSAPI LoadLogfont(int i, LOGFONTA *lf, COLORREF *colour, char *szModule); // custom tab control @@ -143,20 +140,16 @@ int TSAPI UnloadTSButtonModule(); int _DebugTraceW(const wchar_t *fmt, ...); #endif int _DebugPopup(MCONTACT hContact, const wchar_t *fmt, ...); -int _DebugMessage(HWND hwndDlg, TWindowData *dat, const char *fmt, ...); +int _DebugMessage(HWND hwndDlg, CSrmmWindow *dat, const char *fmt, ...); // themes const wchar_t* TSAPI GetThemeFileName(int iMode); int TSAPI CheckThemeVersion(const wchar_t *szIniFilename); -void TSAPI WriteThemeToINI(const wchar_t *szIniFilename, TWindowData *dat); +void TSAPI WriteThemeToINI(const wchar_t *szIniFilename, CSrmmWindow *dat); void TSAPI ReadThemeFromINI(const wchar_t *szIniFilename, TContainerData *dat, int noAdvanced, DWORD dwFlags); -// user prefs - -int TSAPI LoadLocalFlags(TWindowData *dat); - -//TypingNotify +// TypingNotify int TN_ModuleInit(); int TN_OptionsInitialize(WPARAM wParam, LPARAM lParam); int TN_ModuleDeInit(); diff --git a/plugins/TabSRMM/src/generic_msghandlers.cpp b/plugins/TabSRMM/src/generic_msghandlers.cpp index 1df30b4efd..81a2ec967d 100644 --- a/plugins/TabSRMM/src/generic_msghandlers.cpp +++ b/plugins/TabSRMM/src/generic_msghandlers.cpp @@ -33,12 +33,12 @@ ///////////////////////////////////////////////////////////////////////////////////////// // Save message log for given session as RTF document -void TSAPI DM_SaveLogAsRTF(const TWindowData *dat) +void TSAPI DM_SaveLogAsRTF(const CTabBaseDlg *dat) { if (dat && dat->hwndIEView != 0) { IEVIEWEVENT event = { sizeof(event) }; event.hwnd = dat->hwndIEView; - event.hContact = dat->hContact; + event.hContact = dat->m_hContact; event.iType = IEE_SAVE_DOCUMENT; CallService(MS_IEVIEW_EVENT, 0, (LPARAM)&event); } @@ -55,7 +55,7 @@ void TSAPI DM_SaveLogAsRTF(const TWindowData *dat) OPENFILENAME ofn = { 0 }; ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = dat->hwnd; + ofn.hwndOwner = dat->GetHwnd(); ofn.lpstrFile = szFilename; ofn.lpstrFilter = szFilter; ofn.lpstrInitialDir = szInitialDir; @@ -67,7 +67,7 @@ void TSAPI DM_SaveLogAsRTF(const TWindowData *dat) stream.dwCookie = (DWORD_PTR)szFilename; stream.dwError = 0; stream.pfnCallback = Utils::StreamOut; - SendDlgItemMessage(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_CHAT_LOG, EM_STREAMOUT, SF_RTF | SF_USECODEPAGE, (LPARAM)&stream); + SendDlgItemMessage(dat->GetHwnd(), dat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_LOG, EM_STREAMOUT, SF_RTF | SF_USECODEPAGE, (LPARAM)&stream); } } } @@ -82,12 +82,12 @@ void TSAPI DM_SaveLogAsRTF(const TWindowData *dat) // // If no session in the container disagrees, the container will be hidden. -void TSAPI DM_CheckAutoHide(const TWindowData *dat, WPARAM wParam, LPARAM lParam) +void TSAPI DM_CheckAutoHide(const CTabBaseDlg *dat, WPARAM wParam, LPARAM lParam) { if (dat && lParam) { BOOL *fResult = (BOOL*)lParam; - if (GetWindowTextLength(GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_MESSAGE : IDC_CHAT_MESSAGE)) > 0) { + if (GetWindowTextLength(GetDlgItem(dat->GetHwnd(), dat->bType == SESSIONTYPE_IM ? IDC_MESSAGE : IDC_MESSAGE)) > 0) { *fResult = FALSE; return; // text entered in the input area -> prevent autohide/cose } @@ -103,7 +103,7 @@ void TSAPI DM_CheckAutoHide(const TWindowData *dat, WPARAM wParam, LPARAM lParam ///////////////////////////////////////////////////////////////////////////////////////// // checks if the balloon tooltip can be dismissed (usually called by WM_MOUSEMOVE events) -void TSAPI DM_DismissTip(TWindowData *dat, const POINT& pt) +void TSAPI DM_DismissTip(CTabBaseDlg *dat, const POINT& pt) { if (!IsWindowVisible(dat->hwndTip)) return; @@ -122,21 +122,21 @@ void TSAPI DM_DismissTip(TWindowData *dat, const POINT& pt) ///////////////////////////////////////////////////////////////////////////////////////// // initialize the balloon tooltip for message window notifications -void TSAPI DM_InitTip(TWindowData *dat) +void CTabBaseDlg::DM_InitTip() { - dat->hwndTip = CreateWindowEx(0, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_BALLOON, CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, dat->hwnd, NULL, g_hInst, (LPVOID)NULL); - - memset(&dat->ti, 0, sizeof(dat->ti)); - dat->ti.cbSize = sizeof(dat->ti); - dat->ti.lpszText = TranslateT("No status message"); - dat->ti.hinst = g_hInst; - dat->ti.hwnd = dat->hwnd; - dat->ti.uFlags = TTF_TRACK | TTF_IDISHWND | TTF_TRANSPARENT; - dat->ti.uId = (UINT_PTR)dat->hwnd; - SendMessage(dat->hwndTip, TTM_ADDTOOL, 0, (LPARAM)&dat->ti); - - SetWindowPos(dat->hwndTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); + hwndTip = CreateWindowEx(0, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_BALLOON, CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, m_hwnd, NULL, g_hInst, (LPVOID)NULL); + + memset(&ti, 0, sizeof(ti)); + ti.cbSize = sizeof(ti); + ti.lpszText = TranslateT("No status message"); + ti.hinst = g_hInst; + ti.hwnd = m_hwnd; + ti.uFlags = TTF_TRACK | TTF_IDISHWND | TTF_TRANSPARENT; + ti.uId = (UINT_PTR)m_hwnd; + SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&ti); + + SetWindowPos(hwndTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -144,14 +144,14 @@ void TSAPI DM_InitTip(TWindowData *dat) // // returns 1 for handled hotkeys, 0 otherwise. -LRESULT TSAPI DM_GenericHotkeysCheck(MSG *message, TWindowData *dat) +LRESULT TSAPI DM_GenericHotkeysCheck(MSG *message, CTabBaseDlg *dat) { LRESULT mim_hotkey_check = CallService(MS_HOTKEY_CHECK, (WPARAM)message, (LPARAM)TABSRMM_HK_SECTION_GENERIC); - HWND hwndDlg = dat->hwnd; + HWND hwndDlg = dat->GetHwnd(); switch (mim_hotkey_check) { case TABSRMM_HK_PASTEANDSEND: - HandlePasteAndSend(dat); + dat->HandlePasteAndSend(); return 1; case TABSRMM_HK_HISTORY: SendMessage(hwndDlg, WM_COMMAND, IDC_HISTORY, 0); @@ -175,7 +175,7 @@ LRESULT TSAPI DM_GenericHotkeysCheck(MSG *message, TWindowData *dat) SendMessage(hwndDlg, WM_COMMAND, IDC_TOGGLETOOLBAR, 0); return 1; case TABSRMM_HK_CLEARLOG: - ClearLog(dat); + dat->ClearLog(); return 1; case TABSRMM_HK_TOGGLESIDEBAR: if (dat->pContainer->SideBar->isActive()) @@ -188,7 +188,7 @@ LRESULT TSAPI DM_GenericHotkeysCheck(MSG *message, TWindowData *dat) return 0; } -LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, TWindowData *dat, UINT cmd, WPARAM wParam, LPARAM lParam) +LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, CTabBaseDlg *dat, UINT cmd, WPARAM wParam, LPARAM lParam) { RECT rc; HWND hwndContainer = pContainer->hwnd; @@ -261,23 +261,23 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T break; case IDC_HISTORY: - CallService(MS_HISTORY_SHOWCONTACTHISTORY, dat->hContact, 0); + CallService(MS_HISTORY_SHOWCONTACTHISTORY, dat->m_hContact, 0); break; case IDC_TIME: submenu = GetSubMenu(PluginConfig.g_hMenuContext, 2); - MsgWindowUpdateMenu(dat, submenu, MENU_LOGMENU); + dat->MsgWindowUpdateMenu(submenu, MENU_LOGMENU); GetWindowRect(GetDlgItem(hwndDlg, IDC_TIME), &rc); iSelection = TrackPopupMenu(submenu, TPM_RETURNCMD, rc.left, rc.bottom, 0, hwndDlg, NULL); - return MsgWindowMenuHandler(dat, iSelection, MENU_LOGMENU); + return dat->MsgWindowMenuHandler(iSelection, MENU_LOGMENU); case IDC_PROTOMENU: - if (dat->hContact) { + if (dat->m_hContact) { submenu = GetSubMenu(PluginConfig.g_hMenuContext, 4); int iOldGlobalSendFormat = PluginConfig.m_SendFormat; - int iLocalFormat = M.GetDword(dat->hContact, "sendformat", 0); + int iLocalFormat = M.GetDword(dat->m_hContact, "sendformat", 0); int iNewLocalFormat = iLocalFormat; GetWindowRect(GetDlgItem(hwndDlg, IDC_PROTOCOL), &rc); @@ -297,18 +297,18 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T switch (iSelection) { case ID_MODE_GLOBAL: dat->dwFlagsEx &= ~(MWF_SHOW_SPLITTEROVERRIDE); - db_set_b(dat->hContact, SRMSGMOD_T, "splitoverride", 0); - LoadSplitter(dat); - AdjustBottomAvatarDisplay(dat); - DM_RecalcPictureSize(dat); + db_set_b(dat->m_hContact, SRMSGMOD_T, "splitoverride", 0); + dat->LoadSplitter(); + dat->AdjustBottomAvatarDisplay(); + dat->DM_RecalcPictureSize(); SendMessage(hwndDlg, WM_SIZE, 0, 0); break; case ID_MODE_PRIVATE: dat->dwFlagsEx |= MWF_SHOW_SPLITTEROVERRIDE; - db_set_b(dat->hContact, SRMSGMOD_T, "splitoverride", 1); - LoadSplitter(dat); - AdjustBottomAvatarDisplay(dat); - DM_RecalcPictureSize(dat); + db_set_b(dat->m_hContact, SRMSGMOD_T, "splitoverride", 1); + dat->LoadSplitter(); + dat->AdjustBottomAvatarDisplay(); + dat->DM_RecalcPictureSize(); SendMessage(hwndDlg, WM_SIZE, 0, 0); break; case ID_GLOBAL_BBCODE: @@ -328,14 +328,14 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T break; } if (iNewLocalFormat == 0) - db_unset(dat->hContact, SRMSGMOD_T, "sendformat"); + db_unset(dat->m_hContact, SRMSGMOD_T, "sendformat"); else if (iNewLocalFormat != iLocalFormat) - db_set_dw(dat->hContact, SRMSGMOD_T, "sendformat", iNewLocalFormat); + db_set_dw(dat->m_hContact, SRMSGMOD_T, "sendformat", iNewLocalFormat); if (PluginConfig.m_SendFormat != iOldGlobalSendFormat) db_set_b(0, SRMSGMOD_T, "sendformat", (BYTE)PluginConfig.m_SendFormat); if (iNewLocalFormat != iLocalFormat || PluginConfig.m_SendFormat != iOldGlobalSendFormat) { - dat->SendFormat = M.GetDword(dat->hContact, "sendformat", PluginConfig.m_SendFormat); + dat->SendFormat = M.GetDword(dat->m_hContact, "sendformat", PluginConfig.m_SendFormat); if (dat->SendFormat == -1) // per contact override to disable it.. dat->SendFormat = 0; M.BroadcastMessage(DM_CONFIGURETOOLBAR, 0, 1); @@ -361,12 +361,12 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T switch (iSelection) { case ID_FAVORITES_ADDCONTACTTOFAVORITES: - db_set_b(dat->hContact, SRMSGMOD_T, "isFavorite", 1); - AddContactToFavorites(dat->hContact, dat->cache->getNick(), dat->cache->getProto(), dat->szStatus, dat->wStatus, Skin_LoadProtoIcon(dat->cache->getProto(), dat->cache->getStatus()), 1, PluginConfig.g_hMenuFavorites); + db_set_b(dat->m_hContact, SRMSGMOD_T, "isFavorite", 1); + AddContactToFavorites(dat->m_hContact, dat->cache->getNick(), dat->cache->getProto(), dat->szStatus, dat->wStatus, Skin_LoadProtoIcon(dat->cache->getProto(), dat->cache->getStatus()), 1, PluginConfig.g_hMenuFavorites); break; case ID_FAVORITES_REMOVECONTACTFROMFAVORITES: - db_set_b(dat->hContact, SRMSGMOD_T, "isFavorite", 0); - DeleteMenu(PluginConfig.g_hMenuFavorites, (UINT_PTR)dat->hContact, MF_BYCOMMAND); + db_set_b(dat->m_hContact, SRMSGMOD_T, "isFavorite", 0); + DeleteMenu(PluginConfig.g_hMenuFavorites, (UINT_PTR)dat->m_hContact, MF_BYCOMMAND); break; } dat->cache->updateFavorite(); @@ -393,12 +393,12 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T case ID_SENDMENU_SENDTOMULTIPLEUSERS: dat->sendMode ^= SMODE_MULTIPLE; if (dat->sendMode & SMODE_MULTIPLE) - DM_CreateClist(dat); + dat->DM_CreateClist(); else if (IsWindow(GetDlgItem(hwndDlg, IDC_CLIST))) DestroyWindow(GetDlgItem(hwndDlg, IDC_CLIST)); break; case ID_SENDMENU_SENDNUDGE: - SendNudge(dat); + dat->SendNudge(); break; case ID_SENDMENU_SENDDEFAULT: dat->sendMode = 0; @@ -416,12 +416,12 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T case ID_SENDMENU_SENDWITHOUTTIMEOUTS: dat->sendMode ^= SMODE_NOACK; if (dat->sendMode & SMODE_NOACK) - db_set_b(dat->hContact, SRMSGMOD_T, "no_ack", 1); + db_set_b(dat->m_hContact, SRMSGMOD_T, "no_ack", 1); else - db_unset(dat->hContact, SRMSGMOD_T, "no_ack"); + db_unset(dat->m_hContact, SRMSGMOD_T, "no_ack"); break; } - db_set_b(dat->hContact, SRMSGMOD_T, "no_ack", (BYTE)(dat->sendMode & SMODE_NOACK ? 1 : 0)); + db_set_b(dat->m_hContact, SRMSGMOD_T, "no_ack", (BYTE)(dat->sendMode & SMODE_NOACK ? 1 : 0)); SetWindowPos(GetDlgItem(hwndDlg, IDC_MESSAGE), 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE); if (dat->sendMode & SMODE_MULTIPLE || dat->sendMode & SMODE_CONTAINER) { SetWindowPos(GetDlgItem(hwndDlg, IDC_MESSAGE), 0, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOZORDER | @@ -466,7 +466,7 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T DBVARIANT dbv = { 0 }; - if (0 == db_get_ws(dat->hContact, "UserInfo", "MyNotes", &dbv)) { + if (0 == db_get_ws(dat->m_hContact, "UserInfo", "MyNotes", &dbv)) { SetDlgItemText(hwndDlg, IDC_MESSAGE, dbv.ptszVal); mir_free(dbv.ptszVal); } @@ -476,7 +476,7 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T wchar_t *buf = (wchar_t*)mir_alloc((iLen + 2) * sizeof(wchar_t)); GetDlgItemText(hwndDlg, IDC_MESSAGE, buf, iLen + 1); - db_set_ws(dat->hContact, "UserInfo", "MyNotes", buf); + db_set_ws(dat->m_hContact, "UserInfo", "MyNotes", buf); SetDlgItemText(hwndDlg, IDC_MESSAGE, L""); if (!dat->bIsAutosizingInput) { @@ -494,11 +494,11 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T break; case IDM_CLEAR: - ClearLog(dat); + dat->ClearLog(); break; case IDC_PROTOCOL: - submenu = Menu_BuildContactMenu(dat->hContact); + submenu = Menu_BuildContactMenu(dat->m_hContact); if (lParam == 0) GetWindowRect(GetDlgItem(hwndDlg, IDC_PROTOCOL), &rc); else @@ -506,7 +506,7 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T iSelection = TrackPopupMenu(submenu, TPM_RETURNCMD, rc.left, rc.bottom, 0, hwndDlg, NULL); if (iSelection) - Clist_MenuProcessCommand(LOWORD(iSelection), MPCF_CONTACTMENU, dat->hContact); + Clist_MenuProcessCommand(LOWORD(iSelection), MPCF_CONTACTMENU, dat->m_hContact); DestroyMenu(submenu); break; @@ -525,14 +525,14 @@ LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, T break; case IDC_SELFTYPING: - if (dat->hContact) { - int iCurrentTypingMode = db_get_b(dat->hContact, SRMSGMOD, SRMSGSET_TYPING, M.GetByte(SRMSGMOD, SRMSGSET_TYPINGNEW, SRMSGDEFSET_TYPINGNEW)); + if (dat->m_hContact) { + int iCurrentTypingMode = db_get_b(dat->m_hContact, SRMSGMOD, SRMSGSET_TYPING, M.GetByte(SRMSGMOD, SRMSGSET_TYPINGNEW, SRMSGDEFSET_TYPINGNEW)); if (dat->nTypeMode == PROTOTYPE_SELFTYPING_ON && iCurrentTypingMode) { - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_OFF); + dat->DM_NotifyTyping(PROTOTYPE_SELFTYPING_OFF); dat->nTypeMode = PROTOTYPE_SELFTYPING_OFF; } - db_set_b(dat->hContact, SRMSGMOD, SRMSGSET_TYPING, (BYTE)!iCurrentTypingMode); + db_set_b(dat->m_hContact, SRMSGMOD, SRMSGSET_TYPING, (BYTE)!iCurrentTypingMode); } break; @@ -587,7 +587,7 @@ LRESULT TSAPI DM_ContainerCmdHandler(TContainerData *pContainer, UINT cmd, WPARA return 0; HWND hwndDlg = pContainer->hwnd; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); + CTabBaseDlg *dat = (CTabBaseDlg*)GetWindowLongPtr(pContainer->hwndActive, GWLP_USERDATA); switch (cmd) { case IDC_CLOSE: @@ -698,7 +698,7 @@ LRESULT TSAPI DM_ContainerCmdHandler(TContainerData *pContainer, UINT cmd, WPARA case ID_MESSAGELOGSETTINGS_FORTHISCONTACT: case ID_MESSAGELOGSETTINGS_GLOBAL: if (dat) { - MsgWindowMenuHandler(dat, (int)LOWORD(wParam), MENU_LOGMENU); + dat->MsgWindowMenuHandler((int)LOWORD(wParam), MENU_LOGMENU); return 1; } break; @@ -717,12 +717,12 @@ LRESULT TSAPI DM_ContainerCmdHandler(TContainerData *pContainer, UINT cmd, WPARA // initialize rich edit control (log and edit control) for both MUC and // standard IM session windows. -void TSAPI DM_InitRichEdit(TWindowData *dat) +void TSAPI DM_InitRichEdit(CTabBaseDlg *dat) { bool fIsChat = ((dat->bType == SESSIONTYPE_CHAT) ? true : false); - HWND hwndLog = GetDlgItem(dat->hwnd, !fIsChat ? IDC_LOG : IDC_CHAT_LOG); - HWND hwndEdit = GetDlgItem(dat->hwnd, !fIsChat ? IDC_MESSAGE : IDC_CHAT_MESSAGE); - HWND hwndDlg = dat->hwnd; + HWND hwndLog = GetDlgItem(dat->GetHwnd(), !fIsChat ? IDC_LOG : IDC_LOG); + HWND hwndEdit = GetDlgItem(dat->GetHwnd(), !fIsChat ? IDC_MESSAGE : IDC_MESSAGE); + HWND hwndDlg = dat->GetHwnd(); dat->inputbg = fIsChat ? M.GetDword(FONTMODULE, "inputbg", SRMSGDEFSET_BKGCOLOUR) : dat->pContainer->theme.inputbg; COLORREF colour = fIsChat ? g_Settings.crLogBackground : dat->pContainer->theme.bg; @@ -824,17 +824,17 @@ void TSAPI DM_InitRichEdit(TWindowData *dat) ///////////////////////////////////////////////////////////////////////////////////////// // set the states of defined database action buttons(only if button is a toggle) -void TSAPI DM_SetDBButtonStates(HWND hwndChild, TWindowData *dat) +void CTabBaseDlg::DM_SetDBButtonStates() { - ButtonItem *buttonItem = dat->pContainer->buttonItems; - MCONTACT hContact = dat->hContact, hFinalContact = 0; - HWND hwndContainer = dat->pContainer->hwnd; + ButtonItem *buttonItem = pContainer->buttonItems; + MCONTACT hFinalContact = 0; + HWND hwndContainer = pContainer->hwnd; while (buttonItem) { HWND hWnd = GetDlgItem(hwndContainer, buttonItem->uId); if (buttonItem->pfnCallback) - buttonItem->pfnCallback(buttonItem, hwndChild, dat, hWnd); + buttonItem->pfnCallback(buttonItem, m_hwnd, this, hWnd); if (!(buttonItem->dwFlags & BUTTON_ISTOGGLE && buttonItem->dwFlags & BUTTON_ISDBACTION)) { buttonItem = buttonItem->nextItem; @@ -845,14 +845,14 @@ void TSAPI DM_SetDBButtonStates(HWND hwndChild, TWindowData *dat) char *szModule = buttonItem->szModule; char *szSetting = buttonItem->szSetting; if (buttonItem->dwFlags & BUTTON_DBACTIONONCONTACT || buttonItem->dwFlags & BUTTON_ISCONTACTDBACTION) { - if (hContact == 0) { + if (m_hContact == 0) { SendMessage(hWnd, BM_SETCHECK, BST_UNCHECKED, 0); buttonItem = buttonItem->nextItem; continue; } if (buttonItem->dwFlags & BUTTON_ISCONTACTDBACTION) - szModule = GetContactProto(hContact); - hFinalContact = hContact; + szModule = GetContactProto(m_hContact); + hFinalContact = m_hContact; } else hFinalContact = 0; @@ -877,7 +877,7 @@ void TSAPI DM_SetDBButtonStates(HWND hwndChild, TWindowData *dat) } } -void TSAPI DM_ScrollToBottom(TWindowData *dat, WPARAM wParam, LPARAM lParam) +void TSAPI DM_ScrollToBottom(CTabBaseDlg *dat, WPARAM wParam, LPARAM lParam) { if (dat == NULL) return; @@ -889,15 +889,15 @@ void TSAPI DM_ScrollToBottom(TWindowData *dat, WPARAM wParam, LPARAM lParam) dat->dwFlags |= MWF_DEFERREDSCROLL; if (dat->hwndIEView) { - PostMessage(dat->hwnd, DM_SCROLLIEVIEW, 0, 0); + PostMessage(dat->GetHwnd(), DM_SCROLLIEVIEW, 0, 0); return; } if (dat->hwndHPP) { - SendMessage(dat->hwnd, DM_SCROLLIEVIEW, 0, 0); + SendMessage(dat->GetHwnd(), DM_SCROLLIEVIEW, 0, 0); return; } - HWND hwnd = GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_CHAT_LOG); + HWND hwnd = GetDlgItem(dat->GetHwnd(), dat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_LOG); if (lParam) SendMessage(hwnd, WM_SIZE, 0, 0); @@ -927,7 +927,7 @@ static void LoadKLThread(LPVOID _param) } } -void TSAPI DM_LoadLocale(TWindowData *dat) +void TSAPI DM_LoadLocale(CTabBaseDlg *dat) { if (dat == NULL || !PluginConfig.m_bAutoLocaleSupport) return; @@ -936,7 +936,7 @@ void TSAPI DM_LoadLocale(TWindowData *dat) return; DBVARIANT dbv; - if (!db_get_ws(dat->hContact, SRMSGMOD_T, "locale", &dbv)) + if (!db_get_ws(dat->m_hContact, SRMSGMOD_T, "locale", &dbv)) db_free(&dbv); else { wchar_t szKLName[KL_NAMELENGTH + 1]; @@ -944,38 +944,35 @@ void TSAPI DM_LoadLocale(TWindowData *dat) wchar_t szBuf[20]; GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_ILANGUAGE, szBuf, 20); mir_snwprintf(szKLName, L"0000%s", szBuf); - db_set_ws(dat->hContact, SRMSGMOD_T, "locale", szKLName); + db_set_ws(dat->m_hContact, SRMSGMOD_T, "locale", szKLName); } else { GetKeyboardLayoutName(szKLName); - db_set_ws(dat->hContact, SRMSGMOD_T, "locale", szKLName); + db_set_ws(dat->m_hContact, SRMSGMOD_T, "locale", szKLName); } } - mir_forkthread(LoadKLThread, (void*)dat->hContact); + mir_forkthread(LoadKLThread, (void*)dat->m_hContact); } -LRESULT TSAPI DM_RecalcPictureSize(TWindowData *dat) +void CTabBaseDlg::DM_RecalcPictureSize() { - if (dat) { - HBITMAP hbm = ((dat->Panel->isActive()) && dat->pContainer->avatarMode != 3) ? dat->hOwnPic : (dat->ace ? dat->ace->hbmPic : PluginConfig.g_hbmUnknown); - if (hbm) { - BITMAP bminfo; - GetObject(hbm, sizeof(bminfo), &bminfo); - CalcDynamicAvatarSize(dat, &bminfo); - SendMessage(dat->hwnd, WM_SIZE, 0, 0); - } - else dat->pic.cy = dat->pic.cx = 60; + HBITMAP hbm = ((Panel->isActive()) && pContainer->avatarMode != 3) ? hOwnPic : (ace ? ace->hbmPic : PluginConfig.g_hbmUnknown); + if (hbm) { + BITMAP bminfo; + GetObject(hbm, sizeof(bminfo), &bminfo); + CalcDynamicAvatarSize(&bminfo); + SendMessage(m_hwnd, WM_SIZE, 0, 0); } - return 0; + else pic.cy = pic.cx = 60; } -void TSAPI DM_UpdateLastMessage(const TWindowData *dat) +void TSAPI DM_UpdateLastMessage(const CTabBaseDlg *dat) { if (dat == NULL) return; - if (dat->pContainer->hwndStatus == 0 || dat->pContainer->hwndActive != dat->hwnd) + if (dat->pContainer->hwndStatus == 0 || dat->pContainer->hwndActive != dat->GetHwnd()) return; wchar_t szBuf[100]; @@ -1010,20 +1007,20 @@ void TSAPI DM_UpdateLastMessage(const TWindowData *dat) ///////////////////////////////////////////////////////////////////////////////////////// // save current keyboard layout for the given contact -void TSAPI DM_SaveLocale(TWindowData *dat, WPARAM, LPARAM lParam) +void TSAPI DM_SaveLocale(CTabBaseDlg *dat, WPARAM, LPARAM lParam) { if (dat == NULL) return; - if (PluginConfig.m_bAutoLocaleSupport && dat->hContact && dat->pContainer->hwndActive == dat->hwnd) { + if (PluginConfig.m_bAutoLocaleSupport && dat->m_hContact && dat->pContainer->hwndActive == dat->GetHwnd()) { wchar_t szKLName[KL_NAMELENGTH + 1]; if ((HKL)lParam != dat->hkl) { dat->hkl = (HKL)lParam; ActivateKeyboardLayout(dat->hkl, 0); GetKeyboardLayoutName(szKLName); - db_set_ws(dat->hContact, SRMSGMOD_T, "locale", szKLName); - GetLocaleID(dat, szKLName); - UpdateReadChars(dat); + db_set_ws(dat->m_hContact, SRMSGMOD_T, "locale", szKLName); + dat->GetLocaleID(szKLName); + dat->UpdateReadChars(); } } } @@ -1052,18 +1049,17 @@ LRESULT TSAPI DM_WMCopyHandler(HWND hwnd, WNDPROC oldWndProc, UINT msg, WPARAM w ///////////////////////////////////////////////////////////////////////////////////////// // create embedded contact list control -HWND TSAPI DM_CreateClist(TWindowData *dat) +HWND CTabBaseDlg::DM_CreateClist() { if (!sendLater->isAvail()) { 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.")); - dat->sendMode &= ~SMODE_MULTIPLE; + sendMode &= ~SMODE_MULTIPLE; return 0; } - HWND hwndClist = CreateWindowExA(0, "CListControl", "", WS_TABSTOP | WS_VISIBLE | WS_CHILD | 0x248, - 184, 0, 30, 30, dat->hwnd, (HMENU)IDC_CLIST, g_hInst, NULL); + HWND hwndClist = CreateWindowExA(0, "CListControl", "", WS_TABSTOP | WS_VISIBLE | WS_CHILD | 0x248, 184, 0, 30, 30, m_hwnd, (HMENU)IDC_CLIST, g_hInst, NULL); SendMessage(hwndClist, WM_TIMER, 14, 0); - HANDLE hItem = (HANDLE)SendMessage(hwndClist, CLM_FINDCONTACT, dat->hContact, 0); + HANDLE hItem = (HANDLE)SendMessage(hwndClist, CLM_FINDCONTACT, m_hContact, 0); SetWindowLongPtr(hwndClist, GWL_EXSTYLE, GetWindowLongPtr(hwndClist, GWL_EXSTYLE) & ~CLS_EX_TRACKSELECT); SetWindowLongPtr(hwndClist, GWL_EXSTYLE, GetWindowLongPtr(hwndClist, GWL_EXSTYLE) | (CLS_EX_NOSMOOTHSCROLLING | CLS_EX_NOTRANSLUCENTSEL)); @@ -1083,10 +1079,10 @@ HWND TSAPI DM_CreateClist(TWindowData *dat) return hwndClist; } -LRESULT TSAPI DM_MouseWheelHandler(HWND hwnd, HWND hwndParent, TWindowData *mwdat, WPARAM wParam, LPARAM lParam) +LRESULT TSAPI DM_MouseWheelHandler(HWND hwnd, HWND hwndParent, CTabBaseDlg *mwdat, WPARAM wParam, LPARAM lParam) { - UINT uID = mwdat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_CHAT_LOG; - UINT uIDMsg = mwdat->bType == SESSIONTYPE_IM ? IDC_MESSAGE : IDC_CHAT_MESSAGE; + UINT uID = mwdat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_LOG; + UINT uIDMsg = mwdat->bType == SESSIONTYPE_IM ? IDC_MESSAGE : IDC_MESSAGE; POINT pt; GetCursorPos(&pt); @@ -1108,9 +1104,9 @@ LRESULT TSAPI DM_MouseWheelHandler(HWND hwnd, HWND hwndParent, TWindowData *mwda } if (mwdat->bType == SESSIONTYPE_CHAT) { // scroll nick list by just hovering it RECT rcNicklist; - GetWindowRect(GetDlgItem(mwdat->hwnd, IDC_LIST), &rcNicklist); + GetWindowRect(GetDlgItem(mwdat->GetHwnd(), IDC_LIST), &rcNicklist); if (PtInRect(&rcNicklist, pt)) { - SendDlgItemMessage(mwdat->hwnd, IDC_LIST, WM_MOUSEWHEEL, wParam, lParam); + SendDlgItemMessage(mwdat->GetHwnd(), IDC_LIST, WM_MOUSEWHEEL, wParam, lParam); return 0; } } @@ -1145,70 +1141,63 @@ LRESULT TSAPI DM_MouseWheelHandler(HWND hwnd, HWND hwndParent, TWindowData *mwda return 1; } -void TSAPI DM_FreeTheme(TWindowData *dat) +void CTabBaseDlg::DM_FreeTheme() { - if (dat == NULL) - return; - - if (dat->hTheme) { - CloseThemeData(dat->hTheme); - dat->hTheme = 0; + if (hTheme) { + CloseThemeData(hTheme); + hTheme = 0; } - if (dat->hThemeIP) { - CloseThemeData(dat->hThemeIP); - dat->hThemeIP = 0; + if (hThemeIP) { + CloseThemeData(hThemeIP); + hThemeIP = 0; } - if (dat->hThemeToolbar) { - CloseThemeData(dat->hThemeToolbar); - dat->hThemeToolbar = 0; + if (hThemeToolbar) { + CloseThemeData(hThemeToolbar); + hThemeToolbar = 0; } } -LRESULT TSAPI DM_ThemeChanged(TWindowData *dat) +void CTabBaseDlg::DM_ThemeChanged() { CSkinItem *item_log = &SkinItems[ID_EXTBKHISTORY]; CSkinItem *item_msg = &SkinItems[ID_EXTBKINPUTAREA]; - HWND hwnd = dat->hwnd; - - dat->hTheme = OpenThemeData(hwnd, L"EDIT"); + hTheme = OpenThemeData(m_hwnd, L"EDIT"); - if (dat->bType == SESSIONTYPE_IM) { - if (dat->hTheme != 0 || (CSkin::m_skinEnabled && !item_log->IGNORED)) - SetWindowLongPtr(GetDlgItem(hwnd, IDC_LOG), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(hwnd, IDC_LOG), GWL_EXSTYLE) & ~WS_EX_STATICEDGE); - if (dat->hTheme != 0 || (CSkin::m_skinEnabled && !item_msg->IGNORED)) - SetWindowLongPtr(GetDlgItem(hwnd, IDC_MESSAGE), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(hwnd, IDC_MESSAGE), GWL_EXSTYLE) & ~WS_EX_STATICEDGE); + if (bType == SESSIONTYPE_IM) { + if (hTheme != 0 || (CSkin::m_skinEnabled && !item_log->IGNORED)) + SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_LOG), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(m_hwnd, IDC_LOG), GWL_EXSTYLE) & ~WS_EX_STATICEDGE); + if (hTheme != 0 || (CSkin::m_skinEnabled && !item_msg->IGNORED)) + SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_MESSAGE), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(m_hwnd, IDC_MESSAGE), GWL_EXSTYLE) & ~WS_EX_STATICEDGE); } else { - if (dat->hTheme != 0 || (CSkin::m_skinEnabled && !item_log->IGNORED)) { - SetWindowLongPtr(GetDlgItem(hwnd, IDC_CHAT_LOG), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(hwnd, IDC_CHAT_LOG), GWL_EXSTYLE) & ~WS_EX_STATICEDGE); - SetWindowLongPtr(GetDlgItem(hwnd, IDC_LIST), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(hwnd, IDC_LIST), GWL_EXSTYLE) & ~(WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)); + if (hTheme != 0 || (CSkin::m_skinEnabled && !item_log->IGNORED)) { + SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_LOG), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(m_hwnd, IDC_LOG), GWL_EXSTYLE) & ~WS_EX_STATICEDGE); + SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_LIST), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(m_hwnd, IDC_LIST), GWL_EXSTYLE) & ~(WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)); } - if (dat->hTheme != 0 || (CSkin::m_skinEnabled && !item_msg->IGNORED)) - SetWindowLongPtr(GetDlgItem(hwnd, IDC_CHAT_MESSAGE), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(hwnd, IDC_CHAT_MESSAGE), GWL_EXSTYLE) & ~WS_EX_STATICEDGE); + if (hTheme != 0 || (CSkin::m_skinEnabled && !item_msg->IGNORED)) + SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_MESSAGE), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(m_hwnd, IDC_MESSAGE), GWL_EXSTYLE) & ~WS_EX_STATICEDGE); } - dat->hThemeIP = M.isAero() ? OpenThemeData(hwnd, L"ButtonStyle") : 0; - dat->hThemeToolbar = (M.isAero() || (!CSkin::m_skinEnabled && M.isVSThemed())) ? OpenThemeData(hwnd, L"REBAR") : 0; - - return 0; + hThemeIP = M.isAero() ? OpenThemeData(m_hwnd, L"ButtonStyle") : 0; + hThemeToolbar = (M.isAero() || (!CSkin::m_skinEnabled && M.isVSThemed())) ? OpenThemeData(m_hwnd, L"REBAR") : 0; } ///////////////////////////////////////////////////////////////////////////////////////// // send out message typing notifications (MTN) when the // user is typing/editing text in the message input area. -void TSAPI DM_NotifyTyping(TWindowData *dat, int mode) +void CTabBaseDlg::DM_NotifyTyping(int mode) { - if (dat == NULL || !dat->hContact) + if (!m_hContact) return; - DeletePopupsForContact(dat->hContact, PU_REMOVE_ON_TYPE); + DeletePopupsForContact(m_hContact, PU_REMOVE_ON_TYPE); - const char *szProto = dat->cache->getActiveProto(); - MCONTACT hContact = dat->cache->getActiveContact(); + const char *szProto = cache->getActiveProto(); + MCONTACT hContact = cache->getActiveContact(); // editing user notes or preparing a message for queued delivery -> don't send MTN - if (dat->fEditNotesActive || dat->sendMode & SMODE_SENDLATER) + if (fEditNotesActive || (sendMode & SMODE_SENDLATER)) return; // allow supression of sending out TN for the contact (NOTE: for metacontacts, do NOT use the subcontact handle) @@ -1238,72 +1227,66 @@ void TSAPI DM_NotifyTyping(TWindowData *dat, int mode) // don't send to contacts which are not permanently added to the contact list, // unless the option to ignore added status is set. - if (db_get_b(dat->hContact, "CList", "NotOnList", 0) && !M.GetByte(SRMSGMOD, SRMSGSET_TYPINGUNKNOWN, SRMSGDEFSET_TYPINGUNKNOWN)) + if (db_get_b(m_hContact, "CList", "NotOnList", 0) && !M.GetByte(SRMSGMOD, SRMSGSET_TYPINGUNKNOWN, SRMSGDEFSET_TYPINGUNKNOWN)) return; // End user check - dat->nTypeMode = mode; - CallService(MS_PROTO_SELFISTYPING, hContact, dat->nTypeMode); + nTypeMode = mode; + CallService(MS_PROTO_SELFISTYPING, hContact, nTypeMode); } -void TSAPI DM_OptionsApplied(TWindowData *dat, WPARAM, LPARAM lParam) +void CSrmmWindow::DM_OptionsApplied(WPARAM, LPARAM lParam) { - if (dat == NULL) - return; - - HWND hwndDlg = dat->hwnd; - TContainerData *pContainer = dat->pContainer; - - dat->szMicroLf[0] = 0; - if (!(dat->pContainer->theme.isPrivate)) { - LoadThemeDefaults(dat->pContainer); - dat->dwFlags = dat->pContainer->theme.dwFlags; + szMicroLf[0] = 0; + if (!(pContainer->theme.isPrivate)) { + LoadThemeDefaults(pContainer); + dwFlags = pContainer->theme.dwFlags; } - LoadLocalFlags(dat); - LoadTimeZone(dat); + LoadLocalFlags(); + hTimeZone = TimeZone_CreateByContact(m_hContact, 0, TZF_KNOWNONLY); - dat->bShowUIElements = (pContainer->dwFlags & CNT_HIDETOOLBAR) == 0; + bShowUIElements = (pContainer->dwFlags & CNT_HIDETOOLBAR) == 0; - dat->dwFlagsEx = M.GetByte(dat->hContact, "splitoverride", 0) ? MWF_SHOW_SPLITTEROVERRIDE : 0; - dat->Panel->getVisibility(); + dwFlagsEx = M.GetByte(m_hContact, "splitoverride", 0) ? MWF_SHOW_SPLITTEROVERRIDE : 0; + Panel->getVisibility(); // small inner margins (padding) for the text areas - SendDlgItemMessage(hwndDlg, IDC_LOG, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(0, 0)); - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(3, 3)); + m_log.SendMsg(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(0, 0)); + m_message.SendMsg(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(3, 3)); - GetSendFormat(dat); - SetDialogToType(hwndDlg); - SendMessage(hwndDlg, DM_CONFIGURETOOLBAR, 0, 0); + GetSendFormat(); + SetDialogToType(m_hwnd); + SendMessage(m_hwnd, DM_CONFIGURETOOLBAR, 0, 0); - DM_InitRichEdit(dat); - if (hwndDlg == pContainer->hwndActive) + DM_InitRichEdit(this); + if (m_hwnd == pContainer->hwndActive) SendMessage(pContainer->hwnd, WM_SIZE, 0, 0); - InvalidateRect(GetDlgItem(hwndDlg, IDC_MESSAGE), NULL, FALSE); + InvalidateRect(GetDlgItem(m_hwnd, IDC_MESSAGE), NULL, FALSE); if (!lParam) { if (IsIconic(pContainer->hwnd)) - dat->dwFlags |= MWF_DEFERREDREMAKELOG; + dwFlags |= MWF_DEFERREDREMAKELOG; else - SendMessage(hwndDlg, DM_REMAKELOG, 0, 0); + SendMessage(m_hwnd, DM_REMAKELOG, 0, 0); } - ShowWindow(dat->hwndPanelPicParent, SW_SHOW); - EnableWindow(dat->hwndPanelPicParent, TRUE); + ShowWindow(hwndPanelPicParent, SW_SHOW); + EnableWindow(hwndPanelPicParent, TRUE); - SendMessage(hwndDlg, DM_UPDATEWINICON, 0, 0); + SendMessage(m_hwnd, DM_UPDATEWINICON, 0, 0); } - -void TSAPI DM_Typing(TWindowData *dat, bool fForceOff) + +void TSAPI DM_Typing(CTabBaseDlg *dat, bool fForceOff) { if (dat == NULL) return; - HWND hwndDlg = dat->hwnd; + HWND hwndDlg = dat->GetHwnd(); HWND hwndContainer = dat->pContainer->hwnd; HWND hwndStatus = dat->pContainer->hwndStatus; if (dat->nTypeMode == PROTOTYPE_SELFTYPING_ON && GetTickCount() - dat->nLastTyping > TIMEOUT_TYPEOFF) - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_OFF); + dat->DM_NotifyTyping(PROTOTYPE_SELFTYPING_OFF); if (dat->bShowTyping == 1) { if (dat->nTypeSecs > 0) { @@ -1322,7 +1305,7 @@ void TSAPI DM_Typing(TWindowData *dat, bool fForceOff) } SendMessage(hwndDlg, DM_UPDATEWINICON, 0, 0); HandleIconFeedback(dat, (HICON)-1); - TWindowData *dat_active = (TWindowData*)GetWindowLongPtr(dat->pContainer->hwndActive, GWLP_USERDATA); + CTabBaseDlg *dat_active = (CTabBaseDlg*)GetWindowLongPtr(dat->pContainer->hwndActive, GWLP_USERDATA); if (dat_active && dat_active->bType == SESSIONTYPE_IM) SendMessage(hwndContainer, DM_UPDATETITLE, 0, 0); else @@ -1338,7 +1321,7 @@ void TSAPI DM_Typing(TWindowData *dat, bool fForceOff) dat->szStatusBar[0] = 0; dat->bShowTyping = 0; } - UpdateStatusBar(dat); + dat->UpdateStatusBar(); } else if (dat->nTypeSecs > 0) { mir_snwprintf(dat->szStatusBar, TranslateT("%s is typing a message"), dat->cache->getNick()); @@ -1356,7 +1339,7 @@ void TSAPI DM_Typing(TWindowData *dat, bool fForceOff) } if (dat->pContainer->hwndActive != hwndDlg) { - if (dat->mayFlashTab) + if (dat->m_bCanFlashTab) dat->iFlashIcon = PluginConfig.g_IconTypingEvent; HandleIconFeedback(dat, PluginConfig.g_IconTypingEvent); } @@ -1378,9 +1361,9 @@ void TSAPI DM_Typing(TWindowData *dat, bool fForceOff) // This cares about private / per container / MUC <> IM splitter syncing and everything. // called from IM and MUC windows via DM_SPLITTERGLOBALEVENT -int TSAPI DM_SplitterGlobalEvent(TWindowData *dat, WPARAM wParam, LPARAM lParam) +int TSAPI DM_SplitterGlobalEvent(CTabBaseDlg *dat, WPARAM wParam, LPARAM lParam) { - TWindowData *srcDat = PluginConfig.lastSPlitterPos.pSrcDat; + CTabBaseDlg *srcDat = PluginConfig.lastSPlitterPos.pSrcDat; TContainerData *srcCnt = PluginConfig.lastSPlitterPos.pSrcContainer; bool fCntGlobal = (!dat->pContainer->settings->fPrivate ? true : false); @@ -1388,7 +1371,7 @@ int TSAPI DM_SplitterGlobalEvent(TWindowData *dat, WPARAM wParam, LPARAM lParam) return 0; RECT rcWin; - GetWindowRect(dat->hwnd, &rcWin); + GetWindowRect(dat->GetHwnd(), &rcWin); LONG newPos; if (wParam == 0 && lParam == 0) { @@ -1408,7 +1391,7 @@ int TSAPI DM_SplitterGlobalEvent(TWindowData *dat, WPARAM wParam, LPARAM lParam) if (dat->bType == SESSIONTYPE_IM) { dat->pContainer->settings->splitterPos = dat->splitterY; if (fCntGlobal) { - SaveSplitter(dat); + dat->SaveSplitter(); if (PluginConfig.lastSPlitterPos.bSync) g_Settings.iSplitterY = dat->splitterY - DPISCALEY_S(23); } @@ -1437,7 +1420,7 @@ int TSAPI DM_SplitterGlobalEvent(TWindowData *dat, WPARAM wParam, LPARAM lParam) // for inactive sessions, delay the splitter repositioning until they become // active (faster, avoid redraw/resize problems for minimized windows) - if (IsIconic(dat->pContainer->hwnd) || dat->pContainer->hwndActive != dat->hwnd) { + if (IsIconic(dat->pContainer->hwnd) || dat->pContainer->hwndActive != dat->GetHwnd()) { dat->dwFlagsEx |= MWF_EX_DELAYEDSPLITTER; dat->wParam = newPos; dat->lParam = PluginConfig.lastSPlitterPos.lParam; @@ -1447,19 +1430,19 @@ int TSAPI DM_SplitterGlobalEvent(TWindowData *dat, WPARAM wParam, LPARAM lParam) else newPos = wParam; if (dat->bType == SESSIONTYPE_IM) { - LoadSplitter(dat); - AdjustBottomAvatarDisplay(dat); - DM_RecalcPictureSize(dat); - SendMessage(dat->hwnd, WM_SIZE, 0, 0); + dat->LoadSplitter(); + dat->AdjustBottomAvatarDisplay(); + dat->DM_RecalcPictureSize(); + SendMessage(dat->GetHwnd(), WM_SIZE, 0, 0); DM_ScrollToBottom(dat, 1, 1); if (dat != srcDat) - CSkin::UpdateToolbarBG(dat); + dat->UpdateToolbarBG(); } else { SESSION_INFO *si = dat->si; if (si) { si->iSplitterY = g_Settings.iSplitterY; - SendMessage(dat->hwnd, WM_SIZE, 0, 0); + SendMessage(dat->GetHwnd(), WM_SIZE, 0, 0); } } return 0; @@ -1468,10 +1451,10 @@ int TSAPI DM_SplitterGlobalEvent(TWindowData *dat, WPARAM wParam, LPARAM lParam) ///////////////////////////////////////////////////////////////////////////////////////// // incoming event handler -void TSAPI DM_EventAdded(TWindowData *dat, WPARAM hContact, LPARAM lParam) +void TSAPI DM_EventAdded(CTabBaseDlg *dat, WPARAM hContact, LPARAM lParam) { TContainerData *pContainer = dat->pContainer; - HWND hwndDlg = dat->hwnd, hwndContainer = pContainer->hwnd, hwndTab = GetParent(dat->hwnd); + HWND hwndDlg = dat->GetHwnd(), hwndContainer = pContainer->hwnd, hwndTab = GetParent(dat->GetHwnd()); MEVENT hDbEvent = (MEVENT)lParam; DBEVENTINFO dbei = {}; @@ -1502,7 +1485,7 @@ void TSAPI DM_EventAdded(TWindowData *dat, WPARAM hContact, LPARAM lParam) // been minimized or in the background. if (!(dbei.flags & DBEF_SENT) && !bIsStatusChangeEvent) { if (PluginConfig.m_bDividersUsePopupConfig && PluginConfig.m_bUseDividers) { - if (!MessageWindowOpened(dat->hContact, 0)) + if (!MessageWindowOpened(dat->m_hContact, 0)) SendMessage(hwndDlg, DM_ADDDIVIDER, 0, 0); } else if (PluginConfig.m_bUseDividers) { @@ -1552,12 +1535,12 @@ void TSAPI DM_EventAdded(TWindowData *dat, WPARAM hContact, LPARAM lParam) break; } SetTimer(hwndDlg, TIMERID_FLASHWND, TIMEOUT_FLASHWND, NULL); - dat->mayFlashTab = TRUE; + dat->m_bCanFlashTab = true; } // try to flash the contact list... if (!bDisableNotify) - FlashOnClist(hwndDlg, dat, hDbEvent, &dbei); + dat->FlashOnClist(hDbEvent, &dbei); // autoswitch tab if option is set AND container is minimized (otherwise, we never autoswitch) // never switch for status changes... @@ -1569,7 +1552,7 @@ void TSAPI DM_EventAdded(TWindowData *dat, WPARAM hContact, LPARAM lParam) TabCtrl_SetCurSel(GetParent(hwndDlg), iItem); ShowWindow(pContainer->hwndActive, SW_HIDE); pContainer->hwndActive = hwndDlg; - SendMessage(hwndContainer, DM_UPDATETITLE, dat->hContact, 0); + SendMessage(hwndContainer, DM_UPDATETITLE, dat->m_hContact, 0); pContainer->dwFlags |= CNT_DEFERREDTABSELECT; } } @@ -1593,7 +1576,7 @@ void TSAPI DM_EventAdded(TWindowData *dat, WPARAM hContact, LPARAM lParam) dat->pWnd->Invalidate(); } -void TSAPI DM_HandleAutoSizeRequest(TWindowData *dat, REQRESIZE* rr) +void TSAPI DM_HandleAutoSizeRequest(CTabBaseDlg *dat, REQRESIZE* rr) { if (dat == NULL || rr == NULL || GetForegroundWindow() != dat->pContainer->hwnd) return; @@ -1614,7 +1597,7 @@ void TSAPI DM_HandleAutoSizeRequest(TWindowData *dat, REQRESIZE* rr) return; RECT rc; - GetClientRect(dat->hwnd, &rc); + GetClientRect(dat->GetHwnd(), &rc); LONG cy = rc.bottom - rc.top; LONG panelHeight = (dat->Panel->isActive() ? dat->Panel->getHeight() : 0); @@ -1626,49 +1609,46 @@ void TSAPI DM_HandleAutoSizeRequest(TWindowData *dat, REQRESIZE* rr) if (dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR) dat->dynaSplitter += DPISCALEY_S(22); dat->splitterY = dat->dynaSplitter + DPISCALEY_S(34); - DM_RecalcPictureSize(dat); + dat->DM_RecalcPictureSize(); } else if (dat->si) { dat->si->iSplitterY = (rc.bottom - (rc.bottom - iNewHeight + DPISCALEY_S(3))) + DPISCALEY_S(34); if (!(dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR)) dat->si->iSplitterY -= DPISCALEY_S(22); - SendMessage(dat->hwnd, WM_SIZE, 0, 0); + SendMessage(dat->GetHwnd(), WM_SIZE, 0, 0); } dat->iInputAreaHeight = iNewHeight; - CSkin::UpdateToolbarBG(dat); + dat->UpdateToolbarBG(); DM_ScrollToBottom(dat, 1, 0); } -void TSAPI DM_UpdateTitle(TWindowData *dat, WPARAM, LPARAM lParam) +void CTabBaseDlg::DM_UpdateTitle(WPARAM, LPARAM lParam) { wchar_t newtitle[128]; - DWORD dwOldIdle = dat->idle; + DWORD dwOldIdle = idle; const char *szActProto = 0; - HWND hwndDlg = dat->hwnd; - HWND hwndTab = GetParent(hwndDlg); - HWND hwndContainer = dat->pContainer->hwnd; - TContainerData *pContainer = dat->pContainer; + HWND hwndContainer = pContainer->hwnd; - dat->szStatus[0] = 0; + szStatus[0] = 0; - if (dat->iTabID == -1) + if (iTabID == -1) return; TCITEM item = { 0 }; - if (dat->hContact) { - const wchar_t *szNick = dat->cache->getNick(); + if (m_hContact) { + const wchar_t *szNick = cache->getNick(); - if (dat->szProto) { - szActProto = dat->cache->getProto(); + if (szProto) { + szActProto = cache->getProto(); - bool bHasName = (dat->cache->getUIN()[0] != 0); - dat->idle = dat->cache->getIdleTS(); - dat->dwFlagsEx = dat->idle ? dat->dwFlagsEx | MWF_SHOW_ISIDLE : dat->dwFlagsEx & ~MWF_SHOW_ISIDLE; + bool bHasName = (cache->getUIN()[0] != 0); + idle = cache->getIdleTS(); + dwFlagsEx = idle ? dwFlagsEx | MWF_SHOW_ISIDLE : dwFlagsEx & ~MWF_SHOW_ISIDLE; - dat->wStatus = dat->cache->getStatus(); - wcsncpy_s(dat->szStatus, pcli->pfnGetStatusModeDescription(dat->szProto == NULL ? ID_STATUS_OFFLINE : dat->wStatus, 0), _TRUNCATE); + wStatus = cache->getStatus(); + wcsncpy_s(szStatus, pcli->pfnGetStatusModeDescription(szProto == NULL ? ID_STATUS_OFFLINE : wStatus, 0), _TRUNCATE); if (lParam != 0) { wchar_t newcontactname[128]; newcontactname[0] = 0; @@ -1681,7 +1661,7 @@ void TSAPI DM_UpdateTitle(TWindowData *dat, WPARAM, LPARAM lParam) if (newcontactname[0] != 0) { if (PluginConfig.m_bStatusOnTabs) - mir_snwprintf(newtitle, L"%s (%s)", newcontactname, dat->szStatus); + mir_snwprintf(newtitle, L"%s (%s)", newcontactname, szStatus); else wcsncpy_s(newtitle, newcontactname, _TRUNCATE); } @@ -1689,59 +1669,59 @@ void TSAPI DM_UpdateTitle(TWindowData *dat, WPARAM, LPARAM lParam) item.mask |= TCIF_TEXT; } - SendMessage(hwndDlg, DM_UPDATEWINICON, 0, 0); + SendMessage(m_hwnd, DM_UPDATEWINICON, 0, 0); wchar_t fulluin[256]; - if (dat->bIsMeta) + if (bIsMeta) mir_snwprintf(fulluin, TranslateT("UID: %s (SHIFT click -> copy to clipboard)\nClick for user's details\nRight click for metacontact control\nClick dropdown to add or remove user from your favorites."), - bHasName ? dat->cache->getUIN() : TranslateT("No UID")); + bHasName ? cache->getUIN() : TranslateT("No UID")); else mir_snwprintf(fulluin, TranslateT("UID: %s (SHIFT click -> copy to clipboard)\nClick for user's details\nClick dropdown to change this contact's favorite status."), - bHasName ? dat->cache->getUIN() : TranslateT("No UID")); + bHasName ? cache->getUIN() : TranslateT("No UID")); - SendDlgItemMessage(hwndDlg, IDC_NAME, BUTTONADDTOOLTIP, (WPARAM)fulluin, BATF_UNICODE); + SendDlgItemMessage(m_hwnd, IDC_NAME, BUTTONADDTOOLTIP, (WPARAM)fulluin, BATF_UNICODE); } } else wcsncpy_s(newtitle, L"Message Session", _TRUNCATE); - if (dat->idle != dwOldIdle || lParam != 0) { + if (idle != dwOldIdle || lParam != 0) { if (item.mask & TCIF_TEXT) { item.pszText = newtitle; - wcsncpy(dat->newtitle, newtitle, _countof(dat->newtitle)); - dat->newtitle[127] = 0; - if (dat->pWnd) - dat->pWnd->updateTitle(dat->cache->getNick()); + wcsncpy(newtitle, newtitle, _countof(newtitle)); + newtitle[127] = 0; + if (pWnd) + pWnd->updateTitle(cache->getNick()); } - if (dat->iTabID >= 0) { - TabCtrl_SetItem(hwndTab, dat->iTabID, &item); + if (iTabID >= 0) { + TabCtrl_SetItem(m_hwndParent, iTabID, &item); if (pContainer->dwFlags & CNT_SIDEBAR) - pContainer->SideBar->updateSession(dat); + pContainer->SideBar->updateSession(this); } - if (pContainer->hwndActive == hwndDlg && lParam) - SendMessage(hwndContainer, DM_UPDATETITLE, dat->hContact, 0); + if (pContainer->hwndActive == m_hwnd && lParam) + SendMessage(hwndContainer, DM_UPDATETITLE, m_hContact, 0); - UpdateTrayMenuState(dat, TRUE); - if (dat->cache->isFavorite()) - AddContactToFavorites(dat->hContact, dat->cache->getNick(), szActProto, dat->szStatus, dat->wStatus, - Skin_LoadProtoIcon(dat->cache->getProto(), dat->cache->getStatus()), 0, PluginConfig.g_hMenuFavorites); + UpdateTrayMenuState(this, TRUE); + if (cache->isFavorite()) + AddContactToFavorites(m_hContact, cache->getNick(), szActProto, szStatus, wStatus, + Skin_LoadProtoIcon(cache->getProto(), cache->getStatus()), 0, PluginConfig.g_hMenuFavorites); - if (dat->cache->isRecent()) - AddContactToFavorites(dat->hContact, dat->cache->getNick(), szActProto, dat->szStatus, dat->wStatus, - Skin_LoadProtoIcon(dat->cache->getProto(), dat->cache->getStatus()), 0, PluginConfig.g_hMenuRecent); + if (cache->isRecent()) + AddContactToFavorites(m_hContact, cache->getNick(), szActProto, szStatus, wStatus, + Skin_LoadProtoIcon(cache->getProto(), cache->getStatus()), 0, PluginConfig.g_hMenuRecent); - dat->Panel->Invalidate(); - if (dat->pWnd) - dat->pWnd->Invalidate(); + Panel->Invalidate(); + if (pWnd) + pWnd->Invalidate(); } // care about MetaContacts and update the statusbar icon with the currently "most online" contact... - if (dat->bIsMeta) { - PostMessage(hwndDlg, DM_UPDATEMETACONTACTINFO, 0, 0); - PostMessage(hwndDlg, DM_OWNNICKCHANGED, 0, 0); + if (bIsMeta) { + PostMessage(m_hwnd, DM_UPDATEMETACONTACTINFO, 0, 0); + PostMessage(m_hwnd, DM_OWNNICKCHANGED, 0, 0); if (pContainer->dwFlags & CNT_UINSTATUSBAR) - DM_UpdateLastMessage(dat); + DM_UpdateLastMessage(this); } } @@ -1763,7 +1743,7 @@ static int OnSrmmIconChanged(WPARAM hContact, LPARAM) return 0; } -void DrawStatusIcons(TWindowData *dat, HDC hDC, const RECT &rc, int gap) +void DrawStatusIcons(CTabBaseDlg *dat, HDC hDC, const RECT &rc, int gap) { int x = rc.left; int y = (rc.top + rc.bottom - PluginConfig.m_smcxicon) >> 1; @@ -1771,7 +1751,7 @@ void DrawStatusIcons(TWindowData *dat, HDC hDC, const RECT &rc, int gap) SetBkMode(hDC, TRANSPARENT); int nIcon = 0; - while (StatusIconData *si = Srmm_GetNthIcon(dat->hContact, nIcon++)) { + while (StatusIconData *si = Srmm_GetNthIcon(dat->m_hContact, nIcon++)) { if (!mir_strcmp(si->szModule, MSG_ICON_MODULE)) { if (si->dwId == MSG_ICON_SOUND) { DrawIconEx(hDC, x, y, PluginConfig.g_buttonBarIcons[ICON_DEFAULT_SOUNDS], @@ -1785,7 +1765,7 @@ void DrawStatusIcons(TWindowData *dat, HDC hDC, const RECT &rc, int gap) if (dat->bType == SESSIONTYPE_IM || dat->si->iType == GCW_PRIVMESS) { DrawIconEx(hDC, x, y, PluginConfig.g_buttonBarIcons[ICON_DEFAULT_TYPING], PluginConfig.m_smcxicon, PluginConfig.m_smcyicon, 0, NULL, DI_NORMAL); - DrawIconEx(hDC, x, y, db_get_b(dat->hContact, SRMSGMOD, SRMSGSET_TYPING, M.GetByte(SRMSGMOD, SRMSGSET_TYPINGNEW, SRMSGDEFSET_TYPINGNEW)) ? + DrawIconEx(hDC, x, y, db_get_b(dat->m_hContact, SRMSGMOD, SRMSGSET_TYPING, M.GetByte(SRMSGMOD, SRMSGSET_TYPINGNEW, SRMSGDEFSET_TYPINGNEW)) ? PluginConfig.g_iconOverlayEnabled : PluginConfig.g_iconOverlayDisabled, PluginConfig.m_smcxicon, PluginConfig.m_smcyicon, 0, NULL, DI_NORMAL); } else CSkin::DrawDimmedIcon(hDC, x, y, PluginConfig.m_smcxicon, PluginConfig.m_smcyicon, PluginConfig.g_buttonBarIcons[ICON_DEFAULT_TYPING], 50); @@ -1811,7 +1791,7 @@ void DrawStatusIcons(TWindowData *dat, HDC hDC, const RECT &rc, int gap) } } -void CheckStatusIconClick(TWindowData *dat, POINT pt, const RECT &rc, int gap, int code) +void CheckStatusIconClick(CTabBaseDlg *dat, POINT pt, const RECT &rc, int gap, int code) { if (dat && (code == NM_CLICK || code == NM_RCLICK)) { POINT ptScreen; @@ -1824,7 +1804,7 @@ void CheckStatusIconClick(TWindowData *dat, POINT pt, const RECT &rc, int gap, i if (dat == NULL) return; - StatusIconData *si = Srmm_GetNthIcon(dat->hContact, iconNum); + StatusIconData *si = Srmm_GetNthIcon(dat->m_hContact, iconNum); if (si == NULL) return; @@ -1858,7 +1838,7 @@ void CheckStatusIconClick(TWindowData *dat, POINT pt, const RECT &rc, int gap, i sicd.dwId = si->dwId; sicd.szModule = si->szModule; sicd.flags = (code == NM_RCLICK ? MBCF_RIGHTBUTTON : 0); - NotifyEventHooks(hHookIconPressedEvt, dat->hContact, (LPARAM)&sicd); + NotifyEventHooks(hHookIconPressedEvt, dat->m_hContact, (LPARAM)&sicd); InvalidateRect(dat->pContainer->hwndStatus, NULL, TRUE); } } diff --git a/plugins/TabSRMM/src/generic_msghandlers.h b/plugins/TabSRMM/src/generic_msghandlers.h index 63a024e2d4..c499a3722b 100644 --- a/plugins/TabSRMM/src/generic_msghandlers.h +++ b/plugins/TabSRMM/src/generic_msghandlers.h @@ -26,32 +26,21 @@ // // prototypes from generic_msghandlers.c -void TSAPI DM_SetDBButtonStates(HWND hwndChild, TWindowData *dat); -HWND TSAPI DM_CreateClist(TWindowData *dat); - -void TSAPI DM_OptionsApplied(TWindowData *dat, WPARAM wParam, LPARAM lParam); -void TSAPI DM_UpdateTitle(TWindowData *dat, WPARAM wParam, LPARAM lParam); -void TSAPI DM_ScrollToBottom(TWindowData *dat, WPARAM wParam, LPARAM lParam); -void TSAPI DM_LoadLocale(TWindowData *dat); -void TSAPI DM_SaveLocale(TWindowData *dat, WPARAM wParam, LPARAM lParam); -void TSAPI DM_UpdateLastMessage(const TWindowData *dat); +void TSAPI DM_ScrollToBottom(CTabBaseDlg *dat, WPARAM wParam, LPARAM lParam); +void TSAPI DM_LoadLocale(CTabBaseDlg *dat); +void TSAPI DM_SaveLocale(CTabBaseDlg *dat, WPARAM wParam, LPARAM lParam); +void TSAPI DM_UpdateLastMessage(const CTabBaseDlg *dat); LRESULT TSAPI DM_WMCopyHandler(HWND hwnd, WNDPROC oldWndProc, UINT uMsg, WPARAM wParam, LPARAM lParam); -LRESULT TSAPI DM_MouseWheelHandler(HWND hwnd, HWND hwndParent, TWindowData *mwdat, WPARAM wParam, LPARAM lParam); -LRESULT TSAPI DM_ThemeChanged(TWindowData *dat); -void TSAPI DM_Typing(TWindowData *dat, bool fForceOff = false); -void TSAPI DM_FreeTheme(TWindowData *dat); -void TSAPI DM_NotifyTyping(TWindowData *dat, int mode); -int TSAPI DM_SplitterGlobalEvent(TWindowData *dat, WPARAM wParam, LPARAM lParam); +LRESULT TSAPI DM_MouseWheelHandler(HWND hwnd, HWND hwndParent, CTabBaseDlg *mwdat, WPARAM wParam, LPARAM lParam); +void TSAPI DM_Typing(CTabBaseDlg *dat, bool fForceOff = false); +int TSAPI DM_SplitterGlobalEvent(CTabBaseDlg *dat, WPARAM wParam, LPARAM lParam); -void TSAPI DM_EventAdded(TWindowData *dat, WPARAM wParam, LPARAM lParam); -void TSAPI DM_InitRichEdit(TWindowData *dat); +void TSAPI DM_EventAdded(CTabBaseDlg *dat, WPARAM wParam, LPARAM lParam); +void TSAPI DM_InitRichEdit(CTabBaseDlg *dat); LRESULT TSAPI DM_ContainerCmdHandler(TContainerData *pContainer, UINT cmd, WPARAM wParam, LPARAM lParam); -LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, TWindowData *dat, UINT cmd, WPARAM wParam, LPARAM lParam); -LRESULT TSAPI DM_GenericHotkeysCheck(MSG *message, TWindowData *dat); -void TSAPI DM_DismissTip(TWindowData *dat, const POINT& pt); -void TSAPI DM_InitTip(TWindowData *dat); -void TSAPI DM_HandleAutoSizeRequest(TWindowData *dat, REQRESIZE* rr); -void TSAPI DM_SaveLogAsRTF(const TWindowData *dat); -void TSAPI DM_CheckAutoHide(const TWindowData *dat, WPARAM wParam, LPARAM lParam); - -LRESULT __stdcall DM_RecalcPictureSize(TWindowData *dat); +LRESULT TSAPI DM_MsgWindowCmdHandler(HWND hwndDlg, TContainerData *pContainer, CTabBaseDlg *dat, UINT cmd, WPARAM wParam, LPARAM lParam); +LRESULT TSAPI DM_GenericHotkeysCheck(MSG *message, CTabBaseDlg *dat); +void TSAPI DM_DismissTip(CTabBaseDlg *dat, const POINT& pt); +void TSAPI DM_HandleAutoSizeRequest(CTabBaseDlg *dat, REQRESIZE* rr); +void TSAPI DM_SaveLogAsRTF(const CTabBaseDlg *dat); +void TSAPI DM_CheckAutoHide(const CTabBaseDlg *dat, WPARAM wParam, LPARAM lParam); diff --git a/plugins/TabSRMM/src/globals.cpp b/plugins/TabSRMM/src/globals.cpp index 5706e0d843..7d07841c50 100644 --- a/plugins/TabSRMM/src/globals.cpp +++ b/plugins/TabSRMM/src/globals.cpp @@ -413,7 +413,7 @@ int CGlobals::DBSettingChanged(WPARAM hContact, LPARAM lParam) PostMessage(hwnd, DM_UPDATESTATUSMSG, 0, 0); if (fChanged) { if (c->getStatus() == ID_STATUS_OFFLINE) { // clear typing notification in the status bar when contact goes offline - TWindowData *dat = c->getDat(); + CTabBaseDlg *dat = c->getDat(); if (dat) { dat->nTypeSecs = 0; dat->bShowTyping = 0; @@ -557,7 +557,7 @@ void CGlobals::logStatusChange(WPARAM wParam, const CContactCache *c) if (c == 0) return; - TWindowData *dat = c->getDat(); + CSrmmWindow *dat = c->getDat(); if (dat == NULL || !c->isValid()) return; @@ -595,7 +595,7 @@ void CGlobals::logStatusChange(WPARAM wParam, const CContactCache *c) dbei.eventType = EVENTTYPE_STATUSCHANGE; dbei.timestamp = time(NULL); dbei.szModule = (char*)c->getProto(); - StreamInEvents(dat->hwnd, NULL, 1, 1, &dbei); + dat->StreamInEvents(NULL, 1, 1, &dbei); } ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/plugins/TabSRMM/src/globals.h b/plugins/TabSRMM/src/globals.h index 9e03963b29..1e2d89dd5e 100644 --- a/plugins/TabSRMM/src/globals.h +++ b/plugins/TabSRMM/src/globals.h @@ -32,7 +32,7 @@ struct TSplitterBroadCast { TContainerData *pSrcContainer; - TWindowData *pSrcDat; + CSrmmWindow *pSrcDat; LONG pos, pos_chat; LONG off_chat, off_im; LPARAM lParam; diff --git a/plugins/TabSRMM/src/hotkeyhandler.cpp b/plugins/TabSRMM/src/hotkeyhandler.cpp index fe31a8c2c6..e62ac00c15 100644 --- a/plugins/TabSRMM/src/hotkeyhandler.cpp +++ b/plugins/TabSRMM/src/hotkeyhandler.cpp @@ -117,7 +117,7 @@ void TSAPI HandleMenuEntryFromhContact(MCONTACT hContact) ActivateExistingTab(pContainer, si->hWnd); if (GetForegroundWindow() != pContainer->hwnd) SetForegroundWindow(pContainer->hwnd); - SetFocus(GetDlgItem(pContainer->hwndActive, IDC_CHAT_MESSAGE)); + SetFocus(GetDlgItem(pContainer->hwndActive, IDC_MESSAGE)); return; } } @@ -202,9 +202,9 @@ LONG_PTR CALLBACK HotkeyHandlerDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LP hWnd = si ? si->hWnd : 0; } - TWindowData *dat = 0; + CSrmmWindow *dat = 0; if (hWnd) - dat = (TWindowData*)GetWindowLongPtr(hWnd, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(hWnd, GWLP_USERDATA); { HICON hIcon; @@ -212,7 +212,7 @@ LONG_PTR CALLBACK HotkeyHandlerDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LP if (dis->itemData > 0) hIcon = (dis->itemData & 0x10000000) ? pci->hIcons[ICON_HIGHLIGHT] : PluginConfig.g_IconMsgEvent; else if (dat != NULL) { - hIcon = MY_GetContactIcon(dat, 0); + hIcon = dat->GetMyContactIcon(0); idle = dat->idle; } else hIcon = PluginConfig.g_iconContainer; @@ -394,7 +394,7 @@ LONG_PTR CALLBACK HotkeyHandlerDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LP TContainerData *pContainer = 0; SendMessage(si->hWnd, DM_QUERYCONTAINER, 0, (LPARAM)&pContainer); if (pContainer) { - int iTabs = TabCtrl_GetItemCount(GetDlgItem(pContainer->hwnd, 1159)); + int iTabs = TabCtrl_GetItemCount(GetDlgItem(pContainer->hwnd, IDC_MSGTABS)); if (iTabs == 1) SendMessage(pContainer->hwnd, WM_CLOSE, 0, 1); else @@ -431,18 +431,18 @@ LONG_PTR CALLBACK HotkeyHandlerDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LP HWND hWnd = M.FindWindow(hContact); if (hWnd) { - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hWnd, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hWnd, GWLP_USERDATA); if (dat) { if (hkl) { dat->hkl = hkl; - PostMessage(dat->hwnd, DM_SETLOCALE, 0, 0); + PostMessage(dat->GetHwnd(), DM_SETLOCALE, 0, 0); } DBVARIANT dbv; if (0 == db_get_ws(hContact, SRMSGMOD_T, "locale", &dbv)) { - GetLocaleID(dat, dbv.ptszVal); + dat->GetLocaleID(dbv.ptszVal); db_free(&dbv); - UpdateReadChars(dat); + dat->UpdateReadChars(); } } } diff --git a/plugins/TabSRMM/src/infopanel.cpp b/plugins/TabSRMM/src/infopanel.cpp index d41d55a27d..52c64e0c53 100644 --- a/plugins/TabSRMM/src/infopanel.cpp +++ b/plugins/TabSRMM/src/infopanel.cpp @@ -40,7 +40,7 @@ wchar_t *xStatusDescr[] = TInfoPanelConfig CInfoPanel::m_ipConfig = { 0 }; -int CInfoPanel::setPanelHandler(TWindowData *dat, WPARAM wParam, LPARAM lParam) +int CInfoPanel::setPanelHandler(CTabBaseDlg *dat, WPARAM wParam, LPARAM lParam) { if (wParam == 0 && lParam == 0) { dat->Panel->getVisibility(); @@ -48,7 +48,7 @@ int CInfoPanel::setPanelHandler(TWindowData *dat, WPARAM wParam, LPARAM lParam) dat->Panel->showHide(); } else { - TWindowData *srcDat = (TWindowData*)wParam; + CTabBaseDlg *srcDat = (CTabBaseDlg*)wParam; if (lParam == 0) dat->Panel->loadHeight(); else { @@ -62,7 +62,7 @@ int CInfoPanel::setPanelHandler(TWindowData *dat, WPARAM wParam, LPARAM lParam) dat->Panel->setHeight((LONG)lParam); } } - SendMessage(dat->hwnd, WM_SIZE, 0, 0); + SendMessage(dat->GetHwnd(), WM_SIZE, 0, 0); } return 0; } @@ -79,7 +79,7 @@ void CInfoPanel::loadHeight() { BYTE bSync = M.GetByte("syncAllPanels", 0); // sync muc <> im panels - m_height = M.GetDword(m_dat->hContact, "panelheight", -1); + m_height = M.GetDword(m_dat->m_hContact, "panelheight", -1); if (m_height == -1 || HIWORD(m_height) == 0) { if (m_dat->pContainer->settings->fPrivate) @@ -129,7 +129,7 @@ void CInfoPanel::saveHeight(bool fFlush) } } } - else db_set_dw(m_dat->hContact, SRMSGMOD_T, "panelheight", MAKELONG(m_height, 0xffff)); + else db_set_dw(m_dat->m_hContact, SRMSGMOD_T, "panelheight", MAKELONG(m_height, 0xffff)); } } @@ -161,13 +161,13 @@ void CInfoPanel::setHeight(LONG newHeight, bool fBroadcast) void CInfoPanel::Configure() const { - Utils::showDlgControl(m_dat->hwnd, IDC_PANELSPLITTER, m_active ? SW_SHOW : SW_HIDE); + Utils::showDlgControl(m_dat->GetHwnd(), IDC_PANELSPLITTER, m_active ? SW_SHOW : SW_HIDE); } void CInfoPanel::showHide() const { HBITMAP hbm = (m_active && m_dat->pContainer->avatarMode != 3) ? m_dat->hOwnPic : (m_dat->ace ? m_dat->ace->hbmPic : PluginConfig.g_hbmUnknown); - HWND hwndDlg = m_dat->hwnd; + HWND hwndDlg = m_dat->GetHwnd(); if (!m_isChat) { ::ShowWindow(m_dat->hwndPanelPicParent, (m_active) ? SW_SHOW : SW_HIDE); @@ -178,18 +178,18 @@ void CInfoPanel::showHide() const } m_dat->iRealAvatarHeight = 0; - ::AdjustBottomAvatarDisplay(m_dat); + m_dat->AdjustBottomAvatarDisplay(); BITMAP bm; ::GetObject(hbm, sizeof(bm), &bm); - ::CalcDynamicAvatarSize(m_dat, &bm); + m_dat->CalcDynamicAvatarSize(&bm); if (m_active) { if (m_dat->hwndContactPic) { ::DestroyWindow(m_dat->hwndContactPic); m_dat->hwndContactPic = NULL; } - ::GetAvatarVisibility(hwndDlg, m_dat); + m_dat->GetAvatarVisibility(); Configure(); InvalidateRect(hwndDlg, NULL, FALSE); } @@ -225,13 +225,13 @@ void CInfoPanel::showHide() const bool CInfoPanel::getVisibility() { - if (m_dat->hContact == 0) { + if (m_dat->m_hContact == 0) { setActive(false); // no info panel, if no hcontact return false; } BYTE bDefault = (m_dat->pContainer->dwFlags & CNT_INFOPANEL) ? 1 : 0; - BYTE bContact = M.GetByte(m_dat->hContact, "infopanel", 0); + BYTE bContact = M.GetByte(m_dat->m_hContact, "infopanel", 0); BYTE visible = (bContact == 0 ? bDefault : (bContact == (BYTE)-1 ? 0 : 1)); setActive(visible); @@ -301,7 +301,7 @@ void CInfoPanel::renderBG(const HDC hdc, RECT& rc, CSkinItem *item, bool bAero, if (CSkin::m_skinEnabled) { rc.bottom -= 2; - CSkin::SkinDrawBG(m_dat->hwnd, m_dat->pContainer->hwnd, m_dat->pContainer, &rc, hdc); + CSkin::SkinDrawBG(m_dat->GetHwnd(), m_dat->pContainer->hwnd, m_dat->pContainer, &rc, hdc); item = &SkinItems[ID_EXTBKINFOPANELBG]; // if new (= tabsrmm 3.x) skin item is not defined, use the old info panel @@ -335,10 +335,10 @@ void CInfoPanel::renderContent(const HDC hdc) DRAWITEMSTRUCT dis = { 0 }; dis.rcItem = m_dat->rcPic; dis.hDC = hdc; - dis.hwndItem = m_dat->hwnd; - if (::MsgWindowDrawHandler(0, (LPARAM)&dis, m_dat) == 0) { - ::PostMessage(m_dat->hwnd, WM_SIZE, 0, 1); - ::PostMessage(m_dat->hwnd, DM_FORCEREDRAW, 0, 0); + dis.hwndItem = m_dat->GetHwnd(); + if (m_dat->MsgWindowDrawHandler(0, (LPARAM)&dis) == 0) { + ::PostMessage(m_dat->GetHwnd(), WM_SIZE, 0, 1); + ::PostMessage(m_dat->GetHwnd(), DM_FORCEREDRAW, 0, 0); } RECT rc = m_dat->rcNick; @@ -400,7 +400,7 @@ void CInfoPanel::RenderIPNickname(const HDC hdc, RECT &rcItem) rcItem.left += 2; if (szTextToShow[0]) { - HICON xIcon = ::GetXStatusIcon(m_dat); + HICON xIcon = m_dat->GetXStatusIcon(); if (xIcon) { ::DrawIconEx(hdc, rcItem.left, (rcItem.bottom + rcItem.top - PluginConfig.m_smcyicon) / 2, xIcon, PluginConfig.m_smcxicon, PluginConfig.m_smcyicon, 0, 0, DI_NORMAL | DI_COMPAT); ::DestroyIcon(xIcon); @@ -550,7 +550,7 @@ void CInfoPanel::RenderIPStatus(const HDC hdc, RECT& rcItem) m_dat->panelStatusCX = 3 + sStatus.cx + sProto.cx + 14 + (m_dat->hClientIcon ? 20 : 0) + sTime.cx + 13; if (m_dat->panelStatusCX != oldPanelStatusCX) { - SendMessage(m_dat->hwnd, WM_SIZE, 0, 0); + SendMessage(m_dat->GetHwnd(), WM_SIZE, 0, 0); rcItem = m_dat->rcStatus; } @@ -696,9 +696,9 @@ void CInfoPanel::Invalidate(BOOL fErase) const { if (m_active) { RECT rc; - ::GetClientRect(m_dat->hwnd, &rc); + ::GetClientRect(m_dat->GetHwnd(), &rc); rc.bottom = m_height; - ::InvalidateRect(m_dat->hwnd, &rc, fErase); + ::InvalidateRect(m_dat->GetHwnd(), &rc, fErase); } } @@ -750,11 +750,11 @@ LRESULT CInfoPanel::cmdHandler(UINT cmd) switch (cmd) { case CMD_IP_COPY: if (m_hoverFlags & HOVER_NICK) { - Utils::CopyToClipBoard(m_dat->cache->getNick(), m_dat->hwnd); + Utils::CopyToClipBoard(m_dat->cache->getNick(), m_dat->GetHwnd()); return(S_OK); } if (m_hoverFlags & HOVER_UIN) { - Utils::CopyToClipBoard(m_isChat ? m_dat->si->ptszTopic : m_dat->cache->getUIN(), m_dat->hwnd); + Utils::CopyToClipBoard(m_isChat ? m_dat->si->ptszTopic : m_dat->cache->getUIN(), m_dat->GetHwnd()); return(S_OK); } break; @@ -762,7 +762,7 @@ LRESULT CInfoPanel::cmdHandler(UINT cmd) case IDC_CHAT_HISTORY: case IDC_CHANMGR: if (m_isChat) { - SendMessage(m_dat->hwnd, WM_COMMAND, cmd, 0); + SendMessage(m_dat->GetHwnd(), WM_COMMAND, cmd, 0); return(S_OK); } break; @@ -781,16 +781,16 @@ void CInfoPanel::handleClick(const POINT& pt) return; if (!m_isChat) { - ::KillTimer(m_dat->hwnd, TIMERID_AWAYMSG); + ::KillTimer(m_dat->GetHwnd(), TIMERID_AWAYMSG); m_dat->dwFlagsEx &= ~MWF_SHOW_AWAYMSGTIMER; } HMENU m = constructContextualMenu(); if (m) { - LRESULT r = ::TrackPopupMenu(m, TPM_RETURNCMD, pt.x, pt.y, 0, m_dat->hwnd, NULL); + LRESULT r = ::TrackPopupMenu(m, TPM_RETURNCMD, pt.x, pt.y, 0, m_dat->GetHwnd(), NULL); ::DestroyMenu(m); if (S_OK != cmdHandler(r)) - Utils::CmdDispatcher(Utils::CMD_INFOPANEL, m_dat->hwnd, r, 0, 0, m_dat, m_dat->pContainer); + Utils::CmdDispatcher(Utils::CMD_INFOPANEL, m_dat->GetHwnd(), r, 0, 0, m_dat, m_dat->pContainer); } m_hoverFlags = 0; Invalidate(TRUE); @@ -805,7 +805,7 @@ void CInfoPanel::handleClick(const POINT& pt) int CInfoPanel::hitTest(POINT pt) { - ::ScreenToClient(m_dat->hwnd, &pt); + ::ScreenToClient(m_dat->GetHwnd(), &pt); if (!m_isChat && ::PtInRect(&m_rcStatus, pt)) return(HTSTATUS); @@ -852,7 +852,7 @@ void CInfoPanel::trackMouse(POINT &pt) if (m_hoverFlags) { if (!(m_dat->dwFlagsEx & MWF_SHOW_AWAYMSGTIMER)) { - ::SetTimer(m_dat->hwnd, TIMERID_AWAYMSG, 1000, 0); + ::SetTimer(m_dat->GetHwnd(), TIMERID_AWAYMSG, 1000, 0); m_dat->dwFlagsEx |= MWF_SHOW_AWAYMSGTIMER; } } @@ -872,7 +872,7 @@ void CInfoPanel::showTip(UINT ctrlId, const LPARAM lParam) if (!m_active || !m_dat->hwndTip) return; - HWND hwndDlg = m_dat->hwnd; + HWND hwndDlg = m_dat->GetHwnd(); { RECT rc; ::GetWindowRect(GetDlgItem(hwndDlg, ctrlId), &rc); @@ -922,7 +922,7 @@ void CInfoPanel::showTip(UINT ctrlId, const LPARAM lParam) POINT pt; RECT rc = { 0, 0, 400, 600 }; GetCursorPos(&pt); - m_tip = new CTip(m_dat->hwnd, m_dat->hContact, str, this); + m_tip = new CTip(m_dat->GetHwnd(), m_dat->m_hContact, str, this); m_tip->show(rc, pt, m_dat->hTabIcon, m_dat->szStatus); return; } @@ -968,7 +968,7 @@ LRESULT CALLBACK CInfoPanel::avatarParentSubclass(HWND hwnd, UINT msg, WPARAM wP case WM_ERASEBKGND: // parent window of the infopanel ACC control RECT rc, rcItem; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(GetParent(hwnd), GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(GetParent(hwnd), GWLP_USERDATA); if (dat == 0) break; @@ -1059,168 +1059,168 @@ INT_PTR CALLBACK CInfoPanel::ConfigDlgProc(HWND hwnd, UINT msg, WPARAM wParam, L { switch (msg) { case WM_INITDIALOG: - { - wchar_t tszTitle[100]; - mir_snwprintf(tszTitle, TranslateT("Set panel visibility for this %s"), - m_isChat ? TranslateT("chat room") : TranslateT("contact")); - ::SetDlgItemText(hwnd, IDC_STATIC_VISIBILTY, tszTitle); + { + wchar_t tszTitle[100]; + mir_snwprintf(tszTitle, TranslateT("Set panel visibility for this %s"), + m_isChat ? TranslateT("chat room") : TranslateT("contact")); + ::SetDlgItemText(hwnd, IDC_STATIC_VISIBILTY, tszTitle); - mir_snwprintf(tszTitle, m_isChat ? TranslateT("Do not synchronize the panel height with IM windows") : - TranslateT("Do not synchronize the panel height with group chat windows")); + mir_snwprintf(tszTitle, m_isChat ? TranslateT("Do not synchronize the panel height with IM windows") : + TranslateT("Do not synchronize the panel height with group chat windows")); - ::SetDlgItemText(hwnd, IDC_NOSYNC, tszTitle); + ::SetDlgItemText(hwnd, IDC_NOSYNC, tszTitle); - ::SendDlgItemMessage(hwnd, IDC_PANELVISIBILITY, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Inherit from container setting")); - ::SendDlgItemMessage(hwnd, IDC_PANELVISIBILITY, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Always off")); - ::SendDlgItemMessage(hwnd, IDC_PANELVISIBILITY, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Always on")); + ::SendDlgItemMessage(hwnd, IDC_PANELVISIBILITY, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Inherit from container setting")); + ::SendDlgItemMessage(hwnd, IDC_PANELVISIBILITY, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Always off")); + ::SendDlgItemMessage(hwnd, IDC_PANELVISIBILITY, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Always on")); - BYTE v = M.GetByte(m_dat->hContact, "infopanel", 0); - ::SendDlgItemMessage(hwnd, IDC_PANELVISIBILITY, CB_SETCURSEL, (WPARAM)(v == 0 ? 0 : (v == (BYTE)-1 ? 1 : 2)), 0); + BYTE v = M.GetByte(m_dat->m_hContact, "infopanel", 0); + ::SendDlgItemMessage(hwnd, IDC_PANELVISIBILITY, CB_SETCURSEL, (WPARAM)(v == 0 ? 0 : (v == (BYTE)-1 ? 1 : 2)), 0); - ::SendDlgItemMessage(hwnd, IDC_PANELSIZE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Use default size")); - ::SendDlgItemMessage(hwnd, IDC_PANELSIZE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Use private size")); + ::SendDlgItemMessage(hwnd, IDC_PANELSIZE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Use default size")); + ::SendDlgItemMessage(hwnd, IDC_PANELSIZE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Use private size")); - ::SendDlgItemMessage(hwnd, IDC_PANELSIZE, CB_SETCURSEL, (WPARAM)(m_fPrivateHeight ? 1 : 0), 0); + ::SendDlgItemMessage(hwnd, IDC_PANELSIZE, CB_SETCURSEL, (WPARAM)(m_fPrivateHeight ? 1 : 0), 0); - ::CheckDlgButton(hwnd, IDC_NOSYNC, M.GetByte("syncAllPanels", 0) ? BST_UNCHECKED : BST_CHECKED); + ::CheckDlgButton(hwnd, IDC_NOSYNC, M.GetByte("syncAllPanels", 0) ? BST_UNCHECKED : BST_CHECKED); - Utils::showDlgControl(hwnd, IDC_IPCONFIG_PRIVATECONTAINER, m_dat->pContainer->settings->fPrivate ? SW_SHOW : SW_HIDE); + Utils::showDlgControl(hwnd, IDC_IPCONFIG_PRIVATECONTAINER, m_dat->pContainer->settings->fPrivate ? SW_SHOW : SW_HIDE); - if (!m_isChat) { - v = db_get_b(m_dat->hContact, SRMSGMOD_T, "hideavatar", -1); - ::SendDlgItemMessage(hwnd, IDC_PANELPICTUREVIS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Use global setting")); - ::SendDlgItemMessage(hwnd, IDC_PANELPICTUREVIS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Show always (if present)")); - ::SendDlgItemMessage(hwnd, IDC_PANELPICTUREVIS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Never show it at all")); - ::SendDlgItemMessage(hwnd, IDC_PANELPICTUREVIS, CB_SETCURSEL, (v == (BYTE)-1 ? 0 : (v == 1 ? 1 : 2)), 0); + if (!m_isChat) { + v = db_get_b(m_dat->m_hContact, SRMSGMOD_T, "hideavatar", -1); + ::SendDlgItemMessage(hwnd, IDC_PANELPICTUREVIS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Use global setting")); + ::SendDlgItemMessage(hwnd, IDC_PANELPICTUREVIS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Show always (if present)")); + ::SendDlgItemMessage(hwnd, IDC_PANELPICTUREVIS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Never show it at all")); + ::SendDlgItemMessage(hwnd, IDC_PANELPICTUREVIS, CB_SETCURSEL, (v == (BYTE)-1 ? 0 : (v == 1 ? 1 : 2)), 0); + } + else Utils::enableDlgControl(hwnd, IDC_PANELPICTUREVIS, false); } - else Utils::enableDlgControl(hwnd, IDC_PANELPICTUREVIS, false); - } - return FALSE; + return FALSE; case WM_CTLCOLOREDIT: case WM_CTLCOLORSTATIC: - { - HWND hwndChild = (HWND)lParam; - UINT id = ::GetDlgCtrlID(hwndChild); + { + HWND hwndChild = (HWND)lParam; + UINT id = ::GetDlgCtrlID(hwndChild); - if (m_configDlgFont == 0) { - HFONT hFont = (HFONT)::SendDlgItemMessage(hwnd, IDC_IPCONFIG_TITLE, WM_GETFONT, 0, 0); - LOGFONT lf = { 0 }; + if (m_configDlgFont == 0) { + HFONT hFont = (HFONT)::SendDlgItemMessage(hwnd, IDC_IPCONFIG_TITLE, WM_GETFONT, 0, 0); + LOGFONT lf = { 0 }; - ::GetObject(hFont, sizeof(lf), &lf); - lf.lfWeight = FW_BOLD; - m_configDlgBoldFont = ::CreateFontIndirect(&lf); + ::GetObject(hFont, sizeof(lf), &lf); + lf.lfWeight = FW_BOLD; + m_configDlgBoldFont = ::CreateFontIndirect(&lf); - lf.lfHeight = (int)(lf.lfHeight * 1.2); - m_configDlgFont = ::CreateFontIndirect(&lf); - ::SendDlgItemMessage(hwnd, IDC_IPCONFIG_TITLE, WM_SETFONT, (WPARAM)m_configDlgFont, FALSE); - } + lf.lfHeight = (int)(lf.lfHeight * 1.2); + m_configDlgFont = ::CreateFontIndirect(&lf); + ::SendDlgItemMessage(hwnd, IDC_IPCONFIG_TITLE, WM_SETFONT, (WPARAM)m_configDlgFont, FALSE); + } - if (hwndChild == ::GetDlgItem(hwnd, IDC_IPCONFIG_TITLE)) { - ::SetTextColor((HDC)wParam, RGB(60, 60, 150)); - ::SendMessage(hwndChild, WM_SETFONT, (WPARAM)m_configDlgFont, FALSE); - } - else if (id == IDC_IPCONFIG_FOOTER || id == IDC_SIZE_TIP || id == IDC_IPCONFIG_PRIVATECONTAINER) - ::SetTextColor((HDC)wParam, RGB(160, 50, 50)); - else if (id == IDC_GROUP_SIZE || id == IDC_GROUP_SCOPE || id == IDC_GROUP_OTHER) - ::SendMessage(hwndChild, WM_SETFONT, (WPARAM)m_configDlgBoldFont, FALSE); + if (hwndChild == ::GetDlgItem(hwnd, IDC_IPCONFIG_TITLE)) { + ::SetTextColor((HDC)wParam, RGB(60, 60, 150)); + ::SendMessage(hwndChild, WM_SETFONT, (WPARAM)m_configDlgFont, FALSE); + } + else if (id == IDC_IPCONFIG_FOOTER || id == IDC_SIZE_TIP || id == IDC_IPCONFIG_PRIVATECONTAINER) + ::SetTextColor((HDC)wParam, RGB(160, 50, 50)); + else if (id == IDC_GROUP_SIZE || id == IDC_GROUP_SCOPE || id == IDC_GROUP_OTHER) + ::SendMessage(hwndChild, WM_SETFONT, (WPARAM)m_configDlgBoldFont, FALSE); - ::SetBkColor((HDC)wParam, ::GetSysColor(COLOR_WINDOW)); + ::SetBkColor((HDC)wParam, ::GetSysColor(COLOR_WINDOW)); + } return reinterpret_cast(::GetSysColorBrush(COLOR_WINDOW)); - } case WM_COMMAND: - { - LONG lOldHeight = m_height; - switch (LOWORD(wParam)) { - case IDC_PANELSIZE: { - LRESULT iResult = ::SendDlgItemMessage(hwnd, IDC_PANELSIZE, CB_GETCURSEL, 0, 0); - if (iResult == 0) { - if (m_fPrivateHeight) { - db_set_dw(m_dat->hContact, SRMSGMOD_T, "panelheight", m_height); - loadHeight(); + LONG lOldHeight = m_height; + switch (LOWORD(wParam)) { + case IDC_PANELSIZE: + { + LRESULT iResult = ::SendDlgItemMessage(hwnd, IDC_PANELSIZE, CB_GETCURSEL, 0, 0); + if (iResult == 0) { + if (m_fPrivateHeight) { + db_set_dw(m_dat->m_hContact, SRMSGMOD_T, "panelheight", m_height); + loadHeight(); + } + } + else if (iResult == 1) { + db_set_dw(m_dat->m_hContact, SRMSGMOD_T, "panelheight", + MAKELONG(M.GetDword(m_dat->m_hContact, "panelheight", m_height), 0xffff)); + loadHeight(); + } } - } - else if (iResult == 1) { - db_set_dw(m_dat->hContact, SRMSGMOD_T, "panelheight", - MAKELONG(M.GetDword(m_dat->hContact, "panelheight", m_height), 0xffff)); - loadHeight(); - } - } - break; + break; - case IDC_PANELPICTUREVIS: - { - BYTE vOld = db_get_b(m_dat->hContact, SRMSGMOD_T, "hideavatar", -1); - LRESULT iResult = ::SendDlgItemMessage(hwnd, IDC_PANELPICTUREVIS, CB_GETCURSEL, 0, 0); - - BYTE vNew = (iResult == 0 ? (BYTE)-1 : (iResult == 1 ? 1 : 0)); - if (vNew != vOld) { - if (vNew == (BYTE)-1) - db_unset(m_dat->hContact, SRMSGMOD_T, "hideavatar"); - else - db_set_b(m_dat->hContact, SRMSGMOD_T, "hideavatar", vNew); - - ::ShowPicture(m_dat, FALSE); - ::SendMessage(m_dat->hwnd, WM_SIZE, 0, 0); - ::DM_ScrollToBottom(m_dat, 0, 1); - } - } - break; + case IDC_PANELPICTUREVIS: + { + BYTE vOld = db_get_b(m_dat->m_hContact, SRMSGMOD_T, "hideavatar", -1); + LRESULT iResult = ::SendDlgItemMessage(hwnd, IDC_PANELPICTUREVIS, CB_GETCURSEL, 0, 0); + + BYTE vNew = (iResult == 0 ? (BYTE)-1 : (iResult == 1 ? 1 : 0)); + if (vNew != vOld) { + if (vNew == (BYTE)-1) + db_unset(m_dat->m_hContact, SRMSGMOD_T, "hideavatar"); + else + db_set_b(m_dat->m_hContact, SRMSGMOD_T, "hideavatar", vNew); + + m_dat->ShowPicture(false); + ::SendMessage(m_dat->GetHwnd(), WM_SIZE, 0, 0); + ::DM_ScrollToBottom(m_dat, 0, 1); + } + } + break; - case IDC_PANELVISIBILITY: - { - BYTE vOld = db_get_b(m_dat->hContact, SRMSGMOD_T, "infopanel", 0); - LRESULT iResult = ::SendDlgItemMessage(hwnd, IDC_PANELVISIBILITY, CB_GETCURSEL, 0, 0); - - BYTE vNew = (iResult == 0 ? 0 : (iResult == 1 ? (BYTE)-1 : 1)); - if (vNew != vOld) { - db_set_b(m_dat->hContact, SRMSGMOD_T, "infopanel", vNew); - getVisibility(); - showHide(); - } - } - break; + case IDC_PANELVISIBILITY: + { + BYTE vOld = db_get_b(m_dat->m_hContact, SRMSGMOD_T, "infopanel", 0); + LRESULT iResult = ::SendDlgItemMessage(hwnd, IDC_PANELVISIBILITY, CB_GETCURSEL, 0, 0); + + BYTE vNew = (iResult == 0 ? 0 : (iResult == 1 ? (BYTE)-1 : 1)); + if (vNew != vOld) { + db_set_b(m_dat->m_hContact, SRMSGMOD_T, "infopanel", vNew); + getVisibility(); + showHide(); + } + } + break; - case IDC_SIZECOMPACT: - setHeight(MIN_PANELHEIGHT + 2, true); - break; + case IDC_SIZECOMPACT: + setHeight(MIN_PANELHEIGHT + 2, true); + break; - case IDC_SIZENORMAL: - setHeight(DEGRADE_THRESHOLD, true); - break; + case IDC_SIZENORMAL: + setHeight(DEGRADE_THRESHOLD, true); + break; - case IDC_SIZELARGE: - setHeight(51, true); - break; + case IDC_SIZELARGE: + setHeight(51, true); + break; - case IDC_NOSYNC: - db_set_b(0, SRMSGMOD_T, "syncAllPanels", ::IsDlgButtonChecked(hwnd, IDC_NOSYNC) ? 0 : 1); - if (BST_UNCHECKED == IsDlgButtonChecked(hwnd, IDC_NOSYNC)) { - loadHeight(); - if (!m_dat->pContainer->settings->fPrivate) - M.BroadcastMessage(DM_SETINFOPANEL, (WPARAM)m_dat, (LPARAM)m_defaultHeight); - else - ::BroadCastContainer(m_dat->pContainer, DM_SETINFOPANEL, (WPARAM)m_dat, (LPARAM)m_defaultHeight); - } - else { - if (!m_dat->pContainer->settings->fPrivate) - M.BroadcastMessage(DM_SETINFOPANEL, (WPARAM)m_dat, 0); - else - ::BroadCastContainer(m_dat->pContainer, DM_SETINFOPANEL, (WPARAM)m_dat, 0); + case IDC_NOSYNC: + db_set_b(0, SRMSGMOD_T, "syncAllPanels", ::IsDlgButtonChecked(hwnd, IDC_NOSYNC) ? 0 : 1); + if (BST_UNCHECKED == IsDlgButtonChecked(hwnd, IDC_NOSYNC)) { + loadHeight(); + if (!m_dat->pContainer->settings->fPrivate) + M.BroadcastMessage(DM_SETINFOPANEL, (WPARAM)m_dat, (LPARAM)m_defaultHeight); + else + ::BroadCastContainer(m_dat->pContainer, DM_SETINFOPANEL, (WPARAM)m_dat, (LPARAM)m_defaultHeight); + } + else { + if (!m_dat->pContainer->settings->fPrivate) + M.BroadcastMessage(DM_SETINFOPANEL, (WPARAM)m_dat, 0); + else + ::BroadCastContainer(m_dat->pContainer, DM_SETINFOPANEL, (WPARAM)m_dat, 0); + } + break; } - break; - } - if (m_height != lOldHeight) { - ::SendMessage(m_dat->hwnd, WM_SIZE, 0, 0); - ::SetAeroMargins(m_dat->pContainer); - ::RedrawWindow(m_dat->hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); - ::RedrawWindow(GetParent(m_dat->hwnd), NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); + if (m_height != lOldHeight) { + ::SendMessage(m_dat->GetHwnd(), WM_SIZE, 0, 0); + ::SetAeroMargins(m_dat->pContainer); + ::RedrawWindow(m_dat->GetHwnd(), NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); + ::RedrawWindow(GetParent(m_dat->GetHwnd()), NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); + } } - } - break; + break; case WM_CLOSE: if (wParam == 1 && lParam == 1) @@ -1249,7 +1249,7 @@ int CInfoPanel::invokeConfigDialog(const POINT &pt) return 0; RECT rc; - ::GetWindowRect(m_dat->hwnd, &rc); + ::GetWindowRect(m_dat->GetHwnd(), &rc); rc.bottom = rc.top + m_height; rc.right -= m_dat->iPanelAvatarX; @@ -1267,7 +1267,7 @@ int CInfoPanel::invokeConfigDialog(const POINT &pt) ::GetClientRect(m_hwndConfig, &rc); RECT rcLog; - ::GetWindowRect(GetDlgItem(m_dat->hwnd, m_isChat ? IDC_CHAT_LOG : IDC_LOG), &rcLog); + ::GetWindowRect(GetDlgItem(m_dat->GetHwnd(), m_isChat ? IDC_LOG : IDC_LOG), &rcLog); m_fDialogCreated = true; ::SetWindowPos(m_hwndConfig, HWND_TOP, rcLog.left + 10, rcLog.top - (m_active ? 10 : 0), 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); diff --git a/plugins/TabSRMM/src/infopanel.h b/plugins/TabSRMM/src/infopanel.h index 8ee1f4e304..ff31b61045 100644 --- a/plugins/TabSRMM/src/infopanel.h +++ b/plugins/TabSRMM/src/infopanel.h @@ -125,7 +125,7 @@ public: HTNIRVANA = 0 }; - CInfoPanel(TWindowData *dat) + CInfoPanel(CTabBaseDlg *dat) { if (dat) { m_dat = dat; @@ -149,7 +149,7 @@ public: __forceinline bool isActive() const { return m_active; } __forceinline bool isPrivateHeight() const { return m_fPrivateHeight; } __forceinline DWORD isHovered() const { return m_active ? m_hoverFlags : 0; } - __forceinline const TWindowData* getDat() const { return m_dat; } + __forceinline const CTabBaseDlg* getDat() const { return m_dat; } void setHeight(LONG newHeight, bool fBroadcast = false); void setActive(const int newActive); @@ -172,7 +172,7 @@ public: public: static TInfoPanelConfig m_ipConfig; - static int setPanelHandler(TWindowData *dat, WPARAM wParam, LPARAM lParam); + static int setPanelHandler(CTabBaseDlg *dat, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK avatarParentSubclass(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); private: @@ -194,7 +194,7 @@ private: bool m_active; // panel active and visible bool m_fPrivateHeight; bool m_fDialogCreated; - TWindowData *m_dat; // this one OWNS us... + CTabBaseDlg *m_dat; // this one OWNS us... LONG m_height; // height (determined by position of IDC_PANELSPLITTER) LONG m_defaultHeight, m_defaultMUCHeight; // global values for the info bar height diff --git a/plugins/TabSRMM/src/mim.cpp b/plugins/TabSRMM/src/mim.cpp index c5999eee9f..b85e7ac1e8 100644 --- a/plugins/TabSRMM/src/mim.cpp +++ b/plugins/TabSRMM/src/mim.cpp @@ -337,12 +337,12 @@ int CMimAPI::ProtoAck(WPARAM, LPARAM lParam) for (int j = 0; j < SendQueue::NR_SENDJOBS; j++) { SendJob &p = jobs[j]; if (pAck->hProcess == p.hSendId && pAck->hContact == p.hContact) { - TWindowData *dat = p.hOwnerWnd ? (TWindowData*)GetWindowLongPtr(p.hOwnerWnd, GWLP_USERDATA) : NULL; + CSrmmWindow *dat = p.hOwnerWnd ? (CSrmmWindow*)GetWindowLongPtr(p.hOwnerWnd, GWLP_USERDATA) : NULL; if (dat == NULL) { sendQueue->ackMessage(NULL, (WPARAM)MAKELONG(j, i), lParam); return 0; } - if (dat->hContact == p.hContact || dat->hContact == hMeta) { + if (dat->m_hContact == p.hContact || dat->m_hContact == hMeta) { iFound = j; break; } diff --git a/plugins/TabSRMM/src/msgdialog.cpp b/plugins/TabSRMM/src/msgdialog.cpp index 40cfee8e07..368d492a44 100644 --- a/plugins/TabSRMM/src/msgdialog.cpp +++ b/plugins/TabSRMM/src/msgdialog.cpp @@ -80,10 +80,10 @@ static void _clrMsgFilter(LPARAM lParam) // @param hwndFrom src window handle // @param pt mouse pointer position -static void ShowPopupMenu(TWindowData *dat, int idFrom, HWND hwndFrom, POINT pt) +static void ShowPopupMenu(CSrmmWindow *dat, int idFrom, HWND hwndFrom, POINT pt) { CHARRANGE sel, all = { 0, -1 }; - HWND hwndDlg = dat->hwnd; + HWND hwndDlg = dat->GetHwnd(); HMENU hSubMenu, hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_CONTEXT)); if (idFrom == IDC_LOG) @@ -115,7 +115,7 @@ static void ShowPopupMenu(TWindowData *dat, int idFrom, HWND hwndFrom, POINT pt) mwpd.cbSize = sizeof(mwpd); mwpd.uType = MSG_WINDOWPOPUP_SHOWING; mwpd.uFlags = (idFrom == IDC_LOG ? MSG_WINDOWPOPUP_LOG : MSG_WINDOWPOPUP_INPUT); - mwpd.hContact = dat->hContact; + mwpd.hContact = dat->m_hContact; mwpd.hwnd = hwndFrom; mwpd.hMenu = hSubMenu; mwpd.selection = 0; @@ -156,7 +156,7 @@ static void ShowPopupMenu(TWindowData *dat, int idFrom, HWND hwndFrom, POINT pt) SendMessage(hwndFrom, EM_EXSETSEL, 0, (LPARAM)&all); break; case IDM_CLEAR: - ClearLog(dat); + dat->ClearLog(); break; case ID_LOG_FREEZELOG: SendDlgItemMessage(hwndDlg, IDC_LOG, WM_KEYDOWN, VK_F12, 0); @@ -170,7 +170,7 @@ static void ShowPopupMenu(TWindowData *dat, int idFrom, HWND hwndFrom, POINT pt) RedrawWindow(dat->pContainer->hwndStatus, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); break; case ID_EDITOR_PASTEANDSENDIMMEDIATELY: - HandlePasteAndSend(dat); + dat->HandlePasteAndSend(); break; } @@ -179,29 +179,29 @@ static void ShowPopupMenu(TWindowData *dat, int idFrom, HWND hwndFrom, POINT pt) DestroyMenu(hMenu); } -static void ResizeIeView(const TWindowData *dat) +void CTabBaseDlg::ResizeIeView() { RECT rcRichEdit; - GetWindowRect(GetDlgItem(dat->hwnd, IDC_LOG), &rcRichEdit); + GetWindowRect(m_log.GetHwnd(), &rcRichEdit); POINT pt = { rcRichEdit.left, rcRichEdit.top }; - ScreenToClient(dat->hwnd, &pt); + ScreenToClient(m_hwnd, &pt); IEVIEWWINDOW ieWindow = { sizeof(ieWindow) }; ieWindow.iType = IEW_SETPOS; - ieWindow.parent = dat->hwnd; - ieWindow.hwnd = dat->hwndIEView ? dat->hwndIEView : dat->hwndHPP; + ieWindow.parent = m_hwnd; + ieWindow.hwnd = hwndIEView ? hwndIEView : hwndHPP; ieWindow.x = pt.x; ieWindow.y = pt.y; ieWindow.cx = rcRichEdit.right - rcRichEdit.left; ieWindow.cy = rcRichEdit.bottom - rcRichEdit.top; if (ieWindow.cx != 0 && ieWindow.cy != 0) - CallService(dat->hwndIEView ? MS_IEVIEW_WINDOW : MS_HPP_EG_WINDOW, 0, (LPARAM)&ieWindow); + CallService(hwndIEView ? MS_IEVIEW_WINDOW : MS_HPP_EG_WINDOW, 0, (LPARAM)&ieWindow); } LRESULT CALLBACK IEViewSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - TWindowData *mwdat = (TWindowData*)GetWindowLongPtr(GetParent(hwnd), GWLP_USERDATA); + CSrmmWindow *mwdat = (CSrmmWindow*)GetWindowLongPtr(GetParent(hwnd), GWLP_USERDATA); switch (msg) { case WM_NCCALCSIZE: @@ -217,10 +217,10 @@ LRESULT CALLBACK IEViewSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM l LRESULT CALLBACK HPPKFSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - TWindowData *mwdat = (TWindowData*)GetWindowLongPtr(GetParent(hwnd), GWLP_USERDATA); + CSrmmWindow *mwdat = (CSrmmWindow*)GetWindowLongPtr(GetParent(hwnd), GWLP_USERDATA); if (mwdat) { - BOOL isCtrl, isShift, isAlt; - KbdState(mwdat, isShift, isCtrl, isAlt); + bool isCtrl, isShift, isAlt; + mwdat->KbdState(isShift, isCtrl, isAlt); switch (msg) { case WM_NCCALCSIZE: @@ -234,7 +234,7 @@ LRESULT CALLBACK HPPKFSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP wParam != VK_MENU && wParam != VK_END && wParam != VK_HOME && wParam != VK_UP && wParam != VK_DOWN && wParam != VK_LEFT && wParam != VK_RIGHT && wParam != VK_TAB && wParam != VK_SPACE) { - SetFocus(GetDlgItem(mwdat->hwnd, IDC_MESSAGE)); + SetFocus(GetDlgItem(mwdat->GetHwnd(), IDC_MESSAGE)); keybd_event((BYTE)wParam, (BYTE)MapVirtualKey(wParam, 0), KEYEVENTF_EXTENDEDKEY | 0, 0); return 0; } @@ -253,127 +253,124 @@ LRESULT CALLBACK HPPKFSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP // it protects itself from being called more than once per session activation and is valid for // normal IM sessions *only*. Group chat sessions have their own activation handler (see chat/window.c) -static void MsgWindowUpdateState(TWindowData *dat, UINT msg) +void CSrmmWindow::MsgWindowUpdateState(UINT msg) { - if (dat == NULL || dat->iTabID < 0) + if (iTabID < 0) return; - HWND hwndDlg = dat->hwnd; - HWND hwndTab = GetParent(hwndDlg); - if (msg == WM_ACTIVATE) { - if (dat->pContainer->dwFlags & CNT_TRANSPARENCY) { - DWORD trans = LOWORD(dat->pContainer->settings->dwTransparency); - SetLayeredWindowAttributes(dat->pContainer->hwnd, 0, (BYTE)trans, (dat->pContainer->dwFlags & CNT_TRANSPARENCY ? LWA_ALPHA : 0)); + if (pContainer->dwFlags & CNT_TRANSPARENCY) { + DWORD trans = LOWORD(pContainer->settings->dwTransparency); + SetLayeredWindowAttributes(pContainer->hwnd, 0, (BYTE)trans, (pContainer->dwFlags & CNT_TRANSPARENCY ? LWA_ALPHA : 0)); } } - if (dat->bIsAutosizingInput && dat->iInputAreaHeight == -1) { - dat->iInputAreaHeight = 0; - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_REQUESTRESIZE, 0, 0); + if (bIsAutosizingInput && iInputAreaHeight == -1) { + iInputAreaHeight = 0; + SendDlgItemMessage(m_hwnd, IDC_MESSAGE, EM_REQUESTRESIZE, 0, 0); } - if (dat->pWnd) - dat->pWnd->activateTab(); - dat->Panel->dismissConfig(); - dat->dwUnread = 0; - if (dat->pContainer->hwndSaved == hwndDlg) + if (pWnd) + pWnd->activateTab(); + Panel->dismissConfig(); + dwUnread = 0; + if (pContainer->hwndSaved == m_hwnd) return; - dat->pContainer->hwndSaved = hwndDlg; + pContainer->hwndSaved = m_hwnd; - dat->dwTickLastEvent = 0; - dat->dwFlags &= ~MWF_DIVIDERSET; - if (KillTimer(hwndDlg, TIMERID_FLASHWND)) { - FlashTab(dat, hwndTab, dat->iTabID, &dat->bTabFlash, FALSE, dat->hTabIcon); - dat->mayFlashTab = FALSE; + dwTickLastEvent = 0; + dwFlags &= ~MWF_DIVIDERSET; + if (KillTimer(m_hwnd, TIMERID_FLASHWND)) { + FlashTab(false); + m_bCanFlashTab = false; } - if (dat->pContainer->dwFlashingStarted != 0) { - FlashContainer(dat->pContainer, 0, 0); - dat->pContainer->dwFlashingStarted = 0; + if (pContainer->dwFlashingStarted != 0) { + FlashContainer(pContainer, 0, 0); + pContainer->dwFlashingStarted = 0; } - if (dat->dwFlagsEx & MWF_SHOW_FLASHCLIST) { - dat->dwFlagsEx &= ~MWF_SHOW_FLASHCLIST; - if (dat->hFlashingEvent != 0) - pcli->pfnRemoveEvent(dat->hContact, dat->hFlashingEvent); - dat->hFlashingEvent = 0; + if (dwFlagsEx & MWF_SHOW_FLASHCLIST) { + dwFlagsEx &= ~MWF_SHOW_FLASHCLIST; + if (hFlashingEvent != 0) + pcli->pfnRemoveEvent(m_hContact, hFlashingEvent); + hFlashingEvent = 0; } - dat->pContainer->dwFlags &= ~CNT_NEED_UPDATETITLE; + pContainer->dwFlags &= ~CNT_NEED_UPDATETITLE; - if ((dat->dwFlags & MWF_DEFERREDREMAKELOG) && !IsIconic(dat->pContainer->hwnd)) { - SendMessage(hwndDlg, DM_REMAKELOG, 0, 0); - dat->dwFlags &= ~MWF_DEFERREDREMAKELOG; + if ((dwFlags & MWF_DEFERREDREMAKELOG) && !IsIconic(pContainer->hwnd)) { + SendMessage(m_hwnd, DM_REMAKELOG, 0, 0); + dwFlags &= ~MWF_DEFERREDREMAKELOG; } - if (dat->dwFlags & MWF_NEEDCHECKSIZE) - PostMessage(hwndDlg, DM_SAVESIZE, 0, 0); + if (dwFlags & MWF_NEEDCHECKSIZE) + PostMessage(m_hwnd, DM_SAVESIZE, 0, 0); if (PluginConfig.m_bAutoLocaleSupport) { - if (dat->hkl == 0) - DM_LoadLocale(dat); + if (hkl == 0) + DM_LoadLocale(this); else - SendMessage(hwndDlg, DM_SETLOCALE, 0, 0); + SendMessage(m_hwnd, DM_SETLOCALE, 0, 0); } - dat->pContainer->hIconTaskbarOverlay = 0; - SendMessage(dat->pContainer->hwnd, DM_UPDATETITLE, dat->hContact, 0); + pContainer->hIconTaskbarOverlay = 0; + SendMessage(pContainer->hwnd, DM_UPDATETITLE, m_hContact, 0); - UpdateStatusBar(dat); - dat->dwLastActivity = GetTickCount(); - dat->pContainer->dwLastActivity = dat->dwLastActivity; + UpdateStatusBar(); + dwLastActivity = GetTickCount(); + pContainer->dwLastActivity = dwLastActivity; - dat->pContainer->MenuBar->configureMenu(); - UpdateTrayMenuState(dat, FALSE); + pContainer->MenuBar->configureMenu(); + UpdateTrayMenuState(this, FALSE); - if (dat->pContainer->hwndActive == hwndDlg) - PostMessage(hwndDlg, DM_REMOVEPOPUPS, PU_REMOVE_ON_FOCUS, 0); + if (pContainer->hwndActive == m_hwnd) + PostMessage(m_hwnd, DM_REMOVEPOPUPS, PU_REMOVE_ON_FOCUS, 0); - dat->Panel->Invalidate(); + Panel->Invalidate(); - if (dat->dwFlags & MWF_DEFERREDSCROLL && dat->hwndIEView == 0 && dat->hwndHPP == 0) { - dat->dwFlags &= ~MWF_DEFERREDSCROLL; - DM_ScrollToBottom(dat, 0, 1); + if (dwFlags & MWF_DEFERREDSCROLL && hwndIEView == 0 && hwndHPP == 0) { + dwFlags &= ~MWF_DEFERREDSCROLL; + DM_ScrollToBottom(this, 0, 1); } - DM_SetDBButtonStates(hwndDlg, dat); + DM_SetDBButtonStates(); - if (dat->hwndIEView) { + if (hwndIEView) { RECT rcRTF; POINT pt; - GetWindowRect(GetDlgItem(hwndDlg, IDC_LOG), &rcRTF); + GetWindowRect(GetDlgItem(m_hwnd, IDC_LOG), &rcRTF); rcRTF.left += 20; rcRTF.top += 20; pt.x = rcRTF.left; pt.y = rcRTF.top; - if (dat->hwndIEView) { + if (hwndIEView) { if (M.GetByte("subclassIEView", 0)) { - mir_subclassWindow(dat->hwndIEView, IEViewSubclassProc); - SetWindowPos(dat->hwndIEView, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DRAWFRAME); - RedrawWindow(dat->hwndIEView, 0, 0, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW); + mir_subclassWindow(hwndIEView, IEViewSubclassProc); + SetWindowPos(hwndIEView, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DRAWFRAME); + RedrawWindow(hwndIEView, 0, 0, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW); } } - dat->hwndIWebBrowserControl = WindowFromPoint(pt); + hwndIWebBrowserControl = WindowFromPoint(pt); } - if (dat->dwFlagsEx & MWF_EX_DELAYEDSPLITTER) { - dat->dwFlagsEx &= ~MWF_EX_DELAYEDSPLITTER; - ShowWindow(dat->pContainer->hwnd, SW_RESTORE); - PostMessage(hwndDlg, DM_SPLITTERGLOBALEVENT, dat->wParam, dat->lParam); - dat->wParam = dat->lParam = 0; + if (dwFlagsEx & MWF_EX_DELAYEDSPLITTER) { + dwFlagsEx &= ~MWF_EX_DELAYEDSPLITTER; + ShowWindow(pContainer->hwnd, SW_RESTORE); + PostMessage(m_hwnd, DM_SPLITTERGLOBALEVENT, wParam, lParam); + wParam = lParam = 0; } - if (dat->dwFlagsEx & MWF_EX_AVATARCHANGED) { - dat->dwFlagsEx &= ~MWF_EX_AVATARCHANGED; - PostMessage(hwndDlg, DM_UPDATEPICLAYOUT, 0, 0); + if (dwFlagsEx & MWF_EX_AVATARCHANGED) { + dwFlagsEx &= ~MWF_EX_AVATARCHANGED; + PostMessage(m_hwnd, DM_UPDATEPICLAYOUT, 0, 0); } - BB_SetButtonsPos(dat); + BB_SetButtonsPos(); if (M.isAero()) - InvalidateRect(hwndTab, NULL, FALSE); - if (dat->pContainer->dwFlags & CNT_SIDEBAR) - dat->pContainer->SideBar->setActiveItem(dat); + InvalidateRect(m_hwndParent, NULL, FALSE); + if (pContainer->dwFlags & CNT_SIDEBAR) + pContainer->SideBar->setActiveItem(this); - if (dat->pWnd) - dat->pWnd->Invalidate(); + if (pWnd) + pWnd->Invalidate(); } void TSAPI ShowMultipleControls(HWND hwndDlg, const UINT *controls, int cControls, int state) @@ -384,9 +381,9 @@ void TSAPI ShowMultipleControls(HWND hwndDlg, const UINT *controls, int cControl void TSAPI SetDialogToType(HWND hwndDlg) { - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - if (dat->hContact) { - if (db_get_b(dat->hContact, "CList", "NotOnList", 0)) { + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + if (dat->m_hContact) { + if (db_get_b(dat->m_hContact, "CList", "NotOnList", 0)) { dat->bNotOnList = TRUE; ShowMultipleControls(hwndDlg, addControls, _countof(addControls), SW_SHOW); Utils::showDlgControl(hwndDlg, IDC_LOGFROZENTEXT, SW_SHOW); @@ -414,18 +411,18 @@ void TSAPI SetDialogToType(HWND hwndDlg) ShowMultipleControls(hwndDlg, formatControls, _countof(formatControls), SW_HIDE); if (dat->pContainer->hwndActive == hwndDlg) - UpdateReadChars(dat); + dat->UpdateReadChars(); SetDlgItemText(hwndDlg, IDC_STATICTEXT, TranslateT("A message failed to send successfully.")); - DM_RecalcPictureSize(dat); - GetAvatarVisibility(hwndDlg, dat); + dat->DM_RecalcPictureSize(); + dat->GetAvatarVisibility(); Utils::showDlgControl(hwndDlg, IDC_CONTACTPIC, dat->bShowAvatar ? SW_SHOW : SW_HIDE); Utils::showDlgControl(hwndDlg, IDC_SPLITTER, dat->bIsAutosizingInput ? SW_HIDE : SW_SHOW); Utils::showDlgControl(hwndDlg, IDC_MULTISPLITTER, (dat->sendMode & SMODE_MULTIPLE) ? SW_SHOW : SW_HIDE); - EnableSendButton(dat, GetWindowTextLength(GetDlgItem(hwndDlg, IDC_MESSAGE)) != 0); + dat->EnableSendButton(GetWindowTextLength(GetDlgItem(hwndDlg, IDC_MESSAGE)) != 0); SendMessage(hwndDlg, DM_UPDATETITLE, 0, 1); SendMessage(hwndDlg, WM_SIZE, 0, 0); @@ -437,9 +434,9 @@ void TSAPI SetDialogToType(HWND hwndDlg) static LRESULT CALLBACK MessageLogSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndParent = GetParent(hwnd); - TWindowData *mwdat = (TWindowData*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); - BOOL isCtrl, isShift, isAlt; - KbdState(mwdat, isShift, isCtrl, isAlt); + CSrmmWindow *mwdat = (CSrmmWindow*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); + bool isCtrl, isShift, isAlt; + mwdat->KbdState(isShift, isCtrl, isAlt); switch (msg) { case WM_KILLFOCUS: @@ -457,7 +454,7 @@ static LRESULT CALLBACK MessageLogSubclassProc(HWND hwnd, UINT msg, WPARAM wPara if (wParam == 0x03 && isCtrl) // Ctrl+C return DM_WMCopyHandler(hwnd, MessageLogSubclassProc, msg, wParam, lParam); if (wParam == 0x11 && isCtrl) - SendMessage(mwdat->hwnd, WM_COMMAND, IDC_QUOTE, 0); + SendMessage(mwdat->GetHwnd(), WM_COMMAND, IDC_QUOTE, 0); break; case WM_SYSKEYUP: @@ -519,9 +516,9 @@ static LRESULT CALLBACK MessageLogSubclassProc(HWND hwnd, UINT msg, WPARAM wPara static LRESULT CALLBACK MessageEditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - BOOL isCtrl, isShift, isAlt; + bool isCtrl, isShift, isAlt; HWND hwndParent = GetParent(hwnd); - TWindowData *mwdat = (TWindowData*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); + CSrmmWindow *mwdat = (CSrmmWindow*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); if (mwdat == NULL) return 0; @@ -548,7 +545,7 @@ static LRESULT CALLBACK MessageEditSubclassProc(HWND hwnd, UINT msg, WPARAM wPar return 0; case WM_CHAR: - KbdState(mwdat, isShift, isCtrl, isAlt); + mwdat->KbdState(isShift, isCtrl, isAlt); if (PluginConfig.m_bSoundOnTyping && !isAlt && !isCtrl && !(mwdat->pContainer->dwFlags & CNT_NOSOUND) && wParam != VK_ESCAPE && !(wParam == VK_TAB && PluginConfig.m_bAllowTab)) SkinPlaySound("SoundOnTyping"); @@ -594,14 +591,14 @@ static LRESULT CALLBACK MessageEditSubclassProc(HWND hwnd, UINT msg, WPARAM wPar } } else if (hClip = GetClipboardData(CF_BITMAP)) - SendHBitmapAsFile(mwdat, (HBITMAP)hClip); + mwdat->SendHBitmapAsFile((HBITMAP)hClip); CloseClipboard(); } break; case WM_KEYDOWN: - KbdState(mwdat, isShift, isCtrl, isAlt); + mwdat->KbdState(isShift, isCtrl, isAlt); if (PluginConfig.m_bSoundOnTyping && !isAlt && !(mwdat->pContainer->dwFlags & CNT_NOSOUND) && wParam == VK_DELETE) SkinPlaySound("SoundOnTyping"); @@ -716,7 +713,7 @@ static LRESULT CALLBACK MessageEditSubclassProc(HWND hwnd, UINT msg, WPARAM wPar return 0; } - KbdState(mwdat, isShift, isCtrl, isAlt); + mwdat->KbdState(isShift, isCtrl, isAlt); if ((wParam >= '0' && wParam <= '9') && isAlt) { // ALT-1 -> ALT-0 direct tab selection BYTE bChar = (BYTE)wParam; int iIndex; @@ -790,7 +787,7 @@ LRESULT CALLBACK SplitterSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM { RECT rc; HWND hwndParent = GetParent(hwnd); - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwndParent, GWLP_USERDATA); switch (msg) { case WM_NCHITTEST: @@ -877,14 +874,14 @@ LRESULT CALLBACK SplitterSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM switch (selection) { case ID_SPLITTERCONTEXT_SAVEFORTHISCONTACTONLY: dat->dwFlagsEx |= MWF_SHOW_SPLITTEROVERRIDE; - db_set_b(dat->hContact, SRMSGMOD_T, "splitoverride", 1); + db_set_b(dat->m_hContact, SRMSGMOD_T, "splitoverride", 1); if (dat->bType == SESSIONTYPE_IM) - SaveSplitter(dat); + dat->SaveSplitter(); break; case ID_SPLITTERCONTEXT_SETPOSITIONFORTHISSESSION: if (dat->bIsAutosizingInput) { - GetWindowRect(GetDlgItem(dat->hwnd, IDC_MESSAGE), &rc); + GetWindowRect(GetDlgItem(dat->GetHwnd(), IDC_MESSAGE), &rc); dat->iInputAreaHeight = 0; } break; @@ -908,7 +905,7 @@ LRESULT CALLBACK SplitterSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM PluginConfig.lastSPlitterPos.off_chat = dwOff_CHAT; PluginConfig.lastSPlitterPos.off_im = dwOff_IM; PluginConfig.lastSPlitterPos.bSync = bSync; - SendMessage(dat->hwnd, DM_SPLITTERGLOBALEVENT, 0, 0); + SendMessage(dat->GetHwnd(), DM_SPLITTERGLOBALEVENT, 0, 0); M.BroadcastMessage(DM_SPLITTERGLOBALEVENT, 0, 0); } break; @@ -916,13 +913,13 @@ LRESULT CALLBACK SplitterSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM default: dat->splitterY = dat->savedSplitY; dat->dynaSplitter = dat->savedDynaSplit; - DM_RecalcPictureSize(dat); + dat->DM_RecalcPictureSize(); if (dat->bType == SESSIONTYPE_CHAT) { SESSION_INFO *si = dat->si; si->iSplitterY = dat->savedSplitY; dat->splitterY = si->iSplitterY + DPISCALEY_S(22); } - CSkin::UpdateToolbarBG(dat); + dat->UpdateToolbarBG(); SendMessage(hwndParent, WM_SIZE, 0, 0); DM_ScrollToBottom(dat, 0, 1); break; @@ -934,30 +931,446 @@ LRESULT CALLBACK SplitterSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM } ///////////////////////////////////////////////////////////////////////////////////////// -// resizer proc for the "new" layout. -static int MessageDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * urc) +CSrmmWindow::CSrmmWindow(TNewWindowData *pNewData) + : CTabBaseDlg(pNewData, IDD_MSGSPLITNEW) { - TWindowData *dat = (TWindowData*)lParam; - RECT rc, rcButton; - static int uinWidth, msgTop = 0, msgBottom = 0; + m_pLog = &m_log; + m_pEntry = &m_message; + m_autoClose = 0; + + dwFlags = MWF_INITMODE; + bType = SESSIONTYPE_IM; + Panel = new CInfoPanel(this); +} + +void CSrmmWindow::OnInitDialog() +{ + pContainer = newData->pContainer; + SetWindowLongPtr(m_hwnd, GWLP_USERDATA, (LONG_PTR)this); + + if (Utils::rtf_ctable == 0) + Utils::RTF_CTableInit(); + + newData->item.lParam = (LPARAM)m_hwnd; + TabCtrl_SetItem(m_hwndParent, newData->iTabID, &newData->item); + iTabID = newData->iTabID; + + DM_ThemeChanged(); + + pszIDCSAVE_close = TranslateT("Close session"); + pszIDCSAVE_save = TranslateT("Save and close session"); + + m_hContact = newData->hContact; + cache = CContactCache::getContactCache(m_hContact); + cache->updateNick(); + cache->setWindowData(m_hwnd, this); + M.AddWindow(m_hwnd, m_hContact); + BroadCastContainer(pContainer, DM_REFRESHTABINDEX, 0, 0); + CProxyWindow::add(this); + szProto = const_cast(cache->getProto()); + bIsMeta = cache->isMeta(); + if (bIsMeta) + cache->updateMeta(); + + cache->updateUIN(); + + if (m_hContact && szProto != NULL) { + wStatus = db_get_w(m_hContact, szProto, "Status", ID_STATUS_OFFLINE); + wcsncpy_s(szStatus, pcli->pfnGetStatusModeDescription(szProto == NULL ? ID_STATUS_OFFLINE : wStatus, 0), _TRUNCATE); + } + else wStatus = ID_STATUS_OFFLINE; + + for (int i = 0; i < _countof(btnControls); i++) + CustomizeButton(GetDlgItem(m_hwnd, btnControls[i])); + + GetMYUIN(); + GetClientIcon(); + + CustomizeButton(CreateWindowEx(0, L"MButtonClass", L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, 0, 6, DPISCALEY_S(20), + m_hwnd, (HMENU)IDC_TOGGLESIDEBAR, g_hInst, NULL)); + hwndPanelPicParent = CreateWindowEx(WS_EX_TOPMOST, L"Static", L"", SS_OWNERDRAW | WS_VISIBLE | WS_CHILD, 1, 1, 1, 1, m_hwnd, (HMENU)6000, NULL, NULL); + mir_subclassWindow(hwndPanelPicParent, CInfoPanel::avatarParentSubclass); + + bShowUIElements = (pContainer->dwFlags & CNT_HIDETOOLBAR) == 0; + sendMode |= m_hContact == 0 ? SMODE_MULTIPLE : 0; + sendMode |= M.GetByte(m_hContact, "no_ack", 0) ? SMODE_NOACK : 0; + + hQueuedEvents = (MEVENT*)mir_calloc(sizeof(MEVENT)* EVENT_QUEUE_SIZE); + iEventQueueSize = EVENT_QUEUE_SIZE; + iCurrentQueueError = -1; + + // message history limit + // hHistoryEvents holds up to n event handles + maxHistory = M.GetDword(m_hContact, "maxhist", M.GetDword("maxhist", 0)); + curHistory = 0; + if (maxHistory) + hHistoryEvents = (MEVENT*)mir_alloc(maxHistory * sizeof(MEVENT)); + else + hHistoryEvents = NULL; + + if (bIsMeta) + SendMessage(m_hwnd, DM_UPDATEMETACONTACTINFO, 0, 0); + else + SendMessage(m_hwnd, DM_UPDATEWINICON, 0, 0); + + GetMyNick(); + + multiSplitterX = (int)M.GetDword(SRMSGMOD, "multisplit", 150); + nTypeMode = PROTOTYPE_SELFTYPING_OFF; + SetTimer(m_hwnd, TIMERID_TYPE, 1000, NULL); + iLastEventType = 0xffffffff; + + // load log option flags... + dwFlags = pContainer->theme.dwFlags; + + // consider per-contact message setting overrides + if (m_hContact && M.GetDword(m_hContact, "mwmask", 0)) + LoadLocalFlags(); + + DM_InitTip(); + Panel->getVisibility(); + + dwFlagsEx |= M.GetByte(m_hContact, "splitoverride", 0) ? MWF_SHOW_SPLITTEROVERRIDE : 0; + bIsAutosizingInput = IsAutoSplitEnabled(); + iInputAreaHeight = -1; + SetMessageLog(); + if (m_hContact) + Panel->loadHeight(); + + bShowAvatar = GetAvatarVisibility(); + + Utils::showDlgControl(m_hwnd, IDC_MULTISPLITTER, SW_HIDE); + + RECT rc; + GetWindowRect(GetDlgItem(m_hwnd, IDC_SPLITTER), &rc); + + POINT pt; + pt.y = (rc.top + rc.bottom) / 2; + pt.x = 0; + ScreenToClient(m_hwnd, &pt); + originalSplitterY = pt.y; + if (splitterY == -1) + splitterY = originalSplitterY + 60; + + GetWindowRect(m_message.GetHwnd(), &rc); + minEditBoxSize.cx = rc.right - rc.left; + minEditBoxSize.cy = rc.bottom - rc.top; + + BB_InitDlgButtons(); + SendMessage(m_hwnd, WM_CBD_LOADICONS, 0, 0); + + SendDlgItemMessage(m_hwnd, IDC_ADD, BUTTONSETASFLATBTN, TRUE, 0); + SendDlgItemMessage(m_hwnd, IDC_CANCELADD, BUTTONSETASFLATBTN, TRUE, 0); + + SendDlgItemMessage(m_hwnd, IDC_TOGGLESIDEBAR, BUTTONSETASFLATBTN, TRUE, 0); + SendDlgItemMessage(m_hwnd, IDC_TOGGLESIDEBAR, BUTTONSETASTHEMEDBTN, CSkin::IsThemed(), 0); + SendDlgItemMessage(m_hwnd, IDC_TOGGLESIDEBAR, BUTTONSETCONTAINER, (LPARAM)pContainer, 0); + SendDlgItemMessage(m_hwnd, IDC_TOGGLESIDEBAR, BUTTONSETASTOOLBARBUTTON, TRUE, 0); + + TABSRMM_FireEvent(m_hContact, m_hwnd, MSG_WINDOW_EVT_OPENING, 0); + + for (int i = 0; i < _countof(tooltips); i++) + SendDlgItemMessage(m_hwnd, tooltips[i].id, BUTTONADDTOOLTIP, (WPARAM)TranslateW(tooltips[i].text), BATF_UNICODE); + + SetDlgItemText(m_hwnd, IDC_LOGFROZENTEXT, bNotOnList ? TranslateT("Contact not on list. You may add it...") : + TranslateT("Auto scrolling is disabled (press F12 to enable it)")); + + SendDlgItemMessage(m_hwnd, IDC_SAVE, BUTTONADDTOOLTIP, (WPARAM)pszIDCSAVE_close, BATF_UNICODE); + SendDlgItemMessage(m_hwnd, IDC_PROTOCOL, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Click for contact menu\nClick dropdown for window settings"), BATF_UNICODE); + + SetDlgItemText(m_hwnd, IDC_RETRY, TranslateT("Retry")); + { + UINT _ctrls[] = { IDC_RETRY, IDC_CANCELSEND, IDC_MSGSENDLATER }; + for (int i = 0; i < _countof(_ctrls); i++) { + SendDlgItemMessage(m_hwnd, _ctrls[i], BUTTONSETASPUSHBTN, TRUE, 0); + SendDlgItemMessage(m_hwnd, _ctrls[i], BUTTONSETASFLATBTN, FALSE, 0); + SendDlgItemMessage(m_hwnd, _ctrls[i], BUTTONSETASTHEMEDBTN, TRUE, 0); + } + } + + SetDlgItemText(m_hwnd, IDC_CANCELSEND, TranslateT("Cancel")); + SetDlgItemText(m_hwnd, IDC_MSGSENDLATER, TranslateT("Send later")); + + m_log.SendMsg(EM_SETUNDOLIMIT, 0, 0); + m_log.SendMsg(EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS | ENM_KEYEVENTS | ENM_LINK); + m_log.SendMsg(EM_SETOLECALLBACK, 0, (LPARAM)&reOleCallback); + + m_message.SendMsg(EM_SETEVENTMASK, 0, ENM_REQUESTRESIZE | ENM_MOUSEEVENTS | ENM_SCROLL | ENM_KEYEVENTS | ENM_CHANGE); + m_message.SendMsg(EM_SETOLECALLBACK, 0, (LPARAM)&reOleCallback2); - int showToolbar = dat->pContainer->dwFlags & CNT_HIDETOOLBAR ? 0 : 1; - BOOL bBottomToolbar = dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR ? 1 : 0; - static LONG rcLogBottom; + bActualHistory = M.GetByte(m_hContact, "ActualHistory", 0); - int panelHeight = dat->Panel->getHeight() + 1; - int s_offset = 0; - bool bInfoPanel = dat->Panel->isActive(); - bool fErrorState = (dat->dwFlags & MWF_ERRORSTATE) ? true : false; + /* OnO: higligh lines to their end */ + m_log.SendMsg(EM_SETEDITSTYLE, SES_EXTENDBACKCOLOR, SES_EXTENDBACKCOLOR); - GetClientRect(GetDlgItem(hwndDlg, IDC_LOG), &rc); - GetClientRect(GetDlgItem(hwndDlg, IDC_PROTOCOL), &rcButton); + m_log.SendMsg(EM_SETLANGOPTIONS, 0, m_log.SendMsg(EM_GETLANGOPTIONS, 0, 0) & ~IMF_AUTOFONTSIZEADJUST); - if (dat->panelStatusCX == 0) - dat->panelStatusCX = 80; + // add us to the tray list (if it exists) + if (PluginConfig.g_hMenuTrayUnread != 0 && m_hContact != 0 && szProto != NULL) + UpdateTrayMenu(0, wStatus, szProto, szStatus, m_hContact, FALSE); - s_offset = 1; + m_log.SendMsg(EM_AUTOURLDETECT, TRUE, 0); + m_log.SendMsg(EM_EXLIMITTEXT, 0, 0x80000000); + + // subclassing stuff + mir_subclassWindow(m_message.GetHwnd(), MessageEditSubclassProc); + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_CONTACTPIC), AvatarSubclassProc); + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_SPLITTER), SplitterSubclassProc); + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_MULTISPLITTER), SplitterSubclassProc); + mir_subclassWindow(GetDlgItem(m_hwnd, IDC_PANELSPLITTER), SplitterSubclassProc); + + // load old messages from history (if wanted...) + cache->updateStats(TSessionStats::INIT_TIMER); + if (m_hContact) { + FindFirstEvent(); + nMax = (int)cache->getMaxMessageLength(); + } + LoadContactAvatar(); + SendMessage(m_hwnd, DM_OPTIONSAPPLIED, 0, 0); + LoadOwnAvatar(); + + // restore saved msg if any... + if (m_hContact) { + ptrW tszSavedMsg(db_get_wsa(m_hContact, SRMSGMOD, "SavedMsg")); + if (tszSavedMsg != 0) { + SETTEXTEX stx = { ST_DEFAULT, 1200 }; + m_message.SendMsg(EM_SETTEXTEX, (WPARAM)&stx, tszSavedMsg); + SendQueue::UpdateSaveAndSendButton(this); + if (pContainer->hwndActive == m_hwnd) + UpdateReadChars(); + } + } + if (newData->szInitialText) { + if (newData->isWchar) + SetDlgItemTextW(m_hwnd, IDC_MESSAGE, (wchar_t*)newData->szInitialText); + else + SetDlgItemTextA(m_hwnd, IDC_MESSAGE, newData->szInitialText); + int len = GetWindowTextLength(m_message.GetHwnd()); + PostMessage(m_message.GetHwnd(), EM_SETSEL, len, len); + if (len) + EnableSendButton(true); + } + + for (MEVENT hdbEvent = db_event_last(m_hContact); hdbEvent; hdbEvent = db_event_prev(m_hContact, hdbEvent)) { + DBEVENTINFO dbei = {}; + db_event_get(hdbEvent, &dbei); + if (dbei.eventType == EVENTTYPE_MESSAGE && !(dbei.flags & DBEF_SENT)) { + lastMessage = dbei.timestamp; + DM_UpdateLastMessage(this); + break; + } + } + + SendMessage(pContainer->hwnd, DM_QUERYCLIENTAREA, 0, (LPARAM)&rc); + { + WNDCLASS wndClass = { 0 }; + GetClassInfo(g_hInst, L"RICHEDIT50W", &wndClass); + mir_subclassWindowFull(m_log.GetHwnd(), MessageLogSubclassProc, wndClass.lpfnWndProc); + } + + SetWindowPos(m_hwnd, 0, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), newData->iActivate ? 0 : SWP_NOZORDER | SWP_NOACTIVATE); + LoadSplitter(); + ShowPicture(true); + + if (pContainer->dwFlags & CNT_CREATE_MINIMIZED || !newData->iActivate || pContainer->dwFlags & CNT_DEFERREDTABSELECT) { + iFlashIcon = PluginConfig.g_IconMsgEvent; + SetTimer(m_hwnd, TIMERID_FLASHWND, TIMEOUT_FLASHWND, NULL); + m_bCanFlashTab = true; + + DBEVENTINFO dbei = { 0 }; + dbei.eventType = EVENTTYPE_MESSAGE; + FlashOnClist(hDbEventFirst, &dbei); + + SendMessage(pContainer->hwnd, DM_SETICON, (WPARAM)this, (LPARAM)Skin_LoadIcon(SKINICON_EVENT_MESSAGE)); + pContainer->dwFlags |= CNT_NEED_UPDATETITLE; + dwFlags |= MWF_NEEDCHECKSIZE | MWF_WASBACKGROUNDCREATE | MWF_DEFERREDSCROLL; + } + + if (newData->iActivate) { + pContainer->hwndActive = m_hwnd; + ShowWindow(m_hwnd, SW_SHOW); + SetActiveWindow(m_hwnd); + SetForegroundWindow(m_hwnd); + } + else if (pContainer->dwFlags & CNT_CREATE_MINIMIZED) { + dwFlags |= MWF_DEFERREDSCROLL; + ShowWindow(m_hwnd, SW_SHOWNOACTIVATE); + pContainer->hwndActive = m_hwnd; + pContainer->dwFlags |= CNT_DEFERREDCONFIGURE; + } + PostMessage(pContainer->hwnd, DM_UPDATETITLE, m_hContact, 0); + + DM_RecalcPictureSize(); + dwLastActivity = GetTickCount() - 1000; + pContainer->dwLastActivity = dwLastActivity; + + if (hwndHPP) + mir_subclassWindow(hwndHPP, HPPKFSubclassProc); + + dwFlags &= ~MWF_INITMODE; + TABSRMM_FireEvent(m_hContact, m_hwnd, MSG_WINDOW_EVT_OPEN, 0); + + // show a popup if wanted... + if (newData->bWantPopup) { + DBEVENTINFO dbei = {}; + newData->bWantPopup = FALSE; + db_event_get(newData->hdbEvent, &dbei); + tabSRMM_ShowPopup(m_hContact, newData->hdbEvent, dbei.eventType, 0, 0, m_hwnd, cache->getActiveProto()); + } + + if (pContainer->dwFlags & CNT_CREATE_MINIMIZED) { + pContainer->dwFlags &= ~CNT_CREATE_MINIMIZED; + pContainer->hwndActive = m_hwnd; + } +} + +void CSrmmWindow::OnDestroy() +{ + memset((void*)&pContainer->mOld, -1000, sizeof(MARGINS)); + PostMessage(pContainer->hwnd, WM_SIZE, 0, 1); + if (pContainer->dwFlags & CNT_SIDEBAR) + pContainer->SideBar->removeSession(this); + cache->setWindowData(); + if (cache->isValid() && !fIsReattach && m_hContact && M.GetByte("deletetemp", 0)) + if (db_get_b(m_hContact, "CList", "NotOnList", 0)) + db_delete_contact(m_hContact); + + delete Panel; + + if (hwndContactPic) + DestroyWindow(hwndContactPic); + + if (hwndPanelPic) + DestroyWindow(hwndPanelPic); + + if (hClientIcon) + DestroyIcon(hClientIcon); + + if (hwndPanelPicParent) + DestroyWindow(hwndPanelPicParent); + + if (cache->isValid()) { // not valid means the contact was deleted + TABSRMM_FireEvent(m_hContact, m_hwnd, MSG_WINDOW_EVT_CLOSING, 0); + AddContactToFavorites(m_hContact, cache->getNick(), cache->getActiveProto(), szStatus, wStatus, + Skin_LoadProtoIcon(cache->getActiveProto(), cache->getActiveStatus()), 1, PluginConfig.g_hMenuRecent); + if (m_hContact) { + if (!fEditNotesActive) { + char *msg = Message_GetFromStream(m_message.GetHwnd(), SF_TEXT); + if (msg) { + db_set_utf(m_hContact, SRMSGMOD, "SavedMsg", msg); + mir_free(msg); + } + else db_unset(m_hContact, SRMSGMOD, "SavedMsg"); + } + else SendMessage(m_hwnd, WM_COMMAND, IDC_PIC, 0); + } + } + + if (nTypeMode == PROTOTYPE_SELFTYPING_ON) + DM_NotifyTyping(PROTOTYPE_SELFTYPING_OFF); + + DM_FreeTheme(); + + mir_free(sendBuffer); + mir_free(hHistoryEvents); + + // search the sendqueue for unfinished send jobs and mir_free them. Leave unsent + // messages in the queue as they can be acked later + { + SendJob *jobs = sendQueue->getJobByIndex(0); + + for (int i = 0; i < SendQueue::NR_SENDJOBS; i++) { + if (jobs[i].hContact == m_hContact) { + if (jobs[i].iStatus >(unsigned)SendQueue::SQ_INPROGRESS) + sendQueue->clearJob(i); + + // unfinished jobs which did not yet return anything are kept in the queue. + // the hwndOwner is set to 0 because the window handle is now no longer valid. + // Response for such a job is still silently handled by AckMessage() (sendqueue.c) + if (jobs[i].iStatus == (unsigned)SendQueue::SQ_INPROGRESS) + jobs[i].hOwnerWnd = 0; + } + } + } + + mir_free(hQueuedEvents); + + if (hSmileyIcon) + DestroyIcon(hSmileyIcon); + + if (hXStatusIcon) + DestroyIcon(hXStatusIcon); + + if (hwndTip) + DestroyWindow(hwndTip); + + if (hTaskbarIcon) + DestroyIcon(hTaskbarIcon); + + UpdateTrayMenuState(this, FALSE); // remove me from the tray menu (if still there) + if (PluginConfig.g_hMenuTrayUnread) + DeleteMenu(PluginConfig.g_hMenuTrayUnread, m_hContact, MF_BYCOMMAND); + M.RemoveWindow(m_hwnd); + + if (cache->isValid()) + db_set_dw(0, SRMSGMOD, "multisplit", multiSplitterX); + + { + int i = GetTabIndexFromHWND(m_hwndParent, m_hwnd); + if (i >= 0) { + SendMessage(m_hwndParent, WM_USER + 100, 0, 0); // remove tooltip + TabCtrl_DeleteItem(m_hwndParent, i); + BroadCastContainer(pContainer, DM_REFRESHTABINDEX, 0, 0); + iTabID = -1; + } + } + + TABSRMM_FireEvent(m_hContact, m_hwnd, MSG_WINDOW_EVT_CLOSE, 0); + + // clean up IEView and H++ log windows + if (hwndIEView != 0) { + IEVIEWWINDOW ieWindow; + ieWindow.cbSize = sizeof(IEVIEWWINDOW); + ieWindow.iType = IEW_DESTROY; + ieWindow.hwnd = hwndIEView; + CallService(MS_IEVIEW_WINDOW, 0, (LPARAM)&ieWindow); + } + if (hwndHPP) { + IEVIEWWINDOW ieWindow; + ieWindow.cbSize = sizeof(IEVIEWWINDOW); + ieWindow.iType = IEW_DESTROY; + ieWindow.hwnd = hwndHPP; + CallService(MS_HPP_EG_WINDOW, 0, (LPARAM)&ieWindow); + } + if (pWnd) { + delete pWnd; + pWnd = 0; + } + if (sbCustom) { + delete sbCustom; + sbCustom = 0; + } +} + +///////////////////////////////////////////////////////////////////////////////////////// +// resizer proc for the "new" layout. + +int CSrmmWindow::Resizer(UTILRESIZECONTROL *urc) +{ + int panelHeight = Panel->getHeight() + 1; + + bool bInfoPanel = Panel->isActive(); + bool bErrorState = (dwFlags & MWF_ERRORSTATE) != 0; + bool bShowToolbar = (pContainer->dwFlags & CNT_HIDETOOLBAR) == 0; + bool bBottomToolbar = (pContainer->dwFlags & CNT_BOTTOMTOOLBAR) != 0; + + RECT rc, rcButton; + GetClientRect(m_log.GetHwnd(), &rc); + GetClientRect(GetDlgItem(m_hwnd, IDC_PROTOCOL), &rcButton); + + if (panelStatusCX == 0) + panelStatusCX = 80; switch (urc->wId) { case IDC_PANELSPLITTER: @@ -966,14 +1379,14 @@ static int MessageDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * return RD_ANCHORX_WIDTH | RD_ANCHORY_TOP; case IDC_LOG: - if (dat->dwFlags & MWF_ERRORSTATE) + if (dwFlags & MWF_ERRORSTATE) urc->rcItem.bottom -= ERRORPANEL_HEIGHT; - if (dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED || dat->bNotOnList) + if (dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED || bNotOnList) urc->rcItem.bottom -= 20; - if (dat->sendMode & SMODE_MULTIPLE) - urc->rcItem.right -= (dat->multiSplitterX + 3); - urc->rcItem.bottom -= dat->splitterY - dat->originalSplitterY; - if (!showToolbar || bBottomToolbar) + if (sendMode & SMODE_MULTIPLE) + urc->rcItem.right -= (multiSplitterX + 3); + urc->rcItem.bottom -= splitterY - originalSplitterY; + if (!bShowToolbar || bBottomToolbar) urc->rcItem.bottom += 21; if (bInfoPanel) urc->rcItem.top += panelHeight; @@ -991,53 +1404,52 @@ static int MessageDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * return RD_ANCHORX_WIDTH | RD_ANCHORY_HEIGHT; case IDC_CONTACTPIC: - GetClientRect(GetDlgItem(hwndDlg, IDC_MESSAGE), &rc); - urc->rcItem.top -= dat->splitterY - dat->originalSplitterY; - urc->rcItem.left = urc->rcItem.right - (dat->pic.cx + 2); - if ((urc->rcItem.bottom - urc->rcItem.top) < (dat->pic.cy/* + 2*/) && dat->bShowAvatar) { - urc->rcItem.top = urc->rcItem.bottom - dat->pic.cy; - dat->bUseOffset = true; + GetClientRect(GetDlgItem(m_hwnd, IDC_MESSAGE), &rc); + urc->rcItem.top -= splitterY - originalSplitterY; + urc->rcItem.left = urc->rcItem.right - (pic.cx + 2); + if ((urc->rcItem.bottom - urc->rcItem.top) < (pic.cy/* + 2*/) && bShowAvatar) { + urc->rcItem.top = urc->rcItem.bottom - pic.cy; + bUseOffset = true; } - else dat->bUseOffset = false; + else bUseOffset = false; - if (showToolbar && bBottomToolbar && (PluginConfig.m_bAlwaysFullToolbarWidth || ((dat->pic.cy - DPISCALEY_S(6)) < rc.bottom))) { + if (bShowToolbar && bBottomToolbar && (PluginConfig.m_bAlwaysFullToolbarWidth || ((pic.cy - DPISCALEY_S(6)) < rc.bottom))) { urc->rcItem.bottom -= DPISCALEY_S(22); - if (dat->bIsAutosizingInput) { + if (bIsAutosizingInput) { urc->rcItem.left--; urc->rcItem.top--; } } - if (dat->hwndContactPic) //if Panel control was created? - SetWindowPos(dat->hwndContactPic, HWND_TOP, 1, ((urc->rcItem.bottom - urc->rcItem.top) - (dat->pic.cy)) / 2 + 1, //resizes it - dat->pic.cx - 2, dat->pic.cy - 2, SWP_SHOWWINDOW); + if (hwndContactPic) //if Panel control was created? + SetWindowPos(hwndContactPic, HWND_TOP, 1, ((urc->rcItem.bottom - urc->rcItem.top) - (pic.cy)) / 2 + 1, //resizes it + pic.cx - 2, pic.cy - 2, SWP_SHOWWINDOW); return RD_ANCHORX_RIGHT | RD_ANCHORY_BOTTOM; case IDC_SPLITTER: urc->rcItem.right = urc->dlgNewSize.cx; - urc->rcItem.top -= dat->splitterY - dat->originalSplitterY; + urc->rcItem.top -= splitterY - originalSplitterY; urc->rcItem.bottom = urc->rcItem.top + 2; OffsetRect(&urc->rcItem, 0, 1); urc->rcItem.left = 0; - if (dat->bUseOffset) - urc->rcItem.right -= (dat->pic.cx); // + DPISCALEX(2)); + if (bUseOffset) + urc->rcItem.right -= (pic.cx); // + DPISCALEX(2)); return RD_ANCHORX_CUSTOM | RD_ANCHORY_BOTTOM; case IDC_MESSAGE: urc->rcItem.right = urc->dlgNewSize.cx; - if (dat->bShowAvatar) - urc->rcItem.right -= dat->pic.cx + 2; - urc->rcItem.top -= dat->splitterY - dat->originalSplitterY; - if (bBottomToolbar&&showToolbar) + if (bShowAvatar) + urc->rcItem.right -= pic.cx + 2; + urc->rcItem.top -= splitterY - originalSplitterY; + if (bBottomToolbar && bShowToolbar) urc->rcItem.bottom -= DPISCALEY_S(22); - if (dat->bIsAutosizingInput) + if (bIsAutosizingInput) urc->rcItem.top -= DPISCALEY_S(1); msgTop = urc->rcItem.top; - msgBottom = urc->rcItem.bottom; if (CSkin::m_skinEnabled) { CSkinItem *item = &SkinItems[ID_EXTBKINPUTAREA]; if (!item->IGNORED) { @@ -1052,8 +1464,8 @@ static int MessageDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * case IDC_MULTISPLITTER: if (bInfoPanel) urc->rcItem.top += panelHeight; - urc->rcItem.left -= dat->multiSplitterX; - urc->rcItem.right -= dat->multiSplitterX; + urc->rcItem.left -= multiSplitterX; + urc->rcItem.right -= multiSplitterX; urc->rcItem.bottom = rcLogBottom; return RD_ANCHORX_RIGHT | RD_ANCHORY_HEIGHT; @@ -1061,7 +1473,7 @@ static int MessageDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * urc->rcItem.right = urc->dlgNewSize.cx - 50; urc->rcItem.bottom = msgTop - (bBottomToolbar ? 0 : 28); urc->rcItem.top = msgTop - 16 - (bBottomToolbar ? 0 : 28); - if (!showToolbar && !bBottomToolbar) { + if (!bShowToolbar && !bBottomToolbar) { urc->rcItem.bottom += 21; urc->rcItem.top += 21; } @@ -1072,7 +1484,7 @@ static int MessageDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * urc->rcItem.top = msgTop - 18 - (bBottomToolbar ? 0 : 28); urc->rcItem.right = urc->dlgNewSize.cx - 28; urc->rcItem.left = urc->rcItem.right - 20; - if (!showToolbar && !bBottomToolbar) { + if (!bShowToolbar && !bBottomToolbar) { urc->rcItem.bottom += 21; urc->rcItem.top += 21; } @@ -1083,7 +1495,7 @@ static int MessageDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * urc->rcItem.top = msgTop - 18 - (bBottomToolbar ? 0 : 28); urc->rcItem.right = urc->dlgNewSize.cx - 4; urc->rcItem.left = urc->rcItem.right - 20; - if (!showToolbar && !bBottomToolbar) { + if (!bShowToolbar && !bBottomToolbar) { urc->rcItem.bottom += 21; urc->rcItem.top += 21; } @@ -1095,11 +1507,11 @@ static int MessageDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * case IDC_RETRY: case IDC_CANCELSEND: case IDC_MSGSENDLATER: - if (fErrorState) { - urc->rcItem.bottom = msgTop - 5 - (bBottomToolbar ? 0 : 28) - ((dat->bNotOnList || dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) ? 20 : 0); - urc->rcItem.top = msgTop - 25 - (bBottomToolbar ? 0 : 28) - ((dat->bNotOnList || dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) ? 20 : 0); + if (bErrorState) { + urc->rcItem.bottom = msgTop - 5 - (bBottomToolbar ? 0 : 28) - ((bNotOnList || dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) ? 20 : 0); + urc->rcItem.top = msgTop - 25 - (bBottomToolbar ? 0 : 28) - ((bNotOnList || dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) ? 20 : 0); } - if (!showToolbar && !bBottomToolbar) { + if (!bShowToolbar && !bBottomToolbar) { urc->rcItem.bottom += 21; urc->rcItem.top += 21; } @@ -1107,11 +1519,11 @@ static int MessageDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * case IDC_STATICTEXT: case IDC_STATICERRORICON: - if (fErrorState) { - urc->rcItem.bottom = msgTop - 28 - (bBottomToolbar ? 0 : 28) - ((dat->bNotOnList || dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) ? 20 : 0); - urc->rcItem.top = msgTop - 45 - (bBottomToolbar ? 0 : 28) - ((dat->bNotOnList || dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) ? 20 : 0); + if (bErrorState) { + urc->rcItem.bottom = msgTop - 28 - (bBottomToolbar ? 0 : 28) - ((bNotOnList || dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) ? 20 : 0); + urc->rcItem.top = msgTop - 45 - (bBottomToolbar ? 0 : 28) - ((bNotOnList || dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) ? 20 : 0); } - if (!showToolbar && !bBottomToolbar) { + if (!bShowToolbar && !bBottomToolbar) { urc->rcItem.bottom += 21; urc->rcItem.top += 21; } @@ -1120,319 +1532,15 @@ static int MessageDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * return RD_ANCHORX_LEFT | RD_ANCHORY_BOTTOM; } -INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +///////////////////////////////////////////////////////////////////////////////////////// +// dialog procedure + +INT_PTR CSrmmWindow::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { - TContainerData *m_pContainer = 0; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - HWND hwndTab = GetParent(hwndDlg), hwndContainer; POINT pt, tmp, cur; RECT rc; - TNewWindowData *newData; - - if (dat == 0) { - if (uMsg == WM_ACTIVATE || uMsg == WM_SETFOCUS) - return 0; - hwndContainer = NULL; - } - else { - m_pContainer = dat->pContainer; - hwndContainer = m_pContainer->hwnd; - } switch (uMsg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - newData = (TNewWindowData*)lParam; - - dat = (TWindowData*)mir_calloc(sizeof(TWindowData)); - if (newData->iTabID >= 0) { - dat->pContainer = newData->pContainer; - m_pContainer = dat->pContainer; - hwndContainer = m_pContainer->hwnd; - } - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); - - if (Utils::rtf_ctable == 0) - Utils::RTF_CTableInit(); - - dat->dwFlags |= MWF_INITMODE; - dat->bType = SESSIONTYPE_IM; - dat->fInsertMode = FALSE; - dat->fLimitedUpdate = false; - dat->Panel = new CInfoPanel(dat); - - newData->item.lParam = (LPARAM)hwndDlg; - TabCtrl_SetItem(hwndTab, newData->iTabID, &newData->item); - dat->iTabID = newData->iTabID; - dat->hwnd = hwndDlg; - - DM_ThemeChanged(dat); - - pszIDCSAVE_close = TranslateT("Close session"); - pszIDCSAVE_save = TranslateT("Save and close session"); - - dat->hContact = newData->hContact; - dat->cache = CContactCache::getContactCache(dat->hContact); - dat->cache->updateNick(); - dat->cache->setWindowData(hwndDlg, dat); - M.AddWindow(hwndDlg, dat->hContact); - BroadCastContainer(m_pContainer, DM_REFRESHTABINDEX, 0, 0); - CProxyWindow::add(dat); - dat->szProto = const_cast(dat->cache->getProto()); - dat->bIsMeta = dat->cache->isMeta(); - if (dat->bIsMeta) - dat->cache->updateMeta(); - - dat->cache->updateUIN(); - - if (dat->hContact && dat->szProto != NULL) { - dat->wStatus = db_get_w(dat->hContact, dat->szProto, "Status", ID_STATUS_OFFLINE); - wcsncpy_s(dat->szStatus, pcli->pfnGetStatusModeDescription(dat->szProto == NULL ? ID_STATUS_OFFLINE : dat->wStatus, 0), _TRUNCATE); - } - else dat->wStatus = ID_STATUS_OFFLINE; - - for (int i = 0; i < _countof(btnControls); i++) - CustomizeButton(GetDlgItem(hwndDlg, btnControls[i])); - - GetMYUIN(dat); - GetClientIcon(dat); - - CustomizeButton(CreateWindowEx(0, L"MButtonClass", L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, 0, 6, DPISCALEY_S(20), - hwndDlg, (HMENU)IDC_TOGGLESIDEBAR, g_hInst, NULL)); - dat->hwndPanelPicParent = CreateWindowEx(WS_EX_TOPMOST, L"Static", L"", SS_OWNERDRAW | WS_VISIBLE | WS_CHILD, 1, 1, 1, 1, hwndDlg, (HMENU)6000, NULL, NULL); - mir_subclassWindow(dat->hwndPanelPicParent, CInfoPanel::avatarParentSubclass); - - dat->bShowUIElements = (m_pContainer->dwFlags & CNT_HIDETOOLBAR) == 0; - dat->sendMode |= dat->hContact == 0 ? SMODE_MULTIPLE : 0; - dat->sendMode |= M.GetByte(dat->hContact, "no_ack", 0) ? SMODE_NOACK : 0; - - dat->hQueuedEvents = (MEVENT*)mir_calloc(sizeof(MEVENT)* EVENT_QUEUE_SIZE); - dat->iEventQueueSize = EVENT_QUEUE_SIZE; - dat->iCurrentQueueError = -1; - - // message history limit - // hHistoryEvents holds up to n event handles - dat->maxHistory = M.GetDword(dat->hContact, "maxhist", M.GetDword("maxhist", 0)); - dat->curHistory = 0; - if (dat->maxHistory) - dat->hHistoryEvents = (MEVENT*)mir_alloc(dat->maxHistory * sizeof(MEVENT)); - else - dat->hHistoryEvents = NULL; - - if (dat->bIsMeta) - SendMessage(hwndDlg, DM_UPDATEMETACONTACTINFO, 0, 0); - else - SendMessage(hwndDlg, DM_UPDATEWINICON, 0, 0); - dat->bTabFlash = FALSE; - dat->mayFlashTab = FALSE; - GetMyNick(dat); - - dat->multiSplitterX = (int)M.GetDword(SRMSGMOD, "multisplit", 150); - dat->nTypeMode = PROTOTYPE_SELFTYPING_OFF; - SetTimer(hwndDlg, TIMERID_TYPE, 1000, NULL); - dat->iLastEventType = 0xffffffff; - - // load log option flags... - dat->dwFlags = dat->pContainer->theme.dwFlags; - - // consider per-contact message setting overrides - if (dat->hContact && M.GetDword(dat->hContact, "mwmask", 0)) - LoadLocalFlags(dat); - - DM_InitTip(dat); - dat->Panel->getVisibility(); - - dat->dwFlagsEx |= M.GetByte(dat->hContact, "splitoverride", 0) ? MWF_SHOW_SPLITTEROVERRIDE : 0; - dat->bIsAutosizingInput = IsAutoSplitEnabled(dat); - dat->iInputAreaHeight = -1; - SetMessageLog(dat); - if (dat->hContact) - dat->Panel->loadHeight(); - - dat->bShowAvatar = GetAvatarVisibility(hwndDlg, dat); - - Utils::showDlgControl(hwndDlg, IDC_MULTISPLITTER, SW_HIDE); - - GetWindowRect(GetDlgItem(hwndDlg, IDC_SPLITTER), &rc); - pt.y = (rc.top + rc.bottom) / 2; - pt.x = 0; - ScreenToClient(hwndDlg, &pt); - dat->originalSplitterY = pt.y; - if (dat->splitterY == -1) - dat->splitterY = dat->originalSplitterY + 60; - - GetWindowRect(GetDlgItem(hwndDlg, IDC_MESSAGE), &rc); - dat->minEditBoxSize.cx = rc.right - rc.left; - dat->minEditBoxSize.cy = rc.bottom - rc.top; - - BB_InitDlgButtons(dat); - SendMessage(hwndDlg, WM_CBD_LOADICONS, 0, 0); - - 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, CSkin::IsThemed(), 0); - SendDlgItemMessage(hwndDlg, IDC_TOGGLESIDEBAR, BUTTONSETCONTAINER, (LPARAM)m_pContainer, 0); - SendDlgItemMessage(hwndDlg, IDC_TOGGLESIDEBAR, BUTTONSETASTOOLBARBUTTON, TRUE, 0); - - TABSRMM_FireEvent(dat->hContact, hwndDlg, MSG_WINDOW_EVT_OPENING, 0); - - for (int i = 0; i < _countof(tooltips); i++) - SendDlgItemMessage(hwndDlg, tooltips[i].id, BUTTONADDTOOLTIP, (WPARAM)TranslateW(tooltips[i].text), BATF_UNICODE); - - SetDlgItemText(hwndDlg, IDC_LOGFROZENTEXT, dat->bNotOnList ? TranslateT("Contact not on list. You may add it...") : - TranslateT("Auto scrolling is disabled (press F12 to enable it)")); - - SendDlgItemMessage(hwndDlg, IDC_SAVE, BUTTONADDTOOLTIP, (WPARAM)pszIDCSAVE_close, BATF_UNICODE); - SendDlgItemMessage(hwndDlg, IDC_PROTOCOL, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Click for contact menu\nClick dropdown for window settings"), BATF_UNICODE); - - SetDlgItemText(hwndDlg, IDC_RETRY, TranslateT("Retry")); - { - UINT _ctrls[] = { IDC_RETRY, IDC_CANCELSEND, IDC_MSGSENDLATER }; - for (int i = 0; i < _countof(_ctrls); i++) { - SendDlgItemMessage(hwndDlg, _ctrls[i], BUTTONSETASPUSHBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, _ctrls[i], BUTTONSETASFLATBTN, FALSE, 0); - SendDlgItemMessage(hwndDlg, _ctrls[i], BUTTONSETASTHEMEDBTN, TRUE, 0); - } - } - - SetDlgItemText(hwndDlg, IDC_CANCELSEND, TranslateT("Cancel")); - SetDlgItemText(hwndDlg, IDC_MSGSENDLATER, TranslateT("Send later")); - - SendDlgItemMessage(hwndDlg, IDC_LOG, EM_SETUNDOLIMIT, 0, 0); - SendDlgItemMessage(hwndDlg, IDC_LOG, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS | ENM_KEYEVENTS | ENM_LINK); - SendDlgItemMessage(hwndDlg, IDC_LOG, EM_SETOLECALLBACK, 0, (LPARAM)&reOleCallback); - - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETEVENTMASK, 0, ENM_REQUESTRESIZE | ENM_MOUSEEVENTS | ENM_SCROLL | ENM_KEYEVENTS | ENM_CHANGE); - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETOLECALLBACK, 0, (LPARAM)&reOleCallback2); - - dat->bActualHistory = M.GetByte(dat->hContact, "ActualHistory", 0); - - /* OnO: higligh lines to their end */ - SendDlgItemMessage(hwndDlg, IDC_LOG, EM_SETEDITSTYLE, SES_EXTENDBACKCOLOR, SES_EXTENDBACKCOLOR); - - SendDlgItemMessage(hwndDlg, IDC_LOG, EM_SETLANGOPTIONS, 0, SendDlgItemMessage(hwndDlg, IDC_LOG, EM_GETLANGOPTIONS, 0, 0) & ~IMF_AUTOFONTSIZEADJUST); - - // add us to the tray list (if it exists) - if (PluginConfig.g_hMenuTrayUnread != 0 && dat->hContact != 0 && dat->szProto != NULL) - UpdateTrayMenu(0, dat->wStatus, dat->szProto, dat->szStatus, dat->hContact, FALSE); - - SendDlgItemMessage(hwndDlg, IDC_LOG, EM_AUTOURLDETECT, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_LOG, EM_EXLIMITTEXT, 0, 0x80000000); - - // subclassing stuff - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_MESSAGE), MessageEditSubclassProc); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_CONTACTPIC), AvatarSubclassProc); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_SPLITTER), SplitterSubclassProc); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_MULTISPLITTER), SplitterSubclassProc); - mir_subclassWindow(GetDlgItem(hwndDlg, IDC_PANELSPLITTER), SplitterSubclassProc); - - // load old messages from history (if wanted...) - dat->cache->updateStats(TSessionStats::INIT_TIMER); - if (dat->hContact) { - FindFirstEvent(dat); - dat->nMax = (int)dat->cache->getMaxMessageLength(); - } - LoadContactAvatar(dat); - SendMessage(hwndDlg, DM_OPTIONSAPPLIED, 0, 0); - LoadOwnAvatar(dat); - - // restore saved msg if any... - if (dat->hContact) { - ptrW tszSavedMsg(db_get_wsa(dat->hContact, SRMSGMOD, "SavedMsg")); - if (tszSavedMsg != 0) { - SETTEXTEX stx = { ST_DEFAULT, 1200 }; - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, tszSavedMsg); - SendQueue::UpdateSaveAndSendButton(dat); - if (m_pContainer->hwndActive == hwndDlg) - UpdateReadChars(dat); - } - } - if (newData->szInitialText) { - if (newData->isWchar) - SetDlgItemTextW(hwndDlg, IDC_MESSAGE, (wchar_t*)newData->szInitialText); - else - SetDlgItemTextA(hwndDlg, IDC_MESSAGE, newData->szInitialText); - int len = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_MESSAGE)); - PostMessage(GetDlgItem(hwndDlg, IDC_MESSAGE), EM_SETSEL, len, len); - if (len) - EnableSendButton(dat, TRUE); - } - - for (MEVENT hdbEvent = db_event_last(dat->hContact); hdbEvent; hdbEvent = db_event_prev(dat->hContact, hdbEvent)) { - DBEVENTINFO dbei = {}; - db_event_get(hdbEvent, &dbei); - if (dbei.eventType == EVENTTYPE_MESSAGE && !(dbei.flags & DBEF_SENT)) { - dat->lastMessage = dbei.timestamp; - DM_UpdateLastMessage(dat); - break; - } - } - - SendMessage(hwndContainer, DM_QUERYCLIENTAREA, 0, (LPARAM)&rc); - { - WNDCLASS wndClass = { 0 }; - GetClassInfo(g_hInst, L"RICHEDIT50W", &wndClass); - mir_subclassWindowFull(GetDlgItem(hwndDlg, IDC_LOG), MessageLogSubclassProc, wndClass.lpfnWndProc); - } - - SetWindowPos(hwndDlg, 0, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), newData->iActivate ? 0 : SWP_NOZORDER | SWP_NOACTIVATE); - LoadSplitter(dat); - ShowPicture(dat, TRUE); - - if (m_pContainer->dwFlags & CNT_CREATE_MINIMIZED || !newData->iActivate || m_pContainer->dwFlags & CNT_DEFERREDTABSELECT) { - dat->iFlashIcon = PluginConfig.g_IconMsgEvent; - SetTimer(hwndDlg, TIMERID_FLASHWND, TIMEOUT_FLASHWND, NULL); - dat->mayFlashTab = true; - - DBEVENTINFO dbei = { 0 }; - dbei.eventType = EVENTTYPE_MESSAGE; - FlashOnClist(hwndDlg, dat, dat->hDbEventFirst, &dbei); - - SendMessage(hwndContainer, DM_SETICON, (WPARAM)dat, (LPARAM)Skin_LoadIcon(SKINICON_EVENT_MESSAGE)); - m_pContainer->dwFlags |= CNT_NEED_UPDATETITLE; - dat->dwFlags |= MWF_NEEDCHECKSIZE | MWF_WASBACKGROUNDCREATE | MWF_DEFERREDSCROLL; - } - - if (newData->iActivate) { - m_pContainer->hwndActive = hwndDlg; - ShowWindow(hwndDlg, SW_SHOW); - SetActiveWindow(hwndDlg); - SetForegroundWindow(hwndDlg); - } - else if (m_pContainer->dwFlags & CNT_CREATE_MINIMIZED) { - dat->dwFlags |= MWF_DEFERREDSCROLL; - ShowWindow(hwndDlg, SW_SHOWNOACTIVATE); - m_pContainer->hwndActive = hwndDlg; - m_pContainer->dwFlags |= CNT_DEFERREDCONFIGURE; - } - PostMessage(hwndContainer, DM_UPDATETITLE, dat->hContact, 0); - - DM_RecalcPictureSize(dat); - dat->dwLastActivity = GetTickCount() - 1000; - m_pContainer->dwLastActivity = dat->dwLastActivity; - - if (dat->hwndHPP) - mir_subclassWindow(dat->hwndHPP, HPPKFSubclassProc); - - dat->dwFlags &= ~MWF_INITMODE; - TABSRMM_FireEvent(dat->hContact, hwndDlg, MSG_WINDOW_EVT_OPEN, 0); - - // show a popup if wanted... - if (newData->bWantPopup) { - DBEVENTINFO dbei = {}; - newData->bWantPopup = FALSE; - db_event_get(newData->hdbEvent, &dbei); - tabSRMM_ShowPopup(dat->hContact, newData->hdbEvent, dbei.eventType, 0, 0, hwndDlg, dat->cache->getActiveProto()); - } - if (m_pContainer->dwFlags & CNT_CREATE_MINIMIZED) { - m_pContainer->dwFlags &= ~CNT_CREATE_MINIMIZED; - m_pContainer->hwndActive = hwndDlg; - return FALSE; - } - return newData->iActivate != 0; - case WM_ERASEBKGND: RECT rcClient, rcWindow; { @@ -1441,7 +1549,7 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l HBITMAP hbm, hbmOld; HANDLE hpb = 0; - GetClientRect(hwndDlg, &rcClient); + GetClientRect(m_hwnd, &rcClient); DWORD cx = rcClient.right - rcClient.left; DWORD cy = rcClient.bottom - rcClient.top; @@ -1460,19 +1568,19 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l if (CSkin::m_skinEnabled) { UINT item_ids[2] = { ID_EXTBKHISTORY, ID_EXTBKINPUTAREA }; UINT ctl_ids[2] = { IDC_LOG, IDC_MESSAGE }; - BOOL isEditNotesReason = dat->fEditNotesActive; - BOOL isSendLaterReason = (dat->sendMode & SMODE_SENDLATER); - BOOL isMultipleReason = (dat->sendMode & SMODE_MULTIPLE || dat->sendMode & SMODE_CONTAINER); + BOOL isEditNotesReason = fEditNotesActive; + BOOL isSendLaterReason = (sendMode & SMODE_SENDLATER); + BOOL isMultipleReason = (sendMode & SMODE_MULTIPLE || sendMode & SMODE_CONTAINER); - CSkin::SkinDrawBG(hwndDlg, hwndContainer, m_pContainer, &rcClient, hdcMem); + CSkin::SkinDrawBG(m_hwnd, pContainer->hwnd, pContainer, &rcClient, hdcMem); for (int i = 0; i < 2; i++) { CSkinItem *item = &SkinItems[item_ids[i]]; if (!item->IGNORED) { - GetWindowRect(GetDlgItem(hwndDlg, ctl_ids[i]), &rcWindow); + GetWindowRect(GetDlgItem(m_hwnd, ctl_ids[i]), &rcWindow); pt.x = rcWindow.left; pt.y = rcWindow.top; - ScreenToClient(hwndDlg, &pt); + ScreenToClient(m_hwnd, &pt); rc.left = pt.x - item->MARGIN_LEFT; rc.top = pt.y - item->MARGIN_TOP; rc.right = rc.left + item->MARGIN_RIGHT + (rcWindow.right - rcWindow.left) + item->MARGIN_LEFT; @@ -1491,22 +1599,22 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l if (M.isAero()) { LONG temp = rcClient.bottom; - rcClient.bottom = dat->Panel->isActive() ? dat->Panel->getHeight() + 5 : 5; + rcClient.bottom = Panel->isActive() ? Panel->getHeight() + 5 : 5; FillRect(hdcMem, &rcClient, (HBRUSH)GetStockObject(BLACK_BRUSH)); rcClient.bottom = temp; } } // draw the (new) infopanel background. Use the gradient from the statusitem. - GetClientRect(hwndDlg, &rc); - dat->Panel->renderBG(hdcMem, rc, &SkinItems[ID_EXTBKINFOPANELBG], bAero); + GetClientRect(m_hwnd, &rc); + Panel->renderBG(hdcMem, rc, &SkinItems[ID_EXTBKINFOPANELBG], bAero); // draw aero related stuff if (!CSkin::m_skinEnabled) - CSkin::RenderToolbarBG(dat, hdcMem, rcClient); + RenderToolbarBG(hdcMem, rcClient); // render info panel fields - dat->Panel->renderContent(hdcMem); + Panel->renderContent(hdcMem); if (hpb) CSkin::FinalizeBufferedPaint(hpb, &rcClient); @@ -1516,125 +1624,114 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l DeleteObject(hbm); DeleteDC(hdcMem); } - if (!dat->fLimitedUpdate) - SetAeroMargins(dat->pContainer); + if (!fLimitedUpdate) + SetAeroMargins(pContainer); } return 1; - case WM_NCPAINT: - return 0; - - 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; - case WM_SIZE: - if (!IsIconic(hwndDlg)) { - if (dat->ipFieldHeight == 0) - dat->ipFieldHeight = CInfoPanel::m_ipConfig.height2; - - if (dat->pContainer->uChildMinHeight > 0 && HIWORD(lParam) >= dat->pContainer->uChildMinHeight) { - if (dat->splitterY > HIWORD(lParam) - DPISCALEY_S(MINLOGHEIGHT)) { - dat->splitterY = HIWORD(lParam) - DPISCALEY_S(MINLOGHEIGHT); - dat->dynaSplitter = dat->splitterY - DPISCALEY_S(34); - DM_RecalcPictureSize(dat); + if (!IsIconic(m_hwnd)) { + if (ipFieldHeight == 0) + ipFieldHeight = CInfoPanel::m_ipConfig.height2; + + if (pContainer->uChildMinHeight > 0 && HIWORD(lParam) >= pContainer->uChildMinHeight) { + if (splitterY > HIWORD(lParam) - DPISCALEY_S(MINLOGHEIGHT)) { + splitterY = HIWORD(lParam) - DPISCALEY_S(MINLOGHEIGHT); + dynaSplitter = splitterY - DPISCALEY_S(34); + DM_RecalcPictureSize(); } - if (dat->splitterY < DPISCALEY_S(MINSPLITTERY)) - LoadSplitter(dat); + if (splitterY < DPISCALEY_S(MINSPLITTERY)) + LoadSplitter(); } - HBITMAP hbm = ((dat->Panel->isActive()) && m_pContainer->avatarMode != 3) ? dat->hOwnPic : (dat->ace ? dat->ace->hbmPic : PluginConfig.g_hbmUnknown); + HBITMAP hbm = ((Panel->isActive()) && pContainer->avatarMode != 3) ? hOwnPic : (ace ? ace->hbmPic : PluginConfig.g_hbmUnknown); if (hbm != 0) { BITMAP bminfo; GetObject(hbm, sizeof(bminfo), &bminfo); - CalcDynamicAvatarSize(dat, &bminfo); + CalcDynamicAvatarSize(&bminfo); } - GetClientRect(hwndDlg, &rc); + GetClientRect(m_hwnd, &rc); - Utils_ResizeDialog(hwndDlg, g_hInst, MAKEINTRESOURCEA(IDD_MSGSPLITNEW), MessageDialogResize, (LPARAM)dat); + CTabBaseDlg::DlgProc(uMsg, 0, 0); // call basic window resizer - BB_SetButtonsPos(dat); + BB_SetButtonsPos(); // size info panel fields - if (dat->Panel->isActive()) { + if (Panel->isActive()) { LONG cx = rc.right; - LONG panelHeight = dat->Panel->getHeight(); + LONG panelHeight = Panel->getHeight(); - hbm = (m_pContainer->avatarMode == 3) ? dat->hOwnPic : (dat->ace ? dat->ace->hbmPic : PluginConfig.g_hbmUnknown); + hbm = (pContainer->avatarMode == 3) ? hOwnPic : (ace ? ace->hbmPic : PluginConfig.g_hbmUnknown); double dHeight = 0, dWidth = 0; Utils::scaleAvatarHeightLimited(hbm, dWidth, dHeight, panelHeight - 2); - dat->iPanelAvatarX = (int)dWidth; - dat->iPanelAvatarY = (int)dHeight; + iPanelAvatarX = (int)dWidth; + iPanelAvatarY = (int)dHeight; rc.top = 1; - rc.left = cx - dat->iPanelAvatarX; + rc.left = cx - iPanelAvatarX; rc.bottom = panelHeight - (CSkin::m_bAvatarBorderType ? 2 : 0); rc.right = cx; - dat->rcPic = rc; + rcPic = rc; - if (dat->bShowInfoAvatar) { - SetWindowPos(dat->hwndPanelPicParent, HWND_TOP, rc.left - 2, rc.top, rc.right - rc.left, rc.bottom - rc.top + 1, 0); - ShowWindow(dat->hwndPanelPicParent, (dat->iPanelAvatarX == 0) || !dat->Panel->isActive() ? SW_HIDE : SW_SHOW); + if (bShowInfoAvatar) { + SetWindowPos(hwndPanelPicParent, HWND_TOP, rc.left - 2, rc.top, rc.right - rc.left, rc.bottom - rc.top + 1, 0); + ShowWindow(hwndPanelPicParent, (iPanelAvatarX == 0) || !Panel->isActive() ? SW_HIDE : SW_SHOW); } else { - ShowWindow(dat->hwndPanelPicParent, SW_HIDE); - dat->iPanelAvatarX = dat->iPanelAvatarY = 0; + ShowWindow(hwndPanelPicParent, SW_HIDE); + iPanelAvatarX = iPanelAvatarY = 0; } - rc.right = cx - dat->iPanelAvatarX; - rc.left = rc.right - dat->panelStatusCX; + rc.right = cx - iPanelAvatarX; + rc.left = rc.right - panelStatusCX; rc.bottom = panelHeight - 3; - rc.top = rc.bottom - dat->ipFieldHeight; - dat->rcStatus = rc; + rc.top = rc.bottom - ipFieldHeight; + rcStatus = rc; rc.left = CInfoPanel::LEFT_OFFSET_LOGO; - rc.right = cx - dat->iPanelAvatarX - (panelHeight < CInfoPanel::DEGRADE_THRESHOLD ? (dat->rcStatus.right - dat->rcStatus.left) + 3 : 0); - rc.bottom = panelHeight - (panelHeight >= CInfoPanel::DEGRADE_THRESHOLD ? dat->ipFieldHeight : 0) - 1; + rc.right = cx - iPanelAvatarX - (panelHeight < CInfoPanel::DEGRADE_THRESHOLD ? (rcStatus.right - rcStatus.left) + 3 : 0); + rc.bottom = panelHeight - (panelHeight >= CInfoPanel::DEGRADE_THRESHOLD ? ipFieldHeight : 0) - 1; rc.top = 1; - dat->rcNick = rc; + rcNick = rc; rc.left = CInfoPanel::LEFT_OFFSET_LOGO; - rc.right = cx - (dat->iPanelAvatarX + 2) - dat->panelStatusCX; + rc.right = cx - (iPanelAvatarX + 2) - panelStatusCX; rc.bottom = panelHeight - 3; - rc.top = rc.bottom - dat->ipFieldHeight; - dat->rcUIN = rc; + rc.top = rc.bottom - ipFieldHeight; + rcUIN = rc; - dat->Panel->Invalidate(); + Panel->Invalidate(); } - if (GetDlgItem(hwndDlg, IDC_CLIST) != 0) { + if (GetDlgItem(m_hwnd, IDC_CLIST) != 0) { RECT rcLog; - GetClientRect(hwndDlg, &rcClient); - GetClientRect(GetDlgItem(hwndDlg, IDC_LOG), &rcLog); + GetClientRect(m_hwnd, &rcClient); + GetClientRect(m_log.GetHwnd(), &rcLog); rc.top = 0; rc.right = rcClient.right; - rc.left = rcClient.right - dat->multiSplitterX; + rc.left = rcClient.right - multiSplitterX; rc.bottom = rcLog.bottom; - if (dat->Panel->isActive()) - rc.top += (dat->Panel->getHeight() + 1); - MoveWindow(GetDlgItem(hwndDlg, IDC_CLIST), rc.left, rc.top, rc.right - rc.left, rcLog.bottom - rcLog.top, FALSE); + if (Panel->isActive()) + rc.top += (Panel->getHeight() + 1); + MoveWindow(GetDlgItem(m_hwnd, IDC_CLIST), rc.left, rc.top, rc.right - rc.left, rcLog.bottom - rcLog.top, FALSE); } - if (dat->hwndIEView || dat->hwndHPP) - ResizeIeView(dat); + if (hwndIEView || hwndHPP) + ResizeIeView(); - DetermineMinHeight(dat); + DetermineMinHeight(); } - break; + return 0; case WM_TIMECHANGE: - PostMessage(hwndDlg, DM_OPTIONSAPPLIED, 0, 0); + PostMessage(m_hwnd, DM_OPTIONSAPPLIED, 0, 0); break; case WM_NOTIFY: - if (dat != 0 && ((NMHDR*)lParam)->hwndFrom == dat->hwndTip) { + if (this != 0 && ((NMHDR*)lParam)->hwndFrom == hwndTip) { if (((NMHDR*)lParam)->code == NM_CLICK) - SendMessage(dat->hwndTip, TTM_TRACKACTIVATE, FALSE, 0); + SendMessage(hwndTip, TTM_TRACKACTIVATE, FALSE, 0); break; } @@ -1648,118 +1745,118 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l WPARAM wp = ((MSGFILTER *)lParam)->wParam; LPARAM lp = ((MSGFILTER *)lParam)->lParam; CHARFORMAT2 cf2; - BOOL isCtrl, isShift, isAlt; - KbdState(dat, isShift, isCtrl, isAlt); + bool isCtrl, isShift, isAlt; + KbdState(isShift, isCtrl, isAlt); MSG message; - message.hwnd = hwndDlg; + message.hwnd = m_hwnd; message.message = msg; message.lParam = lp; message.wParam = wp; if (msg == WM_SYSKEYUP) { if (wp == VK_MENU) - if (!dat->fkeyProcessed && !(GetKeyState(VK_CONTROL) & 0x8000) && !(GetKeyState(VK_SHIFT) & 0x8000) && !(lp & (1 << 24))) - m_pContainer->MenuBar->autoShow(); + if (!fkeyProcessed && !(GetKeyState(VK_CONTROL) & 0x8000) && !(GetKeyState(VK_SHIFT) & 0x8000) && !(lp & (1 << 24))) + pContainer->MenuBar->autoShow(); - return _dlgReturn(hwndDlg, 0); + return _dlgReturn(m_hwnd, 0); } if ((msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN) && !(GetKeyState(VK_RMENU) & 0x8000)) { LRESULT mim_hotkey_check = CallService(MS_HOTKEY_CHECK, (WPARAM)&message, (LPARAM)TABSRMM_HK_SECTION_IM); if (mim_hotkey_check) - dat->fkeyProcessed = true; + fkeyProcessed = true; switch (mim_hotkey_check) { case TABSRMM_HK_SETUSERPREFS: - CallService(MS_TABMSG_SETUSERPREFS, dat->hContact, 0); - return _dlgReturn(hwndDlg, 1); + CallService(MS_TABMSG_SETUSERPREFS, m_hContact, 0); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_NUDGE: - SendNudge(dat); - return _dlgReturn(hwndDlg, 1); + SendNudge(); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_SENDFILE: - CallService(MS_FILE_SENDFILE, dat->hContact, 0); - return _dlgReturn(hwndDlg, 1); + CallService(MS_FILE_SENDFILE, m_hContact, 0); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_QUOTEMSG: - SendMessage(hwndDlg, WM_COMMAND, IDC_QUOTE, 0); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, WM_COMMAND, IDC_QUOTE, 0); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_USERMENU: - SendMessage(hwndDlg, WM_COMMAND, IDC_PROTOCOL, 0); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, WM_COMMAND, IDC_PROTOCOL, 0); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_SENDMENU: - SendMessage(hwndDlg, WM_COMMAND, IDC_SENDMENU, IDC_SENDMENU); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, WM_COMMAND, IDC_SENDMENU, IDC_SENDMENU); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_PROTOMENU: - SendMessage(hwndDlg, WM_COMMAND, IDC_PROTOMENU, IDC_PROTOMENU); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, WM_COMMAND, IDC_PROTOMENU, IDC_PROTOMENU); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_USERDETAILS: - SendMessage(hwndDlg, WM_COMMAND, MAKELONG(IDC_NAME, BN_CLICKED), 0); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, WM_COMMAND, MAKELONG(IDC_NAME, BN_CLICKED), 0); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_EDITNOTES: - PostMessage(hwndDlg, WM_COMMAND, MAKELONG(IDC_PIC, BN_CLICKED), 0); - return _dlgReturn(hwndDlg, 1); + PostMessage(m_hwnd, WM_COMMAND, MAKELONG(IDC_PIC, BN_CLICKED), 0); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_TOGGLESENDLATER: if (sendLater->isAvail()) { - dat->sendMode ^= SMODE_SENDLATER; - SetWindowPos(GetDlgItem(hwndDlg, IDC_MESSAGE), 0, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOZORDER | + sendMode ^= SMODE_SENDLATER; + SetWindowPos(m_message.GetHwnd(), 0, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOCOPYBITS); - RedrawWindow(hwndDlg, 0, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN); + RedrawWindow(m_hwnd, 0, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN); } else 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); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_TOGGLERTL: - dat->dwFlags ^= MWF_LOG_RTL; + dwFlags ^= MWF_LOG_RTL; { DWORD dwGlobal = M.GetDword("mwflags", MWF_LOG_DEFAULT); - DWORD dwMask = M.GetDword(dat->hContact, "mwmask", 0); - DWORD dwFlags = M.GetDword(dat->hContact, "mwflags", 0); + DWORD dwMask = M.GetDword(m_hContact, "mwmask", 0); + DWORD dwFlags = M.GetDword(m_hContact, "mwflags", 0); - if ((dwGlobal & MWF_LOG_RTL) != (dat->dwFlags & MWF_LOG_RTL)) { + if ((dwGlobal & MWF_LOG_RTL) != (dwFlags & MWF_LOG_RTL)) { dwMask |= MWF_LOG_RTL; - dwFlags |= (dat->dwFlags & MWF_LOG_RTL); + dwFlags |= (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); + db_set_dw(m_hContact, SRMSGMOD_T, "mwmask", dwMask); + db_set_dw(m_hContact, SRMSGMOD_T, "mwflags", dwFlags); } else { - db_unset(dat->hContact, SRMSGMOD_T, "mwmask"); - db_unset(dat->hContact, SRMSGMOD_T, "mwflags"); + db_unset(m_hContact, SRMSGMOD_T, "mwmask"); + db_unset(m_hContact, SRMSGMOD_T, "mwflags"); } - SendMessage(hwndDlg, DM_OPTIONSAPPLIED, 0, 0); - SendMessage(hwndDlg, DM_DEFERREDREMAKELOG, (WPARAM)hwndDlg, 0); + SendMessage(m_hwnd, DM_OPTIONSAPPLIED, 0, 0); + SendMessage(m_hwnd, DM_DEFERREDREMAKELOG, (WPARAM)m_hwnd, 0); } - return _dlgReturn(hwndDlg, 1); + return _dlgReturn(m_hwnd, 1); case TABSRMM_HK_TOGGLEMULTISEND: - dat->sendMode ^= SMODE_MULTIPLE; - if (dat->sendMode & SMODE_MULTIPLE) - DM_CreateClist(dat); - else if (IsWindow(GetDlgItem(hwndDlg, IDC_CLIST))) - DestroyWindow(GetDlgItem(hwndDlg, IDC_CLIST)); + sendMode ^= SMODE_MULTIPLE; + if (sendMode & SMODE_MULTIPLE) + DM_CreateClist(); + else if (IsWindow(GetDlgItem(m_hwnd, IDC_CLIST))) + DestroyWindow(GetDlgItem(m_hwnd, IDC_CLIST)); - HWND hwndEdit = GetDlgItem(hwndDlg, IDC_MESSAGE); + HWND hwndEdit = m_message.GetHwnd(); SetWindowPos(hwndEdit, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE); - SendMessage(hwndDlg, WM_SIZE, 0, 0); + SendMessage(m_hwnd, WM_SIZE, 0, 0); RedrawWindow(hwndEdit, NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW | RDW_ERASE); - DM_ScrollToBottom(dat, 0, 0); - Utils::showDlgControl(hwndDlg, IDC_MULTISPLITTER, (dat->sendMode & SMODE_MULTIPLE) ? SW_SHOW : SW_HIDE); - Utils::showDlgControl(hwndDlg, IDC_CLIST, (dat->sendMode & SMODE_MULTIPLE) ? SW_SHOW : SW_HIDE); - if (dat->sendMode & SMODE_MULTIPLE) - SetFocus(GetDlgItem(hwndDlg, IDC_CLIST)); + DM_ScrollToBottom(this, 0, 0); + Utils::showDlgControl(m_hwnd, IDC_MULTISPLITTER, (sendMode & SMODE_MULTIPLE) ? SW_SHOW : SW_HIDE); + Utils::showDlgControl(m_hwnd, IDC_CLIST, (sendMode & SMODE_MULTIPLE) ? SW_SHOW : SW_HIDE); + if (sendMode & SMODE_MULTIPLE) + SetFocus(GetDlgItem(m_hwnd, IDC_CLIST)); else - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); - RedrawWindow(hwndDlg, 0, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN); - return _dlgReturn(hwndDlg, 1); + SetFocus(m_message.GetHwnd()); + RedrawWindow(m_hwnd, 0, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN); + return _dlgReturn(m_hwnd, 1); } - if (DM_GenericHotkeysCheck(&message, dat)) { - dat->fkeyProcessed = true; - return _dlgReturn(hwndDlg, 1); + if (DM_GenericHotkeysCheck(&message, this)) { + fkeyProcessed = true; + return _dlgReturn(m_hwnd, 1); } } if (wp == VK_BROWSER_BACK || wp == VK_BROWSER_FORWARD) @@ -1769,10 +1866,10 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l if (isCtrl && !isShift && !isAlt) { switch (wp) { case 23: // ctrl - w - PostMessage(hwndDlg, WM_CLOSE, 1, 0); + PostMessage(m_hwnd, WM_CLOSE, 1, 0); break; case 20: // ctrl - t - PostMessage(hwndDlg, WM_COMMAND, IDC_TOGGLETOOLBAR, 1); + PostMessage(m_hwnd, WM_COMMAND, IDC_TOGGLETOOLBAR, 1); break; } return 1; @@ -1780,112 +1877,112 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l } if (msg == WM_KEYDOWN) { if ((wp == VK_INSERT && isShift && !isCtrl) || (wp == 'V' && isCtrl && !isShift && !isAlt)) { - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_PASTESPECIAL, CF_UNICODETEXT, 0); + m_message.SendMsg(EM_PASTESPECIAL, CF_UNICODETEXT, 0); _clrMsgFilter(lParam); - return _dlgReturn(hwndDlg, 1); + return _dlgReturn(m_hwnd, 1); } if (isCtrl && isShift) { if (wp == 0x9) { // ctrl-shift tab - SendMessage(hwndDlg, DM_SELECTTAB, DM_SELECT_PREV, 0); + SendMessage(m_hwnd, DM_SELECTTAB, DM_SELECT_PREV, 0); _clrMsgFilter(lParam); - return _dlgReturn(hwndDlg, 1); + return _dlgReturn(m_hwnd, 1); } } if (isCtrl && !isShift && !isAlt) { if (wp == VK_TAB) { - SendMessage(hwndDlg, DM_SELECTTAB, DM_SELECT_NEXT, 0); + SendMessage(m_hwnd, DM_SELECTTAB, DM_SELECT_NEXT, 0); _clrMsgFilter(lParam); - return _dlgReturn(hwndDlg, 1); + return _dlgReturn(m_hwnd, 1); } if (wp == VK_F4) { - PostMessage(hwndDlg, WM_CLOSE, 1, 0); - return _dlgReturn(hwndDlg, 1); + PostMessage(m_hwnd, WM_CLOSE, 1, 0); + return _dlgReturn(m_hwnd, 1); } if (wp == VK_PRIOR) { - SendMessage(hwndDlg, DM_SELECTTAB, DM_SELECT_PREV, 0); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, DM_SELECTTAB, DM_SELECT_PREV, 0); + return _dlgReturn(m_hwnd, 1); } if (wp == VK_NEXT) { - SendMessage(hwndDlg, DM_SELECTTAB, DM_SELECT_NEXT, 0); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, DM_SELECTTAB, DM_SELECT_NEXT, 0); + return _dlgReturn(m_hwnd, 1); } } } if (msg == WM_SYSKEYDOWN && isAlt) { if (wp == 0x52) { - SendMessage(hwndDlg, DM_QUERYPENDING, DM_QUERY_MOSTRECENT, 0); - return _dlgReturn(hwndDlg, 1); + SendMessage(m_hwnd, DM_QUERYPENDING, DM_QUERY_MOSTRECENT, 0); + return _dlgReturn(m_hwnd, 1); } if (wp == VK_MULTIPLY) { - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); - return _dlgReturn(hwndDlg, 1); + SetFocus(m_message.GetHwnd()); + return _dlgReturn(m_hwnd, 1); } if (wp == VK_DIVIDE) { - SetFocus(GetDlgItem(hwndDlg, IDC_LOG)); - return _dlgReturn(hwndDlg, 1); + SetFocus(m_log.GetHwnd()); + return _dlgReturn(m_hwnd, 1); } if (wp == VK_ADD) { - SendMessage(hwndContainer, DM_SELECTTAB, DM_SELECT_NEXT, 0); - return _dlgReturn(hwndDlg, 1); + SendMessage(pContainer->hwnd, DM_SELECTTAB, DM_SELECT_NEXT, 0); + return _dlgReturn(m_hwnd, 1); } if (wp == VK_SUBTRACT) { - SendMessage(hwndContainer, DM_SELECTTAB, DM_SELECT_PREV, 0); - return _dlgReturn(hwndDlg, 1); + SendMessage(pContainer->hwnd, DM_SELECTTAB, DM_SELECT_PREV, 0); + return _dlgReturn(m_hwnd, 1); } } if (msg == WM_KEYDOWN && wp == VK_F12) { if (isShift || isCtrl || isAlt) - return _dlgReturn(hwndDlg, 1); - if (dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) - SendMessage(hwndDlg, DM_REPLAYQUEUE, 0, 0); - dat->dwFlagsEx ^= MWF_SHOW_SCROLLINGDISABLED; - Utils::showDlgControl(hwndDlg, IDC_LOGFROZENTEXT, (dat->bNotOnList || dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) ? SW_SHOW : SW_HIDE); - if (!(dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED)) - SetDlgItemText(hwndDlg, IDC_LOGFROZENTEXT, TranslateT("Contact not on list. You may add it...")); + return _dlgReturn(m_hwnd, 1); + if (dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) + SendMessage(m_hwnd, DM_REPLAYQUEUE, 0, 0); + dwFlagsEx ^= MWF_SHOW_SCROLLINGDISABLED; + Utils::showDlgControl(m_hwnd, IDC_LOGFROZENTEXT, (bNotOnList || dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED) ? SW_SHOW : SW_HIDE); + if (!(dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED)) + SetDlgItemText(m_hwnd, IDC_LOGFROZENTEXT, TranslateT("Contact not on list. You may add it...")); else - SetDlgItemText(hwndDlg, IDC_LOGFROZENTEXT, TranslateT("Auto scrolling is disabled (press F12 to enable it)")); - SendMessage(hwndDlg, WM_SIZE, 0, 0); - DM_ScrollToBottom(dat, 1, 1); - return _dlgReturn(hwndDlg, 1); + SetDlgItemText(m_hwnd, IDC_LOGFROZENTEXT, TranslateT("Auto scrolling is disabled (press F12 to enable it)")); + SendMessage(m_hwnd, WM_SIZE, 0, 0); + DM_ScrollToBottom(this, 1, 1); + return _dlgReturn(m_hwnd, 1); } // tabulation mod if (msg == WM_KEYDOWN && wp == VK_TAB) { if (PluginConfig.m_bAllowTab) { if (((NMHDR*)lParam)->idFrom == IDC_MESSAGE) - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_REPLACESEL, FALSE, (LPARAM)"\t"); + m_message.SendMsg(EM_REPLACESEL, FALSE, (LPARAM)"\t"); _clrMsgFilter(lParam); if (((NMHDR*)lParam)->idFrom != IDC_MESSAGE) - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); - return _dlgReturn(hwndDlg, 1); + SetFocus(m_message.GetHwnd()); + return _dlgReturn(m_hwnd, 1); } else { if (((NMHDR*)lParam)->idFrom == IDC_MESSAGE) { - if (GetSendButtonState(hwndDlg) != PBS_DISABLED && !(dat->pContainer->dwFlags & CNT_HIDETOOLBAR)) - SetFocus(GetDlgItem(hwndDlg, IDOK)); + if (GetSendButtonState(m_hwnd) != PBS_DISABLED && !(pContainer->dwFlags & CNT_HIDETOOLBAR)) + SetFocus(GetDlgItem(m_hwnd, IDOK)); else - SetFocus(GetDlgItem(hwndDlg, IDC_LOG)); - return _dlgReturn(hwndDlg, 1); + SetFocus(m_log.GetHwnd()); + return _dlgReturn(m_hwnd, 1); } if (((NMHDR*)lParam)->idFrom == IDC_LOG) { - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); - return _dlgReturn(hwndDlg, 1); + SetFocus(m_message.GetHwnd()); + return _dlgReturn(m_hwnd, 1); } } - return _dlgReturn(hwndDlg, 0); + return _dlgReturn(m_hwnd, 0); } if (msg == WM_MOUSEWHEEL && (((NMHDR*)lParam)->idFrom == IDC_LOG || ((NMHDR*)lParam)->idFrom == IDC_MESSAGE)) { GetCursorPos(&pt); - GetWindowRect(GetDlgItem(hwndDlg, IDC_LOG), &rc); + GetWindowRect(m_log.GetHwnd(), &rc); if (PtInRect(&rc, pt)) { short wDirection = (short)HIWORD(wp); if (LOWORD(wp) & MK_SHIFT) { if (wDirection < 0) - SendDlgItemMessage(hwndDlg, IDC_LOG, WM_VSCROLL, MAKEWPARAM(SB_PAGEDOWN, 0), 0); + m_log.SendMsg(WM_VSCROLL, MAKEWPARAM(SB_PAGEDOWN, 0), 0); else if (wDirection > 0) - SendDlgItemMessage(hwndDlg, IDC_LOG, WM_VSCROLL, MAKEWPARAM(SB_PAGEUP, 0), 0); + m_log.SendMsg(WM_VSCROLL, MAKEWPARAM(SB_PAGEUP, 0), 0); return 0; } return 0; @@ -1895,56 +1992,56 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l if (msg == WM_CHAR && wp == 'c') { if (isCtrl) { - SendDlgItemMessage(hwndDlg, ((NMHDR*)lParam)->code, WM_COPY, 0, 0); + SendDlgItemMessage(m_hwnd, ((NMHDR*)lParam)->code, WM_COPY, 0, 0); break; } } if ((msg == WM_LBUTTONDOWN || msg == WM_KEYUP || msg == WM_LBUTTONUP) && ((NMHDR*)lParam)->idFrom == IDC_MESSAGE) { - int bBold = IsDlgButtonChecked(hwndDlg, IDC_FONTBOLD); - int bItalic = IsDlgButtonChecked(hwndDlg, IDC_FONTITALIC); - int bUnder = IsDlgButtonChecked(hwndDlg, IDC_FONTUNDERLINE); - int bStrikeout = IsDlgButtonChecked(hwndDlg, IDC_FONTSTRIKEOUT); + int bBold = IsDlgButtonChecked(m_hwnd, IDC_FONTBOLD); + int bItalic = IsDlgButtonChecked(m_hwnd, IDC_FONTITALIC); + int bUnder = IsDlgButtonChecked(m_hwnd, IDC_FONTUNDERLINE); + int bStrikeout = IsDlgButtonChecked(m_hwnd, IDC_FONTSTRIKEOUT); cf2.cbSize = sizeof(CHARFORMAT2); cf2.dwMask = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_UNDERLINETYPE | CFM_STRIKEOUT; cf2.dwEffects = 0; - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2); + m_message.SendMsg(EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2); if (cf2.dwEffects & CFE_BOLD) { if (bBold == BST_UNCHECKED) - CheckDlgButton(hwndDlg, IDC_FONTBOLD, BST_CHECKED); + CheckDlgButton(m_hwnd, IDC_FONTBOLD, BST_CHECKED); } else if (bBold == BST_CHECKED) - CheckDlgButton(hwndDlg, IDC_FONTBOLD, BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_FONTBOLD, BST_UNCHECKED); if (cf2.dwEffects & CFE_ITALIC) { if (bItalic == BST_UNCHECKED) - CheckDlgButton(hwndDlg, IDC_FONTITALIC, BST_CHECKED); + CheckDlgButton(m_hwnd, IDC_FONTITALIC, BST_CHECKED); } else if (bItalic == BST_CHECKED) - CheckDlgButton(hwndDlg, IDC_FONTITALIC, BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_FONTITALIC, BST_UNCHECKED); if (cf2.dwEffects & CFE_UNDERLINE && (cf2.bUnderlineType & CFU_UNDERLINE || cf2.bUnderlineType & CFU_UNDERLINEWORD)) { if (bUnder == BST_UNCHECKED) - CheckDlgButton(hwndDlg, IDC_FONTUNDERLINE, BST_CHECKED); + CheckDlgButton(m_hwnd, IDC_FONTUNDERLINE, BST_CHECKED); } else if (bUnder == BST_CHECKED) - CheckDlgButton(hwndDlg, IDC_FONTUNDERLINE, BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_FONTUNDERLINE, BST_UNCHECKED); if (cf2.dwEffects & CFE_STRIKEOUT) { if (bStrikeout == BST_UNCHECKED) - CheckDlgButton(hwndDlg, IDC_FONTSTRIKEOUT, BST_CHECKED); + CheckDlgButton(m_hwnd, IDC_FONTSTRIKEOUT, BST_CHECKED); } else if (bStrikeout == BST_CHECKED) - CheckDlgButton(hwndDlg, IDC_FONTSTRIKEOUT, BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_FONTSTRIKEOUT, BST_UNCHECKED); } switch (msg) { case WM_LBUTTONDOWN: { HCURSOR hCur = GetCursor(); - m_pContainer->MenuBar->Cancel(); + 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); + SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, TRUE); return TRUE; } } @@ -1958,7 +2055,7 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l case WM_LBUTTONUP: if (((NMHDR*)lParam)->idFrom == IDC_LOG && M.GetByte("autocopy", 1)) { CHARRANGE cr; - SendDlgItemMessage(hwndDlg, IDC_LOG, EM_EXGETSEL, 0, (LPARAM)&cr); + m_log.SendMsg(EM_EXGETSEL, 0, (LPARAM)&cr); if (cr.cpMax == cr.cpMin) break; cr.cpMin = cr.cpMax; @@ -1966,32 +2063,32 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l SETTEXTEX stx = { ST_KEEPUNDO | ST_SELECTION, CP_UTF8 }; char *streamOut = NULL; if (isAlt) - streamOut = Message_GetFromStream(GetDlgItem(hwndDlg, IDC_LOG), SF_RTFNOOBJS | SFF_PLAINRTF | SFF_SELECTION); + streamOut = Message_GetFromStream(m_log.GetHwnd(), SF_RTFNOOBJS | SFF_PLAINRTF | SFF_SELECTION); else - streamOut = Message_GetFromStream(GetDlgItem(hwndDlg, IDC_LOG), SF_TEXT | SFF_SELECTION); + streamOut = Message_GetFromStream(m_log.GetHwnd(), SF_TEXT | SFF_SELECTION); if (streamOut) { Utils::FilterEventMarkers(streamOut); - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)streamOut); + m_message.SendMsg(EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)streamOut); mir_free(streamOut); } - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); + SetFocus(m_message.GetHwnd()); } else if (!isShift) { - SendDlgItemMessage(hwndDlg, IDC_LOG, WM_COPY, 0, 0); - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); - if (m_pContainer->hwndStatus) - SendMessage(m_pContainer->hwndStatus, SB_SETTEXT, 0, (LPARAM)TranslateT("Selection copied to clipboard")); + m_log.SendMsg(WM_COPY, 0, 0); + SetFocus(m_message.GetHwnd()); + if (pContainer->hwndStatus) + SendMessage(pContainer->hwndStatus, SB_SETTEXT, 0, (LPARAM)TranslateT("Selection copied to clipboard")); } } break; case WM_RBUTTONUP: - return _dlgReturn(hwndDlg, 1); + return _dlgReturn(m_hwnd, 1); case WM_MOUSEMOVE: GetCursorPos(&pt); - DM_DismissTip(dat, pt); - dat->Panel->trackMouse(pt); + DM_DismissTip(this, pt); + Panel->trackMouse(pt); HCURSOR hCur = GetCursor(); if (hCur == LoadCursor(NULL, IDC_SIZENS) || hCur == LoadCursor(NULL, IDC_SIZEWE) || hCur == LoadCursor(NULL, IDC_SIZENESW) || hCur == LoadCursor(NULL, IDC_SIZENWSE)) @@ -2002,146 +2099,103 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l break; case EN_REQUESTRESIZE: - DM_HandleAutoSizeRequest(dat, (REQRESIZE *)lParam); + DM_HandleAutoSizeRequest(this, (REQRESIZE *)lParam); break; - - case EN_LINK: - ENLINK *pLink = (ENLINK*)lParam; - switch (pLink->msg) { - case WM_SETCURSOR: - SetCursor(PluginConfig.hCurHyperlinkHand); - SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE); - return TRUE; - - case WM_RBUTTONDOWN: - case WM_LBUTTONUP: - ptrW tszUrl(Utils::extractURLFromRichEdit((ENLINK*)lParam, GetDlgItem(hwndDlg, IDC_LOG))); - if (!IsStringValidLink(tszUrl)) - break; - - if (pLink->msg != WM_RBUTTONDOWN) { - Utils_OpenUrlW(tszUrl); - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); - break; - } - HMENU hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_CONTEXT)); - HMENU hSubMenu = GetSubMenu(hMenu, 1); - TranslateMenu(hSubMenu); - pt.x = (short)LOWORD(pLink->lParam); - pt.y = (short)HIWORD(pLink->lParam); - ClientToScreen(((NMHDR*)lParam)->hwndFrom, &pt); - switch (TrackPopupMenu(hSubMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL)) { - case IDM_OPENNEW: - Utils_OpenUrlW(tszUrl); - break; - - case IDM_OPENEXISTING: - Utils_OpenUrlW(tszUrl, false); - break; - - case IDM_COPYLINK: - Utils::CopyToClipBoard(tszUrl, hwndDlg); - break; - } - DestroyMenu(hMenu); - SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE); - return TRUE; - } } } break; case DM_TYPING: { - int preTyping = dat->nTypeSecs != 0; - dat->nTypeSecs = (int)lParam > 0 ? (int)lParam : 0; + int preTyping = nTypeSecs != 0; + nTypeSecs = (int)lParam > 0 ? (int)lParam : 0; - if (dat->nTypeSecs) - dat->bShowTyping = 0; + if (nTypeSecs) + bShowTyping = 0; - SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, preTyping); + SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, preTyping); } return TRUE; case DM_UPDATEWINICON: - if (dat->hXStatusIcon) { - DestroyIcon(dat->hXStatusIcon); - dat->hXStatusIcon = 0; + if (hXStatusIcon) { + DestroyIcon(hXStatusIcon); + hXStatusIcon = 0; } - if (LPCSTR szProto = dat->cache->getProto()) { - dat->hTabIcon = dat->hTabStatusIcon = MY_GetContactIcon(dat, "MetaiconTab"); + if (LPCSTR szProto = cache->getProto()) { + hTabIcon = hTabStatusIcon = GetMyContactIcon("MetaiconTab"); if (M.GetByte("use_xicons", 1)) - dat->hXStatusIcon = GetXStatusIcon(dat); + hXStatusIcon = GetXStatusIcon(); - SendDlgItemMessage(hwndDlg, IDC_PROTOCOL, BUTTONSETASDIMMED, (dat->dwFlagsEx & MWF_SHOW_ISIDLE) != 0, 0); - SendDlgItemMessage(hwndDlg, IDC_PROTOCOL, BM_SETIMAGE, IMAGE_ICON, (LPARAM)(dat->hXStatusIcon ? dat->hXStatusIcon : MY_GetContactIcon(dat, "MetaiconBar"))); + SendDlgItemMessage(m_hwnd, IDC_PROTOCOL, BUTTONSETASDIMMED, (dwFlagsEx & MWF_SHOW_ISIDLE) != 0, 0); + SendDlgItemMessage(m_hwnd, IDC_PROTOCOL, BM_SETIMAGE, IMAGE_ICON, (LPARAM)(hXStatusIcon ? hXStatusIcon : GetMyContactIcon("MetaiconBar"))); - if (m_pContainer->hwndActive == hwndDlg) - SendMessage(m_pContainer->hwnd, DM_SETICON, (WPARAM)dat, (LPARAM)(dat->hXStatusIcon ? dat->hXStatusIcon : dat->hTabIcon)); + if (pContainer->hwndActive == m_hwnd) + SendMessage(pContainer->hwnd, DM_SETICON, (WPARAM)this, (LPARAM)(hXStatusIcon ? hXStatusIcon : hTabIcon)); - if (dat->pWnd) - dat->pWnd->updateIcon(dat->hXStatusIcon ? dat->hXStatusIcon : dat->hTabIcon); + if (pWnd) + pWnd->updateIcon(hXStatusIcon ? hXStatusIcon : hTabIcon); } return 0; // configures the toolbar only... if lParam != 0, then it also calls // SetDialogToType() to reconfigure the message window case DM_CONFIGURETOOLBAR: - dat->bShowUIElements = m_pContainer->dwFlags & CNT_HIDETOOLBAR ? 0 : 1; + bShowUIElements = pContainer->dwFlags & CNT_HIDETOOLBAR ? 0 : 1; - SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_SPLITTER), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_SPLITTER), GWL_EXSTYLE) & ~WS_EX_STATICEDGE); + SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_SPLITTER), GWL_EXSTYLE, GetWindowLongPtr(GetDlgItem(m_hwnd, IDC_SPLITTER), GWL_EXSTYLE) & ~WS_EX_STATICEDGE); if (lParam == 1) { - GetSendFormat(dat); - SetDialogToType(hwndDlg); + GetSendFormat(); + SetDialogToType(m_hwnd); } if (lParam == 1) { - DM_RecalcPictureSize(dat); - SendMessage(hwndDlg, WM_SIZE, 0, 0); - DM_ScrollToBottom(dat, 0, 1); + DM_RecalcPictureSize(); + SendMessage(m_hwnd, WM_SIZE, 0, 0); + DM_ScrollToBottom(this, 0, 1); } return 0; case WM_CBD_LOADICONS: for (int i = 0; i < _countof(buttonicons); i++) { - SendDlgItemMessage(hwndDlg, buttonicons[i].id, BM_SETIMAGE, IMAGE_ICON, (LPARAM)*buttonicons[i].pIcon); - SendDlgItemMessage(hwndDlg, buttonicons[i].id, BUTTONSETCONTAINER, (LPARAM)m_pContainer, 0); + SendDlgItemMessage(m_hwnd, buttonicons[i].id, BM_SETIMAGE, IMAGE_ICON, (LPARAM)*buttonicons[i].pIcon); + SendDlgItemMessage(m_hwnd, buttonicons[i].id, BUTTONSETCONTAINER, (LPARAM)pContainer, 0); } - Srmm_UpdateToolbarIcons(hwndDlg); - SendMessage(hwndDlg, DM_UPDATEWINICON, 0, 0); + Srmm_UpdateToolbarIcons(m_hwnd); + SendMessage(m_hwnd, DM_UPDATEWINICON, 0, 0); return 0; case DM_OPTIONSAPPLIED: - DM_OptionsApplied(dat, wParam, lParam); + DM_OptionsApplied(wParam, lParam); return 0; case DM_UPDATETITLE: - DM_UpdateTitle(dat, wParam, lParam); + DM_UpdateTitle(wParam, lParam); return 0; case DM_UPDATESTATUSMSG: - dat->Panel->Invalidate(); + Panel->Invalidate(); return 0; case DM_OWNNICKCHANGED: - GetMyNick(dat); + GetMyNick(); return 0; case DM_ADDDIVIDER: - if (!(dat->dwFlags & MWF_DIVIDERSET) && PluginConfig.m_bUseDividers) { - if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_LOG)) > 0) { - dat->dwFlags |= MWF_DIVIDERWANTED; - dat->dwFlags |= MWF_DIVIDERSET; + if (!(dwFlags & MWF_DIVIDERSET) && PluginConfig.m_bUseDividers) { + if (GetWindowTextLength(m_log.GetHwnd()) > 0) { + dwFlags |= MWF_DIVIDERWANTED; + dwFlags |= MWF_DIVIDERSET; } } return 0; case WM_SETFOCUS: - MsgWindowUpdateState(dat, WM_SETFOCUS); - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); + MsgWindowUpdateState(WM_SETFOCUS); + SetFocus(m_message.GetHwnd()); return 1; case WM_ACTIVATE: @@ -2150,79 +2204,79 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l //fall through case WM_MOUSEACTIVATE: - MsgWindowUpdateState(dat, WM_ACTIVATE); + MsgWindowUpdateState(WM_ACTIVATE); return 1; case DM_UPDATEPICLAYOUT: - LoadContactAvatar(dat); - SendMessage(hwndDlg, WM_SIZE, 0, 0); + LoadContactAvatar(); + SendMessage(m_hwnd, WM_SIZE, 0, 0); return 0; case DM_SPLITTERGLOBALEVENT: - DM_SplitterGlobalEvent(dat, wParam, lParam); + DM_SplitterGlobalEvent(this, wParam, lParam); return 0; case DM_SPLITTERMOVED: - if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_MULTISPLITTER)) { - GetClientRect(hwndDlg, &rc); + if ((HWND)lParam == GetDlgItem(m_hwnd, IDC_MULTISPLITTER)) { + GetClientRect(m_hwnd, &rc); pt.x = wParam; pt.y = 0; - ScreenToClient(hwndDlg, &pt); - int oldSplitterX = dat->multiSplitterX; - dat->multiSplitterX = rc.right - pt.x; - if (dat->multiSplitterX < 25) - dat->multiSplitterX = 25; - - if (dat->multiSplitterX > ((rc.right - rc.left) - 80)) - dat->multiSplitterX = oldSplitterX; - SendMessage(dat->hwnd, WM_SIZE, 0, 0); - } - else if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_SPLITTER)) { - GetClientRect(hwndDlg, &rc); - rc.top += (dat->Panel->isActive() ? dat->Panel->getHeight() + 40 : 30); + ScreenToClient(m_hwnd, &pt); + int oldSplitterX = multiSplitterX; + multiSplitterX = rc.right - pt.x; + if (multiSplitterX < 25) + multiSplitterX = 25; + + if (multiSplitterX > ((rc.right - rc.left) - 80)) + multiSplitterX = oldSplitterX; + SendMessage(m_hwnd, WM_SIZE, 0, 0); + } + else if ((HWND)lParam == GetDlgItem(m_hwnd, IDC_SPLITTER)) { + GetClientRect(m_hwnd, &rc); + rc.top += (Panel->isActive() ? Panel->getHeight() + 40 : 30); pt.x = 0; pt.y = wParam; - ScreenToClient(hwndDlg, &pt); + ScreenToClient(m_hwnd, &pt); - int oldSplitterY = dat->splitterY; - int oldDynaSplitter = dat->dynaSplitter; + int oldSplitterY = splitterY; + int oldDynaSplitter = dynaSplitter; - dat->splitterY = rc.bottom - pt.y + DPISCALEY_S(23); + splitterY = rc.bottom - pt.y + DPISCALEY_S(23); // attempt to fix splitter troubles.. // hardcoded limits... better solution is possible, but this works for now int bottomtoolbarH = 0; - if (dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR) + if (pContainer->dwFlags & CNT_BOTTOMTOOLBAR) bottomtoolbarH = 22; - if (dat->splitterY < (DPISCALEY_S(MINSPLITTERY) + 5 + bottomtoolbarH)) { // min splitter size - dat->splitterY = (DPISCALEY_S(MINSPLITTERY) + 5 + bottomtoolbarH); - dat->dynaSplitter = dat->splitterY - DPISCALEY_S(34); - DM_RecalcPictureSize(dat); + if (splitterY < (DPISCALEY_S(MINSPLITTERY) + 5 + bottomtoolbarH)) { // min splitter size + splitterY = (DPISCALEY_S(MINSPLITTERY) + 5 + bottomtoolbarH); + dynaSplitter = splitterY - DPISCALEY_S(34); + DM_RecalcPictureSize(); } - else if (dat->splitterY >(rc.bottom - rc.top)) { - dat->splitterY = oldSplitterY; - dat->dynaSplitter = oldDynaSplitter; - DM_RecalcPictureSize(dat); + else if (splitterY >(rc.bottom - rc.top)) { + splitterY = oldSplitterY; + dynaSplitter = oldDynaSplitter; + DM_RecalcPictureSize(); } else { - dat->dynaSplitter = (rc.bottom - pt.y) - DPISCALEY_S(11); - DM_RecalcPictureSize(dat); + dynaSplitter = (rc.bottom - pt.y) - DPISCALEY_S(11); + DM_RecalcPictureSize(); } - CSkin::UpdateToolbarBG(dat); - SendMessage(dat->hwnd, WM_SIZE, 0, 0); + UpdateToolbarBG(); + SendMessage(m_hwnd, WM_SIZE, 0, 0); } - else if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_PANELSPLITTER)) { - GetClientRect(GetDlgItem(hwndDlg, IDC_LOG), &rc); + else if ((HWND)lParam == GetDlgItem(m_hwnd, IDC_PANELSPLITTER)) { + GetClientRect(m_log.GetHwnd(), &rc); POINT pnt = { 0, (int)wParam }; - ScreenToClient(hwndDlg, &pnt); + ScreenToClient(m_hwnd, &pnt); if ((pnt.y + 2 >= MIN_PANELHEIGHT + 2) && (pnt.y + 2 < 100) && (pnt.y + 2 < rc.bottom - 30)) - dat->Panel->setHeight(pnt.y + 2, true); + Panel->setHeight(pnt.y + 2, true); - RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE); + RedrawWindow(m_hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE); if (M.isAero()) - InvalidateRect(GetParent(hwndDlg), NULL, FALSE); + InvalidateRect(GetParent(m_hwnd), NULL, FALSE); } break; @@ -2231,54 +2285,54 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l // from ourself. otherwise, the dm_remakelog will be deferred until next window // activation (focus) case DM_DEFERREDREMAKELOG: - if ((HWND)wParam == hwndDlg) - SendMessage(hwndDlg, DM_REMAKELOG, 0, 0); + if ((HWND)wParam == m_hwnd) + SendMessage(m_hwnd, DM_REMAKELOG, 0, 0); else { - if (M.GetByte(dat->hContact, "mwoverride", 0) == 0) { - dat->dwFlags &= ~(MWF_LOG_ALL); - dat->dwFlags |= (lParam & MWF_LOG_ALL); - dat->dwFlags |= MWF_DEFERREDREMAKELOG; + if (M.GetByte(m_hContact, "mwoverride", 0) == 0) { + dwFlags &= ~(MWF_LOG_ALL); + dwFlags |= (lParam & MWF_LOG_ALL); + dwFlags |= MWF_DEFERREDREMAKELOG; } } return 0; case DM_FORCEDREMAKELOG: - if ((HWND)wParam == hwndDlg) - SendMessage(hwndDlg, DM_REMAKELOG, 0, 0); + if ((HWND)wParam == m_hwnd) + SendMessage(m_hwnd, DM_REMAKELOG, 0, 0); else { - dat->dwFlags &= ~(MWF_LOG_ALL); - dat->dwFlags |= (lParam & MWF_LOG_ALL); - dat->dwFlags |= MWF_DEFERREDREMAKELOG; + dwFlags &= ~(MWF_LOG_ALL); + dwFlags |= (lParam & MWF_LOG_ALL); + dwFlags |= MWF_DEFERREDREMAKELOG; } return 0; case DM_REMAKELOG: - dat->szMicroLf[0] = 0; - dat->lastEventTime = 0; - dat->iLastEventType = -1; - StreamInEvents(hwndDlg, dat->hDbEventFirst, -1, 0, NULL); + szMicroLf[0] = 0; + lastEventTime = 0; + iLastEventType = -1; + StreamInEvents(hDbEventFirst, -1, 0, NULL); return 0; case DM_APPENDMCEVENT: - if (dat->hContact == db_mc_getMeta(wParam) && dat->hDbEventFirst == NULL) { - dat->hDbEventFirst = lParam; - SendMessage(dat->hwnd, DM_REMAKELOG, 0, 0); + if (m_hContact == db_mc_getMeta(wParam) && hDbEventFirst == NULL) { + hDbEventFirst = lParam; + SendMessage(m_hwnd, DM_REMAKELOG, 0, 0); } - else if (dat->hContact == wParam && db_mc_isSub(wParam) && db_event_getContact(lParam) != wParam) - StreamInEvents(hwndDlg, lParam, 1, 1, NULL); + else if (m_hContact == wParam && db_mc_isSub(wParam) && db_event_getContact(lParam) != wParam) + StreamInEvents(lParam, 1, 1, NULL); return 0; case DM_APPENDTOLOG: - StreamInEvents(hwndDlg, wParam, 1, 1, NULL); + StreamInEvents(wParam, 1, 1, NULL); return 0; case DM_REPLAYQUEUE: // replays queued events after the message log has been frozen for a while - for (int i = 0; i < dat->iNextQueuedEvent; i++) - if (dat->hQueuedEvents[i] != 0) - StreamInEvents(hwndDlg, dat->hQueuedEvents[i], 1, 1, NULL); + for (int i = 0; i < iNextQueuedEvent; i++) + if (hQueuedEvents[i] != 0) + StreamInEvents(hQueuedEvents[i], 1, 1, NULL); - dat->iNextQueuedEvent = 0; - SetDlgItemText(hwndDlg, IDC_LOGFROZENTEXT, dat->bNotOnList ? TranslateT("Contact not on list. You may add it...") : + iNextQueuedEvent = 0; + SetDlgItemText(m_hwnd, IDC_LOGFROZENTEXT, bNotOnList ? TranslateT("Contact not on list. You may add it...") : TranslateT("Auto scrolling is disabled (press F12 to enable it)")); return 0; @@ -2286,12 +2340,12 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l { IEVIEWWINDOW iew = { sizeof(iew) }; iew.iType = IEW_SCROLLBOTTOM; - if (dat->hwndIEView) { - iew.hwnd = dat->hwndIEView; + if (hwndIEView) { + iew.hwnd = hwndIEView; CallService(MS_IEVIEW_WINDOW, 0, (LPARAM)&iew); } - else if (dat->hwndHPP) { - iew.hwnd = dat->hwndHPP; + else if (hwndHPP) { + iew.hwnd = hwndHPP; CallService(MS_HPP_EG_WINDOW, 0, (LPARAM)&iew); } } @@ -2300,20 +2354,20 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l case HM_DBEVENTADDED: // this is called whenever a new event has been added to the database. // this CAN be posted (some sanity checks required). - if (dat && dat->hContact) - DM_EventAdded(dat, dat->hContact, lParam); + if (this && m_hContact) + DM_EventAdded(this, m_hContact, lParam); return 0; case WM_TIMER: // timer to control info panel hovering if (wParam == TIMERID_AWAYMSG) { - KillTimer(hwndDlg, wParam); + KillTimer(m_hwnd, wParam); GetCursorPos(&pt); - if (wParam == TIMERID_AWAYMSG && dat->Panel->hitTest(pt) != CInfoPanel::HTNIRVANA) - SendMessage(hwndDlg, DM_ACTIVATETOOLTIP, 0, 0); + if (wParam == TIMERID_AWAYMSG && Panel->hitTest(pt) != CInfoPanel::HTNIRVANA) + SendMessage(m_hwnd, DM_ACTIVATETOOLTIP, 0, 0); else - dat->dwFlagsEx &= ~MWF_SHOW_AWAYMSGTIMER; + dwFlagsEx &= ~MWF_SHOW_AWAYMSGTIMER; break; } @@ -2323,23 +2377,23 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l int iIndex = wParam - TIMERID_MSGSEND; if (iIndex < SendQueue::NR_SENDJOBS) { // single sendjob timer SendJob *job = sendQueue->getJobByIndex(iIndex); - KillTimer(hwndDlg, wParam); + KillTimer(m_hwnd, wParam); mir_snwprintf(job->szErrorMsg, TranslateT("Delivery failure: %s"), TranslateT("The message send timed out")); job->iStatus = SendQueue::SQ_ERROR; - if (!nen_options.iNoSounds && !(m_pContainer->dwFlags & CNT_NOSOUND)) + if (!nen_options.iNoSounds && !(pContainer->dwFlags & CNT_NOSOUND)) SkinPlaySound("SendError"); - if (!(dat->dwFlags & MWF_ERRORSTATE)) - sendQueue->handleError(dat, iIndex); + if (!(dwFlags & MWF_ERRORSTATE)) + sendQueue->handleError(this, iIndex); break; } } else if (wParam == TIMERID_FLASHWND) { - if (dat->mayFlashTab) - FlashTab(dat, hwndTab, dat->iTabID, &dat->bTabFlash, TRUE, dat->hTabIcon); + if (m_bCanFlashTab) + FlashTab(true); break; } else if (wParam == TIMERID_TYPE) { - DM_Typing(dat); + DM_Typing(this); break; } break; @@ -2348,32 +2402,32 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l switch (wParam) { case MSGERROR_CANCEL: case MSGERROR_SENDLATER: - if (dat->dwFlags & MWF_ERRORSTATE) { - dat->cache->saveHistory(0, 0); + if (dwFlags & MWF_ERRORSTATE) { + cache->saveHistory(0, 0); if (wParam == MSGERROR_SENDLATER) - sendQueue->doSendLater(dat->iCurrentQueueError, dat); // to be implemented at a later time - dat->iOpenJobs--; + sendQueue->doSendLater(iCurrentQueueError, this); // to be implemented at a later time + iOpenJobs--; sendQueue->dec(); - if (dat->iCurrentQueueError >= 0 && dat->iCurrentQueueError < SendQueue::NR_SENDJOBS) - sendQueue->clearJob(dat->iCurrentQueueError); - dat->iCurrentQueueError = -1; - sendQueue->showErrorControls(dat, FALSE); + if (iCurrentQueueError >= 0 && iCurrentQueueError < SendQueue::NR_SENDJOBS) + sendQueue->clearJob(iCurrentQueueError); + iCurrentQueueError = -1; + sendQueue->showErrorControls(this, FALSE); if (wParam != MSGERROR_CANCEL || (wParam == MSGERROR_CANCEL && lParam == 0)) - SetDlgItemText(hwndDlg, IDC_MESSAGE, L""); - sendQueue->checkQueue(dat); - int iNextFailed = sendQueue->findNextFailed(dat); + SetDlgItemText(m_hwnd, IDC_MESSAGE, L""); + sendQueue->checkQueue(this); + int iNextFailed = sendQueue->findNextFailed(this); if (iNextFailed >= 0) - sendQueue->handleError(dat, iNextFailed); + sendQueue->handleError(this, iNextFailed); } break; case MSGERROR_RETRY: - if (dat->dwFlags & MWF_ERRORSTATE) { + if (dwFlags & MWF_ERRORSTATE) { int resent = 0; - dat->cache->saveHistory(0, 0); - if (dat->iCurrentQueueError >= 0 && dat->iCurrentQueueError < SendQueue::NR_SENDJOBS) { - SendJob *job = sendQueue->getJobByIndex(dat->iCurrentQueueError); + cache->saveHistory(0, 0); + if (iCurrentQueueError >= 0 && iCurrentQueueError < SendQueue::NR_SENDJOBS) { + SendJob *job = sendQueue->getJobByIndex(iCurrentQueueError); if (job->hSendId == 0 && job->hContact == 0) break; @@ -2382,36 +2436,36 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l } if (resent) { - SendJob *job = sendQueue->getJobByIndex(dat->iCurrentQueueError); + SendJob *job = sendQueue->getJobByIndex(iCurrentQueueError); - SetTimer(hwndDlg, TIMERID_MSGSEND + dat->iCurrentQueueError, PluginConfig.m_MsgTimeout, NULL); + SetTimer(m_hwnd, TIMERID_MSGSEND + iCurrentQueueError, PluginConfig.m_MsgTimeout, NULL); job->iStatus = SendQueue::SQ_INPROGRESS; - dat->iCurrentQueueError = -1; - sendQueue->showErrorControls(dat, FALSE); - SetDlgItemText(hwndDlg, IDC_MESSAGE, L""); - sendQueue->checkQueue(dat); + iCurrentQueueError = -1; + sendQueue->showErrorControls(this, FALSE); + SetDlgItemText(m_hwnd, IDC_MESSAGE, L""); + sendQueue->checkQueue(this); - int iNextFailed = sendQueue->findNextFailed(dat); + int iNextFailed = sendQueue->findNextFailed(this); if (iNextFailed >= 0) - sendQueue->handleError(dat, iNextFailed); + sendQueue->handleError(this, iNextFailed); } } } break; case DM_SELECTTAB: - SendMessage(hwndContainer, DM_SELECTTAB, wParam, lParam); // pass the msg to our container + SendMessage(pContainer->hwnd, DM_SELECTTAB, wParam, lParam); // pass the msg to our container return 0; case DM_SETLOCALE: - if (dat->dwFlags & MWF_WASBACKGROUNDCREATE) + if (dwFlags & MWF_WASBACKGROUNDCREATE) break; - if (m_pContainer->hwndActive == hwndDlg && PluginConfig.m_bAutoLocaleSupport && hwndContainer == GetForegroundWindow() && hwndContainer == GetActiveWindow()) { + if (pContainer->hwndActive == m_hwnd && PluginConfig.m_bAutoLocaleSupport && pContainer->hwnd == GetForegroundWindow() && pContainer->hwnd == GetActiveWindow()) { if (lParam) - dat->hkl = (HKL)lParam; + hkl = (HKL)lParam; - if (dat->hkl) - ActivateKeyboardLayout(dat->hkl, 0); + if (hkl) + ActivateKeyboardLayout(hkl, 0); } return 0; @@ -2422,7 +2476,7 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l { DWORD *pdw = (DWORD *)lParam; if (pdw) - *pdw = dat->dwTickLastEvent; + *pdw = dwTickLastEvent; } return 0; @@ -2430,7 +2484,7 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l { TContainerData **pc = (TContainerData **)lParam; if (pc) - *pc = m_pContainer; + *pc = pContainer; } return 0; @@ -2438,74 +2492,74 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l { MCONTACT *phContact = (MCONTACT*)lParam; if (phContact) - *phContact = dat->hContact; + *phContact = m_hContact; } return 0; case DM_UPDATELASTMESSAGE: - DM_UpdateLastMessage(dat); + DM_UpdateLastMessage(this); return 0; case DM_SAVESIZE: - if (dat->dwFlags & MWF_NEEDCHECKSIZE) + if (dwFlags & MWF_NEEDCHECKSIZE) lParam = 0; - dat->dwFlags &= ~MWF_NEEDCHECKSIZE; - if (dat->dwFlags & MWF_WASBACKGROUNDCREATE) { - dat->dwFlags &= ~MWF_INITMODE; - if (dat->lastMessage) - DM_UpdateLastMessage(dat); + dwFlags &= ~MWF_NEEDCHECKSIZE; + if (dwFlags & MWF_WASBACKGROUNDCREATE) { + dwFlags &= ~MWF_INITMODE; + if (lastMessage) + DM_UpdateLastMessage(this); } - SendMessage(hwndContainer, DM_QUERYCLIENTAREA, 0, (LPARAM)&rcClient); - MoveWindow(hwndDlg, rcClient.left, rcClient.top, (rcClient.right - rcClient.left), (rcClient.bottom - rcClient.top), TRUE); - if (dat->dwFlags & MWF_WASBACKGROUNDCREATE) { - dat->dwFlags &= ~MWF_WASBACKGROUNDCREATE; - SendMessage(hwndDlg, WM_SIZE, 0, 0); - PostMessage(hwndDlg, DM_UPDATEPICLAYOUT, 0, 0); + SendMessage(pContainer->hwnd, DM_QUERYCLIENTAREA, 0, (LPARAM)&rcClient); + MoveWindow(m_hwnd, rcClient.left, rcClient.top, (rcClient.right - rcClient.left), (rcClient.bottom - rcClient.top), TRUE); + if (dwFlags & MWF_WASBACKGROUNDCREATE) { + dwFlags &= ~MWF_WASBACKGROUNDCREATE; + SendMessage(m_hwnd, WM_SIZE, 0, 0); + PostMessage(m_hwnd, DM_UPDATEPICLAYOUT, 0, 0); if (PluginConfig.m_bAutoLocaleSupport) { - if (dat->hkl == 0) - DM_LoadLocale(dat); + if (hkl == 0) + DM_LoadLocale(this); else - PostMessage(hwndDlg, DM_SETLOCALE, 0, 0); + PostMessage(m_hwnd, DM_SETLOCALE, 0, 0); } - if (dat->hwndIEView != 0) - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); - if (dat->pContainer->dwFlags & CNT_SIDEBAR) - dat->pContainer->SideBar->Layout(); + if (hwndIEView != 0) + SetFocus(m_message.GetHwnd()); + if (pContainer->dwFlags & CNT_SIDEBAR) + pContainer->SideBar->Layout(); } else { - SendMessage(hwndDlg, WM_SIZE, 0, 0); + SendMessage(m_hwnd, WM_SIZE, 0, 0); if (lParam == 0) - DM_ScrollToBottom(dat, 0, 1); + DM_ScrollToBottom(this, 0, 1); } return 0; case DM_CHECKSIZE: - dat->dwFlags |= MWF_NEEDCHECKSIZE; + dwFlags |= MWF_NEEDCHECKSIZE; return 0; // sent by the message input area hotkeys. just pass it to our container case DM_QUERYPENDING: - SendMessage(hwndContainer, DM_QUERYPENDING, wParam, lParam); + SendMessage(pContainer->hwnd, DM_QUERYPENDING, wParam, lParam); return 0; case WM_LBUTTONDOWN: GetCursorPos(&tmp); cur.x = (SHORT)tmp.x; cur.y = (SHORT)tmp.y; - if (!dat->Panel->isHovered()) - SendMessage(hwndContainer, WM_NCLBUTTONDOWN, HTCAPTION, *((LPARAM*)(&cur))); + if (!Panel->isHovered()) + SendMessage(pContainer->hwnd, WM_NCLBUTTONDOWN, HTCAPTION, *((LPARAM*)(&cur))); break; case WM_LBUTTONUP: GetCursorPos(&tmp); - if (dat->Panel->isHovered()) - dat->Panel->handleClick(tmp); + if (Panel->isHovered()) + Panel->handleClick(tmp); else { cur.x = (SHORT)tmp.x; cur.y = (SHORT)tmp.y; - SendMessage(hwndContainer, WM_NCLBUTTONUP, HTCAPTION, *((LPARAM*)(&cur))); + SendMessage(pContainer->hwnd, WM_NCLBUTTONUP, HTCAPTION, *((LPARAM*)(&cur))); } break; @@ -2514,29 +2568,30 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l RECT rcPicture, rcPanelNick = { 0 }; int menuID = 0; - GetWindowRect(GetDlgItem(hwndDlg, IDC_CONTACTPIC), &rcPicture); + GetWindowRect(GetDlgItem(m_hwnd, IDC_CONTACTPIC), &rcPicture); rcPanelNick.left = rcPanelNick.right - 30; GetCursorPos(&pt); - if (dat->Panel->invokeConfigDialog(pt)) + if (Panel->invokeConfigDialog(pt)) break; if (PtInRect(&rcPicture, pt)) menuID = MENU_PICMENU; - if ((menuID == MENU_PICMENU && ((dat->ace ? dat->ace->hbmPic : PluginConfig.g_hbmUnknown) || dat->hOwnPic) && dat->bShowAvatar != 0)) { + if ((menuID == MENU_PICMENU && ((ace ? ace->hbmPic : PluginConfig.g_hbmUnknown) || hOwnPic) && bShowAvatar != 0)) { HMENU submenu = GetSubMenu(PluginConfig.g_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); + MsgWindowUpdateMenu(submenu, menuID); + + int iSelection = TrackPopupMenu(submenu, TPM_RETURNCMD, pt.x, pt.y, 0, m_hwnd, NULL); + MsgWindowMenuHandler(iSelection, menuID); break; } HMENU subMenu = GetSubMenu(PluginConfig.g_hMenuContext, 0); - MsgWindowUpdateMenu(dat, subMenu, MENU_TABCONTEXT); + MsgWindowUpdateMenu(subMenu, MENU_TABCONTEXT); - int iSelection = TrackPopupMenu(subMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL); + int iSelection = TrackPopupMenu(subMenu, TPM_RETURNCMD, pt.x, pt.y, 0, m_hwnd, NULL); if (iSelection >= IDM_CONTAINERMENU) { char szIndex[10]; char *szKey = "TAB_ContainersW"; @@ -2545,24 +2600,24 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l if (iSelection - IDM_CONTAINERMENU >= 0) { ptrW val(db_get_wsa(NULL, szKey, szIndex)); if (val) - SendMessage(hwndDlg, DM_CONTAINERSELECTED, 0, (LPARAM)val); + SendMessage(m_hwnd, DM_CONTAINERSELECTED, 0, (LPARAM)val); } break; } - MsgWindowMenuHandler(dat, iSelection, MENU_TABCONTEXT); + MsgWindowMenuHandler(iSelection, MENU_TABCONTEXT); } break; case WM_MOUSEMOVE: GetCursorPos(&pt); - DM_DismissTip(dat, pt); - dat->Panel->trackMouse(pt); + DM_DismissTip(this, pt); + Panel->trackMouse(pt); break; case WM_MEASUREITEM: { LPMEASUREITEMSTRUCT lpmi = (LPMEASUREITEMSTRUCT)lParam; - if (dat->Panel->isHovered()) { + if (Panel->isHovered()) { lpmi->itemHeight = 0; lpmi->itemWidth = 6; return TRUE; @@ -2571,36 +2626,36 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l return Menu_MeasureItem(lParam); case WM_NCHITTEST: - SendMessage(hwndContainer, WM_NCHITTEST, wParam, lParam); + SendMessage(pContainer->hwnd, WM_NCHITTEST, wParam, lParam); break; case WM_DRAWITEM: - return MsgWindowDrawHandler(wParam, lParam, dat); + return MsgWindowDrawHandler(wParam, lParam); 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); + SendMessage(pContainer->hwnd, DM_SELECTTAB, cmd == APPCOMMAND_BROWSER_BACKWARD ? DM_SELECT_PREV : DM_SELECT_NEXT, 0); return 1; } } break; case WM_COMMAND: - if (!dat) + if (!this) break; // custom button handling if (LOWORD(wParam) >= MIN_CBUTTONID && LOWORD(wParam) <= MAX_CBUTTONID) { - Srmm_ClickToolbarIcon(dat->hContact, LOWORD(wParam), GetDlgItem(hwndDlg, LOWORD(wParam)), 0); + Srmm_ClickToolbarIcon(m_hContact, LOWORD(wParam), GetDlgItem(m_hwnd, LOWORD(wParam)), 0); break; } switch (LOWORD(wParam)) { case IDOK: - if (dat->fEditNotesActive) { - SendMessage(hwndDlg, DM_ACTIVATETOOLTIP, IDC_PIC, (LPARAM)TranslateT("You are editing the user notes. Click the button again or use the hotkey (default: Alt-N) to save the notes and return to normal messaging mode")); + if (fEditNotesActive) { + SendMessage(m_hwnd, DM_ACTIVATETOOLTIP, IDC_PIC, (LPARAM)TranslateT("You are editing the user notes. Click the button again or use the hotkey (default: Alt-N) to save the notes and return to normal messaging mode")); return 0; } else { @@ -2610,14 +2665,14 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l fi.chrg.cpMin = 0; fi.chrg.cpMax = -1; fi.lpstrText = "{"; - int final_sendformat = SendDlgItemMessageA(hwndDlg, IDC_MESSAGE, EM_FINDTEXTEX, FR_DOWN, (LPARAM)&fi) == -1 ? dat->SendFormat : 0; + int final_sendformat = SendDlgItemMessageA(m_hwnd, IDC_MESSAGE, EM_FINDTEXTEX, FR_DOWN, (LPARAM)&fi) == -1 ? SendFormat : 0; fi.lpstrText = "}"; - final_sendformat = SendDlgItemMessageA(hwndDlg, IDC_MESSAGE, EM_FINDTEXTEX, FR_DOWN, (LPARAM)&fi) == -1 ? final_sendformat : 0; + final_sendformat = SendDlgItemMessageA(m_hwnd, IDC_MESSAGE, EM_FINDTEXTEX, FR_DOWN, (LPARAM)&fi) == -1 ? final_sendformat : 0; - if (GetSendButtonState(hwndDlg) == PBS_DISABLED) + if (GetSendButtonState(m_hwnd) == PBS_DISABLED) break; - ptrA streamOut(Message_GetFromStream(GetDlgItem(hwndDlg, IDC_MESSAGE), final_sendformat ? 0 : SF_TEXT)); + ptrA streamOut(Message_GetFromStream(m_message.GetHwnd(), final_sendformat ? 0 : SF_TEXT)); if (streamOut == NULL) break; @@ -2626,14 +2681,14 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l break; if (final_sendformat) - DoRtfToTags(dat, decoded, _countof(rtfDefColors), rtfDefColors); + DoRtfToTags(decoded, _countof(rtfDefColors), rtfDefColors); decoded.TrimRight(); T2Utf utfResult(decoded); size_t memRequired = mir_strlen(utfResult) + 1; // try to detect RTL - HWND hwndEdit = GetDlgItem(hwndDlg, IDC_MESSAGE); + HWND hwndEdit = m_message.GetHwnd(); SendMessage(hwndEdit, WM_SETREDRAW, FALSE, 0); PARAFORMAT2 pf2; @@ -2652,29 +2707,29 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l SendMessage(hwndEdit, EM_SETSEL, -1, -1); InvalidateRect(hwndEdit, NULL, FALSE); - if (memRequired > dat->iSendBufferSize) { - dat->sendBuffer = (char *)mir_realloc(dat->sendBuffer, memRequired); - dat->iSendBufferSize = memRequired; + if (memRequired > iSendBufferSize) { + sendBuffer = (char *)mir_realloc(sendBuffer, memRequired); + iSendBufferSize = memRequired; } - memcpy(dat->sendBuffer, (char*)utfResult, memRequired); + memcpy(sendBuffer, (char*)utfResult, memRequired); - if (memRequired == 0 || dat->sendBuffer[0] == 0) + if (memRequired == 0 || sendBuffer[0] == 0) break; - if (dat->sendMode & SMODE_CONTAINER && m_pContainer->hwndActive == hwndDlg && GetForegroundWindow() == hwndContainer) { - int tabCount = TabCtrl_GetItemCount(hwndTab); - ptrA szFromStream(Message_GetFromStream(GetDlgItem(hwndDlg, IDC_MESSAGE), dat->SendFormat ? 0 : SF_TEXT)); + if (sendMode & SMODE_CONTAINER && pContainer->hwndActive == m_hwnd && GetForegroundWindow() == pContainer->hwnd) { + int tabCount = TabCtrl_GetItemCount(m_hwndParent); + ptrA szFromStream(Message_GetFromStream(m_message.GetHwnd(), SendFormat ? 0 : SF_TEXT)); TCITEM tci = { 0 }; tci.mask = TCIF_PARAM; for (int i = 0; i < tabCount; i++) { - TabCtrl_GetItem(hwndTab, i, &tci); + TabCtrl_GetItem(m_hwndParent, i, &tci); // get the contact from the tabs lparam which hopefully is the tabs hwnd so we can get its userdata.... hopefully HWND contacthwnd = (HWND)tci.lParam; if (IsWindow(contacthwnd)) { // if the contact hwnd is the current contact then ignore it and let the normal code deal with the msg - if (contacthwnd != hwndDlg) { + if (contacthwnd != m_hwnd) { SETTEXTEX stx = { ST_DEFAULT, CP_UTF8 }; // send the buffer to the contacts msg typing area SendDlgItemMessage(contacthwnd, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)szFromStream); @@ -2684,16 +2739,16 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l } } // END /all /MOD - if (dat->nTypeMode == PROTOTYPE_SELFTYPING_ON) - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_OFF); + if (nTypeMode == PROTOTYPE_SELFTYPING_ON) + DM_NotifyTyping(PROTOTYPE_SELFTYPING_OFF); - DeletePopupsForContact(dat->hContact, PU_REMOVE_ON_SEND); + DeletePopupsForContact(m_hContact, PU_REMOVE_ON_SEND); if (M.GetByte("allow_sendhook", 0)) { - int result = TABSRMM_FireEvent(dat->hContact, hwndDlg, MSG_WINDOW_EVT_CUSTOM, MAKELONG(flags, tabMSG_WINDOW_EVT_CUSTOM_BEFORESEND)); + int result = TABSRMM_FireEvent(m_hContact, m_hwnd, MSG_WINDOW_EVT_CUSTOM, MAKELONG(flags, tabMSG_WINDOW_EVT_CUSTOM_BEFORESEND)); if (result) return TRUE; } - sendQueue->addTo(dat, memRequired, flags); + sendQueue->addTo(this, memRequired, flags); } return TRUE; @@ -2703,40 +2758,40 @@ INT_PTR CALLBACK DlgProcMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l SETTEXTEX stx = { ST_SELECTION, 1200 }; MEVENT hDBEvent = 0; - if (dat->hwndIEView || dat->hwndHPP) { // IEView quoting support.. + if (hwndIEView || hwndHPP) { // IEView quoting support.. wchar_t *selected = 0; IEVIEWEVENT event = { sizeof(event) }; - event.hContact = dat->hContact; + event.hContact = m_hContact; event.dwFlags = 0; event.iType = IEE_GET_SELECTION; - if (dat->hwndIEView) { - event.hwnd = dat->hwndIEView; + if (hwndIEView) { + event.hwnd = hwndIEView; selected = (wchar_t*)CallService(MS_IEVIEW_EVENT, 0, (LPARAM)&event); } else { - event.hwnd = dat->hwndHPP; + event.hwnd = hwndHPP; selected = (wchar_t*)CallService(MS_HPP_EG_EVENT, 0, (LPARAM)&event); } if (selected != NULL) { ptrW szQuoted(QuoteText(selected)); - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)szQuoted); + m_message.SendMsg(EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)szQuoted); break; } else { - hDBEvent = db_event_last(dat->hContact); + hDBEvent = db_event_last(m_hContact); goto quote_from_last; } } - hDBEvent = dat->hDbEventLast; + hDBEvent = hDbEventLast; quote_from_last: if (hDBEvent == NULL) break; - SendDlgItemMessage(hwndDlg, IDC_LOG, EM_EXGETSEL, 0, (LPARAM)&sel); + m_log.SendMsg(EM_EXGETSEL, 0, (LPARAM)&sel); if (sel.cpMin == sel.cpMax) { DBEVENTINFO dbei = {}; dbei.cbBlob = db_event_getBlobSize(hDBEvent); @@ -2772,72 +2827,72 @@ quote_from_last: } if (szConverted != NULL) { ptrW szQuoted(QuoteText(szConverted)); - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)szQuoted); + m_message.SendMsg(EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)szQuoted); } mir_free(szText); if (bNeedsFree) mir_free(szConverted); } else { - ptrA szFromStream(Message_GetFromStream(GetDlgItem(hwndDlg, IDC_LOG), SF_TEXT | SFF_SELECTION)); + ptrA szFromStream(Message_GetFromStream(m_log.GetHwnd(), SF_TEXT | SFF_SELECTION)); ptrW converted(mir_utf8decodeW(szFromStream)); Utils::FilterEventMarkers(converted); ptrW szQuoted(QuoteText(converted)); - SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)szQuoted); + m_message.SendMsg(EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)szQuoted); } - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); + SetFocus(m_message.GetHwnd()); } break; case IDC_ADD: { ADDCONTACTSTRUCT acs = { 0 }; - acs.hContact = dat->hContact; + acs.hContact = m_hContact; acs.handleType = HANDLE_CONTACT; acs.szProto = 0; - CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); - if (!db_get_b(dat->hContact, "CList", "NotOnList", 0)) { - dat->bNotOnList = FALSE; - ShowMultipleControls(hwndDlg, addControls, _countof(addControls), SW_HIDE); - if (!(dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED)) - Utils::showDlgControl(hwndDlg, IDC_LOGFROZENTEXT, SW_HIDE); - SendMessage(hwndDlg, WM_SIZE, 0, 0); + CallService(MS_ADDCONTACT_SHOW, (WPARAM)m_hwnd, (LPARAM)&acs); + if (!db_get_b(m_hContact, "CList", "NotOnList", 0)) { + bNotOnList = FALSE; + ShowMultipleControls(m_hwnd, addControls, _countof(addControls), SW_HIDE); + if (!(dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED)) + Utils::showDlgControl(m_hwnd, IDC_LOGFROZENTEXT, SW_HIDE); + SendMessage(m_hwnd, WM_SIZE, 0, 0); } } break; case IDC_CANCELADD: - dat->bNotOnList = FALSE; - ShowMultipleControls(hwndDlg, addControls, _countof(addControls), SW_HIDE); - if (!(dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED)) - Utils::showDlgControl(hwndDlg, IDC_LOGFROZENTEXT, SW_HIDE); - SendMessage(hwndDlg, WM_SIZE, 0, 0); + bNotOnList = FALSE; + ShowMultipleControls(m_hwnd, addControls, _countof(addControls), SW_HIDE); + if (!(dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED)) + Utils::showDlgControl(m_hwnd, IDC_LOGFROZENTEXT, SW_HIDE); + SendMessage(m_hwnd, WM_SIZE, 0, 0); break; case IDC_MESSAGE: if (HIWORD(wParam) == EN_CHANGE) { - if (m_pContainer->hwndActive == hwndDlg) - UpdateReadChars(dat); - dat->dwFlags |= MWF_NEEDHISTORYSAVE; - dat->dwLastActivity = GetTickCount(); - m_pContainer->dwLastActivity = dat->dwLastActivity; - SendQueue::UpdateSaveAndSendButton(dat); + if (pContainer->hwndActive == m_hwnd) + UpdateReadChars(); + dwFlags |= MWF_NEEDHISTORYSAVE; + dwLastActivity = GetTickCount(); + pContainer->dwLastActivity = dwLastActivity; + SendQueue::UpdateSaveAndSendButton(this); if (!(GetKeyState(VK_CONTROL) & 0x8000)) { - dat->nLastTyping = GetTickCount(); - if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_MESSAGE))) { - if (dat->nTypeMode == PROTOTYPE_SELFTYPING_OFF) { - if (!(dat->dwFlags & MWF_INITMODE)) - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_ON); + nLastTyping = GetTickCount(); + if (GetWindowTextLength(m_message.GetHwnd())) { + if (nTypeMode == PROTOTYPE_SELFTYPING_OFF) { + if (!(dwFlags & MWF_INITMODE)) + DM_NotifyTyping(PROTOTYPE_SELFTYPING_ON); } } - else if (dat->nTypeMode == PROTOTYPE_SELFTYPING_ON) - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_OFF); + else if (nTypeMode == PROTOTYPE_SELFTYPING_ON) + DM_NotifyTyping(PROTOTYPE_SELFTYPING_OFF); } } break; default: - Utils::CmdDispatcher(Utils::CMD_MSGDIALOG, hwndDlg, LOWORD(wParam), wParam, lParam, dat, m_pContainer); + Utils::CmdDispatcher(Utils::CMD_MSGDIALOG, m_hwnd, LOWORD(wParam), wParam, lParam, this, pContainer); break; } break; @@ -2846,7 +2901,7 @@ quote_from_last: { DWORD idFrom = GetDlgCtrlID((HWND)wParam); if (idFrom >= MIN_CBUTTONID && idFrom <= MAX_CBUTTONID) { - Srmm_ClickToolbarIcon(dat->hContact, idFrom, (HWND)wParam, 1); + Srmm_ClickToolbarIcon(m_hContact, idFrom, (HWND)wParam, 1); break; } } @@ -2861,11 +2916,11 @@ quote_from_last: // the "per message window" ACK hook is gone, the global ack handler cares about all types of ack's (currently // *_MESSAGE and *_AVATAR and dispatches them to the owner windows). case HM_EVENTSENT: - sendQueue->ackMessage(dat, wParam, lParam); + sendQueue->ackMessage(this, wParam, lParam); return 0; case DM_ACTIVATEME: - ActivateExistingTab(m_pContainer, hwndDlg); + ActivateExistingTab(pContainer, m_hwnd); return 0; // sent by the select container dialog box when a container was selected... @@ -2876,168 +2931,167 @@ quote_from_last: if (!mir_wstrcmp(szNewName, TranslateT("Default container"))) szNewName = CGlobals::m_default_container_name; - int iOldItems = TabCtrl_GetItemCount(hwndTab); - if (!wcsncmp(m_pContainer->szName, szNewName, CONTAINER_NAMELEN)) + int iOldItems = TabCtrl_GetItemCount(m_hwndParent); + if (!wcsncmp(pContainer->szName, szNewName, CONTAINER_NAMELEN)) break; TContainerData *pNewContainer = FindContainerByName(szNewName); if (pNewContainer == NULL) - if ((pNewContainer = CreateContainer(szNewName, FALSE, dat->hContact)) == NULL) + if ((pNewContainer = CreateContainer(szNewName, FALSE, m_hContact)) == NULL) break; - db_set_ws(dat->hContact, SRMSGMOD_T, "containerW", szNewName); - dat->fIsReattach = TRUE; - PostMessage(PluginConfig.g_hwndHotkeyHandler, DM_DOCREATETAB, (WPARAM)pNewContainer, dat->hContact); + db_set_ws(m_hContact, SRMSGMOD_T, "containerW", szNewName); + fIsReattach = TRUE; + PostMessage(PluginConfig.g_hwndHotkeyHandler, DM_DOCREATETAB, (WPARAM)pNewContainer, m_hContact); if (iOldItems > 1) // there were more than 1 tab, container is still valid - SendMessage(m_pContainer->hwndActive, WM_SIZE, 0, 0); + SendMessage(pContainer->hwndActive, WM_SIZE, 0, 0); SetForegroundWindow(pNewContainer->hwnd); SetActiveWindow(pNewContainer->hwnd); } break; case DM_STATUSBARCHANGED: - UpdateStatusBar(dat); + UpdateStatusBar(); return 0; case DM_UINTOCLIPBOARD: - Utils::CopyToClipBoard(dat->cache->getUIN(), hwndDlg); + Utils::CopyToClipBoard(cache->getUIN(), m_hwnd); return 0; // broadcasted when GLOBAL info panel setting changes case DM_SETINFOPANEL: - CInfoPanel::setPanelHandler(dat, wParam, lParam); + CInfoPanel::setPanelHandler(this, wParam, lParam); return 0; // show the balloon tooltip control. // wParam == id of the "anchor" element, defaults to the panel status field (for away msg retrieval) // lParam == new text to show case DM_ACTIVATETOOLTIP: - if (IsIconic(hwndContainer) || m_pContainer->hwndActive != hwndDlg) + if (IsIconic(pContainer->hwnd) || pContainer->hwndActive != m_hwnd) break; - dat->Panel->showTip(wParam, lParam); + Panel->showTip(wParam, lParam); break; case WM_NEXTDLGCTL: - if (dat->dwFlags & MWF_WASBACKGROUNDCREATE) + if (dwFlags & MWF_WASBACKGROUNDCREATE) return 1; break; // save the contents of the log as rtf file case DM_SAVEMESSAGELOG: - DM_SaveLogAsRTF(dat); + DM_SaveLogAsRTF(this); return 0; case DM_CHECKAUTOHIDE: - DM_CheckAutoHide(dat, wParam, lParam); + DM_CheckAutoHide(this, wParam, lParam); return 0; case DM_IEVIEWOPTIONSCHANGED: - if (dat->hwndIEView) - SendMessage(hwndDlg, DM_REMAKELOG, 0, 0); + if (hwndIEView) + SendMessage(m_hwnd, DM_REMAKELOG, 0, 0); break; case DM_SMILEYOPTIONSCHANGED: - SendMessage(hwndDlg, DM_REMAKELOG, 0, 0); + SendMessage(m_hwnd, DM_REMAKELOG, 0, 0); break; case DM_MYAVATARCHANGED: { - const char *szProto = dat->cache->getActiveProto(); + const char *szProto = cache->getActiveProto(); if (!mir_strcmp((char *)wParam, szProto) && mir_strlen(szProto) == mir_strlen((char *)wParam)) - LoadOwnAvatar(dat); + LoadOwnAvatar(); } break; case DM_GETWINDOWSTATE: { UINT state = MSG_WINDOW_STATE_EXISTS; - if (IsWindowVisible(hwndDlg)) + if (IsWindowVisible(m_hwnd)) state |= MSG_WINDOW_STATE_VISIBLE; - if (GetForegroundWindow() == hwndContainer) + if (GetForegroundWindow() == pContainer->hwnd) state |= MSG_WINDOW_STATE_FOCUS; - if (IsIconic(hwndContainer)) + if (IsIconic(pContainer->hwnd)) state |= MSG_WINDOW_STATE_ICONIC; - SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, state); + SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, state); } return TRUE; case DM_CLIENTCHANGED: - GetClientIcon(dat); - if (dat->hClientIcon && dat->Panel->isActive()) - InvalidateRect(hwndDlg, NULL, TRUE); + GetClientIcon(); + if (hClientIcon && Panel->isActive()) + InvalidateRect(m_hwnd, NULL, TRUE); return 0; case DM_UPDATEUIN: - if (dat->Panel->isActive()) - dat->Panel->Invalidate(); - if (dat->pContainer->dwFlags & CNT_UINSTATUSBAR) - UpdateStatusBar(dat); + if (Panel->isActive()) + Panel->Invalidate(); + if (pContainer->dwFlags & CNT_UINSTATUSBAR) + UpdateStatusBar(); return 0; case DM_REMOVEPOPUPS: - DeletePopupsForContact(dat->hContact, (DWORD)wParam); + DeletePopupsForContact(m_hContact, (DWORD)wParam); return 0; case EM_THEMECHANGED: - DM_FreeTheme(dat); - return DM_ThemeChanged(dat); + DM_FreeTheme(); + DM_ThemeChanged(); + return 0; case DM_PLAYINCOMINGSOUND: - if (!dat) - return 0; - PlayIncomingSound(dat); + PlayIncomingSound(); return 0; case DM_REFRESHTABINDEX: - dat->iTabID = GetTabIndexFromHWND(GetParent(hwndDlg), hwndDlg); + iTabID = GetTabIndexFromHWND(GetParent(m_hwnd), m_hwnd); return 0; case DM_STATUSICONCHANGE: - if (m_pContainer->hwndStatus) { - SendMessage(dat->pContainer->hwnd, WM_SIZE, 0, 0); - SendMessage(m_pContainer->hwndStatus, SB_SETTEXT, (WPARAM)(SBT_OWNERDRAW) | 2, 0); - InvalidateRect(m_pContainer->hwndStatus, NULL, TRUE); + if (pContainer->hwndStatus) { + SendMessage(pContainer->hwnd, WM_SIZE, 0, 0); + SendMessage(pContainer->hwndStatus, SB_SETTEXT, (WPARAM)(SBT_OWNERDRAW) | 2, 0); + InvalidateRect(pContainer->hwndStatus, NULL, TRUE); } return 0; case WM_CBD_UPDATED: if (lParam) - CB_ChangeButton(hwndDlg, dat, (CustomButtonData*)lParam); + CB_ChangeButton((CustomButtonData*)lParam); else - BB_InitDlgButtons(dat); + BB_InitDlgButtons(); - BB_SetButtonsPos(dat); + BB_SetButtonsPos(); return 0; case WM_CBD_REMOVED: if (lParam) - CB_DestroyButton(hwndDlg, dat, (DWORD)wParam, (DWORD)lParam); + CB_DestroyButton((DWORD)wParam, (DWORD)lParam); else - CB_DestroyAllButtons(hwndDlg); + CB_DestroyAllButtons(); return 0; case WM_DROPFILES: { BOOL not_sending = GetKeyState(VK_CONTROL) & 0x8000; if (!not_sending) { - const char *szProto = dat->cache->getActiveProto(); + const char *szProto = cache->getActiveProto(); if (szProto == NULL) break; int pcaps = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0); if (!(pcaps & PF1_FILESEND)) break; - if (dat->wStatus == ID_STATUS_OFFLINE) { + if (wStatus == ID_STATUS_OFFLINE) { pcaps = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0); if (!(pcaps & PF4_OFFLINEFILES)) { - SendMessage(hwndDlg, DM_ACTIVATETOOLTIP, IDC_MESSAGE, (LPARAM)TranslateT("Contact is offline and this protocol does not support sending files to offline users.")); + SendMessage(m_hwnd, DM_ACTIVATETOOLTIP, IDC_MESSAGE, (LPARAM)TranslateT("Contact is offline and this protocol does not support sending files to offline users.")); break; } } } - if (dat->hContact != NULL) { + if (m_hContact != NULL) { wchar_t szFilename[MAX_PATH]; HDROP hDrop = (HDROP)wParam; int fileCount = DragQueryFile(hDrop, -1, NULL, 0), totalCount = 0, i; @@ -3048,7 +3102,7 @@ quote_from_last: } if (!not_sending) - CallService(MS_FILE_SENDSPECIFICFILEST, dat->hContact, (LPARAM)ppFiles); + CallService(MS_FILE_SENDSPECIFICFILEST, m_hContact, (LPARAM)ppFiles); else { if (ServiceExists(MS_HTTPSERVER_ADDFILENAME)) { for (i = 0; i < totalCount; i++) { @@ -3057,8 +3111,8 @@ quote_from_last: mir_free(szFileName); } char *szHTTPText = "DEBUG"; - SendDlgItemMessageA(hwndDlg, IDC_MESSAGE, EM_REPLACESEL, TRUE, (LPARAM)szHTTPText); - SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); + SendDlgItemMessageA(m_hwnd, IDC_MESSAGE, EM_REPLACESEL, TRUE, (LPARAM)szHTTPText); + SetFocus(m_message.GetHwnd()); } } for (i = 0; ppFiles[i]; i++) @@ -3072,233 +3126,96 @@ quote_from_last: { int *uOpen = (int*)lParam; if (uOpen) - *uOpen += dat->iOpenJobs; + *uOpen += iOpenJobs; } return 0; case WM_CLOSE: // esc handles error controls if we are in error state (error controls visible) - if (wParam == 0 && lParam == 0 && dat->dwFlags & MWF_ERRORSTATE) { - SendMessage(hwndDlg, DM_ERRORDECIDED, MSGERROR_CANCEL, 0); + if (wParam == 0 && lParam == 0 && dwFlags & MWF_ERRORSTATE) { + SendMessage(m_hwnd, DM_ERRORDECIDED, MSGERROR_CANCEL, 0); return TRUE; } if (wParam == 0 && lParam == 0) { if (PluginConfig.m_EscapeCloses == 1) { - SendMessage(hwndContainer, WM_SYSCOMMAND, SC_MINIMIZE, 0); + SendMessage(pContainer->hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); return TRUE; } else if (PluginConfig.m_bHideOnClose && PluginConfig.m_EscapeCloses == 2) { - ShowWindow(hwndContainer, SW_HIDE); + ShowWindow(pContainer->hwnd, SW_HIDE); return TRUE; } - _dlgReturn(hwndDlg, TRUE); + _dlgReturn(m_hwnd, TRUE); } - if (dat) { - TContainerData *pContainer = dat->pContainer; - if (dat->iOpenJobs > 0 && lParam != 2) { - if (dat->dwFlags & MWF_ERRORSTATE) { - SendMessage(hwndDlg, DM_ERRORDECIDED, MSGERROR_CANCEL, 1); - } - else { - if (dat->dwFlagsEx & MWF_EX_WARNCLOSE) - return TRUE; - dat->dwFlagsEx |= MWF_EX_WARNCLOSE; - LRESULT result = SendQueue::WarnPendingJobs(0); - dat->dwFlagsEx &= ~MWF_EX_WARNCLOSE; - if (result == IDNO) - return TRUE; - } + if (iOpenJobs > 0 && lParam != 2) { + if (dwFlags & MWF_ERRORSTATE) { + SendMessage(m_hwnd, DM_ERRORDECIDED, MSGERROR_CANCEL, 1); } - int iTabs = TabCtrl_GetItemCount(hwndTab); + else { + if (dwFlagsEx & MWF_EX_WARNCLOSE) + return TRUE; + + dwFlagsEx |= MWF_EX_WARNCLOSE; + LRESULT result = SendQueue::WarnPendingJobs(0); + dwFlagsEx &= ~MWF_EX_WARNCLOSE; + if (result == IDNO) + return TRUE; + } + } + { + int iTabs = TabCtrl_GetItemCount(m_hwndParent); if (iTabs == 1) { - PostMessage(hwndContainer, WM_CLOSE, 0, 1); + PostMessage(pContainer->hwnd, WM_CLOSE, 0, 1); return 1; } - m_pContainer->iChilds--; - int i = GetTabIndexFromHWND(hwndTab, hwndDlg); + pContainer->iChilds--; // after closing a tab, we need to activate the tab to the left side of // the previously open tab. // normally, this tab has the same index after the deletion of the formerly active tab // unless, of course, we closed the last (rightmost) tab. - if (!m_pContainer->bDontSmartClose && iTabs > 1 && lParam != 3) { + if (!pContainer->bDontSmartClose && iTabs > 1 && lParam != 3) { + int i = GetTabIndexFromHWND(m_hwndParent, m_hwnd); if (i == iTabs - 1) i--; else i++; - TabCtrl_SetCurSel(hwndTab, i); + TabCtrl_SetCurSel(m_hwndParent, i); TCITEM item = { 0 }; item.mask = TCIF_PARAM; - TabCtrl_GetItem(hwndTab, i, &item); // retrieve dialog hwnd for the now active tab... + TabCtrl_GetItem(m_hwndParent, i, &item); // retrieve dialog hwnd for the now active tab... - m_pContainer->hwndActive = (HWND)item.lParam; + pContainer->hwndActive = (HWND)item.lParam; - SendMessage(hwndContainer, DM_QUERYCLIENTAREA, 0, (LPARAM)&rc); - SetWindowPos(m_pContainer->hwndActive, HWND_TOP, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), SWP_SHOWWINDOW); + SendMessage(pContainer->hwnd, DM_QUERYCLIENTAREA, 0, (LPARAM)&rc); + SetWindowPos(pContainer->hwndActive, HWND_TOP, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), SWP_SHOWWINDOW); ShowWindow((HWND)item.lParam, SW_SHOW); - SetForegroundWindow(m_pContainer->hwndActive); - SetFocus(m_pContainer->hwndActive); - SendMessage(hwndContainer, WM_SIZE, 0, 0); - } - - DestroyWindow(hwndDlg); - SendMessage(pContainer->hwnd, WM_SIZE, 0, 0); - } - break; - - case WM_DESTROY: - if (!dat) - break; - - if (dat->hwndContactPic) - DestroyWindow(dat->hwndContactPic); - - if (dat->hwndPanelPic) - DestroyWindow(dat->hwndPanelPic); - - if (dat->hClientIcon) - DestroyIcon(dat->hClientIcon); - - if (dat->hwndPanelPicParent) - DestroyWindow(dat->hwndPanelPicParent); - - if (dat->cache->isValid()) { // not valid means the contact was deleted - TABSRMM_FireEvent(dat->hContact, hwndDlg, MSG_WINDOW_EVT_CLOSING, 0); - AddContactToFavorites(dat->hContact, dat->cache->getNick(), dat->cache->getActiveProto(), dat->szStatus, dat->wStatus, - Skin_LoadProtoIcon(dat->cache->getActiveProto(), dat->cache->getActiveStatus()), 1, PluginConfig.g_hMenuRecent); - if (dat->hContact) { - if (!dat->fEditNotesActive) { - char *msg = Message_GetFromStream(GetDlgItem(hwndDlg, IDC_MESSAGE), SF_TEXT); - if (msg) { - db_set_utf(dat->hContact, SRMSGMOD, "SavedMsg", msg); - mir_free(msg); - } - else db_unset(dat->hContact, SRMSGMOD, "SavedMsg"); - } - else SendMessage(hwndDlg, WM_COMMAND, IDC_PIC, 0); - } - } - - if (dat->nTypeMode == PROTOTYPE_SELFTYPING_ON) - DM_NotifyTyping(dat, PROTOTYPE_SELFTYPING_OFF); - - DM_FreeTheme(dat); - - mir_free(dat->sendBuffer); - mir_free(dat->hHistoryEvents); - - // search the sendqueue for unfinished send jobs and mir_free them. Leave unsent - // messages in the queue as they can be acked later - { - SendJob *jobs = sendQueue->getJobByIndex(0); - - for (int i = 0; i < SendQueue::NR_SENDJOBS; i++) { - if (jobs[i].hContact == dat->hContact) { - if (jobs[i].iStatus > (unsigned)SendQueue::SQ_INPROGRESS) - sendQueue->clearJob(i); - - // unfinished jobs which did not yet return anything are kept in the queue. - // the hwndOwner is set to 0 because the window handle is now no longer valid. - // Response for such a job is still silently handled by AckMessage() (sendqueue.c) - if (jobs[i].iStatus == (unsigned)SendQueue::SQ_INPROGRESS) - jobs[i].hOwnerWnd = 0; - } + SetForegroundWindow(pContainer->hwndActive); + SetFocus(pContainer->hwndActive); } } - mir_free(dat->hQueuedEvents); - - if (dat->hSmileyIcon) - DestroyIcon(dat->hSmileyIcon); - - if (dat->hXStatusIcon) - DestroyIcon(dat->hXStatusIcon); - - if (dat->hwndTip) - DestroyWindow(dat->hwndTip); - - if (dat->hTaskbarIcon) - DestroyIcon(dat->hTaskbarIcon); - - UpdateTrayMenuState(dat, FALSE); // remove me from the tray menu (if still there) - if (PluginConfig.g_hMenuTrayUnread) - DeleteMenu(PluginConfig.g_hMenuTrayUnread, (UINT_PTR)dat->hContact, MF_BYCOMMAND); - M.RemoveWindow(hwndDlg); - - if (dat->cache->isValid()) - db_set_dw(0, SRMSGMOD, "multisplit", dat->multiSplitterX); - - { - int i = GetTabIndexFromHWND(hwndTab, hwndDlg); - if (i >= 0) { - SendMessage(hwndTab, WM_USER + 100, 0, 0); // remove tooltip - TabCtrl_DeleteItem(hwndTab, i); - BroadCastContainer(m_pContainer, DM_REFRESHTABINDEX, 0, 0); - dat->iTabID = -1; - } - } - - TABSRMM_FireEvent(dat->hContact, hwndDlg, MSG_WINDOW_EVT_CLOSE, 0); - - // clean up IEView and H++ log windows - if (dat->hwndIEView != 0) { - IEVIEWWINDOW ieWindow; - ieWindow.cbSize = sizeof(IEVIEWWINDOW); - ieWindow.iType = IEW_DESTROY; - ieWindow.hwnd = dat->hwndIEView; - CallService(MS_IEVIEW_WINDOW, 0, (LPARAM)&ieWindow); - } - if (dat->hwndHPP) { - IEVIEWWINDOW ieWindow; - ieWindow.cbSize = sizeof(IEVIEWWINDOW); - ieWindow.iType = IEW_DESTROY; - ieWindow.hwnd = dat->hwndHPP; - CallService(MS_HPP_EG_WINDOW, 0, (LPARAM)&ieWindow); - } - if (dat->pWnd) { - delete dat->pWnd; - dat->pWnd = 0; - } - if (dat->sbCustom) { - delete dat->sbCustom; - dat->sbCustom = 0; - } + SendMessage(pContainer->hwnd, WM_SIZE, 0, 0); break; case WM_DWMCOMPOSITIONCHANGED: - BB_RefreshTheme(dat); - memset((void*)&dat->pContainer->mOld, -1000, sizeof(MARGINS)); - CProxyWindow::verify(dat); + BB_RefreshTheme(); + memset((void*)&pContainer->mOld, -1000, sizeof(MARGINS)); + CProxyWindow::verify(this); break; case DM_FORCEREDRAW: - RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW); + RedrawWindow(m_hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW); return 0; case DM_CHECKINFOTIP: - dat->Panel->hideTip(reinterpret_cast(lParam)); + Panel->hideTip(reinterpret_cast(lParam)); return 0; - - case WM_NCDESTROY: - if (dat) { - memset((void*)&dat->pContainer->mOld, -1000, sizeof(MARGINS)); - PostMessage(dat->pContainer->hwnd, WM_SIZE, 0, 1); - if (m_pContainer->dwFlags & CNT_SIDEBAR) - m_pContainer->SideBar->removeSession(dat); - dat->cache->setWindowData(); - if (dat->cache->isValid() && !dat->fIsReattach && dat->hContact && M.GetByte("deletetemp", 0)) - if (db_get_b(dat->hContact, "CList", "NotOnList", 0)) - db_delete_contact(dat->hContact); - - delete dat->Panel; - mir_free(dat); - } - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); - break; } - return FALSE; + + return CTabBaseDlg::DlgProc(uMsg, wParam, lParam); } diff --git a/plugins/TabSRMM/src/msgdlgutils.cpp b/plugins/TabSRMM/src/msgdlgutils.cpp index b34c26cd99..c24c71a8d8 100644 --- a/plugins/TabSRMM/src/msgdlgutils.cpp +++ b/plugins/TabSRMM/src/msgdlgutils.cpp @@ -71,7 +71,7 @@ bool TSAPI IsCustomEvent(int eventType) // be saved to the contacts db record (if so, the container will try to open the tab // at the saved position later) -void TSAPI RearrangeTab(HWND hwndDlg, const TWindowData *dat, int iMode, BOOL fSavePos) +void TSAPI RearrangeTab(HWND hwndDlg, const CTabBaseDlg *dat, int iMode, BOOL fSavePos) { if (dat == NULL || !IsWindow(hwndDlg)) return; @@ -93,7 +93,7 @@ void TSAPI RearrangeTab(HWND hwndDlg, const TWindowData *dat, int iMode, BOOL fS BroadCastContainer(dat->pContainer, DM_REFRESHTABINDEX, 0, 0); ActivateTabFromHWND(hwndTab, hwndDlg); if (fSavePos) - db_set_dw(dat->hContact, SRMSGMOD_T, "tabindex", newIndex * 100); + db_set_dw(dat->m_hContact, SRMSGMOD_T, "tabindex", newIndex * 100); } } @@ -127,7 +127,7 @@ static UINT_PTR CALLBACK OpenFileSubclass(HWND hwnd, UINT msg, WPARAM, LPARAM lP // takes hbm (bitmap handle) and bool isOwnPic (1 == save the picture as your own avatar) // requires AVS and ADVAIMG services (Miranda 0.7+) -static void SaveAvatarToFile(TWindowData *dat, HBITMAP hbm, int isOwnPic) +static void SaveAvatarToFile(CTabBaseDlg *dat, HBITMAP hbm, int isOwnPic) { wchar_t szFinalFilename[MAX_PATH]; time_t t = time(NULL); @@ -195,74 +195,72 @@ static void SaveAvatarToFile(TWindowData *dat, HBITMAP hbm, int isOwnPic) // flash a tab icon if mode = true, otherwise restore default icon // store flashing state into bState -void TSAPI FlashTab(TWindowData *dat, HWND hwndTab, int iTabindex, BOOL *bState, BOOL mode, HICON origImage) +void CTabBaseDlg::FlashTab(bool bInvertMode) { - if (mode) - *bState = !(*bState); - else - dat->hTabIcon = origImage; + if (bInvertMode) + m_bTabFlash = !m_bTabFlash; TCITEM item = { 0 }; item.mask = TCIF_IMAGE; - TabCtrl_SetItem(hwndTab, iTabindex, &item); - if (dat->pContainer->dwFlags & CNT_SIDEBAR) - dat->pContainer->SideBar->updateSession(dat); + TabCtrl_SetItem(m_hwndParent, iTabID, &item); + if (pContainer->dwFlags & CNT_SIDEBAR) + pContainer->SideBar->updateSession(this); } ///////////////////////////////////////////////////////////////////////////////////////// // calculates avatar layouting, based on splitter position to find the optimal size // for the avatar w/o disturbing the toolbar too much. -void TSAPI CalcDynamicAvatarSize(TWindowData *dat, BITMAP *bminfo) +void CTabBaseDlg::CalcDynamicAvatarSize(BITMAP *bminfo) { - if (dat->dwFlags & MWF_WASBACKGROUNDCREATE || dat->pContainer->dwFlags & CNT_DEFERREDCONFIGURE || dat->pContainer->dwFlags & CNT_CREATE_MINIMIZED || IsIconic(dat->pContainer->hwnd)) + if (dwFlags & MWF_WASBACKGROUNDCREATE || pContainer->dwFlags & CNT_DEFERREDCONFIGURE || pContainer->dwFlags & CNT_CREATE_MINIMIZED || IsIconic(pContainer->hwnd)) return; // at this stage, the layout is not yet ready... RECT rc; - GetClientRect(dat->hwnd, &rc); + GetClientRect(GetHwnd(), &rc); - BOOL bBottomToolBar = dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR; - BOOL bToolBar = dat->pContainer->dwFlags & CNT_HIDETOOLBAR ? 0 : 1; - int iSplitOffset = dat->bIsAutosizingInput ? 1 : 0; + BOOL bBottomToolBar = pContainer->dwFlags & CNT_BOTTOMTOOLBAR; + BOOL bToolBar = pContainer->dwFlags & CNT_HIDETOOLBAR ? 0 : 1; + int iSplitOffset = bIsAutosizingInput ? 1 : 0; double picAspect = (bminfo->bmWidth == 0 || bminfo->bmHeight == 0) ? 1.0 : (double)(bminfo->bmWidth / (double)bminfo->bmHeight); - double picProjectedWidth = (double)((dat->dynaSplitter - ((bBottomToolBar && bToolBar) ? DPISCALEX_S(24) : 0) + ((dat->bShowUIElements) ? DPISCALEX_S(28) : DPISCALEX_S(2)))) * picAspect; + double picProjectedWidth = (double)((dynaSplitter - ((bBottomToolBar && bToolBar) ? DPISCALEX_S(24) : 0) + ((bShowUIElements) ? DPISCALEX_S(28) : DPISCALEX_S(2)))) * picAspect; - if ((rc.right - (int)picProjectedWidth) > (dat->iButtonBarReallyNeeds) && !PluginConfig.m_bAlwaysFullToolbarWidth && bToolBar) - dat->iRealAvatarHeight = dat->dynaSplitter + 3 + (dat->bShowUIElements ? DPISCALEY_S(28) : DPISCALEY_S(2)); + if ((rc.right - (int)picProjectedWidth) > (iButtonBarReallyNeeds) && !PluginConfig.m_bAlwaysFullToolbarWidth && bToolBar) + iRealAvatarHeight = dynaSplitter + 3 + (bShowUIElements ? DPISCALEY_S(28) : DPISCALEY_S(2)); else - dat->iRealAvatarHeight = dat->dynaSplitter + DPISCALEY_S(6) + DPISCALEY_S(iSplitOffset); + iRealAvatarHeight = dynaSplitter + DPISCALEY_S(6) + DPISCALEY_S(iSplitOffset); - dat->iRealAvatarHeight -= ((bBottomToolBar&&bToolBar) ? DPISCALEY_S(22) : 0); + iRealAvatarHeight -= ((bBottomToolBar&&bToolBar) ? DPISCALEY_S(22) : 0); if (PluginConfig.m_LimitStaticAvatarHeight > 0) - dat->iRealAvatarHeight = min(dat->iRealAvatarHeight, PluginConfig.m_LimitStaticAvatarHeight); + iRealAvatarHeight = min(iRealAvatarHeight, PluginConfig.m_LimitStaticAvatarHeight); - if (M.GetByte(dat->hContact, "dontscaleavatars", M.GetByte("dontscaleavatars", 0))) - dat->iRealAvatarHeight = min(bminfo->bmHeight, dat->iRealAvatarHeight); + if (M.GetByte(m_hContact, "dontscaleavatars", M.GetByte("dontscaleavatars", 0))) + iRealAvatarHeight = min(bminfo->bmHeight, iRealAvatarHeight); - double aspect = (bminfo->bmHeight != 0) ? (double)dat->iRealAvatarHeight / (double)bminfo->bmHeight : 1.0; + double aspect = (bminfo->bmHeight != 0) ? (double)iRealAvatarHeight / (double)bminfo->bmHeight : 1.0; double newWidth = (double)bminfo->bmWidth * aspect; if (newWidth > (double)(rc.right) * 0.8) newWidth = (double)(rc.right) * 0.8; - dat->pic.cy = dat->iRealAvatarHeight + 2; - dat->pic.cx = (int)newWidth + 2; + pic.cy = iRealAvatarHeight + 2; + pic.cx = (int)newWidth + 2; } -int TSAPI MsgWindowUpdateMenu(TWindowData *dat, HMENU submenu, int menuID) +int CTabBaseDlg::MsgWindowUpdateMenu(HMENU submenu, int menuID) { - bool bInfoPanel = dat->Panel->isActive(); + bool bInfoPanel = Panel->isActive(); if (menuID == MENU_TABCONTEXT) { - EnableMenuItem(submenu, ID_TABMENU_LEAVECHATROOM, (dat->bType == SESSIONTYPE_CHAT && ProtoServiceExists(dat->szProto, PS_LEAVECHAT)) ? MF_ENABLED : MF_DISABLED); + EnableMenuItem(submenu, ID_TABMENU_LEAVECHATROOM, (bType == SESSIONTYPE_CHAT && ProtoServiceExists(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); + EnableMenuItem(submenu, ID_TABMENU_CLEARSAVEDTABPOSITION, (M.GetDword(m_hContact, "tabindex", -1) != -1) ? MF_ENABLED : MF_GRAYED); } else if (menuID == MENU_PICMENU) { wchar_t *szText = NULL; - char avOverride = (char)M.GetByte(dat->hContact, "hideavatar", -1); + char avOverride = (char)M.GetByte(m_hContact, "hideavatar", -1); HMENU visMenu = GetSubMenu(submenu, 0); - BOOL picValid = bInfoPanel ? (dat->hOwnPic != 0) : (dat->ace && dat->ace->hbmPic && dat->ace->hbmPic != PluginConfig.g_hbmUnknown); + BOOL picValid = bInfoPanel ? (hOwnPic != 0) : (ace && ace->hbmPic && ace->hbmPic != PluginConfig.g_hbmUnknown); MENUITEMINFO mii = { 0 }; mii.cbSize = sizeof(mii); @@ -282,7 +280,7 @@ int TSAPI MsgWindowUpdateMenu(TWindowData *dat, HMENU submenu, int menuID) } else { EnableMenuItem(submenu, 0, MF_BYPOSITION | MF_GRAYED); - EnableMenuItem(submenu, ID_PICMENU_SETTINGS, MF_BYCOMMAND | ((ServiceExists(MS_AV_SETMYAVATARW) && CallService(MS_AV_CANSETMYAVATAR, (WPARAM)(dat->cache->getActiveProto()), 0)) ? MF_ENABLED : MF_GRAYED)); + EnableMenuItem(submenu, ID_PICMENU_SETTINGS, MF_BYCOMMAND | ((ServiceExists(MS_AV_SETMYAVATARW) && CallService(MS_AV_CANSETMYAVATAR, (WPARAM)(cache->getActiveProto()), 0)) ? MF_ENABLED : MF_GRAYED)); szText = TranslateT("Set your avatar..."); } mii.dwTypeData = szText; @@ -291,53 +289,47 @@ int TSAPI MsgWindowUpdateMenu(TWindowData *dat, HMENU submenu, int menuID) } else if (menuID == MENU_PANELPICMENU) { HMENU visMenu = GetSubMenu(submenu, 0); - char avOverride = (char)M.GetByte(dat->hContact, "hideavatar", -1); + char avOverride = (char)M.GetByte(m_hContact, "hideavatar", -1); CheckMenuItem(visMenu, ID_VISIBILITY_DEFAULT, MF_BYCOMMAND | (avOverride == -1 ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(visMenu, ID_VISIBILITY_HIDDENFORTHISCONTACT, MF_BYCOMMAND | (avOverride == 0 ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(visMenu, ID_VISIBILITY_VISIBLEFORTHISCONTACT, MF_BYCOMMAND | (avOverride == 1 ? MF_CHECKED : MF_UNCHECKED)); EnableMenuItem(submenu, ID_PICMENU_SETTINGS, MF_BYCOMMAND | (ServiceExists(MS_AV_GETAVATARBITMAP) ? MF_ENABLED : MF_GRAYED)); - EnableMenuItem(submenu, ID_PANELPICMENU_SAVETHISPICTUREAS, MF_BYCOMMAND | ((dat->ace && dat->ace->hbmPic && dat->ace->hbmPic != PluginConfig.g_hbmUnknown) ? MF_ENABLED : MF_GRAYED)); + EnableMenuItem(submenu, ID_PANELPICMENU_SAVETHISPICTUREAS, MF_BYCOMMAND | ((ace && ace->hbmPic && ace->hbmPic != PluginConfig.g_hbmUnknown) ? MF_ENABLED : MF_GRAYED)); } return 0; } -int TSAPI MsgWindowMenuHandler(TWindowData *dat, int selection, int menuId) +int CTabBaseDlg::MsgWindowMenuHandler(int selection, int menuId) { - if (dat == 0) - return 0; - - HWND hwndDlg = dat->hwnd; - if (menuId == MENU_PICMENU || menuId == MENU_PANELPICMENU || menuId == MENU_TABCONTEXT) { switch (selection) { case ID_TABMENU_ATTACHTOCONTAINER: - CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_SELECTCONTAINER), hwndDlg, SelectContainerDlgProc, (LPARAM)hwndDlg); + CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_SELECTCONTAINER), m_hwnd, SelectContainerDlgProc, (LPARAM)m_hwnd); return 1; case ID_TABMENU_CONTAINEROPTIONS: - if (dat->pContainer->hWndOptions == 0) - CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_CONTAINEROPTIONS), hwndDlg, DlgProcContainerOptions, (LPARAM)dat->pContainer); + if (pContainer->hWndOptions == 0) + CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_CONTAINEROPTIONS), m_hwnd, DlgProcContainerOptions, (LPARAM)pContainer); return 1; case ID_TABMENU_CLOSECONTAINER: - SendMessage(dat->pContainer->hwnd, WM_CLOSE, 0, 0); + SendMessage(pContainer->hwnd, WM_CLOSE, 0, 0); return 1; case ID_TABMENU_CLOSETAB: - SendMessage(hwndDlg, WM_CLOSE, 1, 0); + SendMessage(m_hwnd, WM_CLOSE, 1, 0); return 1; case ID_TABMENU_SAVETABPOSITION: - db_set_dw(dat->hContact, SRMSGMOD_T, "tabindex", dat->iTabID * 100); + db_set_dw(m_hContact, SRMSGMOD_T, "tabindex", iTabID * 100); break; case ID_TABMENU_CLEARSAVEDTABPOSITION: - db_unset(dat->hContact, SRMSGMOD_T, "tabindex"); + db_unset(m_hContact, SRMSGMOD_T, "tabindex"); break; case ID_TABMENU_LEAVECHATROOM: - if (dat && dat->bType == SESSIONTYPE_CHAT) { - SESSION_INFO *si = dat->si; - if (si != NULL && dat->hContact != NULL) { - char *szProto = GetContactProto(dat->hContact); + if (bType == SESSIONTYPE_CHAT) { + if (si != NULL && m_hContact != NULL) { + char *szProto = GetContactProto(m_hContact); if (szProto) - CallProtoService(szProto, PS_LEAVECHAT, dat->hContact, 0); + CallProtoService(szProto, PS_LEAVECHAT, m_hContact, 0); } } return 1; @@ -353,12 +345,12 @@ int TSAPI MsgWindowMenuHandler(TWindowData *dat, int selection, int menuId) avOverrideMode = 1; else avOverrideMode = 0; - db_set_b(dat->hContact, SRMSGMOD_T, "hideavatar", avOverrideMode); + db_set_b(m_hContact, SRMSGMOD_T, "hideavatar", avOverrideMode); } - ShowPicture(dat, FALSE); - SendMessage(hwndDlg, WM_SIZE, 0, 0); - DM_ScrollToBottom(dat, 0, 1); + ShowPicture(false); + SendMessage(m_hwnd, WM_SIZE, 0, 0); + DM_ScrollToBottom(this, 0, 1); return 1; case ID_PICMENU_ALWAYSKEEPTHEBUTTONBARATFULLWIDTH: @@ -368,31 +360,27 @@ int TSAPI MsgWindowMenuHandler(TWindowData *dat, int selection, int menuId) break; case ID_PICMENU_SAVETHISPICTUREAS: - if (dat->Panel->isActive()) { - if (dat) - SaveAvatarToFile(dat, dat->hOwnPic, 1); - } - else { - if (dat && dat->ace) - SaveAvatarToFile(dat, dat->ace->hbmPic, 0); - } + if (Panel->isActive()) + SaveAvatarToFile(this, hOwnPic, 1); + else if (ace) + SaveAvatarToFile(this, ace->hbmPic, 0); break; case ID_PANELPICMENU_SAVETHISPICTUREAS: - if (dat && dat->ace) - SaveAvatarToFile(dat, dat->ace->hbmPic, 0); + if (ace) + SaveAvatarToFile(this, ace->hbmPic, 0); break; case ID_PICMENU_SETTINGS: if (menuId == MENU_PANELPICMENU) - CallService(MS_AV_CONTACTOPTIONS, dat->hContact, 0); + CallService(MS_AV_CONTACTOPTIONS, m_hContact, 0); else if (menuId == MENU_PICMENU) { - if (dat->Panel->isActive()) { - if (ServiceExists(MS_AV_SETMYAVATARW) && CallService(MS_AV_CANSETMYAVATAR, (WPARAM)(dat->cache->getActiveProto()), 0)) - CallService(MS_AV_SETMYAVATARW, (WPARAM)(dat->cache->getActiveProto()), 0); + if (Panel->isActive()) { + if (ServiceExists(MS_AV_SETMYAVATARW) && CallService(MS_AV_CANSETMYAVATAR, (WPARAM)(cache->getActiveProto()), 0)) + CallService(MS_AV_SETMYAVATARW, (WPARAM)(cache->getActiveProto()), 0); } else - CallService(MS_AV_CONTACTOPTIONS, dat->hContact, 0); + CallService(MS_AV_CONTACTOPTIONS, m_hContact, 0); } return 1; } @@ -404,7 +392,7 @@ int TSAPI MsgWindowMenuHandler(TWindowData *dat, int selection, int menuId) return 1; case ID_MESSAGELOGSETTINGS_FORTHISCONTACT: - CallService(MS_TABMSG_SETUSERPREFS, dat->hContact, 0); + CallService(MS_TABMSG_SETUSERPREFS, m_hContact, 0); return 1; } } @@ -415,73 +403,73 @@ int TSAPI MsgWindowMenuHandler(TWindowData *dat, int selection, int menuId) // update the status bar field which displays the number of characters in the input area // and various indicators (caps lock, num lock, insert mode). -void TSAPI UpdateReadChars(const TWindowData *dat) +void CTabBaseDlg::UpdateReadChars() const { - if (dat && (dat->pContainer->hwndStatus && dat->pContainer->hwndActive == dat->hwnd)) { - wchar_t buf[128]; - int len; - - if (dat->bType == SESSIONTYPE_CHAT) - len = GetWindowTextLength(GetDlgItem(dat->hwnd, IDC_CHAT_MESSAGE)); - else { - // retrieve text length in UTF8 bytes, because this is the relevant length for most protocols - GETTEXTLENGTHEX gtxl = { 0 }; - gtxl.codepage = CP_UTF8; - gtxl.flags = GTL_DEFAULT | GTL_PRECISE | GTL_NUMBYTES; + if (!pContainer->hwndStatus || pContainer->hwndActive != m_hwnd) + return; - len = SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_GETTEXTLENGTHEX, (WPARAM)>xl, 0); - } + int len; + if (bType == SESSIONTYPE_CHAT) + len = GetWindowTextLength(m_message.GetHwnd()); + else { + // retrieve text length in UTF8 bytes, because this is the relevant length for most protocols + GETTEXTLENGTHEX gtxl = { 0 }; + gtxl.codepage = CP_UTF8; + gtxl.flags = GTL_DEFAULT | GTL_PRECISE | GTL_NUMBYTES; - BOOL fCaps = (GetKeyState(VK_CAPITAL) & 1); - BOOL fNum = (GetKeyState(VK_NUMLOCK) & 1); - - wchar_t szBuf[20]; szBuf[0] = 0; - if (dat->fInsertMode) - mir_wstrcat(szBuf, L"O"); - if (fCaps) - mir_wstrcat(szBuf, L"C"); - if (fNum) - mir_wstrcat(szBuf, L"N"); - if (dat->fInsertMode || fCaps || fNum) - mir_wstrcat(szBuf, L" | "); - - mir_snwprintf(buf, L"%s%s %d/%d", szBuf, dat->lcID, dat->iOpenJobs, len); - SendMessage(dat->pContainer->hwndStatus, SB_SETTEXT, 1, (LPARAM)buf); - if (PluginConfig.m_visualMessageSizeIndicator) - InvalidateRect(dat->pContainer->hwndStatus, NULL, FALSE); + len = m_message.SendMsg(EM_GETTEXTLENGTHEX, (WPARAM)>xl, 0); } + + BOOL fCaps = (GetKeyState(VK_CAPITAL) & 1); + BOOL fNum = (GetKeyState(VK_NUMLOCK) & 1); + + wchar_t szBuf[20]; szBuf[0] = 0; + if (fInsertMode) + mir_wstrcat(szBuf, L"O"); + if (fCaps) + mir_wstrcat(szBuf, L"C"); + if (fNum) + mir_wstrcat(szBuf, L"N"); + if (fInsertMode || fCaps || fNum) + mir_wstrcat(szBuf, L" | "); + + wchar_t buf[128]; + mir_snwprintf(buf, L"%s%s %d/%d", szBuf, lcID, iOpenJobs, len); + SendMessage(pContainer->hwndStatus, SB_SETTEXT, 1, (LPARAM)buf); + if (PluginConfig.m_visualMessageSizeIndicator) + InvalidateRect(pContainer->hwndStatus, NULL, FALSE); } ///////////////////////////////////////////////////////////////////////////////////////// // update all status bar fields and force a redraw of the status bar. -void TSAPI UpdateStatusBar(const TWindowData *dat) +void CTabBaseDlg::UpdateStatusBar() const { - if (dat && dat->pContainer->hwndStatus && dat->pContainer->hwndActive == dat->hwnd) { - if (dat->bType == SESSIONTYPE_IM) { - if (dat->szStatusBar[0]) { - SendMessage(dat->pContainer->hwndStatus, SB_SETICON, 0, (LPARAM)PluginConfig.g_buttonBarIcons[ICON_DEFAULT_TYPING]); - SendMessage(dat->pContainer->hwndStatus, SB_SETTEXT, 0, (LPARAM)dat->szStatusBar); + if (pContainer->hwndStatus && pContainer->hwndActive == m_hwnd) { + if (bType == SESSIONTYPE_IM) { + if (szStatusBar[0]) { + SendMessage(pContainer->hwndStatus, SB_SETICON, 0, (LPARAM)PluginConfig.g_buttonBarIcons[ICON_DEFAULT_TYPING]); + SendMessage(pContainer->hwndStatus, SB_SETTEXT, 0, (LPARAM)szStatusBar); } - else if (dat->sbCustom) { - SendMessage(dat->pContainer->hwndStatus, SB_SETICON, 0, (LPARAM)dat->sbCustom->hIcon); - SendMessage(dat->pContainer->hwndStatus, SB_SETTEXT, 0, (LPARAM)dat->sbCustom->tszText); + else if (sbCustom) { + SendMessage(pContainer->hwndStatus, SB_SETICON, 0, (LPARAM)sbCustom->hIcon); + SendMessage(pContainer->hwndStatus, SB_SETTEXT, 0, (LPARAM)sbCustom->tszText); } else { - SendMessage(dat->pContainer->hwndStatus, SB_SETICON, 0, 0); - DM_UpdateLastMessage(dat); + SendMessage(pContainer->hwndStatus, SB_SETICON, 0, 0); + DM_UpdateLastMessage(this); } } else { - if (dat->sbCustom) { - SendMessage(dat->pContainer->hwndStatus, SB_SETICON, 0, (LPARAM)dat->sbCustom->hIcon); - SendMessage(dat->pContainer->hwndStatus, SB_SETTEXT, 0, (LPARAM)dat->sbCustom->tszText); + if (sbCustom) { + SendMessage(pContainer->hwndStatus, SB_SETICON, 0, (LPARAM)sbCustom->hIcon); + SendMessage(pContainer->hwndStatus, SB_SETTEXT, 0, (LPARAM)sbCustom->tszText); } - else SendMessage(dat->pContainer->hwndStatus, SB_SETICON, 0, 0); + else SendMessage(pContainer->hwndStatus, SB_SETICON, 0, 0); } - UpdateReadChars(dat); - InvalidateRect(dat->pContainer->hwndStatus, NULL, TRUE); - SendMessage(dat->pContainer->hwndStatus, WM_USER + 101, 0, (LPARAM)dat); + UpdateReadChars(); + InvalidateRect(pContainer->hwndStatus, NULL, TRUE); + SendMessage(pContainer->hwndStatus, WM_USER + 101, 0, (LPARAM)this); } } @@ -492,7 +480,7 @@ void TSAPI UpdateStatusBar(const TWindowData *dat) // NOT used for typing notification feedback as this is handled directly from the // MTN handler. -void TSAPI HandleIconFeedback(TWindowData *dat, HICON iIcon) +void TSAPI HandleIconFeedback(CTabBaseDlg *dat, HICON iIcon) { TCITEM item = { 0 }; @@ -519,14 +507,14 @@ void TSAPI ProcessAvatarChange(HWND hwnd, LPARAM lParam) { if (((LPNMHDR)lParam)->code == NM_AVATAR_CHANGED) { HWND hwndDlg = GetParent(hwnd); - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + CTabBaseDlg *dat = (CTabBaseDlg*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (!dat) return; dat->ace = Utils::loadAvatarFromAVS(dat->cache->getActiveContact()); - GetAvatarVisibility(hwndDlg, dat); - ShowPicture(dat, TRUE); + dat->GetAvatarVisibility(); + dat->ShowPicture(true); if (dat->Panel->isActive()) SendMessage(hwndDlg, WM_SIZE, 0, 0); } @@ -536,87 +524,87 @@ void TSAPI ProcessAvatarChange(HWND hwnd, LPARAM lParam) // retrieve the visiblity of the avatar window, depending on the global setting // and local mode -bool TSAPI GetAvatarVisibility(HWND hwndDlg, TWindowData *dat) +bool CTabBaseDlg::GetAvatarVisibility() { - BYTE bAvatarMode = dat->pContainer->avatarMode; - BYTE bOwnAvatarMode = dat->pContainer->ownAvatarMode; - char hideOverride = (char)M.GetByte(dat->hContact, "hideavatar", -1); + BYTE bAvatarMode = pContainer->avatarMode; + BYTE bOwnAvatarMode = pContainer->ownAvatarMode; + char hideOverride = (char)M.GetByte(m_hContact, "hideavatar", -1); // infopanel visible, consider own avatar display - dat->bShowAvatar = false; + bShowAvatar = false; - if (dat->Panel->isActive() && bAvatarMode != 3) { + if (Panel->isActive() && bAvatarMode != 3) { if (!bOwnAvatarMode) { - dat->bShowAvatar = (dat->hOwnPic && dat->hOwnPic != PluginConfig.g_hbmUnknown); - if (!dat->hwndContactPic) - dat->hwndContactPic = CreateWindowEx(WS_EX_TOPMOST, AVATAR_CONTROL_CLASS, L"", WS_VISIBLE | WS_CHILD, 1, 1, 1, 1, GetDlgItem(hwndDlg, IDC_CONTACTPIC), (HMENU)0, NULL, NULL); + bShowAvatar = (hOwnPic && hOwnPic != PluginConfig.g_hbmUnknown); + if (!hwndContactPic) + hwndContactPic = CreateWindowEx(WS_EX_TOPMOST, AVATAR_CONTROL_CLASS, L"", WS_VISIBLE | WS_CHILD, 1, 1, 1, 1, GetDlgItem(m_hwnd, IDC_CONTACTPIC), (HMENU)0, NULL, NULL); } switch (bAvatarMode) { case 2: - dat->bShowInfoAvatar = false; + bShowInfoAvatar = false; break; case 0: - dat->bShowInfoAvatar = true; + bShowInfoAvatar = true; case 1: - HBITMAP hbm = ((dat->ace && !(dat->ace->dwFlags & AVS_HIDEONCLIST)) ? dat->ace->hbmPic : 0); + HBITMAP hbm = ((ace && !(ace->dwFlags & AVS_HIDEONCLIST)) ? ace->hbmPic : 0); if (hbm == NULL && !bAvatarMode) { - dat->bShowInfoAvatar = false; + bShowInfoAvatar = false; break; } - if (!dat->hwndPanelPic) { - dat->hwndPanelPic = CreateWindowEx(WS_EX_TOPMOST, AVATAR_CONTROL_CLASS, L"", WS_VISIBLE | WS_CHILD, 1, 1, 1, 1, dat->hwndPanelPicParent, (HMENU)7000, NULL, NULL); - if (dat->hwndPanelPic) - SendMessage(dat->hwndPanelPic, AVATAR_SETAEROCOMPATDRAWING, 0, TRUE); + if (!hwndPanelPic) { + hwndPanelPic = CreateWindowEx(WS_EX_TOPMOST, AVATAR_CONTROL_CLASS, L"", WS_VISIBLE | WS_CHILD, 1, 1, 1, 1, hwndPanelPicParent, (HMENU)7000, NULL, NULL); + if (hwndPanelPic) + SendMessage(hwndPanelPic, AVATAR_SETAEROCOMPATDRAWING, 0, TRUE); } if (bAvatarMode != 0) - dat->bShowInfoAvatar = (hbm && hbm != PluginConfig.g_hbmUnknown); + bShowInfoAvatar = (hbm && hbm != PluginConfig.g_hbmUnknown); break; } - if (dat->bShowInfoAvatar) - dat->bShowInfoAvatar = hideOverride == 0 ? false : dat->bShowInfoAvatar; + if (bShowInfoAvatar) + bShowInfoAvatar = hideOverride == 0 ? false : bShowInfoAvatar; else - dat->bShowInfoAvatar = hideOverride == 1 ? true : dat->bShowInfoAvatar; + bShowInfoAvatar = hideOverride == 1 ? true : bShowInfoAvatar; - Utils::setAvatarContact(dat->hwndPanelPic, dat->hContact); - SendMessage(dat->hwndContactPic, AVATAR_SETPROTOCOL, 0, (LPARAM)dat->cache->getActiveProto()); + Utils::setAvatarContact(hwndPanelPic, m_hContact); + SendMessage(hwndContactPic, AVATAR_SETPROTOCOL, 0, (LPARAM)cache->getActiveProto()); } else { - dat->bShowInfoAvatar = false; + bShowInfoAvatar = false; switch (bAvatarMode) { case 0: // globally on - dat->bShowAvatar = true; + bShowAvatar = true; LBL_Check: - if (!dat->hwndContactPic) - dat->hwndContactPic = CreateWindowEx(WS_EX_TOPMOST, AVATAR_CONTROL_CLASS, L"", WS_VISIBLE | WS_CHILD, 1, 1, 1, 1, GetDlgItem(hwndDlg, IDC_CONTACTPIC), (HMENU)0, NULL, NULL); + if (!hwndContactPic) + hwndContactPic = CreateWindowEx(WS_EX_TOPMOST, AVATAR_CONTROL_CLASS, L"", WS_VISIBLE | WS_CHILD, 1, 1, 1, 1, GetDlgItem(m_hwnd, IDC_CONTACTPIC), (HMENU)0, NULL, NULL); break; case 2: // globally OFF - dat->bShowAvatar = false; + bShowAvatar = false; break; case 3: // on, if present case 1: - HBITMAP hbm = (dat->ace && !(dat->ace->dwFlags & AVS_HIDEONCLIST)) ? dat->ace->hbmPic : 0; - dat->bShowAvatar = (hbm && hbm != PluginConfig.g_hbmUnknown); + HBITMAP hbm = (ace && !(ace->dwFlags & AVS_HIDEONCLIST)) ? ace->hbmPic : 0; + bShowAvatar = (hbm && hbm != PluginConfig.g_hbmUnknown); goto LBL_Check; } - if (dat->bShowAvatar) - dat->bShowAvatar = hideOverride == 0 ? 0 : dat->bShowAvatar; + if (bShowAvatar) + bShowAvatar = hideOverride == 0 ? 0 : bShowAvatar; else - dat->bShowAvatar = hideOverride == 1 ? 1 : dat->bShowAvatar; + bShowAvatar = hideOverride == 1 ? 1 : bShowAvatar; // reloads avatars - if (dat->hwndPanelPic) { // shows contact or user picture, depending on panel visibility - SendMessage(dat->hwndContactPic, AVATAR_SETPROTOCOL, 0, (LPARAM)dat->cache->getActiveProto()); - Utils::setAvatarContact(dat->hwndPanelPic, dat->hContact); + if (hwndPanelPic) { // shows contact or user picture, depending on panel visibility + SendMessage(hwndContactPic, AVATAR_SETPROTOCOL, 0, (LPARAM)cache->getActiveProto()); + Utils::setAvatarContact(hwndPanelPic, m_hContact); } - else Utils::setAvatarContact(dat->hwndContactPic, dat->hContact); + else Utils::setAvatarContact(hwndContactPic, m_hContact); } - return dat->bShowAvatar; + return bShowAvatar; } ///////////////////////////////////////////////////////////////////////////////////////// @@ -691,71 +679,65 @@ wchar_t* TSAPI QuoteText(const wchar_t *text) return strout; } -void TSAPI AdjustBottomAvatarDisplay(TWindowData *dat) +void CTabBaseDlg::AdjustBottomAvatarDisplay() { - if (!dat) - return; - - HWND hwndDlg = dat->hwnd; - dat->bShowAvatar = GetAvatarVisibility(hwndDlg, dat); + GetAvatarVisibility(); - bool bInfoPanel = dat->Panel->isActive(); - HBITMAP hbm = (bInfoPanel && dat->pContainer->avatarMode != 3) ? dat->hOwnPic : (dat->ace ? dat->ace->hbmPic : PluginConfig.g_hbmUnknown); + bool bInfoPanel = Panel->isActive(); + HBITMAP hbm = (bInfoPanel && pContainer->avatarMode != 3) ? hOwnPic : (ace ? ace->hbmPic : PluginConfig.g_hbmUnknown); if (hbm) { - if (dat->dynaSplitter == 0 || dat->splitterY == 0) - LoadSplitter(dat); - dat->dynaSplitter = dat->splitterY - DPISCALEY_S(34); - DM_RecalcPictureSize(dat); - Utils::showDlgControl(hwndDlg, IDC_CONTACTPIC, dat->bShowAvatar ? SW_SHOW : SW_HIDE); - InvalidateRect(GetDlgItem(hwndDlg, IDC_CONTACTPIC), NULL, TRUE); + if (dynaSplitter == 0 || splitterY == 0) + LoadSplitter(); + dynaSplitter = splitterY - DPISCALEY_S(34); + DM_RecalcPictureSize(); + Utils::showDlgControl(m_hwnd, IDC_CONTACTPIC, bShowAvatar ? SW_SHOW : SW_HIDE); + InvalidateRect(GetDlgItem(m_hwnd, IDC_CONTACTPIC), NULL, TRUE); } else { - Utils::showDlgControl(hwndDlg, IDC_CONTACTPIC, dat->bShowAvatar ? SW_SHOW : SW_HIDE); - dat->pic.cy = dat->pic.cx = DPISCALEY_S(60); - InvalidateRect(GetDlgItem(hwndDlg, IDC_CONTACTPIC), NULL, TRUE); + Utils::showDlgControl(m_hwnd, IDC_CONTACTPIC, bShowAvatar ? SW_SHOW : SW_HIDE); + pic.cy = pic.cx = DPISCALEY_S(60); + InvalidateRect(GetDlgItem(m_hwnd, IDC_CONTACTPIC), NULL, TRUE); } } -void TSAPI ShowPicture(TWindowData *dat, BOOL showNewPic) +void CTabBaseDlg::ShowPicture(bool showNewPic) { - HWND hwndDlg = dat->hwnd; - - if (!dat->Panel->isActive()) - dat->pic.cy = dat->pic.cx = DPISCALEY_S(60); + if (!Panel->isActive()) + pic.cy = pic.cx = DPISCALEY_S(60); if (showNewPic) { - if (dat->Panel->isActive() && dat->pContainer->avatarMode != 3) { - if (!dat->hwndPanelPic) { - InvalidateRect(dat->hwnd, NULL, TRUE); - UpdateWindow(dat->hwnd); - SendMessage(dat->hwnd, WM_SIZE, 0, 0); + if (Panel->isActive() && pContainer->avatarMode != 3) { + if (!hwndPanelPic) { + InvalidateRect(m_hwnd, NULL, TRUE); + UpdateWindow(m_hwnd); + SendMessage(m_hwnd, WM_SIZE, 0, 0); } return; } - AdjustBottomAvatarDisplay(dat); + AdjustBottomAvatarDisplay(); } else { - dat->bShowAvatar = dat->bShowAvatar ? 0 : 1; - db_set_b(dat->hContact, SRMSGMOD_T, "MOD_ShowPic", (BYTE)dat->bShowAvatar); + bShowAvatar = !bShowAvatar; + db_set_b(m_hContact, SRMSGMOD_T, "MOD_ShowPic", bShowAvatar); } RECT rc; - GetWindowRect(GetDlgItem(hwndDlg, IDC_CONTACTPIC), &rc); - if (dat->minEditBoxSize.cy + DPISCALEY_S(3) > dat->splitterY) - SendMessage(hwndDlg, DM_SPLITTERMOVED, (WPARAM)rc.bottom - dat->minEditBoxSize.cy, (LPARAM)GetDlgItem(hwndDlg, IDC_SPLITTER)); + GetWindowRect(GetDlgItem(m_hwnd, IDC_CONTACTPIC), &rc); + if (minEditBoxSize.cy + DPISCALEY_S(3) > splitterY) + SendMessage(m_hwnd, DM_SPLITTERMOVED, (WPARAM)rc.bottom - minEditBoxSize.cy, (LPARAM)GetDlgItem(m_hwnd, IDC_SPLITTER)); if (!showNewPic) - SetDialogToType(hwndDlg); + SetDialogToType(m_hwnd); else - SendMessage(hwndDlg, WM_SIZE, 0, 0); + SendMessage(m_hwnd, WM_SIZE, 0, 0); } -void TSAPI FlashOnClist(HWND hwndDlg, TWindowData *dat, MEVENT hEvent, DBEVENTINFO *dbei) +void CTabBaseDlg::FlashOnClist(MEVENT hEvent, DBEVENTINFO *dbei) { - dat->dwTickLastEvent = GetTickCount(); + dwTickLastEvent = GetTickCount(); - if ((GetForegroundWindow() != dat->pContainer->hwnd || dat->pContainer->hwndActive != hwndDlg) && !(dbei->flags & DBEF_SENT) && dbei->eventType == EVENTTYPE_MESSAGE) { - dat->dwUnread++; - UpdateTrayMenu(dat, (WORD)(dat->cache->getActiveStatus()), dat->cache->getActiveProto(), dat->szStatus, dat->hContact, 0L); + if ((GetForegroundWindow() != pContainer->hwnd || pContainer->hwndActive != m_hwnd) && !(dbei->flags & DBEF_SENT) && dbei->eventType == EVENTTYPE_MESSAGE) { + dwUnread++; + UpdateTrayMenu(this, (WORD)(cache->getActiveStatus()), cache->getActiveProto(), szStatus, m_hContact, 0); if (nen_options.bTraySupport) return; } @@ -765,16 +747,16 @@ void TSAPI FlashOnClist(HWND hwndDlg, TWindowData *dat, MEVENT hEvent, DBEVENTIN if (!PluginConfig.m_bFlashOnClist) return; - if ((GetForegroundWindow() != dat->pContainer->hwnd || dat->pContainer->hwndActive != hwndDlg) && !(dbei->flags & DBEF_SENT) && dbei->eventType == EVENTTYPE_MESSAGE && !(dat->dwFlagsEx & MWF_SHOW_FLASHCLIST)) { + if ((GetForegroundWindow() != pContainer->hwnd || pContainer->hwndActive != m_hwnd) && !(dbei->flags & DBEF_SENT) && dbei->eventType == EVENTTYPE_MESSAGE && !(dwFlagsEx & MWF_SHOW_FLASHCLIST)) { CLISTEVENT cle = {}; - cle.hContact = (MCONTACT)dat->hContact; + cle.hContact = m_hContact; cle.hDbEvent = hEvent; cle.hIcon = Skin_LoadIcon(SKINICON_EVENT_MESSAGE); cle.pszService = "SRMsg/ReadMessage"; pcli->pfnAddEvent(&cle); - dat->dwFlagsEx |= MWF_SHOW_FLASHCLIST; - dat->hFlashingEvent = hEvent; + dwFlagsEx |= MWF_SHOW_FLASHCLIST; + hFlashingEvent = hEvent; } } @@ -875,13 +857,13 @@ static int GetRtfIndex(int iCol, int iCount, int *pIndex) // convert rich edit code to bbcode (if wanted). Otherwise, strip all RTF formatting // tags and return plain text -BOOL TSAPI DoRtfToTags(const TWindowData *dat, CMStringW &pszText, int iNumColors, COLORREF *pColors) +BOOL CTabBaseDlg::DoRtfToTags(CMStringW &pszText, int iNumColors, COLORREF *pColors) const { if (pszText.IsEmpty()) return FALSE; // used to filter out attributes which are already set for the default message input area font - LOGFONTA lf = dat->pContainer->theme.logFonts[MSGFONTID_MESSAGEAREA]; + LOGFONTA lf = pContainer->theme.logFonts[MSGFONTID_MESSAGEAREA]; // create an index of colors in the module and map them to // corresponding colors in the RTF color table @@ -917,7 +899,7 @@ BOOL TSAPI DoRtfToTags(const TWindowData *dat, CMStringW &pszText, int iNumColor int iCol = _wtoi(p + 3); int iInd = GetRtfIndex(iCol, iNumColors, pIndex); - if (iCol && dat->bType != SESSIONTYPE_CHAT) + if (iCol && bType != SESSIONTYPE_CHAT) res.AppendFormat((iInd > 0) ? (bInsideColor ? L"[/color][color=%s]" : L"[color=%s]") : (bInsideColor ? L"[/color]" : L""), Utils::rtf_ctable[iInd - 1].szName); bInsideColor = iInd > 0; @@ -953,19 +935,19 @@ BOOL TSAPI DoRtfToTags(const TWindowData *dat, CMStringW &pszText, int iNumColor } else if (!wcsncmp(p, L"\\b", 2)) { //bold if (!(lf.lfWeight == FW_BOLD)) // only allow bold if the font itself isn't a bold one, otherwise just strip it.. - if (dat->SendFormat) + if (SendFormat) res.Append((p[2] != '0') ? L"[b]" : L"[/b]"); } else if (!wcsncmp(p, L"\\i", 2)) { // italics - if (!lf.lfItalic && dat->SendFormat) + if (!lf.lfItalic && SendFormat) res.Append((p[2] != '0') ? L"[i]" : L"[/i]"); } else if (!wcsncmp(p, L"\\strike", 7)) { // strike-out - if (!lf.lfStrikeOut && dat->SendFormat) + if (!lf.lfStrikeOut && SendFormat) res.Append((p[7] != '0') ? L"[s]" : L"[/s]"); } else if (!wcsncmp(p, L"\\ul", 3)) { // underlined - if (!lf.lfUnderline && dat->SendFormat) { + if (!lf.lfUnderline && SendFormat) { if (p[3] == 0 || wcschr(tszRtfBreaks, p[3])) { res.Append(L"[u]"); bInsideUl = true; @@ -1016,7 +998,7 @@ BOOL TSAPI DoRtfToTags(const TWindowData *dat, CMStringW &pszText, int iNumColor } } - if (bInsideColor && dat->bType != SESSIONTYPE_CHAT) + if (bInsideColor && bType != SESSIONTYPE_CHAT) res.Append(L"[/color]"); if (bInsideUl) res.Append(L"[/u]"); @@ -1029,15 +1011,17 @@ BOOL TSAPI DoRtfToTags(const TWindowData *dat, CMStringW &pszText, int iNumColor // retrieve both buddys and my own UIN for a message session and store them in the message window *dat // respects metacontacts and uses the current protocol if the contact is a MC -void TSAPI GetMYUIN(TWindowData *dat) +void CTabBaseDlg::GetMYUIN() { - ptrW uid(Contact_GetInfo(CNF_DISPLAYUID, NULL, dat->cache->getActiveProto())); + ptrW uid(Contact_GetInfo(CNF_DISPLAYUID, NULL, cache->getActiveProto())); if (uid != NULL) - wcsncpy_s(dat->myUin, uid, _TRUNCATE); + wcsncpy_s(myUin, uid, _TRUNCATE); else - dat->myUin[0] = 0; + myUin[0] = 0; } +///////////////////////////////////////////////////////////////////////////////////////// + static int g_IEViewAvail = -1; static int g_HPPAvail = -1; @@ -1063,12 +1047,13 @@ UINT TSAPI GetIEViewMode(MCONTACT hContact) return iWantHPP ? WANT_HPP_LOG : (iWantIEView ? WANT_IEVIEW_LOG : 0); } -void TSAPI SetMessageLog(TWindowData *dat) +///////////////////////////////////////////////////////////////////////////////////////// + +void CTabBaseDlg::SetMessageLog() { - HWND hwndDlg = dat->hwnd; - unsigned int iLogMode = GetIEViewMode(dat->hContact); + unsigned int iLogMode = GetIEViewMode(m_hContact); - if (iLogMode == WANT_IEVIEW_LOG && dat->hwndIEView == 0) { + if (iLogMode == WANT_IEVIEW_LOG && hwndIEView == 0) { IEVIEWWINDOW ieWindow; memset(&ieWindow, 0, sizeof(ieWindow)); @@ -1076,43 +1061,43 @@ void TSAPI SetMessageLog(TWindowData *dat) ieWindow.iType = IEW_CREATE; ieWindow.dwFlags = 0; ieWindow.dwMode = IEWM_TABSRMM; - ieWindow.parent = hwndDlg; + ieWindow.parent = m_hwnd; ieWindow.x = 0; ieWindow.y = 0; ieWindow.cx = 200; ieWindow.cy = 200; CallService(MS_IEVIEW_WINDOW, 0, (LPARAM)&ieWindow); - dat->hwndIEView = ieWindow.hwnd; - Utils::showDlgControl(hwndDlg, IDC_LOG, SW_HIDE); - Utils::enableDlgControl(hwndDlg, IDC_LOG, false); + hwndIEView = ieWindow.hwnd; + Utils::showDlgControl(m_hwnd, IDC_LOG, SW_HIDE); + Utils::enableDlgControl(m_hwnd, IDC_LOG, false); } - else if (iLogMode == WANT_HPP_LOG && dat->hwndHPP == 0) { + else if (iLogMode == WANT_HPP_LOG && hwndHPP == 0) { IEVIEWWINDOW ieWindow; ieWindow.cbSize = sizeof(IEVIEWWINDOW); ieWindow.iType = IEW_CREATE; ieWindow.dwFlags = 0; ieWindow.dwMode = IEWM_TABSRMM; - ieWindow.parent = hwndDlg; + ieWindow.parent = m_hwnd; ieWindow.x = 0; ieWindow.y = 0; ieWindow.cx = 10; ieWindow.cy = 10; CallService(MS_HPP_EG_WINDOW, 0, (LPARAM)&ieWindow); - dat->hwndHPP = ieWindow.hwnd; - Utils::showDlgControl(hwndDlg, IDC_LOG, SW_HIDE); - Utils::enableDlgControl(hwndDlg, IDC_LOG, false); + hwndHPP = ieWindow.hwnd; + Utils::showDlgControl(m_hwnd, IDC_LOG, SW_HIDE); + Utils::enableDlgControl(m_hwnd, IDC_LOG, false); } } -void TSAPI FindFirstEvent(TWindowData *dat) +void CTabBaseDlg::FindFirstEvent() { - int historyMode = db_get_b(dat->hContact, SRMSGMOD, SRMSGSET_LOADHISTORY, -1); + int historyMode = db_get_b(m_hContact, SRMSGMOD, SRMSGSET_LOADHISTORY, -1); if (historyMode == -1) historyMode = (int)M.GetByte(SRMSGMOD, SRMSGSET_LOADHISTORY, SRMSGDEFSET_LOADHISTORY); - dat->hDbEventFirst = db_event_firstUnread(dat->hContact); + hDbEventFirst = db_event_firstUnread(m_hContact); - if (dat->bActualHistory) + if (bActualHistory) historyMode = LOADHISTORY_COUNT; switch (historyMode) { @@ -1122,21 +1107,21 @@ void TSAPI FindFirstEvent(TWindowData *dat) { DBEVENTINFO dbei = {}; // ability to load only current session's history - if (dat->bActualHistory) - i = dat->cache->getSessionMsgCount(); + if (bActualHistory) + i = cache->getSessionMsgCount(); else i = db_get_w(NULL, SRMSGMOD, SRMSGSET_LOADCOUNT, SRMSGDEFSET_LOADCOUNT); for (; i > 0; i--) { - if (dat->hDbEventFirst == NULL) - hPrevEvent = db_event_last(dat->hContact); + if (hDbEventFirst == NULL) + hPrevEvent = db_event_last(m_hContact); else - hPrevEvent = db_event_prev(dat->hContact, dat->hDbEventFirst); + hPrevEvent = db_event_prev(m_hContact, hDbEventFirst); if (hPrevEvent == NULL) break; dbei.cbBlob = 0; - dat->hDbEventFirst = hPrevEvent; - db_event_get(dat->hDbEventFirst, &dbei); + hDbEventFirst = hPrevEvent; + db_event_get(hDbEventFirst, &dbei); if (!DbEventIsShown(&dbei)) i++; } @@ -1145,73 +1130,73 @@ void TSAPI FindFirstEvent(TWindowData *dat) case LOADHISTORY_TIME: DBEVENTINFO dbei = {}; - if (dat->hDbEventFirst == NULL) + if (hDbEventFirst == NULL) dbei.timestamp = time(NULL); else - db_event_get(dat->hDbEventFirst, &dbei); + db_event_get(hDbEventFirst, &dbei); DWORD firstTime = dbei.timestamp - 60 * db_get_w(NULL, SRMSGMOD, SRMSGSET_LOADTIME, SRMSGDEFSET_LOADTIME); for (;;) { - if (dat->hDbEventFirst == NULL) - hPrevEvent = db_event_last(dat->hContact); + if (hDbEventFirst == NULL) + hPrevEvent = db_event_last(m_hContact); else - hPrevEvent = db_event_prev(dat->hContact, dat->hDbEventFirst); + hPrevEvent = db_event_prev(m_hContact, hDbEventFirst); if (hPrevEvent == NULL) break; dbei.cbBlob = 0; db_event_get(hPrevEvent, &dbei); if (dbei.timestamp < firstTime) break; - dat->hDbEventFirst = hPrevEvent; + hDbEventFirst = hPrevEvent; } break; } } -void TSAPI SaveSplitter(TWindowData *dat) +void CTabBaseDlg::SaveSplitter() { // group chats save their normal splitter position independently - if (dat->bType == SESSIONTYPE_CHAT || dat->bIsAutosizingInput) + if (bType == SESSIONTYPE_CHAT || bIsAutosizingInput) return; - if (dat->splitterY < DPISCALEY_S(MINSPLITTERY) || dat->splitterY < 0) - dat->splitterY = DPISCALEY_S(MINSPLITTERY); + if (splitterY < DPISCALEY_S(MINSPLITTERY) || splitterY < 0) + splitterY = DPISCALEY_S(MINSPLITTERY); - if (dat->dwFlagsEx & MWF_SHOW_SPLITTEROVERRIDE) - db_set_dw(dat->hContact, SRMSGMOD_T, "splitsplity", dat->splitterY); + if (dwFlagsEx & MWF_SHOW_SPLITTEROVERRIDE) + db_set_dw(m_hContact, SRMSGMOD_T, "splitsplity", splitterY); else { - if (dat->pContainer->settings->fPrivate) - dat->pContainer->settings->splitterPos = dat->splitterY; + if (pContainer->settings->fPrivate) + pContainer->settings->splitterPos = splitterY; else - db_set_dw(0, SRMSGMOD_T, "splitsplity", dat->splitterY); + db_set_dw(0, SRMSGMOD_T, "splitsplity", splitterY); } } -void TSAPI LoadSplitter(TWindowData *dat) +void CTabBaseDlg::LoadSplitter() { - if (dat->bIsAutosizingInput) { - dat->splitterY = GetDefaultMinimumInputHeight(dat); + if (bIsAutosizingInput) { + splitterY = GetDefaultMinimumInputHeight(); return; } - if (!(dat->dwFlagsEx & MWF_SHOW_SPLITTEROVERRIDE)) - if (!dat->pContainer->settings->fPrivate) - dat->splitterY = (int)M.GetDword("splitsplity", (DWORD)60); + if (!(dwFlagsEx & MWF_SHOW_SPLITTEROVERRIDE)) { + if (!pContainer->settings->fPrivate) + splitterY = (int)M.GetDword("splitsplity", (DWORD)60); else - dat->splitterY = dat->pContainer->settings->splitterPos; - else - dat->splitterY = (int)M.GetDword(dat->hContact, "splitsplity", M.GetDword("splitsplity", (DWORD)70)); + splitterY = pContainer->settings->splitterPos; + } + else splitterY = (int)M.GetDword(m_hContact, "splitsplity", M.GetDword("splitsplity", (DWORD)70)); - if (dat->splitterY < MINSPLITTERY || dat->splitterY < 0) - dat->splitterY = 150; + if (splitterY < MINSPLITTERY || splitterY < 0) + splitterY = 150; } -void TSAPI PlayIncomingSound(const TWindowData *dat) +void CTabBaseDlg::PlayIncomingSound() const { - int iPlay = Utils::mustPlaySound(dat); + int iPlay = Utils::mustPlaySound(this); if (iPlay) { - if (GetForegroundWindow() == dat->pContainer->hwnd && dat->pContainer->hwndActive == dat->hwnd) + if (GetForegroundWindow() == pContainer->hwnd && pContainer->hwndActive == m_hwnd) SkinPlaySound("RecvMsgActive"); else SkinPlaySound("RecvMsgInactive"); @@ -1224,16 +1209,16 @@ void TSAPI PlayIncomingSound(const TWindowData *dat) static UINT controls[] = { IDC_FONTBOLD, IDC_FONTITALIC, IDC_FONTUNDERLINE, IDC_FONTSTRIKEOUT }; -void TSAPI GetSendFormat(TWindowData *dat) +void CTabBaseDlg::GetSendFormat() { - dat->SendFormat = M.GetDword(dat->hContact, "sendformat", PluginConfig.m_SendFormat); - if (dat->SendFormat == -1) // per contact override to disable it.. - dat->SendFormat = 0; - else if (dat->SendFormat == 0) - dat->SendFormat = PluginConfig.m_SendFormat ? 1 : 0; + SendFormat = M.GetDword(m_hContact, "sendformat", PluginConfig.m_SendFormat); + if (SendFormat == -1) // per contact override to disable it.. + SendFormat = 0; + else if (SendFormat == 0) + SendFormat = PluginConfig.m_SendFormat ? 1 : 0; for (int i = 0; i < _countof(controls); i++) - Utils::enableDlgControl(dat->hwnd, controls[i], dat->SendFormat != 0); + Utils::enableDlgControl(m_hwnd, controls[i], SendFormat != 0); return; } @@ -1243,7 +1228,7 @@ void TSAPI GetSendFormat(TWindowData *dat) // // GetLocaleInfo() should no longer be used on Vista and later -void TSAPI GetLocaleID(TWindowData *dat, const wchar_t *szKLName) +void CTabBaseDlg::GetLocaleID(const wchar_t *szKLName) { wchar_t szLI[256], *stopped = NULL; USHORT langID; @@ -1256,7 +1241,7 @@ void TSAPI GetLocaleID(TWindowData *dat, const wchar_t *szKLName) memset(&pf2, 0, sizeof(PARAFORMAT2)); langID = (USHORT)wcstol(szKLName, &stopped, 16); - dat->lcid = MAKELCID(langID, 0); + lcid = MAKELCID(langID, 0); /* * Vista+: read ISO locale names from the registry */ @@ -1281,117 +1266,100 @@ void TSAPI GetLocaleID(TWindowData *dat, const wchar_t *szKLName) szLI[1] = towupper(szLI[1]); } else { - GetLocaleInfo(dat->lcid, LOCALE_SISO639LANGNAME, szLI, 10); + GetLocaleInfo(lcid, LOCALE_SISO639LANGNAME, szLI, 10); wcsupr(szLI); } - fLocaleNotSet = (dat->lcID[0] == 0 && dat->lcID[1] == 0); - mir_snwprintf(dat->lcID, szLI); - GetStringTypeA(dat->lcid, CT_CTYPE2, (char*)szTest, 3, wCtype2); + fLocaleNotSet = (lcID[0] == 0 && lcID[1] == 0); + mir_snwprintf(lcID, szLI); + GetStringTypeA(lcid, CT_CTYPE2, (char*)szTest, 3, wCtype2); pf2.cbSize = sizeof(pf2); pf2.dwMask = PFM_RTLPARA; - SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_GETPARAFORMAT, 0, (LPARAM)&pf2); - if (Utils::FindRTLLocale(dat) && fLocaleNotSet) { + m_message.SendMsg(EM_GETPARAFORMAT, 0, (LPARAM)&pf2); + if (Utils::FindRTLLocale(this) && fLocaleNotSet) { if (wCtype2[0] == C2_RIGHTTOLEFT || wCtype2[1] == C2_RIGHTTOLEFT || wCtype2[2] == C2_RIGHTTOLEFT) { memset(&pf2, 0, sizeof(pf2)); pf2.dwMask = PFM_RTLPARA; pf2.cbSize = sizeof(pf2); pf2.wEffects = PFE_RTLPARA; - SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETPARAFORMAT, 0, (LPARAM)&pf2); + m_message.SendMsg(EM_SETPARAFORMAT, 0, (LPARAM)&pf2); } else { memset(&pf2, 0, sizeof(pf2)); pf2.dwMask = PFM_RTLPARA; pf2.cbSize = sizeof(pf2); pf2.wEffects = 0; - SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETPARAFORMAT, 0, (LPARAM)&pf2); + m_message.SendMsg(EM_SETPARAFORMAT, 0, (LPARAM)&pf2); } - SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETLANGOPTIONS, 0, (LPARAM)SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_GETLANGOPTIONS, 0, 0) & ~IMF_AUTOKEYBOARD); + m_message.SendMsg(EM_SETLANGOPTIONS, 0, m_message.SendMsg(EM_GETLANGOPTIONS, 0, 0) & ~IMF_AUTOKEYBOARD); } } -void TSAPI LoadContactAvatar(TWindowData *dat) +void CTabBaseDlg::LoadContactAvatar() { - if (dat == NULL) return; - - dat->ace = Utils::loadAvatarFromAVS(dat->bIsMeta ? db_mc_getSrmmSub(dat->hContact) : dat->hContact); + ace = Utils::loadAvatarFromAVS(bIsMeta ? db_mc_getSrmmSub(m_hContact) : m_hContact); BITMAP bm; - if (dat->ace && dat->ace->hbmPic) - GetObject(dat->ace->hbmPic, sizeof(bm), &bm); - else if (dat->ace == NULL) + if (ace && ace->hbmPic) + GetObject(ace->hbmPic, sizeof(bm), &bm); + else if (ace == NULL) GetObject(PluginConfig.g_hbmUnknown, sizeof(bm), &bm); else return; - AdjustBottomAvatarDisplay(dat); - CalcDynamicAvatarSize(dat, &bm); + AdjustBottomAvatarDisplay(); + CalcDynamicAvatarSize(&bm); - if (!dat->Panel->isActive() || dat->pContainer->avatarMode == 3) { - dat->iRealAvatarHeight = 0; - PostMessage(dat->hwnd, WM_SIZE, 0, 0); + if (!Panel->isActive() || pContainer->avatarMode == 3) { + iRealAvatarHeight = 0; + PostMessage(m_hwnd, WM_SIZE, 0, 0); } - else if (dat->Panel->isActive()) - GetAvatarVisibility(dat->hwnd, dat); + else if (Panel->isActive()) + GetAvatarVisibility(); } -void TSAPI LoadOwnAvatar(TWindowData *dat) +void CTabBaseDlg::LoadOwnAvatar() { - AVATARCACHEENTRY *ace = NULL; - if (ServiceExists(MS_AV_GETMYAVATAR)) - ace = (AVATARCACHEENTRY *)CallService(MS_AV_GETMYAVATAR, 0, (LPARAM)(dat->cache->getActiveProto())); + ownAce = (AVATARCACHEENTRY *)CallService(MS_AV_GETMYAVATAR, 0, (LPARAM)(cache->getActiveProto())); + else + ownAce = nullptr; - if (ace) { - dat->hOwnPic = ace->hbmPic; - dat->ownAce = ace; - } - else { - dat->hOwnPic = PluginConfig.g_hbmUnknown; - dat->ownAce = NULL; - } - if (dat->Panel->isActive() && dat->pContainer->avatarMode != 3) { + if (ownAce) + hOwnPic = ownAce->hbmPic; + else + hOwnPic = PluginConfig.g_hbmUnknown; + + if (Panel->isActive() && pContainer->avatarMode != 3) { BITMAP bm; - dat->iRealAvatarHeight = 0; - AdjustBottomAvatarDisplay(dat); - GetObject(dat->hOwnPic, sizeof(bm), &bm); - CalcDynamicAvatarSize(dat, &bm); - SendMessage(dat->hwnd, WM_SIZE, 0, 0); + iRealAvatarHeight = 0; + AdjustBottomAvatarDisplay(); + GetObject(hOwnPic, sizeof(bm), &bm); + CalcDynamicAvatarSize(&bm); + SendMessage(m_hwnd, WM_SIZE, 0, 0); } } -void TSAPI LoadTimeZone(TWindowData *dat) -{ - if (dat) - dat->hTimeZone = TimeZone_CreateByContact(dat->hContact, 0, TZF_KNOWNONLY); -} - // paste contents of the clipboard into the message input area and send it immediately -void TSAPI HandlePasteAndSend(const TWindowData *dat) +void CTabBaseDlg::HandlePasteAndSend() { - UINT ctrlID = dat->bType == SESSIONTYPE_IM ? IDC_MESSAGE : IDC_CHAT_MESSAGE; - + // is feature disabled? if (!PluginConfig.m_PasteAndSend) { - SendMessage(dat->hwnd, DM_ACTIVATETOOLTIP, ctrlID, (LPARAM)TranslateT("The 'paste and send' feature is disabled. You can enable it on the 'General' options page in the 'Sending messages' section")); - return; // feature disabled + SendMessage(m_hwnd, DM_ACTIVATETOOLTIP, IDC_MESSAGE, (LPARAM)TranslateT("The 'paste and send' feature is disabled. You can enable it on the 'General' options page in the 'Sending messages' section")); + return; } - SendDlgItemMessage(dat->hwnd, ctrlID, EM_PASTESPECIAL, CF_UNICODETEXT, 0); - if (GetWindowTextLength(GetDlgItem(dat->hwnd, ctrlID)) > 0) - SendMessage(dat->hwnd, WM_COMMAND, IDOK, 0); + m_message.SendMsg(EM_PASTESPECIAL, CF_UNICODETEXT, 0); + if (GetWindowTextLength(m_message.GetHwnd()) > 0) + SendMessage(m_hwnd, WM_COMMAND, IDOK, 0); } ///////////////////////////////////////////////////////////////////////////////////////// // draw various elements of the message window, like avatar(s), info panel fields // and the color formatting menu -int TSAPI MsgWindowDrawHandler(WPARAM, LPARAM lParam, TWindowData *dat) +int CTabBaseDlg::MsgWindowDrawHandler(WPARAM, LPARAM lParam) { - if (!dat) - return 0; - - HWND hwndDlg = dat->hwnd; - LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; if (dis->CtlType == ODT_MENU && dis->hwndItem == (HWND)GetSubMenu(PluginConfig.g_hMenuContext, 7)) { RECT rc = { 0 }; @@ -1441,19 +1409,19 @@ int TSAPI MsgWindowDrawHandler(WPARAM, LPARAM lParam, TWindowData *dat) return TRUE; } - HBITMAP hbmAvatar = dat->ace ? dat->ace->hbmPic : PluginConfig.g_hbmUnknown; - if ((dis->hwndItem == GetDlgItem(hwndDlg, IDC_CONTACTPIC) && dat->bShowAvatar) || (dis->hwndItem == hwndDlg && dat->Panel->isActive())) { + HBITMAP hbmAvatar = ace ? ace->hbmPic : PluginConfig.g_hbmUnknown; + if ((dis->hwndItem == GetDlgItem(m_hwnd, IDC_CONTACTPIC) && bShowAvatar) || (dis->hwndItem == m_hwnd && Panel->isActive())) { if (hbmAvatar == NULL) return TRUE; int top, cx, cy; RECT rcClient, rcFrame; - bool bPanelPic = dis->hwndItem == hwndDlg; - if (bPanelPic && !dat->bShowInfoAvatar) + bool bPanelPic = (dis->hwndItem == m_hwnd); + if (bPanelPic && !bShowInfoAvatar) return TRUE; RECT rc; - GetClientRect(hwndDlg, &rc); + GetClientRect(m_hwnd, &rc); if (bPanelPic) { rcClient = dis->rcItem; cx = (rcClient.right - rcClient.left); @@ -1479,10 +1447,10 @@ int TSAPI MsgWindowDrawHandler(WPARAM, LPARAM lParam, TWindowData *dat) rcFrame = rcClient; if (!bPanelPic) { - top = (cy - dat->pic.cy) / 2; - RECT rcEdge = { 0, top, dat->pic.cx, top + dat->pic.cy }; + top = (cy - pic.cy) / 2; + RECT rcEdge = { 0, top, pic.cx, top + pic.cy }; if (CSkin::m_skinEnabled) - CSkin::SkinDrawBG(dis->hwndItem, dat->pContainer->hwnd, dat->pContainer, &dis->rcItem, hdcDraw); + CSkin::SkinDrawBG(dis->hwndItem, pContainer->hwnd, pContainer, &dis->rcItem, hdcDraw); else if (PluginConfig.m_fillColor) { HBRUSH br = CreateSolidBrush(PluginConfig.m_fillColor); FillRect(hdcDraw, &rcFrame, br); @@ -1522,22 +1490,22 @@ int TSAPI MsgWindowDrawHandler(WPARAM, LPARAM lParam, TWindowData *dat) bool bBorder = (CSkin::m_bAvatarBorderType ? true : false); int border_off = bBorder ? 1 : 0; - int iMaxHeight = dat->iPanelAvatarY - (bBorder ? 2 : 0); - int iMaxWidth = dat->iPanelAvatarX - (bBorder ? 2 : 0); + int iMaxHeight = iPanelAvatarY - (bBorder ? 2 : 0); + int iMaxWidth = iPanelAvatarX - (bBorder ? 2 : 0); rcFrame.left = rcFrame.top = 0; rcFrame.right = (rcClient.right - rcClient.left); rcFrame.bottom = (rcClient.bottom - rcClient.top); - rcFrame.left = rcFrame.right - (LONG)dat->iPanelAvatarX; - rcFrame.bottom = (LONG)dat->iPanelAvatarY; + rcFrame.left = rcFrame.right - (LONG)iPanelAvatarX; + rcFrame.bottom = (LONG)iPanelAvatarY; int height_off = (cy - iMaxHeight - (bBorder ? 2 : 0)) / 2; rcFrame.top += height_off; rcFrame.bottom += height_off; - SendMessage(dat->hwndPanelPic, AVATAR_SETAEROCOMPATDRAWING, 0, bAero ? TRUE : FALSE); - SetWindowPos(dat->hwndPanelPic, HWND_TOP, rcFrame.left + border_off, rcFrame.top + border_off, + SendMessage(hwndPanelPic, AVATAR_SETAEROCOMPATDRAWING, 0, bAero ? TRUE : FALSE); + SetWindowPos(hwndPanelPic, HWND_TOP, rcFrame.left + border_off, rcFrame.top + border_off, iMaxWidth, iMaxHeight, SWP_SHOWWINDOW | SWP_ASYNCWINDOWPOS | SWP_DEFERERASE | SWP_NOSENDCHANGING); } @@ -1550,11 +1518,11 @@ int TSAPI MsgWindowDrawHandler(WPARAM, LPARAM lParam, TWindowData *dat) return TRUE; } - if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_STATICTEXT) || dis->hwndItem == GetDlgItem(hwndDlg, IDC_LOGFROZENTEXT)) { + if (dis->hwndItem == GetDlgItem(m_hwnd, IDC_STATICTEXT) || dis->hwndItem == GetDlgItem(m_hwnd, IDC_LOGFROZENTEXT)) { wchar_t szWindowText[256]; if (CSkin::m_skinEnabled) { SetTextColor(dis->hDC, CSkin::m_DefaultFontColor); - CSkin::SkinDrawBG(dis->hwndItem, dat->pContainer->hwnd, dat->pContainer, &dis->rcItem, dis->hDC); + CSkin::SkinDrawBG(dis->hwndItem, pContainer->hwnd, pContainer, &dis->rcItem, dis->hDC); } else { SetTextColor(dis->hDC, GetSysColor(COLOR_BTNTEXT)); @@ -1567,9 +1535,9 @@ int TSAPI MsgWindowDrawHandler(WPARAM, LPARAM lParam, TWindowData *dat) return TRUE; } - if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_STATICERRORICON)) { + if (dis->hwndItem == GetDlgItem(m_hwnd, IDC_STATICERRORICON)) { if (CSkin::m_skinEnabled) - CSkin::SkinDrawBG(dis->hwndItem, dat->pContainer->hwnd, dat->pContainer, &dis->rcItem, dis->hDC); + CSkin::SkinDrawBG(dis->hwndItem, pContainer->hwnd, pContainer, &dis->rcItem, dis->hDC); else CSkin::FillBack(dis->hDC, &dis->rcItem); DrawIconEx(dis->hDC, (dis->rcItem.right - dis->rcItem.left) / 2 - 8, (dis->rcItem.bottom - dis->rcItem.top) / 2 - 8, @@ -1577,7 +1545,7 @@ int TSAPI MsgWindowDrawHandler(WPARAM, LPARAM lParam, TWindowData *dat) return TRUE; } - if (dis->CtlType == ODT_MENU && dat->Panel->isHovered()) { + if (dis->CtlType == ODT_MENU && Panel->isHovered()) { DrawMenuItem(dis, (HICON)dis->itemData, 0); return TRUE; } @@ -1652,16 +1620,16 @@ void TSAPI LoadOverrideTheme(TContainerData *pContainer) LoadThemeDefaults(pContainer); } -HICON TSAPI GetXStatusIcon(const TWindowData *dat) +HICON CTabBaseDlg::GetXStatusIcon() const { - BYTE xStatus = dat->cache->getXStatusId(); + BYTE xStatus = cache->getXStatusId(); if (xStatus == 0) return NULL; - if (!ProtoServiceExists(dat->cache->getActiveProto(), PS_GETCUSTOMSTATUSICON)) + if (!ProtoServiceExists(cache->getActiveProto(), PS_GETCUSTOMSTATUSICON)) return NULL; - return (HICON)(CallProtoService(dat->cache->getActiveProto(), PS_GETCUSTOMSTATUSICON, xStatus, 0)); + return (HICON)(CallProtoService(cache->getActiveProto(), PS_GETCUSTOMSTATUSICON, xStatus, 0)); } LRESULT TSAPI GetSendButtonState(HWND hwnd) @@ -1674,100 +1642,98 @@ LRESULT TSAPI GetSendButtonState(HWND hwnd) return 0; } -void TSAPI EnableSendButton(const TWindowData *dat, int iMode) +void CTabBaseDlg::EnableSendButton(bool bMode) const { - SendDlgItemMessage(dat->hwnd, IDOK, BUTTONSETASNORMAL, iMode, 0); - SendDlgItemMessage(dat->hwnd, IDC_PIC, BUTTONSETASNORMAL, dat->fEditNotesActive ? TRUE : (!iMode && dat->iOpenJobs == 0) ? TRUE : FALSE, 0); - - HWND hwndOK = GetDlgItem(GetParent(GetParent(dat->hwnd)), IDOK); + SendDlgItemMessage(m_hwnd, IDOK, BUTTONSETASNORMAL, bMode, 0); + SendDlgItemMessage(m_hwnd, IDC_PIC, BUTTONSETASNORMAL, fEditNotesActive ? TRUE : (!bMode && iOpenJobs == 0) ? TRUE : FALSE, 0); + HWND hwndOK = GetDlgItem(GetParent(GetParent(m_hwnd)), IDOK); if (IsWindow(hwndOK)) - SendMessage(hwndOK, BUTTONSETASNORMAL, iMode, 0); + SendMessage(hwndOK, BUTTONSETASNORMAL, bMode, 0); } -void TSAPI SendNudge(const TWindowData *dat) +void CTabBaseDlg::SendNudge() const { - if (ProtoServiceExists(dat->cache->getActiveProto(), PS_SEND_NUDGE) && ServiceExists(MS_NUDGE_SEND)) - CallService(MS_NUDGE_SEND, (WPARAM)dat->cache->getActiveContact(), 0); + if (ProtoServiceExists(cache->getActiveProto(), PS_SEND_NUDGE) && ServiceExists(MS_NUDGE_SEND)) + CallService(MS_NUDGE_SEND, cache->getActiveContact(), 0); else - SendMessage(dat->hwnd, DM_ACTIVATETOOLTIP, IDC_MESSAGE, - (LPARAM)TranslateT("Either the nudge plugin is not installed or the contact's protocol does not support sending a nudge event.")); + SendMessage(m_hwnd, DM_ACTIVATETOOLTIP, IDC_MESSAGE, + (LPARAM)TranslateT("Either the nudge plugin is not installed or the contact's protocol does not support sending a nudge event.")); } -void TSAPI GetClientIcon(TWindowData *dat) +void CTabBaseDlg::GetClientIcon() { - if (dat->hClientIcon) - DestroyIcon(dat->hClientIcon); + if (hClientIcon) + DestroyIcon(hClientIcon); - dat->hClientIcon = 0; + hClientIcon = nullptr; if (ServiceExists(MS_FP_GETCLIENTICONT)) { - ptrW tszMirver(db_get_wsa(dat->cache->getActiveContact(), dat->cache->getActiveProto(), "MirVer")); + ptrW tszMirver(db_get_wsa(cache->getActiveContact(), cache->getActiveProto(), "MirVer")); if (tszMirver) - dat->hClientIcon = Finger_GetClientIcon(tszMirver, 1); + hClientIcon = Finger_GetClientIcon(tszMirver, 1); } } -void TSAPI GetMyNick(TWindowData *dat) +void CTabBaseDlg::GetMyNick() { - ptrW tszNick(Contact_GetInfo(CNF_NICK, NULL, dat->cache->getActiveProto())); + ptrW tszNick(Contact_GetInfo(CNF_NICK, NULL, cache->getActiveProto())); if (tszNick != NULL) { if (mir_wstrlen(tszNick) == 0 || !mir_wstrcmp(tszNick, TranslateT("'(Unknown contact)'"))) - wcsncpy_s(dat->szMyNickname, (dat->myUin[0] ? dat->myUin : TranslateT("'(Unknown contact)'")), _TRUNCATE); + wcsncpy_s(szMyNickname, (myUin[0] ? myUin : TranslateT("'(Unknown contact)'")), _TRUNCATE); else - wcsncpy_s(dat->szMyNickname, tszNick, _TRUNCATE); + wcsncpy_s(szMyNickname, tszNick, _TRUNCATE); } - else wcsncpy_s(dat->szMyNickname, L"", _TRUNCATE); // same here + else wcsncpy_s(szMyNickname, L"", _TRUNCATE); // same here } -HICON TSAPI MY_GetContactIcon(const TWindowData *dat, LPCSTR szSetting) +HICON CTabBaseDlg::GetMyContactIcon(LPCSTR szSetting) { int bUseMeta = (szSetting == NULL) ? false : M.GetByte(szSetting, mir_strcmp(szSetting, "MetaiconTab") == 0); if (bUseMeta) - return Skin_LoadProtoIcon(dat->cache->getProto(), dat->cache->getStatus()); - return Skin_LoadProtoIcon(dat->cache->getActiveProto(), dat->cache->getActiveStatus()); + return Skin_LoadProtoIcon(cache->getProto(), cache->getStatus()); + return Skin_LoadProtoIcon(cache->getActiveProto(), cache->getActiveStatus()); } ///////////////////////////////////////////////////////////////////////////////////////// // read keyboard state and return the state of the modifier keys -void TSAPI KbdState(TWindowData *dat, BOOL& isShift, BOOL& isControl, BOOL& isAlt) +void CTabBaseDlg::KbdState(bool &isShift, bool &isControl, bool &isAlt) { - GetKeyboardState(dat->kstate); - isShift = (dat->kstate[VK_SHIFT] & 0x80); - isControl = (dat->kstate[VK_CONTROL] & 0x80); - isAlt = (dat->kstate[VK_MENU] & 0x80); + GetKeyboardState(kstate); + isShift = (kstate[VK_SHIFT] & 0x80) != 0; + isControl = (kstate[VK_CONTROL] & 0x80) != 0; + isAlt = (kstate[VK_MENU] & 0x80) != 0; } ///////////////////////////////////////////////////////////////////////////////////////// // clear the message log // code needs to distuingish between IM and MUC sessions. -void TSAPI ClearLog(TWindowData *dat) +void CTabBaseDlg::ClearLog() { - if (dat && dat->bType == SESSIONTYPE_IM) { - if (dat->hwndIEView || dat->hwndHPP) { + if (bType == SESSIONTYPE_IM) { + if (hwndIEView || hwndHPP) { IEVIEWEVENT event; event.cbSize = sizeof(IEVIEWEVENT); event.iType = IEE_CLEAR_LOG; - event.dwFlags = (dat->dwFlags & MWF_LOG_RTL) ? IEEF_RTL : 0; - event.hContact = dat->hContact; - if (dat->hwndIEView) { - event.hwnd = dat->hwndIEView; + event.dwFlags = (dwFlags & MWF_LOG_RTL) ? IEEF_RTL : 0; + event.hContact = m_hContact; + if (hwndIEView) { + event.hwnd = hwndIEView; CallService(MS_IEVIEW_EVENT, 0, (LPARAM)&event); } else { - event.hwnd = dat->hwndHPP; + event.hwnd = hwndHPP; CallService(MS_HPP_EG_EVENT, 0, (LPARAM)&event); } } - SetDlgItemText(dat->hwnd, IDC_LOG, L""); - dat->hDbEventFirst = NULL; + m_log.SetText(L""); + hDbEventFirst = 0; } - else if (dat && dat->bType == SESSIONTYPE_CHAT && dat->si) { - SESSION_INFO *si = dat->si; - SESSION_INFO* s = pci->SM_FindSession(si->ptszID, si->pszModule); + else if (bType == SESSIONTYPE_CHAT && si) { + SESSION_INFO *s = pci->SM_FindSession(si->ptszID, si->pszModule); if (s) { - SetDlgItemText(dat->hwnd, IDC_CHAT_LOG, L""); + m_log.SetText(L""); pci->LM_RemoveAll(&s->pLog, &s->pLogEnd); s->iEventCount = 0; s->LastTime = 0; @@ -1775,7 +1741,7 @@ void TSAPI ClearLog(TWindowData *dat) si->LastTime = 0; si->pLog = s->pLog; si->pLogEnd = s->pLogEnd; - PostMessage(dat->hwnd, WM_MOUSEACTIVATE, 0, 0); + PostMessage(m_hwnd, WM_MOUSEACTIVATE, 0, 0); } } } @@ -1787,55 +1753,51 @@ void TSAPI ClearLog(TWindowData *dat) // the container will use this in its WM_GETMINMAXINFO handler to set // minimum tracking height. -void TSAPI DetermineMinHeight(TWindowData *dat) +void CTabBaseDlg::DetermineMinHeight() { - if (!dat) - return; - RECT rc; - LONG height = (dat->Panel->isActive() ? dat->Panel->getHeight() + 2 : 0); - if (!(dat->pContainer->dwFlags & CNT_HIDETOOLBAR)) + LONG height = (Panel->isActive() ? Panel->getHeight() + 2 : 0); + if (!(pContainer->dwFlags & CNT_HIDETOOLBAR)) height += DPISCALEY_S(24); // toolbar - GetClientRect(GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_MESSAGE : IDC_CHAT_MESSAGE), &rc); + GetClientRect(m_message.GetHwnd(), &rc); height += rc.bottom; // input area height += 40; // min space for log area and some padding - dat->pContainer->uChildMinHeight = height; + pContainer->uChildMinHeight = height; } -bool TSAPI IsAutoSplitEnabled(const TWindowData *dat) +bool CTabBaseDlg::IsAutoSplitEnabled() const { - return((dat && (dat->pContainer->dwFlags & CNT_AUTOSPLITTER) && !(dat->dwFlagsEx & MWF_SHOW_SPLITTEROVERRIDE)) ? true : false); + return (pContainer->dwFlags & CNT_AUTOSPLITTER) && !(dwFlagsEx & MWF_SHOW_SPLITTEROVERRIDE); } -LONG TSAPI GetDefaultMinimumInputHeight(const TWindowData *dat) +LONG CTabBaseDlg::GetDefaultMinimumInputHeight() const { - LONG height = MINSPLITTERY; + LONG height; - if (dat) { - if (dat->bType == SESSIONTYPE_IM) - height = ((dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR) ? DPISCALEY_S(46 + 22) : DPISCALEY_S(46)); - else - height = ((dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR) ? DPISCALEY_S(22 + 46) : DPISCALEY_S(46)) - DPISCALEY_S(23); + if (bType == SESSIONTYPE_IM) + height = ((pContainer->dwFlags & CNT_BOTTOMTOOLBAR) ? DPISCALEY_S(46 + 22) : DPISCALEY_S(46)); + else + height = ((pContainer->dwFlags & CNT_BOTTOMTOOLBAR) ? DPISCALEY_S(22 + 46) : DPISCALEY_S(46)) - DPISCALEY_S(23); - if (CSkin::m_skinEnabled && !SkinItems[ID_EXTBKINPUTAREA].IGNORED) - height += (SkinItems[ID_EXTBKINPUTAREA].MARGIN_BOTTOM + SkinItems[ID_EXTBKINPUTAREA].MARGIN_TOP - 2); - } - return(height); + if (CSkin::m_skinEnabled && !SkinItems[ID_EXTBKINPUTAREA].IGNORED) + height += (SkinItems[ID_EXTBKINPUTAREA].MARGIN_BOTTOM + SkinItems[ID_EXTBKINPUTAREA].MARGIN_TOP - 2); + + return height; } static LIST vTempFilenames(5); // send a pasted bitmap by file transfer. -void TSAPI SendHBitmapAsFile(const TWindowData *dat, HBITMAP hbmp) +void CTabBaseDlg::SendHBitmapAsFile(HBITMAP hbmp) const { - const wchar_t* mirandatempdir = L"Miranda"; - const wchar_t* filenametemplate = L"\\clp-%Y%m%d-%H%M%S0.jpg"; - wchar_t filename[MAX_PATH]; - size_t tempdirlen = GetTempPath(MAX_PATH, filename); - bool fSend = true; + const wchar_t *mirandatempdir = L"Miranda"; + const wchar_t *filenametemplate = L"\\clp-%Y%m%d-%H%M%S0.jpg"; + wchar_t filename[MAX_PATH]; + size_t tempdirlen = GetTempPath(MAX_PATH, filename); + bool fSend = true; - const char *szProto = dat->cache->getActiveProto(); + const char *szProto = cache->getActiveProto(); WORD wMyStatus = (WORD)CallProtoService(szProto, PS_GETSTATUS, 0, 0); DWORD protoCaps = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0); @@ -1847,13 +1809,13 @@ void TSAPI SendHBitmapAsFile(const TWindowData *dat, HBITMAP hbmp) if (!(protoCaps & PF1_FILESEND)) fSend = false; - if ((ID_STATUS_OFFLINE == wMyStatus) || (ID_STATUS_OFFLINE == dat->cache->getActiveStatus() && !(typeCaps & PF4_OFFLINEFILES))) + if ((ID_STATUS_OFFLINE == wMyStatus) || (ID_STATUS_OFFLINE == cache->getActiveStatus() && !(typeCaps & PF4_OFFLINEFILES))) fSend = false; - if (protoCaps & PF1_VISLIST && db_get_w(dat->cache->getActiveContact(), szProto, "ApparentMode", 0) == ID_STATUS_OFFLINE) + if (protoCaps & PF1_VISLIST && db_get_w(cache->getActiveContact(), szProto, "ApparentMode", 0) == ID_STATUS_OFFLINE) fSend = false; - if (protoCaps & PF1_INVISLIST && wMyStatus == ID_STATUS_INVISIBLE && db_get_w(dat->cache->getActiveContact(), szProto, "ApparentMode", 0) != ID_STATUS_ONLINE) + if (protoCaps & PF1_INVISLIST && wMyStatus == ID_STATUS_INVISIBLE && db_get_w(cache->getActiveContact(), szProto, "ApparentMode", 0) != ID_STATUS_ONLINE) fSend = false; if (!fSend) { @@ -1921,7 +1883,7 @@ void TSAPI SendHBitmapAsFile(const TWindowData *dat, HBITMAP hbmp) wchar_t* _t = mir_wstrdup(filename); vTempFilenames.insert(_t); - CallService(MS_FILE_SENDSPECIFICFILEST, (WPARAM)dat->cache->getActiveContact(), (LPARAM)ppFiles); + CallService(MS_FILE_SENDSPECIFICFILEST, (WPARAM)cache->getActiveContact(), (LPARAM)ppFiles); mir_free(ppFiles[0]); mir_free(ppFiles); diff --git a/plugins/TabSRMM/src/msgdlgutils.h b/plugins/TabSRMM/src/msgdlgutils.h index 01f7399bd8..32ca9e0631 100644 --- a/plugins/TabSRMM/src/msgdlgutils.h +++ b/plugins/TabSRMM/src/msgdlgutils.h @@ -30,61 +30,21 @@ #define WANT_IEVIEW_LOG 1 #define WANT_HPP_LOG 2 -void TSAPI CalcDynamicAvatarSize(TWindowData *dat, BITMAP *bminfo); -char* TSAPI GetCurrentMetaContactProto(TWindowData *dat); -int TSAPI MsgWindowUpdateMenu(TWindowData *dat, HMENU submenu, int menuID); -int TSAPI MsgWindowMenuHandler(TWindowData *dat, int selection, int menuId); -bool TSAPI GetAvatarVisibility(HWND hwndDlg, TWindowData *dat); void TSAPI ProcessAvatarChange(HWND hwnd, LPARAM lParam); -void TSAPI UpdateStatusBar(const TWindowData *dat); int TSAPI CheckValidSmileyPack(const char *szProto, MCONTACT hContact); wchar_t* TSAPI QuoteText(const wchar_t *text); -void TSAPI UpdateReadChars(const TWindowData *dat); -void TSAPI ShowPicture(TWindowData *dat, BOOL showNewPic); -void TSAPI AdjustBottomAvatarDisplay(TWindowData *dat); void TSAPI SetDialogToType(HWND hwndDlg); -void TSAPI FlashOnClist(HWND hwndDlg, TWindowData *dat, MEVENT hEvent, DBEVENTINFO *dbei); char* TSAPI Message_GetFromStream(HWND hwndRtf, DWORD dwPassedFlags = 0); -BOOL TSAPI DoRtfToTags(const TWindowData *dat, CMStringW &pszText, int iNumColors, COLORREF *pColors); -void TSAPI GetMYUIN(TWindowData *dat); -void TSAPI SetMessageLog(TWindowData *dat); -void TSAPI SwitchMessageLog(TWindowData *dat, int iMode); UINT TSAPI GetIEViewMode(MCONTACT hContact); -void TSAPI FindFirstEvent(TWindowData *dat); -void TSAPI SaveSplitter(TWindowData *dat); -void TSAPI LoadSplitter(TWindowData *dat); -void TSAPI PlayIncomingSound(const TWindowData *dat); -void TSAPI GetSendFormat(TWindowData *dat); -void TSAPI GetLocaleID(TWindowData *dat, const wchar_t *szKLName); -void TSAPI LoadOwnAvatar(TWindowData *dat); -void TSAPI LoadContactAvatar(TWindowData *dat); -void TSAPI LoadTimeZone(TWindowData *dat); -void TSAPI HandlePasteAndSend(const TWindowData *dat); -int TSAPI MsgWindowDrawHandler(WPARAM wParam, LPARAM lParam, TWindowData *dat); void TSAPI LoadOverrideTheme(TContainerData *pContainer); void TSAPI LoadThemeDefaults(TContainerData *pContainer); int TSAPI CutContactName(const wchar_t *szold, wchar_t *sznew, size_t size); -void TSAPI SendNudge(const TWindowData *dat); -void TSAPI EnableSendButton(const TWindowData *dat, int iMode); LRESULT TSAPI GetSendButtonState(HWND hwnd); -HICON TSAPI GetXStatusIcon(const TWindowData *dat); -void TSAPI FlashTab(TWindowData *dat, HWND hwndTab, int iTabindex, BOOL *bState, BOOL mode, HICON origImage); -void TSAPI GetClientIcon(TWindowData *dat); -void TSAPI RearrangeTab(HWND hwndDlg, const TWindowData *dat, int iMode, BOOL fSavePos); -void TSAPI GetCachedStatusMsg(TWindowData *dat); +void TSAPI RearrangeTab(HWND hwndDlg, const CTabBaseDlg *dat, int iMode, BOOL fSavePos); bool TSAPI IsStatusEvent(int eventType); bool TSAPI IsCustomEvent(int eventType); -void TSAPI GetMyNick(TWindowData *dat); -HICON TSAPI MY_GetContactIcon(const TWindowData *dat, LPCSTR szSetting); -void TSAPI CheckAndDestroyIEView(TWindowData *dat); -void TSAPI KbdState(TWindowData *dat, BOOL& isShift, BOOL& isControl, BOOL& isAlt); -void TSAPI ClearLog(TWindowData *dat); -bool TSAPI IsAutoSplitEnabled(const TWindowData *dat); -LONG TSAPI GetDefaultMinimumInputHeight(const TWindowData *dat); -void TSAPI DetermineMinHeight(TWindowData *dat); void TSAPI CleanTempFiles(); -void TSAPI SendHBitmapAsFile(const TWindowData *dat, HBITMAP hbmp); extern INT_PTR CALLBACK SelectContainerDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); extern INT_PTR CALLBACK DlgProcContainerOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); diff --git a/plugins/TabSRMM/src/msglog.cpp b/plugins/TabSRMM/src/msglog.cpp index f87e1e4c40..340ea4651a 100644 --- a/plugins/TabSRMM/src/msglog.cpp +++ b/plugins/TabSRMM/src/msglog.cpp @@ -93,7 +93,7 @@ struct LogStreamData { int eventsToInsert; int isEmpty; int isAppend; - TWindowData *dlgDat; + CSrmmWindow *dlgDat; DBEVENTINFO *dbei; }; @@ -323,7 +323,7 @@ static int AppendUnicodeToBuffer(CMStringA &str, const wchar_t *line, int mode) ///////////////////////////////////////////////////////////////////////////////////////// -static void Build_RTF_Header(CMStringA &str, TWindowData *dat) +static void Build_RTF_Header(CMStringA &str, CSrmmWindow *dat) { int i; LOGFONTA *logFonts = dat->pContainer->theme.logFonts; @@ -381,14 +381,14 @@ static void Build_RTF_Header(CMStringA &str, TWindowData *dat) } // mir_free() the return value -static char* CreateRTFHeader(TWindowData *dat) +static char* CreateRTFHeader(CSrmmWindow *dat) { CMStringA str; Build_RTF_Header(str, dat); return str.Detach(); } -static void AppendTimeStamp(wchar_t *szFinalTimestamp, int isSent, CMStringA &str, int skipFont, TWindowData *dat, int iFontIDOffset) +static void AppendTimeStamp(wchar_t *szFinalTimestamp, int isSent, CMStringA &str, int skipFont, CSrmmWindow *dat, int iFontIDOffset) { if (skipFont) AppendUnicodeToBuffer(str, szFinalTimestamp, MAKELONG(isSent, dat->bIsHistory)); @@ -443,7 +443,7 @@ int DbEventIsForMsgWindow(DBEVENTINFO *dbei) return et && (et->flags & DETF_MSGWINDOW); } -static char* Template_CreateRTFFromDbEvent(TWindowData *dat, MCONTACT hContact, MEVENT hDbEvent, LogStreamData *streamData) +static char* Template_CreateRTFFromDbEvent(CSrmmWindow *dat, MCONTACT hContact, MEVENT hDbEvent, LogStreamData *streamData) { HANDLE hTimeZone = NULL; BOOL skipToNext = FALSE, skipFont = FALSE; @@ -1074,7 +1074,7 @@ static DWORD CALLBACK LogStreamInEvents(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG return 0; } -static void SetupLogFormatting(TWindowData *dat) +static void SetupLogFormatting(CSrmmWindow *dat) { if (dat->hHistoryEvents) strncpy_s(dat->szMicroLf, "\\v\\cf%d \\ ~-+%d+-~\\v0 ", _TRUNCATE); @@ -1082,7 +1082,7 @@ static void SetupLogFormatting(TWindowData *dat) mir_snprintf(dat->szMicroLf, "%s\\par\\ltrpar\\sl-1%s ", GetRTFFont(MSGDLGFONTCOUNT), GetRTFFont(MSGDLGFONTCOUNT)); } -static void ReplaceIcons(HWND hwndDlg, TWindowData *dat, LONG startAt, int fAppend, BOOL isSent) +static void ReplaceIcons(HWND hwndDlg, CSrmmWindow *dat, LONG startAt, int fAppend, BOOL isSent) { wchar_t trbuffer[40]; TEXTRANGE tr; @@ -1204,15 +1204,14 @@ static void ReplaceIcons(HWND hwndDlg, TWindowData *dat, LONG startAt, int fAppe } } -void TSAPI StreamInEvents(HWND hwndDlg, MEVENT hDbEventFirst, int count, int fAppend, DBEVENTINFO *dbei_s) +void CSrmmWindow::StreamInEvents(MEVENT hDbEventFirst, int count, int fAppend, DBEVENTINFO *dbei_s) { - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); CHARRANGE oldSel, sel; // calc time limit for grouping - HWND hwndrtf = dat->hwndIEView ? dat->hwndIWebBrowserControl : GetDlgItem(hwndDlg, IDC_LOG); + HWND hwndrtf = hwndIEView ? hwndIWebBrowserControl : m_log.GetHwnd(); - rtfFonts = dat->pContainer->theme.rtfFonts ? dat->pContainer->theme.rtfFonts : &(rtfFontsGlobal[0][0]); + rtfFonts = pContainer->theme.rtfFonts ? pContainer->theme.rtfFonts : &(rtfFontsGlobal[0][0]); time_t now = time(NULL); struct tm tm_now = *localtime(&now); @@ -1220,22 +1219,22 @@ void TSAPI StreamInEvents(HWND hwndDlg, MEVENT hDbEventFirst, int count, int fAp tm_today.tm_hour = tm_today.tm_min = tm_today.tm_sec = 0; today = mktime(&tm_today); - if (dat->hwndIEView != NULL || dat->hwndHPP != NULL) { + if (hwndIEView != NULL || hwndHPP != NULL) { const char *pszService; IEVIEWEVENT event = { 0 }; event.cbSize = sizeof(IEVIEWEVENT); - event.hContact = dat->hContact; - if (dat->hwndIEView != NULL) { - event.pszProto = dat->szProto; - event.hwnd = dat->hwndIEView; + event.hContact = m_hContact; + if (hwndIEView != NULL) { + event.pszProto = szProto; + event.hwnd = hwndIEView; pszService = MS_IEVIEW_EVENT; } else { - event.hwnd = dat->hwndHPP; + event.hwnd = hwndHPP; pszService = MS_HPP_EG_EVENT; } - if (dat->dwFlags & MWF_LOG_RTL) + if (dwFlags & MWF_LOG_RTL) event.dwFlags = IEEF_RTL; if (!fAppend) { @@ -1251,7 +1250,7 @@ void TSAPI StreamInEvents(HWND hwndDlg, MEVENT hDbEventFirst, int count, int fAp evData.dwFlags = IEEDF_SENT; else { evData.dwFlags = IEEDF_UNICODE_NICK; - evData.ptszNick = pcli->pfnGetContactDisplayName(dat->hContact, 0); + evData.ptszNick = pcli->pfnGetContactDisplayName(m_hContact, 0); } switch (dbei_s->eventType) { case EVENTTYPE_STATUSCHANGE: evData.iType = IEED_EVENT_STATUSCHANGE; break; @@ -1270,30 +1269,30 @@ void TSAPI StreamInEvents(HWND hwndDlg, MEVENT hDbEventFirst, int count, int fAp } event.count = count; CallService(pszService, 0, (LPARAM)&event); - DM_ScrollToBottom(dat, 0, 0); + DM_ScrollToBottom(this, 0, 0); if (fAppend && hDbEventFirst) - dat->hDbEventLast = hDbEventFirst; + hDbEventLast = hDbEventFirst; else - dat->hDbEventLast = db_event_last(dat->hContact); + hDbEventLast = db_event_last(m_hContact); return; } // separator strings used for grid lines, message separation and so on... - dat->clr_added = FALSE; + clr_added = FALSE; - if (dat->szMicroLf[0] == 0) - SetupLogFormatting(dat); + if (szMicroLf[0] == 0) + SetupLogFormatting(this); - szYourName = const_cast(dat->cache->getNick()); - szMyName = dat->szMyNickname; + szYourName = const_cast(cache->getNick()); + szMyName = szMyNickname; SendMessage(hwndrtf, EM_HIDESELECTION, TRUE, 0); SendMessage(hwndrtf, EM_EXGETSEL, 0, (LPARAM)&oldSel); LogStreamData streamData = { 0 }; - streamData.hContact = dat->hContact; + streamData.hContact = m_hContact; streamData.hDbEvent = hDbEventFirst; - streamData.dlgDat = dat; + streamData.dlgDat = this; streamData.eventsToInsert = count; streamData.isEmpty = fAppend ? GetWindowTextLength(hwndrtf) == 0 : 1; streamData.dbei = dbei_s; @@ -1318,7 +1317,7 @@ void TSAPI StreamInEvents(HWND hwndDlg, MEVENT hDbEventFirst, int count, int fAp sel.cpMax = GetWindowTextLength(hwndrtf); SendMessage(hwndrtf, EM_EXSETSEL, 0, (LPARAM)&sel); startAt = 0; - dat->isAutoRTL = 0; + isAutoRTL = 0; } // begin to draw @@ -1327,13 +1326,13 @@ void TSAPI StreamInEvents(HWND hwndDlg, MEVENT hDbEventFirst, int count, int fAp SendMessage(hwndrtf, EM_STREAMIN, fAppend ? SFF_SELECTION | SF_RTF : SFF_SELECTION | SF_RTF, (LPARAM)&stream); SendMessage(hwndrtf, EM_EXSETSEL, 0, (LPARAM)&oldSel); SendMessage(hwndrtf, EM_HIDESELECTION, FALSE, 0); - dat->hDbEventLast = streamData.hDbEventLast; + hDbEventLast = streamData.hDbEventLast; - if (dat->isAutoRTL & 1) - SendMessage(hwndrtf, EM_SETBKGNDCOLOR, 0, (LOWORD(dat->iLastEventType) & DBEF_SENT) ? (fAppend ? dat->pContainer->theme.outbg : dat->pContainer->theme.oldoutbg) : - (fAppend ? dat->pContainer->theme.inbg : dat->pContainer->theme.oldinbg)); + if (isAutoRTL & 1) + SendMessage(hwndrtf, EM_SETBKGNDCOLOR, 0, (LOWORD(iLastEventType) & DBEF_SENT) ? (fAppend ? pContainer->theme.outbg : pContainer->theme.oldoutbg) : + (fAppend ? pContainer->theme.inbg : pContainer->theme.oldinbg)); - if (!(dat->isAutoRTL & 1)) { + if (!(isAutoRTL & 1)) { GETTEXTLENGTHEX gtxl = { 0 }; gtxl.codepage = 1200; gtxl.flags = GTL_DEFAULT | GTL_PRECISE | GTL_NUMCHARS; @@ -1342,7 +1341,7 @@ void TSAPI StreamInEvents(HWND hwndDlg, MEVENT hDbEventFirst, int count, int fAp sel.cpMin = sel.cpMax - 1; SendMessage(hwndrtf, EM_EXSETSEL, 0, (LPARAM)&sel); SendMessage(hwndrtf, EM_REPLACESEL, FALSE, (LPARAM)L""); - dat->isAutoRTL |= 2; + isAutoRTL |= 2; } BOOL isSent; @@ -1354,18 +1353,18 @@ void TSAPI StreamInEvents(HWND hwndDlg, MEVENT hDbEventFirst, int count, int fAp isSent = (dbei.flags & DBEF_SENT) != 0; } - ReplaceIcons(hwndDlg, dat, startAt, fAppend, isSent); - dat->clr_added = FALSE; + ReplaceIcons(m_hwnd, this, startAt, fAppend, isSent); + clr_added = FALSE; - if (dat->hwndIEView == NULL && dat->hwndHPP == NULL) { + if (hwndIEView == NULL && hwndHPP == NULL) { int len = GetWindowTextLength(hwndrtf); SendMessage(hwndrtf, EM_SETSEL, len - 1, len - 1); } - DM_ScrollToBottom(dat, 0, 0); + DM_ScrollToBottom(this, 0, 0); SendMessage(hwndrtf, WM_SETREDRAW, TRUE, 0); InvalidateRect(hwndrtf, NULL, FALSE); - EnableWindow(GetDlgItem(hwndDlg, IDC_QUOTE), dat->hDbEventLast != NULL); + EnableWindow(GetDlgItem(m_hwnd, IDC_QUOTE), hDbEventLast != NULL); mir_free(streamData.buffer); } diff --git a/plugins/TabSRMM/src/msgs.cpp b/plugins/TabSRMM/src/msgs.cpp index bfec1df09f..834e6becd5 100644 --- a/plugins/TabSRMM/src/msgs.cpp +++ b/plugins/TabSRMM/src/msgs.cpp @@ -114,10 +114,29 @@ static INT_PTR GetWindowData(WPARAM wParam, LPARAM lParam) return 1; } +///////////////////////////////////////////////////////////////////////////////////////// +// basic window class + +CTabBaseDlg::CTabBaseDlg(TNewWindowData *pData, int iResource) + : CSrmmBaseDialog(g_hInst, iResource), + m_log(this, IDC_LOG), + m_message(this, IDC_MESSAGE), + newData(pData), + + pContainer(pData->pContainer), + m_hContact(pData->hContact) +{ + m_pLog = &m_log; + m_pEntry = &m_message; + + m_autoClose = 0; + m_forceResizable = true; +} + ///////////////////////////////////////////////////////////////////////////////////////// // service function. Sets a status bar text for a contact -static void SetStatusTextWorker(TWindowData *dat, StatusTextData *st) +static void SetStatusTextWorker(CTabBaseDlg *dat, StatusTextData *st) { if (!dat) return; @@ -131,7 +150,7 @@ static void SetStatusTextWorker(TWindowData *dat, StatusTextData *st) if (st != NULL && st->cbSize == sizeof(StatusTextData)) dat->sbCustom = new StatusTextData(*st); - UpdateStatusBar(dat); + dat->UpdateStatusBar(); } static INT_PTR SetStatusText(WPARAM hContact, LPARAM lParam) @@ -140,11 +159,11 @@ static INT_PTR SetStatusText(WPARAM hContact, LPARAM lParam) if (si == NULL) { HWND hwnd = M.FindWindow(hContact); if (hwnd != NULL) - SetStatusTextWorker((TWindowData*)GetWindowLongPtr(hwnd, GWLP_USERDATA), (StatusTextData*)lParam); + SetStatusTextWorker((CTabBaseDlg*)GetWindowLongPtr(hwnd, GWLP_USERDATA), (StatusTextData*)lParam); if (hContact = db_mc_getMeta(hContact)) if (hwnd = M.FindWindow(hContact)) - SetStatusTextWorker((TWindowData*)GetWindowLongPtr(hwnd, GWLP_USERDATA), (StatusTextData*)lParam); + SetStatusTextWorker((CTabBaseDlg*)GetWindowLongPtr(hwnd, GWLP_USERDATA), (StatusTextData*)lParam); } else SetStatusTextWorker(si->dat, (StatusTextData*)lParam); @@ -189,7 +208,7 @@ static INT_PTR GetMessageWindowFlags(WPARAM wParam, LPARAM lParam) if (hwndTarget == 0) return 0; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndTarget, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwndTarget, GWLP_USERDATA); return (dat) ? dat->dwFlags : 0; } @@ -417,7 +436,7 @@ int MyAvatarChanged(WPARAM wParam, LPARAM lParam) int TSAPI ActivateExistingTab(TContainerData *pContainer, HWND hwndChild) { - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndChild, GWLP_USERDATA); // needed to obtain the hContact for the message window + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwndChild, GWLP_USERDATA); // needed to obtain the hContact for the message window if (!dat || !pContainer) return FALSE; @@ -428,7 +447,7 @@ int TSAPI ActivateExistingTab(TContainerData *pContainer, HWND hwndChild) SendMessage(pContainer->hwnd, WM_NOTIFY, 0, (LPARAM)&nmhdr); // just select the tab and let WM_NOTIFY do the rest } if (dat->bType == SESSIONTYPE_IM) - SendMessage(pContainer->hwnd, DM_UPDATETITLE, dat->hContact, 0); + SendMessage(pContainer->hwnd, DM_UPDATETITLE, dat->m_hContact, 0); if (IsIconic(pContainer->hwnd)) { SendMessage(pContainer->hwnd, WM_SYSCOMMAND, SC_RESTORE, 0); SetForegroundWindow(pContainer->hwnd); @@ -527,9 +546,9 @@ HWND TSAPI CreateNewTabForContact(TContainerData *pContainer, MCONTACT hContact, item.mask = TCIF_PARAM; TabCtrl_GetItem(hwndTab, i, &item); HWND hwnd = (HWND)item.lParam; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (dat) { - int relPos = M.GetDword(dat->hContact, "tabindex", i * 100); + int relPos = M.GetDword(dat->m_hContact, "tabindex", i * 100); if (iTabIndex_wanted <= relPos) pContainer->iTabIndex = i; } @@ -547,14 +566,16 @@ HWND TSAPI CreateNewTabForContact(TContainerData *pContainer, MCONTACT hContact, pContainer->iChilds++; newData.bWantPopup = bWantPopup; newData.hdbEvent = hdbEvent; - HWND hwndNew = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_MSGSPLITNEW), hwndTab, DlgProcMessage, (LPARAM)&newData); + + CSrmmWindow *pWindow = new CSrmmWindow(&newData); + pWindow->SetParent(hwndTab); + pWindow->Show(); + HWND hwndNew = pWindow->GetHwnd(); // switchbar support - if (pContainer->dwFlags & CNT_SIDEBAR) { - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndNew, GWLP_USERDATA); - if (dat) - pContainer->SideBar->addSession(dat, pContainer->iTabIndex); - } + if (pContainer->dwFlags & CNT_SIDEBAR) + pContainer->SideBar->addSession(pWindow, pContainer->iTabIndex); + SendMessage(pContainer->hwnd, WM_SIZE, 0, 0); // if the container is minimized, then pop it up... @@ -663,7 +684,7 @@ int TABSRMM_FireEvent(MCONTACT hContact, HWND hwnd, unsigned int type, unsigned if (hContact == NULL || hwnd == NULL) return 0; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (dat == NULL) return 0; BYTE bType = dat->bType; @@ -678,8 +699,8 @@ int TABSRMM_FireEvent(MCONTACT hContact, HWND hwnd, unsigned int type, unsigned mwe.hwndLog = GetDlgItem(hwnd, IDC_LOG); } else { - mwe.hwndInput = GetDlgItem(hwnd, IDC_CHAT_MESSAGE); - mwe.hwndLog = GetDlgItem(hwnd, IDC_CHAT_LOG); + mwe.hwndInput = GetDlgItem(hwnd, IDC_MESSAGE); + mwe.hwndLog = GetDlgItem(hwnd, IDC_LOG); } if (type == MSG_WINDOW_EVT_CUSTOM) { diff --git a/plugins/TabSRMM/src/msgs.h b/plugins/TabSRMM/src/msgs.h index d00fcfb84e..ae449daad9 100644 --- a/plugins/TabSRMM/src/msgs.h +++ b/plugins/TabSRMM/src/msgs.h @@ -229,19 +229,50 @@ struct TContainerData struct SESSION_INFO; -struct TWindowData +struct TNewWindowData +{ + MCONTACT hContact; + int isWchar; + LPCSTR szInitialText; + int iTabID; + int iTabImage; + int iActivate; + TCITEM item; + BOOL bWantPopup; + HKL hkl; + + union { + MEVENT hdbEvent; + SESSION_INFO *si; + }; + TContainerData *pContainer; +}; + +class CTabBaseDlg : public CSrmmBaseDialog { - UINT cbSize; + +protected: + CCtrlEdit m_log, m_message; + TNewWindowData *newData; + + void DM_UpdateTitle(WPARAM wParam, LPARAM lParam); + + void DetermineMinHeight(); + void FindFirstEvent(); + void GetSendFormat(); + bool IsAutoSplitEnabled() const; + void LoadContactAvatar(); + void LoadOwnAvatar(); + void ResizeIeView(); + +public: BYTE bType; - TContainerData *pContainer; // parent container description structure - HWND hwnd; DWORD dwFlags; DWORD dwFlagsEx; - MCONTACT hContact; + MCONTACT m_hContact; char *szProto; wchar_t szMyNickname[130]; wchar_t szStatusBar[100]; - StatusTextData *sbCustom; wchar_t newtitle[130]; // tab title... wchar_t szStatus[50]; WORD wStatus; @@ -250,14 +281,15 @@ struct TWindowData int iSendLength; // message length in utf-8 octets HICON hTabIcon, hTabStatusIcon, hXStatusIcon, hClientIcon, hTaskbarIcon; HICON iFlashIcon; - BOOL mayFlashTab; - BOOL bTabFlash; + bool m_bCanFlashTab, m_bTabFlash; HWND hwndIEView, hwndIWebBrowserControl, hwndHPP; HWND hwndContactPic, hwndPanelPic, hwndPanelPicParent; UINT bbLSideWidth, bbRSideWidth; BYTE kstate[256]; SESSION_INFO *si; + StatusTextData *sbCustom; + TContainerData *pContainer; // parent container description structure RECT rcNick, rcUIN, rcStatus, rcPic; MEVENT hDbEventFirst, hDbEventLast; @@ -324,16 +356,111 @@ struct TWindowData CContactCache *cache; CProxyWindow *pWnd; // proxy window object (win7+, for taskbar support). // ALWAYS check this pointer before using it, it is not guaranteed to exist. + + bool bIsAutosizingInput; + bool fLimitedUpdate; DWORD iSplitterSaved; - BYTE bWasDeleted; + LONG iInputAreaHeight; BOOL bActualHistory; POINT ptTipActivation; - LONG iInputAreaHeight; - bool bIsAutosizingInput; - bool fLimitedUpdate; // Used for history in chats. char *enteredText; + +public: + CTabBaseDlg(TNewWindowData*, int); + + HWND DM_CreateClist(); + void DM_InitTip(); + void DM_NotifyTyping(int mode); + void DM_RecalcPictureSize(); + + void DM_FreeTheme(); + void DM_ThemeChanged(); + + void BB_InitDlgButtons(); + void BB_RefreshTheme(); + BOOL BB_SetButtonsPos(); + void BB_RedrawButtons(); + void DM_SetDBButtonStates(); + + void CB_DestroyAllButtons(); + void CB_DestroyButton(DWORD dwButtonCID, DWORD dwFlags); + void CB_ChangeButton(CustomButtonData *cbd); + + void AdjustBottomAvatarDisplay(); + void CalcDynamicAvatarSize(BITMAP *bminfo); + void ClearLog(); + BOOL DoRtfToTags(CMStringW &pszText, int iNumColors, COLORREF *pColors) const; + void EnableSendButton(bool bMode) const; + void FlashOnClist(MEVENT hEvent, DBEVENTINFO *dbei); + void FlashTab(bool bInvertMode); + bool GetAvatarVisibility(); + void GetClientIcon(); + LONG GetDefaultMinimumInputHeight() const; + void GetLocaleID(const wchar_t *szKLName); + HICON GetMyContactIcon(LPCSTR szSetting); + void GetMYUIN(); + void GetMyNick(); + HICON GetXStatusIcon() const; + void HandlePasteAndSend(); + void KbdState(bool &isShift, bool &isControl, bool &isAlt); + int LoadLocalFlags(); + void LoadSplitter(); + void PlayIncomingSound() const; + void SendHBitmapAsFile(HBITMAP hbmp) const; + void SaveSplitter(); + void SendNudge() const; + void SetMessageLog(); + void ShowPicture(bool showNewPic); + void UpdateReadChars() const; + void UpdateStatusBar() const; + + int MsgWindowDrawHandler(WPARAM wParam, LPARAM lParam); + int MsgWindowUpdateMenu(HMENU submenu, int menuID); + int MsgWindowMenuHandler(int selection, int menuId); + + void RenderToolbarBG(HDC hdc, const RECT &rcWindow) const; + void UpdateToolbarBG(); +}; + +class CSrmmWindow : public CTabBaseDlg, public MZeroedObject +{ + void DM_OptionsApplied(WPARAM wParam, LPARAM lParam); + void MsgWindowUpdateState(UINT msg); + +public: + int msgTop, rcLogBottom; + +public: + CSrmmWindow(TNewWindowData*); + + virtual void OnInitDialog() override; + virtual void OnDestroy() override; + + virtual int Resizer(UTILRESIZECONTROL *urc) override; + + virtual INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) override; + + void StreamInEvents(MEVENT hDbEventFirst, int count, int fAppend, DBEVENTINFO *dbei_s); +}; + +class CChatRoomDlg : public CTabBaseDlg, public MZeroedObject +{ + bool m_bWasDeleted; + +public: + CChatRoomDlg(TNewWindowData*); + + virtual void OnInitDialog() override; + virtual void OnDestroy() override; + + virtual int Resizer(UTILRESIZECONTROL *urc) override; + + virtual INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) override; + + void StreamInEvents(LOGINFO* lin, SESSION_INFO *si, bool bRedraw); + void UpdateWindowState(UINT msg); }; #define MESSAGE_WINDOW_DATA_SIZE offsetof(_MessageWindowData, hdbEventFirst); @@ -406,25 +533,6 @@ struct TIconDescW #define MIN_PANELHEIGHT 20 -struct TNewWindowData -{ - MCONTACT hContact; - int isWchar; - LPCSTR szInitialText; - int iTabID; - int iTabImage; - int iActivate; - TCITEM item; - BOOL bWantPopup; - HKL hkl; - - union { - MEVENT hdbEvent; - SESSION_INFO *si; - }; - TContainerData *pContainer; -}; - // flags for the container dwFlags #define CNT_MOUSEDOWN 1 #define CNT_NOTITLE 2 @@ -789,8 +897,8 @@ struct SIDEBARITEM { DWORD dwFlags; HICON *hIcon, *hIconPressed, *hIconHover; wchar_t *szName; - void(*pfnAction)(ButtonItem *item, HWND hwndDlg, TWindowData *dat, HWND hwndItem); - void(*pfnCallback)(ButtonItem *item, HWND hwndDlg, TWindowData *dat, HWND hwndItem); + void(*pfnAction)(ButtonItem *item, HWND hwndDlg, CSrmmWindow *dat, HWND hwndItem); + void(*pfnCallback)(ButtonItem *item, HWND hwndDlg, CSrmmWindow *dat, HWND hwndItem); wchar_t *tszTip; }; @@ -955,8 +1063,8 @@ int SI_InitStatusIcons(); int SI_DeinitStatusIcons(); int GetStatusIconsCount(); -void DrawStatusIcons(TWindowData *dat, HDC hdc, const RECT &r, int gap); -void CheckStatusIconClick(TWindowData *dat, POINT pt, const RECT &rc, int gap, int code); +void DrawStatusIcons(CTabBaseDlg *dat, HDC hdc, const RECT &r, int gap); +void CheckStatusIconClick(CTabBaseDlg *dat, POINT pt, const RECT &rc, int gap, int code); struct SKINDESC { diff --git a/plugins/TabSRMM/src/selectcontainer.cpp b/plugins/TabSRMM/src/selectcontainer.cpp index 5dc5fbd09b..b708f5f887 100644 --- a/plugins/TabSRMM/src/selectcontainer.cpp +++ b/plugins/TabSRMM/src/selectcontainer.cpp @@ -45,7 +45,7 @@ INT_PTR CALLBACK SelectContainerDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, L TranslateDialogDefault(hwndDlg); if (lParam) { - TWindowData *dat = (TWindowData*)GetWindowLongPtr((HWND)lParam, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr((HWND)lParam, GWLP_USERDATA); if (dat) { mir_snwprintf(szNewTitle, TranslateT("Select container for %s"), dat->cache->getNick()); SetWindowText(hwndDlg, szNewTitle); diff --git a/plugins/TabSRMM/src/sendqueue.cpp b/plugins/TabSRMM/src/sendqueue.cpp index dcabc6bc29..3de3fe7e77 100644 --- a/plugins/TabSRMM/src/sendqueue.cpp +++ b/plugins/TabSRMM/src/sendqueue.cpp @@ -35,17 +35,17 @@ SendQueue *sendQueue = 0; // as "failed" by either the ACKRESULT_FAILED or a timeout handler // returns: zero-based queue index or -1 if none was found -int SendQueue::findNextFailed(const TWindowData *dat) const +int SendQueue::findNextFailed(const CSrmmWindow *dat) const { if (dat) for (int i = 0; i < NR_SENDJOBS; i++) - if (m_jobs[i].hContact == dat->hContact && m_jobs[i].iStatus == SQ_ERROR) + if (m_jobs[i].hContact == dat->m_hContact && m_jobs[i].iStatus == SQ_ERROR) return i; return -1; } -void SendQueue::handleError(TWindowData *dat, const int iEntry) const +void SendQueue::handleError(CSrmmWindow *dat, const int iEntry) const { if (!dat) return; @@ -63,13 +63,13 @@ void SendQueue::handleError(TWindowData *dat, const int iEntry) const //add a message to the sending queue. // iLen = required size of the memory block to hold the message -int SendQueue::addTo(TWindowData *dat, size_t iLen, int dwFlags) +int SendQueue::addTo(CSrmmWindow *dat, size_t iLen, int dwFlags) { int i; int iFound = NR_SENDJOBS; if (m_currentIndex >= NR_SENDJOBS) { - _DebugPopup(dat->hContact, L"Send queue full"); + _DebugPopup(dat->m_hContact, L"Send queue full"); return 0; } @@ -90,7 +90,7 @@ int SendQueue::addTo(TWindowData *dat, size_t iLen, int dwFlags) } entry_found: if (iFound == NR_SENDJOBS) { - _DebugPopup(dat->hContact, L"Send queue full"); + _DebugPopup(dat->m_hContact, L"Send queue full"); return 0; } @@ -101,7 +101,7 @@ entry_found: job.dwFlags = dwFlags; job.dwTime = time(NULL); - HWND hwndDlg = dat->hwnd; + HWND hwndDlg = dat->GetHwnd(); dat->cache->saveHistory(0, 0); ::SetDlgItemText(hwndDlg, IDC_MESSAGE, L""); @@ -190,10 +190,10 @@ size_t SendQueue::getSendLength(const int iEntry) return p.iSendLength; } -int SendQueue::sendQueued(TWindowData *dat, const int iEntry) +int SendQueue::sendQueued(CSrmmWindow *dat, const int iEntry) { - HWND hwndDlg = dat->hwnd; - CContactCache *ccActive = CContactCache::getContactCache(dat->hContact); + HWND hwndDlg = dat->GetHwnd(); + CContactCache *ccActive = CContactCache::getContactCache(dat->m_hContact); if (dat->sendMode & SMODE_MULTIPLE) { int iJobs = 0; @@ -216,7 +216,7 @@ int SendQueue::sendQueued(TWindowData *dat, const int iEntry) if (iSendLength >= iMinLength) { wchar_t tszError[256]; mir_snwprintf(tszError, TranslateT("The message cannot be sent delayed or to multiple contacts, because it exceeds the maximum allowed message length of %d bytes"), iMinLength); - ::SendMessage(dat->hwnd, DM_ACTIVATETOOLTIP, IDC_MESSAGE, LPARAM(tszError)); + ::SendMessage(dat->GetHwnd(), DM_ACTIVATETOOLTIP, IDC_MESSAGE, LPARAM(tszError)); sendQueue->clearJob(iEntry); return 0; } @@ -235,7 +235,7 @@ int SendQueue::sendQueued(TWindowData *dat, const int iEntry) return 0; } - if (dat->hContact == NULL) + if (dat->m_hContact == NULL) return 0; //never happens dat->nMax = (int)dat->cache->getMaxMessageLength(); // refresh length info @@ -271,7 +271,7 @@ int SendQueue::sendQueued(TWindowData *dat, const int iEntry) size_t iSendLength = getSendLength(iEntry); if ((int)iSendLength >= dat->nMax) { mir_snwprintf(tszError, TranslateT("The message cannot be sent delayed or to multiple contacts, because it exceeds the maximum allowed message length of %d bytes"), dat->nMax); - SendMessage(dat->hwnd, DM_ACTIVATETOOLTIP, IDC_MESSAGE, LPARAM(tszError)); + SendMessage(dat->GetHwnd(), DM_ACTIVATETOOLTIP, IDC_MESSAGE, LPARAM(tszError)); clearJob(iEntry); return 0; } @@ -279,11 +279,11 @@ int SendQueue::sendQueued(TWindowData *dat, const int iEntry) clearJob(iEntry); return 0; } - m_jobs[iEntry].hSendId = (HANDLE)ProtoChainSend(dat->hContact, PSS_MESSAGE, m_jobs[iEntry].dwFlags, (LPARAM)m_jobs[iEntry].szSendBuffer); + m_jobs[iEntry].hSendId = (HANDLE)ProtoChainSend(dat->m_hContact, PSS_MESSAGE, m_jobs[iEntry].dwFlags, (LPARAM)m_jobs[iEntry].szSendBuffer); if (dat->sendMode & SMODE_NOACK) { // fake the ack if we are not interested in receiving real acks ACKDATA ack = { 0 }; - ack.hContact = dat->hContact; + ack.hContact = dat->m_hContact; ack.hProcess = m_jobs[iEntry].hSendId; ack.type = ACKTYPE_MESSAGE; ack.result = ACKRESULT_SUCCESS; @@ -297,7 +297,7 @@ int SendQueue::sendQueued(TWindowData *dat, const int iEntry) // give icon feedback... if (dat->pContainer->hwndActive == hwndDlg) - ::UpdateReadChars(dat); + dat->UpdateReadChars(); if (!(dat->sendMode & SMODE_NOACK)) ::HandleIconFeedback(dat, PluginConfig.g_IconSend); @@ -321,18 +321,18 @@ void SendQueue::clearJob(const int iIndex) // ) user decided to cancel a failed send // it removes the completed / canceled send job from the queue and schedules the next job to send (if any) -void SendQueue::checkQueue(const TWindowData *dat) const +void SendQueue::checkQueue(const CSrmmWindow *dat) const { if (dat) { - HWND hwndDlg = dat->hwnd; + HWND hwndDlg = dat->GetHwnd(); if (dat->iOpenJobs == 0) - ::HandleIconFeedback(const_cast(dat), (HICON)INVALID_HANDLE_VALUE); + ::HandleIconFeedback(const_cast(dat), (HICON)INVALID_HANDLE_VALUE); else if (!(dat->sendMode & SMODE_NOACK)) - ::HandleIconFeedback(const_cast(dat), PluginConfig.g_IconSend); + ::HandleIconFeedback(const_cast(dat), PluginConfig.g_IconSend); if (dat->pContainer->hwndActive == hwndDlg) - ::UpdateReadChars(const_cast(dat)); + dat->UpdateReadChars(); } } @@ -340,7 +340,7 @@ void SendQueue::checkQueue(const TWindowData *dat) const // logs an error message to the message window.Optionally, appends the original message // from the given sendJob (queue index) -void SendQueue::logError(const TWindowData *dat, int iSendJobIndex, const wchar_t *szErrMsg) const +void SendQueue::logError(CSrmmWindow *dat, int iSendJobIndex, const wchar_t *szErrMsg) const { if (dat == 0) return; @@ -361,7 +361,7 @@ void SendQueue::logError(const TWindowData *dat, int iSendJobIndex, const wchar_ dbei.cbBlob = (int)iMsgLen; dbei.timestamp = time(NULL); dbei.szModule = (char *)szErrMsg; - StreamInEvents(dat->hwnd, NULL, 1, 1, &dbei); + dat->StreamInEvents(NULL, 1, 1, &dbei); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -370,23 +370,23 @@ void SendQueue::logError(const TWindowData *dat, int iSendJobIndex, const wchar_ // ) multisend contact list instance // ) send button -void SendQueue::EnableSending(const TWindowData *dat, const int iMode) +void SendQueue::EnableSending(const CSrmmWindow *dat, bool bMode) { if (dat) { - HWND hwndDlg = dat->hwnd; - ::SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETREADONLY, (WPARAM)iMode ? FALSE : TRUE, 0); - Utils::enableDlgControl(hwndDlg, IDC_CLIST, iMode ? TRUE : FALSE); - ::EnableSendButton(dat, iMode); + HWND hwndDlg = dat->GetHwnd(); + ::SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETREADONLY, !bMode, 0); + Utils::enableDlgControl(hwndDlg, IDC_CLIST, bMode); + dat->EnableSendButton(bMode); } } ///////////////////////////////////////////////////////////////////////////////////////// // show or hide the error control button bar on top of the window -void SendQueue::showErrorControls(TWindowData *dat, const int showCmd) const +void SendQueue::showErrorControls(CSrmmWindow *dat, const int showCmd) const { UINT myerrorControls[] = { IDC_STATICERRORICON, IDC_STATICTEXT, IDC_RETRY, IDC_CANCELSEND, IDC_MSGSENDLATER }; - HWND hwndDlg = dat->hwnd; + HWND hwndDlg = dat->GetHwnd(); if (showCmd) { TCITEM item = { 0 }; @@ -411,27 +411,27 @@ void SendQueue::showErrorControls(TWindowData *dat, const int showCmd) const EnableSending(dat, TRUE); } -void SendQueue::recallFailed(const TWindowData *dat, int iEntry) const +void SendQueue::recallFailed(const CSrmmWindow *dat, int iEntry) const { if (dat == NULL) return; - int iLen = GetWindowTextLength(GetDlgItem(dat->hwnd, IDC_MESSAGE)); + int iLen = GetWindowTextLength(GetDlgItem(dat->GetHwnd(), IDC_MESSAGE)); NotifyDeliveryFailure(dat); if (iLen != 0) return; // message area is empty, so we can recall the failed message... SETTEXTEX stx = { ST_DEFAULT, CP_UTF8 }; - SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)m_jobs[iEntry].szSendBuffer); - UpdateSaveAndSendButton(const_cast(dat)); - SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETSEL, (WPARAM)-1, (LPARAM)-1); + SendDlgItemMessage(dat->GetHwnd(), IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)m_jobs[iEntry].szSendBuffer); + UpdateSaveAndSendButton(const_cast(dat)); + SendDlgItemMessage(dat->GetHwnd(), IDC_MESSAGE, EM_SETSEL, (WPARAM)-1, (LPARAM)-1); } -void SendQueue::UpdateSaveAndSendButton(TWindowData *dat) +void SendQueue::UpdateSaveAndSendButton(CSrmmWindow *dat) { if (dat) { - HWND hwndDlg = dat->hwnd; + HWND hwndDlg = dat->GetHwnd(); GETTEXTLENGTHEX gtxl = { 0 }; gtxl.codepage = CP_UTF8; @@ -439,9 +439,9 @@ void SendQueue::UpdateSaveAndSendButton(TWindowData *dat) int len = SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_GETTEXTLENGTHEX, (WPARAM)>xl, 0); if (len && GetSendButtonState(hwndDlg) == PBS_DISABLED) - EnableSendButton(dat, TRUE); + dat->EnableSendButton(TRUE); else if (len == 0 && GetSendButtonState(hwndDlg) != PBS_DISABLED) - EnableSendButton(dat, FALSE); + dat->EnableSendButton(FALSE); if (len) { // looks complex but avoids flickering on the button while typing. if (!(dat->dwFlags & MWF_SAVEBTN_SAV)) { @@ -459,7 +459,7 @@ void SendQueue::UpdateSaveAndSendButton(TWindowData *dat) } } -void SendQueue::NotifyDeliveryFailure(const TWindowData *dat) +void SendQueue::NotifyDeliveryFailure(const CSrmmWindow *dat) { if (M.GetByte("adv_noErrorPopups", 0)) return; @@ -468,7 +468,7 @@ void SendQueue::NotifyDeliveryFailure(const TWindowData *dat) return; POPUPDATAT ppd = { 0 }; - ppd.lchContact = dat->hContact; + ppd.lchContact = dat->m_hContact; wcsncpy_s(ppd.lptzContactName, dat->cache->getNick(), _TRUNCATE); wcsncpy_s(ppd.lptzText, TranslateT("A message delivery has failed.\nClick to open the message window."), _TRUNCATE); @@ -507,7 +507,7 @@ int SendQueue::RTL_Detect(const WCHAR *pszwText) return(n >= 2 ? 1 : 0); } -int SendQueue::ackMessage(TWindowData *dat, WPARAM wParam, LPARAM lParam) +int SendQueue::ackMessage(CSrmmWindow *dat, WPARAM wParam, LPARAM lParam) { ACKDATA *ack = (ACKDATA *)lParam; @@ -541,7 +541,7 @@ int SendQueue::ackMessage(TWindowData *dat, WPARAM wParam, LPARAM lParam) mir_snwprintf(job.szErrorMsg, TranslateT("Delivery failure: %s"), _A2T((char *)ack->lParam)); job.iStatus = SQ_ERROR; - KillTimer(dat->hwnd, TIMERID_MSGSEND + iFound); + KillTimer(dat->GetHwnd(), TIMERID_MSGSEND + iFound); if (!(dat->dwFlags & MWF_ERRORSTATE)) handleError(dat, iFound); return 0; @@ -590,7 +590,7 @@ int SendQueue::ackMessage(TWindowData *dat, WPARAM wParam, LPARAM lParam) if (job.iAcksNeeded == 0) { // everything sent clearJob(iFound); if (dat) { - KillTimer(dat->hwnd, TIMERID_MSGSEND + iFound); + KillTimer(dat->GetHwnd(), TIMERID_MSGSEND + iFound); dat->iOpenJobs--; } m_currentIndex--; @@ -604,7 +604,7 @@ int SendQueue::ackMessage(TWindowData *dat, WPARAM wParam, LPARAM lParam) else { if (M.GetByte("AutoClose", 0)) { if (M.GetByte("adv_AutoClose_2", 0)) - SendMessage(dat->hwnd, WM_CLOSE, 0, 1); + SendMessage(dat->GetHwnd(), WM_CLOSE, 0, 1); else SendMessage(dat->pContainer->hwnd, WM_CLOSE, 0, 0); } @@ -631,7 +631,7 @@ LRESULT SendQueue::WarnPendingJobs(unsigned int) // // @return the index on success, -1 on failure -int SendQueue::doSendLater(int iJobIndex, TWindowData *dat, MCONTACT hContact, bool fIsSendLater) +int SendQueue::doSendLater(int iJobIndex, CSrmmWindow *dat, MCONTACT hContact, bool fIsSendLater) { bool fAvail = sendLater->isAvail(); @@ -647,19 +647,19 @@ int SendQueue::doSendLater(int iJobIndex, TWindowData *dat, MCONTACT hContact, b DBEVENTINFO dbei = {}; dbei.eventType = EVENTTYPE_MESSAGE; dbei.flags = DBEF_SENT | DBEF_UTF; - dbei.szModule = GetContactProto(dat->hContact); + dbei.szModule = GetContactProto(dat->m_hContact); dbei.timestamp = time(NULL); dbei.cbBlob = (int)mir_strlen(utfText) + 1; dbei.pBlob = (PBYTE)(char*)utfText; - StreamInEvents(dat->hwnd, 0, 1, 1, &dbei); + dat->StreamInEvents(0, 1, 1, &dbei); if (dat->hDbEventFirst == NULL) - SendMessage(dat->hwnd, DM_REMAKELOG, 0, 0); + SendMessage(dat->GetHwnd(), DM_REMAKELOG, 0, 0); dat->cache->saveHistory(0, 0); - EnableSendButton(dat, FALSE); - if (dat->pContainer->hwndActive == dat->hwnd) - UpdateReadChars(dat); - SendDlgItemMessage(dat->hwnd, IDC_SAVE, BM_SETIMAGE, IMAGE_ICON, (LPARAM)PluginConfig.g_buttonBarIcons[ICON_BUTTON_CANCEL]); - SendDlgItemMessage(dat->hwnd, IDC_SAVE, BUTTONADDTOOLTIP, (WPARAM)pszIDCSAVE_close, BATF_UNICODE); + dat->EnableSendButton(false); + if (dat->pContainer->hwndActive == dat->GetHwnd()) + dat->UpdateReadChars(); + SendDlgItemMessage(dat->GetHwnd(), IDC_SAVE, BM_SETIMAGE, IMAGE_ICON, (LPARAM)PluginConfig.g_buttonBarIcons[ICON_BUTTON_CANCEL]); + SendDlgItemMessage(dat->GetHwnd(), IDC_SAVE, BUTTONADDTOOLTIP, (WPARAM)pszIDCSAVE_close, BATF_UNICODE); dat->dwFlags &= ~MWF_SAVEBTN_SAV; if (!fAvail) diff --git a/plugins/TabSRMM/src/sendqueue.h b/plugins/TabSRMM/src/sendqueue.h index 48be92645e..db914f214c 100644 --- a/plugins/TabSRMM/src/sendqueue.h +++ b/plugins/TabSRMM/src/sendqueue.h @@ -85,26 +85,26 @@ public: SendJob *getJobByIndex(const int index) { return(&m_jobs[index]); } void clearJob(const int index); - int findNextFailed(const TWindowData *dat) const; - void handleError(TWindowData *dat, const int iEntry) const; - int addTo(TWindowData *dat, size_t iLen, int dwFlags); - int sendQueued(TWindowData *dat, const int iEntry); + int findNextFailed(const CSrmmWindow *dat) const; + void handleError(CSrmmWindow *dat, const int iEntry) const; + int addTo(CSrmmWindow *dat, size_t iLen, int dwFlags); + int sendQueued(CSrmmWindow *dat, const int iEntry); size_t getSendLength(const int iEntry); - void checkQueue(const TWindowData *dat) const; - void logError(const TWindowData *dat, int iSendJobIndex, const wchar_t *szErrMsg) const; - void recallFailed(const TWindowData *dat, int iEntry) const; - void showErrorControls(TWindowData *dat, const int showCmd) const; - int ackMessage(TWindowData *dat, WPARAM wParam, LPARAM lParam); - int doSendLater(int iIndex, TWindowData *dat, MCONTACT hContact = 0, bool fIsSendLater = true); + void checkQueue(const CSrmmWindow *dat) const; + void logError(CSrmmWindow *dat, int iSendJobIndex, const wchar_t *szErrMsg) const; + void recallFailed(const CSrmmWindow *dat, int iEntry) const; + void showErrorControls(CSrmmWindow *dat, const int showCmd) const; + int ackMessage(CSrmmWindow *dat, WPARAM wParam, LPARAM lParam); + int doSendLater(int iIndex, CSrmmWindow *dat, MCONTACT hContact = 0, bool fIsSendLater = true); /* * static members */ static int TSAPI RTL_Detect(const wchar_t *pszwText); static int TSAPI GetProtoIconFromList(const char *szProto, int iStatus); static LRESULT TSAPI WarnPendingJobs(unsigned int uNrMessages); - static void TSAPI NotifyDeliveryFailure(const TWindowData *dat); - static void TSAPI UpdateSaveAndSendButton(TWindowData *dat); - static void TSAPI EnableSending(const TWindowData *dat, const int iMode); + static void TSAPI NotifyDeliveryFailure(const CSrmmWindow *dat); + static void TSAPI UpdateSaveAndSendButton(CSrmmWindow *dat); + static void TSAPI EnableSending(const CSrmmWindow *dat, bool bMode); private: SendJob m_jobs[NR_SENDJOBS]; @@ -115,6 +115,6 @@ extern SendQueue *sendQueue; int TSAPI ActivateExistingTab(TContainerData *pContainer, HWND hwndChild); void TSAPI ShowMultipleControls(const HWND hwndDlg, const UINT * controls, int cControls, int state); -void TSAPI HandleIconFeedback(TWindowData *dat, HICON iIcon); +void TSAPI HandleIconFeedback(CTabBaseDlg *dat, HICON iIcon); #endif /* __SENDQUEUE_H */ diff --git a/plugins/TabSRMM/src/sidebar.cpp b/plugins/TabSRMM/src/sidebar.cpp index 468125ecdf..72d249c12f 100644 --- a/plugins/TabSRMM/src/sidebar.cpp +++ b/plugins/TabSRMM/src/sidebar.cpp @@ -71,10 +71,10 @@ TSideBarLayout CSideBar::m_layouts[CSideBar::NR_LAYOUTS] = { } }; -CSideBarButton::CSideBarButton(const TWindowData *dat, CSideBar *sideBar) +CSideBarButton::CSideBarButton(const CTabBaseDlg *dat, CSideBar *sideBar) { m_dat = dat; - m_id = UINT(dat->hContact); // set the control id + m_id = UINT(dat->m_hContact); // set the control id m_sideBar = sideBar; _create(); } @@ -254,7 +254,7 @@ void CSideBarButton::renderIconAndNick(const HDC hdc, const RECT *rcItem) const if (m_dat && pContainer) { hIcon = m_dat->cache->getIcon(iSize); - if (m_dat->mayFlashTab == FALSE || (m_dat->mayFlashTab == TRUE && m_dat->bTabFlash != 0) || !(pContainer->dwFlagsEx & TCF_FLASHICON)) { + if (!m_dat->m_bCanFlashTab || (m_dat->m_bCanFlashTab == TRUE && m_dat->m_bTabFlash) || !(pContainer->dwFlagsEx & TCF_FLASHICON)) { DWORD ix = rc.left + 4; DWORD iy = (rc.bottom + rc.top - iSize) / 2; if (m_dat->dwFlagsEx & MWF_SHOW_ISIDLE && PluginConfig.m_bIdleDetect) @@ -280,7 +280,7 @@ void CSideBarButton::renderIconAndNick(const HDC hdc, const RECT *rcItem) const ::SetBkMode(hdc, TRANSPARENT); - if (m_dat->mayFlashTab == FALSE || (m_dat->mayFlashTab == TRUE && m_dat->bTabFlash != 0) || !(pContainer->dwFlagsEx & TCF_FLASHLABEL)) { + if (!m_dat->m_bCanFlashTab || (m_dat->m_bCanFlashTab == TRUE && m_dat->m_bTabFlash) || !(pContainer->dwFlagsEx & TCF_FLASHLABEL)) { bool fIsActive = (m_sideBar->getActiveItem() == this ? true : false); COLORREF clr = 0; dwTextFlags |= DT_WORD_ELLIPSIS; @@ -333,7 +333,7 @@ int CSideBarButton::testCloseButton() const void CSideBarButton::activateSession() const { if (m_dat) - ::SendMessage(m_dat->hwnd, DM_ACTIVATEME, 0, 0); // the child window will activate itself + ::SendMessage(m_dat->GetHwnd(), DM_ACTIVATEME, 0, 0); // the child window will activate itself } // show the context menu (same as on tabs @@ -505,7 +505,7 @@ void CSideBar::populateAll() if (item.lParam == 0 || !IsWindow((HWND)item.lParam)) continue; - TWindowData *dat = (TWindowData*)::GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)::GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA); if (dat == NULL) continue; @@ -530,7 +530,7 @@ void CSideBar::populateAll() * (that is, it can only be used after WM_INITIALOG completed). *position: -1 = append, otherwise insert it at the given position */ -void CSideBar::addSession(const TWindowData *dat, int position) +void CSideBar::addSession(const CTabBaseDlg *dat, int position) { if (!m_isActive) return; @@ -552,7 +552,7 @@ void CSideBar::addSession(const TWindowData *dat, int position) else m_buttonlist.insert(item, position); - SendDlgItemMessage(dat->hwnd, IDC_TOGGLESIDEBAR, BM_SETIMAGE, IMAGE_ICON, + SendDlgItemMessage(dat->GetHwnd(), IDC_TOGGLESIDEBAR, BM_SETIMAGE, IMAGE_ICON, (LPARAM)(m_dwFlags & SIDEBARORIENTATION_LEFT ? PluginConfig.g_buttonBarIcons[ICON_DEFAULT_LEFT] : PluginConfig.g_buttonBarIcons[ICON_DEFAULT_RIGHT])); Invalidate(); @@ -563,7 +563,7 @@ void CSideBar::addSession(const TWindowData *dat, int position) * * @param dat _MessageWindowData *: session data for a client session. */ -HRESULT CSideBar::removeSession(const TWindowData *dat) +HRESULT CSideBar::removeSession(const CTabBaseDlg *dat) { if (dat) { CSideBarButton *item = findSession(dat); @@ -649,7 +649,7 @@ void CSideBar::scrollIntoView(const CSideBarButton *item) * * @param dat _MessageWindowData*: Session data */ -void CSideBar::updateSession(const TWindowData *dat) +void CSideBar::updateSession(const CTabBaseDlg *dat) { if (!m_isVisible || !m_isActive) return; @@ -681,7 +681,7 @@ void CSideBar::updateSession(const TWindowData *dat) * * @return The previously active item (that can be zero) */ -const CSideBarButton* CSideBar::setActiveItem(const TWindowData *dat) +const CSideBarButton* CSideBar::setActiveItem(const CTabBaseDlg *dat) { CSideBarButton *item = findSession(dat); if (item != NULL) @@ -805,7 +805,7 @@ void CSideBar::showAll(int showCmd) * @return CSideBarButtonItem*: pointer to the found item. Zero, if none was found */ -CSideBarButton* CSideBar::findSession(const TWindowData *dat) +CSideBarButton* CSideBar::findSession(const CTabBaseDlg *dat) { if (dat == NULL) return NULL; @@ -865,7 +865,7 @@ void CSideBar::resizeScrollWnd(LONG x, LONG y, LONG, LONG height) const SWP_NOCOPYBITS | SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOSENDCHANGING | SWP_DEFERERASE | SWP_ASYNCWINDOWPOS); } -void CSideBar::invalidateButton(const TWindowData *dat) +void CSideBar::invalidateButton(const CTabBaseDlg *dat) { if (m_isActive && m_isVisible) { CSideBarButton *item = findSession(dat); @@ -1039,10 +1039,8 @@ void __fastcall CSideBar::m_DefaultBackgroundRenderer(const HDC hdc, const RECT } } -void __fastcall CSideBar::m_DefaultContentRenderer(const HDC hdc, const RECT *rcBox, - const CSideBarButton *item) +void __fastcall CSideBar::m_DefaultContentRenderer(const HDC hdc, const RECT *rcBox, const CSideBarButton *item) { - const TWindowData *dat = item->getDat(); UINT id = item->getID(); int stateID = item->m_buttonControl->stateId; @@ -1052,7 +1050,7 @@ void __fastcall CSideBar::m_DefaultContentRenderer(const HDC hdc, const RECT *rc if (!M.isAero() && stateID == PBS_HOT) ::DrawEdge(hdc, const_cast(rcBox), BDR_INNER, BF_RECT | BF_SOFT | BF_FLAT); } - else if (dat) + else if (item->getDat()) item->renderIconAndNick(hdc, rcBox); } @@ -1063,7 +1061,7 @@ void __fastcall CSideBar::m_DefaultContentRenderer(const HDC hdc, const RECT *rc void __fastcall CSideBar::m_AdvancedContentRenderer(const HDC hdc, const RECT *rcBox, const CSideBarButton *item) { - const TWindowData *dat = item->getDat(); + const CTabBaseDlg *dat = item->getDat(); UINT id = item->getID(); LONG cx = rcBox->right - rcBox->left; @@ -1076,18 +1074,18 @@ void __fastcall CSideBar::m_AdvancedContentRenderer(const HDC hdc, const RECT *r RECT rc = *rcBox; if (dat->ace && dat->ace->hbmPic) { // we have an avatar - double dNewHeight, dNewWidth; - LONG maxHeight = cy - 8; - bool fFree = false; + double dNewHeight, dNewWidth; + LONG maxHeight = cy - 8; + bool fFree = false; Utils::scaleAvatarHeightLimited(dat->ace->hbmPic, dNewWidth, dNewHeight, maxHeight); HBITMAP hbmResized = CSkin::ResizeBitmap(dat->ace->hbmPic, dNewWidth, dNewHeight, fFree); - HDC dc = CreateCompatibleDC(hdc); + HDC dc = CreateCompatibleDC(hdc); HBITMAP hbmOld = reinterpret_cast(::SelectObject(dc, hbmResized)); - LONG xOff = (cx - maxHeight) + (maxHeight - (LONG)dNewWidth) / 2 - 4; - LONG yOff = (cy - (LONG)dNewHeight) / 2; + LONG xOff = (cx - maxHeight) + (maxHeight - (LONG)dNewWidth) / 2 - 4; + LONG yOff = (cy - (LONG)dNewHeight) / 2; GdiAlphaBlend(hdc, xOff, yOff, (LONG)dNewWidth, (LONG)dNewHeight, dc, 0, 0, (LONG)dNewWidth, (LONG)dNewHeight, CSkin::m_default_bf); ::SelectObject(dc, hbmOld); @@ -1097,11 +1095,8 @@ void __fastcall CSideBar::m_AdvancedContentRenderer(const HDC hdc, const RECT *r rc.right -= (maxHeight + 6); } - /* - * calculate metrics based on font configuration. Determine if we have enough - * space for both lines - */ - + // calculate metrics based on font configuration. Determine if we have enough + // space for both lines rc.left += 3; HFONT hOldFont = reinterpret_cast(::SelectObject(hdc, CInfoPanel::m_ipConfig.hFonts[IPFONTID_NICK])); ::GetTextExtentPoint32A(hdc, "A", 1, &szFirstLine); @@ -1124,11 +1119,8 @@ void __fastcall CSideBar::m_AdvancedContentRenderer(const HDC hdc, const RECT *r int iSize; HICON hIcon = dat->cache->getIcon(iSize); - /* - * TODO support larger icons at a later time. This side bar button - * could use 32x32 icons as well. - */ - + // TODO support larger icons at a later time. This side bar button + // could use 32x32 icons as well. rc.top = rc.bottom - szSecondLine.cy - 2; ::DrawIconEx(hdc, rc.left, rc.top + (rc.bottom - rc.top) / 2 - 8, hIcon, 16, 16, 0, 0, DI_NORMAL); rc.left += 18; @@ -1148,21 +1140,21 @@ const SIZE& __fastcall CSideBar::m_measureAdvancedVertical(CSideBarButton* item) { SIZE sz = { 0 }; - const TWindowData *dat = item->getDat(); + const CTabBaseDlg *dat = item->getDat(); if (dat) { SIZE szFirstLine, szSecondLine; if (dat->ace && dat->ace->hbmPic) sz.cy = item->getLayout()->width; - HDC dc = ::GetDC(dat->hwnd); + HDC dc = ::GetDC(dat->GetHwnd()); HFONT hOldFont = reinterpret_cast(::SelectObject(dc, CInfoPanel::m_ipConfig.hFonts[IPFONTID_NICK])); ::GetTextExtentPoint32(dc, dat->cache->getNick(), (int)mir_wstrlen(dat->cache->getNick()), &szFirstLine); ::SelectObject(dc, CInfoPanel::m_ipConfig.hFonts[IPFONTID_STATUS]); ::GetTextExtentPoint32(dc, dat->szStatus, (int)mir_wstrlen(dat->szStatus), &szSecondLine); ::SelectObject(dc, hOldFont); - ReleaseDC(dat->hwnd, dc); + ReleaseDC(dat->GetHwnd(), dc); szSecondLine.cx += 18; // icon space diff --git a/plugins/TabSRMM/src/sidebar.h b/plugins/TabSRMM/src/sidebar.h index b4c565ec7e..2ee7f35d90 100644 --- a/plugins/TabSRMM/src/sidebar.h +++ b/plugins/TabSRMM/src/sidebar.h @@ -31,8 +31,8 @@ struct TSideBarNotify { - NMHDR nmHdr; - const TWindowData* dat; + NMHDR nmHdr; + const CTabBaseDlg *dat; }; /* layout description structure */ @@ -61,7 +61,7 @@ class CSideBarButton { public: CSideBarButton(const UINT id, CSideBar *sideBar); - CSideBarButton(const TWindowData *dat, CSideBar *sideBar); + CSideBarButton(const CTabBaseDlg *dat, CSideBar *sideBar); ~CSideBarButton(); LONG getHeight() const { return(m_sz.cy); } @@ -70,8 +70,8 @@ public: const bool isTopAligned() const { return(m_isTopAligned); } const HWND getHwnd() const { return(m_hwnd); } const UINT getID() const { return(m_id); } - const MCONTACT getContactHandle() const { return(m_dat->hContact); } - const TWindowData* getDat() const { return(m_dat); } + const MCONTACT getContactHandle() const { return(m_dat->m_hContact); } + const CTabBaseDlg* getDat() const { return(m_dat); } const TSideBarLayout* getLayout() const { return(m_sideBarLayout); } void RenderThis(const HDC hdc) const; @@ -91,7 +91,7 @@ private: private: const TSideBarLayout* m_sideBarLayout; HWND m_hwnd; // window handle for the TSButton object - const TWindowData* m_dat; // session data + const CTabBaseDlg* m_dat; // session data UINT m_id; // control id bool m_isTopAligned; SIZE m_sz; @@ -130,9 +130,9 @@ public: ~CSideBar(); void Init(); - void addSession(const TWindowData *dat, int position); - HRESULT removeSession(const TWindowData *dat); - void updateSession(const TWindowData *dat); + void addSession(const CTabBaseDlg *dat, int position); + HRESULT removeSession(const CTabBaseDlg *dat); + void updateSession(const CTabBaseDlg *dat); void processScrollerButtons(UINT cmd); void Layout(const RECT *rc = 0, bool fOnlyCalc = false); @@ -149,7 +149,7 @@ public: const CSideBarButton* getScrollDown() const { return(m_down); } bool isSkinnedContainer() const { return(CSkin::m_skinEnabled ? true : false); } const UINT getLayoutId() const { return(m_uLayout); } - void invalidateButton(const TWindowData *dat); + void invalidateButton(const CTabBaseDlg *dat); const CSideBarButton* setActiveItem(const CSideBarButton *newItem) { @@ -171,7 +171,7 @@ public: } HWND getScrollWnd() const { return(m_hwndScrollWnd); } const CSideBarButton* getHoveredClose() const { return(m_hoveredClose); } - const CSideBarButton* setActiveItem(const TWindowData *dat); + const CSideBarButton* setActiveItem(const CTabBaseDlg *dat); static LRESULT CALLBACK wndProcStub(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); @@ -189,7 +189,7 @@ private: void populateAll(); void removeAll(); void Invalidate(); - CSideBarButton* findSession(const TWindowData *dat); + CSideBarButton* findSession(const CTabBaseDlg *dat); CSideBarButton* findSession(const MCONTACT hContact); LRESULT CALLBACK wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); diff --git a/plugins/TabSRMM/src/stdafx.h b/plugins/TabSRMM/src/stdafx.h index dbb1a59233..d37e847728 100644 --- a/plugins/TabSRMM/src/stdafx.h +++ b/plugins/TabSRMM/src/stdafx.h @@ -245,7 +245,7 @@ extern CREOleCallback2 reOleCallback2; int LoadSendRecvMessageModule(void); int SplitmsgShutdown(void); -void LogErrorMessage(HWND hwndDlg, TWindowData *dat, int i, wchar_t *szMsg); +void LogErrorMessage(HWND hwndDlg, CSrmmWindow *dat, int i, wchar_t *szMsg); int Chat_Load(), Chat_Unload(); void FreeLogFonts(); @@ -276,7 +276,7 @@ INT_PTR CALLBACK DlgProcUserPrefsFrame(HWND hwndDlg, UINT msg, WPARAM wParam, LP int TSAPI TBStateConvert2Flat(int state); int TSAPI RBStateConvert2Flat(int state); -void TSAPI FillTabBackground(const HDC hdc, int iStateId, const TWindowData *dat, RECT* rc); +void TSAPI FillTabBackground(const HDC hdc, int iStateId, const CTabBaseDlg *dat, RECT* rc); #define IS_EXTKEY(a) (a & (1 << 24)) diff --git a/plugins/TabSRMM/src/tabctrl.cpp b/plugins/TabSRMM/src/tabctrl.cpp index f783d2c73c..ba2bbbfa32 100644 --- a/plugins/TabSRMM/src/tabctrl.cpp +++ b/plugins/TabSRMM/src/tabctrl.cpp @@ -139,11 +139,11 @@ static void TSAPI DrawCustomTabPage(HDC hdc, RECT& rcClient) ::DeleteObject(hPen); } -void TSAPI FillTabBackground(const HDC hdc, int iStateId, const TWindowData *dat, RECT* rc) +void TSAPI FillTabBackground(const HDC hdc, int iStateId, const CTabBaseDlg *dat, RECT* rc) { unsigned clrIndex; - if (dat && dat->mayFlashTab) + if (dat && dat->m_bCanFlashTab) clrIndex = 7; else clrIndex = (iStateId == PBS_PRESSED ? 5 : (iStateId == PBS_HOT ? 6 : 4)); @@ -160,14 +160,14 @@ void TSAPI FillTabBackground(const HDC hdc, int iStateId, const TWindowData *dat // no image list is used and necessary, the message window dialog procedure has to provide a valid // icon handle in dat->hTabIcon -static void DrawItem(TabControlData *tabdat, HDC dc, RECT *rcItem, int nHint, int nItem, TWindowData *dat) +static void DrawItem(TabControlData *tabdat, HDC dc, RECT *rcItem, int nHint, int nItem, CSrmmWindow *dat) { if (dat == NULL) return; InflateRect(rcItem, -2, -2); - unsigned clrIndex = (dat->mayFlashTab) ? 3 : (nHint & HINT_ACTIVE_ITEM ? 1 : (nHint & HINT_HOTTRACK ? 2 : 0)); + unsigned clrIndex = (dat->m_bCanFlashTab) ? 3 : (nHint & HINT_ACTIVE_ITEM ? 1 : (nHint & HINT_HOTTRACK ? 2 : 0)); COLORREF clr = PluginConfig.tabConfig.colors[clrIndex]; int oldMode = SetBkMode(dc, TRANSPARENT); @@ -179,7 +179,7 @@ static void DrawItem(TabControlData *tabdat, HDC dc, RECT *rcItem, int nHint, in HICON hIcon; if (dat->dwFlags & MWF_ERRORSTATE) hIcon = PluginConfig.g_iconErr; - else if (dat->mayFlashTab) + else if (dat->m_bCanFlashTab) hIcon = dat->iFlashIcon; else { if (dat->si && dat->iFlashIcon) { @@ -194,7 +194,7 @@ static void DrawItem(TabControlData *tabdat, HDC dc, RECT *rcItem, int nHint, in hIcon = dat->hTabIcon; } - if (dat->mayFlashTab == FALSE || (dat->mayFlashTab == TRUE && dat->bTabFlash != 0) || !(dat->pContainer->dwFlagsEx & TCF_FLASHICON)) { + if (!dat->m_bCanFlashTab || (dat->m_bCanFlashTab == TRUE && dat->m_bTabFlash) || !(dat->pContainer->dwFlagsEx & TCF_FLASHICON)) { DWORD ix = rcItem->left + tabdat->m_xpad - 1; DWORD iy = (rcItem->bottom + rcItem->top - iSize) / 2; if (dat->dwFlagsEx & MWF_SHOW_ISIDLE && PluginConfig.m_bIdleDetect) @@ -216,7 +216,7 @@ static void DrawItem(TabControlData *tabdat, HDC dc, RECT *rcItem, int nHint, in CSkin::m_default_bf.SourceConstantAlpha = 255; } - if (dat->mayFlashTab == FALSE || (dat->mayFlashTab == TRUE && dat->bTabFlash != 0) || !(dat->pContainer->dwFlagsEx & TCF_FLASHLABEL)) { + if (!dat->m_bCanFlashTab || (dat->m_bCanFlashTab == TRUE && dat->m_bTabFlash) || !(dat->pContainer->dwFlagsEx & TCF_FLASHLABEL)) { DWORD dwTextFlags = DT_SINGLELINE | DT_VCENTER; HFONT oldFont = (HFONT)SelectObject(dc, (HFONT)SendMessage(tabdat->hwnd, WM_GETFONT, 0, 0)); if (tabdat->dwStyle & TCS_BUTTONS || !(tabdat->dwStyle & TCS_MULTILINE)) { @@ -235,7 +235,7 @@ static void DrawItem(TabControlData *tabdat, HDC dc, RECT *rcItem, int nHint, in static RECT rcTabPage = { 0 }; -static void DrawItemRect(TabControlData *tabdat, HDC dc, RECT *rcItem, int nHint, const TWindowData *dat) +static void DrawItemRect(TabControlData *tabdat, HDC dc, RECT *rcItem, int nHint, const CSrmmWindow *dat) { POINT pt; DWORD dwStyle = tabdat->dwStyle; @@ -393,7 +393,7 @@ static int DWordAlign(int n) return n; } -static HRESULT DrawThemesPartWithAero(const TabControlData *tabdat, HDC hDC, int iPartId, int iStateId, LPRECT prcBox, TWindowData *dat) +static HRESULT DrawThemesPartWithAero(const TabControlData *tabdat, HDC hDC, int iPartId, int iStateId, LPRECT prcBox, CSrmmWindow *dat) { HRESULT hResult = 0; bool bAero = M.isAero(); @@ -440,7 +440,7 @@ static HRESULT DrawThemesPart(const TabControlData *tabdat, HDC hDC, int iPartId // draw a themed tab item. either a tab or the body pane // handles image mirroring for tabs at the bottom -static void DrawThemesXpTabItem(HDC pDC, RECT *rcItem, UINT uiFlag, TabControlData *tabdat, TWindowData *dat) +static void DrawThemesXpTabItem(HDC pDC, RECT *rcItem, UINT uiFlag, TabControlData *tabdat, CSrmmWindow *dat) { BOOL bBody = (uiFlag & 1) ? TRUE : FALSE; BOOL bSel = (uiFlag & 2) ? TRUE : FALSE; @@ -623,7 +623,7 @@ static void PaintWorker(HWND hwnd, TabControlData *tabdat) tabdat->helperDat = 0; if (tabdat->fAeroTabs) { - TWindowData *dat = (TWindowData*)GetWindowLongPtr(tabdat->pContainer->hwndActive, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(tabdat->pContainer->hwndActive, GWLP_USERDATA); if (dat) tabdat->helperDat = dat; else @@ -818,7 +818,7 @@ page_done: RECT rcLog, rcPage; GetClientRect(hwnd, &rcPage); if (dwStyle & TCS_BOTTOM) { - GetWindowRect(tabdat->helperDat->hwnd, &rcLog); + GetWindowRect(tabdat->helperDat->GetHwnd(), &rcLog); pt.y = rcLog.bottom; pt.x = rcLog.left; ScreenToClient(hwnd, &pt); @@ -826,7 +826,7 @@ page_done: FillRect(hdc, &rcPage, CSkin::m_BrushBack); rcPage.top = 0; } - GetWindowRect(GetDlgItem(tabdat->helperDat->hwnd, tabdat->helperDat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_CHAT_LOG), &rcLog); + GetWindowRect(GetDlgItem(tabdat->helperDat->GetHwnd(), tabdat->helperDat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_LOG), &rcLog); pt.y = rcLog.top; pt.x = rcLog.left; @@ -846,9 +846,9 @@ page_done: continue; TabCtrl_GetItem(hwnd, i, &tci); - TWindowData *dat = 0; + CSrmmWindow *dat = 0; if (tci.lParam) - dat = (TWindowData*)GetWindowLongPtr((HWND)tci.lParam, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr((HWND)tci.lParam, GWLP_USERDATA); TabCtrl_GetItemRect(hwnd, i, &rcItem); if (!bClassicDraw && uiBottom) { rcItem.top -= PluginConfig.tabConfig.m_bottomAdjust; @@ -876,13 +876,13 @@ page_done: rctActive.bottom -= PluginConfig.tabConfig.m_bottomAdjust; } if (rctActive.left >= 0) { - TWindowData *dat = 0; + CSrmmWindow *dat = 0; int nHint = 0; rcItem = rctActive; TabCtrl_GetItem(hwnd, iActive, &tci); if (tci.lParam) - dat = (TWindowData*)GetWindowLongPtr((HWND)tci.lParam, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr((HWND)tci.lParam, GWLP_USERDATA); if (!bClassicDraw && !(dwStyle & TCS_BUTTONS)) { InflateRect(&rcItem, 2, 2); @@ -1110,11 +1110,11 @@ static LRESULT CALLBACK TabControlSubclassProc(HWND hwnd, UINT msg, WPARAM wPara int i = GetTabItemFromMouse(hwnd, &pt); if (i != -1) { TCITEM tc; - TWindowData *dat = NULL; + CSrmmWindow *dat = NULL; tc.mask = TCIF_PARAM; TabCtrl_GetItem(hwnd, i, &tc); - dat = (TWindowData*)GetWindowLongPtr((HWND)tc.lParam, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr((HWND)tc.lParam, GWLP_USERDATA); if (dat) { tabdat->bDragging = TRUE; tabdat->iBeginIndex = i; @@ -1142,7 +1142,7 @@ static LRESULT CALLBACK TabControlSubclassProc(HWND hwnd, UINT msg, WPARAM wPara tc.mask = TCIF_PARAM; TabCtrl_GetItem(hwnd, i, &tc); - TWindowData *dat = (TWindowData*)GetWindowLongPtr((HWND)tc.lParam, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr((HWND)tc.lParam, GWLP_USERDATA); if (dat) { tabdat->bDragging = TRUE; tabdat->iBeginIndex = i; @@ -1267,13 +1267,13 @@ static LRESULT CALLBACK TabControlSubclassProc(HWND hwnd, UINT msg, WPARAM wPara /* * get the message window data for the session to which this tab item belongs */ - TWindowData *dat = 0; + CSrmmWindow *dat = 0; if (IsWindow((HWND)item.lParam) && item.lParam != 0) - dat = (TWindowData*)GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA); if (dat) { tabdat->fTipActive = TRUE; ti.isGroup = 0; - ti.hItem = (HANDLE)dat->hContact; + ti.hItem = (HANDLE)dat->m_hContact; ti.isTreeFocused = 0; CallService("mToolTip/ShowTip", 0, (LPARAM)&ti); } diff --git a/plugins/TabSRMM/src/taskbar.cpp b/plugins/TabSRMM/src/taskbar.cpp index 2122ef9cc7..2a9d24f210 100644 --- a/plugins/TabSRMM/src/taskbar.cpp +++ b/plugins/TabSRMM/src/taskbar.cpp @@ -179,7 +179,7 @@ void CTaskbarInteract::SetTabActive(const HWND hwndTab, const HWND hwndGroup) co * static member function. Ignored when OS is not Windows 7 or global option for * Windows 7 task bar support is diabled. */ -void CProxyWindow::add(TWindowData *dat) +void CProxyWindow::add(CTabBaseDlg *dat) { if (PluginConfig.m_bIsWin7 && PluginConfig.m_useAeroPeek) // && (!CSkin::m_skinEnabled || M.GetByte("forceAeroPeek", 0))) dat->pWnd = new CProxyWindow(dat); @@ -195,7 +195,7 @@ void CProxyWindow::add(TWindowData *dat) * * static member function */ -void CProxyWindow::verify(TWindowData *dat) +void CProxyWindow::verify(CTabBaseDlg *dat) { if (PluginConfig.m_bIsWin7 && PluginConfig.m_useAeroPeek) { if (0 == dat->pWnd) { @@ -224,7 +224,7 @@ void CProxyWindow::verify(TWindowData *dat) * and previews for a message session. * each tab has one invisible proxy window */ -CProxyWindow::CProxyWindow(TWindowData *dat) +CProxyWindow::CProxyWindow(CTabBaseDlg *dat) { m_dat = dat; m_hBigIcon = 0; @@ -320,7 +320,7 @@ void CProxyWindow::sendPreview() if (m_dat->pContainer == NULL) return; - TWindowData *dat_active = reinterpret_cast(::GetWindowLongPtr(m_dat->pContainer->hwndActive, GWLP_USERDATA)); + CSrmmWindow *dat_active = reinterpret_cast(::GetWindowLongPtr(m_dat->pContainer->hwndActive, GWLP_USERDATA)); if (!m_thumb || !dat_active) return; @@ -330,7 +330,7 @@ void CProxyWindow::sendPreview() HDC hdc, dc; int twips = (int)(15.0f / PluginConfig.m_DPIscaleY); bool fIsChat = m_dat->bType != SESSIONTYPE_IM; - HWND hwndRich = ::GetDlgItem(m_dat->hwnd, fIsChat ? IDC_CHAT_LOG : IDC_LOG); + HWND hwndRich = ::GetDlgItem(m_dat->GetHwnd(), fIsChat ? IDC_LOG : IDC_LOG); LONG cx, cy; POINT ptOrigin = { 0 }, ptBottom; @@ -338,8 +338,8 @@ void CProxyWindow::sendPreview() RECT rcClient; ::SendMessage(m_dat->pContainer->hwnd, DM_QUERYCLIENTAREA, 0, (LPARAM)&rcClient); - ::MoveWindow(m_dat->hwnd, rcClient.left, rcClient.top, (rcClient.right - rcClient.left), (rcClient.bottom - rcClient.top), FALSE); - ::SendMessage(m_dat->hwnd, WM_SIZE, 0, 0); + ::MoveWindow(m_dat->GetHwnd(), rcClient.left, rcClient.top, (rcClient.right - rcClient.left), (rcClient.bottom - rcClient.top), FALSE); + ::SendMessage(m_dat->GetHwnd(), WM_SIZE, 0, 0); DM_ScrollToBottom(m_dat, 0, 1); } /* @@ -360,7 +360,7 @@ void CProxyWindow::sendPreview() pt = m_dat->pContainer->ptLogSaved; } - ::GetWindowRect(::GetDlgItem(m_dat->pContainer->hwndActive, dat_active->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_CHAT_LOG), &rcTemp); + ::GetWindowRect(::GetDlgItem(m_dat->pContainer->hwndActive, dat_active->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_LOG), &rcTemp); ptBottom.x = rcTemp.left; ptBottom.y = rcTemp.bottom; ::ScreenToClient(m_dat->pContainer->hwnd, &ptBottom); @@ -372,7 +372,7 @@ void CProxyWindow::sendPreview() rcRich.right = cx; rcRich.bottom = ptBottom.y - pt.y; - dc = ::GetDC(m_dat->hwnd); + dc = ::GetDC(m_dat->GetHwnd()); hdc = ::CreateCompatibleDC(dc); HBITMAP hbm = CSkin::CreateAeroCompatibleBitmap(rcContainer, hdc); HBITMAP hbmOld = reinterpret_cast(::SelectObject(hdc, hbm)); @@ -434,7 +434,7 @@ void CProxyWindow::sendPreview() else pt.x = pt.y = 0; CMimAPI::m_pfnDwmSetIconicLivePreviewBitmap(m_hwndProxy, hbm, &pt, m_dat->pContainer->dwFlags & CNT_CREATE_MINIMIZED ? 0 : DWM_SIT_DISPLAYFRAME); - ::ReleaseDC(m_dat->hwnd, dc); + ::ReleaseDC(m_dat->GetHwnd(), dc); ::DeleteObject(hbm); } @@ -553,10 +553,10 @@ LRESULT CALLBACK CProxyWindow::wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARA { TContainerData* pC = m_dat->pContainer; - if (m_dat->hwnd != pC->hwndActive) - SendMessage(m_dat->hwnd, WM_CLOSE, 1, 3); + if (m_dat->GetHwnd() != pC->hwndActive) + SendMessage(m_dat->GetHwnd(), WM_CLOSE, 1, 3); else - SendMessage(m_dat->hwnd, WM_CLOSE, 1, 2); + SendMessage(m_dat->GetHwnd(), WM_CLOSE, 1, 2); if (!IsIconic(pC->hwnd)) SetForegroundWindow(pC->hwnd); } @@ -568,8 +568,8 @@ LRESULT CALLBACK CProxyWindow::wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARA */ case WM_ACTIVATE: if (WA_ACTIVE == wParam) { - if (IsWindow(m_dat->hwnd)) - ::PostMessage(m_dat->hwnd, DM_ACTIVATEME, 0, 0); + if (IsWindow(m_dat->GetHwnd())) + ::PostMessage(m_dat->GetHwnd(), DM_ACTIVATEME, 0, 0); return 0; // no default processing, avoid flickering. } break; diff --git a/plugins/TabSRMM/src/taskbar.h b/plugins/TabSRMM/src/taskbar.h index 8e43fbf0db..d8ca7ec962 100644 --- a/plugins/TabSRMM/src/taskbar.h +++ b/plugins/TabSRMM/src/taskbar.h @@ -50,7 +50,7 @@ public: virtual void update() = 0; protected: - const TWindowData *m_dat; + const CTabBaseDlg *m_dat; const CProxyWindow *m_pWnd; HBITMAP m_hbmThumb, m_hbmOld; @@ -97,7 +97,7 @@ private: class CProxyWindow { public: - CProxyWindow(TWindowData *dat); + CProxyWindow(CTabBaseDlg *dat); ~CProxyWindow(); void updateIcon(const HICON hIcon) const; @@ -108,7 +108,7 @@ public: void Invalidate() const; void verifyDwmState(); - __inline const TWindowData* getDat() const { return m_dat; } + __inline const CTabBaseDlg* getDat() const { return m_dat; } __inline const LONG getWidth() const { return m_width; } __inline const LONG getHeight() const { return m_height; } __inline const HWND getHwnd() const { return m_hwndProxy; } @@ -116,11 +116,11 @@ public: __inline const HICON getOverlayIcon() const { return m_hOverlayIcon; } static LRESULT CALLBACK stubWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - static void add(TWindowData *dat); - static void verify(TWindowData *dat); + static void add(CTabBaseDlg *dat); + static void verify(CTabBaseDlg *dat); private: - TWindowData *m_dat; + CTabBaseDlg *m_dat; HWND m_hwndProxy; LONG m_width, m_height; diff --git a/plugins/TabSRMM/src/templates.cpp b/plugins/TabSRMM/src/templates.cpp index ea0458703b..d8345d0152 100644 --- a/plugins/TabSRMM/src/templates.cpp +++ b/plugins/TabSRMM/src/templates.cpp @@ -112,7 +112,7 @@ INT_PTR CALLBACK DlgProcTemplateEditor(HWND hwndDlg, UINT msg, WPARAM wParam, LP { TemplateEditorInfo *teInfo = 0; TTemplateSet *tSet; - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); /* * since this dialog needs a MessageWindowData * but has no container, we can store * the extended info struct in pContainer *) @@ -128,7 +128,7 @@ INT_PTR CALLBACK DlgProcTemplateEditor(HWND hwndDlg, UINT msg, WPARAM wParam, LP TranslateDialogDefault(hwndDlg); { TemplateEditorNew *teNew = (TemplateEditorNew *)lParam; - dat = (TWindowData*)mir_calloc(sizeof(TWindowData)); + dat = (CSrmmWindow*)mir_calloc(sizeof(CSrmmWindow)); dat->pContainer = (TContainerData*)mir_alloc(sizeof(TContainerData)); memset(dat->pContainer, 0, sizeof(TContainerData)); teInfo = (TemplateEditorInfo *)dat->pContainer; @@ -147,19 +147,19 @@ INT_PTR CALLBACK DlgProcTemplateEditor(HWND hwndDlg, UINT msg, WPARAM wParam, LP SendDlgItemMessage(hwndDlg, IDC_PREVIEW, EM_SETEDITSTYLE, SES_EXTENDBACKCOLOR, SES_EXTENDBACKCOLOR); SendDlgItemMessage(hwndDlg, IDC_PREVIEW, EM_EXLIMITTEXT, 0, 0x80000000); - dat->hContact = db_find_first(); - dat->szProto = GetContactProto(dat->hContact); - while (dat->szProto == 0 && dat->hContact != 0) { - dat->hContact = db_find_next(dat->hContact); - dat->szProto = GetContactProto(dat->hContact); + dat->m_hContact = db_find_first(); + dat->szProto = GetContactProto(dat->m_hContact); + while (dat->szProto == 0 && dat->m_hContact != 0) { + dat->m_hContact = db_find_next(dat->m_hContact); + dat->szProto = GetContactProto(dat->m_hContact); } dat->dwFlags = dat->pContainer->theme.dwFlags; - dat->cache = CContactCache::getContactCache(dat->hContact); + dat->cache = CContactCache::getContactCache(dat->m_hContact); dat->cache->updateNick(); dat->cache->updateUIN(); dat->cache->updateStats(TSessionStats::INIT_TIMER); - GetMYUIN(dat); + dat->GetMYUIN(); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); ShowWindow(hwndDlg, SW_SHOW); @@ -359,7 +359,7 @@ INT_PTR CALLBACK DlgProcTemplateEditor(HWND hwndDlg, UINT msg, WPARAM wParam, LP dat->dwFlags = (teInfo->rtl ? dat->dwFlags | MWF_LOG_RTL : dat->dwFlags & ~MWF_LOG_RTL); dat->dwFlags = (iIndex == 0 || iIndex == 1) ? dat->dwFlags & ~MWF_LOG_GROUPMODE : dat->dwFlags | MWF_LOG_GROUPMODE; mir_snwprintf(dat->szMyNickname, L"My Nickname"); - StreamInEvents(hwndDlg, 0, 1, 0, &dbei); + dat->StreamInEvents(0, 1, 0, &dbei); SendDlgItemMessage(hwndDlg, IDC_PREVIEW, EM_SETSEL, -1, -1); if (teInfo->changed) memcpy(tSet->szTemplates[teInfo->inEdit], szTemp, TEMPLATE_LENGTH * sizeof(wchar_t)); diff --git a/plugins/TabSRMM/src/themeio.cpp b/plugins/TabSRMM/src/themeio.cpp index e78fdf786d..c87c0df5b0 100644 --- a/plugins/TabSRMM/src/themeio.cpp +++ b/plugins/TabSRMM/src/themeio.cpp @@ -176,7 +176,7 @@ int TSAPI CheckThemeVersion(const wchar_t *szIniFilename) return 0; } -void TSAPI WriteThemeToINI(const wchar_t *szIniFilenameT, TWindowData *dat) +void TSAPI WriteThemeToINI(const wchar_t *szIniFilenameT, CSrmmWindow *dat) { int i, n = 0; DBVARIANT dbv; diff --git a/plugins/TabSRMM/src/themes.cpp b/plugins/TabSRMM/src/themes.cpp index ed6853f736..444e1e562b 100644 --- a/plugins/TabSRMM/src/themes.cpp +++ b/plugins/TabSRMM/src/themes.cpp @@ -1920,7 +1920,7 @@ void CSkin::DrawDimmedIcon(HDC hdc, LONG left, LONG top, LONG dx, LONG dy, HICON DeleteDC(dcMem); } -UINT CSkin::NcCalcRichEditFrame(HWND hwnd, const TWindowData *mwdat, UINT skinID, UINT msg, WPARAM wParam, LPARAM lParam, WNDPROC MyWndProc) +UINT CSkin::NcCalcRichEditFrame(HWND hwnd, const CTabBaseDlg *mwdat, UINT skinID, UINT msg, WPARAM wParam, LPARAM lParam, WNDPROC MyWndProc) { NCCALCSIZE_PARAMS *nccp = (NCCALCSIZE_PARAMS *)lParam; BOOL bReturn = FALSE; @@ -1968,7 +1968,7 @@ UINT CSkin::NcCalcRichEditFrame(HWND hwnd, const TWindowData *mwdat, UINT skinID // process WM_NCPAINT for the rich edit control. Draws a visual style border and avoid // classic static edge / client edge may also draw a colorized border around the control -UINT CSkin::DrawRichEditFrame(HWND hwnd, const TWindowData *mwdat, UINT skinID, UINT msg, WPARAM wParam, LPARAM lParam, WNDPROC OldWndProc) +UINT CSkin::DrawRichEditFrame(HWND hwnd, const CTabBaseDlg *mwdat, UINT skinID, UINT msg, WPARAM wParam, LPARAM lParam, WNDPROC OldWndProc) { // do default processing (otherwise, NO scrollbar as it is painted in NC_PAINT) LRESULT result = mir_callNextSubclass(hwnd, OldWndProc, msg, wParam, lParam); @@ -2192,93 +2192,90 @@ void CSkin::MapClientToParent(HWND hwndClient, HWND hwndParent, RECT &rc) // @param hdc HDC: handle to the device context in which painting should occur. // @param rcWindow RECT &: The window rectangle of the message dialog window -void CSkin::RenderToolbarBG(const TWindowData *dat, HDC hdc, const RECT &rcWindow) +void CTabBaseDlg::RenderToolbarBG(HDC hdc, const RECT &rcWindow) const { - if (dat) { - if (dat->pContainer->dwFlags & CNT_HIDETOOLBAR) - return; - - bool bAero = M.isAero(); - bool fTbColorsValid = PluginConfig.m_tbBackgroundHigh && PluginConfig.m_tbBackgroundLow; - BYTE bAlphaOffset = 0; - BOOL fMustDrawNonThemed = ((bAero || fTbColorsValid) && !M.GetByte(SRMSGMOD_T, "forceThemedToolbar", 0)); - RECT rc, rcToolbar; - POINT pt; - - if (!(dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR)) { - ::GetWindowRect(::GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_CHAT ? IDC_CHAT_LOG : IDC_LOG), &rc); - pt.y = rc.bottom + 0; - ::ScreenToClient(dat->hwnd, &pt); - rcToolbar.top = pt.y; - rcToolbar.left = 0; - rcToolbar.right = rcWindow.right; - - if (dat->bType == SESSIONTYPE_IM) { - if (dat->dwFlags & MWF_ERRORSTATE) - rcToolbar.top += ERRORPANEL_HEIGHT; - if (dat->dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED || dat->bNotOnList) { - rcToolbar.top += 20; - RECT rcAdd; - rcAdd.left = 0; rcAdd.right = rcToolbar.right - rcToolbar.left; - rcAdd.bottom = rcToolbar.top - 1; - rcAdd.top = rcAdd.bottom - 20; - ::DrawEdge(hdc, &rcAdd, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_RECT | BF_SOFT | BF_FLAT); - } - } - - ::GetWindowRect(::GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_CHAT ? IDC_CHAT_MESSAGE : IDC_MESSAGE), &rc); - pt.y = rc.top - (dat->bIsAutosizingInput ? 1 : 2); - ::ScreenToClient(dat->hwnd, &pt); - rcToolbar.bottom = pt.y; - } - else { - GetWindowRect(::GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_CHAT ? IDC_CHAT_MESSAGE : IDC_MESSAGE), &rc); - pt.y = rc.bottom - 2; - ScreenToClient(dat->hwnd, &pt); - rcToolbar.top = pt.y + 1; - rcToolbar.left = 0; - rcToolbar.right = rcWindow.right; - rcToolbar.bottom = rcWindow.bottom; - } - LONG cx = rcToolbar.right - rcToolbar.left; - LONG cy = rcToolbar.bottom - rcToolbar.top; - - RECT rcCachedToolbar = { 0 }; - rcCachedToolbar.right = cx; - rcCachedToolbar.bottom = cy; + if (pContainer->dwFlags & CNT_HIDETOOLBAR) + return; - if (dat->pContainer->cachedToolbarDC == 0) - dat->pContainer->cachedToolbarDC = ::CreateCompatibleDC(hdc); + bool bAero = M.isAero(); + bool fTbColorsValid = PluginConfig.m_tbBackgroundHigh && PluginConfig.m_tbBackgroundLow; + BYTE bAlphaOffset = 0; + BOOL fMustDrawNonThemed = ((bAero || fTbColorsValid) && !M.GetByte(SRMSGMOD_T, "forceThemedToolbar", 0)); + RECT rc, rcToolbar; + POINT pt; - if (dat->pContainer->szOldToolbarSize.cx != cx || dat->pContainer->szOldToolbarSize.cy != cy) { - if (dat->pContainer->oldhbmToolbarBG) { - ::SelectObject(dat->pContainer->cachedToolbarDC, dat->pContainer->oldhbmToolbarBG); - ::DeleteObject(dat->pContainer->hbmToolbarBG); + if (!(pContainer->dwFlags & CNT_BOTTOMTOOLBAR)) { + ::GetWindowRect(::GetDlgItem(m_hwnd, bType == SESSIONTYPE_CHAT ? IDC_LOG : IDC_LOG), &rc); + pt.y = rc.bottom + 0; + ::ScreenToClient(m_hwnd, &pt); + rcToolbar.top = pt.y; + rcToolbar.left = 0; + rcToolbar.right = rcWindow.right; + + if (bType == SESSIONTYPE_IM) { + if (dwFlags & MWF_ERRORSTATE) + rcToolbar.top += ERRORPANEL_HEIGHT; + if (dwFlagsEx & MWF_SHOW_SCROLLINGDISABLED || bNotOnList) { + rcToolbar.top += 20; + RECT rcAdd; + rcAdd.left = 0; rcAdd.right = rcToolbar.right - rcToolbar.left; + rcAdd.bottom = rcToolbar.top - 1; + rcAdd.top = rcAdd.bottom - 20; + ::DrawEdge(hdc, &rcAdd, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_RECT | BF_SOFT | BF_FLAT); } - dat->pContainer->hbmToolbarBG = CSkin::CreateAeroCompatibleBitmap(rcCachedToolbar, hdc);// ::CreateCompatibleBitmap(hdc, cx, cy); - dat->pContainer->oldhbmToolbarBG = reinterpret_cast(::SelectObject(dat->pContainer->cachedToolbarDC, dat->pContainer->hbmToolbarBG)); } - dat->pContainer->szOldToolbarSize.cx = cx; - dat->pContainer->szOldToolbarSize.cy = cy; - if (!fMustDrawNonThemed && M.isVSThemed()) { - DrawThemeBackground(dat->hThemeToolbar, dat->pContainer->cachedToolbarDC, 6, 1, &rcCachedToolbar, &rcCachedToolbar); - dat->pContainer->bTBRenderingMode = 1; // tell TSButton how to render the tool bar buttons - } - else { - dat->pContainer->bTBRenderingMode = (M.isVSThemed() ? 1 : 0); - m_tmp_tb_high = PluginConfig.m_tbBackgroundHigh ? PluginConfig.m_tbBackgroundHigh : - ((bAero && m_pCurrentAeroEffect) ? m_pCurrentAeroEffect->m_clrToolbar : ::GetSysColor(COLOR_3DFACE)); - m_tmp_tb_low = PluginConfig.m_tbBackgroundLow ? PluginConfig.m_tbBackgroundLow : - ((bAero && m_pCurrentAeroEffect) ? m_pCurrentAeroEffect->m_clrToolbar2 : ::GetSysColor(COLOR_3DFACE)); - - bAlphaOffset = PluginConfig.m_tbBackgroundHigh ? 40 : 0; - ::DrawAlpha(dat->pContainer->cachedToolbarDC, &rcCachedToolbar, m_tmp_tb_high, 55 + bAlphaOffset, m_tmp_tb_low, 0, 9, 0, 0, 0); + ::GetWindowRect(::GetDlgItem(m_hwnd, bType == SESSIONTYPE_CHAT ? IDC_MESSAGE : IDC_MESSAGE), &rc); + pt.y = rc.top - (bIsAutosizingInput ? 1 : 2); + ::ScreenToClient(m_hwnd, &pt); + rcToolbar.bottom = pt.y; + } + else { + GetWindowRect(::GetDlgItem(m_hwnd, bType == SESSIONTYPE_CHAT ? IDC_MESSAGE : IDC_MESSAGE), &rc); + pt.y = rc.bottom - 2; + ScreenToClient(m_hwnd, &pt); + rcToolbar.top = pt.y + 1; + rcToolbar.left = 0; + rcToolbar.right = rcWindow.right; + rcToolbar.bottom = rcWindow.bottom; + } + LONG cx = rcToolbar.right - rcToolbar.left; + LONG cy = rcToolbar.bottom - rcToolbar.top; + + RECT rcCachedToolbar = { 0 }; + rcCachedToolbar.right = cx; + rcCachedToolbar.bottom = cy; + + if (pContainer->cachedToolbarDC == 0) + pContainer->cachedToolbarDC = ::CreateCompatibleDC(hdc); + + if (pContainer->szOldToolbarSize.cx != cx || pContainer->szOldToolbarSize.cy != cy) { + if (pContainer->oldhbmToolbarBG) { + ::SelectObject(pContainer->cachedToolbarDC, pContainer->oldhbmToolbarBG); + ::DeleteObject(pContainer->hbmToolbarBG); } + pContainer->hbmToolbarBG = CSkin::CreateAeroCompatibleBitmap(rcCachedToolbar, hdc);// ::CreateCompatibleBitmap(hdc, cx, cy); + pContainer->oldhbmToolbarBG = reinterpret_cast(::SelectObject(pContainer->cachedToolbarDC, pContainer->hbmToolbarBG)); + } + pContainer->szOldToolbarSize.cx = cx; + pContainer->szOldToolbarSize.cy = cy; - ::BitBlt(hdc, rcToolbar.left, rcToolbar.top, cx, cy, - dat->pContainer->cachedToolbarDC, 0, 0, SRCCOPY); + if (!fMustDrawNonThemed && M.isVSThemed()) { + DrawThemeBackground(hThemeToolbar, pContainer->cachedToolbarDC, 6, 1, &rcCachedToolbar, &rcCachedToolbar); + pContainer->bTBRenderingMode = 1; // tell TSButton how to render the tool bar buttons } + else { + pContainer->bTBRenderingMode = (M.isVSThemed() ? 1 : 0); + CSkin::m_tmp_tb_high = PluginConfig.m_tbBackgroundHigh ? PluginConfig.m_tbBackgroundHigh : + ((bAero && CSkin::m_pCurrentAeroEffect) ? CSkin::m_pCurrentAeroEffect->m_clrToolbar : ::GetSysColor(COLOR_3DFACE)); + CSkin::m_tmp_tb_low = PluginConfig.m_tbBackgroundLow ? PluginConfig.m_tbBackgroundLow : + ((bAero && CSkin::m_pCurrentAeroEffect) ? CSkin::m_pCurrentAeroEffect->m_clrToolbar2 : ::GetSysColor(COLOR_3DFACE)); + + bAlphaOffset = PluginConfig.m_tbBackgroundHigh ? 40 : 0; + ::DrawAlpha(pContainer->cachedToolbarDC, &rcCachedToolbar, CSkin::m_tmp_tb_high, 55 + bAlphaOffset, CSkin::m_tmp_tb_low, 0, 9, 0, 0, 0); + } + + ::BitBlt(hdc, rcToolbar.left, rcToolbar.top, cx, cy, pContainer->cachedToolbarDC, 0, 0, SRCCOPY); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -2454,31 +2451,28 @@ void CSkin::extractSkinsAndLogo(bool fForceOverwrite) const ///////////////////////////////////////////////////////////////////////////////////////// // redraw the splitter area between the message input and message log area only -void CSkin::UpdateToolbarBG(TWindowData *dat) +void CTabBaseDlg::UpdateToolbarBG() { - if (dat == NULL) - return; - RECT rcUpdate, rcTmp; - ::GetWindowRect(::GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_CHAT_LOG), &rcTmp); + ::GetWindowRect(::GetDlgItem(m_hwnd, bType == SESSIONTYPE_IM ? IDC_LOG : IDC_LOG), &rcTmp); POINT pt; pt.x = rcTmp.left; pt.y = rcTmp.top; - ::ScreenToClient(dat->hwnd, &pt); + ::ScreenToClient(m_hwnd, &pt); rcUpdate.left = 0; rcUpdate.top = pt.y; - ::GetClientRect(dat->hwnd, &rcTmp); + ::GetClientRect(m_hwnd, &rcTmp); rcUpdate.right = rcTmp.right; rcUpdate.bottom = rcTmp.bottom; if (M.isAero() || M.isDwmActive()) - dat->fLimitedUpdate = true; // skip unrelevant window updates when we have buffered paint avail - ::RedrawWindow(dat->hwnd, &rcUpdate, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW); - ::BB_RedrawButtons(dat); - dat->fLimitedUpdate = false; + fLimitedUpdate = true; // skip unrelevant window updates when we have buffered paint avail + ::RedrawWindow(m_hwnd, &rcUpdate, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW); + BB_RedrawButtons(); + fLimitedUpdate = false; } ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/plugins/TabSRMM/src/themes.h b/plugins/TabSRMM/src/themes.h index b999139d8a..4472524fe9 100644 --- a/plugins/TabSRMM/src/themes.h +++ b/plugins/TabSRMM/src/themes.h @@ -371,12 +371,11 @@ public: static void TSAPI SkinDrawBG(HWND hwndClient, HWND hwnd, TContainerData *pContainer, RECT *rcClient, HDC hdcTarget); static void TSAPI DrawDimmedIcon(HDC hdc, LONG left, LONG top, LONG dx, LONG dy, HICON hIcon, BYTE alpha); static DWORD __fastcall HexStringToLong(const wchar_t *szSource); - static UINT TSAPI DrawRichEditFrame(HWND hwnd, const TWindowData *mwdat, UINT skinID, UINT msg, WPARAM wParam, LPARAM lParam, WNDPROC OldWndProc); - static UINT TSAPI NcCalcRichEditFrame(HWND hwnd, const TWindowData *mwdat, UINT skinID, UINT msg, WPARAM wParam, LPARAM lParam, WNDPROC OldWndProc); + static UINT TSAPI DrawRichEditFrame(HWND hwnd, const CTabBaseDlg *mwdat, UINT skinID, UINT msg, WPARAM wParam, LPARAM lParam, WNDPROC OldWndProc); + static UINT TSAPI NcCalcRichEditFrame(HWND hwnd, const CTabBaseDlg *mwdat, UINT skinID, UINT msg, WPARAM wParam, LPARAM lParam, WNDPROC OldWndProc); static HBITMAP TSAPI CreateAeroCompatibleBitmap(const RECT &rc, HDC dc); static int TSAPI RenderText(HDC hdc, HANDLE hTheme, const wchar_t *szText, RECT *rc, DWORD dtFlags, const int iGlowSize = DEFAULT_GLOW_SIZE, COLORREF clr = 0, bool fForceAero = false); static void TSAPI MapClientToParent(HWND hwndClient, HWND hwndParent, RECT &rc); - static void TSAPI RenderToolbarBG(const TWindowData *dat, HDC hdc, const RECT &rcWindow); static HBITMAP TSAPI ResizeBitmap(HBITMAP hBmpSrc, LONG width, LONG height, bool &mustFree); static void TSAPI ApplyAeroEffect(const HDC hdc, const RECT* rc, int iEffectArea); static void TSAPI setAeroEffect(const LRESULT effect); @@ -384,7 +383,6 @@ public: static HANDLE TSAPI InitiateBufferedPaint(const HDC hdcSrc, RECT& rc, HDC& hdcOut); static void TSAPI FinalizeBufferedPaint(HANDLE hbp, RECT *rc); 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); @@ -466,14 +464,14 @@ struct TabControlData int iHoveredTabIndex; int iHoveredCloseIcon; HWND hwndDrag; - TWindowData *dragDat; + CSrmmWindow *dragDat; HIMAGELIST himlDrag; BOOL bRefreshWithoutClip; BOOL fSavePos; BOOL fTipActive; BOOL fAeroTabs; BOOL fCloseButton; - TWindowData* helperDat; // points to the client data of the active tab + CSrmmWindow* helperDat; // points to the client data of the active tab CImageItem* helperItem, *helperGlowItem; // aero ui, holding the skin image for the tabs }; @@ -494,17 +492,17 @@ struct ButtonItem { LONG_PTR pressedGlyphMetrics[4]; DWORD dwFlags, dwStockFlags; DWORD uId; - wchar_t szTip[256]; + wchar_t szTip[256]; char szService[256]; char szModule[256], szSetting[256]; BYTE bValuePush[256], bValueRelease[256]; DWORD type; - void(*pfnAction)(ButtonItem *item, HWND hwndDlg, TWindowData *dat, HWND hwndItem); - void(*pfnCallback)(ButtonItem *item, HWND hwndDlg, TWindowData *dat, HWND hwndItem); + void(*pfnAction)(ButtonItem *item, HWND hwndDlg, CTabBaseDlg *dat, HWND hwndItem); + void(*pfnCallback)(ButtonItem *item, HWND hwndDlg, CTabBaseDlg *dat, HWND hwndItem); wchar_t tszLabel[40]; ButtonItem* nextItem; HANDLE hContact; - TWindowData *dat; + CSrmmWindow *dat; }; typedef struct _tagButtonSet { diff --git a/plugins/TabSRMM/src/userprefs.cpp b/plugins/TabSRMM/src/userprefs.cpp index 768d9f34d5..38a90c916c 100644 --- a/plugins/TabSRMM/src/userprefs.cpp +++ b/plugins/TabSRMM/src/userprefs.cpp @@ -132,16 +132,16 @@ static INT_PTR CALLBACK DlgProcUserPrefs(HWND hwndDlg, UINT msg, WPARAM wParam, break; case WM_USER + 100: - TWindowData *dat = 0; + CSrmmWindow *dat = 0; DWORD *pdwActionToTake = (DWORD *)lParam; unsigned int iOldIEView = 0; HWND hWnd = M.FindWindow(hContact); BYTE bOldInfoPanel = M.GetByte(hContact, "infopanel", 0); if (hWnd) { - dat = (TWindowData*)GetWindowLongPtr(hWnd, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(hWnd, GWLP_USERDATA); if (dat) - iOldIEView = GetIEViewMode(dat->hContact); + iOldIEView = GetIEViewMode(dat->m_hContact); } int iIndex = SendDlgItemMessage(hwndDlg, IDC_IEVIEWMODE, CB_GETCURSEL, 0, 0); int iMode = SendDlgItemMessage(hwndDlg, IDC_IEVIEWMODE, CB_GETITEMDATA, iIndex, 0); @@ -166,7 +166,7 @@ static INT_PTR CALLBACK DlgProcUserPrefs(HWND hwndDlg, UINT msg, WPARAM wParam, break; } if (hWnd && dat) { - unsigned int iNewIEView = GetIEViewMode(dat->hContact); + unsigned int iNewIEView = GetIEViewMode(dat->m_hContact); if (iNewIEView != iOldIEView) { if (pdwActionToTake) *pdwActionToTake |= UPREF_ACTION_SWITCHLOGVIEWER; @@ -211,11 +211,13 @@ static INT_PTR CALLBACK DlgProcUserPrefs(HWND hwndDlg, UINT msg, WPARAM wParam, if (IsDlgButtonChecked(hwndDlg, IDC_LOADONLYACTUAL)) { db_set_b(hContact, SRMSGMOD_T, "ActualHistory", 1); - if (hWnd && dat) dat->bActualHistory = TRUE; + if (hWnd && dat) + dat->bActualHistory = TRUE; } else { db_set_b(hContact, SRMSGMOD_T, "ActualHistory", 0); - if (hWnd && dat) dat->bActualHistory = FALSE; + if (hWnd && dat) + dat->bActualHistory = FALSE; } if (IsDlgButtonChecked(hwndDlg, IDC_IGNORETIMEOUTS)) { @@ -230,7 +232,7 @@ static INT_PTR CALLBACK DlgProcUserPrefs(HWND hwndDlg, UINT msg, WPARAM wParam, } if (hWnd && dat) { SendMessage(hWnd, DM_CONFIGURETOOLBAR, 0, 1); - ShowPicture(dat, FALSE); + dat->ShowPicture(false); SendMessage(hWnd, WM_SIZE, 0, 0); DM_ScrollToBottom(dat, 0, 1); } @@ -242,6 +244,14 @@ static INT_PTR CALLBACK DlgProcUserPrefs(HWND hwndDlg, UINT msg, WPARAM wParam, return FALSE; } +///////////////////////////////////////////////////////////////////////////////////////// +// loads message log and other "per contact" flags +// it uses the global flag value (0, mwflags) and then merges per contact settings +// based on the mask value. +// +// ALWAYS mask dat->dwFlags with MWF_LOG_ALL to only affect real flag bits and +// ignore temporary bits. + static struct _checkboxes { UINT uId; @@ -264,36 +274,25 @@ checkboxes[] = { 0, 0 }; -///////////////////////////////////////////////////////////////////////////////////////// -// loads message log and other "per contact" flags -// it uses the global flag value (0, mwflags) and then merges per contact settings -// based on the mask value. -// -// ALWAYS mask dat->dwFlags with MWF_LOG_ALL to only affect real flag bits and -// ignore temporary bits. - -int TSAPI LoadLocalFlags(TWindowData *dat) +int CTabBaseDlg::LoadLocalFlags() { - if (dat == NULL) - return NULL; - - int i = 0; - DWORD dwMask = M.GetDword(dat->hContact, "mwmask", 0); - DWORD dwLocal = M.GetDword(dat->hContact, "mwflags", 0); + DWORD dwMask = M.GetDword(m_hContact, "mwmask", 0); + DWORD dwLocal = M.GetDword(m_hContact, "mwflags", 0); DWORD dwGlobal = M.GetDword("mwflags", MWF_LOG_DEFAULT); - dat->dwFlags &= ~MWF_LOG_ALL; - if (dat->pContainer->theme.isPrivate) - dat->dwFlags |= (dat->pContainer->theme.dwFlags & MWF_LOG_ALL); + dwFlags &= ~MWF_LOG_ALL; + if (pContainer->theme.isPrivate) + dwFlags |= (pContainer->theme.dwFlags & MWF_LOG_ALL); else - dat->dwFlags |= (dwGlobal & MWF_LOG_ALL); - while (checkboxes[i].uId) { + dwFlags |= (dwGlobal & MWF_LOG_ALL); + + for (int i = 0; checkboxes[i].uId; i++) { DWORD maskval = checkboxes[i].uFlag; if (dwMask & maskval) - dat->dwFlags = (dwLocal & maskval) ? dat->dwFlags | maskval : dat->dwFlags & ~maskval; - i++; + dwFlags = (dwLocal & maskval) ? dwFlags | maskval : dwFlags & ~maskval; } - return(dat->dwFlags & MWF_LOG_ALL); + + return dwFlags & MWF_LOG_ALL; } ///////////////////////////////////////////////////////////////////////////////////////// @@ -344,9 +343,9 @@ static INT_PTR CALLBACK DlgProcUserPrefsLogOptions(HWND hwndDlg, UINT msg, WPARA HWND hwnd = M.FindWindow(hContact); DWORD *dwActionToTake = (DWORD *)lParam, dwMask = 0, dwFlags = 0, maskval; - TWindowData *dat = NULL; + CSrmmWindow *dat = NULL; if (hwnd) - dat = (TWindowData*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + dat = (CSrmmWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA); while (checkboxes[i].uId) { maskval = checkboxes[i].uFlag; @@ -477,11 +476,11 @@ INT_PTR CALLBACK DlgProcUserPrefsFrame(HWND hwndDlg, UINT msg, WPARAM wParam, LP SendMessage((HWND)tci.lParam, WM_COMMAND, WM_USER + 100, (LPARAM)&dwActionToTake); } if (hwnd) { - TWindowData *dat = (TWindowData*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + CSrmmWindow *dat = (CSrmmWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (dat) { DWORD dwOldFlags = (dat->dwFlags & MWF_LOG_ALL); SetDialogToType(hwnd); - LoadLocalFlags(dat); + dat->LoadLocalFlags(); if ((dat->dwFlags & MWF_LOG_ALL) != dwOldFlags) { bool fShouldHide = true; if (IsIconic(dat->pContainer->hwnd)) diff --git a/plugins/TabSRMM/src/utils.cpp b/plugins/TabSRMM/src/utils.cpp index 93fc88fd89..613b92207e 100644 --- a/plugins/TabSRMM/src/utils.cpp +++ b/plugins/TabSRMM/src/utils.cpp @@ -67,7 +67,7 @@ static wchar_t *formatting_strings_end[] = { L"b0 ", L"i0 ", L"u0 ", L"s0 ", // flags: loword = words only for simple * /_ formatting // hiword = bbcode support (strip bbcodes if 0) -const wchar_t* Utils::FormatRaw(TWindowData *dat, const wchar_t *msg, int flags, BOOL isSent) +const wchar_t* Utils::FormatRaw(CTabBaseDlg *dat, const wchar_t *msg, int flags, BOOL isSent) { bool clr_was_added = false, was_added; static tstring message(msg); @@ -213,7 +213,7 @@ ok: smbp.Protocolname = dat->cache->getActiveProto(); smbp.flag = SAFL_TCHAR | SAFL_PATH | (isSent ? SAFL_OUTGOING : 0); smbp.str = (wchar_t*)smcode.c_str(); - smbp.hContact = dat->hContact; + smbp.hContact = dat->m_hContact; SMADD_BATCHPARSERES *smbpr = (SMADD_BATCHPARSERES *)CallService(MS_SMILEYADD_BATCHPARSE, 0, (LPARAM)&smbp); if (smbpr) { CallService(MS_SMILEYADD_BATCHFREE, 0, (LPARAM)smbpr); @@ -241,7 +241,7 @@ static wchar_t* Trunc500(wchar_t *str) return str; } -bool Utils::FormatTitleBar(const TWindowData *dat, const wchar_t *szFormat, CMStringW &dest) +bool Utils::FormatTitleBar(const CTabBaseDlg *dat, const wchar_t *szFormat, CMStringW &dest) { if (dat == 0) return false; @@ -286,7 +286,7 @@ bool Utils::FormatTitleBar(const TWindowData *dat, const wchar_t *szFormat, CMSt { BYTE xStatus = dat->cache->getXStatusId(); if (dat->wStatus != ID_STATUS_OFFLINE && xStatus > 0 && xStatus <= 31) { - ptrW szXStatus(db_get_wsa(dat->hContact, dat->szProto, "XStatusName")); + ptrW szXStatus(db_get_wsa(dat->m_hContact, dat->szProto, "XStatusName")); dest.Append((szXStatus != NULL) ? Trunc500(szXStatus) : xStatusDescr[xStatus - 1]); } } @@ -296,7 +296,7 @@ bool Utils::FormatTitleBar(const TWindowData *dat, const wchar_t *szFormat, CMSt { BYTE xStatus = dat->cache->getXStatusId(); if (dat->wStatus != ID_STATUS_OFFLINE && xStatus > 0 && xStatus <= 31) { - ptrW szXStatus(db_get_wsa(dat->hContact, dat->szProto, "XStatusName")); + ptrW szXStatus(db_get_wsa(dat->m_hContact, dat->szProto, "XStatusName")); dest.Append((szXStatus != NULL) ? Trunc500(szXStatus) : xStatusDescr[xStatus - 1]); } else dest.Append(dat->szStatus[0] ? dat->szStatus : L"(undef)"); @@ -317,7 +317,7 @@ bool Utils::FormatTitleBar(const TWindowData *dat, const wchar_t *szFormat, CMSt case 'g': { - ptrW tszGroup(db_get_wsa(dat->hContact, "CList", "Group")); + ptrW tszGroup(db_get_wsa(dat->m_hContact, "CList", "Group")); if (tszGroup != NULL) dest.Append(tszGroup); } @@ -411,7 +411,7 @@ wchar_t* Utils::GetPreviewWithEllipsis(wchar_t *szText, size_t iMaxLen) // returns != 0 when one of the installed keyboard layouts belongs to an rtl language // used to find out whether we need to configure the message input box for bidirectional mode -int Utils::FindRTLLocale(TWindowData *dat) +int Utils::FindRTLLocale(CTabBaseDlg *dat) { HKL layouts[20]; int i, result = 0; @@ -621,12 +621,12 @@ void Utils::scaleAvatarHeightLimited(const HBITMAP hBm, double& dNewWidth, doubl // @param dat: _MessageWindowData* pointer to the window data // @return HICON: the icon handle -HICON Utils::iconFromAvatar(const TWindowData *dat) +HICON Utils::iconFromAvatar(const CTabBaseDlg *dat) { if (!ServiceExists(MS_AV_GETAVATARBITMAP) || dat == NULL) return 0; - AVATARCACHEENTRY *ace = (AVATARCACHEENTRY *)CallService(MS_AV_GETAVATARBITMAP, dat->hContact, 0); + AVATARCACHEENTRY *ace = (AVATARCACHEENTRY *)CallService(MS_AV_GETAVATARBITMAP, dat->m_hContact, 0); if (ace == NULL || ace->hbmPic == NULL) return NULL; @@ -724,7 +724,7 @@ void Utils::addMenuItem(const HMENU& m, MENUITEMINFO &mii, HICON hIcon, const wc // return != 0 when the sound effect must be played for the given // session. Uses container sound settings -int Utils::mustPlaySound(const TWindowData *dat) +int Utils::mustPlaySound(const CTabBaseDlg *dat) { if (!dat) return 0; @@ -736,7 +736,7 @@ int Utils::mustPlaySound(const TWindowData *dat) return 0; bool fActiveWindow = (dat->pContainer->hwnd == ::GetForegroundWindow() ? true : false); - bool fActiveTab = (dat->pContainer->hwndActive == dat->hwnd ? true : false); + bool fActiveTab = (dat->pContainer->hwndActive == dat->GetHwnd() ? true : false); bool fIconic = (::IsIconic(dat->pContainer->hwnd) ? true : false); // window minimized, check if sound has to be played @@ -844,22 +844,22 @@ wchar_t* Utils::extractURLFromRichEdit(const ENLINK* _e, const HWND hwndRich) // generic command dispatcher // used in various places (context menus, info panel menus etc.) -LRESULT Utils::CmdDispatcher(UINT uType, HWND hwndDlg, UINT cmd, WPARAM wParam, LPARAM lParam, TWindowData *dat, TContainerData *pContainer) +LRESULT Utils::CmdDispatcher(UINT uType, HWND hwndDlg, UINT cmd, WPARAM wParam, LPARAM lParam, CTabBaseDlg *dat, TContainerData *pContainer) { switch (uType) { case CMD_CONTAINER: if (pContainer && hwndDlg) - return(DM_ContainerCmdHandler(pContainer, cmd, wParam, lParam)); + return DM_ContainerCmdHandler(pContainer, cmd, wParam, lParam); break; case CMD_MSGDIALOG: if (pContainer && hwndDlg && dat) - return(DM_MsgWindowCmdHandler(hwndDlg, pContainer, dat, cmd, wParam, lParam)); + return DM_MsgWindowCmdHandler(hwndDlg, pContainer, dat, cmd, wParam, lParam); break; case CMD_INFOPANEL: - if (MsgWindowMenuHandler(dat, cmd, MENU_LOGMENU) == 0) - return(DM_MsgWindowCmdHandler(hwndDlg, pContainer, dat, cmd, wParam, lParam)); + if (dat->MsgWindowMenuHandler(cmd, MENU_LOGMENU) == 0) + return DM_MsgWindowCmdHandler(hwndDlg, pContainer, dat, cmd, wParam, lParam); break; } return 0; diff --git a/plugins/TabSRMM/src/utils.h b/plugins/TabSRMM/src/utils.h index 7d86004366..fbc9ba9930 100644 --- a/plugins/TabSRMM/src/utils.h +++ b/plugins/TabSRMM/src/utils.h @@ -52,11 +52,11 @@ public: CMD_INFOPANEL = 4, }; - static int FindRTLLocale(TWindowData *dat); + static int FindRTLLocale(CTabBaseDlg *dat); static wchar_t* GetPreviewWithEllipsis(wchar_t *szText, size_t iMaxLen); static wchar_t* FilterEventMarkers(wchar_t *wszText); - static LPCTSTR FormatRaw(TWindowData *dat, const wchar_t *msg, int flags, BOOL isSent); - static bool FormatTitleBar(const TWindowData *dat, const wchar_t *szFormat, CMStringW &dest); + static LPCTSTR FormatRaw(CTabBaseDlg *dat, const wchar_t *msg, int flags, BOOL isSent); + static bool FormatTitleBar(const CTabBaseDlg *dat, const wchar_t *szFormat, CMStringW &dest); static char* FilterEventMarkers(char *szText); static void DoubleAmpersands(wchar_t *pszText, size_t len); static void RTF_CTableInit(); @@ -69,13 +69,13 @@ public: static void SaveContainerSettings(TContainerData *pContainer, const char *szSetting); static DWORD CALLBACK StreamOut(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb); - static LRESULT CmdDispatcher(UINT uType, HWND hwndDlg, UINT cmd, WPARAM wParam, LPARAM lParam, TWindowData *dat = 0, TContainerData *pContainer = 0); + static LRESULT CmdDispatcher(UINT uType, HWND hwndDlg, UINT cmd, WPARAM wParam, LPARAM lParam, CTabBaseDlg *dat = 0, TContainerData *pContainer = 0); static void addMenuItem(const HMENU& m, MENUITEMINFO& mii, HICON hIcon, const wchar_t *szText, UINT uID, UINT pos); static void enableDlgControl(const HWND hwnd, UINT id, bool fEnable = true); static void showDlgControl(const HWND hwnd, UINT id, int showCmd); - static int mustPlaySound(const TWindowData *dat); - static HICON iconFromAvatar(const TWindowData *dat); + static int mustPlaySound(const CTabBaseDlg *dat); + static HICON iconFromAvatar(const CTabBaseDlg *dat); static void setAvatarContact(HWND hWnd, MCONTACT hContact); static void getIconSize(HICON hIcon, int& sizeX, int& sizeY); diff --git a/plugins/TabSRMM/src/version.h b/plugins/TabSRMM/src/version.h index e8b2f7baf8..d68b27d599 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 1 -#define __BUILD_NUM 2 +#define __MINOR_VERSION 5 +#define __RELEASE_NUM 0 +#define __BUILD_NUM 1 #include -- cgit v1.2.3