From bb1bd90072098e8b0e03909cd7a864ca51428aa0 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 3 Sep 2019 17:16:05 +0300 Subject: StdMsg: further merge --- src/core/stdmsg/src/chat_window.cpp | 89 ++----------------------- src/core/stdmsg/src/msgdialog.cpp | 129 ++++++++++++++++++++++++++++-------- src/core/stdmsg/src/msgs.h | 29 ++++---- 3 files changed, 125 insertions(+), 122 deletions(-) (limited to 'src/core/stdmsg') diff --git a/src/core/stdmsg/src/chat_window.cpp b/src/core/stdmsg/src/chat_window.cpp index 3f98522e12..569ff940ca 100644 --- a/src/core/stdmsg/src/chat_window.cpp +++ b/src/core/stdmsg/src/chat_window.cpp @@ -604,7 +604,7 @@ LRESULT CChatRoomDlg::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) if (wParam == '\n' || wParam == '\r') { if ((isCtrl && g_dat.bSendOnCtrlEnter) || (!isCtrl && g_dat.bSendOnEnter)) { - m_btnOk.OnClick(&m_btnOk); + m_btnOk.Click(); return 0; } if (g_dat.bSendOnDblEnter) { @@ -613,7 +613,7 @@ LRESULT CChatRoomDlg::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) else { m_message.SendMsg(WM_KEYDOWN, VK_BACK, 0); m_message.SendMsg(WM_KEYUP, VK_BACK, 0); - m_btnOk.OnClick(&m_btnOk); + m_btnOk.Click(); return 0; } } @@ -629,12 +629,11 @@ LRESULT CChatRoomDlg::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) case WM_KEYDOWN: { - static int start, end; bool isShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0; bool isCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0; bool isAlt = (GetKeyState(VK_MENU) & 0x8000) != 0; if (wParam == VK_RETURN) { - szTabSave[0] = '\0'; + m_szTabSave[0] = '\0'; if ((isCtrl && g_dat.bSendOnCtrlEnter) || (!isCtrl && g_dat.bSendOnEnter)) return 0; @@ -651,94 +650,20 @@ LRESULT CChatRoomDlg::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) } if (wParam == VK_TAB && !isCtrl && !isShift) { // tab-autocomplete - LRESULT lResult = (LRESULT)m_message.SendMsg(EM_GETSEL, 0, 0); - - m_message.SendMsg(WM_SETREDRAW, FALSE, 0); - start = LOWORD(lResult); - end = HIWORD(lResult); - m_message.SendMsg(EM_SETSEL, end, end); - - GETTEXTLENGTHEX gtl = {}; - gtl.flags = GTL_PRECISE; - gtl.codepage = CP_ACP; - int iLen = m_message.SendMsg(EM_GETTEXTLENGTHEX, (WPARAM)>l, 0); - if (iLen > 0) { - wchar_t *pszText = (wchar_t *)mir_alloc(sizeof(wchar_t)*(iLen + 100)); - - GETTEXTEX gt = {}; - gt.cb = iLen + 99; - gt.flags = GT_DEFAULT; - gt.codepage = 1200; - m_message.SendMsg(EM_GETTEXTEX, (WPARAM)>, (LPARAM)pszText); - - while (start > 0 && pszText[start - 1] != ' ' && pszText[start - 1] != 13 && pszText[start - 1] != VK_TAB) - start--; - while (end < iLen && pszText[end] != ' ' && pszText[end] != 13 && pszText[end - 1] != VK_TAB) - end++; - - if (szTabSave[0] == '\0') - mir_wstrncpy(szTabSave, pszText + start, end - start + 1); - - wchar_t *pszSelName = (wchar_t *)mir_alloc(sizeof(wchar_t)*(end - start + 1)); - mir_wstrncpy(pszSelName, pszText + start, end - start + 1); - - wchar_t *pszName = g_chatApi.UM_FindUserAutoComplete(m_si, szTabSave, pszSelName); - if (pszName == nullptr) { - pszName = szTabSave; - m_message.SendMsg(EM_SETSEL, start, end); - if (end != start) - m_message.SendMsg(EM_REPLACESEL, FALSE, (LPARAM)pszName); - szTabSave[0] = '\0'; - } - else { - m_message.SendMsg(EM_SETSEL, start, end); - if (end != start) - m_message.SendMsg(EM_REPLACESEL, FALSE, (LPARAM)pszName); - } - mir_free(pszText); - mir_free(pszSelName); - } - - m_message.SendMsg(WM_SETREDRAW, TRUE, 0); - RedrawWindow(m_message.GetHwnd(), nullptr, nullptr, RDW_INVALIDATE); + TabAutoComplete(); return 0; } - if (szTabSave[0] != '\0' && wParam != VK_RIGHT && wParam != VK_LEFT && wParam != VK_SPACE && wParam != VK_RETURN && wParam != VK_BACK && wParam != VK_DELETE) { - if (g_Settings.bAddColonToAutoComplete && start == 0) + if (m_szTabSave[0] != '\0' && wParam != VK_RIGHT && wParam != VK_LEFT && wParam != VK_SPACE && wParam != VK_RETURN && wParam != VK_BACK && wParam != VK_DELETE) { + if (g_Settings.bAddColonToAutoComplete && m_iTabStart == 0) SendMessageA(m_message.GetHwnd(), EM_REPLACESEL, FALSE, (LPARAM) ": "); - szTabSave[0] = '\0'; + m_szTabSave[0] = '\0'; } if (ProcessHotkeys(wParam, isShift, isCtrl, isAlt)) return TRUE; - if (wParam == 0x46 && isCtrl && !isAlt) { // ctrl-f (toggle filter) - onClick_Filter(&m_btnFilter); - return TRUE; - } - - if (wParam == 0x4e && isCtrl && !isAlt) { // ctrl-n (nicklist) - onClick_NickList(&m_btnNickList); - return TRUE; - } - - if (wParam == 0x4f && isCtrl && !isAlt) { // ctrl-o (options) - onClick_ChanMgr(&m_btnChannelMgr); - return TRUE; - } - - if ((wParam == 45 && isShift || wParam == 0x56 && isCtrl) && !isAlt) { // ctrl-v (paste clean text) - m_message.SendMsg(EM_PASTESPECIAL, CF_TEXT, 0); - return TRUE; - } - - if (wParam == 0x57 && isCtrl && !isAlt) { // ctrl-w (close window) - CloseTab(); - return TRUE; - } - if (wParam == VK_NEXT || wParam == VK_PRIOR) { m_log.SendMsg(msg, wParam, lParam); m_iLastEnterTime = 0; diff --git a/src/core/stdmsg/src/msgdialog.cpp b/src/core/stdmsg/src/msgdialog.cpp index c2e461f57f..bfd017866c 100644 --- a/src/core/stdmsg/src/msgdialog.cpp +++ b/src/core/stdmsg/src/msgdialog.cpp @@ -73,8 +73,10 @@ CMsgDialog::CMsgDialog(CTabbedWindow *pOwner, int iDialogId, SESSION_INFO *si) : m_avatar(this, IDC_AVATAR), m_splitterX(this, IDC_SPLITTERX), m_splitterY(this, IDC_SPLITTERY), + m_cmdList(20), m_pOwner(pOwner) { + m_szTabSave[0] = 0; m_autoClose = 0; m_forceResizable = true; @@ -132,6 +134,19 @@ INT_PTR CMsgDialog::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) return CSuper::DlgProc(uMsg, wParam, lParam); } +LRESULT CMsgDialog::WndProc_Log(UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (msg == WM_KEYDOWN) { + bool isShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0; + bool isCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0; + bool isAlt = (GetKeyState(VK_MENU) & 0x8000) != 0; + if (ProcessHotkeys(wParam, isShift, isCtrl, isAlt)) + return FALSE; + } + + return CSuper::WndProc_Log(msg, wParam, lParam); +} + LRESULT CMsgDialog::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) { if (msg == WM_KEYDOWN) { @@ -139,29 +154,54 @@ LRESULT CMsgDialog::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) bool isCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0; bool isAlt = (GetKeyState(VK_MENU) & 0x8000) != 0; - if (wParam <= '9' && wParam >= '1' && isCtrl && !isAlt) // CTRL + 1 -> 9 (switch tab) - if (g_Settings.bTabsEnable) { + if (g_Settings.bTabsEnable) { + if (wParam <= '9' && wParam >= '1' && isCtrl && !isAlt) { // CTRL + 1 -> 9 (switch tab) m_pOwner->SwitchTab(wParam - '1'); return TRUE; } - if (wParam <= VK_NUMPAD9 && wParam >= VK_NUMPAD1 && isCtrl && !isAlt) // CTRL + 1 -> 9 (switch tab) - if (g_Settings.bTabsEnable) { + if (wParam <= VK_NUMPAD9 && wParam >= VK_NUMPAD1 && isCtrl && !isAlt) { // CTRL + 1 -> 9 (switch tab) m_pOwner->SwitchTab(wParam - VK_NUMPAD1); return TRUE; } - if (wParam == VK_TAB && isCtrl && !isShift) // CTRL-TAB (switch tab/window) - if (g_Settings.bTabsEnable) { + if (wParam == VK_TAB && isCtrl && !isShift) { // CTRL-TAB (switch tab/window) m_pOwner->SwitchNextTab(); return TRUE; } - if (wParam == VK_TAB && isCtrl && isShift) // CTRL_SHIFT-TAB (switch tab/window) - if (g_Settings.bTabsEnable) { + if (wParam == VK_TAB && isCtrl && isShift) { // CTRL_SHIFT-TAB (switch tab/window) m_pOwner->SwitchPrevTab(); return TRUE; } + + if (wParam == 0x57 && isCtrl && !isAlt) { // ctrl-w (close window) + CloseTab(); + return TRUE; + } + } + + if (isChat()) { + if (wParam == 0x46 && isCtrl && !isAlt) { // ctrl-f (toggle filter) + m_btnFilter.Click(); + return TRUE; + } + + if (wParam == 0x4e && isCtrl && !isAlt) { // ctrl-n (nicklist) + m_btnNickList.Click(); + return TRUE; + } + + if (wParam == 0x4f && isCtrl && !isAlt) { // ctrl-o (options) + m_btnChannelMgr.Click(); + return TRUE; + } + + if ((wParam == 45 && isShift || wParam == 0x56 && isCtrl) && !isAlt) { // ctrl-v (paste clean text) + m_message.SendMsg(EM_PASTESPECIAL, CF_TEXT, 0); + return TRUE; + } + } } return CSuper::WndProc_Message(msg, wParam, lParam); @@ -216,11 +256,64 @@ void CMsgDialog::StopFlash() } } +void CMsgDialog::TabAutoComplete() +{ + LRESULT lResult = (LRESULT)m_message.SendMsg(EM_GETSEL, 0, 0); + + m_message.SendMsg(WM_SETREDRAW, FALSE, 0); + m_iTabStart = LOWORD(lResult); + int end = HIWORD(lResult); + m_message.SendMsg(EM_SETSEL, end, end); + + GETTEXTLENGTHEX gtl = {}; + gtl.flags = GTL_PRECISE; + gtl.codepage = CP_ACP; + int iLen = m_message.SendMsg(EM_GETTEXTLENGTHEX, (WPARAM)& gtl, 0); + if (iLen > 0) { + wchar_t *pszText = (wchar_t *)mir_alloc(sizeof(wchar_t) * (iLen + 100)); + + GETTEXTEX gt = {}; + gt.cb = iLen + 99; + gt.flags = GT_DEFAULT; + gt.codepage = 1200; + m_message.SendMsg(EM_GETTEXTEX, (WPARAM)& gt, (LPARAM)pszText); + + while (m_iTabStart > 0 && pszText[m_iTabStart - 1] != ' ' && pszText[m_iTabStart - 1] != 13 && pszText[m_iTabStart - 1] != VK_TAB) + m_iTabStart--; + while (end < iLen && pszText[end] != ' ' && pszText[end] != 13 && pszText[end - 1] != VK_TAB) + end++; + + if (m_szTabSave[0] == '\0') + mir_wstrncpy(m_szTabSave, pszText + m_iTabStart, end - m_iTabStart + 1); + + wchar_t *pszSelName = (wchar_t *)mir_alloc(sizeof(wchar_t) * (end - m_iTabStart + 1)); + mir_wstrncpy(pszSelName, pszText + m_iTabStart, end - m_iTabStart + 1); + + wchar_t *pszName = g_chatApi.UM_FindUserAutoComplete(m_si, m_szTabSave, pszSelName); + if (pszName == nullptr) { + pszName = m_szTabSave; + m_message.SendMsg(EM_SETSEL, m_iTabStart, end); + if (end != m_iTabStart) + m_message.SendMsg(EM_REPLACESEL, FALSE, (LPARAM)pszName); + m_szTabSave[0] = '\0'; + } + else { + m_message.SendMsg(EM_SETSEL, m_iTabStart, end); + if (end != m_iTabStart) + m_message.SendMsg(EM_REPLACESEL, FALSE, (LPARAM)pszName); + } + mir_free(pszText); + mir_free(pszSelName); + } + + m_message.SendMsg(WM_SETREDRAW, TRUE, 0); + RedrawWindow(m_message.GetHwnd(), nullptr, nullptr, RDW_INVALIDATE); +} + ///////////////////////////////////////////////////////////////////////////////////////// CSrmmWindow::CSrmmWindow(CTabbedWindow *pOwner, MCONTACT hContact) : CSuper(pOwner, IDD_MSG), - m_cmdList(20), m_bNoActivate(g_dat.bDoNotStealFocus) { m_hContact = hContact; @@ -863,19 +956,6 @@ int CSrmmWindow::Resizer(UTILRESIZECONTROL *urc) ///////////////////////////////////////////////////////////////////////////////////////// -LRESULT CSrmmWindow::WndProc_Log(UINT msg, WPARAM wParam, LPARAM lParam) -{ - if (msg == WM_KEYDOWN) { - bool isShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0; - bool isCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0; - bool isAlt = (GetKeyState(VK_MENU) & 0x8000) != 0; - if (ProcessHotkeys(wParam, isShift, isCtrl, isAlt)) - return FALSE; - } - - return CSuper::WndProc_Log(msg, wParam, lParam); -} - LRESULT CSrmmWindow::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) { bool isShift, isCtrl, isAlt; @@ -893,11 +973,6 @@ LRESULT CSrmmWindow::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) m_message.SendMsg(EM_SETSEL, 0, -1); return 0; } - - if (wParam == 23 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-w - CloseTab(); - return 0; - } break; case WM_KEYDOWN: diff --git a/src/core/stdmsg/src/msgs.h b/src/core/stdmsg/src/msgs.h index 426cd76934..7c8e8252e7 100644 --- a/src/core/stdmsg/src/msgs.h +++ b/src/core/stdmsg/src/msgs.h @@ -40,12 +40,26 @@ class CMsgDialog : public CSrmmBaseDialog protected: CCtrlBase m_avatar; CCtrlButton m_btnOk; - CSplitter m_splitterX, m_splitterY; CTabbedWindow *m_pOwner; DWORD m_nFlash = 0; char *m_szProto = nullptr; + // splitters + CSplitter m_splitterX, m_splitterY; + int m_iSplitterX, m_iSplitterY; + SIZE m_minEditBoxSize; + RECT m_minEditInit; + + // tab autocomplete + int m_iTabStart = 0; + wchar_t m_szTabSave[20]; + void TabAutoComplete(); + + // entered messages + int m_cmdListInd = 0; + LIST m_cmdList; + CMsgDialog(CTabbedWindow *pOwner, int idDialog, SESSION_INFO *si = nullptr); virtual int GetStatus() const PURE; @@ -56,6 +70,7 @@ protected: void OnDestroy() override; INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) override; + LRESULT WndProc_Log(UINT msg, WPARAM wParam, LPARAM lParam) override; LRESULT WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) override; public: @@ -81,7 +96,6 @@ class CSrmmWindow : public CMsgDialog { typedef CMsgDialog CSuper; - LRESULT WndProc_Log(UINT msg, WPARAM wParam, LPARAM lParam) override; LRESULT WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) override; void NotifyTyping(int mode); @@ -96,9 +110,6 @@ class CSrmmWindow : public CMsgDialog HFONT m_hFont = nullptr; - SIZE m_minEditBoxSize; - RECT m_minEditInit; - int m_windowWasCascaded; int m_nTypeSecs, m_nTypeMode; int m_limitAvatarH; @@ -114,10 +125,6 @@ public: MEVENT m_hDbEventFirst, m_hDbEventLast; int m_avatarWidth, m_avatarHeight; - int m_iSplitterY; - - int m_cmdListInd; - LIST m_cmdList; HBITMAP m_avatarPic; wchar_t *m_wszInitialText; @@ -169,10 +176,6 @@ class CChatRoomDlg : public CMsgDialog LRESULT WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) override; LRESULT WndProc_Nicklist(UINT msg, WPARAM wParam, LPARAM lParam) override; - wchar_t szTabSave[20]; - - int m_iSplitterX, m_iSplitterY; - public: CChatRoomDlg(CTabbedWindow*, SESSION_INFO*); -- cgit v1.2.3