/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include "fdd.h" #include "resource.h" #include "constants.h" #include "protolist.h" #include "EnumProc.h" #include "../headers_c/newpluginapi.h" #include "../headers_c/m_clist.h" #include "../headers_c/m_database.h" #include "../headers_c/m_langpack.h" #include "../headers_c/m_options.h" #include "../headers_c/m_protosvc.h" #include "../headers_c/m_protocols.h" #ifndef ListView_SetCheckState #define ListView_SetCheckState(hLv, iItem, bCheck) ListView_SetItemState(hLv, iItem, bCheck ? INDEXTOSTATEIMAGEMASK(2) : INDEXTOSTATEIMAGEMASK(1), LVIS_STATEIMAGEMASK) #endif void LoadSettings(void); int InitializeOptions(WPARAM,LPARAM); INT_PTR CALLBACK DlgProcOptions(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK DlgProcProtoOptions(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK DlgProcBasicOptions(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK DlgProcEffectOptions(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK DlgProcProcesses(HWND, UINT, WPARAM, LPARAM); void previewFlashing(BOOL); static void PreviewThread(void *); void createProcessListAux(void); void destroyProcessListAux(void); char *NumberToDBSetting(const char*, int); extern HINSTANCE hInst; extern BOOL bWindowsNT; extern BYTE bFlashOnMsg; extern BYTE bFlashOnURL; extern BYTE bFlashOnFile; extern BYTE bFlashOnOther; extern BYTE bFullScreenMode; extern BYTE bScreenSaverRunning; extern BYTE bWorkstationLocked; extern BYTE bProcessesAreRunning; extern BYTE bWorkstationActive; extern BYTE bFlashIfMsgOpen; extern BYTE bFlashIfMsgOlder; extern WORD wSecondsOlder; extern BYTE bFlashUntil; extern WORD wBlinksNumber; extern BYTE bMirandaOrWindows; extern WORD wStatusMap; extern WORD wReminderCheck; extern WORD wStartDelay; extern BYTE bFlashSpeed; extern BYTE bFlashIfMsgWinNotTop; extern PROTOCOL_LIST ProtoList; extern PROCESS_LIST ProcessList; HWND hwndProto, hwndBasic, hwndEffect, hwndCurrentTab; char *AttendedName[]={"Miranda", "Windows"}; PROCESS_LIST ProcessListAux; // ** // ** Initialize the Miranda options page // ** int InitializeOptions(WPARAM wParam,LPARAM lParam) { OPTIONSDIALOGPAGE odp; ZeroMemory(&odp,sizeof(odp)); odp.cbSize = sizeof(odp); odp.position = 0; odp.hInstance = hInst; odp.pszTemplate = MAKEINTRESOURCE(IDD_OPTIONS); odp.pszTitle = Translate("Floppy Flash"); odp.pszGroup = Translate("Plugins"); odp.groupPosition = 910000000; odp.flags=ODPF_BOLDGROUPS; odp.pfnDlgProc = DlgProcOptions; odp.nIDBottomSimpleControl = 0; CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp); return 0; } INT_PTR CALLBACK DlgProcOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { HWND tc; TCITEM tci; tc = GetDlgItem(hwndDlg, IDC_TABS); tci.mask = TCIF_TEXT; tci.pszText = Translate("Protocols"); TabCtrl_InsertItem(tc, 0, &tci); tci.pszText = Translate("Rules"); TabCtrl_InsertItem(tc, 1, &tci); tci.pszText = Translate("Flashing"); TabCtrl_InsertItem(tc, 2, &tci); hwndProto = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_PROTO_OPTIONS), hwndDlg, DlgProcProtoOptions, (LPARAM) NULL); SetWindowPos(hwndProto, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); ShowWindow(hwndProto, SW_SHOW); hwndBasic = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_BASIC_OPTIONS), hwndDlg, DlgProcBasicOptions, (LPARAM) NULL); SetWindowPos(hwndBasic, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hwndEffect = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_EFFECT_OPTIONS), hwndDlg, DlgProcEffectOptions, (LPARAM) NULL); SetWindowPos(hwndEffect, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hwndCurrentTab = hwndProto; return TRUE; } case WM_COMMAND: break; case WM_NOTIFY: { switch (((LPNMHDR) lParam)->code) { case TCN_SELCHANGE: switch (wParam) { case IDC_TABS: { HWND hwnd; switch (TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TABS))) { default: case 0: hwnd = hwndProto; break; case 1: hwnd = hwndBasic; break; case 2: hwnd = hwndEffect; break; } if (hwnd!=hwndCurrentTab) { ShowWindow(hwnd, SW_SHOW); ShowWindow(hwndCurrentTab, SW_HIDE); hwndCurrentTab = hwnd; } } break; } break; case PSN_APPLY: SendMessage(hwndProto, WM_NOTIFY, wParam, lParam); SendMessage(hwndBasic, WM_NOTIFY, wParam, lParam); SendMessage(hwndEffect, WM_NOTIFY, wParam, lParam); return TRUE; } } break; case WM_DESTROY: break; } return FALSE; } INT_PTR CALLBACK DlgProcProtoOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static BOOL initDlg=FALSE; switch (msg) { case WM_INITDIALOG: initDlg=TRUE; TranslateDialogDefault(hwndDlg); // proto list { int i; LVCOLUMN lvCol; LVITEM lvItem; HWND hList = GetDlgItem(hwndDlg, IDC_PROTOCOLLIST); // create columns ListView_SetExtendedListViewStyleEx(hList, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES); memset(&lvCol, 0, sizeof(lvCol)); lvCol.mask = LVCF_WIDTH|LVCF_TEXT; lvCol.pszText = Translate("Protocol"); lvCol.cx = 118; ListView_InsertColumn(hList, 0, &lvCol); // fill memset(&lvItem, 0, sizeof(lvItem)); lvItem.mask = LVIF_TEXT|LVIF_PARAM; lvItem.cchTextMax = 256; lvItem.iItem = 0; lvItem.iSubItem = 0; for(i=0; i < ProtoList.protoCount; i++) { char protoName[MAX_PATH+1]; if(ProtoList.protoInfo[i].visible) { lvItem.lParam = (LPARAM)ProtoList.protoInfo[i].szProto; CallProtoService(ProtoList.protoInfo[i].szProto, PS_GETNAME, sizeof(protoName), (LPARAM)protoName); lvItem.pszText = protoName; ListView_InsertItem(hList, &lvItem); ListView_SetCheckState(hList, lvItem.iItem, ProtoList.protoInfo[i].enabled); lvItem.iItem++; } } } initDlg=FALSE; return TRUE; case WM_NOTIFY: { //Here we have pressed either the OK or the APPLY button. switch(((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: // enabled protos { int i; LVITEM lvItem; HWND hList = GetDlgItem(hwndDlg, IDC_PROTOCOLLIST); memset(&lvItem, 0, sizeof(lvItem)); lvItem.mask = LVIF_PARAM; lvItem.iSubItem = 0; for (i=0; i < ListView_GetItemCount(hList); i++) { lvItem.iItem = i; ListView_GetItem(hList, &lvItem); DBWriteContactSettingByte(NULL, FDDMODULE, (char *)lvItem.lParam, (BYTE)!!ListView_GetCheckState(hList, lvItem.iItem)); } } LoadSettings(); return TRUE; } // switch code - 0 break; case IDC_PROTOCOLLIST: switch(((NMHDR*)lParam)->code) { case LVN_ITEMCHANGED: { NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam; if (!initDlg && ((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK)) SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0); } break; } // switch code - IDC_PROTOCOLLIST break; } //switch idFrom } break; //End WM_NOTIFY default: break; } return FALSE; } INT_PTR CALLBACK DlgProcBasicOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { int i; static BOOL initDlg=FALSE; switch (msg) { case WM_INITDIALOG: initDlg=TRUE; TranslateDialogDefault(hwndDlg); createProcessListAux(); CheckDlgButton(hwndDlg, IDC_ONMESSAGE, bFlashOnMsg ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONURL, bFlashOnURL ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONFILE, bFlashOnFile ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONOTHER, bFlashOnOther ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_FSCREEN, bFullScreenMode ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SSAVER, bScreenSaverRunning ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_LOCKED, bWorkstationLocked ? BST_CHECKED:BST_UNCHECKED); if (!bWindowsNT) EnableWindow(GetDlgItem(hwndDlg, IDC_LOCKED), FALSE); CheckDlgButton(hwndDlg, IDC_PGMS, bProcessesAreRunning ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ACTIVE, bWorkstationActive ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_IFOPEN, bFlashIfMsgOpen ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_IFNOTTOP, bFlashIfMsgWinNotTop ? BST_CHECKED:BST_UNCHECKED); if (!bFlashIfMsgOpen) EnableWindow(GetDlgItem(hwndDlg, IDC_IFNOTTOP), FALSE); CheckDlgButton(hwndDlg, IDC_IFOLDER, bFlashIfMsgOlder ? BST_CHECKED:BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_OLDERSPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_SOLDER), 0); SendDlgItemMessage(hwndDlg, IDC_OLDERSPIN, UDM_SETRANGE32, 1, MAKELONG(UD_MAXVAL, 0)); SendDlgItemMessage(hwndDlg, IDC_OLDERSPIN, UDM_SETPOS, 0, MAKELONG(wSecondsOlder, 0)); if (!bFlashIfMsgOlder) { EnableWindow(GetDlgItem(hwndDlg, IDC_SOLDER), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_OLDERSPIN), FALSE); } CheckDlgButton(hwndDlg, IDC_UNTILBLK, bFlashUntil&UNTIL_NBLINKS ? BST_CHECKED:BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_BLINKSPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_SBLINK), 0); SendDlgItemMessage(hwndDlg, IDC_BLINKSPIN, UDM_SETRANGE32, 1, MAKELONG(UD_MAXVAL, 0)); SendDlgItemMessage(hwndDlg, IDC_BLINKSPIN, UDM_SETPOS, 0, MAKELONG(wBlinksNumber, 0)); if (!(bFlashUntil & UNTIL_NBLINKS)) { EnableWindow(GetDlgItem(hwndDlg, IDC_SBLINK), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_BLINKSPIN), FALSE); } CheckDlgButton(hwndDlg, IDC_UNTILATTENDED, bFlashUntil&UNTIL_REATTENDED ? BST_CHECKED:BST_UNCHECKED); for (i=0; i < 2; i++) { int index = SendDlgItemMessage(hwndDlg, IDC_MIRORWIN, CB_INSERTSTRING, (WPARAM)-1, (LPARAM)AttendedName[i]); if (index != CB_ERR && index != CB_ERRSPACE) SendDlgItemMessage(hwndDlg, IDC_MIRORWIN, CB_SETITEMDATA, (WPARAM)index, (LPARAM)i); } SendDlgItemMessage(hwndDlg, IDC_MIRORWIN, CB_SETCURSEL, (WPARAM)bMirandaOrWindows, 0); if (!(bFlashUntil & UNTIL_REATTENDED)) EnableWindow(GetDlgItem(hwndDlg, IDC_MIRORWIN), FALSE); CheckDlgButton(hwndDlg, IDC_UNTILOPEN, bFlashUntil&UNTIL_EVENTSOPEN ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_UNTILCOND, bFlashUntil&UNTIL_CONDITIONS ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONLINE, wStatusMap&MAP_ONLINE ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AWAY, wStatusMap&MAP_AWAY ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_NA, wStatusMap&MAP_NA ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_OCCUPIED, wStatusMap&MAP_OCCUPIED ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_DND, wStatusMap&MAP_DND ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_FREECHAT, wStatusMap&MAP_FREECHAT ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_INVISIBLE, wStatusMap&MAP_INVISIBLE ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONTHEPHONE, wStatusMap&MAP_ONTHEPHONE ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_OUTTOLUNCH, wStatusMap&MAP_OUTTOLUNCH ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_OFFLINE, wStatusMap&MAP_OFFLINE ? BST_CHECKED:BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_REMCHECK, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_SREMCHECK), 0); SendDlgItemMessage(hwndDlg, IDC_REMCHECK, UDM_SETRANGE32, 0, MAKELONG(UD_MAXVAL, 0)); SendDlgItemMessage(hwndDlg, IDC_REMCHECK, UDM_SETPOS, 0, MAKELONG(wReminderCheck, 0)); initDlg=FALSE; return TRUE; case WM_VSCROLL: case WM_HSCROLL: SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0); break; case WM_DESTROY: destroyProcessListAux(); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_ONMESSAGE: case IDC_ONURL: case IDC_ONFILE: case IDC_ONOTHER: case IDC_IFOPEN: case IDC_IFNOTTOP: case IDC_IFOLDER: case IDC_UNTILBLK: case IDC_UNTILATTENDED: case IDC_MIRORWIN: case IDC_UNTILOPEN: case IDC_UNTILCOND: case IDC_FSCREEN: case IDC_SSAVER: case IDC_LOCKED: case IDC_PGMS: case IDC_ACTIVE: case IDC_ONLINE: case IDC_AWAY: case IDC_NA: case IDC_OCCUPIED: case IDC_DND: case IDC_FREECHAT: case IDC_INVISIBLE: case IDC_ONTHEPHONE: case IDC_OUTTOLUNCH: case IDC_OFFLINE: EnableWindow(GetDlgItem(hwndDlg, IDC_IFNOTTOP), IsDlgButtonChecked(hwndDlg, IDC_IFOPEN) == BST_CHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_SOLDER), IsDlgButtonChecked(hwndDlg, IDC_IFOLDER) == BST_CHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_OLDERSPIN), IsDlgButtonChecked(hwndDlg, IDC_IFOLDER) == BST_CHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_SBLINK), IsDlgButtonChecked(hwndDlg, IDC_UNTILBLK) == BST_CHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_BLINKSPIN), IsDlgButtonChecked(hwndDlg, IDC_UNTILBLK) == BST_CHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_MIRORWIN), IsDlgButtonChecked(hwndDlg, IDC_UNTILATTENDED) == BST_CHECKED); SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0); return TRUE; case IDC_SOLDER: if(HIWORD(wParam) == EN_CHANGE && !initDlg) { BOOL translated; int val = GetDlgItemInt(hwndDlg, IDC_SOLDER, &translated, FALSE); if (translated && val < 1) SendDlgItemMessage(hwndDlg, IDC_OLDERSPIN, UDM_SETPOS, 0, MAKELONG(val, 0)); SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0); } return TRUE; case IDC_SBLINK: if(HIWORD(wParam) == EN_CHANGE && !initDlg) { BOOL translated; int val = GetDlgItemInt(hwndDlg, IDC_SBLINK, &translated, FALSE); if (translated && val < 1) SendDlgItemMessage(hwndDlg, IDC_BLINKSPIN, UDM_SETPOS, 0, MAKELONG(val, 0)); SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0); } return TRUE; case IDC_ASSIGNPGMS: if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PROCESSES), hwndDlg, DlgProcProcesses, 0) == IDC_OKPGM) SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0); return TRUE; case IDC_SREMCHECK: if(HIWORD(wParam) == EN_CHANGE && !initDlg) SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0); return TRUE; } break; case WM_NOTIFY: { unsigned int j; BYTE untilMap = 0; WORD statusMap = 0; //Here we have pressed either the OK or the APPLY button. switch(((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: DBWriteContactSettingByte(NULL, FDDMODULE, "onmsg", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ONMESSAGE) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "onurl", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ONURL) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "onfile", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ONFILE) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "onother", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ONOTHER) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "fscreenmode", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_FSCREEN) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "ssaverrunning", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_SSAVER) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "wstationlocked", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_LOCKED) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "procsrunning", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_PGMS) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "wstationactive", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ACTIVE) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "ifmsgopen", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_IFOPEN) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "ifmsgnottop", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_IFNOTTOP) == BST_CHECKED ? 1:0)); DBWriteContactSettingByte(NULL, FDDMODULE, "ifmsgolder", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_IFOLDER) == BST_CHECKED ? 1:0)); DBWriteContactSettingWord(NULL, FDDMODULE, "secsolder", (WORD)SendDlgItemMessage(hwndDlg, IDC_OLDERSPIN, UDM_GETPOS, 0, 0)); if(IsDlgButtonChecked(hwndDlg, IDC_UNTILBLK) == BST_CHECKED) untilMap |= UNTIL_NBLINKS; if (IsDlgButtonChecked(hwndDlg, IDC_UNTILATTENDED) == BST_CHECKED) untilMap |= UNTIL_REATTENDED; if (IsDlgButtonChecked(hwndDlg, IDC_UNTILOPEN) == BST_CHECKED) untilMap |= UNTIL_EVENTSOPEN; if (IsDlgButtonChecked(hwndDlg, IDC_UNTILCOND) == BST_CHECKED) untilMap |= UNTIL_CONDITIONS; DBWriteContactSettingByte(NULL, FDDMODULE, "funtil", untilMap); DBWriteContactSettingWord(NULL, FDDMODULE, "nblinks", (WORD)SendDlgItemMessage(hwndDlg, IDC_BLINKSPIN, UDM_GETPOS, 0, 0)); DBWriteContactSettingByte(NULL, FDDMODULE, "mirorwin", (BYTE)SendDlgItemMessage(hwndDlg, IDC_MIRORWIN, CB_GETITEMDATA, (WPARAM)SendDlgItemMessage(hwndDlg, IDC_MIRORWIN, CB_GETCURSEL, 0, 0), 0)); if(IsDlgButtonChecked(hwndDlg, IDC_ONLINE) == BST_CHECKED) statusMap |= MAP_ONLINE; if(IsDlgButtonChecked(hwndDlg, IDC_AWAY) == BST_CHECKED) statusMap |= MAP_AWAY; if(IsDlgButtonChecked(hwndDlg, IDC_NA) == BST_CHECKED) statusMap |= MAP_NA; if(IsDlgButtonChecked(hwndDlg, IDC_OCCUPIED) == BST_CHECKED) statusMap |= MAP_OCCUPIED; if(IsDlgButtonChecked(hwndDlg, IDC_DND) == BST_CHECKED) statusMap |= MAP_DND; if(IsDlgButtonChecked(hwndDlg, IDC_FREECHAT) == BST_CHECKED) statusMap |= MAP_FREECHAT; if(IsDlgButtonChecked(hwndDlg, IDC_INVISIBLE) == BST_CHECKED) statusMap |= MAP_INVISIBLE; if(IsDlgButtonChecked(hwndDlg, IDC_ONTHEPHONE) == BST_CHECKED) statusMap |= MAP_ONTHEPHONE; if(IsDlgButtonChecked(hwndDlg, IDC_OUTTOLUNCH) == BST_CHECKED) statusMap |= MAP_OUTTOLUNCH; if(IsDlgButtonChecked(hwndDlg, IDC_OFFLINE) == BST_CHECKED) statusMap |= MAP_OFFLINE; DBWriteContactSettingWord(NULL, FDDMODULE, "status", statusMap); DBWriteContactSettingWord(NULL, FDDMODULE, "remcheck", (WORD)SendDlgItemMessage(hwndDlg, IDC_REMCHECK, UDM_GETPOS, 0, 0)); for (i=0, j=0; j < ProcessListAux.count; j++) if (ProcessListAux.szFileName[j]) DBWriteContactSettingString(NULL, FDDMODULE, NumberToDBSetting("process", i++), ProcessListAux.szFileName[j]); DBWriteContactSettingWord(NULL, FDDMODULE, "processcount", (WORD)i); while (!DBDeleteContactSetting(NULL, FDDMODULE, NumberToDBSetting("process", i++))); LoadSettings(); return TRUE; } // switch code break; } //switch idFrom } break; //End WM_NOTIFY default: break; } return FALSE; } INT_PTR CALLBACK DlgProcEffectOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static BOOL initDlg=FALSE; switch (msg) { case WM_INITDIALOG: initDlg=TRUE; TranslateDialogDefault(hwndDlg); SendDlgItemMessage(hwndDlg, IDC_DELAYSPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_SDELAY), 0); SendDlgItemMessage(hwndDlg, IDC_DELAYSPIN, UDM_SETRANGE32, 0, MAKELONG(UD_MAXVAL, 0)); SendDlgItemMessage(hwndDlg, IDC_DELAYSPIN, UDM_SETPOS, 0, MAKELONG(wStartDelay, 0)); SendDlgItemMessage(hwndDlg, IDC_SPEED, TBM_SETRANGE, FALSE, MAKELONG(0, 5)); SendDlgItemMessage(hwndDlg, IDC_SPEED, TBM_SETPOS, TRUE, bFlashSpeed); initDlg=FALSE; return TRUE; case WM_VSCROLL: case WM_HSCROLL: SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0); break; case WM_DESTROY: previewFlashing(FALSE); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_SPEED: SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0); return TRUE; case IDC_SDELAY: if(HIWORD(wParam) == EN_CHANGE && !initDlg) SendMessage(GetParent(GetParent(hwndDlg)), PSM_CHANGED, 0, 0); return TRUE; case IDC_PREVIEW: previewFlashing(IsDlgButtonChecked(hwndDlg, IDC_PREVIEW) == BST_CHECKED); return TRUE; } break; case WM_NOTIFY: { //Here we have pressed either the OK or the APPLY button. switch(((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: DBWriteContactSettingWord(NULL, FDDMODULE, "sdelay", (WORD)SendDlgItemMessage(hwndDlg, IDC_DELAYSPIN, UDM_GETPOS, 0, 0)); DBWriteContactSettingByte(NULL, FDDMODULE, "speed", (BYTE)SendDlgItemMessage(hwndDlg, IDC_SPEED, TBM_GETPOS, 0, 0)); LoadSettings(); return TRUE; } // switch code break; } //switch idFrom } break; //End WM_NOTIFY default: break; } return FALSE; } // PreviewThread globals extern int nWaitDelay; BOOL bPreviewSemaphore, bPreview; //Preview Flashing functions void previewFlashing(BOOL buttonState) { DWORD threadID = 0; bPreview = buttonState; if (!bPreview || bPreviewSemaphore) // turn off flashing or already running return; bPreviewSemaphore = TRUE; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PreviewThread, NULL, 0, &threadID); } static void PreviewThread(void *dummy) { BYTE data = 0; if (wStartDelay > 0) Sleep(wStartDelay * 1000); while (bPreview) { data = !data; ToggleFddLight(0, data); Sleep(nWaitDelay); } ToggleFddLight(0, 0); bPreviewSemaphore = FALSE; } INT_PTR CALLBACK DlgProcProcesses(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { unsigned int i; switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, EM_LIMITTEXT, MAX_PATH, 0); for (i=0; i < ProcessListAux.count; i++) if (ProcessListAux.szFileName[i]) { int index = SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_INSERTSTRING, (WPARAM)-1, (LPARAM)ProcessListAux.szFileName[i]); if (index != CB_ERR && index != CB_ERRSPACE) SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_SETITEMDATA, (WPARAM)index, (LPARAM)i); } EnableWindow(GetDlgItem(hwndDlg, IDC_ADDPGM), FALSE); if (SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_GETCOUNT, 0, 0) == 0) EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), FALSE); else SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_SETCURSEL, 0, 0); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_PROGRAMS: switch (HIWORD(wParam)) { int item; char szFileName[MAX_PATH+1]; case CBN_SELENDOK: case CBN_SELCHANGE: EnableWindow(GetDlgItem(hwndDlg, IDC_ADDPGM), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), TRUE); break; case CBN_EDITCHANGE: GetDlgItemText(hwndDlg, IDC_PROGRAMS, szFileName, sizeof(szFileName)); if ((item = SendMessage((HWND)lParam, CB_FINDSTRINGEXACT, -1, (LPARAM)szFileName)) == CB_ERR) { //new program EnableWindow(GetDlgItem(hwndDlg, IDC_ADDPGM), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), FALSE); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_ADDPGM), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), TRUE); } break; } break; case IDC_ADDPGM: { int item; char szFileName[MAX_PATH+1]; GetDlgItemText(hwndDlg, IDC_PROGRAMS, szFileName, sizeof(szFileName)); if (!szFileName[0]) break; item = SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_ADDSTRING, 0, (LPARAM)szFileName); EnableWindow(GetDlgItem(hwndDlg, IDC_ADDPGM), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), TRUE); } break; case IDC_DELETEPGM: { int item; char szFileName[MAX_PATH+1]; GetDlgItemText(hwndDlg, IDC_PROGRAMS, szFileName, sizeof(szFileName)); item = SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_FINDSTRINGEXACT, -1, (LPARAM)szFileName); SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_DELETESTRING, (WPARAM)item, 0); if (SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_GETCOUNT, 0, 0) == 0) { SetDlgItemText(hwndDlg, IDC_PROGRAMS, ""); EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEPGM), FALSE); } else SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_SETCURSEL, 0, 0); } break; case IDC_OKPGM: destroyProcessListAux(); ProcessListAux.count = SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_GETCOUNT, 0, 0); ProcessListAux.szFileName = (char **)malloc(ProcessListAux.count * sizeof(char *)); if (!ProcessListAux.szFileName) ProcessListAux.count = 0; else for (i=0; i < ProcessListAux.count; i++) { char szFileNameAux[MAX_PATH+1]; SendDlgItemMessage(hwndDlg, IDC_PROGRAMS, CB_GETLBTEXT, (WPARAM)i, (LPARAM)szFileNameAux); ProcessListAux.szFileName[i] = (char *)malloc(strlen(szFileNameAux) + 1); if (ProcessListAux.szFileName[i]) strcpy(ProcessListAux.szFileName[i], szFileNameAux); } case IDC_CANCELPGM: EndDialog(hwndDlg, LOWORD(wParam)); break; } break; } return FALSE; } void createProcessListAux(void) { unsigned int i; ProcessListAux.count = ProcessList.count; ProcessListAux.szFileName = (char **)malloc(ProcessListAux.count * sizeof(char *)); if (!ProcessListAux.szFileName) ProcessListAux.count = 0; else for (i=0; i < ProcessListAux.count; i++) if (!ProcessList.szFileName[i]) ProcessListAux.szFileName[i] = NULL; else { ProcessListAux.szFileName[i] = (char *)malloc(strlen(ProcessList.szFileName[i]) + 1); if (ProcessListAux.szFileName[i]) strcpy(ProcessListAux.szFileName[i], ProcessList.szFileName[i]); } } void destroyProcessListAux(void) { unsigned int i; for(i=0; i < ProcessListAux.count; i++) if (ProcessListAux.szFileName[i]) free(ProcessListAux.szFileName[i]); if (ProcessListAux.szFileName) free(ProcessListAux.szFileName); ProcessListAux.count = 0; ProcessListAux.szFileName = NULL; } char *NumberToDBSetting(const char* name, int sequence) { static char returnString[50]; _snprintf(returnString, sizeof(returnString), "%s%d", name, sequence); return returnString; }