/* Popup Plus plugin for Miranda IM Copyright © 2002 Luca Santarelli, © 2004-2007 Victor Pavlychko © 2010 MPK © 2010 Merlin_de This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "headers.h" //--------------------------------------------------------------------------- //Workaround for MS bug ComboBox_SelectItemData int ComboBox_SelectItem(HWND hwndCtl, int indexStart, char* data) { int i=0; for ( i ; i < ComboBox_GetCount(hwndCtl); i++) { if (strcmp(data, (char*)ComboBox_GetItemData(hwndCtl, i))==0) { ComboBox_SetCurSel (hwndCtl,i); return i; } } return CB_ERR; } //--------------------------------------------------------------------------- //some help function (not realy needed) #define ComboBox_AddStringW(hwndCtl, lpwsz) ((int)(DWORD)MySendMessageW((HWND)(hwndCtl), CB_ADDSTRING, 0L, (LPARAM)(LPCWSTR)(lpwsz))) #define ComboBox_SetTextW(hwndCtl, lpwsz) ((int)(DWORD)MySetWindowTextW((HWND)(hwndCtl), (LPCWSTR)(lpwsz))) //--------------------------------------------------------------------------- //Dialog Proc INT_PTR CALLBACK DlgProcOptsClasses(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static TVITEM tvi = {0}; static struct { UINT idCtrl; BYTE onTyp0; BYTE onTyp1; BYTE onTyp2; } ctrlsAll[] = { {IDC_TXT_TITLE1 ,0 ,1 ,1}, {IDC_ENABLE ,0 ,1 ,1}, {IDC_TXT_TIMEOUT ,0 ,1 ,1}, {IDC_TIMEOUT ,0 ,1 ,1}, {IDC_TIMEOUT_SPIN ,0 ,1 ,1}, {IDC_TXT_TIMEOUT_SEC ,0 ,1 ,1}, {IDC_TXT_TIMEOUT_DEFAULT ,0 ,1 ,1}, {IDC_TXT_TIMEOUT_INFINITE ,0 ,1 ,1}, {IDC_TXT_LACTION ,0 ,1 ,1}, {IDC_LACTION ,0 ,1 ,1}, {IDC_TXT_RACTION ,0 ,1 ,1}, {IDC_RACTION ,0 ,1 ,1}, {IDC_CHECKWINDOW ,0 ,0 ,0}, //may be delete ?? {IDC_TXT_TITLE3 ,0 ,1 ,0}, {IDC_SOFFLINE ,0 ,1 ,0}, {IDC_SONLINE ,0 ,1 ,0}, {IDC_SAWAY ,0 ,1 ,0}, {IDC_SNA ,0 ,1 ,0}, {IDC_SOCCUPIED ,0 ,1 ,0}, {IDC_SDND ,0 ,1 ,0}, {IDC_SFREE4CHAT ,0 ,1 ,0}, {IDC_SINVISIBLE ,0 ,1 ,0}, {IDC_SPHONE ,0 ,1 ,0}, {IDC_SLUNCH ,0 ,1 ,0}, {IDC_TXT_TITLE4 ,0 ,0 ,0}, {IDC_SOFFLINE2 ,0 ,0 ,0}, {IDC_SONLINE2 ,0 ,0 ,0}, {IDC_SAWAY2 ,0 ,0 ,0}, {IDC_SNA2 ,0 ,0 ,0}, {IDC_SOCCUPIED2 ,0 ,0 ,0}, {IDC_SDND2 ,0 ,0 ,0}, {IDC_SFREE4CHAT2 ,0 ,0 ,0}, {IDC_SINVISIBLE2 ,0 ,0 ,0}, {IDC_SPHONE2 ,0 ,0 ,0}, {IDC_SLUNCH2 ,0 ,0 ,0}, {IDC_ICO_INFO ,0 ,1 ,1}, {IDC_TXT_COLORS ,0 ,1 ,1}, {IDC_MORE ,0 ,1 ,1}, {IDC_PREVIEW ,0 ,1 ,1}, }; static UINT ctrlsClass[] = { IDC_TXT_TITLE1, /*IDC_TXT_TITLE3,*/ IDC_TXT_TIMEOUT, IDC_TIMEOUT, IDC_TIMEOUT_SPIN, IDC_TXT_TIMEOUT_SEC, IDC_TXT_TIMEOUT_DEFAULT, IDC_TXT_TIMEOUT_INFINITE, IDC_TXT_LACTION, IDC_LACTION, IDC_TXT_RACTION, IDC_RACTION, IDC_ICO_INFO, IDC_TXT_COLORS, }; static UINT ctrlsEnable[] = { IDC_TXT_TIMEOUT, IDC_TIMEOUT, IDC_TIMEOUT_SPIN, IDC_TXT_TIMEOUT_SEC , IDC_TXT_TIMEOUT_DEFAULT, IDC_TXT_TIMEOUT_INFINITE, IDC_TXT_LACTION, IDC_LACTION, IDC_TXT_RACTION, IDC_RACTION, /*IDC_CHECKWINDOW,*/ IDC_TXT_TITLE3, IDC_TXT_TITLE4, IDC_ICO_INFO, IDC_TXT_COLORS, IDC_MORE, IDC_SOFFLINE, IDC_SONLINE, IDC_SAWAY, IDC_SNA, IDC_SOCCUPIED, IDC_SDND, IDC_SFREE4CHAT, IDC_SINVISIBLE, IDC_SPHONE, IDC_SLUNCH, IDC_SOFFLINE2, IDC_SONLINE2, IDC_SAWAY2, IDC_SNA2, IDC_SOCCUPIED2, IDC_SDND2, IDC_SFREE4CHAT2, IDC_SINVISIBLE2, IDC_SPHONE2, IDC_SLUNCH2, }; static UINT ctrlsContact[] = { /*IDC_CHECKWINDOW,*/ IDC_TXT_TITLE4, IDC_SOFFLINE2, IDC_SONLINE2, IDC_SAWAY2, IDC_SNA2, IDC_SOCCUPIED2, IDC_SDND2, IDC_SFREE4CHAT2, IDC_SINVISIBLE2, IDC_SPHONE2, IDC_SLUNCH2, }; static int titleIds[] = { IDC_TXT_TITLE1, IDC_TXT_TITLE3, IDC_TXT_TITLE4, }; static struct { int idCtrl; int iconId; char *title; DWORD statusFlag; DWORD disableWhenFlag; } statusButtons[] = { {IDC_SOFFLINE, SKINICON_STATUS_OFFLINE, "Offline", PF2_IDLE, PF2_IDLE}, {IDC_SONLINE, SKINICON_STATUS_ONLINE, "Online", PF2_ONLINE, PF2_ONLINE}, {IDC_SAWAY, SKINICON_STATUS_AWAY, "Away", PF2_SHORTAWAY, PF2_SHORTAWAY}, {IDC_SNA, SKINICON_STATUS_NA, "NA", PF2_LONGAWAY, PF2_LONGAWAY}, {IDC_SOCCUPIED, SKINICON_STATUS_OCCUPIED, "Occupied", PF2_LIGHTDND, PF2_LIGHTDND}, {IDC_SDND, SKINICON_STATUS_DND, "DND", PF2_HEAVYDND, PF2_HEAVYDND}, {IDC_SFREE4CHAT, SKINICON_STATUS_FREE4CHAT, "Free for chat", PF2_FREECHAT, PF2_FREECHAT}, {IDC_SINVISIBLE, SKINICON_STATUS_INVISIBLE, "Invisible", PF2_INVISIBLE, PF2_INVISIBLE}, {IDC_SPHONE, SKINICON_STATUS_ONTHEPHONE, "On the phone", PF2_ONTHEPHONE, PF2_ONTHEPHONE}, {IDC_SLUNCH, SKINICON_STATUS_OUTTOLUNCH, "Out to lunch", PF2_OUTTOLUNCH, PF2_OUTTOLUNCH}, {IDC_SOFFLINE2, SKINICON_STATUS_OFFLINE, "Offline", PF2_IDLE, PF2_IDLE<<16}, {IDC_SONLINE2, SKINICON_STATUS_ONLINE, "Online", PF2_ONLINE, PF2_ONLINE<<16}, {IDC_SAWAY2, SKINICON_STATUS_AWAY, "Away", PF2_SHORTAWAY, PF2_SHORTAWAY<<16}, {IDC_SNA2, SKINICON_STATUS_NA, "NA", PF2_LONGAWAY, PF2_LONGAWAY<<16}, {IDC_SOCCUPIED2, SKINICON_STATUS_OCCUPIED, "Occupied", PF2_LIGHTDND, PF2_LIGHTDND<<16}, {IDC_SDND2, SKINICON_STATUS_DND, "DND", PF2_HEAVYDND, PF2_HEAVYDND<<16}, {IDC_SFREE4CHAT2, SKINICON_STATUS_FREE4CHAT, "Free for chat", PF2_FREECHAT, PF2_FREECHAT<<16}, {IDC_SINVISIBLE2, SKINICON_STATUS_INVISIBLE, "Invisible", PF2_INVISIBLE, PF2_INVISIBLE<<16}, {IDC_SPHONE2, SKINICON_STATUS_ONTHEPHONE, "On the phone", PF2_ONTHEPHONE, PF2_ONTHEPHONE<<16}, {IDC_SLUNCH2, SKINICON_STATUS_OUTTOLUNCH, "Out to lunch", PF2_OUTTOLUNCH, PF2_OUTTOLUNCH<<16}, }; switch ( msg ) { case WM_INITDIALOG: { int i; TranslateDialogDefault( hwnd ); //Treeview HWND hwndTree = GetDlgItem(hwnd, IDC_TREE1); { int iconIndex = 0; char iconName[MAXMODULELABELLENGTH]; TCHAR itemName[MAXMODULELABELLENGTH]; TreeView_DeleteAllItems(hwndTree); //Treeview create image list HIMAGELIST hImgLst = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR|ILC_COLOR32|ILC_MASK, 5, num_classes+1); ImageList_ReplaceIcon(hImgLst, -1, IcoLib_GetIcon(ICO_OPT_GROUP,0)); TreeView_SetImageList(hwndTree, hImgLst, TVSIL_NORMAL); for (i = 0; i < gTreeData.getCount(); ++i) { switch (gTreeData[i]->typ) { case 1: //Treeview part for typ 1 (notification) mir_snprintf(iconName, sizeof(iconName), "%s_"TCHAR_STR_PARAM"_"TCHAR_STR_PARAM, MODULNAME, gTreeData[i]->pszTreeRoot, gTreeData[i]->pszDescription); iconIndex = ImageList_ReplaceIcon(hImgLst, -1, IcoLib_GetIcon(iconName)); wsprintf(itemName, _T("%s/%s"), gTreeData[i]->pszTreeRoot, gTreeData[i]->pszDescription); break; case 2: //Treeview part typ 2 (popup class api) iconIndex = ImageList_ReplaceIcon(hImgLst, -1, gTreeData[i]->pupClass.hIcon); wsprintf(itemName, _T("%s/%s"), _T("CLASS Plugins")/*gTreeData[i]->pszTreeRoot*/, gTreeData[i]->pszDescription); break; default: break; } OptTree_AddItem(hwndTree, itemName, (LPARAM)gTreeData[i], iconIndex); } OptTree_Translate(hwndTree); } // end Treeview //Bold Title for (i = 0; i < SIZEOF(titleIds); ++i) { LOGFONT lf; GetObject((HFONT)SendDlgItemMessage(hwnd, titleIds[i], WM_GETFONT, 0, 0), sizeof(lf), &lf); lf.lfWeight = FW_BOLD; SendDlgItemMessage(hwnd, titleIds[i], WM_SETFONT, (WPARAM)CreateFontIndirect(&lf), TRUE); } //spindown for Timeout SendDlgItemMessage(hwnd, IDC_TIMEOUT_SPIN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(SETTING_LIFETIME_MAX, SETTING_LIFETIME_INFINITE)); SetDlgItemInt(hwnd,IDC_TIMEOUT, (UINT)0, TRUE); //status buttons for (i = 0; i < SIZEOF(statusButtons); ++i) { SendDlgItemMessage(hwnd, statusButtons[i].idCtrl, BUTTONSETASFLATBTN, TRUE, 0); SendDlgItemMessage(hwnd, statusButtons[i].idCtrl, BUTTONSETASPUSHBTN, TRUE, 0); SendDlgItemMessage(hwnd, statusButtons[i].idCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadSkinnedIcon(statusButtons[i].iconId)); SendDlgItemMessage(hwnd, statusButtons[i].idCtrl, BUTTONADDTOOLTIP, (WPARAM)Translate(statusButtons[i].title), 0); } //info icon SendDlgItemMessage(hwnd, IDC_ICO_INFO, STM_SETICON, (WPARAM)IcoLib_GetIcon(ICO_MISC_NOTIFY,0), 0); //more button EnableWindow(GetDlgItem(hwnd, IDC_MORE), FALSE); //preview button ShowWindow(GetDlgItem(hwnd, IDC_CHECKWINDOW), SW_HIDE); SendMessage(hwnd, WM_USER, 0, 0); return TRUE; } case WM_USER: { int i; HWND hTV = GetDlgItem(hwnd, IDC_TREE1); //get TreeView selection tvi.hItem = TreeView_GetSelection(hTV); tvi.mask = TVIF_PARAM|TVIF_HANDLE|TVIF_TEXT; if (tvi.hItem) TreeView_GetItem(hTV, &tvi); SetWindowLongPtr(hwnd, GWLP_USERDATA, tvi.lParam); if (tvi.lParam) { POPUPTREEDATA* ptd = (POPUPTREEDATA *)tvi.lParam; HWND hCtrl = 0; LPTSTR psztSelect = NULL; int index = 0; //combo left action (default) { hCtrl = GetDlgItem(hwnd, IDC_LACTION); ComboBox_ResetContent(hCtrl); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT(POPUP_ACTION_DISMISS)),POPUP_ACTION_DISMISS); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT(POPUP_ACTION_NOTHING)),POPUP_ACTION_NOTHING); } //combo right action (default) { hCtrl = GetDlgItem(hwnd, IDC_RACTION); ComboBox_ResetContent(hCtrl); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT(POPUP_ACTION_DISMISS)),POPUP_ACTION_DISMISS); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT(POPUP_ACTION_NOTHING)),POPUP_ACTION_NOTHING); } //element typ1 (Notification) if (ptd->typ == 1) { LPTSTR psztAction = NULL; //Timeout SetDlgItemInt(hwnd,IDC_TIMEOUT, (UINT)ptd->timeoutValue, TRUE); SendDlgItemMessage(hwnd, IDC_TIMEOUT_SPIN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(250, -1)); //combo left action (EXTRA) hCtrl = GetDlgItem(hwnd, IDC_LACTION); for (i = 0; i < ptd->notification.actionCount; ++i) { psztAction = mir_a2t(ptd->notification.lpActions[i].lpzTitle); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateTS(psztAction)),ptd->notification.lpActions[i].lpzTitle); mir_free(psztAction); psztAction = NULL; } //combo right action (EXTRA) hCtrl = GetDlgItem(hwnd, IDC_RACTION); psztAction = NULL; for (i = 0; i < ptd->notification.actionCount; ++i) { psztAction = mir_a2t(ptd->notification.lpActions[i].lpzTitle); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateTS(psztAction)),ptd->notification.lpActions[i].lpzTitle); mir_free(psztAction); psztAction = NULL; } //enable all controls for (i = 0; i < SIZEOF(ctrlsAll); ++i){ ShowWindow(GetDlgItem(hwnd, ctrlsAll[i].idCtrl), ctrlsAll[i].onTyp1 ? SW_SHOW : SW_HIDE); EnableWindow(GetDlgItem(hwnd, ctrlsAll[i].idCtrl), ctrlsAll[i].onTyp1); } //enable or disable controls ctrlsEnable for (i = 0; i < SIZEOF(ctrlsEnable); ++i) EnableWindow(GetDlgItem(hwnd, ctrlsEnable[i]), ptd->enabled ? TRUE : FALSE); //show or hide controls ctrlsContact for (i = 0; i < SIZEOF(ctrlsContact); ++i) ShowWindow(GetDlgItem(hwnd, ctrlsContact[i]), ptd->notification.dwFlags&PNF_CONTACT ? SW_SHOW : SW_HIDE); //statusButtons state for (i = 0; i < SIZEOF(statusButtons); ++i) CheckDlgButton(hwnd, statusButtons[i].idCtrl, ptd->disableWhen & statusButtons[i].disableWhenFlag ? TRUE : FALSE); } //element typ2 (CLASS Plugins) else if (ptd->typ == 2) { //Timeout SetDlgItemInt(hwnd,IDC_TIMEOUT, (UINT)ptd->timeoutValue, TRUE); SendDlgItemMessage(hwnd, IDC_TIMEOUT_SPIN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(250, -1)); //enable ctrls for (i = 0; i < SIZEOF(ctrlsAll); ++i){ ShowWindow(GetDlgItem(hwnd, ctrlsAll[i].idCtrl), ctrlsAll[i].onTyp2 ? SW_SHOW : SW_HIDE); EnableWindow(GetDlgItem(hwnd, ctrlsAll[i].idCtrl), ctrlsAll[i].onTyp2); } } //checkbox enable notify CheckDlgButton(hwnd, IDC_ENABLE, ptd->enabled ? TRUE : FALSE); //combo left action (SELECT) hCtrl = GetDlgItem(hwnd, IDC_LACTION); ComboBox_SelectItem (hCtrl, -1, ptd->leftAction); //use Workaround for MS bug ComboBox_SelectItemData //combo right action (SELECT) hCtrl = GetDlgItem(hwnd, IDC_RACTION); ComboBox_SelectItem (hCtrl, -1, ptd->rightAction); //use Workaround for MS bug ComboBox_SelectItemData } //end if (tvi.lParam) else { //enable / disable controls for (int i=0; i < SIZEOF(ctrlsAll); ++i) { ShowWindow(GetDlgItem(hwnd, ctrlsAll[i].idCtrl), ctrlsAll[i].onTyp0 ? SW_SHOW : SW_HIDE); EnableWindow(GetDlgItem(hwnd, ctrlsAll[i].idCtrl), ctrlsAll[i].onTyp0); } } break; } case WM_COMMAND: { UINT idCtrl = LOWORD(wParam); POPUPTREEDATA* ptd = (POPUPTREEDATA *)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (!ptd) break; switch (HIWORD(wParam)) { int i; case BN_CLICKED: //Button controls switch(idCtrl) { case IDC_ENABLE: ptd->enabled = (BYTE)Button_GetCheck((HWND)lParam); for (i = 0; i < SIZEOF(ctrlsEnable); ++i) EnableWindow(GetDlgItem(hwnd, ctrlsEnable[i]), ptd->enabled); SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IDC_PREVIEW: { POPUPDATA2 ppd = {0}; ppd.cbSize = sizeof(ppd); ppd.flags = PU2_TCHAR; ppd.lptzTitle = ptd->pszDescription; ppd.lptzText = TranslateT("Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn!"); ppd.iSeconds = ptd->timeoutValue; ppd.colorBack = ptd->colorBack; ppd.colorText = ptd->colorText; POPUPTREEDATA *ptdPrev = NULL; if (ptd->typ == 1) { //we work with a copy for preview ptdPrev = (POPUPTREEDATA *)mir_alloc(sizeof(POPUPTREEDATA)); memcpy(ptdPrev, ptd, sizeof(POPUPTREEDATA)); ptdPrev->enabled = ptd->enabled; ptdPrev->timeoutValue = ptd->timeoutValue; strcpy(ptdPrev->leftAction, ptd->leftAction); //geht noch nicht?? strcpy(ptdPrev->rightAction, ptd->rightAction); //geht noch nicht?? ptdPrev->disableWhen = ptd->disableWhen; ppd.lchNotification = (HANDLE)ptdPrev; } else if (ptd->typ == 2) ppd.lchIcon = ptd->pupClass.hIcon; CallService(MS_POPUP_ADDPOPUP2, (WPARAM)&ppd, APF_NO_HISTORY); mir_free(ptdPrev); ptdPrev = NULL; } break; case IDC_MORE: { OPENOPTIONSDIALOG ood = {0}; ood.cbSize = sizeof(OPENOPTIONSDIALOG); ood.pszGroup = "Customize"; ood.pszPage = "Fonts & Colors"; Options_Open(&ood); } break; case IDC_SOFFLINE: case IDC_SONLINE: case IDC_SAWAY: case IDC_SNA: case IDC_SOCCUPIED: case IDC_SDND: case IDC_SFREE4CHAT: case IDC_SINVISIBLE: case IDC_SPHONE: case IDC_SLUNCH: case IDC_SOFFLINE2: case IDC_SONLINE2: case IDC_SAWAY2: case IDC_SNA2: case IDC_SOCCUPIED2: case IDC_SDND2: case IDC_SFREE4CHAT2: case IDC_SINVISIBLE2: case IDC_SPHONE2: case IDC_SLUNCH2: { ptd->disableWhen = 0; for (i = 0; i < SIZEOF(statusButtons); ++i) { if (IsDlgButtonChecked(hwnd, statusButtons[i].idCtrl)) ptd->disableWhen |= statusButtons[i].disableWhenFlag; if (idCtrl == statusButtons[i].idCtrl) SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); } } break; default: break; } break; case CBN_SELCHANGE: //ComboBox controls switch(idCtrl) { //lParam = Handle to the control case IDC_LACTION: lstrcpynA(ptd->leftAction, (char *)ComboBox_GetItemData((HWND)lParam, ComboBox_GetCurSel((HWND)lParam)), sizeof(ptd->leftAction)); SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IDC_RACTION: lstrcpynA(ptd->rightAction, (char *)ComboBox_GetItemData((HWND)lParam, ComboBox_GetCurSel((HWND)lParam)), sizeof(ptd->rightAction)); SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; default: break; } break; case EN_CHANGE: //Edit controls switch(idCtrl) { //lParam = Handle to the control case IDC_TIMEOUT: { int seconds = GetDlgItemInt(hwnd, idCtrl, NULL, TRUE); if ( seconds >= SETTING_LIFETIME_INFINITE && seconds <= SETTING_LIFETIME_MAX && seconds != ptd->timeoutValue) { ptd->timeoutValue = seconds; SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); } } break; default: break; } break; case EN_KILLFOCUS: //Edit controls lost fokus switch(idCtrl) { //lParam = Handle to the control case IDC_TIMEOUT: { int seconds = GetDlgItemInt(hwnd, idCtrl, NULL, TRUE); if (seconds > SETTING_LIFETIME_MAX) ptd->timeoutValue = SETTING_LIFETIME_MAX; else if (seconds < SETTING_LIFETIME_INFINITE) ptd->timeoutValue = SETTING_LIFETIME_INFINITE; if (seconds != ptd->timeoutValue) { SetDlgItemInt(hwnd, idCtrl, ptd->timeoutValue, TRUE); ErrorMSG(SETTING_LIFETIME_INFINITE, SETTING_LIFETIME_MAX); SetFocus((HWND)lParam); } } break; default: break; }//end switch(idCtrl) break; default: break; } break; } case WM_NOTIFY: { switch(((LPNMHDR)lParam)->idFrom) { case 0: { switch (((LPNMHDR)lParam)->code) { case PSN_RESET: { for(int i=0; i < gTreeData.getCount(); ++i) { switch (gTreeData[i]->typ) { case 1: LoadNotificationSettings(gTreeData[i], "PopUpNotifications"); break; case 2: //not finish LoadClassSettings(gTreeData[i], PU_MODULCLASS); gTreeData[i]->timeoutValue = gTreeData[i]->pupClass.iSeconds; break; default: break; } } return TRUE; } case PSN_APPLY: { for(int i=0; i < gTreeData.getCount(); ++i) { switch (gTreeData[i]->typ) { case 1: gTreeData[i]->notification.iSeconds = gTreeData[i]->timeoutValue; SaveNotificationSettings(gTreeData[i],"PopUpNotifications"); break; case 2: //not finish gTreeData[i]->pupClass.iSeconds = gTreeData[i]->timeoutValue; SaveClassSettings(gTreeData[i],"PopUpCLASS"); break; default: break; } } return TRUE; } } break; } case IDC_TREE1: { switch (((LPNMHDR)lParam)->code) { case TVN_SELCHANGEDA: case TVN_SELCHANGEDW: { PostMessage(hwnd, WM_USER, 0, 0); break; } } break; } } break; } case WM_DESTROY: ZeroMemory(&tvi,sizeof(tvi)); break; default: return FALSE; } return FALSE; } void LoadClassSettings(POPUPTREEDATA *ptd, char* szModul) { char setting[2*MAXMODULELABELLENGTH]; char *szTmp = NULL; mir_snprintf(setting, sizeof(setting), "%s/enabled", ptd->pupClass.pszName); ptd->enabled = (signed char)DBGetContactSettingByte(NULL, szModul, setting, TRUE); mir_snprintf(setting, sizeof(setting), "%s/Timeout", ptd->pupClass.pszName); ptd->pupClass.iSeconds = (signed char)DBGetContactSettingWord(NULL, szModul, setting, 0); mir_snprintf(setting, sizeof(setting), "%s/TimeoutVal", ptd->pupClass.pszName); ptd->timeoutValue = (signed char)DBGetContactSettingWord(NULL, szModul, setting, ptd->pupClass.iSeconds ? ptd->pupClass.iSeconds : PopUpOptions.Seconds); mir_snprintf(setting, sizeof(setting), "%s/leftAction", ptd->pupClass.pszName); szTmp = DBGetContactSettingString(NULL, szModul, setting, POPUP_ACTION_NOTHING); //standart ?? lstrcpynA(ptd->leftAction, szTmp, sizeof(ptd->leftAction)); mir_free(szTmp); szTmp = NULL; mir_snprintf(setting, sizeof(setting), "%s/rightAction", ptd->pupClass.pszName); szTmp = DBGetContactSettingString(NULL, szModul, setting, POPUP_ACTION_DISMISS); //standart ?? lstrcpynA(ptd->rightAction, szTmp, sizeof(ptd->rightAction)); mir_free(szTmp); szTmp = NULL; } void SaveClassSettings(POPUPTREEDATA *ptd, char* szModul) { char setting[2*MAXMODULELABELLENGTH]; mir_snprintf(setting, sizeof(setting), "%s/enabled", ptd->pupClass.pszName); DBWriteContactSettingByte(NULL, szModul, setting, ptd->enabled); mir_snprintf(setting, sizeof(setting), "%s/Timeout", ptd->pupClass.pszName); DBWriteContactSettingWord(NULL, szModul, setting, ptd->pupClass.iSeconds); mir_snprintf(setting, sizeof(setting), "%s/TimeoutVal",ptd->pupClass.pszName); DBWriteContactSettingWord(NULL, szModul, setting, ptd->timeoutValue); mir_snprintf(setting, sizeof(setting), "%s/leftAction",ptd->pupClass.pszName); DBWriteContactSettingString(NULL, szModul, setting, ptd->leftAction); mir_snprintf(setting, sizeof(setting), "%s/rightAction",ptd->pupClass.pszName); DBWriteContactSettingString(NULL, szModul, setting, ptd->rightAction); }