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/src/msgdialog.cpp | 2391 ++++++++++++++++++------------------- 1 file changed, 1154 insertions(+), 1237 deletions(-) (limited to 'plugins/TabSRMM/src/msgdialog.cpp') 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); } -- cgit v1.2.3