diff options
Diffstat (limited to 'plugins/SimpleStatusMsg/src')
| -rw-r--r-- | plugins/SimpleStatusMsg/src/msgbox.cpp | 3270 | 
1 files changed, 1636 insertions, 1634 deletions
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("<startup>");
 -	else
 -		status_desc = (TCHAR *)TranslateT("<current>");
 -	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("<startup>"), szProtoName);
 -		else
 -			mir_sntprintf(szTitle, SIZEOF(szTitle), TranslateT("%s message (%s)"), TranslateT("<current>"), 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("<startup>"), szProtoName);
 -				else
 -					mir_sntprintf(szTitle, SIZEOF(szTitle), szFormat, TranslateT("<current>"), 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("<startup>"); +	else +		status_desc = (TCHAR *)TranslateT("<current>"); +	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("<startup>"), szProtoName); +		else +			mir_sntprintf(szTitle, SIZEOF(szTitle), TranslateT("%s message (%s)"), TranslateT("<current>"), 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("<startup>"), szProtoName); +				else +					mir_sntprintf(szTitle, SIZEOF(szTitle), szFormat, TranslateT("<current>"), 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; +}  | 
