summaryrefslogtreecommitdiff
path: root/plugins/BuddyPounce/src/options.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/BuddyPounce/src/options.cpp')
-rw-r--r--plugins/BuddyPounce/src/options.cpp245
1 files changed, 245 insertions, 0 deletions
diff --git a/plugins/BuddyPounce/src/options.cpp b/plugins/BuddyPounce/src/options.cpp
new file mode 100644
index 0000000000..df13f1a05b
--- /dev/null
+++ b/plugins/BuddyPounce/src/options.cpp
@@ -0,0 +1,245 @@
+/*
+Copyright (C) 2012-21 Miranda NG team (https://miranda-ng.org)
+
+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 version 2
+of the License.
+
+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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "stdafx.h"
+
+COptionsDlg::COptionsDlg(int dlgId) :
+ CSuper(dlgId),
+ m_settings(this, IDC_SETTINGS),
+ spin(this, IDC_SPIN, 1024),
+ msg1(this, IDC_SETTINGMSG),
+ msg2(this, IDC_SETTINGMSG2),
+ edtNumber(this, IDC_SETTINGNUMBER),
+ chkAdvanced(this, IDC_USEADVANCED),
+ chkShowDelivery(this, IDC_SHOWDELIVERYMSGS)
+{
+ CreateLink(chkAdvanced, g_plugin.bUseAdvanced);
+ CreateLink(chkShowDelivery, g_plugin.bShowDelivery);
+
+ m_settings.OnSelChange = Callback(this, &COptionsDlg::onSelChange_Settings);
+}
+
+bool COptionsDlg::OnInitDialog()
+{
+ CSuper::OnInitDialog();
+
+ m_settings.AddString(TranslateT("Send If My Status Is..."));
+ m_settings.AddString(TranslateT("Send If They Change Status to..."));
+ m_settings.AddString(L"----------------------------");
+ m_settings.AddString(TranslateT("Reuse Pounce"));
+ m_settings.AddString(TranslateT("Give Up delay"));
+ m_settings.AddString(TranslateT("Confirmation Window"));
+ m_settings.SetCurSel(g_plugin.getByte(hContact, "LastSetting"));
+ onSelChange_Settings(0);
+ return true;
+}
+
+bool COptionsDlg::OnApply()
+{
+ CSuper::OnApply();
+
+ saveLastSetting();
+ return true;
+}
+
+void COptionsDlg::OnDestroy()
+{
+ if (SendIfMy)
+ DestroyWindow(SendIfMy);
+ if (SendWhenThey)
+ DestroyWindow(SendWhenThey);
+}
+
+void COptionsDlg::onSelChange_Settings(CCtrlListBox*)
+{
+ if (m_bInitialized)
+ saveLastSetting();
+
+ int item = m_settings.GetCurSel();
+ switch (item) {
+ case 0: // Send If My Status Is...
+ showAll(false);
+ if (m_bInitialized)
+ statusModes(true);
+ break;
+
+ case 1: // Send If They Change status to
+ showAll(false);
+ if (m_bInitialized)
+ statusModes(false);
+ break;
+
+ case 3: // Reuse Pounce
+ showAll(true);
+ msg1.SetText(TranslateT("Reuse this message? (0 to use it once)"));
+ msg2.SetText(TranslateT("Times"));
+ edtNumber.SetInt(g_plugin.getByte(hContact, "Reuse"));
+ break;
+
+ case 4: // Give Up delay
+ showAll(true);
+ msg1.SetText(TranslateT("Give up after... (0 to not give up)"));
+ msg2.SetText(TranslateT("Days"));
+ edtNumber.SetInt(g_plugin.getByte(hContact, "GiveUpDays"));
+ break;
+
+ case 5: // confirm window
+ showAll(true);
+ msg1.SetText(TranslateT("Show confirmation window? (0 to not Show)"));
+ msg2.SetText(TranslateT("Seconds to wait before sending"));
+ edtNumber.SetInt(g_plugin.getWord(hContact, "ConfirmTimeout"));
+ break;
+ }
+ g_plugin.setByte(hContact, "LastSetting", (BYTE)item);
+ NotifyChange();
+}
+
+void COptionsDlg::saveLastSetting()
+{
+ switch (g_plugin.getByte(hContact, "LastSetting", 2)) {
+ case 3: // Reuse Pounce
+ g_plugin.setByte(hContact, "Reuse", (BYTE)edtNumber.GetInt());
+ break;
+ case 4: // Give Up delay
+ g_plugin.setByte(hContact, "GiveUpDays", (BYTE)edtNumber.GetInt());
+ g_plugin.setDword(hContact, "GiveUpDate", (DWORD)edtNumber.GetInt() * SECONDSINADAY);
+ break;
+ case 5: // confirm window
+ g_plugin.setWord(hContact, "ConfirmTimeout", (WORD)edtNumber.GetInt());
+ break;
+ }
+}
+
+void COptionsDlg::showAll(bool bShow)
+{
+ msg1.Show(bShow);
+ msg2.Show(bShow);
+ spin.Show(bShow);
+ edtNumber.Show(bShow);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Status modes dialog wrapper
+
+class CStatusModesDlg : public CDlgBase
+{
+ COptionsDlg *pDlg;
+ bool isMe;
+
+ CCtrlCheck chk1, chk2, chk3, chk4, chk5, chk6, chk7, chk8;
+
+public:
+ CStatusModesDlg(COptionsDlg *_1, bool _2) :
+ CDlgBase(g_plugin, IDD_STATUSMODES),
+ pDlg(_1),
+ isMe(_2),
+ chk1(this, IDC_CHECK1),
+ chk2(this, IDC_CHECK2),
+ chk3(this, IDC_CHECK3),
+ chk4(this, IDC_CHECK4),
+ chk5(this, IDC_CHECK5),
+ chk6(this, IDC_CHECK6),
+ chk7(this, IDC_CHECK7),
+ chk8(this, IDC_CHECK8)
+ {
+ SetParent(pDlg->GetHwnd());
+ }
+
+ bool OnInitDialog() override
+ {
+ int statusFlag;
+
+ if (isMe) {
+ pDlg->SendIfMy = m_hwnd;
+ statusFlag = g_plugin.getWord(pDlg->hContact, "SendIfMyStatusIsFLAG", 0);
+ SetCaption(TranslateT("Send If My Status Is"));
+ chk1.SetText(TranslateT("Any"));
+ chk2.SetText(TranslateT("Online"));
+ chk3.SetText(TranslateT("Away"));
+ chk4.SetText(TranslateT("Not available"));
+ chk5.SetText(TranslateT("Occupied"));
+ chk6.SetText(TranslateT("Do not disturb"));
+ chk7.SetText(TranslateT("Free for chat"));
+ chk8.SetText(TranslateT("Invisible"));
+ }
+ else {
+ pDlg->SendWhenThey = m_hwnd;
+ statusFlag = g_plugin.getWord(pDlg->hContact, "SendIfTheirStatusIsFLAG", 0);
+ SetCaption(TranslateT("Send If Their Status changes"));
+ chk1.SetText(TranslateT("From Offline"));
+ chk2.SetText(TranslateT("To Online"));
+ chk3.SetText(TranslateT("To Away"));
+ chk4.SetText(TranslateT("To Not available"));
+ chk5.SetText(TranslateT("To Occupied"));
+ chk6.SetText(TranslateT("To Do not disturb"));
+ chk7.SetText(TranslateT("To Free for chat"));
+ chk8.SetText(TranslateT("To Invisible"));
+ }
+
+ chk1.SetState((statusFlag & ANY) != 0);
+ chk2.SetState((statusFlag & ONLINE) != 0);
+ chk3.SetState((statusFlag & AWAY) != 0);
+ chk4.SetState((statusFlag & NA) != 0);
+ chk5.SetState((statusFlag & OCCUPIED) != 0);
+ chk6.SetState((statusFlag & DND) != 0);
+ chk7.SetState((statusFlag & FFC) != 0);
+ chk8.SetState((statusFlag & INVISIBLE) != 0);
+ return true;
+ }
+
+ bool OnApply() override
+ {
+ int flag = chk1.GetState()
+ | (chk2.GetState() << 1)
+ | (chk3.GetState() << 2)
+ | (chk4.GetState() << 3)
+ | (chk5.GetState() << 4)
+ | (chk6.GetState() << 5)
+ | (chk7.GetState() << 6)
+ | (chk8.GetState() << 7);
+
+ if (isMe)
+ g_plugin.setWord(pDlg->hContact, "SendIfMyStatusIsFLAG", flag);
+ else
+ g_plugin.setWord(pDlg->hContact, "SendIfTheirStatusIsFLAG", flag);
+ return true;
+ }
+
+ void OnDestroy() override
+ {
+ if (isMe)
+ pDlg->SendIfMy = nullptr;
+ else
+ pDlg->SendWhenThey = nullptr;
+ }
+};
+
+void COptionsDlg::statusModes(bool isMe)
+{
+ if (isMe) {
+ if (SendIfMy)
+ SetForegroundWindow(SendIfMy);
+ else
+ (new CStatusModesDlg(this, true))->Create();
+ }
+ else {
+ if (SendWhenThey)
+ SetForegroundWindow(SendWhenThey);
+ else
+ (new CStatusModesDlg(this, false))->Create();
+ }
+}