From 7a6399d054da0e2e21d00b110b885e15b278d3b7 Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Sun, 24 Jun 2012 12:33:14 +0000 Subject: Chat: renamed to .cpp git-svn-id: http://svn.miranda-ng.org/main/trunk@601 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Chat/window.cpp | 2731 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2731 insertions(+) create mode 100644 plugins/Chat/window.cpp (limited to 'plugins/Chat/window.cpp') diff --git a/plugins/Chat/window.cpp b/plugins/Chat/window.cpp new file mode 100644 index 0000000000..f59df07a30 --- /dev/null +++ b/plugins/Chat/window.cpp @@ -0,0 +1,2731 @@ +/* +Chat module plugin for Miranda IM + +Copyright 2000-2010 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "chat.h" + +extern HBRUSH hEditBkgBrush; +extern HBRUSH hListBkgBrush; +extern HBRUSH hListSelectedBkgBrush; +extern HANDLE hSendEvent; +extern HINSTANCE g_hInst; +extern HICON hIcons[30]; +extern struct CREOleCallback reOleCallback; +extern HIMAGELIST hImageList; +extern HMENU g_hMenu; +extern BOOL SmileyAddInstalled; +extern TABLIST * g_TabList; +extern HIMAGELIST hIconsList; + +static WNDPROC OldSplitterProc; +static WNDPROC OldMessageProc; +static WNDPROC OldNicklistProc; +static WNDPROC OldTabProc; +static WNDPROC OldFilterButtonProc; +static WNDPROC OldLogProc; +static HKL hkl = NULL; + +typedef struct +{ + time_t lastEnterTime; + TCHAR szTabSave[20]; +} MESSAGESUBDATA; + + +static LRESULT CALLBACK SplitterSubclassProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) +{ + switch(msg) { + case WM_NCHITTEST: + return HTCLIENT; + + case WM_SETCURSOR: + { RECT rc; + GetClientRect(hwnd,&rc); + SetCursor(rc.right>rc.bottom?LoadCursor(NULL, IDC_SIZENS):LoadCursor(NULL, IDC_SIZEWE)); + return TRUE; + } + case WM_LBUTTONDOWN: + SetCapture(hwnd); + return 0; + + case WM_MOUSEMOVE: + if (GetCapture()==hwnd) { + RECT rc; + GetClientRect(hwnd,&rc); + SendMessage(GetParent(hwnd),GC_SPLITTERMOVED,rc.right>rc.bottom?(short)HIWORD(GetMessagePos())+rc.bottom/2:(short)LOWORD(GetMessagePos())+rc.right/2,(LPARAM)hwnd); + } + return 0; + + case WM_LBUTTONUP: + ReleaseCapture(); + PostMessage(GetParent(hwnd),WM_SIZE, 0, 0); + return 0; + } + return CallWindowProc(OldSplitterProc,hwnd,msg,wParam,lParam); +} + +static void InitButtons(HWND hwndDlg, SESSION_INFO* si) +{ + MODULEINFO * pInfo = MM_FindModule(si->pszModule); + + SendDlgItemMessage( hwndDlg, IDC_SMILEY, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( "smiley", FALSE )); + SendDlgItemMessage( hwndDlg, IDC_BOLD, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( "bold", FALSE )); + SendDlgItemMessage( hwndDlg, IDC_ITALICS, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( "italics", FALSE )); + SendDlgItemMessage( hwndDlg, IDC_UNDERLINE, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( "underline", FALSE )); + SendDlgItemMessage( hwndDlg, IDC_COLOR, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( "fgcol", FALSE )); + SendDlgItemMessage( hwndDlg, IDC_BKGCOLOR, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( "bkgcol", FALSE )); + SendDlgItemMessage( hwndDlg, IDC_HISTORY, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( "history", FALSE )); + SendDlgItemMessage( hwndDlg, IDC_CHANMGR, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( "settings", FALSE )); + SendDlgItemMessage( hwndDlg, IDC_CLOSE, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( "close", FALSE )); + SendDlgItemMessage( hwndDlg, IDC_SHOWNICKLIST, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( si->bNicklistEnabled ? "nicklist" : "nicklist2", FALSE )); + SendDlgItemMessage( hwndDlg, IDC_FILTER, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx( si->bFilterEnabled ? "filter" : "filter2", FALSE )); + + SendDlgItemMessage( hwndDlg, IDC_SMILEY, BUTTONSETASFLATBTN, TRUE, 0 ); + SendDlgItemMessage( hwndDlg, IDC_BOLD, BUTTONSETASFLATBTN, TRUE, 0 ); + SendDlgItemMessage( hwndDlg, IDC_ITALICS, BUTTONSETASFLATBTN, TRUE, 0 ); + SendDlgItemMessage( hwndDlg, IDC_UNDERLINE, BUTTONSETASFLATBTN, TRUE, 0 ); + SendDlgItemMessage( hwndDlg, IDC_BKGCOLOR, BUTTONSETASFLATBTN, TRUE, 0 ); + SendDlgItemMessage( hwndDlg, IDC_COLOR, BUTTONSETASFLATBTN, TRUE, 0 ); + SendDlgItemMessage( hwndDlg, IDC_HISTORY, BUTTONSETASFLATBTN, TRUE, 0 ); + SendDlgItemMessage( hwndDlg, IDC_SHOWNICKLIST, BUTTONSETASFLATBTN, TRUE, 0 ); + SendDlgItemMessage( hwndDlg, IDC_CHANMGR, BUTTONSETASFLATBTN, TRUE, 0 ); + SendDlgItemMessage( hwndDlg, IDC_FILTER, BUTTONSETASFLATBTN, TRUE, 0 ); + SendDlgItemMessage( hwndDlg, IDC_CLOSE, BUTTONSETASFLATBTN, TRUE, 0 ); + + SendMessage(GetDlgItem(hwndDlg,IDC_SMILEY), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Insert a smiley"), 0); + SendMessage(GetDlgItem(hwndDlg,IDC_BOLD), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Make the text bold (CTRL+B)"), 0); + SendMessage(GetDlgItem(hwndDlg,IDC_ITALICS), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Make the text italicized (CTRL+I)"), 0); + SendMessage(GetDlgItem(hwndDlg,IDC_UNDERLINE), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Make the text underlined (CTRL+U)"), 0); + SendMessage(GetDlgItem(hwndDlg,IDC_BKGCOLOR), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Select a background color for the text (CTRL+L)"), 0); + SendMessage(GetDlgItem(hwndDlg,IDC_COLOR), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Select a foreground color for the text (CTRL+K)"), 0); + SendMessage(GetDlgItem(hwndDlg,IDC_HISTORY), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Show the history (CTRL+H)"), 0); + SendMessage(GetDlgItem(hwndDlg,IDC_SHOWNICKLIST), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Show/hide the nicklist (CTRL+N)"), 0); + SendMessage(GetDlgItem(hwndDlg,IDC_CHANMGR), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Control this room (CTRL+O)"), 0); + SendMessage(GetDlgItem(hwndDlg,IDC_FILTER), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Enable/disable the event filter (CTRL+F)"), 0); + SendMessage(GetDlgItem(hwndDlg,IDC_CLOSE), BUTTONADDTOOLTIP, (WPARAM)LPGEN("Close current tab (CTRL+F4)"), 0); + SendDlgItemMessage(hwndDlg, IDC_BOLD, BUTTONSETASPUSHBTN, TRUE, 0); + SendDlgItemMessage(hwndDlg, IDC_ITALICS, BUTTONSETASPUSHBTN, TRUE, 0); + SendDlgItemMessage(hwndDlg, IDC_UNDERLINE, BUTTONSETASPUSHBTN, TRUE, 0); + SendDlgItemMessage(hwndDlg, IDC_COLOR, BUTTONSETASPUSHBTN, TRUE, 0); + SendDlgItemMessage(hwndDlg, IDC_BKGCOLOR, BUTTONSETASPUSHBTN, TRUE, 0); + + if (pInfo) { + EnableWindow(GetDlgItem(hwndDlg, IDC_BOLD), pInfo->bBold); + EnableWindow(GetDlgItem(hwndDlg, IDC_ITALICS), pInfo->bItalics); + EnableWindow(GetDlgItem(hwndDlg, IDC_UNDERLINE), pInfo->bUnderline); + EnableWindow(GetDlgItem(hwndDlg, IDC_COLOR), pInfo->bColor); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKGCOLOR), pInfo->bBkgColor); + if (si->iType == GCW_CHATROOM) + EnableWindow(GetDlgItem(hwndDlg, IDC_CHANMGR), pInfo->bChanMgr); +} } + +static int RoomWndResize(HWND hwndDlg,LPARAM lParam,UTILRESIZECONTROL *urc) +{ + RECT rc, rcTabs; + SESSION_INFO* si = (SESSION_INFO*)lParam; + int TabHeight; + BOOL bControl = (BOOL)DBGetContactSettingByte(NULL, "Chat", "ShowTopButtons", 1); + BOOL bFormat = (BOOL)DBGetContactSettingByte(NULL, "Chat", "ShowFormatButtons", 1); + BOOL bToolbar = bFormat || bControl; + BOOL bSend = (BOOL)DBGetContactSettingByte(NULL, "Chat", "ShowSend", 0); + BOOL bNick = si->iType!=GCW_SERVER && si->bNicklistEnabled; + BOOL bTabs = g_Settings.TabsEnable; + BOOL bTabBottom = g_Settings.TabsAtBottom; + + GetClientRect(GetDlgItem(hwndDlg, IDC_TAB), &rcTabs); + TabHeight = rcTabs.bottom - rcTabs.top; + TabCtrl_AdjustRect(GetDlgItem(hwndDlg, IDC_TAB), FALSE, &rcTabs); + TabHeight -= (rcTabs.bottom - rcTabs.top); + ShowWindow(GetDlgItem(hwndDlg, IDC_SMILEY), SmileyAddInstalled&&bFormat?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_BOLD), bFormat?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_UNDERLINE), bFormat?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_ITALICS), bFormat?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_COLOR), bFormat?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_BKGCOLOR), bFormat?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_HISTORY), bControl?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_SHOWNICKLIST), bControl?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_FILTER), bControl?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_CHANMGR), bControl?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDOK), bSend?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_SPLITTERX), bNick?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_CLOSE), g_Settings.TabsEnable?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_TAB), g_Settings.TabsEnable?SW_SHOW:SW_HIDE); + if (si->iType != GCW_SERVER) + ShowWindow(GetDlgItem(hwndDlg, IDC_LIST), si->bNicklistEnabled?SW_SHOW:SW_HIDE); + else + ShowWindow(GetDlgItem(hwndDlg, IDC_LIST), SW_HIDE); + + if (si->iType == GCW_SERVER) { + EnableWindow(GetDlgItem(hwndDlg, IDC_SHOWNICKLIST), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_CHANMGR), FALSE); + } + else { + EnableWindow(GetDlgItem(hwndDlg, IDC_SHOWNICKLIST), TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER), TRUE); + if (si->iType == GCW_CHATROOM) + EnableWindow(GetDlgItem(hwndDlg, IDC_CHANMGR), MM_FindModule(si->pszModule)->bChanMgr); + } + + switch(urc->wId) { + case IDOK: + GetWindowRect(si->hwndStatus, &rc); + urc->rcItem.left = bSend?315:urc->dlgNewSize.cx ; + urc->rcItem.top = urc->dlgNewSize.cy - si->iSplitterY+23; + urc->rcItem.bottom = urc->dlgNewSize.cy - (rc.bottom-rc.top)-1; + return RD_ANCHORX_RIGHT|RD_ANCHORY_CUSTOM; + + case IDC_TAB: + urc->rcItem.top = 1; + urc->rcItem.left = 0; + urc->rcItem.right = urc->dlgNewSize.cx- 24; + urc->rcItem.bottom = bToolbar?(urc->dlgNewSize.cy - si->iSplitterY):(urc->dlgNewSize.cy - si->iSplitterY+20); + return RD_ANCHORX_CUSTOM|RD_ANCHORY_CUSTOM; + + case IDC_LOG: + urc->rcItem.top = bTabs?(bTabBottom?0:rcTabs.top-1):0; + urc->rcItem.left = 0; + urc->rcItem.right = bNick?urc->dlgNewSize.cx - si->iSplitterX:urc->dlgNewSize.cx; + urc->rcItem.bottom = bToolbar?(bTabs&&bTabBottom?urc->dlgNewSize.cy - si->iSplitterY-TabHeight + 6:urc->dlgNewSize.cy - si->iSplitterY):(bTabs&&bTabBottom?urc->dlgNewSize.cy - si->iSplitterY-TabHeight+26:urc->dlgNewSize.cy - si->iSplitterY+20); + return RD_ANCHORX_CUSTOM|RD_ANCHORY_CUSTOM; + + case IDC_LIST: + urc->rcItem.top = bTabs?(bTabBottom?0:rcTabs.top-1):0; + urc->rcItem.right = urc->dlgNewSize.cx ; + urc->rcItem.left = urc->dlgNewSize.cx - si->iSplitterX + 2; + urc->rcItem.bottom = bToolbar?(bTabs&&bTabBottom?urc->dlgNewSize.cy - si->iSplitterY-TabHeight + 6:urc->dlgNewSize.cy - si->iSplitterY):(bTabs&&bTabBottom?urc->dlgNewSize.cy - si->iSplitterY-TabHeight+26:urc->dlgNewSize.cy - si->iSplitterY+20); + return RD_ANCHORX_CUSTOM|RD_ANCHORY_CUSTOM; + + case IDC_SPLITTERX: + urc->rcItem.right = urc->dlgNewSize.cx - si->iSplitterX+2; + urc->rcItem.left = urc->dlgNewSize.cx - si->iSplitterX; + urc->rcItem.bottom = bToolbar?(bTabs&&bTabBottom?urc->dlgNewSize.cy - si->iSplitterY-TabHeight + 6:urc->dlgNewSize.cy - si->iSplitterY):(bTabs&&bTabBottom?urc->dlgNewSize.cy - si->iSplitterY-TabHeight+26:urc->dlgNewSize.cy - si->iSplitterY+20); + urc->rcItem.top = bTabs ?rcTabs.top:1; + return RD_ANCHORX_CUSTOM|RD_ANCHORY_CUSTOM; + + case IDC_SPLITTERY: + urc->rcItem.top = bToolbar?urc->dlgNewSize.cy - si->iSplitterY:urc->dlgNewSize.cy - si->iSplitterY+20; + urc->rcItem.bottom = bToolbar?(urc->dlgNewSize.cy - si->iSplitterY+2):(urc->dlgNewSize.cy - si->iSplitterY+22); + return RD_ANCHORX_WIDTH|RD_ANCHORY_CUSTOM; + + case IDC_MESSAGE: + GetWindowRect(si->hwndStatus, &rc); + urc->rcItem.right = bSend?urc->dlgNewSize.cx - 64:urc->dlgNewSize.cx ; + urc->rcItem.top = urc->dlgNewSize.cy - si->iSplitterY+22; + urc->rcItem.bottom = urc->dlgNewSize.cy - (rc.bottom-rc.top)-1 ; + return RD_ANCHORX_LEFT|RD_ANCHORY_CUSTOM; + + case IDC_SMILEY: + case IDC_ITALICS: + case IDC_BOLD: + case IDC_UNDERLINE: + case IDC_COLOR: + case IDC_BKGCOLOR: + urc->rcItem.top = urc->dlgNewSize.cy - si->iSplitterY+3; + urc->rcItem.bottom = urc->dlgNewSize.cy - si->iSplitterY+19; + return RD_ANCHORX_LEFT|RD_ANCHORY_CUSTOM; + + case IDC_HISTORY: + case IDC_CHANMGR: + case IDC_SHOWNICKLIST: + case IDC_FILTER: + urc->rcItem.top = urc->dlgNewSize.cy - si->iSplitterY+3; + urc->rcItem.bottom = urc->dlgNewSize.cy - si->iSplitterY+19; + return RD_ANCHORX_RIGHT|RD_ANCHORY_CUSTOM; + + case IDC_CLOSE: + urc->rcItem.right = urc->dlgNewSize.cx-3; + urc->rcItem.left = urc->dlgNewSize.cx - 19; + urc->rcItem.bottom = bTabBottom?(bToolbar?urc->dlgNewSize.cy - si->iSplitterY-2:urc->dlgNewSize.cy - si->iSplitterY-2+20):19; + urc->rcItem.top = bTabBottom?(bToolbar?urc->dlgNewSize.cy - si->iSplitterY-18:urc->dlgNewSize.cy - si->iSplitterY-18+20):3; + return RD_ANCHORX_CUSTOM|RD_ANCHORY_CUSTOM; + } + return RD_ANCHORX_LEFT|RD_ANCHORY_TOP; +} + +static LRESULT CALLBACK MessageSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + MESSAGESUBDATA *dat; + SESSION_INFO* Parentsi; + + Parentsi=(SESSION_INFO*)GetWindowLongPtr(GetParent(hwnd),GWLP_USERDATA); + dat = (MESSAGESUBDATA *) GetWindowLongPtr(hwnd, GWLP_USERDATA); + switch (msg) { + case EM_SUBCLASSED: + dat = (MESSAGESUBDATA *) mir_alloc(sizeof(MESSAGESUBDATA)); + + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) dat); + dat->szTabSave[0] = '\0'; + dat->lastEnterTime = 0; + return 0; + + case WM_MOUSEWHEEL: + SendMessage(GetDlgItem(GetParent(hwnd), IDC_LOG), WM_MOUSEWHEEL, wParam, lParam); + dat->lastEnterTime = 0; + return TRUE; + + case EM_REPLACESEL: + PostMessage(hwnd, EM_ACTIVATE, 0, 0); + break; + + case EM_ACTIVATE: + SetActiveWindow(GetParent(hwnd)); + break; + + case WM_CHAR: + { + BOOL isShift = GetKeyState(VK_SHIFT) & 0x8000; + BOOL isCtrl = GetKeyState(VK_CONTROL) & 0x8000; + BOOL isAlt = GetKeyState(VK_MENU) & 0x8000; + + if (GetWindowLongPtr(hwnd, GWL_STYLE) & ES_READONLY) + break; + + if (wParam == 9 && isCtrl && !isAlt) // ctrl-i (italics) + return TRUE; + + if (wParam == VK_SPACE && isCtrl && !isAlt) // ctrl-space (paste clean text) + return TRUE; + + if (wParam == '\n' || wParam == '\r') { + if ((isCtrl != 0) ^ (0 != DBGetContactSettingByte(NULL, "Chat", "SendOnEnter", 1))) { + PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0); + return 0; + } + if (DBGetContactSettingByte(NULL, "Chat", "SendOnDblEnter", 0)) { + if (dat->lastEnterTime + 2 < time(NULL)) + dat->lastEnterTime = time(NULL); + else { + SendMessage(hwnd, WM_KEYDOWN, VK_BACK, 0); + SendMessage(hwnd, WM_KEYUP, VK_BACK, 0); + PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0); + return 0; + } + } + } + else + dat->lastEnterTime = 0; + + if (wParam == 1 && isCtrl && !isAlt) { //ctrl-a + SendMessage(hwnd, EM_SETSEL, 0, -1); + return 0; + } } + break; + + case WM_KEYDOWN: + { + static int start, end; + BOOL isShift = GetKeyState(VK_SHIFT) & 0x8000; + BOOL isCtrl = GetKeyState(VK_CONTROL) & 0x8000; + BOOL isAlt = GetKeyState(VK_MENU) & 0x8000; + if (wParam == VK_RETURN) { + dat->szTabSave[0] = '\0'; + if ((isCtrl != 0) ^ (0 != DBGetContactSettingByte(NULL, "Chat", "SendOnEnter", 1))) + return 0; + + if (DBGetContactSettingByte(NULL, "Chat", "SendOnDblEnter", 0)) + if (dat->lastEnterTime + 2 >= time(NULL)) + return 0; + + break; + } + + if (wParam == VK_TAB && isShift && !isCtrl) { // SHIFT-TAB (go to nick list) + SetFocus(GetDlgItem(GetParent(hwnd), IDC_LIST)); + return TRUE; + } + + if (wParam == VK_TAB && isCtrl && !isShift) { // CTRL-TAB (switch tab/window) + if (g_Settings.TabsEnable) + SendMessage(GetParent(hwnd), GC_SWITCHNEXTTAB, 0, 0); + else + ShowRoom(SM_GetNextWindow(Parentsi), WINDOW_VISIBLE, TRUE); + return TRUE; + } + + if (wParam == VK_TAB && isCtrl && isShift) { // CTRL_SHIFT-TAB (switch tab/window) + if (g_Settings.TabsEnable) + SendMessage(GetParent(hwnd), GC_SWITCHPREVTAB, 0, 0); + else + ShowRoom(SM_GetPrevWindow(Parentsi), WINDOW_VISIBLE, TRUE); + return TRUE; + } + + if (wParam <= '9' && wParam >= '1' && isCtrl && !isAlt) { // CTRL + 1 -> 9 (switch tab) + if (g_Settings.TabsEnable) + SendMessage(GetParent(hwnd), GC_SWITCHTAB, 0, (LPARAM)((int)wParam - (int)'1')); + } + + if (wParam <= VK_NUMPAD9 && wParam >= VK_NUMPAD1 && isCtrl && !isAlt) // CTRL + 1 -> 9 (switch tab) + if (g_Settings.TabsEnable) + SendMessage(GetParent(hwnd), GC_SWITCHTAB, 0, (LPARAM)((int)wParam - (int)VK_NUMPAD1)); + + if (wParam == VK_TAB && !isCtrl && !isShift) { //tab-autocomplete + TCHAR* pszText = NULL; + int iLen; + GETTEXTLENGTHEX gtl = {0}; + GETTEXTEX gt = {0}; + LRESULT lResult = (LRESULT)SendMessage(hwnd, EM_GETSEL, (WPARAM)NULL, (LPARAM)NULL); + + SendMessage(hwnd, WM_SETREDRAW, FALSE, 0); + start = LOWORD(lResult); + end = HIWORD(lResult); + SendMessage(hwnd, EM_SETSEL, end, end); + gtl.flags = GTL_PRECISE; + gtl.codepage = CP_ACP; + iLen = SendMessage(hwnd, EM_GETTEXTLENGTHEX, (WPARAM)>l, (LPARAM)NULL); + if (iLen >0) { + TCHAR *pszName = NULL; + TCHAR *pszSelName = NULL; + pszText = mir_alloc(sizeof(TCHAR)*(iLen+100)); + + gt.cb = iLen+99; + gt.flags = GT_DEFAULT; + gt.codepage = 1200; + + SendMessage(hwnd, 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 ( dat->szTabSave[0] =='\0') + lstrcpyn( dat->szTabSave, pszText+start, end-start+1 ); + + pszSelName = mir_alloc( sizeof(TCHAR)*( end-start+1 )); + lstrcpyn( pszSelName, pszText+start, end-start+1); + pszName = UM_FindUserAutoComplete(Parentsi->pUsers, dat->szTabSave, pszSelName); + if (pszName == NULL) { + pszName = dat->szTabSave; + SendMessage(hwnd, EM_SETSEL, start, end); + if (end !=start) + SendMessage(hwnd, EM_REPLACESEL, FALSE, (LPARAM) pszName); + dat->szTabSave[0] = '\0'; + } + else { + SendMessage(hwnd, EM_SETSEL, start, end); + if (end !=start) + SendMessage(hwnd, EM_REPLACESEL, FALSE, (LPARAM) pszName); + } + mir_free(pszText); + mir_free(pszSelName); + } + + SendMessage(hwnd, WM_SETREDRAW, TRUE, 0); + RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); + return 0; + } + + if (dat->szTabSave[0] != '\0' && wParam != VK_RIGHT && wParam != VK_LEFT + && wParam != VK_SPACE && wParam != VK_RETURN && wParam != VK_BACK + && wParam != VK_DELETE ) { + if (g_Settings.AddColonToAutoComplete && start == 0) + SendMessageA(hwnd, EM_REPLACESEL, FALSE, (LPARAM) ": "); + + dat->szTabSave[0] = '\0'; + } + + if (wParam == VK_F4 && isCtrl && !isAlt) { // ctrl-F4 (close tab) + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_CLOSE, BN_CLICKED), 0); + return TRUE; + } + + if (wParam == 0x49 && isCtrl && !isAlt) { // ctrl-i (italics) + CheckDlgButton(GetParent(hwnd), IDC_ITALICS, IsDlgButtonChecked(GetParent(hwnd), IDC_ITALICS) == BST_UNCHECKED?BST_CHECKED:BST_UNCHECKED); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_ITALICS, 0), 0); + return TRUE; + } + + if (wParam == 0x42 && isCtrl && !isAlt) { // ctrl-b (bold) + CheckDlgButton(GetParent(hwnd), IDC_BOLD, IsDlgButtonChecked(GetParent(hwnd), IDC_BOLD) == BST_UNCHECKED?BST_CHECKED:BST_UNCHECKED); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_BOLD, 0), 0); + return TRUE; + } + + if (wParam == 0x55 && isCtrl && !isAlt) { // ctrl-u (paste clean text) + CheckDlgButton(GetParent(hwnd), IDC_UNDERLINE, IsDlgButtonChecked(GetParent(hwnd), IDC_UNDERLINE) == BST_UNCHECKED?BST_CHECKED:BST_UNCHECKED); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_UNDERLINE, 0), 0); + return TRUE; + } + + if (wParam == 0x4b && isCtrl && !isAlt) { // ctrl-k (paste clean text) + CheckDlgButton(GetParent(hwnd), IDC_COLOR, IsDlgButtonChecked(GetParent(hwnd), IDC_COLOR) == BST_UNCHECKED?BST_CHECKED:BST_UNCHECKED); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_COLOR, 0), 0); + return TRUE; + } + + if (wParam == VK_SPACE && isCtrl && !isAlt) { // ctrl-space (paste clean text) + CheckDlgButton(GetParent(hwnd), IDC_BKGCOLOR, BST_UNCHECKED); + CheckDlgButton(GetParent(hwnd), IDC_COLOR, BST_UNCHECKED); + CheckDlgButton(GetParent(hwnd), IDC_BOLD, BST_UNCHECKED); + CheckDlgButton(GetParent(hwnd), IDC_UNDERLINE, BST_UNCHECKED); + CheckDlgButton(GetParent(hwnd), IDC_ITALICS, BST_UNCHECKED); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_BKGCOLOR, 0), 0); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_COLOR, 0), 0); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_BOLD, 0), 0); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_UNDERLINE, 0), 0); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_ITALICS, 0), 0); + return TRUE; + } + + if (wParam == 0x4c && isCtrl && !isAlt) { // ctrl-l (paste clean text) + CheckDlgButton(GetParent(hwnd), IDC_BKGCOLOR, IsDlgButtonChecked(GetParent(hwnd), IDC_BKGCOLOR) == BST_UNCHECKED?BST_CHECKED:BST_UNCHECKED); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_BKGCOLOR, 0), 0); + return TRUE; + } + + if (wParam == 0x46 && isCtrl && !isAlt) { // ctrl-f (paste clean text) + if (IsWindowEnabled(GetDlgItem(GetParent(hwnd), IDC_FILTER))) + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_FILTER, 0), 0); + return TRUE; + } + + if (wParam == 0x4e && isCtrl && !isAlt) { // ctrl-n (nicklist) + if (IsWindowEnabled(GetDlgItem(GetParent(hwnd), IDC_SHOWNICKLIST))) + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_SHOWNICKLIST, 0), 0); + return TRUE; + } + + if (wParam == 0x48 && isCtrl && !isAlt) { // ctrl-h (history) + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_HISTORY, 0), 0); + return TRUE; + } + + if (wParam == 0x4f && isCtrl && !isAlt) { // ctrl-o (options) + if (IsWindowEnabled(GetDlgItem(GetParent(hwnd), IDC_CHANMGR))) + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_CHANMGR, 0), 0); + return TRUE; + } + + if ((wParam == 45 && isShift || wParam == 0x56 && isCtrl )&& !isAlt) { // ctrl-v (paste clean text) + SendMessage(hwnd, EM_PASTESPECIAL, CF_TEXT, 0); + return TRUE; + } + + if (wParam == 0x57 && isCtrl && !isAlt) { // ctrl-w (close window) + PostMessage(GetParent(hwnd), WM_CLOSE, 0, 0); + return TRUE; + } + + if (wParam == VK_NEXT || wParam == VK_PRIOR) { + HWND htemp = GetParent(hwnd); + SendDlgItemMessage(htemp, IDC_LOG, msg, wParam, lParam); + dat->lastEnterTime = 0; + return TRUE; + } + + if (wParam == VK_UP && isCtrl && !isAlt) { + int iLen; + GETTEXTLENGTHEX gtl = {0}; + SETTEXTEX ste; + LOGFONT lf; + char* lpPrevCmd = SM_GetPrevCommand(Parentsi->ptszID, Parentsi->pszModule); + + SendMessage(hwnd, WM_SETREDRAW, FALSE, 0); + + LoadMsgDlgFont(17, &lf, NULL); + ste.flags = ST_DEFAULT; + ste.codepage = CP_ACP; + if (lpPrevCmd) + SendMessage(hwnd, EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)lpPrevCmd); + else + SetWindowText(hwnd, _T("")); + + gtl.flags = GTL_PRECISE; + gtl.codepage = CP_ACP; + iLen = SendMessage(hwnd, EM_GETTEXTLENGTHEX, (WPARAM)>l, (LPARAM)NULL); + SendMessage(hwnd, EM_SCROLLCARET, 0,0); + SendMessage(hwnd, WM_SETREDRAW, TRUE, 0); + RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); + SendMessage(hwnd, EM_SETSEL,iLen,iLen); + dat->lastEnterTime = 0; + return TRUE; + } + + if (wParam == VK_DOWN && isCtrl && !isAlt) { + int iLen; + GETTEXTLENGTHEX gtl = {0}; + SETTEXTEX ste; + + char* lpPrevCmd = SM_GetNextCommand(Parentsi->ptszID, Parentsi->pszModule); + SendMessage(hwnd, WM_SETREDRAW, FALSE, 0); + + ste.flags = ST_DEFAULT; + ste.codepage = CP_ACP; + if (lpPrevCmd) + SendMessage(hwnd, EM_SETTEXTEX, (WPARAM)&ste, (LPARAM) lpPrevCmd); + else + SetWindowText(hwnd, _T("")); + + gtl.flags = GTL_PRECISE; + gtl.codepage = CP_ACP; + iLen = SendMessage(hwnd, EM_GETTEXTLENGTHEX, (WPARAM)>l, (LPARAM)NULL); + SendMessage(hwnd, EM_SCROLLCARET, 0,0); + SendMessage(hwnd, WM_SETREDRAW, TRUE, 0); + RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); + SendMessage(hwnd, EM_SETSEL,iLen,iLen); + dat->lastEnterTime = 0; + return TRUE; + } + + if (wParam == VK_RETURN) + break; + } + //fall through + + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_KILLFOCUS: + dat->lastEnterTime = 0; + break; + + case WM_RBUTTONDOWN: + { + CHARRANGE sel, all = { 0, -1 }; + POINT pt; + UINT uID = 0; + HMENU hSubMenu; + + hSubMenu = GetSubMenu(g_hMenu, 4); + TranslateMenu(hSubMenu); + SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM) & sel); + + EnableMenuItem(hSubMenu, ID_MESSAGE_UNDO, SendMessage(hwnd, EM_CANUNDO, 0,0)?MF_ENABLED:MF_GRAYED); + EnableMenuItem(hSubMenu, ID_MESSAGE_REDO, SendMessage(hwnd, EM_CANREDO, 0,0)?MF_ENABLED:MF_GRAYED); + EnableMenuItem(hSubMenu, ID_MESSAGE_COPY, sel.cpMax!=sel.cpMin?MF_ENABLED:MF_GRAYED); + EnableMenuItem(hSubMenu, ID_MESSAGE_CUT, sel.cpMax!=sel.cpMin?MF_ENABLED:MF_GRAYED); + + dat->lastEnterTime = 0; + + pt.x = (short) LOWORD(lParam); + pt.y = (short) HIWORD(lParam); + ClientToScreen(hwnd, &pt); + + uID = TrackPopupMenu(hSubMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, NULL); + switch (uID) { + case 0: + break; + + case ID_MESSAGE_UNDO: + SendMessage(hwnd, EM_UNDO, 0, 0); + break; + + case ID_MESSAGE_REDO: + SendMessage(hwnd, EM_REDO, 0, 0); + break; + + case ID_MESSAGE_COPY: + SendMessage(hwnd, WM_COPY, 0, 0); + break; + + case ID_MESSAGE_CUT: + SendMessage(hwnd, WM_CUT, 0, 0); + break; + + case ID_MESSAGE_PASTE: + SendMessage(hwnd, EM_PASTESPECIAL, CF_TEXT, 0); + break; + + case ID_MESSAGE_SELECTALL: + SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM) & all); + break; + + case ID_MESSAGE_CLEAR: + SetWindowText(hwnd, _T( "" )); + break; + } + PostMessage(hwnd, WM_KEYUP, 0, 0 ); + } + break; + + case WM_KEYUP: + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + CHARFORMAT2 cf; + UINT u = 0; + UINT u2 = 0; + COLORREF cr; + + LoadMsgDlgFont(17, NULL, &cr); + + cf.cbSize = sizeof(CHARFORMAT2); + cf.dwMask = CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_BACKCOLOR|CFM_COLOR; + SendMessage(hwnd, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + + if (MM_FindModule(Parentsi->pszModule) && MM_FindModule(Parentsi->pszModule)->bColor) { + int index = GetColorIndex(Parentsi->pszModule, cf.crTextColor); + u = IsDlgButtonChecked(GetParent(hwnd), IDC_COLOR); + + if (index >= 0) { + Parentsi->bFGSet = TRUE; + Parentsi->iFG = index; + } + + if (u == BST_UNCHECKED && cf.crTextColor != cr) + CheckDlgButton(GetParent(hwnd), IDC_COLOR, BST_CHECKED); + else if (u == BST_CHECKED && cf.crTextColor == cr) + CheckDlgButton(GetParent(hwnd), IDC_COLOR, BST_UNCHECKED); + } + + if (MM_FindModule(Parentsi->pszModule) && MM_FindModule(Parentsi->pszModule)->bBkgColor) { + int index = GetColorIndex(Parentsi->pszModule, cf.crBackColor); + COLORREF crB = (COLORREF)DBGetContactSettingDword(NULL, "Chat", "ColorMessageBG", GetSysColor(COLOR_WINDOW)); + u = IsDlgButtonChecked(GetParent(hwnd), IDC_BKGCOLOR); + + if (index >= 0) { + Parentsi->bBGSet = TRUE; + Parentsi->iBG = index; + } + if (u == BST_UNCHECKED && cf.crBackColor != crB) + CheckDlgButton(GetParent(hwnd), IDC_BKGCOLOR, BST_CHECKED); + else if (u == BST_CHECKED && cf.crBackColor == crB) + CheckDlgButton(GetParent(hwnd), IDC_BKGCOLOR, BST_UNCHECKED); + } + + if (MM_FindModule(Parentsi->pszModule) && MM_FindModule(Parentsi->pszModule)->bBold) { + u = IsDlgButtonChecked(GetParent(hwnd), IDC_BOLD); + u2 = cf.dwEffects; + u2 &= CFE_BOLD; + if (u == BST_UNCHECKED && u2) + CheckDlgButton(GetParent(hwnd), IDC_BOLD, BST_CHECKED); + else if (u == BST_CHECKED && u2 == 0) + CheckDlgButton(GetParent(hwnd), IDC_BOLD, BST_UNCHECKED); + } + + if (MM_FindModule(Parentsi->pszModule) && MM_FindModule(Parentsi->pszModule)->bItalics) { + u = IsDlgButtonChecked(GetParent(hwnd), IDC_ITALICS); + u2 = cf.dwEffects; + u2 &= CFE_ITALIC; + if (u == BST_UNCHECKED && u2) + CheckDlgButton(GetParent(hwnd), IDC_ITALICS, BST_CHECKED); + else if (u == BST_CHECKED && u2 == 0) + CheckDlgButton(GetParent(hwnd), IDC_ITALICS, BST_UNCHECKED); + } + + if (MM_FindModule(Parentsi->pszModule) && MM_FindModule(Parentsi->pszModule)->bUnderline) { + u = IsDlgButtonChecked(GetParent(hwnd), IDC_UNDERLINE); + u2 = cf.dwEffects; + u2 &= CFE_UNDERLINE; + if (u == BST_UNCHECKED && u2) + CheckDlgButton(GetParent(hwnd), IDC_UNDERLINE, BST_CHECKED); + else if (u == BST_CHECKED && u2 == 0) + CheckDlgButton(GetParent(hwnd), IDC_UNDERLINE, BST_UNCHECKED); + } } + break; + + case EM_UNSUBCLASSED: + mir_free(dat); + return 0; + } + + return CallWindowProc(OldMessageProc, hwnd, msg, wParam, lParam); +} + +static INT_PTR CALLBACK FilterWndProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) +{ + static SESSION_INFO* si = NULL; + switch (uMsg) { + case WM_INITDIALOG: + si = (SESSION_INFO*)lParam; + CheckDlgButton(hwndDlg, IDC_1, si->iLogFilterFlags&GC_EVENT_ACTION); + CheckDlgButton(hwndDlg, IDC_2, si->iLogFilterFlags&GC_EVENT_MESSAGE); + CheckDlgButton(hwndDlg, IDC_3, si->iLogFilterFlags&GC_EVENT_NICK); + CheckDlgButton(hwndDlg, IDC_4, si->iLogFilterFlags&GC_EVENT_JOIN); + CheckDlgButton(hwndDlg, IDC_5, si->iLogFilterFlags&GC_EVENT_PART); + CheckDlgButton(hwndDlg, IDC_6, si->iLogFilterFlags&GC_EVENT_TOPIC); + CheckDlgButton(hwndDlg, IDC_7, si->iLogFilterFlags&GC_EVENT_ADDSTATUS); + CheckDlgButton(hwndDlg, IDC_8, si->iLogFilterFlags&GC_EVENT_INFORMATION); + CheckDlgButton(hwndDlg, IDC_9, si->iLogFilterFlags&GC_EVENT_QUIT); + CheckDlgButton(hwndDlg, IDC_10, si->iLogFilterFlags&GC_EVENT_KICK); + CheckDlgButton(hwndDlg, IDC_11, si->iLogFilterFlags&GC_EVENT_NOTICE); + break; + + case WM_CTLCOLOREDIT: + case WM_CTLCOLORSTATIC: + SetTextColor((HDC)wParam,RGB(60,60,150)); + SetBkColor((HDC)wParam,GetSysColor(COLOR_WINDOW)); + return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); + + case WM_ACTIVATE: + if (LOWORD(wParam) == WA_INACTIVE) { + int iFlags = 0; + + if (IsDlgButtonChecked(hwndDlg, IDC_1) == BST_CHECKED) + iFlags |= GC_EVENT_ACTION; + if (IsDlgButtonChecked(hwndDlg, IDC_2) == BST_CHECKED) + iFlags |= GC_EVENT_MESSAGE; + if (IsDlgButtonChecked(hwndDlg, IDC_3) == BST_CHECKED) + iFlags |= GC_EVENT_NICK; + if (IsDlgButtonChecked(hwndDlg, IDC_4) == BST_CHECKED) + iFlags |= GC_EVENT_JOIN; + if (IsDlgButtonChecked(hwndDlg, IDC_5) == BST_CHECKED) + iFlags |= GC_EVENT_PART; + if (IsDlgButtonChecked(hwndDlg, IDC_6) == BST_CHECKED) + iFlags |= GC_EVENT_TOPIC; + if (IsDlgButtonChecked(hwndDlg, IDC_7) == BST_CHECKED) + iFlags |= GC_EVENT_ADDSTATUS; + if (IsDlgButtonChecked(hwndDlg, IDC_8) == BST_CHECKED) + iFlags |= GC_EVENT_INFORMATION; + if (IsDlgButtonChecked(hwndDlg, IDC_9) == BST_CHECKED) + iFlags |= GC_EVENT_QUIT; + if (IsDlgButtonChecked(hwndDlg, IDC_10) == BST_CHECKED) + iFlags |= GC_EVENT_KICK; + if (IsDlgButtonChecked(hwndDlg, IDC_11) == BST_CHECKED) + iFlags |= GC_EVENT_NOTICE; + + if (iFlags&GC_EVENT_ADDSTATUS) + iFlags |= GC_EVENT_REMOVESTATUS; + + SendMessage(GetParent(hwndDlg), GC_CHANGEFILTERFLAG, 0, (LPARAM)iFlags); + if (si->bFilterEnabled) + SendMessage(GetParent(hwndDlg), GC_REDRAWLOG, 0, 0); + PostMessage(hwndDlg, WM_CLOSE, 0, 0); + } + break; + + case WM_CLOSE: + DestroyWindow(hwndDlg); + break; + } + + return(FALSE); +} + +static LRESULT CALLBACK ButtonSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_RBUTTONUP: + { + HWND hFilter = GetDlgItem(GetParent(hwnd), IDC_FILTER); + HWND hColor = GetDlgItem(GetParent(hwnd), IDC_COLOR); + HWND hBGColor = GetDlgItem(GetParent(hwnd), IDC_BKGCOLOR); + + if (DBGetContactSettingByte(NULL, "Chat", "RightClickFilter", 0) != 0) { + if (hFilter == hwnd) + SendMessage(GetParent(hwnd), GC_SHOWFILTERMENU, 0, 0); + if (hColor == hwnd) + SendMessage(GetParent(hwnd), GC_SHOWCOLORCHOOSER, 0, (LPARAM)IDC_COLOR); + if (hBGColor == hwnd) + SendMessage(GetParent(hwnd), GC_SHOWCOLORCHOOSER, 0, (LPARAM)IDC_BKGCOLOR); + } } + break; + } + + return CallWindowProc(OldFilterButtonProc, hwnd, msg, wParam, lParam); +} + +static LRESULT CALLBACK LogSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_LBUTTONUP: + { + CHARRANGE sel; + + SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM) &sel); + if (sel.cpMin != sel.cpMax) + { + SendMessage(hwnd, WM_COPY, 0, 0); + sel.cpMin = sel.cpMax ; + SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM) & sel); + } + SetFocus(GetDlgItem(GetParent(hwnd), IDC_MESSAGE)); + break; + } + case WM_KEYDOWN: + if (wParam == 0x57 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-w (close window) + PostMessage(GetParent(hwnd), WM_CLOSE, 0, 0); + return TRUE; + } + break; + + case WM_ACTIVATE: + if (LOWORD(wParam) == WA_INACTIVE) { + CHARRANGE sel; + SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM) &sel); + if (sel.cpMin != sel.cpMax) { + sel.cpMin = sel.cpMax ; + SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM) & sel); + } } + break; + + case WM_CHAR: + SetFocus(GetDlgItem(GetParent(hwnd), IDC_MESSAGE)); + SendMessage(GetDlgItem(GetParent(hwnd), IDC_MESSAGE), WM_CHAR, wParam, lParam); + break; + } + + return CallWindowProc(OldLogProc, hwnd, msg, wParam, lParam); +} + +static LRESULT CALLBACK TabSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static BOOL bDragging = FALSE; + static int iBeginIndex = 0; + switch (msg) { + case WM_LBUTTONDOWN: + { + TCHITTESTINFO tci = {0}; + tci.pt.x=(short)LOWORD(GetMessagePos()); + tci.pt.y=(short)HIWORD(GetMessagePos()); + if (DragDetect(hwnd, tci.pt) && TabCtrl_GetItemCount(hwnd) > 1 ) { + int i; + tci.flags = TCHT_ONITEM; + + ScreenToClient(hwnd, &tci.pt); + i= TabCtrl_HitTest(hwnd, &tci); + if (i != -1) { + TCITEM tc; + SESSION_INFO* s = NULL; + + tc.mask = TCIF_PARAM; + TabCtrl_GetItem(hwnd, i, &tc); + s = (SESSION_INFO* ) tc.lParam; + if (s) + { + BOOL bOnline = DBGetContactSettingWord(s->hContact, s->pszModule, "Status", ID_STATUS_OFFLINE) == ID_STATUS_ONLINE?TRUE:FALSE; + bDragging = TRUE; + iBeginIndex = i; + ImageList_BeginDrag(hIconsList, bOnline?(MM_FindModule(s->pszModule))->OnlineIconIndex:(MM_FindModule(s->pszModule))->OfflineIconIndex, 8, 8); + ImageList_DragEnter(hwnd,tci.pt.x, tci.pt.y); + SetCapture(hwnd); + } + return TRUE; + } } + else PostMessage(GetParent(hwnd), GC_TABCLICKED, 0, 0 ); + } + break; + case WM_CAPTURECHANGED: + bDragging = FALSE; + ImageList_DragLeave(hwnd); + ImageList_EndDrag(); + break; + + case WM_MOUSEMOVE: + if (bDragging) { + TCHITTESTINFO tci = {0}; + tci.pt.x=(short)LOWORD(GetMessagePos()); + tci.pt.y=(short)HIWORD(GetMessagePos()); + ScreenToClient(hwnd, &tci.pt); + ImageList_DragMove(tci.pt.x, tci.pt.y); + } + break; + + case WM_LBUTTONUP: + if (bDragging && ReleaseCapture()) { + TCHITTESTINFO tci = {0}; + int i; + tci.pt.x=(short)LOWORD(GetMessagePos()); + tci.pt.y=(short)HIWORD(GetMessagePos()); + tci.flags = TCHT_ONITEM; + bDragging = FALSE; + ImageList_DragLeave(hwnd); + ImageList_EndDrag(); + + ScreenToClient(hwnd, &tci.pt); + i= TabCtrl_HitTest(hwnd, &tci); + if (i != -1 && i != iBeginIndex) + SendMessage(GetParent(hwnd), GC_DROPPEDTAB, (WPARAM)i, (LPARAM)iBeginIndex); + } + break; + + case WM_LBUTTONDBLCLK: + { + TCHITTESTINFO tci = {0}; + int i = 0; + + tci.pt.x=(short)LOWORD(GetMessagePos()); + tci.pt.y=(short)HIWORD(GetMessagePos()); + tci.flags = TCHT_ONITEM; + + ScreenToClient(hwnd, &tci.pt); + i = TabCtrl_HitTest(hwnd, &tci); + if (i != -1 && g_Settings.TabCloseOnDblClick) + PostMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_CLOSE, BN_CLICKED), 0); + } + break; + + case WM_MBUTTONUP: + { + TCHITTESTINFO tci = {0}; + int i = 0; + + tci.pt.x=(short)LOWORD(GetMessagePos()); + tci.pt.y=(short)HIWORD(GetMessagePos()); + tci.flags = TCHT_ONITEM; + + ScreenToClient(hwnd, &tci.pt); + i = TabCtrl_HitTest(hwnd, &tci); + if (i != -1 ) { + TCITEM tc; + SESSION_INFO* si ; + + tc.mask = TCIF_PARAM; + TabCtrl_GetItem(hwnd, i, &tc); + si = (SESSION_INFO* ) tc.lParam; + if (si) + SendMessage(GetParent(hwnd), GC_REMOVETAB, 1, (LPARAM) si ); + } } + break; + } + + return CallWindowProc(OldTabProc, hwnd, msg, wParam, lParam); +} + +static LRESULT CALLBACK NicklistSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_ERASEBKGND: + { + HDC dc = (HDC)wParam; + SESSION_INFO* parentdat =(SESSION_INFO*)GetWindowLongPtr(GetParent(hwnd),GWLP_USERDATA); + if (dc) { + int height, index, items = 0; + + index = SendMessage(hwnd, LB_GETTOPINDEX, 0, 0); + if (index == LB_ERR || parentdat->nUsersInNicklist <= 0) + return 0; + + items = parentdat->nUsersInNicklist - index; + height = SendMessage(hwnd, LB_GETITEMHEIGHT, 0, 0); + + if (height != LB_ERR) { + RECT rc = {0}; + GetClientRect(hwnd, &rc); + + if (rc.bottom-rc.top > items * height) { + rc.top = items*height; + FillRect(dc, &rc, hListBkgBrush); + } } } } + return 1; + + case WM_KEYDOWN: + if (wParam == 0x57 && GetKeyState(VK_CONTROL) & 0x8000) { // ctrl-w (close window) + PostMessage(GetParent(hwnd), WM_CLOSE, 0, 0); + return TRUE; + } + break; + + case WM_RBUTTONDOWN: + SendMessage(hwnd, WM_LBUTTONDOWN, wParam, lParam); + break; + + case WM_RBUTTONUP: + SendMessage(hwnd, WM_LBUTTONUP, wParam, lParam); + break; + + case WM_MEASUREITEM: + { + MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *) lParam; + if (mis->CtlType == ODT_MENU) + return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); + return FALSE; + } + case WM_DRAWITEM: + { + DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *) lParam; + if (dis->CtlType == ODT_MENU) + return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); + return FALSE; + } + case WM_CONTEXTMENU: + { + TVHITTESTINFO hti; + int item; + int height; + USERINFO * ui; + SESSION_INFO* parentdat =(SESSION_INFO*)GetWindowLongPtr(GetParent(hwnd),GWLP_USERDATA); + + hti.pt.x = (short) LOWORD(lParam); + hti.pt.y = (short) HIWORD(lParam); + if (hti.pt.x == -1 && hti.pt.y == -1) { + int index = SendMessage(hwnd, LB_GETCURSEL, 0, 0); + int top = SendMessage(hwnd, LB_GETTOPINDEX, 0, 0); + height = SendMessage(hwnd, LB_GETITEMHEIGHT, 0, 0); + hti.pt.x = 4; + hti.pt.y = (index - top)*height + 1; + } + else ScreenToClient(hwnd,&hti.pt); + + item = LOWORD(SendMessage(GetDlgItem(GetParent(hwnd), IDC_LIST), LB_ITEMFROMPOINT, 0, MAKELPARAM(hti.pt.x, hti.pt.y))); + ui = SM_GetUserFromIndex(parentdat->ptszID, parentdat->pszModule, item); + // ui = (USERINFO *)SendMessage(GetDlgItem(GetParent(hwnd), IDC_LIST), LB_GETITEMDATA, item, 0); + if (ui) { + HMENU hMenu = 0; + UINT uID; + USERINFO uinew; + + memcpy(&uinew, ui, sizeof(USERINFO)); + if (hti.pt.x == -1 && hti.pt.y == -1) + hti.pt.y += height - 4; + ClientToScreen(hwnd, &hti.pt); + uID = CreateGCMenu(hwnd, &hMenu, 0, hti.pt, parentdat, uinew.pszUID, NULL); + + switch (uID) { + case 0: + break; + + case ID_MESS: + DoEventHookAsync(GetParent(hwnd), parentdat->ptszID, parentdat->pszModule, GC_USER_PRIVMESS, ui->pszUID, NULL, (LPARAM)NULL); + break; + + default: + DoEventHookAsync(GetParent(hwnd), parentdat->ptszID, parentdat->pszModule, GC_USER_NICKLISTMENU, ui->pszUID, NULL, (LPARAM)uID); + break; + } + DestroyGCMenu(&hMenu, 1); + return TRUE; + } } + break; + + case WM_MOUSEMOVE: + { + SESSION_INFO* parentdat =(SESSION_INFO*)GetWindowLongPtr(GetParent(hwnd),GWLP_USERDATA); + if ( parentdat ) { + POINT p; + GetCursorPos(&p); + SendMessage( parentdat->hwndTooltip,TTM_TRACKPOSITION,0,(LPARAM)MAKELPARAM(p.x + 15,p.y + 15)); +// SendMessage( parentdat->hwndTooltip, TTM_ACTIVATE, TRUE, 0 ); + } } + break; + + } + + return CallWindowProc(OldNicklistProc, hwnd, msg, wParam, lParam); +} + +static int RestoreWindowPosition(HWND hwnd, HANDLE hContact, char * szModule, char * szNamePrefix, UINT showCmd) +{ + WINDOWPLACEMENT wp; + char szSettingName[64]; + int x,y, width, height;; + + wp.length=sizeof(wp); + GetWindowPlacement(hwnd,&wp); + wsprintfA(szSettingName,"%sx",szNamePrefix); + x=DBGetContactSettingDword(hContact,szModule,szSettingName,-1); + wsprintfA(szSettingName,"%sy",szNamePrefix); + y=(int)DBGetContactSettingDword(hContact,szModule,szSettingName,-1); + wsprintfA(szSettingName,"%swidth",szNamePrefix); + width=DBGetContactSettingDword(hContact,szModule,szSettingName,-1); + wsprintfA(szSettingName,"%sheight",szNamePrefix); + height=DBGetContactSettingDword(hContact,szModule,szSettingName,-1); + + if (x==-1) + return 0; + wp.rcNormalPosition.left=x; + wp.rcNormalPosition.top=y; + wp.rcNormalPosition.right=wp.rcNormalPosition.left+width; + wp.rcNormalPosition.bottom=wp.rcNormalPosition.top+height; + wp.showCmd = showCmd; + SetWindowPlacement(hwnd,&wp); + return 1; +} + +int GetTextPixelSize( TCHAR* pszText, HFONT hFont, BOOL bWidth) +{ + HDC hdc; + HFONT hOldFont; + RECT rc = {0}; + int i; + + if (!pszText || !hFont) + return 0; + + hdc = GetDC(NULL); + hOldFont = SelectObject(hdc, hFont); + i = DrawText(hdc, pszText , -1, &rc, DT_CALCRECT); + SelectObject(hdc, hOldFont); + ReleaseDC(NULL,hdc); + return bWidth ? rc.right - rc.left : rc.bottom - rc.top; +} + +static void __cdecl phase2(void * lParam) +{ + SESSION_INFO* si = (SESSION_INFO*) lParam; + Sleep(30); + if (si && si->hWnd) + PostMessage(si->hWnd, GC_REDRAWLOG3, 0, 0); +} + +INT_PTR CALLBACK RoomWndProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) +{ + SESSION_INFO* si; + + si = (SESSION_INFO*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + switch (uMsg) { + case WM_INITDIALOG: + { + int mask; + HWND hNickList = GetDlgItem(hwndDlg,IDC_LIST); + si = (SESSION_INFO*)lParam; + si->pAccPropServicesForNickList = NULL; + CoCreateInstance(&CLSID_AccPropServices, NULL, CLSCTX_SERVER, &IID_IAccPropServices, &si->pAccPropServicesForNickList); + TranslateDialogDefault(hwndDlg); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)si); + OldSplitterProc=(WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_SPLITTERX),GWLP_WNDPROC,(LONG_PTR)SplitterSubclassProc); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_SPLITTERY),GWLP_WNDPROC,(LONG_PTR)SplitterSubclassProc); + OldNicklistProc=(WNDPROC)SetWindowLongPtr(hNickList,GWLP_WNDPROC,(LONG_PTR)NicklistSubclassProc); + OldTabProc=(WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_TAB),GWLP_WNDPROC,(LONG_PTR)TabSubclassProc); + OldLogProc=(WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_LOG),GWLP_WNDPROC,(LONG_PTR)LogSubclassProc); + OldFilterButtonProc=(WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_FILTER),GWLP_WNDPROC,(LONG_PTR)ButtonSubclassProc); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_COLOR),GWLP_WNDPROC,(LONG_PTR)ButtonSubclassProc); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_BKGCOLOR),GWLP_WNDPROC,(LONG_PTR)ButtonSubclassProc); + OldMessageProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_MESSAGE), GWLP_WNDPROC,(LONG_PTR)MessageSubclassProc); + SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SUBCLASSED, 0, 0); + SendDlgItemMessage(hwndDlg, IDC_LOG, EM_AUTOURLDETECT, 1, 0); + mask = (int)SendDlgItemMessage(hwndDlg, IDC_LOG, EM_GETEVENTMASK, 0, 0); + SendDlgItemMessage(hwndDlg, IDC_LOG, EM_SETEVENTMASK, 0, mask | ENM_LINK | ENM_MOUSEEVENTS); + SendDlgItemMessage(hwndDlg, IDC_LOG, EM_LIMITTEXT, (WPARAM)sizeof(TCHAR)*0x7FFFFFFF, 0); + SendDlgItemMessage(hwndDlg, IDC_LOG, EM_SETOLECALLBACK, 0, (LPARAM) & reOleCallback); + + // RichUtil_SubClass(GetDlgItem(hwndDlg, IDC_MESSAGE)); + // RichUtil_SubClass(GetDlgItem(hwndDlg, IDC_LOG)); + + si->hwndStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP| SBT_TOOLTIPS , 0, 0, 0, 0, hwndDlg, NULL, g_hInst, NULL); + SendMessage(si->hwndStatus,SB_SETMINHEIGHT,GetSystemMetrics(SM_CYSMICON),0); + TabCtrl_SetMinTabWidth(GetDlgItem(hwndDlg, IDC_TAB), 80); + TabCtrl_SetImageList(GetDlgItem(hwndDlg, IDC_TAB), hIconsList); + + // enable tooltips + si->iOldItemID = -1; + si->hwndTooltip = CreateWindow(TOOLTIPS_CLASS,NULL,TTS_ALWAYSTIP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hNickList,(HMENU)NULL,g_hInst,NULL); + SetWindowPos(si->hwndTooltip, HWND_TOPMOST,0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + { + TOOLINFO ti = {0}; + ti.cbSize = sizeof(TOOLINFO); + ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS | TTF_TRANSPARENT; + ti.hwnd = hwndDlg; + ti.hinst = g_hInst; + ti.uId = (UINT_PTR)hNickList; + ti.lpszText = LPSTR_TEXTCALLBACK; + //GetClientRect( hNickList, &ti.rect ); + SendMessage( si->hwndTooltip, TTM_ADDTOOL, 0, ( LPARAM )&ti ); + SendMessage( si->hwndTooltip, TTM_SETDELAYTIME, TTDT_AUTOPOP, 20000 ); + SendMessage( si->hwndTooltip, TTM_SETMAXTIPWIDTH, 0, 300); + + //SendMessage( psi->hwndTooltip, TTM_TRACKACTIVATE, TRUE, ( LPARAM )&ti ); + } + + // restore previous tabs + if (g_Settings.TabsEnable && DBGetContactSettingByte(NULL, "Chat", "TabRestore", 0)) { + TABLIST * node = g_TabList; + while (node) { + SESSION_INFO* s = SM_FindSession(node->pszID, node->pszModule); + if (s) + SendMessage(hwndDlg, GC_ADDTAB, -1, (LPARAM)s); + + node = node->next; + } } + + TabM_RemoveAll(); + + EnableWindow(GetDlgItem(hwndDlg, IDC_SMILEY), TRUE); + + SendMessage(GetDlgItem(hwndDlg, IDC_LOG), EM_HIDESELECTION, TRUE, 0); + + SendMessage(hwndDlg, GC_SETWNDPROPS, 0, 0); + SendMessage(hwndDlg, GC_UPDATESTATUSBAR, 0, 0); + SendMessage(hwndDlg, GC_UPDATETITLE, 0, 0); + SendMessage(hwndDlg, GC_SETWINDOWPOS, 0, 0); + } + break; + + case GC_SETWNDPROPS: + { + HICON hIcon; + LoadGlobalSettings(); + InitButtons(hwndDlg, si); + + hIcon = si->wStatus==ID_STATUS_ONLINE?MM_FindModule(si->pszModule)->hOnlineIcon:MM_FindModule(si->pszModule)->hOfflineIcon; + // stupid hack to make icons show. I dunno why this is needed currently + if (!hIcon) { + MM_IconsChanged(); + hIcon = si->wStatus==ID_STATUS_ONLINE?MM_FindModule(si->pszModule)->hOnlineIcon:MM_FindModule(si->pszModule)->hOfflineIcon; + } + + SendMessage(hwndDlg, GC_FIXTABICONS, 0, 0); + SendMessage(si->hwndStatus, SB_SETICON, 0,(LPARAM)hIcon); + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadIconEx( "window", TRUE )); + SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIconEx( "window", FALSE )); + + SendMessage(GetDlgItem(hwndDlg, IDC_LOG), EM_SETBKGNDCOLOR , 0, g_Settings.crLogBackground); + + if (g_Settings.TabsEnable) { + int mask = (int)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_TAB), GWL_STYLE); + if (g_Settings.TabsAtBottom) + mask |= TCS_BOTTOM; + else + mask &= ~TCS_BOTTOM; + SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_TAB), GWL_STYLE, (LONG_PTR)mask); + } + + { //messagebox + COLORREF crFore; + + CHARFORMAT2 cf; + LoadMsgDlgFont(17, NULL, &crFore); + cf.cbSize = sizeof(CHARFORMAT2); + cf.dwMask = CFM_COLOR|CFM_BOLD|CFM_UNDERLINE|CFM_BACKCOLOR; + cf.dwEffects = 0; + cf.crTextColor = crFore; + cf.crBackColor = (COLORREF)DBGetContactSettingDword(NULL, "Chat", "ColorMessageBG", GetSysColor(COLOR_WINDOW)); + SendMessage(GetDlgItem(hwndDlg, IDC_MESSAGE), EM_SETBKGNDCOLOR , 0, DBGetContactSettingDword(NULL, "Chat", "ColorMessageBG", GetSysColor(COLOR_WINDOW))); + SendDlgItemMessage(hwndDlg, IDC_MESSAGE, WM_SETFONT, (WPARAM) g_Settings.MessageBoxFont, MAKELPARAM(TRUE, 0)); + SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETCHARFORMAT, (WPARAM)SCF_ALL , (LPARAM)&cf); + } + { // nicklist + int ih; + int ih2; + int font; + int height; + + ih = GetTextPixelSize( _T("AQGglo"), g_Settings.UserListFont,FALSE); + ih2 = GetTextPixelSize( _T("AQGglo"), g_Settings.UserListHeadingsFont,FALSE); + height = DBGetContactSettingByte(NULL, "Chat", "NicklistRowDist", 12); + font = ih > ih2?ih:ih2; + + // make sure we have space for icon! + if (g_Settings.ShowContactStatus) + font = font > 16 ? font : 16; + + SendMessage(GetDlgItem(hwndDlg, IDC_LIST), LB_SETITEMHEIGHT, 0, (LPARAM)height > font ? height : font); + InvalidateRect(GetDlgItem(hwndDlg, IDC_LIST), NULL, TRUE); + } + SendMessage(hwndDlg, WM_SIZE, 0, 0); + SendMessage(hwndDlg, GC_REDRAWLOG2, 0, 0); + } + break; + + case GC_UPDATETITLE: + { + TCHAR szTemp [100]; + switch(si->iType) { + case GCW_CHATROOM: + mir_sntprintf(szTemp, SIZEOF(szTemp), + (si->nUsersInNicklist ==1) ? TranslateT("%s: Chat Room (%u user)") : TranslateT("%s: Chat Room (%u users)"), + si->ptszName, si->nUsersInNicklist); + break; + case GCW_PRIVMESS: + mir_sntprintf(szTemp, SIZEOF(szTemp), + (si->nUsersInNicklist ==1) ? TranslateT("%s: Message Session") : TranslateT("%s: Message Session (%u users)"), + si->ptszName, si->nUsersInNicklist); + break; + case GCW_SERVER: + mir_sntprintf(szTemp, SIZEOF(szTemp), _T("%s: Server"), si->ptszName); + break; + } + SetWindowText(hwndDlg, szTemp); + } + break; + + case GC_UPDATESTATUSBAR: + { + HICON hIcon; + int iStatusbarParts[2]; + TCHAR* ptszDispName = MM_FindModule(si->pszModule)->ptszModDispName; + int x = 12; + + x += GetTextPixelSize(ptszDispName, (HFONT)SendMessage(si->hwndStatus,WM_GETFONT,0,0), TRUE); + x += GetSystemMetrics(SM_CXSMICON); + iStatusbarParts[0] = x; iStatusbarParts[1] = -1; + SendMessage(si->hwndStatus,SB_SETPARTS,2 ,(LPARAM)&iStatusbarParts); + + hIcon = si->wStatus==ID_STATUS_ONLINE?MM_FindModule(si->pszModule)->hOnlineIcon:MM_FindModule(si->pszModule)->hOfflineIcon; + + // stupid hack to make icons show. I dunno why this is needed currently + if (!hIcon) { + MM_IconsChanged(); + hIcon = si->wStatus==ID_STATUS_ONLINE?MM_FindModule(si->pszModule)->hOnlineIcon:MM_FindModule(si->pszModule)->hOfflineIcon; + } + + SendMessage(si->hwndStatus, SB_SETICON, 0,(LPARAM)hIcon); + SendMessage(hwndDlg, GC_FIXTABICONS, 0, 0); + + SendMessage(si->hwndStatus, SB_SETTEXT,0,(LPARAM)ptszDispName); + + SendMessage(si->hwndStatus, SB_SETTEXT,1,(LPARAM)(si->ptszStatusbarText ? si->ptszStatusbarText : _T(""))); + SendMessage(si->hwndStatus, SB_SETTIPTEXT,1,(LPARAM)(si->ptszStatusbarText ? si->ptszStatusbarText : _T(""))); + return TRUE; + } + break; + + case GC_SETWINDOWPOS: + { + SESSION_INFO* pActive = GetActiveSession(); + WINDOWPLACEMENT wp; + RECT screen; + int savePerContact = DBGetContactSettingByte(NULL, "Chat", "SavePosition", 0); + + wp.length=sizeof(wp); + GetWindowPlacement(hwndDlg,&wp); + SystemParametersInfo(SPI_GETWORKAREA, 0, &screen, 0); + + if (si->iX) { + wp.rcNormalPosition.left = si->iX; + wp.rcNormalPosition.top = si->iY; + wp.rcNormalPosition.right = wp.rcNormalPosition.left + si->iWidth; + wp.rcNormalPosition.bottom = wp.rcNormalPosition.top + si->iHeight; + wp.showCmd = SW_HIDE; + SetWindowPlacement(hwndDlg,&wp); + // SetWindowPos(hwndDlg, 0, si->iX,si->iY, si->iWidth, si->iHeight, SWP_NOZORDER |SWP_HIDEWINDOW|SWP_NOACTIVATE); + break; + } + if (savePerContact) { + if (RestoreWindowPosition(hwndDlg, g_Settings.TabsEnable?NULL:si->hContact, "Chat", "room", SW_HIDE)) + break; + SetWindowPos(hwndDlg, 0, (screen.right-screen.left)/2- (550)/2,(screen.bottom-screen.top)/2- (400)/2, (550), (400), SWP_NOZORDER |SWP_HIDEWINDOW|SWP_NOACTIVATE); + } + else SetWindowPos(hwndDlg, 0, (screen.right-screen.left)/2- (550)/2,(screen.bottom-screen.top)/2- (400)/2, (550), (400), SWP_NOZORDER |SWP_HIDEWINDOW|SWP_NOACTIVATE); + + if (!g_Settings.TabsEnable && pActive && pActive->hWnd && DBGetContactSettingByte(NULL, "Chat", "CascadeWindows", 1)) { + RECT rcThis, rcNew; + int dwFlag = SWP_NOZORDER|SWP_NOACTIVATE; + if (!IsWindowVisible ((HWND)wParam)) + dwFlag |= SWP_HIDEWINDOW; + + GetWindowRect(hwndDlg, &rcThis); + GetWindowRect(pActive->hWnd, &rcNew); + + { + int offset = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME); + SetWindowPos((HWND) hwndDlg, 0, rcNew.left + offset, rcNew.top + offset, rcNew.right-rcNew.left, rcNew.bottom-rcNew.top, dwFlag); + } } } + break; + + case GC_SAVEWNDPOS: + { + WINDOWPLACEMENT wp = { 0 }; + + wp.length = sizeof(wp); + GetWindowPlacement(hwndDlg, &wp); + g_Settings.iX = wp.rcNormalPosition.left; + g_Settings.iY = wp.rcNormalPosition.top; + g_Settings.iWidth = wp.rcNormalPosition.right - wp.rcNormalPosition.left; + g_Settings.iHeight = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top; + + if (!lParam) { + si->iX = g_Settings.iX; + si->iY = g_Settings.iY; + si->iWidth = g_Settings.iWidth; + si->iHeight = g_Settings.iHeight; + } } + break; + + case WM_SIZE: + { + UTILRESIZEDIALOG urd; + + if (wParam == SIZE_MAXIMIZED) + PostMessage(hwndDlg, GC_SCROLLTOBOTTOM, 0, 0); + + if (IsIconic(hwndDlg)) break; + SendMessage(si->hwndStatus, WM_SIZE, 0, 0); + ZeroMemory(&urd,sizeof(urd)); + urd.cbSize=sizeof(urd); + urd.hInstance=g_hInst; + urd.hwndDlg=hwndDlg; + urd.lParam=(LPARAM)si; + urd.lpTemplate=MAKEINTRESOURCEA(IDD_CHANNEL); + urd.pfnResizer=RoomWndResize; + CallService(MS_UTILS_RESIZEDIALOG,0,(LPARAM)&urd); + + InvalidateRect(si->hwndStatus, NULL, TRUE); + RedrawWindow(GetDlgItem(hwndDlg,IDC_MESSAGE), NULL, NULL, RDW_INVALIDATE); + RedrawWindow(GetDlgItem(hwndDlg,IDOK), NULL, NULL, RDW_INVALIDATE); + SendMessage(hwndDlg,GC_SAVEWNDPOS,0,1); + } + break; + + case GC_REDRAWWINDOW: + InvalidateRect(hwndDlg, NULL, TRUE); + break; + + case GC_REDRAWLOG: + si->LastTime = 0; + if (si->pLog) { + LOGINFO * pLog = si->pLog; + if (si->iEventCount > 60) { + int index = 0; + while ( index < 59) { + if (pLog->next == NULL) + break; + + pLog = pLog->next; + if (si->iType != GCW_CHATROOM || !si->bFilterEnabled || (si->iLogFilterFlags&pLog->iType) != 0) + index++; + } + Log_StreamInEvent(hwndDlg, pLog, si, TRUE, FALSE); + mir_forkthread(phase2, si); + } + else Log_StreamInEvent(hwndDlg, si->pLogEnd, si, TRUE, FALSE); + } + else SendMessage(hwndDlg, GC_EVENT_CONTROL + WM_USER+500, WINDOW_CLEARLOG, 0); + break; + + case GC_REDRAWLOG2: + si->LastTime = 0; + if (si->pLog) + Log_StreamInEvent(hwndDlg, si->pLogEnd, si, TRUE, FALSE); + break; + + case GC_REDRAWLOG3: + si->LastTime = 0; + if (si->pLog) + Log_StreamInEvent(hwndDlg, si->pLogEnd, si, TRUE, TRUE); + break; + + case GC_ADDLOG: + if (si->pLogEnd) + Log_StreamInEvent(hwndDlg, si->pLog, si, FALSE, FALSE); + else + SendMessage(hwndDlg, GC_EVENT_CONTROL + WM_USER+500, WINDOW_CLEARLOG, 0); + break; + + case GC_SWITCHNEXTTAB: + { + int total = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)); + int i = TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TAB)); + if (i != -1 && total != -1 && total != 1) { + if (i < total -1) + i++; + else + i=0; + TabCtrl_SetCurSel(GetDlgItem(hwndDlg, IDC_TAB), i); + PostMessage(hwndDlg, GC_TABCLICKED, 0, 0 ); + } } + break; + + case GC_SWITCHPREVTAB: + { + int total = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)); + int i = TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TAB)); + if (i != -1 && total != -1 && total != 1) { + if (i > 0) + i--; + else + i=total-1; + TabCtrl_SetCurSel(GetDlgItem(hwndDlg, IDC_TAB), i); + PostMessage(hwndDlg, GC_TABCLICKED, 0, 0 ); + } } + break; + + case GC_SWITCHTAB: + { + int total = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)); + int i = TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TAB)); + if (i != -1 && total != -1 && total != 1 && i != lParam && total > lParam) { + TabCtrl_SetCurSel(GetDlgItem(hwndDlg, IDC_TAB), lParam); + PostMessage(hwndDlg, GC_TABCLICKED, 0, 0 ); + } } + break; + + case GC_REMOVETAB: + { + SESSION_INFO* s2; + int i = -1; + int tabId = 0; + SESSION_INFO* s1 = (SESSION_INFO*) lParam; + + tabId = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)); + + if (s1) { + if (tabId) { + for (i = 0; i < tabId; i++) { + int ii; + TCITEM tci = {0}; + tci.mask = TCIF_PARAM ; + ii = TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &tci); + if (ii != -1) { + s2 = (SESSION_INFO*)tci.lParam; + if (s1 == s2) + goto END_REMOVETAB; + } } } + } + else i = TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TAB)); + +END_REMOVETAB: + if (i != -1 && i < tabId) { + TCITEM id = {0}; + SESSION_INFO* s; + TabCtrl_DeleteItem(GetDlgItem(hwndDlg, IDC_TAB), i); + id.mask = TCIF_PARAM; + if (!TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &id)) { + if (!TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i-1, &id)) { + SendMessage(hwndDlg, WM_CLOSE, 0, 0); + break; + } } + + s = (SESSION_INFO*)id.lParam; + if (s) + ShowRoom(s, (WPARAM)WINDOW_VISIBLE, wParam == 1?FALSE:TRUE); + } } + break; + + case GC_ADDTAB: + { + TCITEM tci; + int tabId; + WORD w = 0; + int i = 0; + int indexfound = -1; + int lastlocked = -1; + BOOL bFound = FALSE; + SESSION_INFO* s2; + SESSION_INFO* s1 = (SESSION_INFO*) lParam; + + tci.mask = TCIF_PARAM ; + tabId = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)); + + // does the tab already exist? + for (i = 0; i < tabId; i++) { + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &tci); + s2 = (SESSION_INFO*)tci.lParam; + if (s2) { + if (s1 == s2 && !bFound) { + if (!bFound) { + bFound = TRUE; + indexfound = i; + } } + + w = DBGetContactSettingWord(s2->hContact, s2->pszModule, "TabPosition", 0); + if (w) + lastlocked = (int)w; + } } + + w = 0; + + if (!bFound) { // create a new tab + int insertat; + TCHAR szTemp [30]; + + lstrcpyn(szTemp, s1->ptszName, 21); + if (lstrlen(s1->ptszName) >20) + lstrcpyn(szTemp+20, _T("..."), 4); + + tci.mask = TCIF_TEXT|TCIF_PARAM ; + tci.pszText = szTemp; + tci.lParam = lParam; + + // determine insert position + w = DBGetContactSettingWord(s1->hContact, s1->pszModule, "TabPosition", 0); + if (wParam == -1) + insertat = w == 0?tabId:(int)w-1; + else + insertat = (int)wParam; + + w = TabCtrl_InsertItem( GetDlgItem(hwndDlg, IDC_TAB), insertat, &tci ); + SendMessage(hwndDlg, GC_FIXTABICONS, 0, (LPARAM)s1); + } + + if (wParam == -1) { + if (bFound) + TabCtrl_SetCurSel(GetDlgItem(hwndDlg, IDC_TAB), indexfound); + else + TabCtrl_SetCurSel(GetDlgItem(hwndDlg, IDC_TAB), w); + } } + break; + + case GC_FIXTABICONS: + { + SESSION_INFO* s = (SESSION_INFO*) lParam; + SESSION_INFO* s2; + int i; + if (s) { + TCITEM tci; + int tabId; + + tabId = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)); + for (i = 0; i < tabId; i++) { + tci.mask = TCIF_PARAM|TCIF_IMAGE ; + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &tci); + s2 = (SESSION_INFO*)tci.lParam; + if (s2 && s == s2) { + int image = 0; + if (!(s2->wState&GC_EVENT_HIGHLIGHT)) { + image = s2->wStatus==ID_STATUS_ONLINE?MM_FindModule(s2->pszModule)->OnlineIconIndex:MM_FindModule(s2->pszModule)->OfflineIconIndex; + if (s2->wState&STATE_TALK) + image++; + } + + if (tci.iImage != image) { + tci.mask = TCIF_IMAGE ; + tci.iImage = image; + TabCtrl_SetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &tci); + } } } + } + else RedrawWindow(GetDlgItem(hwndDlg, IDC_TAB), NULL, NULL, RDW_INVALIDATE); + } + break; + + case GC_SETMESSAGEHIGHLIGHT: + { + SESSION_INFO* s = (SESSION_INFO*) lParam; + SESSION_INFO* s2; + int i; + if (s) { + TCITEM tci; + int tabId; + + tabId = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)); + for (i = 0; i < tabId; i++) { + tci.mask = TCIF_PARAM ; + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &tci); + s2 = (SESSION_INFO*)tci.lParam; + if (s2 && s == s2) { // highlight + s2->wState |= GC_EVENT_HIGHLIGHT; + if (SM_FindSession(si->ptszID, si->pszModule) == s2) + si->wState = s2->wState; + SendMessage(hwndDlg, GC_FIXTABICONS, 0, (LPARAM)s2); + if (DBGetContactSettingByte(NULL, "Chat", "FlashWindowHighlight", 0) != 0 && GetActiveWindow() != hwndDlg && GetForegroundWindow() != hwndDlg) + SetTimer(hwndDlg, TIMERID_FLASHWND, 900, NULL); + break; + } } + } + else RedrawWindow(GetDlgItem(hwndDlg, IDC_TAB), NULL, NULL, RDW_INVALIDATE); + } + break; + + case GC_SETTABHIGHLIGHT: + { + SESSION_INFO* s = (SESSION_INFO*) lParam; + SESSION_INFO* s2; + int i; + if (s) { + TCITEM tci; + int tabId; + + tabId = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)); + for (i = 0; i < tabId; i++) { + tci.mask = TCIF_PARAM ; + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &tci); + s2 = (SESSION_INFO*)tci.lParam; + if (s2 && s == s2) { // highlight + SendMessage(hwndDlg, GC_FIXTABICONS, 0, (LPARAM)s2); + if (g_Settings.FlashWindow && GetActiveWindow() != hwndDlg && GetForegroundWindow() != hwndDlg) + SetTimer(hwndDlg, TIMERID_FLASHWND, 900, NULL); + break; + } } + } + else RedrawWindow(GetDlgItem(hwndDlg, IDC_TAB), NULL, NULL, RDW_INVALIDATE); + } + break; + + case GC_TABCHANGE: + SetWindowLongPtr(hwndDlg,GWLP_USERDATA,(LONG_PTR)lParam); + PostMessage(hwndDlg, GC_SCROLLTOBOTTOM, 0, 0); + break; + + case GC_TABCLICKED: + { + int i; + i = TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TAB)); + if (i != -1) { + SESSION_INFO* s; + TCITEM id = {0}; + + id.mask = TCIF_PARAM; + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &id); + s = (SESSION_INFO*)id.lParam; + if (s) { + if (s->wState&STATE_TALK) { + s->wState &= ~STATE_TALK; + DBWriteContactSettingWord(s->hContact, s->pszModule ,"ApparentMode",(LPARAM) 0); + } + + if (s->wState&GC_EVENT_HIGHLIGHT) { + s->wState &= ~GC_EVENT_HIGHLIGHT; + + if (CallService(MS_CLIST_GETEVENT, (WPARAM)s->hContact, (LPARAM)0)) + CallService(MS_CLIST_REMOVEEVENT, (WPARAM)s->hContact, (LPARAM)"chaticon"); + } + + SendMessage(hwndDlg, GC_FIXTABICONS, 0, (LPARAM)s); + if (!s->hWnd) { + ShowRoom(s, (WPARAM)WINDOW_VISIBLE, TRUE); + SendMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0 ); + } } } } + break; + + case GC_DROPPEDTAB: + { + TCITEM tci; + SESSION_INFO* s; + int begin = (int)lParam; + int end = (int) wParam; + int i, tabId; + if (begin == end) + break; + + tci.mask = TCIF_PARAM ; + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB),begin, &tci); + s = (SESSION_INFO*)tci.lParam; + if (s) { + TabCtrl_DeleteItem(GetDlgItem(hwndDlg, IDC_TAB), begin); + + SendMessage(hwndDlg, GC_ADDTAB, end, (LPARAM)s); + + // fix the "fixed" positions + tabId = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)); + for (i = 0; i< tabId ; i++) { + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB),i, &tci); + s = (SESSION_INFO*)tci.lParam; + if (s && s->hContact && DBGetContactSettingWord(s->hContact, s->pszModule, "TabPosition", 0) != 0) + DBWriteContactSettingWord(s->hContact, s->pszModule, "TabPosition", (WORD)(i + 1)); + } } } + break; + + case GC_SESSIONNAMECHANGE: + { + TCITEM tci; + int i; + int tabId; + SESSION_INFO* s2; + SESSION_INFO* s1 = (SESSION_INFO* ) lParam; + + tabId = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)); + for (i = 0; i < tabId; i++) { + int j; + tci.mask = TCIF_PARAM ; + j = TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &tci); + if (j != -1) { + s2 = (SESSION_INFO*)tci.lParam; + if (s1 == s2) { + tci.mask = TCIF_TEXT ; + tci.pszText = s1->ptszName; + TabCtrl_SetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &tci); + } } } } + break; + + case GC_ACKMESSAGE: + SendDlgItemMessage(hwndDlg,IDC_MESSAGE,EM_SETREADONLY,FALSE,0); + SendDlgItemMessage(hwndDlg,IDC_MESSAGE,WM_SETTEXT,0, (LPARAM)""); + return TRUE; + + case WM_CTLCOLORLISTBOX: + SetBkColor((HDC) wParam, g_Settings.crUserListBGColor); + return (INT_PTR) hListBkgBrush; + + case WM_MEASUREITEM: + { + MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *) lParam; + if (mis->CtlType == ODT_MENU) + { + return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); + } else + { + int ih = GetTextPixelSize( _T("AQGgl'"), g_Settings.UserListFont,FALSE); + int ih2 = GetTextPixelSize( _T("AQGg'"), g_Settings.UserListHeadingsFont,FALSE); + int font = ih > ih2?ih:ih2; + int height = DBGetContactSettingByte(NULL, "Chat", "NicklistRowDist", 12); + + // make sure we have space for icon! + if (g_Settings.ShowContactStatus) + font = font > 16 ? font : 16; + + mis->itemHeight = height > font?height:font; + } + return TRUE; + } + + case WM_DRAWITEM: + { + DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *) lParam; + if (dis->CtlType == ODT_MENU) + { + return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); + } else + if (dis->CtlID == IDC_LIST) { + HFONT hFont, hOldFont; + HICON hIcon; + int offset; + int height; + int index = dis->itemID; + USERINFO * ui = SM_GetUserFromIndex(si->ptszID, si->pszModule, index); + if (ui) { + int x_offset = 2; + + height = dis->rcItem.bottom - dis->rcItem.top; + + if (height&1) + height++; + if (height == 10) + offset = 0; + else + offset = height/2 - 4; + hIcon = SM_GetStatusIcon(si, ui); + hFont = (ui->iStatusEx == 0) ? g_Settings.UserListFont : g_Settings.UserListHeadingsFont; + hOldFont = (HFONT) SelectObject(dis->hDC, hFont); + SetBkMode(dis->hDC, TRANSPARENT); + + if (dis->itemAction == ODA_FOCUS && dis->itemState & ODS_SELECTED) + FillRect(dis->hDC, &dis->rcItem, hListSelectedBkgBrush); + else //if (dis->itemState & ODS_INACTIVE) + FillRect(dis->hDC, &dis->rcItem, hListBkgBrush); + + if (g_Settings.ShowContactStatus && g_Settings.ContactStatusFirst && ui->ContactStatus) { + HICON hIcon = LoadSkinnedProtoIcon(si->pszModule, ui->ContactStatus); + DrawIconEx(dis->hDC, x_offset, dis->rcItem.top+offset-3,hIcon,16,16,0,NULL, DI_NORMAL); + x_offset += 18; + } + DrawIconEx(dis->hDC,x_offset, dis->rcItem.top + offset,hIcon,10,10,0,NULL, DI_NORMAL); + x_offset += 12; + if (g_Settings.ShowContactStatus && !g_Settings.ContactStatusFirst && ui->ContactStatus) { + HICON hIcon = LoadSkinnedProtoIcon(si->pszModule, ui->ContactStatus); + DrawIconEx(dis->hDC, x_offset, dis->rcItem.top+offset-3,hIcon,16,16,0,NULL, DI_NORMAL); + x_offset += 18; + } + + SetTextColor(dis->hDC, ui->iStatusEx == 0?g_Settings.crUserListColor:g_Settings.crUserListHeadingsColor); + TextOut(dis->hDC, dis->rcItem.left+x_offset, dis->rcItem.top, ui->pszNick, lstrlen(ui->pszNick)); + SelectObject(dis->hDC, hOldFont); + + if (si->pAccPropServicesForNickList) + { + wchar_t *nick = mir_t2u(ui->pszNick); + si->pAccPropServicesForNickList->lpVtbl->SetHwndPropStr(si->pAccPropServicesForNickList, + GetDlgItem(hwndDlg,IDC_LIST), OBJID_CLIENT, dis->itemID+1, PROPID_ACC_NAME, nick); + mir_free(nick); + } + } + return TRUE; + } } + + case GC_UPDATENICKLIST: + { + int i = SendMessage(GetDlgItem(hwndDlg, IDC_LIST), LB_GETTOPINDEX, 0, 0); + SendMessage(GetDlgItem(hwndDlg, IDC_LIST), LB_SETCOUNT, si->nUsersInNicklist, 0); + SendMessage(GetDlgItem(hwndDlg, IDC_LIST), LB_SETTOPINDEX, i, 0); + SendMessage(hwndDlg, GC_UPDATETITLE, 0, 0); + } + break; + + case GC_EVENT_CONTROL + WM_USER+500: + { + switch(wParam) { + case SESSION_OFFLINE: + SendMessage(hwndDlg, GC_UPDATESTATUSBAR, 0, 0); + SendMessage(si->hWnd, GC_UPDATENICKLIST, (WPARAM)0, (LPARAM)0); + return TRUE; + + case SESSION_ONLINE: + SendMessage(hwndDlg, GC_UPDATESTATUSBAR, 0, 0); + return TRUE; + + case WINDOW_HIDDEN: + SendMessage(hwndDlg, GC_CLOSEWINDOW, 0, 0); + return TRUE; + + case WINDOW_CLEARLOG: + SetDlgItemText(hwndDlg, IDC_LOG, _T("")); + return TRUE; + + case SESSION_TERMINATE: + SendMessage(hwndDlg,GC_SAVEWNDPOS,0,0); + if (DBGetContactSettingByte(NULL, "Chat", "SavePosition", 0)) { + DBWriteContactSettingDword(si->hContact, "Chat", "roomx", si->iX); + DBWriteContactSettingDword(si->hContact, "Chat", "roomy", si->iY); + DBWriteContactSettingDword(si->hContact, "Chat", "roomwidth" , si->iWidth); + DBWriteContactSettingDword(si->hContact, "Chat", "roomheight", si->iHeight); + } + if (CallService(MS_CLIST_GETEVENT, (WPARAM)si->hContact, (LPARAM)0)) + CallService(MS_CLIST_REMOVEEVENT, (WPARAM)si->hContact, (LPARAM)"chaticon"); + si->wState &= ~STATE_TALK; + DBWriteContactSettingWord(si->hContact, si->pszModule ,"ApparentMode",(LPARAM) 0); + SendMessage(hwndDlg, GC_CLOSEWINDOW, 0, 0); + return TRUE; + + case WINDOW_MINIMIZE: + ShowWindow(hwndDlg, SW_MINIMIZE); + goto LABEL_SHOWWINDOW; + + case WINDOW_MAXIMIZE: + ShowWindow(hwndDlg, SW_MAXIMIZE); + goto LABEL_SHOWWINDOW; + + case SESSION_INITDONE: + if (DBGetContactSettingByte(NULL, "Chat", "PopupOnJoin", 0)!=0) + return TRUE; + // fall through + case WINDOW_VISIBLE: + if (IsIconic(hwndDlg)) + ShowWindow(hwndDlg, SW_NORMAL); +LABEL_SHOWWINDOW: + SendMessage(hwndDlg, WM_SIZE, 0, 0); + SendMessage(hwndDlg, GC_REDRAWLOG, 0, 0); + SendMessage(hwndDlg, GC_UPDATENICKLIST, 0, 0); + SendMessage(hwndDlg, GC_UPDATESTATUSBAR, 0, 0); + ShowWindow(hwndDlg, SW_SHOW); + SendMessage(hwndDlg, WM_SIZE, 0, 0); + SetForegroundWindow(hwndDlg); + return TRUE; + } } + break; + + case GC_SPLITTERMOVED: + { POINT pt; + RECT rc; + RECT rcLog; + BOOL bFormat = IsWindowVisible(GetDlgItem(hwndDlg,IDC_SMILEY)); + + static int x = 0; + + GetWindowRect(GetDlgItem(hwndDlg,IDC_LOG),&rcLog); + if ((HWND)lParam==GetDlgItem(hwndDlg,IDC_SPLITTERX)) { + int oldSplitterX; + GetClientRect(hwndDlg,&rc); + pt.x=wParam; pt.y=0; + ScreenToClient(hwndDlg,&pt); + + oldSplitterX=si->iSplitterX; + si->iSplitterX=rc.right-pt.x+1; + if (si->iSplitterX < 35) + si->iSplitterX=35; + if (si->iSplitterX > rc.right-rc.left-35) + si->iSplitterX = rc.right-rc.left-35; + g_Settings.iSplitterX = si->iSplitterX; + } + else if ((HWND)lParam==GetDlgItem(hwndDlg,IDC_SPLITTERY)) { + int oldSplitterY; + GetClientRect(hwndDlg,&rc); + pt.x=0; pt.y=wParam; + ScreenToClient(hwndDlg,&pt); + + oldSplitterY=si->iSplitterY; + si->iSplitterY=bFormat?rc.bottom-pt.y+1:rc.bottom-pt.y+20; + if (si->iSplitterY<63) + si->iSplitterY=63; + if (si->iSplitterY>rc.bottom-rc.top-40) + si->iSplitterY = rc.bottom-rc.top-40; + g_Settings.iSplitterY = si->iSplitterY; + } + if (x==2) { + PostMessage(hwndDlg,WM_SIZE,0,0); + x = 0; + } + else x++; + } + break; + + case GC_FIREHOOK: + if (lParam) { + GCHOOK* gch = (GCHOOK *) lParam; + NotifyEventHooks(hSendEvent,0,(WPARAM)gch); + if ( gch->pDest ) { + mir_free( gch->pDest->pszID ); + mir_free( gch->pDest->pszModule ); + mir_free( gch->pDest ); + } + mir_free( gch->ptszText ); + mir_free( gch->ptszUID ); + mir_free( gch ); + } + break; + + case GC_CHANGEFILTERFLAG: + si->iLogFilterFlags = lParam; + break; + + case GC_SHOWFILTERMENU: + { + RECT rc; + HWND hwnd = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_FILTER), hwndDlg, FilterWndProc, (LPARAM)si); + TranslateDialogDefault(hwnd); + GetWindowRect(GetDlgItem(hwndDlg, IDC_FILTER), &rc); + SetWindowPos(hwnd, HWND_TOP, rc.left-85, (IsWindowVisible(GetDlgItem(hwndDlg, IDC_FILTER))||IsWindowVisible(GetDlgItem(hwndDlg, IDC_BOLD)))?rc.top-206:rc.top-186, 0, 0, SWP_NOSIZE|SWP_SHOWWINDOW); + } + break; + + case GC_SHOWCOLORCHOOSER: + { + HWND ColorWindow; + RECT rc; + BOOL bFG = lParam == IDC_COLOR?TRUE:FALSE; + COLORCHOOSER * pCC = mir_alloc(sizeof(COLORCHOOSER)); + + GetWindowRect(GetDlgItem(hwndDlg, bFG?IDC_COLOR:IDC_BKGCOLOR), &rc); + pCC->hWndTarget = GetDlgItem(hwndDlg, IDC_MESSAGE); + pCC->pModule = MM_FindModule(si->pszModule); + pCC->xPosition = rc.left+3; + pCC->yPosition = IsWindowVisible(GetDlgItem(hwndDlg, IDC_COLOR))?rc.top-1:rc.top+20; + pCC->bForeground = bFG; + pCC->si = si; + + ColorWindow= CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_COLORCHOOSER), hwndDlg, DlgProcColorToolWindow, (LPARAM) pCC); + } + break; + + case GC_SCROLLTOBOTTOM: + { + SCROLLINFO si = { 0 }; + if ((GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_LOG), GWL_STYLE) & WS_VSCROLL) != 0) { + CHARRANGE sel; + si.cbSize = sizeof(si); + si.fMask = SIF_PAGE | SIF_RANGE; + GetScrollInfo(GetDlgItem(hwndDlg, IDC_LOG), SB_VERT, &si); + si.fMask = SIF_POS; + si.nPos = si.nMax - si.nPage + 1; + SetScrollInfo(GetDlgItem(hwndDlg, IDC_LOG), SB_VERT, &si, TRUE); + sel.cpMin = sel.cpMax = GetRichTextLength(GetDlgItem(hwndDlg, IDC_LOG)); + SendMessage(GetDlgItem(hwndDlg, IDC_LOG), EM_EXSETSEL, 0, (LPARAM) & sel); + PostMessage(GetDlgItem(hwndDlg, IDC_LOG), WM_VSCROLL, MAKEWPARAM(SB_BOTTOM, 0), 0); + } } + break; + + case WM_TIMER: + if (wParam == TIMERID_FLASHWND) + FlashWindow(hwndDlg, TRUE); + break; + + case WM_ACTIVATE: + if (LOWORD(wParam) != WA_ACTIVE) + break; + + //fall through + case WM_MOUSEACTIVATE: + { + WINDOWPLACEMENT wp = { 0 }; + + wp.length = sizeof(wp); + GetWindowPlacement(hwndDlg, &wp); + g_Settings.iX = wp.rcNormalPosition.left; + g_Settings.iY = wp.rcNormalPosition.top; + g_Settings.iWidth = wp.rcNormalPosition.right - wp.rcNormalPosition.left; + g_Settings.iHeight = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top; + + if (g_Settings.TabsEnable) { + int i = TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TAB)); + if (i != -1) { + SESSION_INFO* s; + TCITEM tci; + + tci.mask = TCIF_PARAM; + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &tci); + s = (SESSION_INFO*) tci.lParam; + if (s) { + s->wState &= ~GC_EVENT_HIGHLIGHT; + s->wState &= ~STATE_TALK; + SendMessage(hwndDlg, GC_FIXTABICONS, 0, (LPARAM)s); + } } } + + if (uMsg != WM_ACTIVATE) + SetFocus(GetDlgItem(hwndDlg,IDC_MESSAGE)); + + SetActiveSession(si->ptszID, si->pszModule); + + if (KillTimer(hwndDlg, TIMERID_FLASHWND)) + FlashWindow(hwndDlg, FALSE); + if (DBGetContactSettingWord(si->hContact, si->pszModule ,"ApparentMode", 0) != 0) + DBWriteContactSettingWord(si->hContact, si->pszModule ,"ApparentMode",(LPARAM) 0); + if (CallService(MS_CLIST_GETEVENT, (WPARAM)si->hContact, (LPARAM)0)) + CallService(MS_CLIST_REMOVEEVENT, (WPARAM)si->hContact, (LPARAM)"chaticon"); + } + break; + + case WM_NOTIFY: + { + LPNMHDR pNmhdr; + + pNmhdr = (LPNMHDR)lParam; + switch (pNmhdr->code) { + case NM_RCLICK: + if (pNmhdr->idFrom == IDC_TAB ) { + int i = TabCtrl_GetCurSel(pNmhdr->hwndFrom); + + if (i != -1) { + SESSION_INFO* s; + HMENU hSubMenu; + TCHITTESTINFO tci = {0}; + TCITEM id = {0}; + int i = 0; + id.mask = TCIF_PARAM; + + tci.pt.x=(short)LOWORD(GetMessagePos()); + tci.pt.y=(short)HIWORD(GetMessagePos()); + tci.flags = TCHT_ONITEM; + + ScreenToClient(GetDlgItem(hwndDlg, IDC_TAB), &tci.pt); + i = TabCtrl_HitTest(pNmhdr->hwndFrom, &tci); + if (i != -1) { + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &id); + s = (SESSION_INFO*)id.lParam; + + ClientToScreen(GetDlgItem(hwndDlg, IDC_TAB), &tci.pt); + hSubMenu = GetSubMenu(g_hMenu, 5); + TranslateMenu(hSubMenu); + if (s) { + WORD w = DBGetContactSettingWord(s->hContact, s->pszModule, "TabPosition", 0); + if ( w == 0) + CheckMenuItem(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND|MF_UNCHECKED); + else + CheckMenuItem(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND|MF_CHECKED); + } + else CheckMenuItem(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND|MF_UNCHECKED); + + switch (TrackPopupMenu(hSubMenu, TPM_RETURNCMD, tci.pt.x, tci.pt.y, 0, hwndDlg, NULL)) { + case ID_CLOSE: + if (TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TAB)) == i) + PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_CLOSE, BN_CLICKED), 0); + else + TabCtrl_DeleteItem(GetDlgItem(hwndDlg, IDC_TAB), i); + break; + + case ID_CLOSEOTHER: + { + int tabId = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)) - 1; + if (tabId > 0) { + if (TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TAB)) != i) + if (s) + ShowRoom(s, WINDOW_VISIBLE, TRUE); + + for(tabId; tabId >= 0; tabId --) { + if (tabId == i) + continue; + + TabCtrl_DeleteItem(GetDlgItem(hwndDlg, IDC_TAB), tabId); + } } } + break; + + case ID_LOCKPOSITION: + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), i, &id); + if (!(GetMenuState(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND)&MF_CHECKED)) { + if (s->hContact) + DBWriteContactSettingWord(s->hContact, s->pszModule, "TabPosition", (WORD)(i + 1)); + } + else DBDeleteContactSetting(s->hContact, s->pszModule, "TabPosition"); + break; + } } } } + break; + + case EN_MSGFILTER: + if (pNmhdr->idFrom == IDC_LOG && ((MSGFILTER *) lParam)->msg == WM_RBUTTONUP) { + CHARRANGE sel, all = { 0, -1 }; + POINT pt; + UINT uID = 0; + HMENU hMenu = 0; + TCHAR pszWord[4096]; + + pt.x = (short) LOWORD(((ENLINK *) lParam)->lParam); + pt.y = (short) HIWORD(((ENLINK *) lParam)->lParam); + ClientToScreen(pNmhdr->hwndFrom, &pt); + + { // fixing stuff for searches + long iCharIndex, iLineIndex, iChars, start, end, iRes; + POINTL ptl; + + pszWord[0] = '\0'; + ptl.x = (LONG)pt.x; + ptl.y = (LONG)pt.y; + ScreenToClient(GetDlgItem(hwndDlg, IDC_LOG), (LPPOINT)&ptl); + iCharIndex = SendMessage(GetDlgItem(hwndDlg, IDC_LOG), EM_CHARFROMPOS, 0, (LPARAM)&ptl); + if (iCharIndex < 0) + break; + iLineIndex = SendMessage(GetDlgItem(hwndDlg, IDC_LOG), EM_EXLINEFROMCHAR, 0, (LPARAM)iCharIndex); + iChars = SendMessage(GetDlgItem(hwndDlg, IDC_LOG), EM_LINEINDEX, (WPARAM)iLineIndex, 0 ); + start = SendMessage(GetDlgItem(hwndDlg, IDC_LOG), EM_FINDWORDBREAK, WB_LEFT, iCharIndex);//-iChars; + end = SendMessage(GetDlgItem(hwndDlg, IDC_LOG), EM_FINDWORDBREAK, WB_RIGHT, iCharIndex);//-iChars; + + if (end - start > 0) { + TEXTRANGE tr; + CHARRANGE cr; + static TCHAR szTrimString[] = _T(":;,.!?\'\"><()[]- \r\n"); + ZeroMemory(&tr, sizeof(TEXTRANGE)); + + cr.cpMin = start; + cr.cpMax = end; + tr.chrg = cr; + tr.lpstrText = pszWord; + iRes = SendMessage( GetDlgItem(hwndDlg, IDC_LOG), EM_GETTEXTRANGE, 0, (LPARAM)&tr); + + if (iRes > 0) { + int iLen = lstrlen(pszWord)-1; + while(iLen >= 0 && _tcschr(szTrimString, pszWord[iLen])) { + pszWord[iLen] = _T('\0'); + iLen--; + } } } } + + uID = CreateGCMenu(hwndDlg, &hMenu, 1, pt, si, NULL, pszWord); + switch (uID) { + case 0: + PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0 ); + break; + + case ID_COPYALL: + SendMessage(pNmhdr->hwndFrom, EM_EXGETSEL, 0, (LPARAM) & sel); + SendMessage(pNmhdr->hwndFrom, EM_EXSETSEL, 0, (LPARAM) & all); + SendMessage(pNmhdr->hwndFrom, WM_COPY, 0, 0); + SendMessage(pNmhdr->hwndFrom, EM_EXSETSEL, 0, (LPARAM) & sel); + PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0 ); + break; + + case ID_CLEARLOG: + { + SESSION_INFO* s = SM_FindSession(si->ptszID, si->pszModule); + if (s) + { + SetDlgItemText(hwndDlg, IDC_LOG, _T("")); + LM_RemoveAll(&s->pLog, &s->pLogEnd); + s->iEventCount = 0; + s->LastTime = 0; + si->iEventCount = 0; + si->LastTime = 0; + si->pLog = s->pLog; + si->pLogEnd = s->pLogEnd; + PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0 ); + } } + break; + + case ID_SEARCH_GOOGLE: + { + char szURL[4096]; + if (pszWord[0]) { + mir_snprintf( szURL, sizeof( szURL ), "http://www.google.com/search?q=" TCHAR_STR_PARAM, pszWord ); + CallService(MS_UTILS_OPENURL, 1, (LPARAM) szURL); + } + PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0 ); + } + break; + + case ID_SEARCH_WIKIPEDIA: + { + char szURL[4096]; + if (pszWord[0]) { + mir_snprintf( szURL, sizeof( szURL ), "http://en.wikipedia.org/wiki/" TCHAR_STR_PARAM, pszWord ); + CallService(MS_UTILS_OPENURL, 1, (LPARAM) szURL); + } + PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0 ); + } + break; + + default: + PostMessage(hwndDlg, WM_MOUSEACTIVATE, 0, 0 ); + DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_LOGMENU, NULL, NULL, (LPARAM)uID); + break; + } + DestroyGCMenu(&hMenu, 5); + } + break; + + case EN_LINK: + if (pNmhdr->idFrom == IDC_LOG) { + switch (((ENLINK *) lParam)->msg) { + case WM_RBUTTONDOWN: + case WM_LBUTTONUP: + case WM_LBUTTONDBLCLK: + { + TEXTRANGE tr; + CHARRANGE sel; + char* pszUrl; + + SendMessage(pNmhdr->hwndFrom, EM_EXGETSEL, 0, (LPARAM) & sel); + if (sel.cpMin != sel.cpMax) + break; + tr.chrg = ((ENLINK *) lParam)->chrg; + tr.lpstrText = mir_alloc(sizeof(TCHAR)*(tr.chrg.cpMax - tr.chrg.cpMin + 1)); + SendMessage(pNmhdr->hwndFrom, EM_GETTEXTRANGE, 0, (LPARAM) & tr); + pszUrl = mir_t2a( tr.lpstrText ); + + if (((ENLINK *) lParam)->msg == WM_RBUTTONDOWN) { + HMENU hSubMenu; + POINT pt; + + hSubMenu = GetSubMenu(g_hMenu, 2); + TranslateMenu(hSubMenu); + pt.x = (short) LOWORD(((ENLINK *) lParam)->lParam); + pt.y = (short) HIWORD(((ENLINK *) lParam)->lParam); + ClientToScreen(((NMHDR *) lParam)->hwndFrom, &pt); + switch (TrackPopupMenu(hSubMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL)) { + case ID_NEW: + CallService(MS_UTILS_OPENURL, 1, (LPARAM) pszUrl); + break; + + case ID_CURR: + CallService(MS_UTILS_OPENURL, 0, (LPARAM) pszUrl); + break; + + case ID_COPY: + { + HGLOBAL hData; + if (!OpenClipboard(hwndDlg)) + break; + EmptyClipboard(); + hData = GlobalAlloc(GMEM_MOVEABLE, sizeof(TCHAR)*(lstrlen(tr.lpstrText) + 1)); + lstrcpy(( TCHAR* )GlobalLock(hData), tr.lpstrText); + GlobalUnlock(hData); + SetClipboardData(CF_UNICODETEXT, hData); + CloseClipboard(); + SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); + break; + } } + mir_free(tr.lpstrText); + mir_free(pszUrl); + return TRUE; + } + + CallService(MS_UTILS_OPENURL, 1, (LPARAM) pszUrl); + SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); + mir_free(tr.lpstrText); + mir_free(pszUrl); + break; + } } } + break; + + case TTN_NEEDTEXT: + if (pNmhdr->idFrom == (UINT_PTR)GetDlgItem(hwndDlg,IDC_LIST)) + { + LPNMTTDISPINFO lpttd = (LPNMTTDISPINFO)lParam; + POINT p; + int item; + USERINFO * ui; + SESSION_INFO* parentdat =(SESSION_INFO*)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); + + GetCursorPos( &p ); + ScreenToClient(GetDlgItem(hwndDlg, IDC_LIST), &p); + item = LOWORD(SendMessage(GetDlgItem(hwndDlg, IDC_LIST), LB_ITEMFROMPOINT, 0, MAKELPARAM(p.x, p.y))); + ui = SM_GetUserFromIndex(parentdat->ptszID, parentdat->pszModule, item); + if ( ui != NULL ) { + static TCHAR ptszBuf[ 1024 ]; + mir_sntprintf( ptszBuf, SIZEOF(ptszBuf), _T("%s: %s\r\n%s: %s\r\n%s: %s"), + TranslateT( "Nick name" ), ui->pszNick, + TranslateT( "Unique id" ), ui->pszUID, + TranslateT( "Status" ), TM_WordToString( parentdat->pStatuses, ui->Status )); + lpttd->lpszText = ptszBuf; + } } + break; + } } + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDC_LIST: + if (HIWORD(wParam) == LBN_DBLCLK) { + TVHITTESTINFO hti; + int item; + USERINFO * ui; + + hti.pt.x=(short)LOWORD(GetMessagePos()); + hti.pt.y=(short)HIWORD(GetMessagePos()); + ScreenToClient(GetDlgItem(hwndDlg, IDC_LIST),&hti.pt); + + item = LOWORD(SendMessage(GetDlgItem(hwndDlg, IDC_LIST), LB_ITEMFROMPOINT, 0, MAKELPARAM(hti.pt.x, hti.pt.y))); + ui = SM_GetUserFromIndex(si->ptszID, si->pszModule, item); + if (ui) { + if (GetKeyState(VK_SHIFT) & 0x8000) { + LRESULT lResult = (LRESULT)SendMessage(GetDlgItem(hwndDlg, IDC_MESSAGE), EM_GETSEL, (WPARAM)NULL, (LPARAM)NULL); + int start = LOWORD(lResult); + TCHAR* pszName = (TCHAR*)alloca(sizeof(TCHAR)*(lstrlen(ui->pszUID) + 3)); + if (start == 0) + mir_sntprintf(pszName, lstrlen(ui->pszUID)+3, _T("%s: "), ui->pszUID); + else + mir_sntprintf(pszName, lstrlen(ui->pszUID)+2, _T("%s "), ui->pszUID); + + SendMessage( GetDlgItem(hwndDlg, IDC_MESSAGE), EM_REPLACESEL, FALSE, (LPARAM) pszName ); + PostMessage( hwndDlg, WM_MOUSEACTIVATE, 0, 0 ); + } + else DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_PRIVMESS, ui->pszUID, NULL, (LPARAM)NULL); + } + + return TRUE; + } + + if ( HIWORD(wParam) == LBN_KILLFOCUS ) + RedrawWindow(GetDlgItem(hwndDlg, IDC_LIST), NULL, NULL, RDW_INVALIDATE); + break; + + case IDOK: + { + char* pszRtf; + TCHAR* ptszText, *p1; + if (!IsWindowEnabled(GetDlgItem(hwndDlg,IDOK))) + break; + + pszRtf = Message_GetFromStream(hwndDlg, si); + SM_AddCommand(si->ptszID, si->pszModule, pszRtf); + ptszText = DoRtfToTags(pszRtf, si); + p1 = _tcschr(ptszText, '\0'); + + //remove trailing linebreaks + while ( p1 > ptszText && (*p1 == '\0' || *p1 == '\r' || *p1 == '\n')) { + *p1 = '\0'; + p1--; + } + + if ( MM_FindModule(si->pszModule)->bAckMsg ) { + EnableWindow(GetDlgItem(hwndDlg,IDC_MESSAGE),FALSE); + SendDlgItemMessage(hwndDlg,IDC_MESSAGE,EM_SETREADONLY,TRUE,0); + } + else SendDlgItemMessage(hwndDlg,IDC_MESSAGE,WM_SETTEXT,0,(LPARAM)_T("")); + + EnableWindow(GetDlgItem(hwndDlg,IDOK),FALSE); + + DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_MESSAGE, NULL, ptszText, (LPARAM)NULL); + mir_free(pszRtf); + mir_free(ptszText); + SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); + } + break; + + case IDC_SHOWNICKLIST: + if (!IsWindowEnabled(GetDlgItem(hwndDlg,IDC_SHOWNICKLIST))) + break; + if (si->iType == GCW_SERVER) + break; + + si->bNicklistEnabled = !si->bNicklistEnabled; + + SendDlgItemMessage(hwndDlg,IDC_SHOWNICKLIST,BM_SETIMAGE,IMAGE_ICON,(LPARAM)LoadIconEx( si->bNicklistEnabled ? "nicklist" : "nicklist2", FALSE )); + SendMessage(hwndDlg, GC_SCROLLTOBOTTOM, 0, 0); + SendMessage(hwndDlg, WM_SIZE, 0, 0); + break; + + case IDC_MESSAGE: + EnableWindow(GetDlgItem(hwndDlg, IDOK), GetRichTextLength(GetDlgItem(hwndDlg, IDC_MESSAGE)) != 0); + break; + + case IDC_SMILEY: + { + SMADD_SHOWSEL3 smaddInfo; + RECT rc; + + GetWindowRect(GetDlgItem(hwndDlg, IDC_SMILEY), &rc); + + smaddInfo.cbSize = sizeof(SMADD_SHOWSEL3); + smaddInfo.hwndTarget = GetDlgItem(hwndDlg, IDC_MESSAGE); + smaddInfo.targetMessage = EM_REPLACESEL; + smaddInfo.targetWParam = TRUE; + smaddInfo.Protocolname = si->pszModule; + smaddInfo.Direction = 3; + smaddInfo.xPosition = rc.left+3; + smaddInfo.yPosition = rc.top-1; + smaddInfo.hContact = si->hContact; + smaddInfo.hwndParent = hwndDlg; + + if (SmileyAddInstalled) + CallService(MS_SMILEYADD_SHOWSELECTION, 0, (LPARAM) &smaddInfo); + } + break; + + case IDC_HISTORY: + { + TCHAR szFile[MAX_PATH]; + TCHAR szName[MAX_PATH]; + TCHAR szFolder[MAX_PATH]; + MODULEINFO * pInfo = MM_FindModule(si->pszModule); + + if (!IsWindowEnabled(GetDlgItem(hwndDlg,IDC_HISTORY))) + break; + + if ( pInfo ) { + TCHAR *szModName = NULL; + mir_sntprintf(szName, MAX_PATH, _T("%s"), pInfo->ptszModDispName ? pInfo->ptszModDispName : (szModName = mir_a2t(si->pszModule))); + mir_free(szModName); + ValidateFilename(szName); + mir_sntprintf(szFolder, MAX_PATH, _T("%s\\%s"), g_Settings.pszLogDir, szName); + mir_sntprintf(szName, MAX_PATH, _T("%s.log"), si->ptszID); + ValidateFilename(szName); + mir_sntprintf(szFile, MAX_PATH, _T("%s\\%s"), szFolder, szName); + ShellExecute(hwndDlg, _T("open"), szFile, NULL, NULL, SW_SHOW); + } } + break; + + case IDC_CLOSE: + SendMessage(hwndDlg, GC_REMOVETAB, 0, 0); + break; + + case IDC_CHANMGR: + if (!IsWindowEnabled(GetDlgItem(hwndDlg,IDC_CHANMGR))) + break; + DoEventHookAsync(hwndDlg, si->ptszID, si->pszModule, GC_USER_CHANMGR, NULL, NULL, (LPARAM)NULL); + break; + + case IDC_FILTER: + if (!IsWindowEnabled(GetDlgItem(hwndDlg,IDC_FILTER))) + break; + + si->bFilterEnabled = !si->bFilterEnabled; + SendDlgItemMessage(hwndDlg,IDC_FILTER,BM_SETIMAGE,IMAGE_ICON,(LPARAM)LoadIconEx( si->bFilterEnabled ? "filter" : "filter2", FALSE )); + if (si->bFilterEnabled && DBGetContactSettingByte(NULL, "Chat", "RightClickFilter", 0) == 0) { + SendMessage(hwndDlg, GC_SHOWFILTERMENU, 0, 0); + break; + } + SendMessage(hwndDlg, GC_REDRAWLOG, 0, 0); + break; + + case IDC_BKGCOLOR: + { + CHARFORMAT2 cf; + + cf.cbSize = sizeof(CHARFORMAT2); + cf.dwEffects = 0; + + if (!IsWindowEnabled(GetDlgItem(hwndDlg,IDC_BKGCOLOR))) + break; + + if (IsDlgButtonChecked(hwndDlg, IDC_BKGCOLOR )) { + if (DBGetContactSettingByte(NULL, "Chat", "RightClickFilter", 0) == 0) + SendMessage(hwndDlg, GC_SHOWCOLORCHOOSER, 0, (LPARAM)IDC_BKGCOLOR); + else if (si->bBGSet) { + cf.dwMask = CFM_BACKCOLOR; + cf.crBackColor = MM_FindModule(si->pszModule)->crColors[si->iBG]; + SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + } } + else { + cf.dwMask = CFM_BACKCOLOR; + cf.crBackColor = (COLORREF)DBGetContactSettingDword(NULL, "Chat", "ColorMessageBG", GetSysColor(COLOR_WINDOW)); + SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + } } + break; + + case IDC_COLOR: + { + CHARFORMAT2 cf; + cf.cbSize = sizeof(CHARFORMAT2); + cf.dwEffects = 0; + + if (!IsWindowEnabled(GetDlgItem(hwndDlg,IDC_COLOR))) + break; + + if (IsDlgButtonChecked(hwndDlg, IDC_COLOR )) { + if (DBGetContactSettingByte(NULL, "Chat", "RightClickFilter", 0) == 0) + SendMessage(hwndDlg, GC_SHOWCOLORCHOOSER, 0, (LPARAM)IDC_COLOR); + else if (si->bFGSet) { + cf.dwMask = CFM_COLOR; + cf.crTextColor = MM_FindModule(si->pszModule)->crColors[si->iFG]; + SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + } } + else { + COLORREF cr; + + LoadMsgDlgFont(17, NULL, &cr); + cf.dwMask = CFM_COLOR; + cf.crTextColor = cr; + SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + } } + break; + + case IDC_BOLD: + case IDC_ITALICS: + case IDC_UNDERLINE: + { + CHARFORMAT2 cf; + cf.cbSize = sizeof(CHARFORMAT2); + cf.dwMask = CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE; + cf.dwEffects = 0; + + if (LOWORD(wParam) == IDC_BOLD && !IsWindowEnabled(GetDlgItem(hwndDlg,IDC_BOLD))) + break; + if (LOWORD(wParam) == IDC_ITALICS && !IsWindowEnabled(GetDlgItem(hwndDlg,IDC_ITALICS))) + break; + if (LOWORD(wParam) == IDC_UNDERLINE && !IsWindowEnabled(GetDlgItem(hwndDlg,IDC_UNDERLINE))) + break; + if (IsDlgButtonChecked(hwndDlg, IDC_BOLD)) + cf.dwEffects |= CFE_BOLD; + if (IsDlgButtonChecked(hwndDlg, IDC_ITALICS)) + cf.dwEffects |= CFE_ITALIC; + if (IsDlgButtonChecked(hwndDlg, IDC_UNDERLINE)) + cf.dwEffects |= CFE_UNDERLINE; + + SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + } } + break; + + case WM_KEYDOWN: + SetFocus(GetDlgItem(hwndDlg, IDC_MESSAGE)); + break; + + case WM_MOVE: + SendMessage(hwndDlg,GC_SAVEWNDPOS,0,1); + break; + + case WM_GETMINMAXINFO: + { + MINMAXINFO* mmi = (MINMAXINFO*)lParam; + mmi->ptMinTrackSize.x = si->iSplitterX + 43; + if (mmi->ptMinTrackSize.x < 350) + mmi->ptMinTrackSize.x = 350; + + mmi->ptMinTrackSize.y = si->iSplitterY + 80; + } + break; + + case WM_LBUTTONDBLCLK: + if (LOWORD(lParam) < 30) + PostMessage(hwndDlg, GC_SCROLLTOBOTTOM, 0, 0); + break; + + case WM_CLOSE: + if (g_Settings.TabsEnable && g_Settings.TabRestore && lParam != 1) { + SESSION_INFO* s; + TCITEM id = {0}; + int j = TabCtrl_GetItemCount(GetDlgItem(hwndDlg, IDC_TAB)) - 1; + id.mask = TCIF_PARAM; + for(j; j >= 0; j--) { + TabCtrl_GetItem(GetDlgItem(hwndDlg, IDC_TAB), j, &id); + s = (SESSION_INFO*)id.lParam; + if (s) + TabM_AddTab(s->ptszID, s->pszModule); + } } + + SendMessage(hwndDlg, GC_CLOSEWINDOW, 0, 0); + break; + + case GC_CLOSEWINDOW: + if (g_Settings.TabsEnable) + SM_SetTabbedWindowHwnd(0, 0); + DestroyWindow(hwndDlg); + break; + + case WM_DESTROY: + SendMessage(hwndDlg,GC_SAVEWNDPOS,0,0); + + si->hWnd = NULL; + si->wState &= ~STATE_TALK; + DestroyWindow(si->hwndStatus); + si->hwndStatus = NULL; + + if (si->hwndTooltip != NULL) { + HWND hNickList = GetDlgItem(hwndDlg,IDC_LIST); + TOOLINFO ti = { 0 }; + ti.cbSize = sizeof(TOOLINFO); + ti.uId = (UINT_PTR)hNickList; + ti.hwnd = hNickList; + SendMessage( si->hwndTooltip, TTM_DELTOOL, 0, (LPARAM)(LPTOOLINFO)&ti ); + } + DestroyWindow( si->hwndTooltip ); + si->hwndTooltip = NULL; + if (si->pAccPropServicesForNickList) si->pAccPropServicesForNickList->lpVtbl->Release(si->pAccPropServicesForNickList); + SetWindowLongPtr(hwndDlg,GWLP_USERDATA,0); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_SPLITTERX),GWLP_WNDPROC,(LONG_PTR)OldSplitterProc); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_SPLITTERY),GWLP_WNDPROC,(LONG_PTR)OldSplitterProc); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_LIST),GWLP_WNDPROC,(LONG_PTR)OldNicklistProc); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_TAB),GWLP_WNDPROC,(LONG_PTR)OldTabProc); + SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_UNSUBCLASSED, 0, 0); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_MESSAGE),GWLP_WNDPROC,(LONG_PTR)OldMessageProc); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_LOG),GWLP_WNDPROC,(LONG_PTR)OldLogProc); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_FILTER),GWLP_WNDPROC,(LONG_PTR)OldFilterButtonProc); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_COLOR),GWLP_WNDPROC,(LONG_PTR)OldFilterButtonProc); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_BKGCOLOR),GWLP_WNDPROC,(LONG_PTR)OldFilterButtonProc); + break; + } + return(FALSE); +} -- cgit v1.2.3