summaryrefslogtreecommitdiff
path: root/plugins/WhenWasIt/src/options.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/WhenWasIt/src/options.cpp')
-rw-r--r--plugins/WhenWasIt/src/options.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/plugins/WhenWasIt/src/options.cpp b/plugins/WhenWasIt/src/options.cpp
new file mode 100644
index 0000000000..ca7c2e5759
--- /dev/null
+++ b/plugins/WhenWasIt/src/options.cpp
@@ -0,0 +1,270 @@
+/*
+WhenWasIt (birthday reminder) plugin for Miranda IM
+
+Copyright © 2006 Cristian Libotean
+
+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"
+
+const wchar_t* szShowAgeMode[] = { LPGENW("Upcoming age"), LPGENW("Current age") };
+
+const wchar_t* szSaveModule[] = { LPGENW("UserInfo module"), LPGENW("Protocol module") };
+
+const wchar_t* szPopupClick[] = { LPGENW("Nothing"), LPGENW("Dismiss"), LPGENW("Message window") };
+
+const wchar_t* szNotifyFor[] = { LPGENW("All contacts"), LPGENW("All contacts except hidden ones"), LPGENW("All contacts except ignored ones"), LPGENW("All contacts except hidden and ignored ones") };
+
+static SIZE GetControlTextSize(HWND hCtrl)
+{
+ HDC hDC = GetDC(hCtrl);
+ HFONT font = (HFONT)SendMessage(hCtrl, WM_GETFONT, 0, 0);
+ HFONT oldFont = (HFONT)SelectObject(hDC, font);
+ const size_t maxSize = 2048;
+ wchar_t buffer[maxSize];
+ SIZE size;
+ GetWindowText(hCtrl, buffer, _countof(buffer));
+ GetTextExtentPoint32(hDC, buffer, (int)mir_wstrlen(buffer), &size);
+ SelectObject(hDC, oldFont);
+ ReleaseDC(hCtrl, hDC);
+ return size;
+}
+
+static int EnlargeControl(HWND hCtrl, HWND, SIZE oldSize)
+{
+ SIZE size = GetControlTextSize(hCtrl);
+ RECT rect;
+ GetWindowRect(hCtrl, &rect);
+ int offset = (rect.right - rect.left) - oldSize.cx;
+ SetWindowPos(hCtrl, HWND_TOP, 0, 0, size.cx + offset, oldSize.cy, SWP_NOMOVE);
+ SetWindowPos(hCtrl, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
+ return 0;
+}
+
+static wchar_t* strtrim(wchar_t *str)
+{
+ size_t i = 0;
+ size_t len = mir_wstrlen(str);
+ while ((i < len) && (str[i] == ' ')) { i++; }
+ if (i) {
+ memmove(str, str + i, len - i + 1);
+ len -= i;
+ }
+
+ while ((len > 0) && (str[--len] == ' '))
+ str[len] = 0;
+
+ return str;
+}
+
+class COptionsDlg : public CDlgBase
+{
+ CCtrlButton btnPreview;
+ CCtrlCheck chkPopups, chkClistIcon, chkDialog, chkOncePerDay;
+ CCtrlCombo cmbModule, cmbAge, cmbLClick, cmbRClick, cmbNotify;
+ CCtrlColor clrFore, clrBack;
+
+public:
+ COptionsDlg() :
+ CDlgBase(g_plugin, IDD_OPT_WWI),
+ btnPreview(this, IDC_PREVIEW),
+ clrFore(this, IDC_FOREGROUND),
+ clrBack(this, IDC_BACKGROUND),
+ cmbAge(this, IDC_AGE_COMBOBOX),
+ cmbModule(this, IDC_DEFAULT_MODULE),
+ cmbNotify(this, IDC_NOTIFYFOR),
+ cmbLClick(this, IDC_LEFT_CLICK),
+ cmbRClick(this, IDC_RIGHT_CLICK),
+ chkPopups(this, IDC_USE_POPUPS),
+ chkDialog(this, IDC_USE_DIALOG),
+ chkClistIcon(this, IDC_USE_CLISTICON),
+ chkOncePerDay(this, IDC_ONCE_PER_DAY)
+ {
+ CreateLink(clrFore, g_plugin.foreground);
+ CreateLink(clrBack, g_plugin.background);
+
+ btnPreview.OnClick = Callback(this, &COptionsDlg::onClick_Preview);
+
+ chkPopups.OnChange = Callback(this, &COptionsDlg::onChange_Popups);
+ chkDialog.OnChange = Callback(this, &COptionsDlg::onChange_Dialog);
+ chkClistIcon.OnChange = Callback(this, &COptionsDlg::onChange_ClistIcon);
+ chkOncePerDay.OnChange = Callback(this, &COptionsDlg::onChange_OncePerDay);
+ }
+
+ bool OnInitDialog() override
+ {
+ SIZE oldPopupsSize = GetControlTextSize(chkPopups.GetHwnd());
+ SIZE oldClistIconSize = GetControlTextSize(chkClistIcon.GetHwnd());
+ SIZE oldDialogSize = GetControlTextSize(GetDlgItem(m_hwnd, IDC_USE_DIALOG));
+
+ EnlargeControl(chkPopups.GetHwnd(), GetDlgItem(m_hwnd, IDC_POPUPS_STATIC), oldPopupsSize);
+ EnlargeControl(chkClistIcon.GetHwnd(), GetDlgItem(m_hwnd, IDC_CLIST_STATIC), oldClistIconSize);
+ EnlargeControl(GetDlgItem(m_hwnd, IDC_USE_DIALOG), GetDlgItem(m_hwnd, IDC_DIALOG_STATIC), oldDialogSize);
+
+ for (auto &it : szShowAgeMode)
+ cmbAge.AddString(TranslateW(it));
+
+ for (auto &it : szSaveModule)
+ cmbModule.AddString(TranslateW(it));
+
+ for (auto &it : szPopupClick) {
+ cmbLClick.AddString(TranslateW(it));
+ cmbRClick.AddString(TranslateW(it));
+ }
+
+ for (auto &it : szNotifyFor)
+ cmbNotify.AddString(TranslateW(it));
+
+ cmbModule.SetCurSel(g_plugin.cDefaultModule);
+ cmbLClick.SetCurSel(g_plugin.lPopupClick);
+ cmbRClick.SetCurSel(g_plugin.rPopupClick);
+ cmbNotify.SetCurSel(g_plugin.notifyFor);
+
+ CreateToolTip(GetDlgItem(m_hwnd, IDC_POPUP_TIMEOUT), TranslateT("Set popup delay when notifying of upcoming birthdays.\nFormat: default delay [ | delay for birthdays occurring today]"), 400);
+
+ wchar_t buffer[1024];
+ _itow(g_plugin.daysInAdvance, buffer, 10);
+ SetDlgItemText(m_hwnd, IDC_DAYS_IN_ADVANCE, buffer);
+ _itow(g_plugin.checkInterval, buffer, 10);
+ SetDlgItemText(m_hwnd, IDC_CHECK_INTERVAL, buffer);
+ mir_snwprintf(buffer, L"%d|%d", (int)g_plugin.popupTimeout, (int)g_plugin.popupTimeoutToday);
+ SetDlgItemText(m_hwnd, IDC_POPUP_TIMEOUT, buffer);
+ _itow(g_plugin.cSoundNearDays, buffer, 10);
+ SetDlgItemText(m_hwnd, IDC_SOUND_NEAR_DAYS_EDIT, buffer);
+ _itow(g_plugin.cDlgTimeout, buffer, 10);
+ SetDlgItemText(m_hwnd, IDC_DLG_TIMEOUT, buffer);
+ _itow(g_plugin.daysAfter, buffer, 10);
+ SetDlgItemText(m_hwnd, IDC_DAYS_AFTER, buffer);
+
+ CheckDlgButton(m_hwnd, IDC_OPENINBACKGROUND, (g_plugin.bOpenInBackground) ? BST_CHECKED : BST_UNCHECKED);
+
+ CheckDlgButton(m_hwnd, IDC_NOBIRTHDAYS_POPUP, (g_plugin.bNoBirthdaysPopup) ? BST_CHECKED : BST_UNCHECKED);
+ cmbAge.SetCurSel(g_plugin.cShowAgeMode);
+
+ CheckDlgButton(m_hwnd, IDC_IGNORE_SUBCONTACTS, (g_plugin.bIgnoreSubcontacts) ? BST_CHECKED : BST_UNCHECKED);
+
+ chkOncePerDay.SetState(g_plugin.bOncePerDay);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_CHECK_INTERVAL), !g_plugin.bOncePerDay);
+
+ CheckDlgButton(m_hwnd, IDC_USE_DIALOG, (g_plugin.bUseDialog) ? BST_CHECKED : BST_UNCHECKED);
+
+ chkPopups.SetState(g_plugin.bUsePopups);
+
+ chkClistIcon.SetState(true);
+ chkClistIcon.Disable();
+ return true;
+ }
+
+ bool OnApply() override
+ {
+ g_plugin.popupTimeout = POPUP_TIMEOUT;
+ g_plugin.popupTimeoutToday = POPUP_TIMEOUT;
+ g_plugin.bUsePopups = chkPopups.GetState();
+ g_plugin.bUseDialog = IsDlgButtonChecked(m_hwnd, IDC_USE_DIALOG);
+ g_plugin.bIgnoreSubcontacts = IsDlgButtonChecked(m_hwnd, IDC_IGNORE_SUBCONTACTS);
+ g_plugin.bNoBirthdaysPopup = IsDlgButtonChecked(m_hwnd, IDC_NOBIRTHDAYS_POPUP);
+ g_plugin.cDefaultModule = cmbModule.GetCurSel();
+ g_plugin.cShowAgeMode = cmbAge.GetCurSel();
+ g_plugin.lPopupClick = cmbLClick.GetCurSel();
+ g_plugin.rPopupClick = cmbRClick.GetCurSel();
+ g_plugin.notifyFor = cmbNotify.GetCurSel();
+ g_plugin.bOncePerDay = chkOncePerDay.GetState();
+ g_plugin.bOpenInBackground = IsDlgButtonChecked(m_hwnd, IDC_OPENINBACKGROUND);
+
+ g_plugin.daysInAdvance = GetDlgItemInt(m_hwnd, IDC_DAYS_IN_ADVANCE, 0, 0);
+ g_plugin.daysAfter = GetDlgItemInt(m_hwnd, IDC_DAYS_AFTER, 0, 0);
+ g_plugin.checkInterval = GetDlgItemInt(m_hwnd, IDC_CHECK_INTERVAL, 0, 0);
+ g_plugin.cSoundNearDays = GetDlgItemInt(m_hwnd, IDC_SOUND_NEAR_DAYS_EDIT, 0, 0);
+ g_plugin.cDlgTimeout = GetDlgItemInt(m_hwnd, IDC_DLG_TIMEOUT, 0, 0);
+
+ const int maxSize = 1024;
+ wchar_t buffer[maxSize];
+ GetDlgItemText(m_hwnd, IDC_POPUP_TIMEOUT, buffer, _countof(buffer));
+ wchar_t *pos = wcschr(buffer, '|');
+ if (pos) {
+ wchar_t tmp[128];
+ *pos = 0;
+ mir_wstrcpy(tmp, buffer);
+ strtrim(tmp);
+ g_plugin.popupTimeout = _wtol(tmp);
+
+ mir_wstrcpy(tmp, pos + 1);
+ strtrim(tmp);
+ g_plugin.popupTimeoutToday = _wtol(tmp);
+
+ }
+ else g_plugin.popupTimeout = g_plugin.popupTimeoutToday = _wtol(buffer);
+
+ RefreshAllContactListIcons();
+
+ UpdateTimers(); //interval might get changed
+ return true;
+ }
+
+ void onChange_Popups(CCtrlCheck *pCheck)
+ {
+ bool bEnable = pCheck->GetState();
+ EnableWindow(GetDlgItem(m_hwnd, IDC_POPUPS_STATIC), bEnable);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_POPUP_TIMEOUT), bEnable);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_NOBIRTHDAYS_POPUP), bEnable);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_IGNORE_SUBCONTACTS), bEnable);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_PREVIEW), bEnable);
+ clrFore.Enable(bEnable);
+ clrBack.Enable(bEnable);
+ cmbLClick.Enable(bEnable);
+ cmbRClick.Enable(bEnable);
+ }
+
+ void onChange_ClistIcon(CCtrlCheck *pCheck)
+ {
+ bool bEnable = pCheck->GetState();
+ EnableWindow(GetDlgItem(m_hwnd, IDC_CLIST_STATIC), bEnable);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_ADVANCED_ICON), bEnable);
+ }
+
+ void onChange_Dialog(CCtrlCheck *pCheck)
+ {
+ bool bEnable = pCheck->GetState();
+ EnableWindow(GetDlgItem(m_hwnd, IDC_DLG_TIMEOUT), bEnable);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_OPENINBACKGROUND), bEnable);
+ }
+
+ void onChange_OncePerDay(CCtrlCheck *pCheck)
+ {
+ bool bEnable = pCheck->GetState();
+ EnableWindow(GetDlgItem(m_hwnd, IDC_CHECK_INTERVAL), !bEnable);
+ }
+
+ void onClick_Preview(CCtrlButton *)
+ {
+ MCONTACT hContact = db_find_first();
+ int dtb = rand() % 11; //0..10
+ int age = rand() % 50 + 1; //1..50
+ PopupNotifyBirthday(hContact, dtb, age);
+ }
+};
+
+int OnOptionsInitialise(WPARAM wParam, LPARAM)
+{
+ OPTIONSDIALOGPAGE odp = {};
+ odp.flags = ODPF_BOLDGROUPS;
+ odp.position = 100000000;
+ odp.pDialog = new COptionsDlg();
+ odp.szTitle.a = LPGEN("Birthdays");
+ odp.szGroup.a = LPGEN("Contacts");
+ g_plugin.addOptions(wParam, &odp);
+ return 0;
+}