From bd1e3d8fe219dcbc55584d95dfba6ddae0d01d2c Mon Sep 17 00:00:00 2001 From: Rozhuk Ivan Date: Thu, 27 Nov 2014 00:03:13 +0000 Subject: SimpleStatusMsg: code cleanup git-svn-id: http://svn.miranda-ng.org/main/trunk@11112 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/SimpleStatusMsg/src/msgbox.cpp | 3270 ++++++++++++++++---------------- 1 file changed, 1636 insertions(+), 1634 deletions(-) (limited to 'plugins/SimpleStatusMsg/src/msgbox.cpp') diff --git a/plugins/SimpleStatusMsg/src/msgbox.cpp b/plugins/SimpleStatusMsg/src/msgbox.cpp index 57399207fe..d71d7aa763 100644 --- a/plugins/SimpleStatusMsg/src/msgbox.cpp +++ b/plugins/SimpleStatusMsg/src/msgbox.cpp @@ -1,1634 +1,1636 @@ -/* - -Simple Status Message plugin for Miranda IM -Copyright (C) 2006-2011 Bartosz 'Dezeath' Białek, (C) 2005 Harven - -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., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "commonheaders.h" - -#define I_ICON_DEL 0 -#define I_ICON_HIST 1 -#define I_ICON_MSG 2 -#define I_ICON_ADD 3 -#define I_ICON_CLEAR 4 - -struct MsgBoxData -{ - char *m_szProto; - int m_iStatus; - int m_iInitialStatus; - int m_iStatusModes; - int m_iStatusMsgModes; - HWND status_cbex; - HWND recent_cbex; - HICON icon[5]; - HIMAGELIST status_icons; - HIMAGELIST other_icons; - int m_iCountdown; - int curr_sel_msg; - int m_iDlgFlags; - int max_hist_msgs; - int num_def_msgs; - BOOL m_bPredefChanged; - BOOL m_bIsMsgHistory; - BOOL m_bOnStartup; -}; - -typedef struct -{ - clock_t ctLastDblClk; - UINT uClocksPerDblClk; -} MsgEditCtrl; - -HIMAGELIST AddOtherIconsToImageList(struct MsgBoxData *data) -{ - HIMAGELIST himlIcons = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 4, 0); - - for (int i = 0; i < 5; ++i) - ImageList_AddIcon(himlIcons, data->icon[i]); - - return himlIcons; -} - -int statusicon_nr[9]; - -HIMAGELIST AddStatusIconsToImageList(const char *szProto, int status_flags) -{ - int num_icons = 1; - int i; - - for (i = 0; i < 9; ++i) - if (Proto_Status2Flag(ID_STATUS_ONLINE + i) & status_flags) - num_icons++; - - HIMAGELIST himlIcons = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, num_icons, 0); - HICON hicon = LoadSkinnedProtoIcon(szProto, ID_STATUS_OFFLINE); - ImageList_AddIcon(himlIcons, hicon); - Skin_ReleaseIcon(hicon); - statusicon_nr[0] = 0; - - int j = 1; - for (i = 0; i < 9; ++i) { - if (Proto_Status2Flag(ID_STATUS_ONLINE + i) & status_flags) { - hicon = LoadSkinnedProtoIcon(szProto, ID_STATUS_ONLINE + i); - ImageList_AddIcon(himlIcons, hicon); - Skin_ReleaseIcon(hicon); - statusicon_nr[i + 1] = j; - j++; - } - else - statusicon_nr[i + 1] = 0; - } - - return himlIcons; -} - -HWND WINAPI CreateStatusComboBoxEx(HWND hwndDlg, struct MsgBoxData *data) -{ - int j = 0, cur_sel = 0; - TCHAR *status_desc; - - if (!(data->m_iDlgFlags & DLG_SHOW_STATUS)) - return NULL; - - HWND handle = CreateWindowEx(0, WC_COMBOBOXEX, NULL, - WS_TABSTOP | CBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST, - 0, 0, 0, 240, hwndDlg, NULL, g_hInst, NULL); - - COMBOBOXEXITEM cbei = {0}; - if (!(data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS)) - cbei.mask = CBEIF_LPARAM | CBEIF_TEXT; - else - cbei.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; - - if (data->m_bOnStartup) - status_desc = (TCHAR *)TranslateT(""); - else - status_desc = (TCHAR *)TranslateT(""); - cbei.iItem = j; - cbei.pszText = (LPTSTR)status_desc; - cbei.cchTextMax = sizeof(status_desc); - - if (data->m_szProto || data->m_iStatus == ID_STATUS_CURRENT) { - if (data->m_bOnStartup) - j = GetStartupStatus(data->m_szProto) - ID_STATUS_OFFLINE; - else - j = GetCurrentStatus(data->m_szProto) - ID_STATUS_OFFLINE; - } - else - j = data->m_iStatus - ID_STATUS_OFFLINE; - - if (j < 0 || j > 9) - j = 0; // valid status modes only - - if (data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS) { - cbei.iImage = statusicon_nr[j]; - cbei.iSelectedImage = statusicon_nr[j]; - } - j = 0; - cbei.lParam = (LPARAM)ID_STATUS_CURRENT; - - if (ID_STATUS_CURRENT == data->m_iInitialStatus) - cur_sel = j; - - SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei); - j++; - - for (int i = 0; i < 10; ++i) { - if ((Proto_Status2Flag(ID_STATUS_OFFLINE + i) & data->m_iStatusModes) || i == 0) { - status_desc = pcli->pfnGetStatusModeDescription(ID_STATUS_OFFLINE + i, 0); - cbei.iItem = j; - cbei.pszText = (LPTSTR)status_desc; - cbei.cchTextMax = sizeof(status_desc); - if (data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS) { - cbei.iImage = j - 1; - cbei.iSelectedImage = j - 1; - } - cbei.lParam = (LPARAM)ID_STATUS_OFFLINE + i; - - if (ID_STATUS_OFFLINE + i == data->m_iInitialStatus) - cur_sel = j; - - if (SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei) == -1) - break; - j++; - } - } - - if (!data->m_szProto && (data->m_iDlgFlags & DLG_SHOW_STATUS_PROFILES) && ServiceExists(MS_SS_GETPROFILECOUNT)) { - int defaultProfile; - int profileCount = (int)CallService(MS_SS_GETPROFILECOUNT, (WPARAM)&defaultProfile, 0); - - for (int i = 0; i < profileCount; ++i) { - TCHAR tszProfileName[128]; - CallService(MS_SS_GETPROFILENAME, (WPARAM)i, (LPARAM)tszProfileName); - - cbei.iItem = j; - cbei.pszText = (LPTSTR)tszProfileName; - cbei.cchTextMax = SIZEOF(tszProfileName); - if (data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS) { - int k = GetCurrentStatus(NULL) - ID_STATUS_OFFLINE; - if (k < 0 || k > 9) - k = 0; // valid status modes only - cbei.iImage = statusicon_nr[k]; - cbei.iSelectedImage = statusicon_nr[k]; - } - cbei.lParam = (LPARAM)40083 + i; - - mir_free(status_desc); - - if (SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei) == -1) - break; - j++; - } - } - - if (!(data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS)) - SendMessage(handle, CB_SETITEMHEIGHT, 0, (LPARAM)16); - else { - SendMessage(handle, CB_SETITEMHEIGHT, 0, (LPARAM)18); - SendMessage(handle, CBEM_SETIMAGELIST, 0, (LPARAM)data->status_icons); - } - SetWindowPos(handle, NULL, 11, 11, 112, 20, SWP_NOACTIVATE); - SendMessage(handle, CB_SETCURSEL, (WPARAM)cur_sel, 0); - SendMessage(handle, CB_SETITEMHEIGHT, (WPARAM)-1, (LPARAM)16); - - return handle; -} - -#define HISTORY_MSG 1 -#define CLEAR_HISTORY 2 -#define PREDEFINED_MSG 3 -#define ADD_MSG 4 -#define DELETE_SELECTED 5 -#define DEFAULT_MSG 6 - -HWND WINAPI CreateRecentComboBoxEx(HWND hwndDlg, struct MsgBoxData *data) -{ - int i, j; - char buff[16]; - BOOL found = FALSE; - DBVARIANT dbv; - TCHAR text[128]; - - HWND handle = CreateWindowEx(0, WC_COMBOBOXEX, NULL, - WS_TABSTOP | CBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST, - 0, 0, 0, 300, hwndDlg, NULL, g_hInst, NULL); - - COMBOBOXEXITEM cbei = {0}; - if (!(data->m_iDlgFlags & DLG_SHOW_LIST_ICONS)) - cbei.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_INDENT; - else - cbei.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; - - j = db_get_w(NULL, "SimpleStatusMsg", "LMMsg", 1); - - for (i = 1; i <= data->max_hist_msgs; ++i) { - // history messages - if (j < 1) - j = data->max_hist_msgs; - mir_snprintf(buff, SIZEOF(buff), "SMsg%d", j); - j--; - if (!db_get_ts(NULL, "SimpleStatusMsg", buff, &dbv)) { - if (dbv.ptszVal != NULL && dbv.ptszVal != '\0') { - found = TRUE; - cbei.iItem = -1; - cbei.pszText = (LPTSTR)dbv.ptszVal; - cbei.cchTextMax = sizeof(dbv.ptszVal); - if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { - cbei.iImage = I_ICON_HIST; - cbei.iSelectedImage = I_ICON_HIST; - } - else - cbei.iIndent = 0; - cbei.lParam = MAKELPARAM(HISTORY_MSG, j + 1); - - if (SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei) == -1) { - db_free(&dbv); - break; - } - } - db_free(&dbv); - } - } - - data->m_bIsMsgHistory = found; - - if ((data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { - if (found) { - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), TRUE); - } - else if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); - } - else if (data->m_iDlgFlags & DLG_SHOW_BUTTONS_INLIST) { - if (found) { - if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { - mir_sntprintf(text, SIZEOF(text), TranslateT("Clear history")); - cbei.iImage = I_ICON_CLEAR; - cbei.iSelectedImage = I_ICON_CLEAR; - } - else { - mir_sntprintf(text, SIZEOF(text), _T("## %s ##"), TranslateT("Clear history")); - cbei.iIndent = 1; - } - cbei.iItem = -1; - cbei.pszText = (LPTSTR)text; - cbei.cchTextMax = SIZEOF(text); - cbei.lParam = MAKELPARAM(CLEAR_HISTORY, 0); - SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei); - } - - cbei.iItem = -1; - if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { - mir_sntprintf(text, SIZEOF(text), TranslateT("Add to predefined")); - cbei.iImage = I_ICON_ADD; - cbei.iSelectedImage = I_ICON_ADD; - } - else { - mir_sntprintf(text, SIZEOF(text), _T("## %s ##"), TranslateT("Add to predefined")); - cbei.iIndent = 1; - } - cbei.pszText = (LPTSTR)text; - cbei.cchTextMax = SIZEOF(text); - cbei.lParam = MAKELPARAM(ADD_MSG, 0); - SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei); - - if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { - mir_sntprintf(text, SIZEOF(text), TranslateT("Delete selected")); - cbei.iImage = I_ICON_DEL; - cbei.iSelectedImage = I_ICON_DEL; - } - else { - cbei.iIndent = 1; - mir_sntprintf(text, SIZEOF(text), _T("## %s ##"), TranslateT("Delete selected")); - } - cbei.iItem = -1; - cbei.pszText = (LPTSTR)text; - cbei.cchTextMax = SIZEOF(text); - cbei.lParam = MAKELPARAM(DELETE_SELECTED, 0); - SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei); - } - - if ((data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { - if (data->num_def_msgs || found) { - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), TRUE); - } - else if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); - } - - for (i = 1; i <= data->num_def_msgs; ++i) { - // predefined messages - mir_snprintf(buff, SIZEOF(buff), "DefMsg%d", i); - if (!db_get_ts(NULL, "SimpleStatusMsg", buff, &dbv)) { - if (dbv.ptszVal) { - if (!lstrlen(dbv.ptszVal)) { - db_free(&dbv); - continue; - } - - cbei.iItem = -1; - cbei.pszText = (LPTSTR)dbv.ptszVal; - cbei.cchTextMax = sizeof(dbv.ptszVal); - if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { - cbei.iImage = I_ICON_MSG; - cbei.iSelectedImage = I_ICON_MSG; - } - else - cbei.iIndent = 0; - cbei.lParam = MAKELPARAM(PREDEFINED_MSG, i); - - if (SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei) == -1) - break; - } - db_free(&dbv); - } - } - - if (db_get_b(NULL, "SimpleStatusMsg", "PutDefInList", 0)) { - cbei.iItem = -1; - cbei.pszText = (LPTSTR)GetDefaultMessage(data->m_iStatus); - cbei.cchTextMax = sizeof(GetDefaultMessage(data->m_iStatus)); - if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { - cbei.iImage = I_ICON_MSG; - cbei.iSelectedImage = I_ICON_MSG; - } - else - cbei.iIndent = 0; - cbei.lParam = MAKELPARAM(DEFAULT_MSG, 0); - - SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei); - } - - if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) - SendMessage(handle, CBEM_SETIMAGELIST, 0, (LPARAM)data->other_icons); - if (!(data->m_iDlgFlags & DLG_SHOW_STATUS)) { - SetWindowPos(handle, NULL, 11, 11, 290, 20, SWP_NOACTIVATE); - SendMessage(handle, CB_SETDROPPEDWIDTH, (WPARAM)290, 0); - } - else { - SetWindowPos(handle, NULL, 127, 11, 174, 20, SWP_NOACTIVATE); - SendMessage(handle, CB_SETDROPPEDWIDTH, (WPARAM)250, 0); - } - SendMessage(handle, CB_SETITEMHEIGHT, (WPARAM)-1, (LPARAM)16); - SendMessage(handle, CB_SETITEMHEIGHT, 0, (LPARAM)16); - - if (((data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) && !found && !data->num_def_msgs) - EnableWindow(handle, FALSE); - - if (((!(data->m_iDlgFlags & DLG_SHOW_BUTTONS)) && (!(data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) && (!(data->m_iDlgFlags & DLG_SHOW_BUTTONS_INLIST))) && !found && !data->num_def_msgs) - EnableWindow(handle, FALSE); - - return handle; -} - -VOID APIENTRY HandlePopupMenu(HWND hwnd, POINT pt, HWND edit_control) -{ - HMENU hmenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_EDITMENU)); - if (hmenu == NULL) - return; - - HMENU hmenuTrackPopup = GetSubMenu(hmenu, 0); - - TranslateMenu(hmenuTrackPopup); - - ClientToScreen(hwnd, (LPPOINT)&pt); - - LPDWORD sel_s = NULL, sel_e = NULL; - SendMessage(edit_control, EM_GETSEL, (WPARAM)&sel_s, (LPARAM)&sel_e); - if (sel_s == sel_e) { - EnableMenuItem(hmenuTrackPopup, IDM_COPY, MF_BYCOMMAND | MF_GRAYED); - EnableMenuItem(hmenuTrackPopup, IDM_CUT, MF_BYCOMMAND | MF_GRAYED); - } - if (SendMessage(edit_control, WM_GETTEXTLENGTH, 0, 0) == 0) - EnableMenuItem(hmenuTrackPopup, IDM_DELETE, MF_BYCOMMAND | MF_GRAYED); - - if (ServiceExists(MS_VARS_FORMATSTRING)) - DeleteMenu(hmenuTrackPopup, ID__VARIABLES, MF_BYCOMMAND); - else - DeleteMenu(hmenuTrackPopup, 8, MF_BYPOSITION); - - DeleteMenu(hmenuTrackPopup, 7, MF_BYPOSITION); - - int m_selection = TrackPopupMenu(hmenuTrackPopup, TPM_LEFTALIGN | TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, NULL); - switch (m_selection) { - case IDM_COPY: - SendMessage(edit_control, WM_COPY, 0, 0); - break; - - case IDM_CUT: - SendMessage(edit_control, WM_CUT, 0, 0); - break; - - case IDM_PASTE: - SendMessage(edit_control, WM_PASTE, 0, 0); - break; - - case IDM_SELECTALL: - SendMessage(edit_control, EM_SETSEL, 0, -1); - break; - - case IDM_DELETE: - SendMessage(edit_control, WM_SETTEXT, 0, (LPARAM)""); - SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_EDIT1, EN_CHANGE), (LPARAM)edit_control); - break; - - case ID__FORTUNEAWAYMSG: - CallService(MS_UTILS_OPENURL, 1, (LPARAM)"http://miranda-ng.org/"); - break; - - case ID__VARIABLES: - CallService(MS_UTILS_OPENURL, 1, (LPARAM)"http://miranda-ng.org/"); - break; - - case ID__VARIABLES_MOREVARIABLES: - { - VARHELPINFO vhi = {0}; - vhi.cbSize = sizeof(vhi); - vhi.flags = VHF_FULLDLG | VHF_SETLASTSUBJECT; - vhi.hwndCtrl = edit_control; - vhi.szSubjectDesc = NULL; - vhi.szExtraTextDesc = NULL; - CallService(MS_VARS_SHOWHELPEX, (WPARAM)hwnd, (LPARAM)&vhi); - break; - } - - default: - if (!OpenClipboard(GetParent(hwnd))) - break; - if (EmptyClipboard()) { - TCHAR item_string[128]; - int len; - - GetMenuString(hmenu, m_selection, (LPTSTR)&item_string, 128, MF_BYCOMMAND); - len = lstrlen(item_string); - if (len) { - LPTSTR lptstrCopy; - HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (len + 1) * sizeof(TCHAR)); - if (hglbCopy == NULL) { - CloseClipboard(); - break; - } - lptstrCopy = (LPTSTR)GlobalLock(hglbCopy); - memcpy(lptstrCopy, item_string, len * sizeof(TCHAR)); - lptstrCopy[len] = (TCHAR)0; - GlobalUnlock(hglbCopy); - - SetClipboardData(CF_UNICODETEXT, hglbCopy); - - } - } - CloseClipboard(); - SendMessage(edit_control, WM_PASTE, 0, 0); - break; - } - DestroyMenu(hmenu); -} - -static LRESULT CALLBACK EditBoxSubProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) { - case WM_CONTEXTMENU: - { - POINT pt = {(LONG)LOWORD(lParam), (LONG)HIWORD(lParam)}; - RECT rc; - GetClientRect(hwndDlg, &rc); - - if (pt.x == -1 && pt.y == -1) { - GetCursorPos(&pt); - if (!PtInRect(&rc, pt)) { - pt.x = rc.left + (rc.right - rc.left) / 2; - pt.y = rc.top + (rc.bottom - rc.top) / 2; - } - } - else - ScreenToClient(hwndDlg, &pt); - - if (PtInRect(&rc, pt)) - HandlePopupMenu(hwndDlg, pt, GetDlgItem(GetParent(hwndDlg), IDC_EDIT1)); - - return 0; - } - - case WM_CHAR: - if (wParam=='\n' && GetKeyState(VK_CONTROL) & 0x8000) { - PostMessage(GetParent(hwndDlg), WM_COMMAND, IDC_OK, 0); - return 0; - } - if (wParam == 1 && GetKeyState(VK_CONTROL) & 0x8000) { // Ctrl + A - SendMessage(hwndDlg, EM_SETSEL, 0, -1); - return 0; - } - if (wParam == 23 && GetKeyState(VK_CONTROL) & 0x8000) { // Ctrl + W - SendMessage(GetParent(hwndDlg), WM_COMMAND, IDC_CANCEL, 0); - return 0; - } - if (wParam == 127 && GetKeyState(VK_CONTROL) & 0x8000) { // Ctrl + Backspace - DWORD start, end; - TCHAR *text; - int textLen; - SendMessage(hwndDlg, EM_GETSEL, (WPARAM)&end, (LPARAM)(PDWORD)NULL); - SendMessage(hwndDlg, WM_KEYDOWN, VK_LEFT, 0); - SendMessage(hwndDlg, EM_GETSEL, (WPARAM)&start, (LPARAM)(PDWORD)NULL); - textLen = GetWindowTextLength(hwndDlg); - text = (TCHAR *)mir_alloc(sizeof(TCHAR) * (textLen + 1)); - GetWindowText(hwndDlg, text, textLen + 1); - MoveMemory(text + start, text + end, sizeof(TCHAR) * (textLen + 1 - end)); - SetWindowText(hwndDlg, text); - mir_free(text); - SendMessage(hwndDlg, EM_SETSEL, start, start); - SendMessage(GetParent(hwndDlg), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hwndDlg), EN_CHANGE), (LPARAM)hwndDlg); - return 0; - } - break; - - case WM_LBUTTONDBLCLK: - { - MsgEditCtrl *mec = (MsgEditCtrl *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - if (mec != NULL) { - mec->ctLastDblClk = clock(); - mec->uClocksPerDblClk = GetDoubleClickTime() * CLOCKS_PER_SEC / 1000; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)mec); - } - break; - } - - case WM_LBUTTONDOWN: - { - MsgEditCtrl *mec = (MsgEditCtrl *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - if (mec != NULL && UINT(clock() - mec->ctLastDblClk) < mec->uClocksPerDblClk) { - SendMessage(hwndDlg, EM_SETSEL, 0, -1); - return 0; - } - break; - } - - case WM_SETFOCUS: - { - MsgEditCtrl *mec = (MsgEditCtrl *)mir_calloc(sizeof(MsgEditCtrl)); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)mec); - break; - } - - case WM_KILLFOCUS: - { - MsgEditCtrl *mec = (MsgEditCtrl *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - mir_free(mec); - mec = NULL; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)mec); - break; - } - } - - return mir_callNextSubclass(hwndDlg, EditBoxSubProc, uMsg, wParam, lParam); -} - -int AddToPredefined(HWND hwndDlg, struct MsgBoxData *data) -{ - COMBOBOXEXITEM newitem = {0}; - int len = 0, num_items; - TCHAR msg[1024], text[1024]; - - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) - len = GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg)); - - if (!len) - return -1; - - num_items = SendMessage(data->recent_cbex, CB_GETCOUNT, 0, 0) - 1; - for (int i = 1; i <= data->num_def_msgs; i++, num_items--) { - newitem.mask = CBEIF_LPARAM | CBEIF_TEXT; - newitem.iItem = num_items; - newitem.cchTextMax = SIZEOF(text); - newitem.pszText = text; - - SendMessage(data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&newitem); - if (LOWORD(newitem.lParam) == PREDEFINED_MSG && !lstrcmp(text, msg)) - return num_items; - } - - data->num_def_msgs++; - data->m_bPredefChanged = TRUE; - - newitem.iItem = -1; - newitem.pszText = (LPTSTR)msg; - newitem.cchTextMax = SIZEOF(msg); - if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { - newitem.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; - newitem.iImage = I_ICON_MSG; - newitem.iSelectedImage = I_ICON_MSG; - } - else { - newitem.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_INDENT; - newitem.iIndent = 0; - } - newitem.lParam = MAKELPARAM(PREDEFINED_MSG, 0); - return SendMessage(data->recent_cbex, CBEM_INSERTITEM, 0, (LPARAM)&newitem); -} - -void ClearHistory(struct MsgBoxData *data, int cur_sel) -{ - COMBOBOXEXITEM histitem = {0}; - int i, num_items; - char text[16], buff2[80]; - - for (i = 1; i <= data->max_hist_msgs; i++) { - mir_snprintf(text, SIZEOF(text), "SMsg%d", i); - db_set_ts(NULL, "SimpleStatusMsg", text, _T("")); - } - db_set_s(NULL, "SimpleStatusMsg", "LastMsg", ""); - for (i = 0; i < accounts->count; i++) { - if (!IsAccountEnabled(accounts->pa[i])) - continue; - - if (!CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0)) - continue; - - if (!(CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) - continue; - - mir_snprintf(buff2, SIZEOF(buff2), "Last%sMsg", accounts->pa[i]->szModuleName); - db_set_s(NULL, "SimpleStatusMsg", buff2, ""); - } - db_set_w(NULL, "SimpleStatusMsg", "LMMsg", (WORD)data->max_hist_msgs); - SendMessage(data->recent_cbex, CB_SETCURSEL, -1, 0); - num_items = SendMessage(data->recent_cbex, CB_GETCOUNT, 0, 0); - if (num_items == CB_ERR) - return; - - if ((!(data->m_iDlgFlags & DLG_SHOW_BUTTONS)) && (!(data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT))) - SendMessage(data->recent_cbex, CBEM_DELETEITEM, (WPARAM)cur_sel, 0); - - for (i = num_items; i >= 0; i--) { - histitem.mask = CBEIF_LPARAM; - histitem.iItem = i; - SendMessage(data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); - if (LOWORD(histitem.lParam) == HISTORY_MSG) - SendMessage(data->recent_cbex, CBEM_DELETEITEM, (WPARAM)i, 0); - } -} - -void DisplayCharsCount(struct MsgBoxData *dlg_data, HWND hwndDlg) -{ - TCHAR msg[1024]; - TCHAR status_text[128]; - int len, lines = 1; - - if (dlg_data->m_iCountdown != -2) - return; - - len = GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg)); - if (db_get_b(NULL, "SimpleStatusMsg", "RemoveCR", 0)) { - int index, num_lines = SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), EM_GETLINECOUNT, 0, 0); - for (int i = 1; i < num_lines; ++i) { - index = SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), EM_LINEINDEX, (WPARAM)i, 0); - if (msg[index - 1] == '\n') - lines++; - } - } - mir_sntprintf(status_text, SIZEOF(status_text), TranslateT("OK (%d)"), len - (lines - 1)); - SendMessage(GetDlgItem(hwndDlg, IDC_OK), WM_SETTEXT, 0, (LPARAM)status_text); -} - -void SetEditControlText(struct MsgBoxData *data, HWND hwndDlg, int iStatus) -{ - int flags, fcursel = CB_ERR, num_start; - DBVARIANT dbv, dbv2; - char setting[80]; - - num_start = SendMessage(data->recent_cbex, CB_GETCOUNT, 0, 0); - num_start -= data->num_def_msgs + 1; - - mir_snprintf(setting, SIZEOF(setting), "%sFlags", data->m_szProto ? data->m_szProto : ""); - flags = db_get_b(NULL, "SimpleStatusMsg", (char *)StatusModeToDbSetting(iStatus, setting), STATUS_DEFAULT); - - if (flags & STATUS_LAST_MSG) { - if (data->m_szProto) - mir_snprintf(setting, SIZEOF(setting), "Last%sMsg", data->m_szProto); - else - mir_snprintf(setting, SIZEOF(setting), "LastMsg"); - - if (!db_get(NULL, "SimpleStatusMsg", setting, &dbv)) { - if (dbv.pszVal && strlen(dbv.pszVal)) { - if (!db_get_ts(NULL, "SimpleStatusMsg", dbv.pszVal, &dbv2)) { - if (dbv2.ptszVal && lstrlen(dbv2.ptszVal)) { - SetDlgItemText(hwndDlg, IDC_EDIT1, dbv2.ptszVal); - fcursel = SendMessage(data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)dbv2.ptszVal); - if (fcursel != CB_ERR) - SendMessage(data->recent_cbex, CB_SETCURSEL, (WPARAM)fcursel, 0); - } - db_free(&dbv2); - } - } - db_free(&dbv); - } - } - else if (flags & STATUS_DEFAULT_MSG) { - SetDlgItemText(hwndDlg, IDC_EDIT1, GetDefaultMessage(iStatus)); - - if (db_get_b(NULL, "SimpleStatusMsg", "PutDefInList", 0)) { - fcursel = SendMessage(data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)GetDefaultMessage(iStatus)); - if (fcursel != CB_ERR) - SendMessage(data->recent_cbex, CB_SETCURSEL, (WPARAM)fcursel, 0); - } - } - else if (flags & STATUS_THIS_MSG) { - if (data->m_szProto) - mir_snprintf(setting, SIZEOF(setting), "%sDefault", data->m_szProto); - else - mir_snprintf(setting, SIZEOF(setting), "Default"); - - if (!db_get_ts(NULL, "SRAway", StatusModeToDbSetting(iStatus, setting), &dbv)) { - SetDlgItemText(hwndDlg, IDC_EDIT1, dbv.ptszVal); - fcursel = SendMessage(data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)dbv.ptszVal); - if (fcursel != CB_ERR) - SendMessage(data->recent_cbex, CB_SETCURSEL, (WPARAM)fcursel, 0); - db_free(&dbv); - } - } - else if (flags & STATUS_LAST_STATUS_MSG) { - if (data->m_szProto) - mir_snprintf(setting, SIZEOF(setting), "%sMsg", data->m_szProto); - else - mir_snprintf(setting, SIZEOF(setting), "Msg"); - - if (!db_get_ts(NULL, "SRAway", StatusModeToDbSetting(iStatus, setting), &dbv)) { - SetDlgItemText(hwndDlg, IDC_EDIT1, dbv.ptszVal); - fcursel = SendMessage(data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)dbv.ptszVal); - if (fcursel != CB_ERR) - SendMessage(data->recent_cbex, CB_SETCURSEL, (WPARAM)fcursel, 0); - db_free(&dbv); - } - } - - if (fcursel != CB_ERR) - data->curr_sel_msg = fcursel; -} - -void ChangeDlgStatus(HWND hwndDlg, struct MsgBoxData *msgbox_data, int iStatus) -{ - TCHAR szTitle[256], szProtoName[128]; - BOOL bDisabled = msgbox_data->m_szProto && !(CallProtoService(msgbox_data->m_szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND); - - mir_sntprintf(szProtoName, SIZEOF(szProtoName), msgbox_data->m_szProto ? ProtoGetAccount(msgbox_data->m_szProto)->tszAccountName : TranslateT("global")); - if (iStatus == ID_STATUS_CURRENT) { - if (msgbox_data->m_bOnStartup) - mir_sntprintf(szTitle, SIZEOF(szTitle), TranslateT("%s message (%s)"), TranslateT(""), szProtoName); - else - mir_sntprintf(szTitle, SIZEOF(szTitle), TranslateT("%s message (%s)"), TranslateT(""), szProtoName); - } - else if (iStatus > ID_STATUS_CURRENT) { - TCHAR buff[128]; - - char buff1[128]; - CallService(MS_SS_GETPROFILENAME, iStatus - 40083, (LPARAM)buff1); - MultiByteToWideChar(CallService(MS_LANGPACK_GETCODEPAGE, 0, 0), 0, buff1, -1, buff, 128); - - mir_sntprintf(szTitle, SIZEOF(szTitle), TranslateT("%s message (%s)"), (TCHAR *)buff, szProtoName); - } - else - mir_sntprintf(szTitle, SIZEOF(szTitle), TranslateT("%s message (%s)"), pcli->pfnGetStatusModeDescription(iStatus, 0), szProtoName); - SetWindowText(hwndDlg, szTitle); - - if (iStatus == ID_STATUS_CURRENT) - iStatus = msgbox_data->m_bOnStartup ? GetStartupStatus(msgbox_data->m_szProto) : GetCurrentStatus(msgbox_data->m_szProto); - else if (iStatus > ID_STATUS_CURRENT) - iStatus = GetCurrentStatus(NULL); - - Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedProtoIcon(msgbox_data->m_szProto, iStatus))); - Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadSkinnedProtoIcon(msgbox_data->m_szProto, iStatus))); - - if (!bDisabled && ((Proto_Status2Flag(iStatus) & msgbox_data->m_iStatusMsgModes) - || (iStatus == ID_STATUS_OFFLINE && (Proto_Status2Flag(ID_STATUS_INVISIBLE) & msgbox_data->m_iStatusMsgModes)))) - { - int num_items = SendMessage(msgbox_data->recent_cbex, CB_GETCOUNT, 0, 0); - int fcursel = CB_ERR, num_start = num_items - msgbox_data->num_def_msgs - 1; - TCHAR msg[1024]; - - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) - EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT1), TRUE); - - if (!IsWindowEnabled(msgbox_data->recent_cbex) && num_items) - EnableWindow(msgbox_data->recent_cbex, TRUE); - - // TODO what if num_start <= 0 ? - if (GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg))) - fcursel = SendMessage(msgbox_data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)msg); - if (fcursel != CB_ERR) { - SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, fcursel, 0); - msgbox_data->curr_sel_msg = fcursel; - } - - if ((msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { - if (!GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg))) { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); - } - else if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); - if (num_items) { - if (msgbox_data->curr_sel_msg == -1) { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); - } - else { - COMBOBOXEXITEM cbitem = {0}; - cbitem.mask = CBEIF_LPARAM | CBEIF_TEXT; - cbitem.iItem = msgbox_data->curr_sel_msg; - cbitem.cchTextMax = SIZEOF(msg); - cbitem.pszText = msg; - SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&cbitem); - if (LOWORD(cbitem.lParam) == PREDEFINED_MSG) { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); - } - else if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); - - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), TRUE); - } - - if (msgbox_data->m_bIsMsgHistory && !IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), TRUE); - } - } - } - else { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) - EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT1), FALSE); - if (IsWindowEnabled(msgbox_data->recent_cbex)) - EnableWindow(msgbox_data->recent_cbex, FALSE); - - if ((msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); - } - } -} - -#define DM_SIMPAWAY_SHUTDOWN (WM_USER + 10) -#define DM_SIMPAWAY_CHANGEICONS (WM_USER + 11) - -INT_PTR CALLBACK AwayMsgBoxDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - struct MsgBoxData *msgbox_data = (struct MsgBoxData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - - switch (uMsg) { - case WM_INITDIALOG: - { - TCHAR szTitle[256], szFormat[256], szProtoName[128]; - struct MsgBoxInitData *init_data; - struct MsgBoxData *copy_init_data; - INITCOMMONCONTROLSEX icex = {0}; - BOOL bCurrentStatus = FALSE, bDisabled = FALSE; - - InitCommonControls(); - icex.dwSize = sizeof(INITCOMMONCONTROLSEX); - icex.dwICC = ICC_USEREX_CLASSES; - InitCommonControlsEx(&icex); - - TranslateDialogDefault(hwndDlg); - init_data = (struct MsgBoxInitData *)lParam; - GetWindowText(hwndDlg, szFormat, SIZEOF(szFormat)); - mir_sntprintf(szProtoName, SIZEOF(szProtoName), init_data->m_szProto ? ProtoGetAccount(init_data->m_szProto)->tszAccountName : TranslateT("global")); - - if (init_data->m_iStatus == ID_STATUS_CURRENT) { - if (init_data->m_bOnStartup) - mir_sntprintf(szTitle, SIZEOF(szTitle), szFormat, TranslateT(""), szProtoName); - else - mir_sntprintf(szTitle, SIZEOF(szTitle), szFormat, TranslateT(""), szProtoName); - } - else - mir_sntprintf(szTitle, SIZEOF(szTitle), szFormat, pcli->pfnGetStatusModeDescription(init_data->m_iStatus, 0), szProtoName); - SetWindowText(hwndDlg, szTitle); - - int icoStatus = ID_STATUS_OFFLINE; - if (init_data->m_iStatus == ID_STATUS_CURRENT) - icoStatus = init_data->m_bOnStartup ? GetStartupStatus(init_data->m_szProto) : GetCurrentStatus(init_data->m_szProto); - else - icoStatus = init_data->m_iStatus; - if (icoStatus < ID_STATUS_OFFLINE) - icoStatus = ID_STATUS_OFFLINE; - SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedProtoIcon(init_data->m_szProto, icoStatus)); - SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadSkinnedProtoIcon(init_data->m_szProto, icoStatus)); - - copy_init_data = (struct MsgBoxData *)mir_alloc(sizeof(struct MsgBoxData)); - - SendDlgItemMessage(hwndDlg, IDC_EDIT1, EM_LIMITTEXT, 1024, 0); - - HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwndDlg, DM_SIMPAWAY_SHUTDOWN); - HookEventMessage(ME_SKIN2_ICONSCHANGED, hwndDlg, DM_SIMPAWAY_CHANGEICONS); - - copy_init_data->num_def_msgs = db_get_w(NULL, "SimpleStatusMsg", "DefMsgCount", 0); - copy_init_data->max_hist_msgs = db_get_b(NULL, "SimpleStatusMsg", "MaxHist", 10); - copy_init_data->m_iDlgFlags = db_get_b(NULL, "SimpleStatusMsg", "DlgFlags", DLG_SHOW_DEFAULT); - copy_init_data->m_szProto = init_data->m_szProto; - copy_init_data->m_iStatus = init_data->m_iStatus; - copy_init_data->m_iStatusModes = init_data->m_iStatusModes; - copy_init_data->m_iStatusMsgModes = init_data->m_iStatusMsgModes; - copy_init_data->m_iInitialStatus = init_data->m_iStatus; - copy_init_data->m_bOnStartup = init_data->m_bOnStartup; - - //Load Icons - copy_init_data->icon[I_ICON_DEL] = LoadIconEx("cross"); - copy_init_data->icon[I_ICON_HIST] = LoadIconEx("recent"); - copy_init_data->icon[I_ICON_MSG] = LoadIconEx("predef"); - copy_init_data->icon[I_ICON_ADD] = LoadIconEx("add"); - copy_init_data->icon[I_ICON_CLEAR] = LoadIconEx("clear"); - if (copy_init_data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS) - copy_init_data->status_icons = AddStatusIconsToImageList(init_data->m_szProto, copy_init_data->m_iStatusModes); - if (copy_init_data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) - copy_init_data->other_icons = AddOtherIconsToImageList(copy_init_data); - - if ((copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { - SendMessage(GetDlgItem(hwndDlg, IDC_BADD), BUTTONADDTOOLTIP, (WPARAM)Translate("Add to predefined"), 0); - SendMessage(GetDlgItem(hwndDlg, IDC_BADD), BM_SETIMAGE, IMAGE_ICON, (LPARAM)copy_init_data->icon[I_ICON_ADD]); - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); - ShowWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); - - SendMessage(GetDlgItem(hwndDlg, IDC_BDEL), BUTTONADDTOOLTIP, (WPARAM)Translate("Delete selected"), 0); - SendMessage(GetDlgItem(hwndDlg, IDC_BDEL), BM_SETIMAGE, IMAGE_ICON, (LPARAM)copy_init_data->icon[I_ICON_DEL]); - ShowWindow(GetDlgItem(hwndDlg, IDC_BDEL), TRUE); - - SendMessage(GetDlgItem(hwndDlg, IDC_BCLEAR), BUTTONADDTOOLTIP, (WPARAM)Translate("Clear history"), 0); - SendMessage(GetDlgItem(hwndDlg, IDC_BCLEAR), BM_SETIMAGE, IMAGE_ICON, (LPARAM)copy_init_data->icon[I_ICON_CLEAR]); - ShowWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), TRUE); - - if (copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT) { - SendMessage(GetDlgItem(hwndDlg, IDC_BADD), BUTTONSETASFLATBTN, TRUE, 0); - SendMessage(GetDlgItem(hwndDlg, IDC_BDEL), BUTTONSETASFLATBTN, TRUE, 0); - SendMessage(GetDlgItem(hwndDlg, IDC_BCLEAR), BUTTONSETASFLATBTN, TRUE, 0); - } - } - else { - SetWindowPos(GetDlgItem(hwndDlg, IDC_OK), NULL, 52, 115, 0, 0, SWP_NOSIZE | SWP_NOZORDER); - SetWindowPos(GetDlgItem(hwndDlg, IDC_CANCEL), NULL, 160, 115, 0, 0, SWP_NOSIZE | SWP_NOZORDER); - ShowWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); - ShowWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); - ShowWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); - } - copy_init_data->status_cbex = CreateStatusComboBoxEx(hwndDlg, copy_init_data); - - if (copy_init_data->m_iStatus == ID_STATUS_CURRENT) { - if (copy_init_data->m_bOnStartup) - copy_init_data->m_iStatus = GetStartupStatus(copy_init_data->m_szProto); - else - copy_init_data->m_iStatus = GetCurrentStatus(copy_init_data->m_szProto); - if (copy_init_data->m_szProto == NULL) - bCurrentStatus = TRUE; - } - - copy_init_data->recent_cbex = CreateRecentComboBoxEx(hwndDlg, copy_init_data); - copy_init_data->curr_sel_msg = -1; - copy_init_data->m_bPredefChanged = FALSE; - - SetEditControlText(copy_init_data, hwndDlg, copy_init_data->m_iStatus); - if ((copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { - TCHAR msg[1024]; - - if (!GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); - - if (copy_init_data->curr_sel_msg == -1) { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); - } - else { - COMBOBOXEXITEM cbitem = {0}; - cbitem.mask = CBEIF_LPARAM | CBEIF_TEXT; - cbitem.iItem = copy_init_data->curr_sel_msg; - cbitem.cchTextMax = SIZEOF(msg); - cbitem.pszText = msg; - - SendMessage(copy_init_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&cbitem); - if (LOWORD(cbitem.lParam) == PREDEFINED_MSG) { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); - } - else if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); - } - } - - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)copy_init_data); - - if (copy_init_data->m_szProto && !(CallProtoService(copy_init_data->m_szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) - bDisabled = TRUE; - - if (!(((Proto_Status2Flag(copy_init_data->m_iStatus) & copy_init_data->m_iStatusMsgModes) - || (copy_init_data->m_iStatus == ID_STATUS_OFFLINE && (Proto_Status2Flag(ID_STATUS_INVISIBLE) & copy_init_data->m_iStatusMsgModes))) && !bDisabled)) - { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) - EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT1), FALSE); - if (IsWindowEnabled(copy_init_data->recent_cbex)) - EnableWindow(copy_init_data->recent_cbex, FALSE); - - if ((copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); - } - } - - if (db_get_b(NULL, "SimpleStatusMsg", "AutoClose", 1) && init_data->m_bOnEvent) { - copy_init_data->m_iCountdown = db_get_b(NULL, "SimpleStatusMsg", "DlgTime", 5); - SendMessage(hwndDlg, WM_TIMER, 0, 0); - SetTimer(hwndDlg, 1, 1000, 0); - } - else { - copy_init_data->m_iCountdown = -2; - DisplayCharsCount(copy_init_data, hwndDlg); - } - - if (bCurrentStatus) - copy_init_data->m_iStatus = ID_STATUS_CURRENT; - - mir_subclassWindow( GetDlgItem(hwndDlg, IDC_EDIT1), EditBoxSubProc); - if (!init_data->m_bOnEvent && IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) { - SetFocus(GetDlgItem(hwndDlg, IDC_EDIT1)); - SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), EM_SETSEL, 0, -1); - } - else - SetFocus(GetDlgItem(hwndDlg, IDC_OK)); - - mir_free(init_data); - - if (!db_get_b(NULL, "SimpleStatusMsg", "WinCentered", 1)) { - WINDOWPLACEMENT wp; - int x, y; - - wp.length = sizeof(wp); - GetWindowPlacement(hwndDlg, &wp); - - x = (int)db_get_dw(NULL, "SimpleStatusMsg", "Winx", -1); - y = (int)db_get_dw(NULL, "SimpleStatusMsg", "Winy", -1); - - if (x !=- 1) { - OffsetRect(&wp.rcNormalPosition, x - wp.rcNormalPosition.left, y - wp.rcNormalPosition.top); - wp.flags = 0; - SetWindowPlacement(hwndDlg, &wp); - } - } - return FALSE; - } - - case WM_TIMER: - if (msgbox_data->m_iCountdown == -1) { - SendMessage(hwndDlg, WM_COMMAND, (WPARAM)IDC_OK, 0); - msgbox_data->m_iCountdown = -2; - DisplayCharsCount(msgbox_data, hwndDlg); - break; - } - else { - TCHAR str[64]; - mir_sntprintf(str, SIZEOF(str), TranslateT("Closing in %d"), msgbox_data->m_iCountdown); - SetDlgItemText(hwndDlg, IDC_OK, str); - } - msgbox_data->m_iCountdown--; - break; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_OK: - { - TCHAR tszMsg[1024]; - int iStatus, iMsgLen = 0, iProfileStatus = 0; - BOOL bCurrentStatus = FALSE; - - if (msgbox_data->m_iStatus == ID_STATUS_CURRENT) { - msgbox_data->m_iStatus = msgbox_data->m_bOnStartup ? GetStartupStatus(msgbox_data->m_szProto) : GetCurrentStatus(msgbox_data->m_szProto); - if (msgbox_data->m_szProto == NULL) - bCurrentStatus = TRUE; - } - else if (msgbox_data->m_iStatus >= ID_STATUS_CURRENT) { - iProfileStatus = msgbox_data->m_iStatus; - msgbox_data->m_iStatus = GetCurrentStatus(NULL); - } - - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) - iMsgLen = GetDlgItemText(hwndDlg, IDC_EDIT1, tszMsg, SIZEOF(tszMsg)); - - if (iMsgLen == 0) { - char szSetting[80]; - if (msgbox_data->m_szProto) { - mir_snprintf(szSetting, SIZEOF(szSetting), "Last%sMsg", msgbox_data->m_szProto); - db_set_s(NULL, "SimpleStatusMsg", szSetting, ""); - - mir_snprintf(szSetting, SIZEOF(szSetting), "%sMsg", msgbox_data->m_szProto); - db_set_ts(NULL, "SRAway", StatusModeToDbSetting(msgbox_data->m_iStatus, szSetting), _T("")); - } - else { - db_set_s(NULL, "SimpleStatusMsg", "LastMsg", ""); - for (int j = 0; j < accounts->count; j++) { - if (!IsAccountEnabled(accounts->pa[j])) - continue; - - if (!CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0)) - continue; - - if (db_get_b(NULL, accounts->pa[j]->szModuleName, "LockMainStatus", 0)) - continue; - - if (!(CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) - continue; - - mir_snprintf(szSetting, SIZEOF(szSetting), "Last%sMsg", accounts->pa[j]->szModuleName); - db_set_s(NULL, "SimpleStatusMsg", szSetting, ""); - - mir_snprintf(szSetting, SIZEOF(szSetting), "%sMsg", accounts->pa[j]->szModuleName); - iStatus = msgbox_data->m_bOnStartup ? GetStartupStatus(accounts->pa[j]->szModuleName) : GetCurrentStatus(accounts->pa[j]->szModuleName); - db_set_ts(NULL, "SRAway", StatusModeToDbSetting(iStatus, szSetting), _T("")); - } - - db_set_ts(NULL, "SRAway", StatusModeToDbSetting(msgbox_data->m_iStatus, "Msg"), _T("")); // for compatibility with some plugins - } - - if (bCurrentStatus) - SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, ID_STATUS_CURRENT, 0, msgbox_data->m_bOnStartup); - else if (iProfileStatus != 0) - SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, iProfileStatus, 0, FALSE); - else - SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, msgbox_data->m_iStatus, 0, msgbox_data->m_bOnStartup); - } - else { - char buff[64], buff2[80]; - DBVARIANT dbv; - BOOL found = FALSE; - - for (int i = 1; i <= msgbox_data->max_hist_msgs; i++) { - mir_snprintf(buff, SIZEOF(buff), "SMsg%d", i); - if (!db_get_ts(NULL, "SimpleStatusMsg", buff, &dbv)) { - if (!lstrcmp(dbv.ptszVal, tszMsg)) { - found = TRUE; - if (msgbox_data->m_szProto) { - mir_snprintf(buff2, SIZEOF(buff2), "Last%sMsg", msgbox_data->m_szProto); - db_set_s(NULL, "SimpleStatusMsg", buff2, buff); - - mir_snprintf(buff2, SIZEOF(buff2), "%sMsg", msgbox_data->m_szProto); - db_set_ts(NULL, "SRAway", StatusModeToDbSetting(msgbox_data->m_iStatus, buff2), tszMsg); - } - else { - db_set_s(NULL, "SimpleStatusMsg", "LastMsg", buff); - for (int j = 0; j < accounts->count; j++) { - if (!IsAccountEnabled(accounts->pa[j])) - continue; - - if (!CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0)) - continue; - - if (db_get_b(NULL, accounts->pa[j]->szModuleName, "LockMainStatus", 0)) - continue; - - if (!(CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) - continue; - - mir_snprintf(buff2, SIZEOF(buff2), "Last%sMsg", accounts->pa[j]->szModuleName); - db_set_s(NULL, "SimpleStatusMsg", buff2, buff); - - mir_snprintf(buff2, SIZEOF(buff2), "%sMsg", accounts->pa[j]->szModuleName); - iStatus = msgbox_data->m_bOnStartup ? GetStartupStatus(accounts->pa[j]->szModuleName) : GetCurrentStatus(accounts->pa[j]->szModuleName); - db_set_ts(NULL, "SRAway", StatusModeToDbSetting(iStatus, buff2), tszMsg); - } - } - db_free(&dbv); - break; - } - db_free(&dbv); - } - } - - if (!found) { - int last_modified_msg = db_get_w(NULL, "SimpleStatusMsg", "LMMsg", msgbox_data->max_hist_msgs); - - if (last_modified_msg == msgbox_data->max_hist_msgs) - last_modified_msg = 1; - else - last_modified_msg++; - - mir_snprintf(buff, SIZEOF(buff), "SMsg%d", last_modified_msg); - db_set_ts(NULL, "SimpleStatusMsg", buff, tszMsg); - - if (msgbox_data->m_szProto) { - mir_snprintf(buff2, SIZEOF(buff2), "Last%sMsg", msgbox_data->m_szProto); - db_set_s(NULL, "SimpleStatusMsg", buff2, buff); - - mir_snprintf(buff2, SIZEOF(buff2), "%sMsg", msgbox_data->m_szProto); - db_set_ts(NULL, "SRAway", StatusModeToDbSetting(msgbox_data->m_iStatus, buff2), tszMsg); - } - else { - db_set_s(NULL, "SimpleStatusMsg", "LastMsg", buff); - for (int j = 0; j < accounts->count; j++) { - if (!IsAccountEnabled(accounts->pa[j])) - continue; - - if (!CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0)) - continue; - - if (db_get_b(NULL, accounts->pa[j]->szModuleName, "LockMainStatus", 0)) - continue; - - if (!(CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) - continue; - - mir_snprintf(buff2, SIZEOF(buff2), "Last%sMsg", accounts->pa[j]->szModuleName); - db_set_s(NULL, "SimpleStatusMsg", buff2, buff); - - mir_snprintf(buff2, SIZEOF(buff2), "%sMsg", accounts->pa[j]->szModuleName); - iStatus = msgbox_data->m_bOnStartup ? GetStartupStatus(accounts->pa[j]->szModuleName) : GetCurrentStatus(accounts->pa[j]->szModuleName); - db_set_ts(NULL, "SRAway", StatusModeToDbSetting(iStatus, buff2), tszMsg); - } - } - db_set_w(NULL, "SimpleStatusMsg", "LMMsg", (WORD)last_modified_msg); - } - - if (!msgbox_data->m_szProto) - db_set_ts(NULL, "SRAway", StatusModeToDbSetting(msgbox_data->m_iStatus, "Msg"), tszMsg); // for compatibility with some plugins - - if (bCurrentStatus) - SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, ID_STATUS_CURRENT, tszMsg, msgbox_data->m_bOnStartup); - else if (iProfileStatus != 0) - SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, iProfileStatus, tszMsg, FALSE); - else - SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, msgbox_data->m_iStatus, tszMsg, msgbox_data->m_bOnStartup); - } - } - - case IDCANCEL: - case IDC_CANCEL: - DestroyWindow(hwndDlg); - return TRUE; - - case IDC_EDIT1: // Notification from the edit control - if (msgbox_data->m_iCountdown > -2) { - KillTimer(hwndDlg, 1); - msgbox_data->m_iCountdown = -2; - DisplayCharsCount(msgbox_data, hwndDlg); - } - switch (HIWORD(wParam)) { - case EN_CHANGE: - DisplayCharsCount(msgbox_data, hwndDlg); - SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, -1, 0); - if ((msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { - TCHAR msg[1024]; - - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); - - if (!GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg))) { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); - } - else if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); - } - break; - } - break; - } - - if ((HWND)lParam == msgbox_data->status_cbex) { - if (msgbox_data->m_iCountdown > -2) { - KillTimer(hwndDlg, 1); - msgbox_data->m_iCountdown = -2; - DisplayCharsCount(msgbox_data, hwndDlg); - } - switch (HIWORD(wParam)) { - case CBN_SELENDOK: - case CBN_SELCHANGE: - { - COMBOBOXEXITEM cbitem = {0}; - - cbitem.mask = CBEIF_LPARAM; - cbitem.iItem = SendMessage(msgbox_data->status_cbex, CB_GETCURSEL, 0, 0); - SendMessage(msgbox_data->status_cbex, CBEM_GETITEM, 0, (LPARAM)&cbitem); - - msgbox_data->m_iStatus = cbitem.lParam; - ChangeDlgStatus(hwndDlg, msgbox_data, (int)cbitem.lParam); - - if (HIWORD(wParam) == CBN_SELENDOK && IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) - SetFocus(GetDlgItem(hwndDlg, IDC_EDIT1)); - break; - } - } - } - - if ((HWND)lParam == msgbox_data->recent_cbex) { - if (msgbox_data->m_iCountdown > -2) { - KillTimer(hwndDlg, 1); - msgbox_data->m_iCountdown = -2; - DisplayCharsCount(msgbox_data, hwndDlg); - } - switch (HIWORD(wParam)) { - case CBN_SELENDOK: - { - TCHAR text[1024]; - int cur_sel = SendMessage(msgbox_data->recent_cbex, CB_GETCURSEL, 0, 0); - COMBOBOXEXITEM cbitem = {0}; - - cbitem.mask = CBEIF_LPARAM | CBEIF_TEXT; - cbitem.iItem = cur_sel; - cbitem.cchTextMax = SIZEOF(text); - cbitem.pszText = text; - - SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&cbitem); - if (LOWORD(cbitem.lParam) == HISTORY_MSG || LOWORD(cbitem.lParam) == PREDEFINED_MSG || LOWORD(cbitem.lParam) == DEFAULT_MSG) - { - SetDlgItemText(hwndDlg, IDC_EDIT1, text); - DisplayCharsCount(msgbox_data, hwndDlg); - if ((msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), TRUE); - if (LOWORD(cbitem.lParam) == PREDEFINED_MSG) { - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); - } - else if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); - } - } - else if (LOWORD(cbitem.lParam) == CLEAR_HISTORY) { - if (MessageBox(NULL, TranslateT("Are you sure you want to clear status message history?"), TranslateT("Confirm clearing history"), MB_ICONQUESTION | MB_YESNO) == IDYES) - ClearHistory(msgbox_data, cur_sel); - else if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) { - TCHAR msg[1024]; - int fcursel = CB_ERR, num_start; - num_start = SendMessage(msgbox_data->recent_cbex, CB_GETCOUNT, 0, 0); - num_start -= msgbox_data->num_def_msgs + 1; - GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg)); - fcursel = SendMessage(msgbox_data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)msg); - SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, fcursel, 0); - } - } - else if (LOWORD(cbitem.lParam) == DELETE_SELECTED) { - COMBOBOXEXITEM histitem = {0}; - BOOL scursel = FALSE; - - histitem.mask = CBEIF_LPARAM; - histitem.iItem = msgbox_data->curr_sel_msg; - SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); - - if (LOWORD(histitem.lParam) == HISTORY_MSG) { - char szSetting[16]; - mir_snprintf(szSetting, SIZEOF(szSetting), "SMsg%d", (int)HIWORD(histitem.lParam)); - db_set_ts(NULL, "SimpleStatusMsg", szSetting, _T("")); - SendMessage(msgbox_data->recent_cbex, CBEM_DELETEITEM, (WPARAM)msgbox_data->curr_sel_msg, 0); - } - if (LOWORD(histitem.lParam) == PREDEFINED_MSG) { - msgbox_data->m_bPredefChanged = TRUE; - SendMessage(msgbox_data->recent_cbex, CBEM_DELETEITEM, (WPARAM)msgbox_data->curr_sel_msg, 0); - } - - cur_sel = msgbox_data->curr_sel_msg; - while (!scursel) { - if (cur_sel - 1 >= 0) - cur_sel--; - else { - scursel = TRUE; - break; - } - histitem.mask = CBEIF_LPARAM; - histitem.iItem = cur_sel; - SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); - - if ((LOWORD(histitem.lParam) != CLEAR_HISTORY) && (LOWORD(histitem.lParam) != DELETE_SELECTED) && (LOWORD(histitem.lParam) != ADD_MSG)) - scursel = TRUE; - } - msgbox_data->curr_sel_msg = cur_sel; - SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, (WPARAM)cur_sel, 0); - - histitem.mask = CBEIF_LPARAM | CBEIF_TEXT; - histitem.iItem = cur_sel; - histitem.cchTextMax = SIZEOF(text); - histitem.pszText = text; - - SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); - if (LOWORD(histitem.lParam) == HISTORY_MSG || LOWORD(histitem.lParam) == PREDEFINED_MSG || LOWORD(histitem.lParam) == DEFAULT_MSG) - { - SetDlgItemText(hwndDlg, IDC_EDIT1, text); - DisplayCharsCount(msgbox_data, hwndDlg); - } - } - else if (LOWORD(cbitem.lParam) == ADD_MSG) { - int sel = AddToPredefined(hwndDlg, msgbox_data); - if (sel != -1) { - SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, (WPARAM)sel, 0); - msgbox_data->curr_sel_msg = sel; - } - else - SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, (WPARAM)msgbox_data->curr_sel_msg, 0); - break; - } - msgbox_data->curr_sel_msg = cur_sel; - - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) { - SetFocus(GetDlgItem(hwndDlg, IDC_EDIT1)); - SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), EM_SETSEL, 0, -1); - } - break; - } - } - } - - if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_BADD)) { - switch (HIWORD(wParam)) { - case BN_CLICKED: - { - int sel = AddToPredefined(hwndDlg, msgbox_data); - if (sel != -1) { - if (!IsWindowEnabled(msgbox_data->recent_cbex)) - EnableWindow(msgbox_data->recent_cbex, TRUE); - if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), TRUE); - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); - - SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, (WPARAM)sel, 0); - msgbox_data->curr_sel_msg = sel; - } - break; - } - } - } - - if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_BCLEAR)) { - switch (HIWORD(wParam)) { - case BN_CLICKED: - if (MessageBox(NULL, TranslateT("Are you sure you want to clear status message history?"), TranslateT("Confirm clearing history"), MB_ICONQUESTION | MB_YESNO) == IDYES) - { - ClearHistory(msgbox_data, 0); - - int num_items = SendMessage(msgbox_data->recent_cbex, CB_GETCOUNT, 0, 0); - if (!num_items) { - if (IsWindowEnabled(msgbox_data->recent_cbex)) { - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); - EnableWindow(msgbox_data->recent_cbex, FALSE); - } - } - EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); - } - break; - } - } - - if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_BDEL)) { - switch (HIWORD(wParam)) { - case BN_CLICKED: - { - int cur_sel; - char buff[16]; - int left_items = 0; - COMBOBOXEXITEM histitem = {0}; - - cur_sel = SendMessage(msgbox_data->recent_cbex, CB_GETCURSEL, 0, 0); - - histitem.mask = CBEIF_LPARAM; - histitem.iItem = msgbox_data->curr_sel_msg; - - SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); - - if (LOWORD(histitem.lParam) == HISTORY_MSG) { - mir_snprintf(buff, SIZEOF(buff), "SMsg%d", (int)HIWORD(histitem.lParam)); - db_set_ts(NULL, "SimpleStatusMsg", buff, _T("")); - } - else if (LOWORD(histitem.lParam) == PREDEFINED_MSG) - msgbox_data->m_bPredefChanged = TRUE; - left_items = SendMessage(msgbox_data->recent_cbex, CBEM_DELETEITEM, (WPARAM)msgbox_data->curr_sel_msg, 0); - - if (!left_items) { - if (IsWindowEnabled(msgbox_data->recent_cbex)) - EnableWindow(msgbox_data->recent_cbex, FALSE); - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) - EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); - EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); - } - else { - TCHAR text[1024]; - - if (cur_sel - 1 >= 0) - cur_sel--; - msgbox_data->curr_sel_msg = cur_sel; - SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, (WPARAM)cur_sel, 0); - - histitem.mask = CBEIF_LPARAM | CBEIF_TEXT; - histitem.iItem = cur_sel; - histitem.cchTextMax = SIZEOF(text); - histitem.pszText = text; - - SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); - if (LOWORD(histitem.lParam) == HISTORY_MSG || LOWORD(histitem.lParam) == PREDEFINED_MSG || LOWORD(histitem.lParam) == DEFAULT_MSG) - { - SetDlgItemText(hwndDlg, IDC_EDIT1, text); - DisplayCharsCount(msgbox_data, hwndDlg); - EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), LOWORD(histitem.lParam) == PREDEFINED_MSG ? FALSE : TRUE); - } - } - break; - } - } - } - break; - - case DM_SIMPAWAY_SHUTDOWN: - DestroyWindow(hwndDlg); - break; - - case DM_SIMPAWAY_CHANGEICONS: - ReleaseIconEx("cross"); - ReleaseIconEx("recent"); - ReleaseIconEx("predef"); - ReleaseIconEx("add"); - ReleaseIconEx("clear"); - msgbox_data->icon[I_ICON_DEL] = LoadIconEx("cross"); - msgbox_data->icon[I_ICON_HIST] = LoadIconEx("recent"); - msgbox_data->icon[I_ICON_MSG] = LoadIconEx("predef"); - msgbox_data->icon[I_ICON_ADD] = LoadIconEx("add"); - msgbox_data->icon[I_ICON_CLEAR] = LoadIconEx("clear"); - if (msgbox_data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { - for (int i = 0; i < 5; ++i) - ImageList_ReplaceIcon(msgbox_data->other_icons, i, msgbox_data->icon[i]); - } - if ((msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { - SendMessage(GetDlgItem(hwndDlg, IDC_BADD), BM_SETIMAGE, IMAGE_ICON, (LPARAM)msgbox_data->icon[I_ICON_ADD]); - SendMessage(GetDlgItem(hwndDlg, IDC_BCLEAR), BM_SETIMAGE, IMAGE_ICON, (LPARAM)msgbox_data->icon[I_ICON_CLEAR]); - SendMessage(GetDlgItem(hwndDlg, IDC_BDEL), BM_SETIMAGE, IMAGE_ICON, (LPARAM)msgbox_data->icon[I_ICON_DEL]); - } - break; - - case WM_DESTROY: - { - WINDOWPLACEMENT wp; - wp.length = sizeof(wp); - GetWindowPlacement(hwndDlg, &wp); - db_set_dw(NULL, "SimpleStatusMsg", "Winx", wp.rcNormalPosition.left); - db_set_dw(NULL, "SimpleStatusMsg", "Winy", wp.rcNormalPosition.top); - - if (msgbox_data->m_bPredefChanged) { - int i, num_items, new_num_def_msgs = 0; - COMBOBOXEXITEM cbitem = {0}; - TCHAR text[1024]; - char buff[64]; - - num_items = SendMessage(msgbox_data->recent_cbex, CB_GETCOUNT, 0, 0); - num_items--; - for (i = 1; i <= msgbox_data->num_def_msgs; i++) { - cbitem.mask = CBEIF_LPARAM | CBEIF_TEXT; - cbitem.iItem = num_items; - cbitem.cchTextMax = SIZEOF(text); - cbitem.pszText = text; - - SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&cbitem); - mir_snprintf(buff, SIZEOF(buff), "DefMsg%d", i); - if (LOWORD(cbitem.lParam) == PREDEFINED_MSG) { - new_num_def_msgs++; - db_set_ts(NULL, "SimpleStatusMsg", buff, text); - } - else - db_unset(NULL, "SimpleStatusMsg", buff); - num_items--; - } - db_set_w(NULL, "SimpleStatusMsg", "DefMsgCount", (WORD)new_num_def_msgs); - } - - ImageList_Destroy(msgbox_data->status_icons); - ImageList_Destroy(msgbox_data->other_icons); - ReleaseIconEx("cross"); - ReleaseIconEx("recent"); - ReleaseIconEx("predef"); - ReleaseIconEx("add"); - ReleaseIconEx("clear"); - Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); - Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0)); - - if (msgbox_data) - mir_free(msgbox_data); - hwndSAMsgDialog = NULL; - break; - } - } - return FALSE; -} +/* + +Simple Status Message plugin for Miranda IM +Copyright (C) 2006-2011 Bartosz 'Dezeath' Białek, (C) 2005 Harven + +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., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "commonheaders.h" + +#define I_ICON_DEL 0 +#define I_ICON_HIST 1 +#define I_ICON_MSG 2 +#define I_ICON_ADD 3 +#define I_ICON_CLEAR 4 + +struct MsgBoxData +{ + char *m_szProto; + int m_iStatus; + int m_iInitialStatus; + int m_iStatusModes; + int m_iStatusMsgModes; + HWND status_cbex; + HWND recent_cbex; + HICON icon[5]; + HIMAGELIST status_icons; + HIMAGELIST other_icons; + int m_iCountdown; + int curr_sel_msg; + int m_iDlgFlags; + int max_hist_msgs; + int num_def_msgs; + BOOL m_bPredefChanged; + BOOL m_bIsMsgHistory; + BOOL m_bOnStartup; +}; + +typedef struct +{ + clock_t ctLastDblClk; + UINT uClocksPerDblClk; +} MsgEditCtrl; + +HIMAGELIST AddOtherIconsToImageList(struct MsgBoxData *data) +{ + HIMAGELIST himlIcons = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 4, 0); + + for (int i = 0; i < 5; ++i) + ImageList_AddIcon(himlIcons, data->icon[i]); + + return himlIcons; +} + +int statusicon_nr[9]; + +HIMAGELIST AddStatusIconsToImageList(const char *szProto, int status_flags) +{ + int num_icons = 1; + int i; + + for (i = 0; i < 9; ++i) + if (Proto_Status2Flag(ID_STATUS_ONLINE + i) & status_flags) + num_icons++; + + HIMAGELIST himlIcons = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, num_icons, 0); + HICON hicon = LoadSkinnedProtoIcon(szProto, ID_STATUS_OFFLINE); + ImageList_AddIcon(himlIcons, hicon); + Skin_ReleaseIcon(hicon); + statusicon_nr[0] = 0; + + int j = 1; + for (i = 0; i < 9; ++i) { + if (Proto_Status2Flag(ID_STATUS_ONLINE + i) & status_flags) { + hicon = LoadSkinnedProtoIcon(szProto, ID_STATUS_ONLINE + i); + ImageList_AddIcon(himlIcons, hicon); + Skin_ReleaseIcon(hicon); + statusicon_nr[i + 1] = j; + j++; + } + else + statusicon_nr[i + 1] = 0; + } + + return himlIcons; +} + +HWND WINAPI CreateStatusComboBoxEx(HWND hwndDlg, struct MsgBoxData *data) +{ + int j = 0, cur_sel = 0; + TCHAR *status_desc; + + if (!(data->m_iDlgFlags & DLG_SHOW_STATUS)) + return NULL; + + HWND handle = CreateWindowEx(0, WC_COMBOBOXEX, NULL, + WS_TABSTOP | CBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST, + 0, 0, 0, 240, hwndDlg, NULL, g_hInst, NULL); + + COMBOBOXEXITEM cbei = {0}; + if (!(data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS)) + cbei.mask = CBEIF_LPARAM | CBEIF_TEXT; + else + cbei.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; + + if (data->m_bOnStartup) + status_desc = (TCHAR *)TranslateT(""); + else + status_desc = (TCHAR *)TranslateT(""); + cbei.iItem = j; + cbei.pszText = (LPTSTR)status_desc; + cbei.cchTextMax = sizeof(status_desc); + + if (data->m_szProto || data->m_iStatus == ID_STATUS_CURRENT) { + if (data->m_bOnStartup) + j = GetStartupStatus(data->m_szProto) - ID_STATUS_OFFLINE; + else + j = GetCurrentStatus(data->m_szProto) - ID_STATUS_OFFLINE; + } + else + j = data->m_iStatus - ID_STATUS_OFFLINE; + + if (j < 0 || j > 9) + j = 0; // valid status modes only + + if (data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS) { + cbei.iImage = statusicon_nr[j]; + cbei.iSelectedImage = statusicon_nr[j]; + } + j = 0; + cbei.lParam = (LPARAM)ID_STATUS_CURRENT; + + if (ID_STATUS_CURRENT == data->m_iInitialStatus) + cur_sel = j; + + SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei); + j++; + + for (int i = 0; i < 10; ++i) { + if ((Proto_Status2Flag(ID_STATUS_OFFLINE + i) & data->m_iStatusModes) || i == 0) { + status_desc = pcli->pfnGetStatusModeDescription(ID_STATUS_OFFLINE + i, 0); + cbei.iItem = j; + cbei.pszText = (LPTSTR)status_desc; + cbei.cchTextMax = sizeof(status_desc); + if (data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS) { + cbei.iImage = j - 1; + cbei.iSelectedImage = j - 1; + } + cbei.lParam = (LPARAM)ID_STATUS_OFFLINE + i; + + if (ID_STATUS_OFFLINE + i == data->m_iInitialStatus) + cur_sel = j; + + if (SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei) == -1) + break; + j++; + } + } + + if (!data->m_szProto && (data->m_iDlgFlags & DLG_SHOW_STATUS_PROFILES) && ServiceExists(MS_SS_GETPROFILECOUNT)) { + int defaultProfile; + int profileCount = (int)CallService(MS_SS_GETPROFILECOUNT, (WPARAM)&defaultProfile, 0); + + for (int i = 0; i < profileCount; ++i) { + TCHAR tszProfileName[128]; + CallService(MS_SS_GETPROFILENAME, (WPARAM)i, (LPARAM)tszProfileName); + + cbei.iItem = j; + cbei.pszText = (LPTSTR)tszProfileName; + cbei.cchTextMax = SIZEOF(tszProfileName); + if (data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS) { + int k = GetCurrentStatus(NULL) - ID_STATUS_OFFLINE; + if (k < 0 || k > 9) + k = 0; // valid status modes only + cbei.iImage = statusicon_nr[k]; + cbei.iSelectedImage = statusicon_nr[k]; + } + cbei.lParam = (LPARAM)40083 + i; + + mir_free(status_desc); + + if (SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei) == -1) + break; + j++; + } + } + + if (!(data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS)) + SendMessage(handle, CB_SETITEMHEIGHT, 0, (LPARAM)16); + else { + SendMessage(handle, CB_SETITEMHEIGHT, 0, (LPARAM)18); + SendMessage(handle, CBEM_SETIMAGELIST, 0, (LPARAM)data->status_icons); + } + SetWindowPos(handle, NULL, 11, 11, 112, 20, SWP_NOACTIVATE); + SendMessage(handle, CB_SETCURSEL, (WPARAM)cur_sel, 0); + SendMessage(handle, CB_SETITEMHEIGHT, (WPARAM)-1, (LPARAM)16); + + return handle; +} + +#define HISTORY_MSG 1 +#define CLEAR_HISTORY 2 +#define PREDEFINED_MSG 3 +#define ADD_MSG 4 +#define DELETE_SELECTED 5 +#define DEFAULT_MSG 6 + +HWND WINAPI CreateRecentComboBoxEx(HWND hwndDlg, struct MsgBoxData *data) +{ + int i, j; + char buff[16]; + BOOL found = FALSE; + DBVARIANT dbv; + TCHAR text[128]; + + HWND handle = CreateWindowEx(0, WC_COMBOBOXEX, NULL, + WS_TABSTOP | CBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST, + 0, 0, 0, 300, hwndDlg, NULL, g_hInst, NULL); + + COMBOBOXEXITEM cbei = {0}; + if (!(data->m_iDlgFlags & DLG_SHOW_LIST_ICONS)) + cbei.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_INDENT; + else + cbei.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; + + j = db_get_w(NULL, "SimpleStatusMsg", "LMMsg", 1); + + for (i = 1; i <= data->max_hist_msgs; ++i) { + // history messages + if (j < 1) + j = data->max_hist_msgs; + mir_snprintf(buff, SIZEOF(buff), "SMsg%d", j); + j--; + if (!db_get_ts(NULL, "SimpleStatusMsg", buff, &dbv)) { + if (dbv.ptszVal != NULL && dbv.ptszVal != '\0') { + found = TRUE; + cbei.iItem = -1; + cbei.pszText = (LPTSTR)dbv.ptszVal; + cbei.cchTextMax = sizeof(dbv.ptszVal); + if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { + cbei.iImage = I_ICON_HIST; + cbei.iSelectedImage = I_ICON_HIST; + } + else + cbei.iIndent = 0; + cbei.lParam = MAKELPARAM(HISTORY_MSG, j + 1); + + if (SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei) == -1) { + db_free(&dbv); + break; + } + } + db_free(&dbv); + } + } + + data->m_bIsMsgHistory = found; + + if ((data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { + if (found) { + if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), TRUE); + } + else if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); + } + else if (data->m_iDlgFlags & DLG_SHOW_BUTTONS_INLIST) { + if (found) { + if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { + mir_sntprintf(text, SIZEOF(text), TranslateT("Clear history")); + cbei.iImage = I_ICON_CLEAR; + cbei.iSelectedImage = I_ICON_CLEAR; + } + else { + mir_sntprintf(text, SIZEOF(text), _T("## %s ##"), TranslateT("Clear history")); + cbei.iIndent = 1; + } + cbei.iItem = -1; + cbei.pszText = (LPTSTR)text; + cbei.cchTextMax = SIZEOF(text); + cbei.lParam = MAKELPARAM(CLEAR_HISTORY, 0); + SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei); + } + + cbei.iItem = -1; + if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { + mir_sntprintf(text, SIZEOF(text), TranslateT("Add to predefined")); + cbei.iImage = I_ICON_ADD; + cbei.iSelectedImage = I_ICON_ADD; + } + else { + mir_sntprintf(text, SIZEOF(text), _T("## %s ##"), TranslateT("Add to predefined")); + cbei.iIndent = 1; + } + cbei.pszText = (LPTSTR)text; + cbei.cchTextMax = SIZEOF(text); + cbei.lParam = MAKELPARAM(ADD_MSG, 0); + SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei); + + if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { + mir_sntprintf(text, SIZEOF(text), TranslateT("Delete selected")); + cbei.iImage = I_ICON_DEL; + cbei.iSelectedImage = I_ICON_DEL; + } + else { + cbei.iIndent = 1; + mir_sntprintf(text, SIZEOF(text), _T("## %s ##"), TranslateT("Delete selected")); + } + cbei.iItem = -1; + cbei.pszText = (LPTSTR)text; + cbei.cchTextMax = SIZEOF(text); + cbei.lParam = MAKELPARAM(DELETE_SELECTED, 0); + SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei); + } + + if ((data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { + if (data->num_def_msgs || found) { + if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), TRUE); + } + else if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); + } + + for (i = 1; i <= data->num_def_msgs; ++i) { + // predefined messages + mir_snprintf(buff, SIZEOF(buff), "DefMsg%d", i); + if (!db_get_ts(NULL, "SimpleStatusMsg", buff, &dbv)) { + if (dbv.ptszVal) { + if (!lstrlen(dbv.ptszVal)) { + db_free(&dbv); + continue; + } + + cbei.iItem = -1; + cbei.pszText = (LPTSTR)dbv.ptszVal; + cbei.cchTextMax = sizeof(dbv.ptszVal); + if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { + cbei.iImage = I_ICON_MSG; + cbei.iSelectedImage = I_ICON_MSG; + } + else + cbei.iIndent = 0; + cbei.lParam = MAKELPARAM(PREDEFINED_MSG, i); + + if (SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei) == -1) + break; + } + db_free(&dbv); + } + } + + if (db_get_b(NULL, "SimpleStatusMsg", "PutDefInList", 0)) { + cbei.iItem = -1; + cbei.pszText = (LPTSTR)GetDefaultMessage(data->m_iStatus); + cbei.cchTextMax = sizeof(GetDefaultMessage(data->m_iStatus)); + if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { + cbei.iImage = I_ICON_MSG; + cbei.iSelectedImage = I_ICON_MSG; + } + else + cbei.iIndent = 0; + cbei.lParam = MAKELPARAM(DEFAULT_MSG, 0); + + SendMessage(handle, CBEM_INSERTITEM, 0, (LPARAM)&cbei); + } + + if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) + SendMessage(handle, CBEM_SETIMAGELIST, 0, (LPARAM)data->other_icons); + if (!(data->m_iDlgFlags & DLG_SHOW_STATUS)) { + SetWindowPos(handle, NULL, 11, 11, 290, 20, SWP_NOACTIVATE); + SendMessage(handle, CB_SETDROPPEDWIDTH, (WPARAM)290, 0); + } + else { + SetWindowPos(handle, NULL, 127, 11, 174, 20, SWP_NOACTIVATE); + SendMessage(handle, CB_SETDROPPEDWIDTH, (WPARAM)250, 0); + } + SendMessage(handle, CB_SETITEMHEIGHT, (WPARAM)-1, (LPARAM)16); + SendMessage(handle, CB_SETITEMHEIGHT, 0, (LPARAM)16); + + if (((data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) && !found && !data->num_def_msgs) + EnableWindow(handle, FALSE); + + if (((!(data->m_iDlgFlags & DLG_SHOW_BUTTONS)) && (!(data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) && (!(data->m_iDlgFlags & DLG_SHOW_BUTTONS_INLIST))) && !found && !data->num_def_msgs) + EnableWindow(handle, FALSE); + + return handle; +} + +VOID APIENTRY HandlePopupMenu(HWND hwnd, POINT pt, HWND edit_control) +{ + HMENU hmenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_EDITMENU)); + if (hmenu == NULL) + return; + + HMENU hmenuTrackPopup = GetSubMenu(hmenu, 0); + + TranslateMenu(hmenuTrackPopup); + + ClientToScreen(hwnd, (LPPOINT)&pt); + + LPDWORD sel_s = NULL, sel_e = NULL; + SendMessage(edit_control, EM_GETSEL, (WPARAM)&sel_s, (LPARAM)&sel_e); + if (sel_s == sel_e) { + EnableMenuItem(hmenuTrackPopup, IDM_COPY, MF_BYCOMMAND | MF_GRAYED); + EnableMenuItem(hmenuTrackPopup, IDM_CUT, MF_BYCOMMAND | MF_GRAYED); + } + if (SendMessage(edit_control, WM_GETTEXTLENGTH, 0, 0) == 0) + EnableMenuItem(hmenuTrackPopup, IDM_DELETE, MF_BYCOMMAND | MF_GRAYED); + + if (ServiceExists(MS_VARS_FORMATSTRING)) + DeleteMenu(hmenuTrackPopup, ID__VARIABLES, MF_BYCOMMAND); + else + DeleteMenu(hmenuTrackPopup, 8, MF_BYPOSITION); + + DeleteMenu(hmenuTrackPopup, 7, MF_BYPOSITION); + + int m_selection = TrackPopupMenu(hmenuTrackPopup, TPM_LEFTALIGN | TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, NULL); + switch (m_selection) { + case IDM_COPY: + SendMessage(edit_control, WM_COPY, 0, 0); + break; + + case IDM_CUT: + SendMessage(edit_control, WM_CUT, 0, 0); + break; + + case IDM_PASTE: + SendMessage(edit_control, WM_PASTE, 0, 0); + break; + + case IDM_SELECTALL: + SendMessage(edit_control, EM_SETSEL, 0, -1); + break; + + case IDM_DELETE: + SendMessage(edit_control, WM_SETTEXT, 0, (LPARAM)""); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_EDIT1, EN_CHANGE), (LPARAM)edit_control); + break; + + case ID__FORTUNEAWAYMSG: + CallService(MS_UTILS_OPENURL, 1, (LPARAM)"http://miranda-ng.org/"); + break; + + case ID__VARIABLES: + CallService(MS_UTILS_OPENURL, 1, (LPARAM)"http://miranda-ng.org/"); + break; + + case ID__VARIABLES_MOREVARIABLES: + { + VARHELPINFO vhi = {0}; + vhi.cbSize = sizeof(vhi); + vhi.flags = VHF_FULLDLG | VHF_SETLASTSUBJECT; + vhi.hwndCtrl = edit_control; + vhi.szSubjectDesc = NULL; + vhi.szExtraTextDesc = NULL; + CallService(MS_VARS_SHOWHELPEX, (WPARAM)hwnd, (LPARAM)&vhi); + break; + } + + default: + if (!OpenClipboard(GetParent(hwnd))) + break; + if (EmptyClipboard()) { + TCHAR item_string[128]; + int len; + + GetMenuString(hmenu, m_selection, (LPTSTR)&item_string, 128, MF_BYCOMMAND); + len = lstrlen(item_string); + if (len) { + LPTSTR lptstrCopy; + HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (len + 1) * sizeof(TCHAR)); + if (hglbCopy == NULL) { + CloseClipboard(); + break; + } + lptstrCopy = (LPTSTR)GlobalLock(hglbCopy); + memcpy(lptstrCopy, item_string, len * sizeof(TCHAR)); + lptstrCopy[len] = (TCHAR)0; + GlobalUnlock(hglbCopy); + + SetClipboardData(CF_UNICODETEXT, hglbCopy); + + } + } + CloseClipboard(); + SendMessage(edit_control, WM_PASTE, 0, 0); + break; + } + DestroyMenu(hmenu); +} + +static LRESULT CALLBACK EditBoxSubProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) { + case WM_CONTEXTMENU: + { + POINT pt = {(LONG)LOWORD(lParam), (LONG)HIWORD(lParam)}; + RECT rc; + GetClientRect(hwndDlg, &rc); + + if (pt.x == -1 && pt.y == -1) { + GetCursorPos(&pt); + if (!PtInRect(&rc, pt)) { + pt.x = rc.left + (rc.right - rc.left) / 2; + pt.y = rc.top + (rc.bottom - rc.top) / 2; + } + } + else + ScreenToClient(hwndDlg, &pt); + + if (PtInRect(&rc, pt)) + HandlePopupMenu(hwndDlg, pt, GetDlgItem(GetParent(hwndDlg), IDC_EDIT1)); + + return 0; + } + + case WM_CHAR: + if (wParam=='\n' && GetKeyState(VK_CONTROL) & 0x8000) { + PostMessage(GetParent(hwndDlg), WM_COMMAND, IDC_OK, 0); + return 0; + } + if (wParam == 1 && GetKeyState(VK_CONTROL) & 0x8000) { // Ctrl + A + SendMessage(hwndDlg, EM_SETSEL, 0, -1); + return 0; + } + if (wParam == 23 && GetKeyState(VK_CONTROL) & 0x8000) { // Ctrl + W + SendMessage(GetParent(hwndDlg), WM_COMMAND, IDC_CANCEL, 0); + return 0; + } + if (wParam == 127 && GetKeyState(VK_CONTROL) & 0x8000) { // Ctrl + Backspace + DWORD start, end; + TCHAR *text; + int textLen; + SendMessage(hwndDlg, EM_GETSEL, (WPARAM)&end, (LPARAM)(PDWORD)NULL); + SendMessage(hwndDlg, WM_KEYDOWN, VK_LEFT, 0); + SendMessage(hwndDlg, EM_GETSEL, (WPARAM)&start, (LPARAM)(PDWORD)NULL); + textLen = GetWindowTextLength(hwndDlg); + text = (TCHAR *)mir_alloc(sizeof(TCHAR) * (textLen + 1)); + GetWindowText(hwndDlg, text, textLen + 1); + MoveMemory(text + start, text + end, sizeof(TCHAR) * (textLen + 1 - end)); + SetWindowText(hwndDlg, text); + mir_free(text); + SendMessage(hwndDlg, EM_SETSEL, start, start); + SendMessage(GetParent(hwndDlg), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hwndDlg), EN_CHANGE), (LPARAM)hwndDlg); + return 0; + } + break; + + case WM_LBUTTONDBLCLK: + { + MsgEditCtrl *mec = (MsgEditCtrl *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + if (mec != NULL) { + mec->ctLastDblClk = clock(); + mec->uClocksPerDblClk = GetDoubleClickTime() * CLOCKS_PER_SEC / 1000; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)mec); + } + break; + } + + case WM_LBUTTONDOWN: + { + MsgEditCtrl *mec = (MsgEditCtrl *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + if (mec != NULL && UINT(clock() - mec->ctLastDblClk) < mec->uClocksPerDblClk) { + SendMessage(hwndDlg, EM_SETSEL, 0, -1); + return 0; + } + break; + } + + case WM_SETFOCUS: + { + MsgEditCtrl *mec = (MsgEditCtrl *)mir_calloc(sizeof(MsgEditCtrl)); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)mec); + break; + } + + case WM_KILLFOCUS: + { + MsgEditCtrl *mec = (MsgEditCtrl *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + mir_free(mec); + mec = NULL; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)mec); + break; + } + } + + return mir_callNextSubclass(hwndDlg, EditBoxSubProc, uMsg, wParam, lParam); +} + +int AddToPredefined(HWND hwndDlg, struct MsgBoxData *data) +{ + COMBOBOXEXITEM newitem = {0}; + int len = 0, num_items; + TCHAR msg[1024], text[1024]; + + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) + len = GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg)); + + if (!len) + return -1; + + num_items = SendMessage(data->recent_cbex, CB_GETCOUNT, 0, 0) - 1; + for (int i = 1; i <= data->num_def_msgs; i++, num_items--) { + newitem.mask = CBEIF_LPARAM | CBEIF_TEXT; + newitem.iItem = num_items; + newitem.cchTextMax = SIZEOF(text); + newitem.pszText = text; + + SendMessage(data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&newitem); + if (LOWORD(newitem.lParam) == PREDEFINED_MSG && !lstrcmp(text, msg)) + return num_items; + } + + data->num_def_msgs++; + data->m_bPredefChanged = TRUE; + + newitem.iItem = -1; + newitem.pszText = (LPTSTR)msg; + newitem.cchTextMax = SIZEOF(msg); + if (data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { + newitem.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; + newitem.iImage = I_ICON_MSG; + newitem.iSelectedImage = I_ICON_MSG; + } + else { + newitem.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_INDENT; + newitem.iIndent = 0; + } + newitem.lParam = MAKELPARAM(PREDEFINED_MSG, 0); + return SendMessage(data->recent_cbex, CBEM_INSERTITEM, 0, (LPARAM)&newitem); +} + +void ClearHistory(struct MsgBoxData *data, int cur_sel) +{ + COMBOBOXEXITEM histitem = {0}; + int i, num_items; + char text[16], buff2[80]; + + for (i = 1; i <= data->max_hist_msgs; i++) { + mir_snprintf(text, SIZEOF(text), "SMsg%d", i); + db_set_ts(NULL, "SimpleStatusMsg", text, _T("")); + } + db_set_s(NULL, "SimpleStatusMsg", "LastMsg", ""); + for (i = 0; i < accounts->count; i++) { + if (!IsAccountEnabled(accounts->pa[i])) + continue; + + if (!CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0)) + continue; + + if (!(CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) + continue; + + mir_snprintf(buff2, SIZEOF(buff2), "Last%sMsg", accounts->pa[i]->szModuleName); + db_set_s(NULL, "SimpleStatusMsg", buff2, ""); + } + db_set_w(NULL, "SimpleStatusMsg", "LMMsg", (WORD)data->max_hist_msgs); + SendMessage(data->recent_cbex, CB_SETCURSEL, -1, 0); + num_items = SendMessage(data->recent_cbex, CB_GETCOUNT, 0, 0); + if (num_items == CB_ERR) + return; + + if ((!(data->m_iDlgFlags & DLG_SHOW_BUTTONS)) && (!(data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT))) + SendMessage(data->recent_cbex, CBEM_DELETEITEM, (WPARAM)cur_sel, 0); + + for (i = num_items; i >= 0; i--) { + histitem.mask = CBEIF_LPARAM; + histitem.iItem = i; + SendMessage(data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); + if (LOWORD(histitem.lParam) == HISTORY_MSG) + SendMessage(data->recent_cbex, CBEM_DELETEITEM, (WPARAM)i, 0); + } +} + +void DisplayCharsCount(struct MsgBoxData *dlg_data, HWND hwndDlg) +{ + TCHAR msg[1024]; + TCHAR status_text[128]; + int len, lines = 1; + + if (dlg_data->m_iCountdown != -2) + return; + + len = GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg)); + if (db_get_b(NULL, "SimpleStatusMsg", "RemoveCR", 0)) { + int index, num_lines = SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), EM_GETLINECOUNT, 0, 0); + for (int i = 1; i < num_lines; ++i) { + index = SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), EM_LINEINDEX, (WPARAM)i, 0); + if (msg[index - 1] == '\n') + lines++; + } + } + mir_sntprintf(status_text, SIZEOF(status_text), TranslateT("OK (%d)"), len - (lines - 1)); + SendMessage(GetDlgItem(hwndDlg, IDC_OK), WM_SETTEXT, 0, (LPARAM)status_text); +} + +void SetEditControlText(struct MsgBoxData *data, HWND hwndDlg, int iStatus) +{ + int flags, fcursel = CB_ERR, num_start; + DBVARIANT dbv, dbv2; + char setting[80]; + + num_start = SendMessage(data->recent_cbex, CB_GETCOUNT, 0, 0); + num_start -= data->num_def_msgs + 1; + + mir_snprintf(setting, SIZEOF(setting), "%sFlags", data->m_szProto ? data->m_szProto : ""); + flags = db_get_b(NULL, "SimpleStatusMsg", (char *)StatusModeToDbSetting(iStatus, setting), STATUS_DEFAULT); + + if (flags & STATUS_LAST_MSG) { + if (data->m_szProto) + mir_snprintf(setting, SIZEOF(setting), "Last%sMsg", data->m_szProto); + else + mir_snprintf(setting, SIZEOF(setting), "LastMsg"); + + if (!db_get(NULL, "SimpleStatusMsg", setting, &dbv)) { + if (dbv.pszVal && strlen(dbv.pszVal)) { + if (!db_get_ts(NULL, "SimpleStatusMsg", dbv.pszVal, &dbv2)) { + if (dbv2.ptszVal && lstrlen(dbv2.ptszVal)) { + SetDlgItemText(hwndDlg, IDC_EDIT1, dbv2.ptszVal); + fcursel = SendMessage(data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)dbv2.ptszVal); + if (fcursel != CB_ERR) + SendMessage(data->recent_cbex, CB_SETCURSEL, (WPARAM)fcursel, 0); + } + db_free(&dbv2); + } + } + db_free(&dbv); + } + } + else if (flags & STATUS_DEFAULT_MSG) { + SetDlgItemText(hwndDlg, IDC_EDIT1, GetDefaultMessage(iStatus)); + + if (db_get_b(NULL, "SimpleStatusMsg", "PutDefInList", 0)) { + fcursel = SendMessage(data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)GetDefaultMessage(iStatus)); + if (fcursel != CB_ERR) + SendMessage(data->recent_cbex, CB_SETCURSEL, (WPARAM)fcursel, 0); + } + } + else if (flags & STATUS_THIS_MSG) { + if (data->m_szProto) + mir_snprintf(setting, SIZEOF(setting), "%sDefault", data->m_szProto); + else + mir_snprintf(setting, SIZEOF(setting), "Default"); + + if (!db_get_ts(NULL, "SRAway", StatusModeToDbSetting(iStatus, setting), &dbv)) { + SetDlgItemText(hwndDlg, IDC_EDIT1, dbv.ptszVal); + fcursel = SendMessage(data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)dbv.ptszVal); + if (fcursel != CB_ERR) + SendMessage(data->recent_cbex, CB_SETCURSEL, (WPARAM)fcursel, 0); + db_free(&dbv); + } + } + else if (flags & STATUS_LAST_STATUS_MSG) { + if (data->m_szProto) + mir_snprintf(setting, SIZEOF(setting), "%sMsg", data->m_szProto); + else + mir_snprintf(setting, SIZEOF(setting), "Msg"); + + if (!db_get_ts(NULL, "SRAway", StatusModeToDbSetting(iStatus, setting), &dbv)) { + SetDlgItemText(hwndDlg, IDC_EDIT1, dbv.ptszVal); + fcursel = SendMessage(data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)dbv.ptszVal); + if (fcursel != CB_ERR) + SendMessage(data->recent_cbex, CB_SETCURSEL, (WPARAM)fcursel, 0); + db_free(&dbv); + } + } + + if (fcursel != CB_ERR) + data->curr_sel_msg = fcursel; +} + +void ChangeDlgStatus(HWND hwndDlg, struct MsgBoxData *msgbox_data, int iStatus) +{ + TCHAR szTitle[256], szProtoName[128]; + BOOL bDisabled = msgbox_data->m_szProto && !(CallProtoService(msgbox_data->m_szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND); + + mir_sntprintf(szProtoName, SIZEOF(szProtoName), msgbox_data->m_szProto ? ProtoGetAccount(msgbox_data->m_szProto)->tszAccountName : TranslateT("global")); + if (iStatus == ID_STATUS_CURRENT) { + if (msgbox_data->m_bOnStartup) + mir_sntprintf(szTitle, SIZEOF(szTitle), TranslateT("%s message (%s)"), TranslateT(""), szProtoName); + else + mir_sntprintf(szTitle, SIZEOF(szTitle), TranslateT("%s message (%s)"), TranslateT(""), szProtoName); + } + else if (iStatus > ID_STATUS_CURRENT) { + TCHAR buff[128]; + + char buff1[128]; + CallService(MS_SS_GETPROFILENAME, iStatus - 40083, (LPARAM)buff1); + MultiByteToWideChar(CallService(MS_LANGPACK_GETCODEPAGE, 0, 0), 0, buff1, -1, buff, 128); + + mir_sntprintf(szTitle, SIZEOF(szTitle), TranslateT("%s message (%s)"), (TCHAR *)buff, szProtoName); + } + else + mir_sntprintf(szTitle, SIZEOF(szTitle), TranslateT("%s message (%s)"), pcli->pfnGetStatusModeDescription(iStatus, 0), szProtoName); + SetWindowText(hwndDlg, szTitle); + + if (iStatus == ID_STATUS_CURRENT) + iStatus = msgbox_data->m_bOnStartup ? GetStartupStatus(msgbox_data->m_szProto) : GetCurrentStatus(msgbox_data->m_szProto); + else if (iStatus > ID_STATUS_CURRENT) + iStatus = GetCurrentStatus(NULL); + + Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedProtoIcon(msgbox_data->m_szProto, iStatus))); + Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadSkinnedProtoIcon(msgbox_data->m_szProto, iStatus))); + + if (!bDisabled && ((Proto_Status2Flag(iStatus) & msgbox_data->m_iStatusMsgModes) + || (iStatus == ID_STATUS_OFFLINE && (Proto_Status2Flag(ID_STATUS_INVISIBLE) & msgbox_data->m_iStatusMsgModes)))) + { + int num_items = SendMessage(msgbox_data->recent_cbex, CB_GETCOUNT, 0, 0); + int fcursel = CB_ERR, num_start = num_items - msgbox_data->num_def_msgs - 1; + TCHAR msg[1024]; + + if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) + EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT1), TRUE); + + if (!IsWindowEnabled(msgbox_data->recent_cbex) && num_items) + EnableWindow(msgbox_data->recent_cbex, TRUE); + + // TODO what if num_start <= 0 ? + if (GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg))) + fcursel = SendMessage(msgbox_data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)msg); + if (fcursel != CB_ERR) { + SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, fcursel, 0); + msgbox_data->curr_sel_msg = fcursel; + } + + if ((msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { + if (!GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg))) { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); + } + else if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); + if (num_items) { + if (msgbox_data->curr_sel_msg == -1) { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); + } + else { + COMBOBOXEXITEM cbitem = {0}; + cbitem.mask = CBEIF_LPARAM | CBEIF_TEXT; + cbitem.iItem = msgbox_data->curr_sel_msg; + cbitem.cchTextMax = SIZEOF(msg); + cbitem.pszText = msg; + SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&cbitem); + if (LOWORD(cbitem.lParam) == PREDEFINED_MSG) { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); + } + else if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); + + if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), TRUE); + } + + if (msgbox_data->m_bIsMsgHistory && !IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), TRUE); + } + } + } + else { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) + EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT1), FALSE); + if (IsWindowEnabled(msgbox_data->recent_cbex)) + EnableWindow(msgbox_data->recent_cbex, FALSE); + + if ((msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); + } + } +} + +#define DM_SIMPAWAY_SHUTDOWN (WM_USER + 10) +#define DM_SIMPAWAY_CHANGEICONS (WM_USER + 11) + +INT_PTR CALLBACK AwayMsgBoxDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + struct MsgBoxData *msgbox_data = (struct MsgBoxData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + switch (uMsg) { + case WM_INITDIALOG: + { + TCHAR szTitle[256], szFormat[256], szProtoName[128]; + struct MsgBoxInitData *init_data; + struct MsgBoxData *copy_init_data; + INITCOMMONCONTROLSEX icex = {0}; + BOOL bCurrentStatus = FALSE, bDisabled = FALSE; + + InitCommonControls(); + icex.dwSize = sizeof(INITCOMMONCONTROLSEX); + icex.dwICC = ICC_USEREX_CLASSES; + InitCommonControlsEx(&icex); + + TranslateDialogDefault(hwndDlg); + init_data = (struct MsgBoxInitData *)lParam; + GetWindowText(hwndDlg, szFormat, SIZEOF(szFormat)); + mir_sntprintf(szProtoName, SIZEOF(szProtoName), init_data->m_szProto ? ProtoGetAccount(init_data->m_szProto)->tszAccountName : TranslateT("global")); + + if (init_data->m_iStatus == ID_STATUS_CURRENT) { + if (init_data->m_bOnStartup) + mir_sntprintf(szTitle, SIZEOF(szTitle), szFormat, TranslateT(""), szProtoName); + else + mir_sntprintf(szTitle, SIZEOF(szTitle), szFormat, TranslateT(""), szProtoName); + } + else + mir_sntprintf(szTitle, SIZEOF(szTitle), szFormat, pcli->pfnGetStatusModeDescription(init_data->m_iStatus, 0), szProtoName); + SetWindowText(hwndDlg, szTitle); + + int icoStatus = ID_STATUS_OFFLINE; + if (init_data->m_iStatus == ID_STATUS_CURRENT) + icoStatus = init_data->m_bOnStartup ? GetStartupStatus(init_data->m_szProto) : GetCurrentStatus(init_data->m_szProto); + else + icoStatus = init_data->m_iStatus; + if (icoStatus < ID_STATUS_OFFLINE) + icoStatus = ID_STATUS_OFFLINE; + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedProtoIcon(init_data->m_szProto, icoStatus)); + SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadSkinnedProtoIcon(init_data->m_szProto, icoStatus)); + + copy_init_data = (struct MsgBoxData *)mir_alloc(sizeof(struct MsgBoxData)); + + SendDlgItemMessage(hwndDlg, IDC_EDIT1, EM_LIMITTEXT, 1024, 0); + + HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwndDlg, DM_SIMPAWAY_SHUTDOWN); + HookEventMessage(ME_SKIN2_ICONSCHANGED, hwndDlg, DM_SIMPAWAY_CHANGEICONS); + + copy_init_data->num_def_msgs = db_get_w(NULL, "SimpleStatusMsg", "DefMsgCount", 0); + copy_init_data->max_hist_msgs = db_get_b(NULL, "SimpleStatusMsg", "MaxHist", 10); + copy_init_data->m_iDlgFlags = db_get_b(NULL, "SimpleStatusMsg", "DlgFlags", DLG_SHOW_DEFAULT); + copy_init_data->m_szProto = init_data->m_szProto; + copy_init_data->m_iStatus = init_data->m_iStatus; + copy_init_data->m_iStatusModes = init_data->m_iStatusModes; + copy_init_data->m_iStatusMsgModes = init_data->m_iStatusMsgModes; + copy_init_data->m_iInitialStatus = init_data->m_iStatus; + copy_init_data->m_bOnStartup = init_data->m_bOnStartup; + + //Load Icons + copy_init_data->icon[I_ICON_DEL] = LoadIconEx("cross"); + copy_init_data->icon[I_ICON_HIST] = LoadIconEx("recent"); + copy_init_data->icon[I_ICON_MSG] = LoadIconEx("predef"); + copy_init_data->icon[I_ICON_ADD] = LoadIconEx("add"); + copy_init_data->icon[I_ICON_CLEAR] = LoadIconEx("clear"); + if (copy_init_data->m_iDlgFlags & DLG_SHOW_STATUS_ICONS) + copy_init_data->status_icons = AddStatusIconsToImageList(init_data->m_szProto, copy_init_data->m_iStatusModes); + if (copy_init_data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) + copy_init_data->other_icons = AddOtherIconsToImageList(copy_init_data); + + if ((copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { + SendMessage(GetDlgItem(hwndDlg, IDC_BADD), BUTTONADDTOOLTIP, (WPARAM)Translate("Add to predefined"), 0); + SendMessage(GetDlgItem(hwndDlg, IDC_BADD), BM_SETIMAGE, IMAGE_ICON, (LPARAM)copy_init_data->icon[I_ICON_ADD]); + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); + ShowWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); + + SendMessage(GetDlgItem(hwndDlg, IDC_BDEL), BUTTONADDTOOLTIP, (WPARAM)Translate("Delete selected"), 0); + SendMessage(GetDlgItem(hwndDlg, IDC_BDEL), BM_SETIMAGE, IMAGE_ICON, (LPARAM)copy_init_data->icon[I_ICON_DEL]); + ShowWindow(GetDlgItem(hwndDlg, IDC_BDEL), TRUE); + + SendMessage(GetDlgItem(hwndDlg, IDC_BCLEAR), BUTTONADDTOOLTIP, (WPARAM)Translate("Clear history"), 0); + SendMessage(GetDlgItem(hwndDlg, IDC_BCLEAR), BM_SETIMAGE, IMAGE_ICON, (LPARAM)copy_init_data->icon[I_ICON_CLEAR]); + ShowWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), TRUE); + + if (copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT) { + SendMessage(GetDlgItem(hwndDlg, IDC_BADD), BUTTONSETASFLATBTN, TRUE, 0); + SendMessage(GetDlgItem(hwndDlg, IDC_BDEL), BUTTONSETASFLATBTN, TRUE, 0); + SendMessage(GetDlgItem(hwndDlg, IDC_BCLEAR), BUTTONSETASFLATBTN, TRUE, 0); + } + } + else { + SetWindowPos(GetDlgItem(hwndDlg, IDC_OK), NULL, 52, 115, 0, 0, SWP_NOSIZE | SWP_NOZORDER); + SetWindowPos(GetDlgItem(hwndDlg, IDC_CANCEL), NULL, 160, 115, 0, 0, SWP_NOSIZE | SWP_NOZORDER); + ShowWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); + ShowWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); + ShowWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); + } + copy_init_data->status_cbex = CreateStatusComboBoxEx(hwndDlg, copy_init_data); + + if (copy_init_data->m_iStatus == ID_STATUS_CURRENT) { + if (copy_init_data->m_bOnStartup) + copy_init_data->m_iStatus = GetStartupStatus(copy_init_data->m_szProto); + else + copy_init_data->m_iStatus = GetCurrentStatus(copy_init_data->m_szProto); + if (copy_init_data->m_szProto == NULL) + bCurrentStatus = TRUE; + } + + copy_init_data->recent_cbex = CreateRecentComboBoxEx(hwndDlg, copy_init_data); + copy_init_data->curr_sel_msg = -1; + copy_init_data->m_bPredefChanged = FALSE; + + SetEditControlText(copy_init_data, hwndDlg, copy_init_data->m_iStatus); + if ((copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { + TCHAR msg[1024]; + + if (!GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); + + if (copy_init_data->curr_sel_msg == -1) { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); + } + else { + COMBOBOXEXITEM cbitem = {0}; + cbitem.mask = CBEIF_LPARAM | CBEIF_TEXT; + cbitem.iItem = copy_init_data->curr_sel_msg; + cbitem.cchTextMax = SIZEOF(msg); + cbitem.pszText = msg; + + SendMessage(copy_init_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&cbitem); + if (LOWORD(cbitem.lParam) == PREDEFINED_MSG) { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); + } + else if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); + } + } + + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)copy_init_data); + + if (copy_init_data->m_szProto && !(CallProtoService(copy_init_data->m_szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) + bDisabled = TRUE; + + if (!(((Proto_Status2Flag(copy_init_data->m_iStatus) & copy_init_data->m_iStatusMsgModes) + || (copy_init_data->m_iStatus == ID_STATUS_OFFLINE && (Proto_Status2Flag(ID_STATUS_INVISIBLE) & copy_init_data->m_iStatusMsgModes))) && !bDisabled)) + { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) + EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT1), FALSE); + if (IsWindowEnabled(copy_init_data->recent_cbex)) + EnableWindow(copy_init_data->recent_cbex, FALSE); + + if ((copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (copy_init_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); + } + } + + if (db_get_b(NULL, "SimpleStatusMsg", "AutoClose", 1) && init_data->m_bOnEvent) { + copy_init_data->m_iCountdown = db_get_b(NULL, "SimpleStatusMsg", "DlgTime", 5); + SendMessage(hwndDlg, WM_TIMER, 0, 0); + SetTimer(hwndDlg, 1, 1000, 0); + } + else { + copy_init_data->m_iCountdown = -2; + DisplayCharsCount(copy_init_data, hwndDlg); + } + + if (bCurrentStatus) + copy_init_data->m_iStatus = ID_STATUS_CURRENT; + + mir_subclassWindow( GetDlgItem(hwndDlg, IDC_EDIT1), EditBoxSubProc); + if (!init_data->m_bOnEvent && IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) { + SetFocus(GetDlgItem(hwndDlg, IDC_EDIT1)); + SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), EM_SETSEL, 0, -1); + } + else + SetFocus(GetDlgItem(hwndDlg, IDC_OK)); + + mir_free(init_data); + + if (!db_get_b(NULL, "SimpleStatusMsg", "WinCentered", 1)) { + WINDOWPLACEMENT wp; + int x, y; + + wp.length = sizeof(wp); + GetWindowPlacement(hwndDlg, &wp); + + x = (int)db_get_dw(NULL, "SimpleStatusMsg", "Winx", -1); + y = (int)db_get_dw(NULL, "SimpleStatusMsg", "Winy", -1); + + if (x !=- 1) { + OffsetRect(&wp.rcNormalPosition, x - wp.rcNormalPosition.left, y - wp.rcNormalPosition.top); + wp.flags = 0; + SetWindowPlacement(hwndDlg, &wp); + } + } + return FALSE; + } + + case WM_TIMER: + if (msgbox_data->m_iCountdown == -1) { + SendMessage(hwndDlg, WM_COMMAND, (WPARAM)IDC_OK, 0); + msgbox_data->m_iCountdown = -2; + DisplayCharsCount(msgbox_data, hwndDlg); + break; + } + else { + TCHAR str[64]; + mir_sntprintf(str, SIZEOF(str), TranslateT("Closing in %d"), msgbox_data->m_iCountdown); + SetDlgItemText(hwndDlg, IDC_OK, str); + } + msgbox_data->m_iCountdown--; + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDC_OK: + { + TCHAR tszMsg[1024]; + int iStatus, iMsgLen = 0, iProfileStatus = 0; + BOOL bCurrentStatus = FALSE; + + if (msgbox_data->m_iStatus == ID_STATUS_CURRENT) { + msgbox_data->m_iStatus = msgbox_data->m_bOnStartup ? GetStartupStatus(msgbox_data->m_szProto) : GetCurrentStatus(msgbox_data->m_szProto); + if (msgbox_data->m_szProto == NULL) + bCurrentStatus = TRUE; + } + else if (msgbox_data->m_iStatus >= ID_STATUS_CURRENT) { + iProfileStatus = msgbox_data->m_iStatus; + msgbox_data->m_iStatus = GetCurrentStatus(NULL); + } + + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) + iMsgLen = GetDlgItemText(hwndDlg, IDC_EDIT1, tszMsg, SIZEOF(tszMsg)); + + if (iMsgLen == 0) { + char szSetting[80]; + if (msgbox_data->m_szProto) { + mir_snprintf(szSetting, SIZEOF(szSetting), "Last%sMsg", msgbox_data->m_szProto); + db_set_s(NULL, "SimpleStatusMsg", szSetting, ""); + + mir_snprintf(szSetting, SIZEOF(szSetting), "%sMsg", msgbox_data->m_szProto); + db_set_ts(NULL, "SRAway", StatusModeToDbSetting(msgbox_data->m_iStatus, szSetting), _T("")); + } + else { + db_set_s(NULL, "SimpleStatusMsg", "LastMsg", ""); + for (int j = 0; j < accounts->count; j++) { + if (!IsAccountEnabled(accounts->pa[j])) + continue; + + if (!CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0)) + continue; + + if (db_get_b(NULL, accounts->pa[j]->szModuleName, "LockMainStatus", 0)) + continue; + + if (!(CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) + continue; + + mir_snprintf(szSetting, SIZEOF(szSetting), "Last%sMsg", accounts->pa[j]->szModuleName); + db_set_s(NULL, "SimpleStatusMsg", szSetting, ""); + + mir_snprintf(szSetting, SIZEOF(szSetting), "%sMsg", accounts->pa[j]->szModuleName); + iStatus = msgbox_data->m_bOnStartup ? GetStartupStatus(accounts->pa[j]->szModuleName) : GetCurrentStatus(accounts->pa[j]->szModuleName); + db_set_ts(NULL, "SRAway", StatusModeToDbSetting(iStatus, szSetting), _T("")); + } + + db_set_ts(NULL, "SRAway", StatusModeToDbSetting(msgbox_data->m_iStatus, "Msg"), _T("")); // for compatibility with some plugins + } + + if (bCurrentStatus) + SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, ID_STATUS_CURRENT, 0, msgbox_data->m_bOnStartup); + else if (iProfileStatus != 0) + SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, iProfileStatus, 0, FALSE); + else + SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, msgbox_data->m_iStatus, 0, msgbox_data->m_bOnStartup); + } + else { + char buff[64], buff2[80]; + DBVARIANT dbv; + BOOL found = FALSE; + + for (int i = 1; i <= msgbox_data->max_hist_msgs; i++) { + mir_snprintf(buff, SIZEOF(buff), "SMsg%d", i); + if (!db_get_ts(NULL, "SimpleStatusMsg", buff, &dbv)) { + if (!lstrcmp(dbv.ptszVal, tszMsg)) { + found = TRUE; + if (msgbox_data->m_szProto) { + mir_snprintf(buff2, SIZEOF(buff2), "Last%sMsg", msgbox_data->m_szProto); + db_set_s(NULL, "SimpleStatusMsg", buff2, buff); + + mir_snprintf(buff2, SIZEOF(buff2), "%sMsg", msgbox_data->m_szProto); + db_set_ts(NULL, "SRAway", StatusModeToDbSetting(msgbox_data->m_iStatus, buff2), tszMsg); + } + else { + db_set_s(NULL, "SimpleStatusMsg", "LastMsg", buff); + for (int j = 0; j < accounts->count; j++) { + if (!IsAccountEnabled(accounts->pa[j])) + continue; + + if (!CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0)) + continue; + + if (db_get_b(NULL, accounts->pa[j]->szModuleName, "LockMainStatus", 0)) + continue; + + if (!(CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) + continue; + + mir_snprintf(buff2, SIZEOF(buff2), "Last%sMsg", accounts->pa[j]->szModuleName); + db_set_s(NULL, "SimpleStatusMsg", buff2, buff); + + mir_snprintf(buff2, SIZEOF(buff2), "%sMsg", accounts->pa[j]->szModuleName); + iStatus = msgbox_data->m_bOnStartup ? GetStartupStatus(accounts->pa[j]->szModuleName) : GetCurrentStatus(accounts->pa[j]->szModuleName); + db_set_ts(NULL, "SRAway", StatusModeToDbSetting(iStatus, buff2), tszMsg); + } + } + db_free(&dbv); + break; + } + db_free(&dbv); + } + } + + if (!found) { + int last_modified_msg = db_get_w(NULL, "SimpleStatusMsg", "LMMsg", msgbox_data->max_hist_msgs); + + if (last_modified_msg == msgbox_data->max_hist_msgs) + last_modified_msg = 1; + else + last_modified_msg++; + + mir_snprintf(buff, SIZEOF(buff), "SMsg%d", last_modified_msg); + db_set_ts(NULL, "SimpleStatusMsg", buff, tszMsg); + + if (msgbox_data->m_szProto) { + mir_snprintf(buff2, SIZEOF(buff2), "Last%sMsg", msgbox_data->m_szProto); + db_set_s(NULL, "SimpleStatusMsg", buff2, buff); + + mir_snprintf(buff2, SIZEOF(buff2), "%sMsg", msgbox_data->m_szProto); + db_set_ts(NULL, "SRAway", StatusModeToDbSetting(msgbox_data->m_iStatus, buff2), tszMsg); + } + else { + db_set_s(NULL, "SimpleStatusMsg", "LastMsg", buff); + for (int j = 0; j < accounts->count; j++) { + if (!IsAccountEnabled(accounts->pa[j])) + continue; + + if (!CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0)) + continue; + + if (db_get_b(NULL, accounts->pa[j]->szModuleName, "LockMainStatus", 0)) + continue; + + if (!(CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) + continue; + + mir_snprintf(buff2, SIZEOF(buff2), "Last%sMsg", accounts->pa[j]->szModuleName); + db_set_s(NULL, "SimpleStatusMsg", buff2, buff); + + mir_snprintf(buff2, SIZEOF(buff2), "%sMsg", accounts->pa[j]->szModuleName); + iStatus = msgbox_data->m_bOnStartup ? GetStartupStatus(accounts->pa[j]->szModuleName) : GetCurrentStatus(accounts->pa[j]->szModuleName); + db_set_ts(NULL, "SRAway", StatusModeToDbSetting(iStatus, buff2), tszMsg); + } + } + db_set_w(NULL, "SimpleStatusMsg", "LMMsg", (WORD)last_modified_msg); + } + + if (!msgbox_data->m_szProto) + db_set_ts(NULL, "SRAway", StatusModeToDbSetting(msgbox_data->m_iStatus, "Msg"), tszMsg); // for compatibility with some plugins + + if (bCurrentStatus) + SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, ID_STATUS_CURRENT, tszMsg, msgbox_data->m_bOnStartup); + else if (iProfileStatus != 0) + SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, iProfileStatus, tszMsg, FALSE); + else + SetStatusMessage(msgbox_data->m_szProto, msgbox_data->m_iInitialStatus, msgbox_data->m_iStatus, tszMsg, msgbox_data->m_bOnStartup); + } + } + + case IDCANCEL: + case IDC_CANCEL: + DestroyWindow(hwndDlg); + return TRUE; + + case IDC_EDIT1: // Notification from the edit control + if (msgbox_data->m_iCountdown > -2) { + KillTimer(hwndDlg, 1); + msgbox_data->m_iCountdown = -2; + DisplayCharsCount(msgbox_data, hwndDlg); + } + switch (HIWORD(wParam)) { + case EN_CHANGE: + DisplayCharsCount(msgbox_data, hwndDlg); + SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, -1, 0); + if ((msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { + TCHAR msg[1024]; + + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); + + if (!GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg))) { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); + } + else if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); + } + break; + } + break; + } + + if ((HWND)lParam == msgbox_data->status_cbex) { + if (msgbox_data->m_iCountdown > -2) { + KillTimer(hwndDlg, 1); + msgbox_data->m_iCountdown = -2; + DisplayCharsCount(msgbox_data, hwndDlg); + } + switch (HIWORD(wParam)) { + case CBN_SELENDOK: + case CBN_SELCHANGE: + { + COMBOBOXEXITEM cbitem = {0}; + + cbitem.mask = CBEIF_LPARAM; + cbitem.iItem = SendMessage(msgbox_data->status_cbex, CB_GETCURSEL, 0, 0); + SendMessage(msgbox_data->status_cbex, CBEM_GETITEM, 0, (LPARAM)&cbitem); + + msgbox_data->m_iStatus = cbitem.lParam; + ChangeDlgStatus(hwndDlg, msgbox_data, (int)cbitem.lParam); + + if (HIWORD(wParam) == CBN_SELENDOK && IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) + SetFocus(GetDlgItem(hwndDlg, IDC_EDIT1)); + break; + } + } + } + + if ((HWND)lParam == msgbox_data->recent_cbex) { + if (msgbox_data->m_iCountdown > -2) { + KillTimer(hwndDlg, 1); + msgbox_data->m_iCountdown = -2; + DisplayCharsCount(msgbox_data, hwndDlg); + } + switch (HIWORD(wParam)) { + case CBN_SELENDOK: + { + TCHAR text[1024]; + int cur_sel = SendMessage(msgbox_data->recent_cbex, CB_GETCURSEL, 0, 0); + COMBOBOXEXITEM cbitem = {0}; + + cbitem.mask = CBEIF_LPARAM | CBEIF_TEXT; + cbitem.iItem = cur_sel; + cbitem.cchTextMax = SIZEOF(text); + cbitem.pszText = text; + + SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&cbitem); + if (LOWORD(cbitem.lParam) == HISTORY_MSG || LOWORD(cbitem.lParam) == PREDEFINED_MSG || LOWORD(cbitem.lParam) == DEFAULT_MSG) + { + SetDlgItemText(hwndDlg, IDC_EDIT1, text); + DisplayCharsCount(msgbox_data, hwndDlg); + if ((msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { + if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), TRUE); + if (LOWORD(cbitem.lParam) == PREDEFINED_MSG) { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); + } + else if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), TRUE); + } + } + else if (LOWORD(cbitem.lParam) == CLEAR_HISTORY) { + if (MessageBox(NULL, TranslateT("Are you sure you want to clear status message history?"), TranslateT("Confirm clearing history"), MB_ICONQUESTION | MB_YESNO) == IDYES) + ClearHistory(msgbox_data, cur_sel); + else if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) { + TCHAR msg[1024]; + int fcursel = CB_ERR, num_start; + num_start = SendMessage(msgbox_data->recent_cbex, CB_GETCOUNT, 0, 0); + num_start -= msgbox_data->num_def_msgs + 1; + GetDlgItemText(hwndDlg, IDC_EDIT1, msg, SIZEOF(msg)); + fcursel = SendMessage(msgbox_data->recent_cbex, CB_FINDSTRINGEXACT, num_start, (LPARAM)msg); + SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, fcursel, 0); + } + } + else if (LOWORD(cbitem.lParam) == DELETE_SELECTED) { + COMBOBOXEXITEM histitem = {0}; + BOOL scursel = FALSE; + + histitem.mask = CBEIF_LPARAM; + histitem.iItem = msgbox_data->curr_sel_msg; + SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); + + if (LOWORD(histitem.lParam) == HISTORY_MSG) { + char szSetting[16]; + mir_snprintf(szSetting, SIZEOF(szSetting), "SMsg%d", (int)HIWORD(histitem.lParam)); + db_set_ts(NULL, "SimpleStatusMsg", szSetting, _T("")); + SendMessage(msgbox_data->recent_cbex, CBEM_DELETEITEM, (WPARAM)msgbox_data->curr_sel_msg, 0); + } + if (LOWORD(histitem.lParam) == PREDEFINED_MSG) { + msgbox_data->m_bPredefChanged = TRUE; + SendMessage(msgbox_data->recent_cbex, CBEM_DELETEITEM, (WPARAM)msgbox_data->curr_sel_msg, 0); + } + + cur_sel = msgbox_data->curr_sel_msg; + while (!scursel) { + if (cur_sel - 1 >= 0) + cur_sel--; + else { + scursel = TRUE; + break; + } + histitem.mask = CBEIF_LPARAM; + histitem.iItem = cur_sel; + SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); + + if ((LOWORD(histitem.lParam) != CLEAR_HISTORY) && (LOWORD(histitem.lParam) != DELETE_SELECTED) && (LOWORD(histitem.lParam) != ADD_MSG)) + scursel = TRUE; + } + msgbox_data->curr_sel_msg = cur_sel; + SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, (WPARAM)cur_sel, 0); + + histitem.mask = CBEIF_LPARAM | CBEIF_TEXT; + histitem.iItem = cur_sel; + histitem.cchTextMax = SIZEOF(text); + histitem.pszText = text; + + SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); + if (LOWORD(histitem.lParam) == HISTORY_MSG || LOWORD(histitem.lParam) == PREDEFINED_MSG || LOWORD(histitem.lParam) == DEFAULT_MSG) + { + SetDlgItemText(hwndDlg, IDC_EDIT1, text); + DisplayCharsCount(msgbox_data, hwndDlg); + } + } + else if (LOWORD(cbitem.lParam) == ADD_MSG) { + int sel = AddToPredefined(hwndDlg, msgbox_data); + if (sel != -1) { + SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, (WPARAM)sel, 0); + msgbox_data->curr_sel_msg = sel; + } + else + SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, (WPARAM)msgbox_data->curr_sel_msg, 0); + break; + } + msgbox_data->curr_sel_msg = cur_sel; + + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT1))) { + SetFocus(GetDlgItem(hwndDlg, IDC_EDIT1)); + SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), EM_SETSEL, 0, -1); + } + break; + } + } + } + + if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_BADD)) { + switch (HIWORD(wParam)) { + case BN_CLICKED: + { + int sel = AddToPredefined(hwndDlg, msgbox_data); + if (sel != -1) { + if (!IsWindowEnabled(msgbox_data->recent_cbex)) + EnableWindow(msgbox_data->recent_cbex, TRUE); + if (!IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BDEL))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), TRUE); + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BADD))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), FALSE); + + SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, (WPARAM)sel, 0); + msgbox_data->curr_sel_msg = sel; + } + break; + } + } + } + + if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_BCLEAR)) { + switch (HIWORD(wParam)) { + case BN_CLICKED: + if (MessageBox(NULL, TranslateT("Are you sure you want to clear status message history?"), TranslateT("Confirm clearing history"), MB_ICONQUESTION | MB_YESNO) == IDYES) + { + ClearHistory(msgbox_data, 0); + + int num_items = SendMessage(msgbox_data->recent_cbex, CB_GETCOUNT, 0, 0); + if (!num_items) { + if (IsWindowEnabled(msgbox_data->recent_cbex)) { + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); + EnableWindow(msgbox_data->recent_cbex, FALSE); + } + } + EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); + } + break; + } + } + + if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_BDEL)) { + switch (HIWORD(wParam)) { + case BN_CLICKED: + { + int cur_sel; + char buff[16]; + int left_items = 0; + COMBOBOXEXITEM histitem = {0}; + + cur_sel = SendMessage(msgbox_data->recent_cbex, CB_GETCURSEL, 0, 0); + + histitem.mask = CBEIF_LPARAM; + histitem.iItem = msgbox_data->curr_sel_msg; + + SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); + + if (LOWORD(histitem.lParam) == HISTORY_MSG) { + mir_snprintf(buff, SIZEOF(buff), "SMsg%d", (int)HIWORD(histitem.lParam)); + db_set_ts(NULL, "SimpleStatusMsg", buff, _T("")); + } + else if (LOWORD(histitem.lParam) == PREDEFINED_MSG) + msgbox_data->m_bPredefChanged = TRUE; + left_items = SendMessage(msgbox_data->recent_cbex, CBEM_DELETEITEM, (WPARAM)msgbox_data->curr_sel_msg, 0); + + if (!left_items) { + if (IsWindowEnabled(msgbox_data->recent_cbex)) + EnableWindow(msgbox_data->recent_cbex, FALSE); + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_BCLEAR))) + EnableWindow(GetDlgItem(hwndDlg, IDC_BCLEAR), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BDEL), FALSE); + } + else { + TCHAR text[1024]; + + if (cur_sel - 1 >= 0) + cur_sel--; + msgbox_data->curr_sel_msg = cur_sel; + SendMessage(msgbox_data->recent_cbex, CB_SETCURSEL, (WPARAM)cur_sel, 0); + + histitem.mask = CBEIF_LPARAM | CBEIF_TEXT; + histitem.iItem = cur_sel; + histitem.cchTextMax = SIZEOF(text); + histitem.pszText = text; + + SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&histitem); + if (LOWORD(histitem.lParam) == HISTORY_MSG || LOWORD(histitem.lParam) == PREDEFINED_MSG || LOWORD(histitem.lParam) == DEFAULT_MSG) + { + SetDlgItemText(hwndDlg, IDC_EDIT1, text); + DisplayCharsCount(msgbox_data, hwndDlg); + EnableWindow(GetDlgItem(hwndDlg, IDC_BADD), LOWORD(histitem.lParam) == PREDEFINED_MSG ? FALSE : TRUE); + } + } + break; + } + } + } + break; + + case DM_SIMPAWAY_SHUTDOWN: + DestroyWindow(hwndDlg); + break; + + case DM_SIMPAWAY_CHANGEICONS: + ReleaseIconEx("cross"); + ReleaseIconEx("recent"); + ReleaseIconEx("predef"); + ReleaseIconEx("add"); + ReleaseIconEx("clear"); + msgbox_data->icon[I_ICON_DEL] = LoadIconEx("cross"); + msgbox_data->icon[I_ICON_HIST] = LoadIconEx("recent"); + msgbox_data->icon[I_ICON_MSG] = LoadIconEx("predef"); + msgbox_data->icon[I_ICON_ADD] = LoadIconEx("add"); + msgbox_data->icon[I_ICON_CLEAR] = LoadIconEx("clear"); + if (msgbox_data->m_iDlgFlags & DLG_SHOW_LIST_ICONS) { + for (int i = 0; i < 5; ++i) + ImageList_ReplaceIcon(msgbox_data->other_icons, i, msgbox_data->icon[i]); + } + if ((msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS) || (msgbox_data->m_iDlgFlags & DLG_SHOW_BUTTONS_FLAT)) { + SendMessage(GetDlgItem(hwndDlg, IDC_BADD), BM_SETIMAGE, IMAGE_ICON, (LPARAM)msgbox_data->icon[I_ICON_ADD]); + SendMessage(GetDlgItem(hwndDlg, IDC_BCLEAR), BM_SETIMAGE, IMAGE_ICON, (LPARAM)msgbox_data->icon[I_ICON_CLEAR]); + SendMessage(GetDlgItem(hwndDlg, IDC_BDEL), BM_SETIMAGE, IMAGE_ICON, (LPARAM)msgbox_data->icon[I_ICON_DEL]); + } + break; + + case WM_DESTROY: + if (msgbox_data == NULL) + break; + { + WINDOWPLACEMENT wp; + wp.length = sizeof(wp); + GetWindowPlacement(hwndDlg, &wp); + db_set_dw(NULL, "SimpleStatusMsg", "Winx", wp.rcNormalPosition.left); + db_set_dw(NULL, "SimpleStatusMsg", "Winy", wp.rcNormalPosition.top); + + if (msgbox_data->m_bPredefChanged) { + int i, num_items, new_num_def_msgs = 0; + COMBOBOXEXITEM cbitem = {0}; + TCHAR text[1024]; + char buff[64]; + + num_items = SendMessage(msgbox_data->recent_cbex, CB_GETCOUNT, 0, 0); + num_items--; + for (i = 1; i <= msgbox_data->num_def_msgs; i++) { + cbitem.mask = CBEIF_LPARAM | CBEIF_TEXT; + cbitem.iItem = num_items; + cbitem.cchTextMax = SIZEOF(text); + cbitem.pszText = text; + + SendMessage(msgbox_data->recent_cbex, CBEM_GETITEM, 0, (LPARAM)&cbitem); + mir_snprintf(buff, SIZEOF(buff), "DefMsg%d", i); + if (LOWORD(cbitem.lParam) == PREDEFINED_MSG) { + new_num_def_msgs++; + db_set_ts(NULL, "SimpleStatusMsg", buff, text); + } + else + db_unset(NULL, "SimpleStatusMsg", buff); + num_items--; + } + db_set_w(NULL, "SimpleStatusMsg", "DefMsgCount", (WORD)new_num_def_msgs); + } + + ImageList_Destroy(msgbox_data->status_icons); + ImageList_Destroy(msgbox_data->other_icons); + ReleaseIconEx("cross"); + ReleaseIconEx("recent"); + ReleaseIconEx("predef"); + ReleaseIconEx("add"); + ReleaseIconEx("clear"); + Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); + Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0)); + + hwndSAMsgDialog = NULL; + mir_free(msgbox_data); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); + break; + } + } + return FALSE; +} -- cgit v1.2.3