diff options
Diffstat (limited to 'plugins/WhenWasIt/src/options.cpp')
-rw-r--r-- | plugins/WhenWasIt/src/options.cpp | 270 |
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; +} |