/* UserinfoEx plugin for Miranda IM Copyright: � 2006-2010 DeathAxe, Yasnovidyashii, Merlin, K. Romanov, Kreol 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 "stdafx.h" #define PSM_ENABLE_TABITEM (WM_USER+106) static MenuOptionsList ctrl_Menu[] = { { SET_MI_MAIN, CHECK_OPT_MI_MAIN, RADIO_OPT_MI_MAIN_NONE, RADIO_OPT_MI_MAIN_ALL, RADIO_OPT_MI_MAIN_EXIMPORT }, { SET_MI_CONTACT, CHECK_OPT_MI_CONTACT, RADIO_OPT_MI_CONTACT_NONE, RADIO_OPT_MI_CONTACT_ALL, RADIO_OPT_MI_CONTACT_EXIMPORT }, { SET_MI_GROUP, CHECK_OPT_MI_GROUP, RADIO_OPT_MI_GROUP_NONE, RADIO_OPT_MI_GROUP_ALL, RADIO_OPT_MI_GROUP_EXIMPORT }, { SET_MI_SUBGROUP, CHECK_OPT_MI_SUBGROUP, RADIO_OPT_MI_SUBGROUP_NONE, RADIO_OPT_MI_SUBGROUP_ALL, RADIO_OPT_MI_SUBGROUP_EXIMPORT }, { SET_MI_ACCOUNT, CHECK_OPT_MI_ACCOUNT, RADIO_OPT_MI_ACCOUNT_NONE, RADIO_OPT_MI_ACCOUNT_ALL, RADIO_OPT_MI_ACCOUNT_EXIMPORT }, }; void __forceinline NotifyParentOfChange(HWND hDlg) { SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); } int __forceinline ComboBox_FindByItemDataPtr(HWND hCombo, LPARAM pData) { int nItemIndex; for (nItemIndex = ComboBox_GetCount(hCombo); (nItemIndex >= 0) && (ComboBox_GetItemData(hCombo, nItemIndex) != pData); nItemIndex--); return nItemIndex; } void __forceinline ComboBox_SetCurSelByItemDataPtr(HWND hCombo, LPARAM pData) { ComboBox_SetCurSel(hCombo, ComboBox_FindByItemDataPtr(hCombo, pData)); } void __forceinline ComboBox_AddItemWithData(HWND hCombo, LPTSTR ptszText, LPARAM pData) { ComboBox_SetItemData(hCombo, ComboBox_AddString(hCombo, TranslateW(ptszText)), pData); } /** * This function enables a dialog item * * @param hWnd - the dialog's window handle * @param idCtrl - the dialog item's identifier * @param bEnabled - TRUE if the item should be enabled, FALSE if disabled * * @retval TRUE on success * @retval FALSE on failure **/ static uint8_t EnableDlgItem(HWND hDlg, const int idCtrl, uint8_t bEnabled) { return EnableWindow(GetDlgItem(hDlg, idCtrl), bEnabled); } /** * This function enables a list of dialog items, if they were enabled in the resource editor. * * @param hWnd - the dialog's window handle * @param idCtrl - the array of dialog items' identifiers * @param countCtrl - the number of items in the array of dialog items * @param bEnabled - TRUE if the item should be enabled, FALSE if disabled * * @return bEnabled **/ static uint8_t InitialEnableControls(HWND hDlg, const int *idCtrl, int countCtrl, uint8_t bEnabled) { HWND hCtrl; while (countCtrl-- > 0) { hCtrl = GetDlgItem(hDlg, idCtrl[countCtrl]); EnableWindow(hCtrl, IsWindowEnabled(hCtrl) && bEnabled); } return bEnabled; } /** * This function enables a list of dialog items. * * @param hWnd - the dialog's window handle * @param idCtrl - the array of dialog items' identifiers * @param countCtrl - the number of items in the array of dialog items * @param bEnabled - TRUE if the item should be enabled, FALSE if disabled * * @return bEnabled **/ static uint8_t EnableControls(HWND hDlg, const int *idCtrl, int countCtrl, uint8_t bEnabled) { while (countCtrl-- > 0) EnableDlgItem(hDlg, idCtrl[countCtrl], bEnabled); return bEnabled; } /** * This function checks an dialog button according to the value, read from the database * * @param hWnd - the dialog's window handle * @param idCtrl - the dialog item's identifier * @param pszSetting - the setting from the database to use * @param bDefault - the default value to use, if no database setting exists * * @return This function returns the value from database or the default value. **/ static uint8_t DBGetCheckBtn(HWND hDlg, const int idCtrl, LPCSTR pszSetting, uint8_t bDefault) { uint8_t val = (g_plugin.getByte(pszSetting, bDefault) & 1) == 1; CheckDlgButton(hDlg, idCtrl, val ? BST_CHECKED : BST_UNCHECKED); return val; } /** * This function writes a byte (flag = 1) to database according to the checkstate * of the dialog button identified by 'idCtrl'. * * @param hWnd - the dialog's window handle * @param idCtrl - the dialog item's identifier * @param pszSetting - the setting to write the button state to * * @return checkstate **/ static uint8_t DBWriteCheckBtn(HWND hDlg, const int idCtrl, LPCSTR pszSetting) { uint8_t val = IsDlgButtonChecked(hDlg, idCtrl); int Temp = g_plugin.getByte(pszSetting, 0); Temp &= ~1; g_plugin.setByte(pszSetting, Temp |= val); return val; } /** * This function reads a uint32_t from database and interprets it as an color value * to set to the color control. * * @param hWnd - the dialog's window handle * @param idCtrl - the dialog item's identifier * @param pszSetting - the setting from the database to use * @param bDefault - the default value to use, if no database setting exists * * @return nothing **/ static void DBGetColor(HWND hDlg, const int idCtrl, LPCSTR pszSetting, uint32_t bDefault) { SendDlgItemMessage(hDlg, idCtrl, CPM_SETCOLOUR, 0, g_plugin.getDword(pszSetting, bDefault)); } /** * This function writes a uint32_t to database according to the value * of the color control identified by 'idCtrl'. * * @param hWnd - the dialog's window handle * @param idCtrl - the dialog item's identifier * @param pszSetting - the setting to write the button state to * * @return nothing **/ static void DBWriteColor(HWND hDlg, const int idCtrl, LPCSTR pszSetting) { g_plugin.setDword(pszSetting, (uint32_t)SendDlgItemMessage(hDlg, idCtrl, CPM_GETCOLOUR, 0, 0)); } ///////////////////////////////////////////////////////////////////////////////////////// // Common options dialog static INT_PTR CALLBACK DlgProc_CommonOpts(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static uint8_t bInitialized = 0; switch (uMsg) { case WM_INITDIALOG: TranslateDialogDefault(hDlg); bInitialized = 0; // menu item settings for (auto &it : ctrl_Menu) { int flag = g_plugin.getByte(it.pszKey, 2); // check button and enable / disable control int idEnable[] = { it.idCheckbox + 1, it.idNONE, it.idALL, it.idEXIMPORT }; EnableControls(hDlg, idEnable, _countof(idEnable), DBGetCheckBtn(hDlg, it.idCheckbox, it.pszKey, 0)); // set radio button state int id = it.idNONE; //default if ((flag & 4) == 4) id = it.idALL; else if ((flag & 8) == 8) id = it.idEXIMPORT; CheckRadioButton(hDlg, it.idNONE, it.idEXIMPORT, id); } // extra icon settings CheckDlgButton(hDlg, CHECK_OPT_FLAGSUNKNOWN, g_bUseUnknownFlag ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hDlg, CHECK_OPT_FLAGSMSGSTATUS, g_bShowStatusIconFlag ? BST_CHECKED : BST_UNCHECKED); bInitialized = 1; return TRUE; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: // menu item settings for (auto &it : ctrl_Menu) { int flag = IsDlgButtonChecked(hDlg, it.idCheckbox); flag |= IsDlgButtonChecked(hDlg, it.idNONE) ? 2 : 0; flag |= IsDlgButtonChecked(hDlg, it.idALL) ? 4 : 0; flag |= IsDlgButtonChecked(hDlg, it.idEXIMPORT) ? 8 : 0; g_plugin.setByte(it.pszKey, (uint8_t)flag); } RebuildMenu(); // extra icon settings bool FlagsClistChange = false, FlagsMsgWndChange = false; bool valNew = IsDlgButtonChecked(hDlg, CHECK_OPT_FLAGSUNKNOWN) != 0; if (g_bUseUnknownFlag != valNew) { g_bUseUnknownFlag = valNew; db_set_b(0, MODNAMEFLAGS, "UseUnknownFlag", valNew); FlagsClistChange = true; FlagsMsgWndChange = true; } valNew = IsDlgButtonChecked(hDlg, CHECK_OPT_FLAGSMSGSTATUS) != 0; if (g_bShowStatusIconFlag != valNew) { g_bShowStatusIconFlag = valNew; db_set_b(0, MODNAMEFLAGS, "ShowStatusIconFlag", valNew); FlagsMsgWndChange = true; } if (FlagsClistChange) ExtraIcon_SetAll(); if (FlagsMsgWndChange) UpdateStatusIcons(); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case CHECK_OPT_MI_MAIN: case CHECK_OPT_MI_CONTACT: case CHECK_OPT_MI_GROUP: case CHECK_OPT_MI_SUBGROUP: case CHECK_OPT_MI_ACCOUNT: for (auto &it : ctrl_Menu) { if (it.idCheckbox == LOWORD(wParam)) { const int idMenuItems[] = { it.idCheckbox + 1, it.idNONE, it.idALL, it.idEXIMPORT }; EnableControls(hDlg, idMenuItems, _countof(idMenuItems), Button_GetCheck((HWND)lParam)); break; } } if (bInitialized) NotifyParentOfChange(hDlg); break; case RADIO_OPT_MI_MAIN_ALL: case RADIO_OPT_MI_MAIN_NONE: case RADIO_OPT_MI_MAIN_EXIMPORT: case RADIO_OPT_MI_CONTACT_ALL: case RADIO_OPT_MI_CONTACT_NONE: case RADIO_OPT_MI_CONTACT_EXIMPORT: case RADIO_OPT_MI_GROUP_ALL: case RADIO_OPT_MI_GROUP_NONE: case RADIO_OPT_MI_GROUP_EXIMPORT: case RADIO_OPT_MI_SUBGROUP_ALL: case RADIO_OPT_MI_SUBGROUP_NONE: case RADIO_OPT_MI_SUBGROUP_EXIMPORT: case RADIO_OPT_MI_ACCOUNT_ALL: case RADIO_OPT_MI_ACCOUNT_NONE: case RADIO_OPT_MI_ACCOUNT_EXIMPORT: case CHECK_OPT_FLAGSUNKNOWN: case CHECK_OPT_FLAGSMSGSTATUS: if (bInitialized) NotifyParentOfChange(hDlg); } } return FALSE; } ///////////////////////////////////////////////////////////////////////////////////////// // Advanced options dialog static INT_PTR CALLBACK DlgProc_AdvancedOpts(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static uint8_t bInitialized = 0; switch (uMsg) { case WM_INITDIALOG: TranslateDialogDefault(hDlg); bInitialized = 0; DBGetCheckBtn(hDlg, CHECK_OPT_ICOVERSION, SET_ICONS_CHECKFILEVERSION, TRUE); DBGetCheckBtn(hDlg, CHECK_OPT_BUTTONICONS, SET_ICONS_BUTTONS, TRUE); DBGetCheckBtn(hDlg, CHECK_OPT_METASCAN, SET_META_SCAN, TRUE); DBGetCheckBtn(hDlg, CHECK_OPT_SREMAIL_ENABLED, SET_EXTENDED_EMAILSERVICE, TRUE); CheckDlgButton(hDlg, CHECK_OPT_AUTOTIMEZONE, BST_CHECKED); EnableWindow(GetDlgItem(hDlg, CHECK_OPT_AUTOTIMEZONE), FALSE); bInitialized = 1; return TRUE; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: DBWriteCheckBtn(hDlg, CHECK_OPT_ICOVERSION, SET_ICONS_CHECKFILEVERSION); DBWriteCheckBtn(hDlg, CHECK_OPT_BUTTONICONS, SET_ICONS_BUTTONS); DBWriteCheckBtn(hDlg, CHECK_OPT_METASCAN, SET_META_SCAN); DBWriteCheckBtn(hDlg, CHECK_OPT_SREMAIL_ENABLED, SET_EXTENDED_EMAILSERVICE); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case CHECK_OPT_ICOVERSION: case CHECK_OPT_BUTTONICONS: case CHECK_OPT_METASCAN: case CHECK_OPT_SREMAIL_ENABLED: case CHECK_OPT_AUTOTIMEZONE: if (bInitialized) NotifyParentOfChange(hDlg); break; case BTN_OPT_RESET: uint8_t WantReset = MsgBox(hDlg, MB_ICON_WARNING | MB_YESNO, LPGENW("Question"), LPGENW("Reset factory defaults"), LPGENW("This will delete all settings, you've made!\nAll TreeView settings, window positions and any other settings!\n\nAre you sure to proceed?")); if (WantReset) { DB::CEnumList Settings; // delete all skin icons if (!Settings.EnumSettings(NULL, "SkinIcons")) for (auto &s : Settings) if (mir_strncmpi(s, "UserInfoEx", 10) == 0) db_unset(0, "SkinIcons", s); // delete global settings db_delete_module(NULL, USERINFO"Ex"); db_delete_module(NULL, USERINFO"ExW"); // delete old contactsettings for (auto &hContact : Contacts()) { db_unset(hContact, USERINFO, "PListColWidth0"); db_unset(hContact, USERINFO, "PListColWidth1"); db_unset(hContact, USERINFO, "PListColWidth2"); db_unset(hContact, USERINFO, "EMListColWidth0"); db_unset(hContact, USERINFO, "EMListColWidth1"); db_unset(hContact, USERINFO, "BirthRemind"); db_unset(hContact, USERINFO, "RemindBirthday"); db_unset(hContact, USERINFO, "RemindDaysErlier"); db_unset(hContact, USERINFO, "vCardPath"); db_delete_module(hContact, USERINFO"Ex"); db_delete_module(hContact, USERINFO"ExW"); } SendMessage(GetParent(hDlg), PSM_FORCECHANGED, NULL, NULL); MsgBox(hDlg, MB_ICON_INFO, LPGENW("Ready"), LPGENW("Everything is done!"), LPGENW("All settings are reset to default values now!")); } } } return FALSE; } ///////////////////////////////////////////////////////////////////////////////////////// // Details options dialog static INT_PTR CALLBACK DlgProc_DetailsDlgOpts(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static uint8_t bInitialized = 0; switch (uMsg) { case WM_INITDIALOG: TranslateDialogDefault(hDlg); bInitialized = 0; // init colors DBGetCheckBtn(hDlg, CHECK_OPT_CLR, SET_PROPSHEET_SHOWCOLOURS, TRUE); SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(CHECK_OPT_CLR, BN_CLICKED), (LPARAM)GetDlgItem(hDlg, CHECK_OPT_CLR)); DBGetColor(hDlg, CLR_NORMAL, SET_PROPSHEET_CLRNORMAL, RGB(90, 90, 90)); DBGetColor(hDlg, CLR_USER, SET_PROPSHEET_CLRCUSTOM, RGB(0, 10, 130)); DBGetColor(hDlg, CLR_BOTH, SET_PROPSHEET_CLRBOTH, RGB(0, 160, 10)); DBGetColor(hDlg, CLR_CHANGED, SET_PROPSHEET_CLRCHANGED, RGB(190, 0, 0)); DBGetColor(hDlg, CLR_META, SET_PROPSHEET_CLRMETA, RGB(120, 40, 130)); // treeview options DBGetCheckBtn(hDlg, CHECK_OPT_GROUPS, SET_PROPSHEET_GROUPS, TRUE); DBGetCheckBtn(hDlg, CHECK_OPT_SORTTREE, SET_PROPSHEET_SORTITEMS, FALSE); DBGetCheckBtn(hDlg, CHECK_OPT_AEROADAPTION, SET_PROPSHEET_AEROADAPTION, TRUE); // common options DBGetCheckBtn(hDlg, CHECK_OPT_READONLY, SET_PROPSHEET_PCBIREADONLY, FALSE); DBGetCheckBtn(hDlg, CHECK_OPT_CHANGEMYDETAILS, SET_PROPSHEET_CHANGEMYDETAILS, FALSE); Button_Enable(GetDlgItem(hDlg, CHECK_OPT_CHANGEMYDETAILS), myGlobals.CanChangeDetails); bInitialized = 1; return TRUE; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: DBWriteCheckBtn(hDlg, CHECK_OPT_CLR, SET_PROPSHEET_SHOWCOLOURS); DBWriteCheckBtn(hDlg, CHECK_OPT_GROUPS, SET_PROPSHEET_GROUPS); DBWriteCheckBtn(hDlg, CHECK_OPT_SORTTREE, SET_PROPSHEET_SORTITEMS); DBWriteCheckBtn(hDlg, CHECK_OPT_READONLY, SET_PROPSHEET_PCBIREADONLY); DBWriteCheckBtn(hDlg, CHECK_OPT_AEROADAPTION, SET_PROPSHEET_AEROADAPTION); DBWriteCheckBtn(hDlg, CHECK_OPT_CHANGEMYDETAILS, SET_PROPSHEET_CHANGEMYDETAILS); DBWriteColor(hDlg, CLR_NORMAL, SET_PROPSHEET_CLRNORMAL); DBWriteColor(hDlg, CLR_USER, SET_PROPSHEET_CLRCUSTOM); DBWriteColor(hDlg, CLR_BOTH, SET_PROPSHEET_CLRBOTH); DBWriteColor(hDlg, CLR_CHANGED, SET_PROPSHEET_CLRCHANGED); DBWriteColor(hDlg, CLR_META, SET_PROPSHEET_CLRMETA); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case CHECK_OPT_CLR: if (HIWORD(wParam) == BN_CLICKED) { BOOL bChecked = SendMessage((HWND)lParam, BM_GETCHECK, NULL, NULL); const int idCtrl[] = { CLR_NORMAL, CLR_USER, CLR_BOTH, CLR_CHANGED, CLR_META, TXT_OPT_CLR_NORMAL, TXT_OPT_CLR_USER, TXT_OPT_CLR_BOTH, TXT_OPT_CLR_CHANGED, TXT_OPT_CLR_META }; EnableControls(hDlg, idCtrl, _countof(idCtrl), bChecked); } __fallthrough; case CHECK_OPT_GROUPS: case CHECK_OPT_SORTTREE: case CHECK_OPT_AEROADAPTION: case CHECK_OPT_READONLY: case CHECK_OPT_CHANGEMYDETAILS: case CHECK_OPT_MI_CONTACT: if (bInitialized && HIWORD(wParam) == BN_CLICKED) NotifyParentOfChange(hDlg); break; default: if (bInitialized && HIWORD(wParam) == CPN_COLOURCHANGED) NotifyParentOfChange(hDlg); } } return FALSE; } ///////////////////////////////////////////////////////////////////////////////////////// // Reminder options dialog class CReminderOptsDlg : public CDlgBase { CCtrlSpin spin1, spin2, spinOffset; CCtrlCheck chkVisible, chkFlash, chkStartup, chkMenu; CCtrlCombo cmbEnabled; public: CReminderOptsDlg() : CDlgBase(g_plugin, IDD_OPT_REMINDER), cmbEnabled(this, EDIT_REMIND_ENABLED), chkMenu(this, CHECK_REMIND_MI), chkFlash(this, CHECK_REMIND_FLASHICON), chkStartup(this, CHECK_REMIND_STARTUP), chkVisible(this, CHECK_REMIND_VISIBLEONLY), spin1(this, SPIN_REMIND, 50), spin2(this, SPIN_REMIND2, 8760, 1), spinOffset(this, SPIN_REMIND_SOUNDOFFSET, 50) { CreateLink(chkMenu, g_plugin.bRemindMenuEnabled); CreateLink(chkFlash, g_plugin.bRemindFlashIcon); CreateLink(chkStartup, g_plugin.bRemindStartupCheck); CreateLink(chkVisible, g_plugin.bRemindCheckVisible); CreateLink(spin1, g_plugin.wRemindOffset); CreateLink(spin1, g_plugin.wRemindNotifyInterval); CreateLink(spinOffset, g_plugin.wRemindSoundOffset); cmbEnabled.OnSelChanged = Callback(this, &CReminderOptsDlg::onChange_Enabled); } bool OnInitDialog() override { SendDlgItemMessage(m_hwnd, ICO_BIRTHDAY, STM_SETIMAGE, IMAGE_ICON, (LPARAM)g_plugin.getIcon(IDI_ANNIVERSARY, true)); // set colours cmbEnabled.AddString(TranslateT("Reminder disabled")); cmbEnabled.AddString(TranslateT("Birthdays only")); cmbEnabled.AddString(TranslateT("Anniversaries only")); cmbEnabled.AddString(TranslateT("Everything")); // set reminder options cmbEnabled.SetCurSel(g_plugin.iRemindState); MTime mtLast; wchar_t szTime[MAX_PATH]; mtLast.DBGetStamp(0, MODULENAME, SET_REMIND_LASTCHECK); mtLast.UTCToLocal(); mtLast.TimeFormat(szTime, _countof(szTime)); SetDlgItemText(m_hwnd, TXT_REMIND_LASTCHECK, szTime); return true; } bool OnApply() override { // update current reminder state uint8_t bNewVal = (uint8_t)cmbEnabled.GetCurSel(); if (g_plugin.iRemindState != bNewVal) { g_plugin.iRemindState = bNewVal; if (bNewVal == REMIND_OFF) SvcReminderEnable(false); else { // update all contact list extra icons SvcReminderEnable(true); // reinit reminder options from db SvcReminderCheckAll(NOTIFY_CLIST); // notify } } RebuildMain(); return true; } void onChange_Enabled(CCtrlCombo *pCombo) { const int idCtrl[] = { CHECK_REMIND_MI, EDIT_REMIND, EDIT_REMIND2, SPIN_REMIND, SPIN_REMIND2, TXT_REMIND, TXT_REMIND2, TXT_REMIND3, TXT_REMIND4, TXT_REMIND6, TXT_REMIND8, TXT_REMIND9, TXT_REMIND_LASTCHECK, CHECK_REMIND_FLASHICON, CHECK_REMIND_VISIBLEONLY, CHECK_REMIND_STARTUP, EDIT_REMIND_SOUNDOFFSET, SPIN_REMIND_SOUNDOFFSET }; EnableControls(m_hwnd, idCtrl, _countof(idCtrl), pCombo->GetCurSel() > 0); } }; ///////////////////////////////////////////////////////////////////////////////////////// // Popup options dialog class CPopupOptsDlg : public CDlgBase { CCtrlCheck chkEnabled, chkMsgbox, chkDefClr, chkWinClr, chkADefClr, chkAWinClr, chkProgress; CCtrlCheck chkDefault, chkCustom, chkPermanent; CCtrlColor clrAback, clrAtext, clrBback, clrBtext; CCtrlButton btnPreview; public: CPopupOptsDlg() : CDlgBase(g_plugin, IDD_OPT_POPUP), btnPreview(this, BTN_PREVIEW), chkDefClr(this, CHECK_OPT_POPUP_DEFCLR), chkWinClr(this, CHECK_OPT_POPUP_WINCLR), chkADefClr(this, CHECK_OPT_POPUP_ADEFCLR), chkAWinClr(this, CHECK_OPT_POPUP_AWINCLR), chkEnabled(this, CHECK_OPT_POPUP_ENABLED), chkMsgbox(this, CHECK_OPT_POPUP_MSGBOX), chkProgress(this, CHECK_OPT_POPUP_PROGRESS), chkCustom(this, RADIO_OPT_POPUP_CUSTOM), chkDefault(this, RADIO_OPT_POPUP_DEFAULT), chkPermanent(this, RADIO_OPT_POPUP_PERMANENT), clrAback(this, CLR_ABACK), clrAtext(this, CLR_ATEXT), clrBback(this, CLR_BBACK), clrBtext(this, CLR_BTEXT) { CreateLink(chkMsgbox, g_plugin.bPopupMsgbox); CreateLink(chkEnabled, g_plugin.bPopupEnabled); CreateLink(chkProgress, g_plugin.bPopupProgress); CreateLink(clrAback, g_plugin.clrAback); CreateLink(clrAtext, g_plugin.clrAtext); CreateLink(clrBback, g_plugin.clrBback); CreateLink(clrBtext, g_plugin.clrBtext); btnPreview.OnClick = Callback(this, &CPopupOptsDlg::onClick_Preview); chkEnabled.OnChange = Callback(this, &CPopupOptsDlg::onChange_Enabled); chkDefClr.OnChange = chkWinClr.OnChange = Callback(this, &CPopupOptsDlg::onChange_Clr); chkADefClr.OnChange = chkAWinClr.OnChange = Callback(this, &CPopupOptsDlg::onChange_AnnivClr); chkDefault.OnChange = chkCustom.OnChange = chkPermanent.OnChange = Callback(this, &CPopupOptsDlg::onChange_Delay); } bool OnInitDialog() override { // disable if popup plugin dos not sopport buttons inside popop if (!(db_get_dw(0, "Popup", "Actions", 0) & 1)) EnableDlgItem(m_hwnd, CHECK_OPT_POPUP_MSGBOX, FALSE); // set colortype checkboxes and color controls switch (g_plugin.iBirthClrType) { case POPUP_COLOR_DEFAULT: chkDefClr.SetState(true); break; case POPUP_COLOR_WINDOWS: chkWinClr.SetState(true); } switch (g_plugin.iAnnivClrType) { case POPUP_COLOR_DEFAULT: chkADefClr.SetState(true); break; case POPUP_COLOR_WINDOWS: chkAWinClr.SetState(true); } // set delay values uint8_t bDelay = g_plugin.iPopupDelay; switch (bDelay) { case 0: chkDefault.SetState(true); break; case 255: chkPermanent.SetState(true); break; default: chkCustom.SetState(true); SetDlgItemInt(m_hwnd, EDIT_DELAY, bDelay, FALSE); } return true; } bool OnApply() override { // save popup style for birthdays g_plugin.iBirthClrType = chkDefClr.IsChecked() ? POPUP_COLOR_DEFAULT : (chkWinClr.IsChecked() ? POPUP_COLOR_WINDOWS : POPUP_COLOR_CUSTOM); // save popup style for anniversaries g_plugin.iAnnivClrType = chkADefClr.IsChecked() ? POPUP_COLOR_DEFAULT : (chkAWinClr.IsChecked() ? POPUP_COLOR_WINDOWS : POPUP_COLOR_CUSTOM); // save delay if (chkPermanent.IsChecked()) g_plugin.iPopupDelay = 255; else if (chkCustom.IsChecked()) { wchar_t szDelay[4]; GetDlgItemText(m_hwnd, EDIT_DELAY, szDelay, _countof(szDelay)); g_plugin.iPopupDelay = (uint8_t)wcstol(szDelay, nullptr, 10); } else g_plugin.iPopupDelay.Delete(); return true; } void onClick_Preview(CCtrlButton*) { POPUPDATAW ppd = {}; ppd.iSeconds = g_plugin.iPopupDelay; mir_wstrncpy(ppd.lpwzText, TranslateT("This is the reminder message"), MAX_SECONDLINE); // Birthday mir_wstrncpy(ppd.lpwzContactName, TranslateT("Birthday"), _countof(ppd.lpwzContactName)); ppd.lchIcon = g_plugin.getIcon(IDI_RMD_DTB0); if (chkWinClr.IsChecked()) { ppd.colorBack = GetSysColor(COLOR_BTNFACE); ppd.colorText = GetSysColor(COLOR_WINDOWTEXT); } else if (!chkDefClr.IsChecked()) { ppd.colorBack = clrBback.GetColor(); ppd.colorText = clrBtext.GetColor(); } PUAddPopupW(&ppd); // Anniversary mir_wstrncpy(ppd.lpwzContactName, TranslateT("Anniversary"), _countof(ppd.lpwzContactName)); ppd.lchIcon = g_plugin.getIcon(IDI_RMD_DTAX); if (chkAWinClr.IsChecked()) { ppd.colorBack = GetSysColor(COLOR_BTNFACE); ppd.colorText = GetSysColor(COLOR_WINDOWTEXT); } else if (!chkDefClr.IsChecked()) { ppd.colorBack = clrAback.GetColor(); ppd.colorText = clrAtext.GetColor(); } PUAddPopupW(&ppd); } void onChange_Enabled(CCtrlCheck *pCheck) { const int idCtrl[] = { CHECK_OPT_POPUP_DEFCLR, CHECK_OPT_POPUP_WINCLR, CLR_BBACK, TXT_OPT_POPUP_CLR_BACK, CLR_BTEXT, TXT_OPT_POPUP_CLR_TEXT, CHECK_OPT_POPUP_ADEFCLR, CHECK_OPT_POPUP_AWINCLR, CLR_ABACK, TXT_OPT_POPUP_CLR_ABACK, CLR_ATEXT, TXT_OPT_POPUP_CLR_ATEXT, RADIO_OPT_POPUP_DEFAULT, RADIO_OPT_POPUP_CUSTOM, RADIO_OPT_POPUP_PERMANENT, EDIT_DELAY }; EnableControls(m_hwnd, idCtrl, _countof(idCtrl), pCheck->GetState()); } void onChange_Clr(CCtrlCheck *) { bool bDefClr = chkDefClr.IsChecked(); bool bWinClr = chkWinClr.IsChecked(); chkDefClr.Enable(!bWinClr); chkWinClr.Enable(!bDefClr); clrBback.Enable(!bDefClr && !bWinClr); clrBtext.Enable(!bDefClr && !bWinClr); EnableDlgItem(m_hwnd, TXT_OPT_POPUP_CLR_BACK, !(bDefClr || bWinClr)); EnableDlgItem(m_hwnd, TXT_OPT_POPUP_CLR_TEXT, !(bDefClr || bWinClr)); } void onChange_AnnivClr(CCtrlCheck *) { int bDefClr = chkADefClr.IsChecked(); int bWinClr = chkAWinClr.IsChecked(); chkADefClr.Enable(!bWinClr); chkAWinClr.Enable(!bDefClr); clrAback.Enable(!bDefClr && !bWinClr); clrAtext.Enable(!bDefClr && !bWinClr); EnableDlgItem(m_hwnd, TXT_OPT_POPUP_CLR_ABACK, !(bDefClr || bWinClr)); EnableDlgItem(m_hwnd, TXT_OPT_POPUP_CLR_ATEXT, !(bDefClr || bWinClr)); } void onChange_Delay(CCtrlCheck *) { EnableDlgItem(m_hwnd, EDIT_DELAY, chkCustom.IsChecked()); } }; /** * This hook handler function is called on opening the options dialog * to tell miranda, which pages userinfoex wants to add. * * @param wParam - options dialog's internal datastructure, * @param lParam - not used * * @retval MIR_OK **/ int OnInitOptions(WPARAM wParam, LPARAM) { DlgContactInfoInitTreeIcons(); OPTIONSDIALOGPAGE odp = {}; odp.position = 95400; odp.flags = ODPF_BOLDGROUPS; odp.szTitle.a = MODULELONGNAME; odp.szGroup.a = LPGEN("Contacts"); // Common page odp.szTab.a = LPGEN("Common"); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_COMMON); odp.pfnDlgProc = DlgProc_CommonOpts; g_plugin.addOptions(wParam, &odp); // Advanced page odp.szTab.a = LPGEN("Advanced"); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_ADVANCED); odp.pfnDlgProc = DlgProc_AdvancedOpts; g_plugin.addOptions(wParam, &odp); // Details Dialog page odp.szTab.a = LPGEN("Details dialog"); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_DETAILSDLG); odp.pfnDlgProc = DlgProc_DetailsDlgOpts; g_plugin.addOptions(wParam, &odp); // Reminder page odp.szTab.a = LPGEN("Reminder"); odp.pszTemplate = 0; odp.pfnDlgProc = 0; odp.pDialog = new CReminderOptsDlg(); g_plugin.addOptions(wParam, &odp); // Popups page odp.szTitle.a = MODULELONGNAME; odp.szGroup.a = LPGEN("Popups"); odp.pDialog = new CPopupOptsDlg(); g_plugin.addOptions(wParam, &odp); return MIR_OK; }