/* 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" #include "simplestatusmsg.h" extern UINT_PTR g_uUpdateMsgTimer; extern VOID CALLBACK UpdateMsgTimerProc(HWND, UINT, UINT_PTR, DWORD); extern VOID APIENTRY HandlePopupMenu(HWND hwnd, POINT pt, HWND edit_control); static WNDPROC OldDlgProc; static void RebuildStatusMenu(void) { CLIST_INTERFACE* pcli = (CLIST_INTERFACE*)CallService(MS_CLIST_RETRIEVE_INTERFACE, 0, 0); if (pcli && pcli->version > 4) pcli->pfnReloadProtoMenus(); } static LRESULT CALLBACK OptEditBoxSubProc(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_OPTEDIT1)); return 0; } case WM_CHAR: if (wParam == 1 && GetKeyState(VK_CONTROL) & 0x8000) // Ctrl + A { SendMessage(hwndDlg, EM_SETSEL, 0, -1); 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; } return CallWindowProc(OldDlgProc, hwndDlg, uMsg, wParam, lParam); } struct SingleProtoMsg { int flags; TCHAR *msg; int max_length; }; struct SingleStatusMsg { int flags[9]; TCHAR msg[9][1024]; }; struct OptDlgData { BOOL proto_ok; struct SingleProtoMsg *proto_msg; struct SingleStatusMsg *status_msg; }; static INT_PTR CALLBACK DlgOptionsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { struct OptDlgData *data = (struct OptDlgData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (uMsg) { case WM_INITDIALOG: { int val, i, index; DBVARIANT dbv; TranslateDialogDefault(hwndDlg); data = (struct OptDlgData *)mir_alloc(sizeof(struct OptDlgData)); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)data); SendDlgItemMessage(hwndDlg, IDC_OPTEDIT1, EM_LIMITTEXT, 1024, 0); SendMessage(GetDlgItem(hwndDlg, IDC_SMAXLENGTH), UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_EMAXLENGTH), 0); SendMessage(GetDlgItem(hwndDlg, IDC_SMAXLENGTH), UDM_SETRANGE32, 1, 1024); SendMessage(GetDlgItem(hwndDlg, IDC_EMAXLENGTH), EM_LIMITTEXT, 4, 0); data->status_msg = (struct SingleStatusMsg *)mir_alloc(sizeof(struct SingleStatusMsg)*(accounts->count + 1)); for (i = ID_STATUS_ONLINE; i <= ID_STATUS_OUTTOLUNCH; i++) { if (accounts->statusMsgFlags & Proto_Status2Flag(i)) { index = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_INSERTSTRING, -1, (LPARAM)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, i, GSMDF_TCHAR)); if (index != CB_ERR && index != CB_ERRSPACE) { int j; char setting[80]; SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_SETITEMDATA, (WPARAM)index, (LPARAM)i - ID_STATUS_ONLINE); val = DBGetContactSettingByte(NULL, "SimpleStatusMsg", (char *)StatusModeToDbSetting(i, "Flags"), STATUS_DEFAULT); data->status_msg[0].flags[i - ID_STATUS_ONLINE] = val; if (DBGetContactSettingTString(NULL, "SRAway", StatusModeToDbSetting(i, "Default"), &dbv)) dbv.ptszVal = mir_tstrdup(GetDefaultMessage(i)); lstrcpy(data->status_msg[0].msg[i - ID_STATUS_ONLINE], dbv.ptszVal); mir_free(dbv.ptszVal); DBFreeVariant(&dbv); for (j = 0; j < accounts->count; j++) { if (!IsAccountEnabled(accounts->pa[j]) || !CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0) || !(CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) continue; mir_snprintf(setting, SIZEOF(setting), "%sFlags", accounts->pa[j]->szModuleName); val = DBGetContactSettingByte(NULL, "SimpleStatusMsg", (char *)StatusModeToDbSetting(i, setting), STATUS_DEFAULT); data->status_msg[j+1].flags[i-ID_STATUS_ONLINE] = val; mir_snprintf(setting, SIZEOF(setting), "%sDefault", accounts->pa[j]->szModuleName); if (DBGetContactSettingTString(NULL, "SRAway", StatusModeToDbSetting(i, setting), &dbv)) dbv.ptszVal = mir_tstrdup(GetDefaultMessage(i)); lstrcpy(data->status_msg[j + 1].msg[i - ID_STATUS_ONLINE], dbv.ptszVal); mir_free(dbv.ptszVal); DBFreeVariant(&dbv); } } } } SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_SETCURSEL, 0, 0); data->proto_msg = (struct SingleProtoMsg *)mir_alloc(sizeof(struct SingleProtoMsg)*(accounts->count + 1)); if (!data->proto_msg) { // TODO not really needed? EnableWindow(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTPROTO), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTPROTO1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTPROTO2), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTPROTO3), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTPROTO4), FALSE); data->proto_ok = FALSE; } else { char setting[64]; data->proto_ok = TRUE; index = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_ADDSTRING, 0, (LPARAM)TranslateT("Global status change")); // SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_SETITEMDATA, index, 0); if (index != CB_ERR && index != CB_ERRSPACE) { data->proto_msg[0].msg = NULL; val = DBGetContactSettingByte(NULL, "SimpleStatusMsg", "ProtoFlags", PROTO_DEFAULT); data->proto_msg[0].flags = val; data->proto_msg[0].max_length = 0; SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_SETITEMDATA, (WPARAM)index, 0); } for (i = 0; i < accounts->count; ++i) { if (!IsAccountEnabled(accounts->pa[i]) || !CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0) || !(CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) { data->proto_msg[i+1].msg = NULL; continue; } index = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_ADDSTRING, 0, (LPARAM)accounts->pa[i]->tszAccountName); // SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_SETITEMDATA, index, (LPARAM)i + 1); if (index != CB_ERR && index != CB_ERRSPACE) { mir_snprintf(setting, SIZEOF(setting), "Proto%sDefault", accounts->pa[i]->szModuleName); if (!DBGetContactSettingTString(NULL, "SimpleStatusMsg", setting, &dbv)) { data->proto_msg[i+1].msg = mir_tstrdup(dbv.ptszVal); DBFreeVariant(&dbv); } else data->proto_msg[i+1].msg = NULL; mir_snprintf(setting, SIZEOF(setting), "Proto%sFlags", accounts->pa[i]->szModuleName); val = DBGetContactSettingByte(NULL, "SimpleStatusMsg", setting, PROTO_DEFAULT); data->proto_msg[i+1].flags = val; mir_snprintf(setting, SIZEOF(setting), "Proto%sMaxLen", accounts->pa[i]->szModuleName); val = DBGetContactSettingWord(NULL, "SimpleStatusMsg", setting, 1024); data->proto_msg[i+1].max_length = val; SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_SETITEMDATA, (WPARAM)index, (LPARAM)i + 1); } } if (accounts->statusMsgCount == 1) { // ShowWindow(GetDlgItem(hwndDlg, IDC_BOPTPROTO), SW_HIDE); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTPROTO), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), FALSE); SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_SETCURSEL, 1, 0); } else SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_SETCURSEL, 0, 0); SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_CBOPTPROTO, CBN_SELCHANGE), (LPARAM)GetDlgItem(hwndDlg, IDC_CBOPTPROTO)); } if (DBGetContactSettingByte(NULL, "SimpleStatusMsg", "PutDefInList", 0)) CheckDlgButton(hwndDlg, IDC_COPTMSG2, BST_CHECKED); if (ServiceExists(MS_VARS_FORMATSTRING)) { HICON hIcon=NULL; char *szTipInfo=NULL; if (ServiceExists(MS_VARS_GETSKINITEM)) { hIcon = (HICON)CallService(MS_VARS_GETSKINITEM, 0, VSI_HELPICON); szTipInfo = (char *)CallService(MS_VARS_GETSKINITEM, 0, VSI_HELPTIPTEXT); } if (hIcon != NULL) SendMessage(GetDlgItem(hwndDlg, IDC_VARSHELP), BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); else SetDlgItemText(hwndDlg, IDC_VARSHELP, _T("V")); if (szTipInfo == NULL) SendMessage(GetDlgItem(hwndDlg, IDC_VARSHELP), BUTTONADDTOOLTIP, (WPARAM)TranslateT("Open String Formatting Help"), 0); else SendMessage(GetDlgItem(hwndDlg, IDC_VARSHELP), BUTTONADDTOOLTIP, (WPARAM)szTipInfo, 0); SendDlgItemMessage(hwndDlg, IDC_VARSHELP, BUTTONSETASFLATBTN, TRUE, 0); } ShowWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), ServiceExists(MS_VARS_FORMATSTRING)); OldDlgProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_OPTEDIT1), GWLP_WNDPROC, (LONG_PTR)OptEditBoxSubProc); return TRUE; } case WM_COMMAND: if ( ( (HIWORD(wParam) == BN_CLICKED) || /*(HIWORD(wParam) == EN_KILLFOCUS) ||*/ (HIWORD(wParam) == EN_CHANGE) || ( (HIWORD(wParam) == CBN_SELCHANGE) && (LOWORD(wParam) != IDC_CBOPTPROTO) && (LOWORD(wParam) != IDC_CBOPTSTATUS)) ) && (HWND)lParam == GetFocus()) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); switch (LOWORD(wParam)) { case IDC_EMAXLENGTH: switch (HIWORD(wParam)) { case EN_KILLFOCUS: { BOOL translated; int val, i; val = GetDlgItemInt(hwndDlg, IDC_EMAXLENGTH, &translated, FALSE); if (translated && val > 1024) SetDlgItemInt(hwndDlg, IDC_EMAXLENGTH, 1024, FALSE); if (translated && val < 1) SetDlgItemInt(hwndDlg, IDC_EMAXLENGTH, 1, FALSE); val = GetDlgItemInt(hwndDlg, IDC_EMAXLENGTH, &translated, FALSE); i = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETCURSEL, 0, 0), 0); data->proto_msg[i].max_length = val; break; } } break; case IDC_CBOPTPROTO: switch (HIWORD(wParam)) { case CBN_SELCHANGE: case CBN_SELENDOK: { int i, j, l, k, status_modes = 0, newindex = 0; i = SendMessage((HWND)lParam, CB_GETITEMDATA, (WPARAM)SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0), 0); if (i == 0) { EnableWindow(GetDlgItem(hwndDlg, IDC_MAXLENGTH), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_EMAXLENGTH), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_SMAXLENGTH), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTPROTO3), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTPROTO4), FALSE); SetDlgItemInt(hwndDlg, IDC_EMAXLENGTH, 1024, FALSE); if (data->proto_msg[i].flags & PROTO_POPUPDLG) CheckRadioButton(hwndDlg, IDC_ROPTPROTO1, IDC_ROPTPROTO4, IDC_ROPTPROTO1); else if (data->proto_msg[i].flags & PROTO_NOCHANGE) CheckRadioButton(hwndDlg, IDC_ROPTPROTO1, IDC_ROPTPROTO4, IDC_ROPTPROTO2); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_MAXLENGTH), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_EMAXLENGTH), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_SMAXLENGTH), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTPROTO3), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTPROTO4), TRUE); SetDlgItemInt(hwndDlg, IDC_EMAXLENGTH, data->proto_msg[i].max_length, FALSE); if (data->proto_msg[i].flags & PROTO_POPUPDLG) CheckRadioButton(hwndDlg, IDC_ROPTPROTO1, IDC_ROPTPROTO4, IDC_ROPTPROTO1); else if (data->proto_msg[i].flags & PROTO_NOCHANGE) CheckRadioButton(hwndDlg, IDC_ROPTPROTO1, IDC_ROPTPROTO4, IDC_ROPTPROTO2); else if (data->proto_msg[i].flags & PROTO_THIS_MSG) CheckRadioButton(hwndDlg, IDC_ROPTPROTO1, IDC_ROPTPROTO4, IDC_ROPTPROTO3); else if (data->proto_msg[i].flags & PROTO_NO_MSG) CheckRadioButton(hwndDlg, IDC_ROPTPROTO1, IDC_ROPTPROTO4, IDC_ROPTPROTO4); } if (data->proto_msg[i].flags & PROTO_NO_MSG || data->proto_msg[i].flags & PROTO_THIS_MSG || data->proto_msg[i].flags & PROTO_NOCHANGE) { EnableWindow(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTSTATUS), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_COPTMSG1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG2), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG3), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG5), FALSE); if (data->proto_msg[i].flags & PROTO_NO_MSG || data->proto_msg[i].flags & PROTO_NOCHANGE) { EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG4), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG4), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), TRUE); } EnableWindow(GetDlgItem(hwndDlg, IDC_COPTMSG2), FALSE); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTSTATUS), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_COPTMSG1), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG1), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG2), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG3), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG4), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG5), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_COPTMSG2), TRUE); } if (i) { k = i - 1; status_modes = CallProtoService(accounts->pa[k]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0); } else status_modes = accounts->statusMsgFlags; j = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETCURSEL, 0, 0), 0); SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_RESETCONTENT, 0, 0); for (l=ID_STATUS_ONLINE; l<=ID_STATUS_OUTTOLUNCH; l++) { int index; if (status_modes & Proto_Status2Flag(l)) { index = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_INSERTSTRING, -1, (LPARAM)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, l, GSMDF_TCHAR)); if (index != CB_ERR && index != CB_ERRSPACE) { SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_SETITEMDATA, (WPARAM)index, (LPARAM)l - ID_STATUS_ONLINE); if (j == l-ID_STATUS_ONLINE) newindex=index; } } } if (!newindex) { SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_SETCURSEL, 0, 0); j = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETCURSEL, 0, 0), 0); } else SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_SETCURSEL, (WPARAM)newindex, 0); if (data->status_msg[i].flags[j] & STATUS_SHOW_DLG) CheckDlgButton(hwndDlg, IDC_COPTMSG1, BST_CHECKED); else CheckDlgButton(hwndDlg, IDC_COPTMSG1, BST_UNCHECKED); if (data->proto_msg[i].flags & PROTO_THIS_MSG) { CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG4); if (data->proto_msg[i].msg) SetDlgItemText(hwndDlg, IDC_OPTEDIT1, data->proto_msg[i].msg); else SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); } else { if (data->status_msg[i].flags[j] & STATUS_EMPTY_MSG) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG1); } else if (data->status_msg[i].flags[j] & STATUS_DEFAULT_MSG) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, GetDefaultMessage(j+ID_STATUS_ONLINE)); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG2); } else if (data->status_msg[i].flags[j] & STATUS_LAST_MSG) { char setting[80]; DBVARIANT dbv, dbv2; if (i) mir_snprintf(setting, SIZEOF(setting), "Last%sMsg", accounts->pa[k]->szModuleName); else mir_snprintf(setting, SIZEOF(setting), "LastMsg"); SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); if (!DBGetContactSetting(NULL, "SimpleStatusMsg", setting, &dbv)) { if (dbv.pszVal) { if (!DBGetContactSettingTString(NULL, "SimpleStatusMsg", dbv.pszVal, &dbv2) && strlen(dbv.pszVal)) { if ((dbv2.ptszVal) && (lstrlen(dbv2.ptszVal))) SetDlgItemText(hwndDlg, IDC_OPTEDIT1, dbv2.ptszVal); DBFreeVariant(&dbv2); } } DBFreeVariant(&dbv); } EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG3); } else if (data->status_msg[i].flags[j] & STATUS_THIS_MSG) { if (data->proto_msg[i].flags & PROTO_NO_MSG || data->proto_msg[i].flags & PROTO_NOCHANGE) { EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), TRUE); } CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG4); SetDlgItemText(hwndDlg, IDC_OPTEDIT1, data->status_msg[i].msg[j]); } else if (data->status_msg[i].flags[j] & STATUS_LAST_STATUS_MSG) { char setting[80]; DBVARIANT dbv; if (i) mir_snprintf(setting, SIZEOF(setting), "%sMsg", accounts->pa[k]->szModuleName); else mir_snprintf(setting, SIZEOF(setting), "Msg"); if (!DBGetContactSettingTString(NULL, "SRAway", StatusModeToDbSetting(j + ID_STATUS_ONLINE, setting), &dbv)) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, dbv.ptszVal); DBFreeVariant(&dbv); } else SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG5); } } break; } } break; case IDC_ROPTPROTO1: case IDC_ROPTPROTO2: case IDC_ROPTPROTO3: case IDC_ROPTPROTO4: switch (HIWORD(wParam)) { case BN_CLICKED: { int i, j; i = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETCURSEL, 0, 0), 0); j = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETCURSEL, 0, 0), 0); data->proto_msg[i].flags = 0; if ((LOWORD(wParam) == IDC_ROPTPROTO2) || (LOWORD(wParam) == IDC_ROPTPROTO4)) { data->proto_msg[i].flags |= (LOWORD(wParam) == IDC_ROPTPROTO4) ? PROTO_NO_MSG : PROTO_NOCHANGE; EnableWindow(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTSTATUS), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_COPTMSG1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG2), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG3), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG4), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG5), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_COPTMSG2), FALSE); } else if (LOWORD(wParam) == IDC_ROPTPROTO3) { data->proto_msg[i].flags |= PROTO_THIS_MSG; EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), TRUE); if (data->proto_msg[i].msg) SetDlgItemText(hwndDlg, IDC_OPTEDIT1, data->proto_msg[i].msg); else SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); EnableWindow(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTSTATUS), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_COPTMSG1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG2), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG3), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG4), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG5), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG4); EnableWindow(GetDlgItem(hwndDlg, IDC_COPTMSG2), FALSE); } else if (LOWORD(wParam) == IDC_ROPTPROTO1) { data->proto_msg[i].flags |= PROTO_POPUPDLG; EnableWindow(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTSTATUS), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_COPTMSG1), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG1), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG2), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG3), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG4), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_ROPTMSG5), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_COPTMSG2), TRUE); } if (LOWORD(wParam) != IDC_ROPTPROTO3) { if (data->status_msg[i].flags[j] & STATUS_EMPTY_MSG) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG1); } else if (data->status_msg[i].flags[j] & STATUS_DEFAULT_MSG) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, GetDefaultMessage(j+ID_STATUS_ONLINE)); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG2); } else if (data->status_msg[i].flags[j] & STATUS_LAST_MSG) { char setting[80]; DBVARIANT dbv, dbv2; if (i) mir_snprintf(setting, SIZEOF(setting), "Last%sMsg", accounts->pa[i-1]->szModuleName); else mir_snprintf(setting, SIZEOF(setting), "LastMsg"); SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); if (!DBGetContactSetting(NULL, "SimpleStatusMsg", setting, &dbv)) { if (dbv.pszVal) { if (!DBGetContactSettingTString(NULL, "SimpleStatusMsg", dbv.pszVal, &dbv2) && strlen(dbv.pszVal)) { if (dbv2.ptszVal && lstrlen(dbv2.ptszVal)) SetDlgItemText(hwndDlg, IDC_OPTEDIT1, dbv2.ptszVal); DBFreeVariant(&dbv2); } } DBFreeVariant(&dbv); } EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG3); } else if (data->status_msg[i].flags[j] & STATUS_THIS_MSG) { if ((LOWORD(wParam) == IDC_ROPTPROTO2) || (LOWORD(wParam) == IDC_ROPTPROTO4)) { EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), TRUE); } CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG4); SetDlgItemText(hwndDlg, IDC_OPTEDIT1, data->status_msg[i].msg[j]); } else if (data->status_msg[i].flags[j] & STATUS_LAST_STATUS_MSG) { char setting[80]; DBVARIANT dbv; if (i) mir_snprintf(setting, SIZEOF(setting), "%sMsg", accounts->pa[i-1]->szModuleName); else mir_snprintf(setting, SIZEOF(setting), "Msg"); if (!DBGetContactSettingTString(NULL, "SRAway", StatusModeToDbSetting(j + ID_STATUS_ONLINE, setting), &dbv)) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, dbv.ptszVal); DBFreeVariant(&dbv); } else SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG5); } } break; } } break; case IDC_CBOPTSTATUS: switch (HIWORD(wParam)) { case CBN_SELCHANGE: case CBN_SELENDOK: { int i, j; i = SendMessage((HWND)lParam, CB_GETITEMDATA, (WPARAM)SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0), 0); j = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETCURSEL, 0, 0), 0); if (data->status_msg[j].flags[i] & STATUS_SHOW_DLG) CheckDlgButton(hwndDlg, IDC_COPTMSG1, BST_CHECKED); else CheckDlgButton(hwndDlg, IDC_COPTMSG1, BST_UNCHECKED); if (data->status_msg[j].flags[i] & STATUS_EMPTY_MSG) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG1); } else if (data->status_msg[j].flags[i] & STATUS_DEFAULT_MSG) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, GetDefaultMessage(i+ID_STATUS_ONLINE)); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG2); } else if (data->status_msg[j].flags[i] & STATUS_LAST_MSG) { char setting[80]; DBVARIANT dbv,dbv2; if (j) mir_snprintf(setting, SIZEOF(setting), "Last%sMsg", accounts->pa[j-1]->szModuleName); else mir_snprintf(setting, SIZEOF(setting), "LastMsg"); SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); if (!DBGetContactSetting(NULL, "SimpleStatusMsg", setting, &dbv)) { if (dbv.pszVal) { if (!DBGetContactSettingTString(NULL, "SimpleStatusMsg", dbv.pszVal, &dbv2) && strlen(dbv.pszVal)) { if (dbv2.ptszVal && lstrlen(dbv2.ptszVal)) SetDlgItemText(hwndDlg, IDC_OPTEDIT1, dbv2.ptszVal); DBFreeVariant(&dbv2); } } DBFreeVariant(&dbv); } EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG3); } else if (data->status_msg[j].flags[i] & STATUS_THIS_MSG) { EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), TRUE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG4); SetDlgItemText(hwndDlg, IDC_OPTEDIT1, data->status_msg[j].msg[i]); } else if (data->status_msg[j].flags[i] & STATUS_LAST_STATUS_MSG) { char setting[80]; DBVARIANT dbv; if (j) mir_snprintf(setting, SIZEOF(setting), "%sMsg", accounts->pa[j-1]->szModuleName); else mir_snprintf(setting, SIZEOF(setting), "Msg"); if (!DBGetContactSettingTString(NULL, "SRAway", StatusModeToDbSetting(i + ID_STATUS_ONLINE, setting), &dbv)) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, dbv.ptszVal); DBFreeVariant(&dbv); } else SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); CheckRadioButton(hwndDlg, IDC_ROPTMSG1, IDC_ROPTMSG5, IDC_ROPTMSG5); } break; } } break; case IDC_COPTMSG1: switch (HIWORD(wParam)) { case BN_CLICKED: { int i, j; i = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETCURSEL, 0, 0), 0); j = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETCURSEL, 0, 0), 0); if (IsDlgButtonChecked(hwndDlg, IDC_COPTMSG1) == BST_CHECKED) data->status_msg[j].flags[i] |= STATUS_SHOW_DLG; else data->status_msg[j].flags[i] &= ~STATUS_SHOW_DLG; break; } } break; case IDC_ROPTMSG1: case IDC_ROPTMSG2: case IDC_ROPTMSG3: case IDC_ROPTMSG4: case IDC_ROPTMSG5: switch (HIWORD(wParam)) { case BN_CLICKED: { int i, j; i = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETCURSEL, 0, 0), 0); j = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETCURSEL, 0, 0), 0); if (LOWORD(wParam) == IDC_ROPTMSG4 && data->proto_msg[j].flags & PROTO_THIS_MSG) break; data->status_msg[j].flags[i] = 0; if (IsDlgButtonChecked(hwndDlg, IDC_COPTMSG1) == BST_CHECKED) data->status_msg[j].flags[i] |= STATUS_SHOW_DLG; if (LOWORD(wParam) == IDC_ROPTMSG1) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); data->status_msg[j].flags[i] |= STATUS_EMPTY_MSG; } else if (LOWORD(wParam) == IDC_ROPTMSG2) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, GetDefaultMessage(i+ID_STATUS_ONLINE)); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); data->status_msg[j].flags[i] |= STATUS_DEFAULT_MSG; } else if (LOWORD(wParam) == IDC_ROPTMSG3) { char setting[80]; DBVARIANT dbv, dbv2; if (j) mir_snprintf(setting, SIZEOF(setting), "Last%sMsg", accounts->pa[j-1]->szModuleName); else mir_snprintf(setting, SIZEOF(setting), "LastMsg"); SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); if (!DBGetContactSetting(NULL, "SimpleStatusMsg", setting, &dbv)) { if (dbv.pszVal) { if (!DBGetContactSettingTString(NULL, "SimpleStatusMsg", dbv.pszVal, &dbv2) && strlen(dbv.pszVal)) { if (dbv2.ptszVal && lstrlen(dbv2.ptszVal)) SetDlgItemText(hwndDlg, IDC_OPTEDIT1, dbv2.ptszVal); DBFreeVariant(&dbv2); } } DBFreeVariant(&dbv); } EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); data->status_msg[j].flags[i] |= STATUS_LAST_MSG; } else if (LOWORD(wParam) == IDC_ROPTMSG4) { data->status_msg[j].flags[i] |= STATUS_THIS_MSG; EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), TRUE); SetDlgItemText(hwndDlg, IDC_OPTEDIT1, data->status_msg[j].msg[i]); } else if (LOWORD(wParam) == IDC_ROPTMSG5) { char setting[80]; DBVARIANT dbv; if (j) mir_snprintf(setting, SIZEOF(setting), "%sMsg", accounts->pa[j-1]->szModuleName); else mir_snprintf(setting, SIZEOF(setting), "Msg"); if (!DBGetContactSettingTString(NULL, "SRAway", StatusModeToDbSetting(i+ID_STATUS_ONLINE, setting), &dbv)) { SetDlgItemText(hwndDlg, IDC_OPTEDIT1, dbv.ptszVal); DBFreeVariant(&dbv); } else SetDlgItemText(hwndDlg, IDC_OPTEDIT1, _T("")); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTEDIT1), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARSHELP), FALSE); data->status_msg[j].flags[i] |= STATUS_LAST_STATUS_MSG; } break; } } break; case IDC_OPTEDIT1: { int i = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETCURSEL, 0, 0), 0); int j = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETCURSEL, 0, 0), 0); if (HIWORD(wParam) == EN_KILLFOCUS) { TCHAR msg[1024]; if (data->proto_msg[j].flags & PROTO_THIS_MSG) { int len = GetDlgItemText(hwndDlg, IDC_OPTEDIT1, msg, SIZEOF(msg)); if (len > 0) { if (data->proto_msg[j].msg == NULL) data->proto_msg[j].msg = mir_tstrdup(msg); else { mir_free(data->proto_msg[j].msg); data->proto_msg[j].msg = mir_tstrdup(msg); } } else { if (data->proto_msg[j].msg != NULL) { mir_free(data->proto_msg[j].msg); data->proto_msg[j].msg = NULL; } } } else { GetDlgItemText(hwndDlg, IDC_OPTEDIT1, msg, SIZEOF(msg)); lstrcpy(data->status_msg[j].msg[i], msg); } } break; } case IDC_VARSHELP: variables_showhelp(hwndDlg, IDC_OPTEDIT1, VHF_FULLDLG|VHF_SETLASTSUBJECT, NULL, NULL); break; case IDC_BOPTPROTO: { int i, j, k; j = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETCURSEL, 0, 0), 0); if (j) { for (i = ID_STATUS_ONLINE; i <= ID_STATUS_OUTTOLUNCH; i++) { if (accounts->statusMsgFlags & Proto_Status2Flag(i)) { data->status_msg[0].flags[i-ID_STATUS_ONLINE] = data->status_msg[j].flags[i-ID_STATUS_ONLINE]; if (data->status_msg[j].flags[i-ID_STATUS_ONLINE] & STATUS_THIS_MSG) lstrcpy(data->status_msg[0].msg[i-ID_STATUS_ONLINE], data->status_msg[j].msg[i-ID_STATUS_ONLINE]); } } } for (k = 0; k < accounts->count; k++) { if (!IsAccountEnabled(accounts->pa[k]) || !CallProtoService(accounts->pa[k]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0) || !(CallProtoService(accounts->pa[k]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) continue; if (k != j - 1) { data->proto_msg[k+1].flags = data->proto_msg[j].flags; if (j) data->proto_msg[k+1].max_length = data->proto_msg[j].max_length; if (data->proto_msg[j].flags & PROTO_THIS_MSG) { int len = lstrlen(data->proto_msg[j].msg); if (len > 0) { if (data->proto_msg[k+1].msg == NULL) data->proto_msg[k+1].msg = mir_tstrdup(data->proto_msg[j].msg); else { mir_free(data->proto_msg[k+1].msg); data->proto_msg[k+1].msg = mir_tstrdup(data->proto_msg[j].msg); } } else { if (data->proto_msg[k+1].msg != NULL) { mir_free(data->proto_msg[k+1].msg); data->proto_msg[k+1].msg = NULL; } } } else if (data->proto_msg[j].flags & PROTO_POPUPDLG) { for (i = ID_STATUS_ONLINE; i <= ID_STATUS_OUTTOLUNCH; i++) { if (CallProtoService(accounts->pa[k]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(i)) { data->status_msg[k + 1].flags[i - ID_STATUS_ONLINE] = data->status_msg[j].flags[i - ID_STATUS_ONLINE]; if (data->status_msg[j].flags[i - ID_STATUS_ONLINE] & STATUS_THIS_MSG) lstrcpy(data->status_msg[k + 1].msg[i - ID_STATUS_ONLINE], data->status_msg[j].msg[i - ID_STATUS_ONLINE]); } } } } } break; } // case IDC_BOPTPROTO case IDC_BOPTSTATUS: { int status_modes, i, j, k; i = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTSTATUS), CB_GETCURSEL, 0, 0), 0); j = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTPROTO), CB_GETCURSEL, 0, 0), 0); if (j) status_modes = CallProtoService(accounts->pa[j-1]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0); else status_modes = accounts->statusMsgFlags; for (k = ID_STATUS_ONLINE; k <= ID_STATUS_OUTTOLUNCH; k++) { if (k - ID_STATUS_ONLINE != i && status_modes & Proto_Status2Flag(k)) { data->status_msg[j].flags[k - ID_STATUS_ONLINE] = data->status_msg[j].flags[i]; if (data->status_msg[j].flags[i] & STATUS_THIS_MSG) lstrcpy(data->status_msg[j].msg[k - ID_STATUS_ONLINE], data->status_msg[j].msg[i]); } } break; } //case IDC_BOPTSTATUS } break; case WM_NOTIFY: if (((LPNMHDR)lParam)->idFrom == 0 && ((LPNMHDR)lParam)->code == PSN_APPLY) { char szSetting[80]; int i; for (i = ID_STATUS_ONLINE; i <= ID_STATUS_OUTTOLUNCH; i++) { if (accounts->statusMsgFlags & Proto_Status2Flag(i)) { DBWriteContactSettingTString(NULL, "SRAway", StatusModeToDbSetting(i, "Default"), data->status_msg[0].msg[i - ID_STATUS_ONLINE]); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", StatusModeToDbSetting(i, "Flags"), (BYTE)data->status_msg[0].flags[i - ID_STATUS_ONLINE]); for (int j = 0; j < accounts->count; j++) { if (!IsAccountEnabled(accounts->pa[j])) continue; if (!(CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)) continue; if (CallProtoService(accounts->pa[j]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(i)) { mir_snprintf(szSetting, SIZEOF(szSetting), "%sDefault", accounts->pa[j]->szModuleName); DBWriteContactSettingTString(NULL, "SRAway", StatusModeToDbSetting(i, szSetting), data->status_msg[j + 1].msg[i - ID_STATUS_ONLINE]); mir_snprintf(szSetting, SIZEOF(szSetting), "%sFlags", accounts->pa[j]->szModuleName); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", StatusModeToDbSetting(i, szSetting), (BYTE)data->status_msg[j + 1].flags[i - ID_STATUS_ONLINE]); } } } } DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "PutDefInList", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_COPTMSG2) == BST_CHECKED)); if (data->proto_ok) { DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "ProtoFlags", (BYTE)data->proto_msg[0].flags); 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(szSetting, SIZEOF(szSetting), "Proto%sDefault", accounts->pa[i]->szModuleName); if (data->proto_msg[i+1].msg && (data->proto_msg[i+1].flags & PROTO_THIS_MSG)) DBWriteContactSettingTString(NULL, "SimpleStatusMsg", szSetting, data->proto_msg[i+1].msg); // else // DBDeleteContactSetting(NULL, "SimpleStatusMsg", szSetting); mir_snprintf(szSetting, SIZEOF(szSetting), "Proto%sMaxLen", accounts->pa[i]->szModuleName); DBWriteContactSettingWord(NULL, "SimpleStatusMsg", szSetting, (WORD)data->proto_msg[i+1].max_length); mir_snprintf(szSetting, SIZEOF(szSetting), "Proto%sFlags", accounts->pa[i]->szModuleName); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", szSetting, (BYTE)data->proto_msg[i+1].flags); } } RebuildStatusMenu(); return TRUE; } break; case WM_DESTROY: SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_OPTEDIT1), GWLP_WNDPROC, (LONG_PTR)OldDlgProc); if (data->proto_ok) { for (int i = 0; i < accounts->count + 1; ++i) { if (data->proto_msg[i].msg) // they want to be free, do they? mir_free(data->proto_msg[i].msg); } mir_free(data->proto_msg); } mir_free(data->status_msg); mir_free(data); break; } return FALSE; } static INT_PTR CALLBACK DlgVariablesOptionsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); SendDlgItemMessage(hwndDlg, IDC_SSECUPDTMSG, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_ESECUPDTMSG), 0); SendDlgItemMessage(hwndDlg, IDC_SSECUPDTMSG, UDM_SETRANGE32, 1, 999); SendDlgItemMessage(hwndDlg, IDC_SSECUPDTMSG, UDM_SETPOS, 0, MAKELONG((short)DBGetContactSettingWord(NULL, "SimpleStatusMsg", "UpdateMsgInt", 10), 0)); SendDlgItemMessage(hwndDlg, IDC_ESECUPDTMSG, EM_LIMITTEXT, 3, 0); CheckDlgButton(hwndDlg, IDC_CUPDATEMSG, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "UpdateMsgOn", 1) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CNOIDLE, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "NoUpdateOnIdle", 1) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CNOICQREQ, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "NoUpdateOnICQReq", 1) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CLEAVEWINAMP, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "AmpLeaveTitle", 1) ? BST_CHECKED : BST_UNCHECKED); if (ServiceExists(MS_VARS_FORMATSTRING)) { CheckDlgButton(hwndDlg, IDC_CVARIABLES, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "EnableVariables", 1) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CDATEPARSING, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "ExclDateToken", 0) ? BST_CHECKED : BST_UNCHECKED); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_CVARIABLES), FALSE); } EnableWindow(GetDlgItem(hwndDlg, IDC_CDATEPARSING), IsDlgButtonChecked(hwndDlg, IDC_CVARIABLES) == BST_CHECKED); SendMessage(hwndDlg, WM_USER + 2, 0, 0); return TRUE; } case WM_USER + 2: { BOOL bChecked = IsDlgButtonChecked(hwndDlg, IDC_CUPDATEMSG) == BST_CHECKED; EnableWindow(GetDlgItem(hwndDlg, IDC_ESECUPDTMSG), bChecked); EnableWindow(GetDlgItem(hwndDlg, IDC_SSECUPDTMSG), bChecked); EnableWindow(GetDlgItem(hwndDlg, IDC_CNOIDLE), bChecked); EnableWindow(GetDlgItem(hwndDlg, IDC_CNOICQREQ), bChecked); EnableWindow(GetDlgItem(hwndDlg, IDC_CLEAVEWINAMP), bChecked); break; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_ESECUPDTMSG: { if ((HWND)lParam != GetFocus() || HIWORD(wParam) != EN_CHANGE) return 0; int val = GetDlgItemInt(hwndDlg, IDC_ESECUPDTMSG, NULL, FALSE); if (val == 0 && GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ESECUPDTMSG))) SendDlgItemMessage(hwndDlg, IDC_SSECUPDTMSG, UDM_SETPOS, 0, MAKELONG((short)1, 0)); break; } case IDC_CUPDATEMSG: SendMessage(hwndDlg, WM_USER + 2, 0, 0); break; case IDC_CVARIABLES: EnableWindow(GetDlgItem(hwndDlg, IDC_CDATEPARSING), IsDlgButtonChecked(hwndDlg, IDC_CVARIABLES) == BST_CHECKED); break; } SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_NOTIFY: if (((LPNMHDR)lParam)->idFrom == 0 && ((LPNMHDR)lParam)->code == PSN_APPLY) { if (g_uUpdateMsgTimer) KillTimer(NULL, g_uUpdateMsgTimer); int val = SendDlgItemMessage(hwndDlg, IDC_SSECUPDTMSG, UDM_GETPOS, 0, 0); DBWriteContactSettingWord(NULL, "SimpleStatusMsg", "UpdateMsgInt", (WORD)val); if (IsDlgButtonChecked(hwndDlg, IDC_CUPDATEMSG) == BST_CHECKED && val) { DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "UpdateMsgOn", (BYTE)1); g_uUpdateMsgTimer = SetTimer(NULL, 0, val * 1000, (TIMERPROC)UpdateMsgTimerProc); } else { DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "UpdateMsgOn", (BYTE)0); } DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "NoUpdateOnIdle", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CNOIDLE) == BST_CHECKED)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "NoUpdateOnICQReq", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CNOICQREQ) == BST_CHECKED)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "AmpLeaveTitle", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CLEAVEWINAMP) == BST_CHECKED)); if (ServiceExists(MS_VARS_FORMATSTRING)) { DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "EnableVariables", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CVARIABLES) == BST_CHECKED)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "ExclDateToken", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CDATEPARSING) == BST_CHECKED)); } return TRUE; } break; } return FALSE; } static BOOL IsHistoryMsgsFound(HWND hwndDlg, int histMax) { char szSetting[16]; DBVARIANT dbv; int j = DBGetContactSettingWord(NULL, "SimpleStatusMsg", "LMMsg", 1); for (int i = 1; i <= histMax; ++i, --j) { if (j < 1) j = histMax; mir_snprintf(szSetting, SIZEOF(szSetting), "SMsg%d", j); if (!DBGetContactSettingTString(NULL, "SimpleStatusMsg", szSetting, &dbv)) { if (dbv.ptszVal != NULL && *dbv.ptszVal != '\0') { DBFreeVariant(&dbv); return TRUE; } DBFreeVariant(&dbv); } } return FALSE; } static INT_PTR CALLBACK DlgAdvancedOptionsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { int settingValue; TranslateDialogDefault(hwndDlg); // Layout int i_btnhide = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_ADDSTRING, 0, (LPARAM)TranslateT("Hide")); int i_btndown = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_ADDSTRING, 0, (LPARAM)TranslateT("Show next to cancel button")); int i_btndownflat = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_ADDSTRING, 0, (LPARAM)TranslateT("Flat, next to cancel button")); int i_btnlist = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_ADDSTRING, 0, (LPARAM)TranslateT("Show in message list")); SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_SETITEMDATA, (WPARAM)i_btnhide, 0); SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_SETITEMDATA, (WPARAM)i_btndown, DLG_SHOW_BUTTONS); SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_SETITEMDATA, (WPARAM)i_btndownflat, DLG_SHOW_BUTTONS_FLAT); SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_SETITEMDATA, (WPARAM)i_btnlist, DLG_SHOW_BUTTONS_INLIST); settingValue = DBGetContactSettingByte(NULL, "SimpleStatusMsg", "DlgFlags", DLG_SHOW_DEFAULT); CheckDlgButton(hwndDlg, IDC_CSTATUSLIST, settingValue & DLG_SHOW_STATUS ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CPROFILES, settingValue & DLG_SHOW_STATUS_PROFILES ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CICONS1, settingValue & DLG_SHOW_STATUS_ICONS ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CICONS2, settingValue & DLG_SHOW_LIST_ICONS ? BST_CHECKED : BST_UNCHECKED); if (!(settingValue & DLG_SHOW_STATUS)) { EnableWindow(GetDlgItem(hwndDlg, IDC_CPROFILES), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_CICONS1), FALSE); } if (settingValue & DLG_SHOW_BUTTONS) SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_SETCURSEL, (WPARAM)i_btndown, 0); else if (settingValue & DLG_SHOW_BUTTONS_FLAT) SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_SETCURSEL, (WPARAM)i_btndownflat, 0); else if (settingValue & DLG_SHOW_BUTTONS_INLIST) SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_SETCURSEL, (WPARAM)i_btnlist, 0); else SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_SETCURSEL, (WPARAM)i_btnhide, 0); if (!ServiceExists(MS_SS_GETPROFILECOUNT)) { TCHAR szText[100]; mir_sntprintf(szText, SIZEOF(szText), _T("%s *"), TranslateT("Show status profiles in status list")); SetDlgItemText(hwndDlg, IDC_CPROFILES, szText); EnableWindow(GetDlgItem(hwndDlg, IDC_CPROFILES), FALSE); ShowWindow(GetDlgItem(hwndDlg, IDC_NOTE1), SW_SHOW); } // Misc. settingValue = DBGetContactSettingByte(NULL, "SimpleStatusMsg", "MaxHist", 10); SendDlgItemMessage(hwndDlg, IDC_SMAXHIST, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_EMAXHIST), 0); SendDlgItemMessage(hwndDlg, IDC_SMAXHIST, UDM_SETRANGE32, 0, 25); SendDlgItemMessage(hwndDlg, IDC_SMAXHIST, UDM_SETPOS, 0, MAKELONG((short)settingValue, 0)); SendDlgItemMessage(hwndDlg, IDC_EMAXHIST, EM_LIMITTEXT, 2, 0); if (settingValue == 0) EnableWindow(GetDlgItem(hwndDlg, IDC_CICONS2), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTHIST), IsHistoryMsgsFound(hwndDlg, settingValue)); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTDEF), DBGetContactSettingWord(NULL, "SimpleStatusMsg", "DefMsgCount", 0) != 0); SendDlgItemMessage(hwndDlg, IDC_STIMEOUT, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_ETIMEOUT), 0); SendDlgItemMessage(hwndDlg, IDC_STIMEOUT, UDM_SETRANGE32, 1, 60); SendDlgItemMessage(hwndDlg, IDC_STIMEOUT, UDM_SETPOS, 0, MAKELONG((short)DBGetContactSettingByte(NULL, "SimpleStatusMsg", "DlgTime", 5), 0)); SendDlgItemMessage(hwndDlg, IDC_ETIMEOUT, EM_LIMITTEXT, 2, 0); CheckDlgButton(hwndDlg, IDC_CCLOSEWND, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "AutoClose", 1) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CRPOSWND, !DBGetContactSettingByte(NULL, "SimpleStatusMsg", "WinCentered", 1) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CREMOVECR, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "RemoveCR", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CSHOWCOPY, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "ShowCopy", 1) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CSHOWGURL, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "ShowGoToURL", 1) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CSHOWSMSG, DBGetContactSettingByte(NULL, "SimpleStatusMsg", "ShowStatusMenuItem", 1) ? BST_CHECKED : BST_UNCHECKED); SendMessage(hwndDlg, WM_USER + 2, 0, 0); return TRUE; } case WM_USER + 2: { BOOL bChecked = IsDlgButtonChecked(hwndDlg, IDC_CCLOSEWND) == BST_CHECKED; EnableWindow(GetDlgItem(hwndDlg, IDC_ETIMEOUT), bChecked); EnableWindow(GetDlgItem(hwndDlg, IDC_STIMEOUT), bChecked); break; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CSTATUSLIST: { BOOL bChecked = IsDlgButtonChecked(hwndDlg, IDC_CSTATUSLIST) == BST_CHECKED; EnableWindow(GetDlgItem(hwndDlg, IDC_CPROFILES), bChecked && ServiceExists(MS_SS_GETPROFILECOUNT)); EnableWindow(GetDlgItem(hwndDlg, IDC_CICONS1), bChecked); break; } case IDC_CBOPTBUTTONS: if ((HWND)lParam != GetFocus() || HIWORD(wParam) != CBN_SELCHANGE) return 0; break; case IDC_EMAXHIST: { if ((HWND)lParam != GetFocus() || HIWORD(wParam) != EN_CHANGE) return 0; int val = GetDlgItemInt(hwndDlg, IDC_EMAXHIST, NULL, FALSE); if (val > 25) SendDlgItemMessage(hwndDlg, IDC_SMAXHIST, UDM_SETPOS, 0, MAKELONG((short)25, 0)); EnableWindow(GetDlgItem(hwndDlg, IDC_CICONS2), val != 0); break; } case IDC_CCLOSEWND: SendMessage(hwndDlg, WM_USER + 2, 0, 0); break; case IDC_ETIMEOUT: { if ((HWND)lParam != GetFocus() || HIWORD(wParam) != EN_CHANGE) return 0; int val = GetDlgItemInt(hwndDlg, IDC_ETIMEOUT, NULL, FALSE); if (val == 0 && GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ETIMEOUT))) SendDlgItemMessage(hwndDlg, IDC_STIMEOUT, UDM_SETPOS, 0, MAKELONG((short)1, 0)); else if (val > 60) SendDlgItemMessage(hwndDlg, IDC_STIMEOUT, UDM_SETPOS, 0, MAKELONG((short)60, 0)); break; } case IDC_BOPTHIST: if (MessageBox(NULL, TranslateT("Are you sure you want to clear status message history?"), TranslateT("Confirm clearing history"), MB_ICONQUESTION | MB_YESNO) == IDYES) { int i, max_hist_msgs; char text[8], setting[80]; if (hwndSAMsgDialog) DestroyWindow(hwndSAMsgDialog); max_hist_msgs = DBGetContactSettingByte(NULL, "SimpleStatusMsg", "MaxHist", 10); for (i = 1; i <= max_hist_msgs; i++) { mir_snprintf(text, SIZEOF(text), "SMsg%d", i); DBWriteContactSettingTString(NULL, "SimpleStatusMsg", text, _T("")); } DBWriteContactSettingString(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(setting, SIZEOF(setting), "Last%sMsg", accounts->pa[i]->szModuleName); DBWriteContactSettingString(NULL, "SimpleStatusMsg", setting, ""); } DBWriteContactSettingWord(NULL, "SimpleStatusMsg", "LMMsg", (WORD)max_hist_msgs); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTHIST), FALSE); } return 0; case IDC_BOPTDEF: if (MessageBox(NULL, TranslateT("Are you sure you want to clear predefined status messages?"), TranslateT("Confirm clearing predefined"), MB_ICONQUESTION | MB_YESNO) == IDYES) { char szSetting[16]; int nDefMSgCount; if (hwndSAMsgDialog) DestroyWindow(hwndSAMsgDialog); nDefMSgCount = DBGetContactSettingWord(NULL, "SimpleStatusMsg", "DefMsgCount", 0); for (int i = 1; i <= nDefMSgCount; i++) { mir_snprintf(szSetting, SIZEOF(szSetting), "DefMsg%d", i); DBDeleteContactSetting(NULL, "SimpleStatusMsg", szSetting); } DBWriteContactSettingWord(NULL, "SimpleStatusMsg", "DefMsgCount", 0); EnableWindow(GetDlgItem(hwndDlg, IDC_BOPTDEF), FALSE); } return 0; } SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_NOTIFY: if (((LPNMHDR)lParam)->idFrom == 0 && ((LPNMHDR)lParam)->code == PSN_APPLY) { // Layout int flags = 0, curSel; if (IsDlgButtonChecked(hwndDlg, IDC_CSTATUSLIST) == BST_CHECKED) flags |= DLG_SHOW_STATUS; if (IsDlgButtonChecked(hwndDlg, IDC_CICONS1) == BST_CHECKED) flags |= DLG_SHOW_STATUS_ICONS; if (IsDlgButtonChecked(hwndDlg, IDC_CICONS2) == BST_CHECKED) flags |= DLG_SHOW_LIST_ICONS; if (IsDlgButtonChecked(hwndDlg, IDC_CPROFILES) == BST_CHECKED) flags |= DLG_SHOW_STATUS_PROFILES; curSel = SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_GETCURSEL, 0, 0); if (curSel != CB_ERR) flags |= SendMessage(GetDlgItem(hwndDlg, IDC_CBOPTBUTTONS), CB_GETITEMDATA, (WPARAM)curSel, 0); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "DlgFlags", (BYTE)flags); // Misc. DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "MaxHist", (BYTE)GetDlgItemInt(hwndDlg, IDC_EMAXHIST, NULL, FALSE)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "AutoClose", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CCLOSEWND) == BST_CHECKED)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "DlgTime", (BYTE)GetDlgItemInt(hwndDlg, IDC_ETIMEOUT, NULL, FALSE)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "WinCentered", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CRPOSWND) != BST_CHECKED)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "RemoveCR", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CREMOVECR) == BST_CHECKED)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "ShowCopy", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CSHOWCOPY) == BST_CHECKED)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "ShowGoToURL", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CSHOWGURL) == BST_CHECKED)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "ShowStatusMenuItem", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CSHOWSMSG) == BST_CHECKED)); RebuildStatusMenu(); return TRUE; } break; } return FALSE; } struct StatusOptDlgData { int *status; int *setdelay; int setglobaldelay; }; static INT_PTR CALLBACK DlgStatusOptionsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { struct StatusOptDlgData *data = (struct StatusOptDlgData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (uMsg) { case WM_INITDIALOG: { int index, i; TranslateDialogDefault(hwndDlg); data = (struct StatusOptDlgData *)mir_alloc(sizeof(struct StatusOptDlgData)); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)data); data->status = (int *)mir_alloc(sizeof(int) * accounts->count); data->setdelay = (int *)mir_alloc(sizeof(int) * accounts->count); for (i = 0; i < accounts->count; ++i) { if (!IsAccountEnabled(accounts->pa[i]) || !(CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0) &~ CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_5, 0))) continue; index = SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_ADDSTRING, 0, (LPARAM)accounts->pa[i]->tszAccountName); if (index != LB_ERR && index != LB_ERRSPACE) { char setting[80]; mir_snprintf(setting, SIZEOF(setting), "Startup%sStatus", accounts->pa[i]->szModuleName); data->status[i] = DBGetContactSettingWord(NULL, "SimpleStatusMsg", setting, ID_STATUS_OFFLINE); mir_snprintf(setting, SIZEOF(setting), "Set%sStatusDelay", accounts->pa[i]->szModuleName); data->setdelay[i] = DBGetContactSettingWord(NULL, "SimpleStatusMsg", setting, 300); SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_SETITEMDATA, (WPARAM)index, (LPARAM)i); } } SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_SETCURSEL, 0, 0); SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_LISTPROTO, LBN_SELCHANGE), (LPARAM)GetDlgItem(hwndDlg, IDC_LISTPROTO)); data->setglobaldelay = DBGetContactSettingWord(NULL, "SimpleStatusMsg", "SetStatusDelay", 300); SendMessage(GetDlgItem(hwndDlg, IDC_SSETSTATUS), UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_ESETSTATUS), 0); SendMessage(GetDlgItem(hwndDlg, IDC_SSETSTATUS), UDM_SETRANGE32, 0, 9000); SendMessage(GetDlgItem(hwndDlg, IDC_ESETSTATUS), EM_LIMITTEXT, 4, 0); if (!DBGetContactSettingByte(NULL, "SimpleStatusMsg", "GlobalStatusDelay", 1)) { CheckDlgButton(hwndDlg, IDC_SPECSET, BST_CHECKED); i = SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_GETCURSEL, 0, 0), 0); SetDlgItemInt(hwndDlg, IDC_ESETSTATUS, data->setdelay[i], FALSE); } else { CheckDlgButton(hwndDlg, IDC_SPECSET, BST_UNCHECKED); SetDlgItemInt(hwndDlg, IDC_ESETSTATUS, data->setglobaldelay, FALSE); } if (DBGetContactSettingByte(NULL, "SimpleStatusMsg", "StartupPopupDlg", 1)) { CheckDlgButton(hwndDlg, IDC_POPUPDLG, BST_CHECKED); if (IsDlgButtonChecked(hwndDlg, IDC_SPECSET) == BST_CHECKED) { CheckDlgButton(hwndDlg, IDC_SPECSET, BST_UNCHECKED); SetDlgItemInt(hwndDlg, IDC_ESETSTATUS, data->setglobaldelay, FALSE); } EnableWindow(GetDlgItem(hwndDlg, IDC_SPECSET), FALSE); } else CheckDlgButton(hwndDlg, IDC_POPUPDLG, BST_UNCHECKED); if (accounts->statusCount == 1 && accounts->statusMsgCount == 1) { EnableWindow(GetDlgItem(hwndDlg, IDC_SPECSET), FALSE); CheckDlgButton(hwndDlg, IDC_SPECSET, BST_UNCHECKED); //should work like when checked, but should not be checked i = SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_GETCURSEL, 0, 0), 0); SetDlgItemInt(hwndDlg, IDC_ESETSTATUS, data->setdelay[i], FALSE); } return TRUE; } case WM_COMMAND: if ( ( (HIWORD(wParam) == BN_CLICKED) || /*(HIWORD(wParam) == EN_KILLFOCUS) ||*/ (HIWORD(wParam) == EN_CHANGE) || ( (HIWORD(wParam) == LBN_SELCHANGE) && (LOWORD(wParam) != IDC_LISTPROTO)) ) && (HWND)lParam == GetFocus()) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); switch (LOWORD(wParam)) { case IDC_ESETSTATUS: switch (HIWORD(wParam)) { case EN_KILLFOCUS: { BOOL translated; int val = GetDlgItemInt(hwndDlg, IDC_ESETSTATUS, &translated, FALSE); if (translated && val > 9000) SetDlgItemInt(hwndDlg, IDC_ESETSTATUS, 9000, FALSE); if (translated && val < 0) SetDlgItemInt(hwndDlg, IDC_ESETSTATUS, 0, FALSE); val = GetDlgItemInt(hwndDlg, IDC_ESETSTATUS, &translated, FALSE); if (IsDlgButtonChecked(hwndDlg, IDC_SPECSET) == BST_CHECKED || (accounts->statusCount == 1 && accounts->statusMsgCount == 1)) { int i = SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_GETCURSEL, 0, 0), 0); data->setdelay[i] = val; } else data->setglobaldelay = val; break; } } break; case IDC_SPECSET: switch (HIWORD(wParam)) { case BN_CLICKED: if (SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED || (accounts->statusCount == 1 && accounts->statusMsgCount == 1)) { int i = SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_GETCURSEL, 0, 0), 0); SetDlgItemInt(hwndDlg, IDC_ESETSTATUS, data->setdelay[i], FALSE); } else SetDlgItemInt(hwndDlg, IDC_ESETSTATUS, data->setglobaldelay, FALSE); break; } break; case IDC_POPUPDLG: switch (HIWORD(wParam)) { case BN_CLICKED: if (accounts->statusCount == 1 && accounts->statusMsgCount == 1) break; if (SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED) { if (IsDlgButtonChecked(hwndDlg, IDC_SPECSET) == BST_CHECKED) { CheckDlgButton(hwndDlg, IDC_SPECSET, BST_UNCHECKED); SetDlgItemInt(hwndDlg, IDC_ESETSTATUS, data->setglobaldelay, FALSE); } EnableWindow(GetDlgItem(hwndDlg, IDC_SPECSET), FALSE); } else EnableWindow(GetDlgItem(hwndDlg, IDC_SPECSET), TRUE); break; } break; case IDC_LISTPROTO: switch (HIWORD(wParam)) { case LBN_SELCHANGE: { int status_modes, i, l, index, newindex = 0; i = SendMessage((HWND)lParam, LB_GETITEMDATA, (WPARAM)SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0), 0); status_modes = CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0) & ~CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_5, 0); SendMessage(GetDlgItem(hwndDlg, IDC_LISTSTATUS), LB_RESETCONTENT, 0, 0); for (l = ID_STATUS_OFFLINE; l <= ID_STATUS_OUTTOLUNCH; l++) { if (status_modes & Proto_Status2Flag(l) || l == ID_STATUS_OFFLINE) { index = SendMessage(GetDlgItem(hwndDlg, IDC_LISTSTATUS), LB_INSERTSTRING, -1, (LPARAM)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, l, GSMDF_TCHAR)); if (index != LB_ERR && index != LB_ERRSPACE) { SendMessage(GetDlgItem(hwndDlg, IDC_LISTSTATUS), LB_SETITEMDATA, (WPARAM)index, (LPARAM)l - ID_STATUS_OFFLINE); if (data->status[i] == l) newindex = index; } } } index = SendMessage(GetDlgItem(hwndDlg, IDC_LISTSTATUS), LB_INSERTSTRING, -1, (LPARAM)TranslateT("")); if (index != LB_ERR && index != LB_ERRSPACE) { SendMessage(GetDlgItem(hwndDlg, IDC_LISTSTATUS), LB_SETITEMDATA, (WPARAM)index, (LPARAM)ID_STATUS_CURRENT-ID_STATUS_OFFLINE); if (data->status[i] == ID_STATUS_CURRENT) newindex = index; } SendMessage(GetDlgItem(hwndDlg, IDC_LISTSTATUS), LB_SETCURSEL, (WPARAM)newindex, 0); if (IsDlgButtonChecked(hwndDlg, IDC_SPECSET) == BST_CHECKED || (accounts->statusCount == 1 && accounts->statusMsgCount == 1)) SetDlgItemInt(hwndDlg, IDC_ESETSTATUS, data->setdelay[i], FALSE); break; } } break; case IDC_LISTSTATUS: switch (HIWORD(wParam)) { case LBN_SELCHANGE: { int i = SendMessage((HWND)lParam, LB_GETITEMDATA, (WPARAM)SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0), 0); int j = SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_GETITEMDATA, (WPARAM)SendMessage(GetDlgItem(hwndDlg, IDC_LISTPROTO), LB_GETCURSEL, 0, 0), 0); data->status[j] = i + ID_STATUS_OFFLINE; break; } } break; } break; case WM_NOTIFY: if (((LPNMHDR)lParam)->idFrom == 0 && ((LPNMHDR)lParam)->code == PSN_APPLY) { char szSetting[80]; for (int i = 0; i < accounts->count; i++) { if (!IsAccountEnabled(accounts->pa[i]) || !(CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0)&~CallProtoService(accounts->pa[i]->szModuleName, PS_GETCAPS, PFLAGNUM_5, 0))) continue; mir_snprintf(szSetting, SIZEOF(szSetting), "Startup%sStatus", accounts->pa[i]->szModuleName); DBWriteContactSettingWord(NULL, "SimpleStatusMsg", szSetting, (WORD)data->status[i]); mir_snprintf(szSetting, SIZEOF(szSetting), "Set%sStatusDelay", accounts->pa[i]->szModuleName); DBWriteContactSettingWord(NULL, "SimpleStatusMsg", szSetting, (WORD)data->setdelay[i]); } DBWriteContactSettingWord(NULL, "SimpleStatusMsg", "SetStatusDelay", (WORD)data->setglobaldelay); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "GlobalStatusDelay", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_SPECSET) != BST_CHECKED)); DBWriteContactSettingByte(NULL, "SimpleStatusMsg", "StartupPopupDlg", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_POPUPDLG) == BST_CHECKED)); return TRUE; } break; case WM_DESTROY: mir_free(data->status); mir_free(data->setdelay); mir_free(data); break; } return FALSE; } int InitOptions(WPARAM wParam, LPARAM lParam) { if (accounts->statusCount == 0) return 0; OPTIONSDIALOGPAGE odp = {0}; odp.cbSize = sizeof(odp); odp.hInstance = g_hInst; odp.flags = ODPF_BOLDGROUPS; if (!ServiceExists(MS_SS_GETPROFILECOUNT)) { odp.pszTitle = LPGEN("Status"); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_STATUS); odp.pfnDlgProc = DlgStatusOptionsProc; Options_AddPage(wParam, &odp); } if (accounts->statusMsgCount == 0) return 0; odp.position = 870000000; odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_GENERAL); odp.pszTitle = LPGEN("Status Messages"); odp.pszGroup = LPGEN("Status"); odp.pszTab = LPGEN("General"); odp.pfnDlgProc = DlgOptionsProc; Options_AddPage(wParam, &odp); odp.pszTab = LPGEN("Variables"); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_VARIABLES); odp.pfnDlgProc = DlgVariablesOptionsProc; Options_AddPage(wParam, &odp); odp.pszTab = LPGEN("Advanced"); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_ADVANCED); odp.pfnDlgProc = DlgAdvancedOptionsProc; Options_AddPage(wParam, &odp); return 0; }