diff options
Diffstat (limited to 'protocols/JabberG/src/jabber_privacy.cpp')
-rw-r--r-- | protocols/JabberG/src/jabber_privacy.cpp | 2391 |
1 files changed, 1161 insertions, 1230 deletions
diff --git a/protocols/JabberG/src/jabber_privacy.cpp b/protocols/JabberG/src/jabber_privacy.cpp index 52eadfbe2f..35a8b3cbfd 100644 --- a/protocols/JabberG/src/jabber_privacy.cpp +++ b/protocols/JabberG/src/jabber_privacy.cpp @@ -402,6 +402,15 @@ public: return true;
}
+ void OnDestroy() override
+ {
+ IcoLib_ReleaseIcon((HICON)SendDlgItemMessage(m_hwnd, IDC_ICO_MESSAGE, STM_SETICON, 0, 0));
+ IcoLib_ReleaseIcon((HICON)SendDlgItemMessage(m_hwnd, IDC_ICO_QUERY, STM_SETICON, 0, 0));
+ IcoLib_ReleaseIcon((HICON)SendDlgItemMessage(m_hwnd, IDC_ICO_PRESENCEIN, STM_SETICON, 0, 0));
+ IcoLib_ReleaseIcon((HICON)SendDlgItemMessage(m_hwnd, IDC_ICO_PRESENCEOUT, STM_SETICON, 0, 0));
+ m_proto->m_hwndPrivacyRule = nullptr;
+ }
+
void cbType_OnChange(CCtrlData*)
{
if (!m_pRule) return;
@@ -481,7 +490,7 @@ public: }
}
- void btnOk_OnClick(CCtrlButton *)
+ void btnOk_OnClick(CCtrlButton*)
{
LRESULT nItemData = -1;
LRESULT nCurSel = SendDlgItemMessage(m_hwnd, IDC_COMBO_TYPE, CB_GETCURSEL, 0, 0);
@@ -532,93 +541,35 @@ public: EndDialog(m_hwnd, 1);
}
- void btnCancel_OnClick(CCtrlButton *)
+ void btnCancel_OnClick(CCtrlButton*)
{
EndDialog(m_hwnd, 0);
}
-
- void OnDestroy()
- {
- IcoLib_ReleaseIcon((HICON)SendDlgItemMessage(m_hwnd, IDC_ICO_MESSAGE, STM_SETICON, 0, 0));
- IcoLib_ReleaseIcon((HICON)SendDlgItemMessage(m_hwnd, IDC_ICO_QUERY, STM_SETICON, 0, 0));
- IcoLib_ReleaseIcon((HICON)SendDlgItemMessage(m_hwnd, IDC_ICO_PRESENCEIN, STM_SETICON, 0, 0));
- IcoLib_ReleaseIcon((HICON)SendDlgItemMessage(m_hwnd, IDC_ICO_PRESENCEOUT, STM_SETICON, 0, 0));
- m_proto->m_hwndPrivacyRule = nullptr;
- }
};
/////////////////////////////////////////////////////////////////////////////////////////
// Main privacy list dialog
-class CJabberDlgPrivacyLists : public CJabberDlgBase
-{
- typedef CJabberDlgBase CSuper;
-
-public:
- CJabberDlgPrivacyLists(CJabberProto *proto);
-
-protected:
- static int idSimpleControls[];
- static int idAdvancedControls[];
- bool OnInitDialog() override;
- bool OnClose() override;
- void OnDestroy();
- void OnProtoRefresh(WPARAM, LPARAM);
- int Resizer(UTILRESIZECONTROL *urc);
+static int idSimpleControls[] =
+{
+ IDC_CLIST, IDC_CANVAS,
+ IDC_TXT_OTHERJID, IDC_NEWJID, IDC_ADDJID,
+ IDC_ICO_MESSAGE, IDC_ICO_QUERY, IDC_ICO_INPRESENCE, IDC_ICO_OUTPRESENCE,
+ IDC_TXT_MESSAGE, IDC_TXT_QUERY, IDC_TXT_INPRESENCE, IDC_TXT_OUTPRESENCE,
+ 0
+};
- UI_MESSAGE_MAP(CJabberDlgPrivacyLists, CSuper);
- UI_MESSAGE(WM_MEASUREITEM, OnWmMeasureItem);
- UI_MESSAGE(WM_DRAWITEM, OnWmDrawItem);
- UI_MESSAGE(WM_GETMINMAXINFO, OnWmGetMinMaxInfo);
- UI_MESSAGE_MAP_END();
+static int idAdvancedControls[] =
+{
+ IDC_PL_RULES_LIST,
+ IDC_ADD_RULE, IDC_EDIT_RULE, IDC_REMOVE_RULE,
+ IDC_UP_RULE, IDC_DOWN_RULE,
+ 0
+};
- BOOL OnWmMeasureItem(UINT msg, WPARAM wParam, LPARAM lParam);
- BOOL OnWmDrawItem(UINT msg, WPARAM wParam, LPARAM lParam);
- BOOL OnWmGetMinMaxInfo(UINT msg, WPARAM wParam, LPARAM lParam);
-
- void btnSimple_OnClick(CCtrlButton *);
- void btnAdvanced_OnClick(CCtrlButton *);
- void btnAddJid_OnClick(CCtrlButton *);
- void btnActivate_OnClick(CCtrlButton *);
- void btnSetDefault_OnClick(CCtrlButton *);
- void lbLists_OnSelChange(CCtrlListBox *);
- void lbLists_OnDblClick(CCtrlListBox *);
- void lbRules_OnSelChange(CCtrlListBox *);
- void lbRules_OnDblClick(CCtrlListBox *);
- void btnEditRule_OnClick(CCtrlButton *);
- void btnAddRule_OnClick(CCtrlButton *);
- void btnRemoveRule_OnClick(CCtrlButton *);
- void btnUpRule_OnClick(CCtrlButton *);
- void btnDownRule_OnClick(CCtrlButton *);
- void btnAddList_OnClick(CCtrlButton *);
- void btnRemoveList_OnClick(CCtrlButton *);
- void btnApply_OnClick(CCtrlButton *);
- void clcClist_OnUpdate(CCtrlClc::TEventInfo *evt);
- void clcClist_OnOptionsChanged(CCtrlClc::TEventInfo *evt);
- void clcClist_OnClick(CCtrlClc::TEventInfo *evt);
-
- void OnCommand_Close(HWND hwndCtrl, WORD idCtrl, WORD idCode);
-
- void ShowAdvancedList(CPrivacyList *pList);
- void DrawNextRulePart(HDC hdc, COLORREF color, const wchar_t *text, RECT *rc);
- void DrawRuleAction(HDC hdc, COLORREF clLine1, COLORREF clLine2, CPrivacyListRule *pRule, RECT *rc);
- void DrawRulesList(LPDRAWITEMSTRUCT lpdis);
- void DrawLists(LPDRAWITEMSTRUCT lpdis);
-
- void CListResetOptions();
- void CListFilter();
- void CListResetIcons(HANDLE hItem, bool hide = false);
- void CListSetupIcons(HANDLE hItem, int iSlot, DWORD dwProcess, BOOL bAction);
- HANDLE CListAddContact(char *jid);
- void CListApplyList(CPrivacyList *pList = nullptr);
- DWORD CListGetPackets(HANDLE hItem, bool bAction);
- void CListBuildList(CPrivacyList *pList);
-
- void EnableEditorControls();
- BOOL CanExit();
-
- static LRESULT CALLBACK LstListsSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
- static LRESULT CALLBACK LstRulesSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+class CJabberDlgPrivacyLists : public CJabberDlgBase
+{
+ typedef CJabberDlgBase CSuper;
struct TCLCInfo
{
@@ -670,1381 +621,1361 @@ protected: TCLCInfo clc_info;
-private:
- CCtrlMButton m_btnSimple;
- CCtrlMButton m_btnAdvanced;
- CCtrlMButton m_btnAddJid;
- CCtrlMButton m_btnActivate;
- CCtrlMButton m_btnSetDefault;
- CCtrlMButton m_btnEditRule;
- CCtrlMButton m_btnAddRule;
- CCtrlMButton m_btnRemoveRule;
- CCtrlMButton m_btnUpRule;
- CCtrlMButton m_btnDownRule;
- CCtrlMButton m_btnAddList;
- CCtrlMButton m_btnRemoveList;
- CCtrlButton m_btnApply;
- CCtrlListBox m_lbLists;
- CCtrlListBox m_lbRules;
- CCtrlClc m_clcClist;
- CCtrlEdit m_edtNewJid;
-};
-
-int CJabberDlgPrivacyLists::idSimpleControls[] =
-{
- IDC_CLIST, IDC_CANVAS,
- IDC_TXT_OTHERJID, IDC_NEWJID, IDC_ADDJID,
- IDC_ICO_MESSAGE, IDC_ICO_QUERY, IDC_ICO_INPRESENCE, IDC_ICO_OUTPRESENCE,
- IDC_TXT_MESSAGE, IDC_TXT_QUERY, IDC_TXT_INPRESENCE, IDC_TXT_OUTPRESENCE,
- 0
-};
-
-int CJabberDlgPrivacyLists::idAdvancedControls[] =
-{
- IDC_PL_RULES_LIST,
- IDC_ADD_RULE, IDC_EDIT_RULE, IDC_REMOVE_RULE,
- IDC_UP_RULE, IDC_DOWN_RULE,
- 0
-};
-
-CJabberDlgPrivacyLists::CJabberDlgPrivacyLists(CJabberProto *proto) :
- CSuper(proto, IDD_PRIVACY_LISTS),
- m_btnSimple(this, IDC_BTN_SIMPLE, proto->LoadIconEx("group"), LPGEN("Simple mode")),
- m_btnAdvanced(this, IDC_BTN_ADVANCED, proto->LoadIconEx("sd_view_list"), LPGEN("Advanced mode")),
- m_btnAddJid(this, IDC_ADDJID, proto->LoadIconEx("addroster"), LPGEN("Add JID")),
- m_btnActivate(this, IDC_ACTIVATE, proto->LoadIconEx("pl_list_active"), LPGEN("Activate")),
- m_btnSetDefault(this, IDC_SET_DEFAULT, proto->LoadIconEx("pl_list_default"), LPGEN("Set default")),
- m_btnEditRule(this, IDC_EDIT_RULE, SKINICON_OTHER_RENAME, LPGEN("Edit rule")),
- m_btnAddRule(this, IDC_ADD_RULE, SKINICON_OTHER_ADDCONTACT, LPGEN("Add rule")),
- m_btnRemoveRule(this, IDC_REMOVE_RULE, SKINICON_OTHER_DELETE, LPGEN("Delete rule")),
- m_btnUpRule(this, IDC_UP_RULE, proto->LoadIconEx("arrow_up"), LPGEN("Move rule up")),
- m_btnDownRule(this, IDC_DOWN_RULE, proto->LoadIconEx("arrow_down"), LPGEN("Move rule down")),
- m_btnAddList(this, IDC_ADD_LIST, SKINICON_OTHER_ADDCONTACT, LPGEN("Add list...")),
- m_btnRemoveList(this, IDC_REMOVE_LIST, SKINICON_OTHER_DELETE, LPGEN("Remove list")),
- m_btnApply(this, IDC_APPLY),
- m_lbLists(this, IDC_LB_LISTS),
- m_lbRules(this, IDC_PL_RULES_LIST),
- m_clcClist(this, IDC_CLIST),
- m_edtNewJid(this, IDC_NEWJID)
-{
- m_btnSimple.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnSimple_OnClick);
- m_btnAdvanced.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnAdvanced_OnClick);
- m_btnAddJid.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnAddJid_OnClick);
- m_btnActivate.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnActivate_OnClick);
- m_btnSetDefault.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnSetDefault_OnClick);
- m_btnEditRule.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnEditRule_OnClick);
- m_btnAddRule.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnAddRule_OnClick);
- m_btnRemoveRule.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnRemoveRule_OnClick);
- m_btnUpRule.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnUpRule_OnClick);
- m_btnDownRule.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnDownRule_OnClick);
- m_btnAddList.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnAddList_OnClick);
- m_btnRemoveList.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnRemoveList_OnClick);
- m_btnApply.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnApply_OnClick);
-
- m_lbLists.OnSelChange = Callback(this, &CJabberDlgPrivacyLists::lbLists_OnSelChange);
- m_lbLists.OnDblClick = Callback(this, &CJabberDlgPrivacyLists::lbLists_OnDblClick);
- m_lbRules.OnSelChange = Callback(this, &CJabberDlgPrivacyLists::lbRules_OnSelChange);
- m_lbRules.OnDblClick = Callback(this, &CJabberDlgPrivacyLists::lbRules_OnDblClick);
-
- m_clcClist.OnNewContact =
- m_clcClist.OnListRebuilt = Callback(this, &CJabberDlgPrivacyLists::clcClist_OnUpdate);
- m_clcClist.OnOptionsChanged = Callback(this, &CJabberDlgPrivacyLists::clcClist_OnOptionsChanged);
- m_clcClist.OnClick = Callback(this, &CJabberDlgPrivacyLists::clcClist_OnClick);
-}
-
-bool CJabberDlgPrivacyLists::OnInitDialog()
-{
- CSuper::OnInitDialog();
-
- Window_SetIcon_IcoLib(m_hwnd, g_GetIconHandle(IDI_PRIVACY_LISTS));
-
- EnableWindow(GetDlgItem(m_hwnd, IDC_ADD_RULE), FALSE);
- EnableWindow(GetDlgItem(m_hwnd, IDC_EDIT_RULE), FALSE);
- EnableWindow(GetDlgItem(m_hwnd, IDC_REMOVE_RULE), FALSE);
- EnableWindow(GetDlgItem(m_hwnd, IDC_UP_RULE), FALSE);
- EnableWindow(GetDlgItem(m_hwnd, IDC_DOWN_RULE), FALSE);
-
- m_proto->QueryPrivacyLists();
-
- LOGFONT lf;
- GetObject((HFONT)SendDlgItemMessage(m_hwnd, IDC_TXT_LISTS, WM_GETFONT, 0, 0), sizeof(lf), &lf);
- lf.lfWeight = FW_BOLD;
- HFONT hfnt = CreateFontIndirect(&lf);
- SendDlgItemMessage(m_hwnd, IDC_TXT_LISTS, WM_SETFONT, (WPARAM)hfnt, TRUE);
- SendDlgItemMessage(m_hwnd, IDC_TXT_RULES, WM_SETFONT, (WPARAM)hfnt, TRUE);
-
- SetWindowLongPtr(m_clcClist.GetHwnd(), GWL_STYLE,
- GetWindowLongPtr(m_clcClist.GetHwnd(), GWL_STYLE) | CLS_HIDEEMPTYGROUPS | CLS_USEGROUPS | CLS_GREYALTERNATE);
- m_clcClist.SetExStyle(CLS_EX_DISABLEDRAGDROP | CLS_EX_TRACKSELECT);
-
- HIMAGELIST hIml = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 9, 9);
- ImageList_AddIcon_Icolib(hIml, Skin_LoadIcon(SKINICON_OTHER_SMALLDOT));
- ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_msg_allow"));
- ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_msg_deny"));
- ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_prin_allow"));
- ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_prin_deny"));
- ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_prout_allow"));
- ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_prout_deny"));
- ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_iq_allow"));
- ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_iq_deny"));
- m_clcClist.SetExtraImageList(hIml);
- m_clcClist.SetExtraColumns(4);
-
- m_btnSimple.MakePush();
- m_btnAdvanced.MakePush();
-
- CLCINFOITEM cii = { 0 };
- cii.cbSize = sizeof(cii);
-
- cii.flags = CLCIIF_GROUPFONT;
- cii.pszText = TranslateT("** Default **");
- clc_info.hItemDefault = m_clcClist.AddInfoItem(&cii);
- cii.pszText = TranslateT("** Subscription: both **");
- clc_info.hItemSubBoth = m_clcClist.AddInfoItem(&cii);
- cii.pszText = TranslateT("** Subscription: to **");
- clc_info.hItemSubTo = m_clcClist.AddInfoItem(&cii);
- cii.pszText = TranslateT("** Subscription: from **");
- clc_info.hItemSubFrom = m_clcClist.AddInfoItem(&cii);
- cii.pszText = TranslateT("** Subscription: none **");
- clc_info.hItemSubNone = m_clcClist.AddInfoItem(&cii);
-
- CListResetOptions();
- CListFilter();
- CListApplyList();
-
- if (m_proto->getByte("plistsWnd_simpleMode", 1)) {
- UIShowControls(m_hwnd, idSimpleControls, SW_SHOW);
- UIShowControls(m_hwnd, idAdvancedControls, SW_HIDE);
- CheckDlgButton(m_hwnd, IDC_BTN_SIMPLE, BST_CHECKED);
- }
- else {
- UIShowControls(m_hwnd, idSimpleControls, SW_HIDE);
- UIShowControls(m_hwnd, idAdvancedControls, SW_SHOW);
- CheckDlgButton(m_hwnd, IDC_BTN_ADVANCED, BST_CHECKED);
- }
-
- mir_subclassWindow(GetDlgItem(m_hwnd, IDC_LB_LISTS), LstListsSubclassProc);
- mir_subclassWindow(GetDlgItem(m_hwnd, IDC_PL_RULES_LIST), LstRulesSubclassProc);
-
- SetStatusText(TranslateT("Loading..."));
-
- Utils_RestoreWindowPosition(m_hwnd, 0, m_proto->m_szModuleName, "plistsWnd_sz");
- return true;
-}
+ void ShowAdvancedList(CPrivacyList *pList)
+ {
+ int nLbSel = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCURSEL, 0, 0);
+ SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_RESETCONTENT, 0, 0);
+
+ BOOL bListEmpty = TRUE;
+
+ CPrivacyListRule* pRule = pList->GetFirstRule();
+ while (pRule) {
+ bListEmpty = FALSE;
+ wchar_t szTypeValue[512];
+ switch (pRule->GetType()) {
+ case Jid:
+ mir_snwprintf(szTypeValue, L"If Jabber ID is '%s' then", pRule->GetValue());
+ break;
+ case Group:
+ mir_snwprintf(szTypeValue, L"If group is '%s' then", pRule->GetValue());
+ break;
+ case Subscription:
+ mir_snwprintf(szTypeValue, L"If subscription is '%s' then", pRule->GetValue());
+ break;
+ case Else:
+ mir_snwprintf(szTypeValue, L"Else");
+ break;
+ }
-bool CJabberDlgPrivacyLists::OnClose()
-{
- if (!CanExit())
- return false;
+ wchar_t szPackets[512];
+ szPackets[0] = '\0';
- DestroyWindow(m_hwnd);
- return CSuper::OnClose();
-}
+ DWORD dwPackets = pRule->GetPackets();
+ if (!dwPackets)
+ dwPackets = JABBER_PL_RULE_TYPE_ALL;
+ if (dwPackets == JABBER_PL_RULE_TYPE_ALL)
+ mir_wstrcpy(szPackets, L"all");
+ else {
+ if (dwPackets & JABBER_PL_RULE_TYPE_MESSAGE)
+ mir_wstrcat(szPackets, L"messages");
+ if (dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_IN) {
+ if (mir_wstrlen(szPackets))
+ mir_wstrcat(szPackets, L", ");
+ mir_wstrcat(szPackets, L"presence-in");
+ }
+ if (dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_OUT) {
+ if (mir_wstrlen(szPackets))
+ mir_wstrcat(szPackets, L", ");
+ mir_wstrcat(szPackets, L"presence-out");
+ }
+ if (dwPackets & JABBER_PL_RULE_TYPE_IQ) {
+ if (mir_wstrlen(szPackets))
+ mir_wstrcat(szPackets, L", ");
+ mir_wstrcat(szPackets, L"queries");
+ }
+ }
-void CJabberDlgPrivacyLists::OnDestroy()
-{
- m_proto->m_pDlgPrivacyLists = nullptr;
+ wchar_t szListItem[512];
+ mir_snwprintf(szListItem, L"%s %s %s", szTypeValue, pRule->GetAction() ? L"allow" : L"deny", szPackets);
- // Wipe all data and query lists without contents
- m_proto->m_privacyListManager.RemoveAllLists();
- m_proto->QueryPrivacyLists();
- m_proto->m_privacyListManager.SetModified(FALSE);
+ LRESULT nItemId = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_ADDSTRING, 0, (LPARAM)szListItem);
+ SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_SETITEMDATA, nItemId, (LPARAM)pRule);
- // Delete custom bold font
- DeleteObject((HFONT)SendDlgItemMessage(m_hwnd, IDC_TXT_LISTS, WM_GETFONT, 0, 0));
+ pRule = pRule->GetNext();
+ }
- m_proto->setByte("plistsWnd_simpleMode", IsDlgButtonChecked(m_hwnd, IDC_BTN_SIMPLE));
+ EnableWindow(GetDlgItem(m_hwnd, IDC_PL_RULES_LIST), !bListEmpty);
+ if (bListEmpty)
+ SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_ADDSTRING, 0, (LPARAM)TranslateT("List has no rules, empty lists will be deleted then changes applied"));
+ else
+ SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_SETCURSEL, nLbSel, 0);
- Utils_SaveWindowPosition(m_hwnd, 0, m_proto->m_szModuleName, "plistsWnd_sz");
+ PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_PL_RULES_LIST, LBN_SELCHANGE), 0);
+ }
- CSuper::OnDestroy();
-}
+ void DrawNextRulePart(HDC hdc, COLORREF color, const wchar_t *text, RECT *rc)
+ {
+ SetTextColor(hdc, color);
+ DrawText(hdc, text, -1, rc, DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS);
-void CJabberDlgPrivacyLists::OnProtoRefresh(WPARAM, LPARAM)
-{
- LRESULT sel = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETCURSEL, 0, 0);
- wchar_t *szCurrentSelectedList = nullptr;
- if (sel != LB_ERR) {
- LRESULT len = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETTEXTLEN, sel, 0) + 1;
- szCurrentSelectedList = (wchar_t *)mir_alloc(len * sizeof(wchar_t));
- SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETTEXT, sel, (LPARAM)szCurrentSelectedList);
+ SIZE sz;
+ GetTextExtentPoint32(hdc, text, (int)mir_wstrlen(text), &sz);
+ rc->left += sz.cx;
}
- SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_RESETCONTENT, 0, 0);
-
- LRESULT nItemId = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_ADDSTRING, 0, (LPARAM)TranslateT("<none>"));
- SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SETITEMDATA, nItemId, 0);
+ void DrawRuleAction(HDC hdc, COLORREF clLine1, COLORREF, CPrivacyListRule *pRule, RECT *rc)
{
- mir_cslock lck(m_proto->m_privacyListManager.m_cs);
-
- CPrivacyList *pList = m_proto->m_privacyListManager.GetFirstList();
- while (pList) {
- if (!pList->IsDeleted()) {
- nItemId = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_ADDSTRING, 0, (LPARAM)pList->GetListName());
- SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SETITEMDATA, nItemId, (LPARAM)pList);
+ DrawNextRulePart(hdc, clLine1, pRule->GetAction() ? TranslateT("allow ") : TranslateT("deny "), rc);
+ if (!pRule->GetPackets() || (pRule->GetPackets() == JABBER_PL_RULE_TYPE_ALL))
+ DrawNextRulePart(hdc, clLine1, TranslateT("all."), rc);
+ else {
+ bool needComma = false;
+ int itemCount =
+ ((pRule->GetPackets() & JABBER_PL_RULE_TYPE_MESSAGE) ? 1 : 0) +
+ ((pRule->GetPackets() & JABBER_PL_RULE_TYPE_PRESENCE_IN) ? 1 : 0) +
+ ((pRule->GetPackets() & JABBER_PL_RULE_TYPE_PRESENCE_OUT) ? 1 : 0) +
+ ((pRule->GetPackets() & JABBER_PL_RULE_TYPE_IQ) ? 1 : 0);
+
+ if (pRule->GetPackets() & JABBER_PL_RULE_TYPE_MESSAGE) {
+ --itemCount;
+ needComma = true;
+ DrawNextRulePart(hdc, clLine1, TranslateT("messages"), rc);
}
- pList = pList->GetNext();
+ if (pRule->GetPackets() & JABBER_PL_RULE_TYPE_PRESENCE_IN) {
+ --itemCount;
+ if (needComma)
+ DrawNextRulePart(hdc, clLine1, itemCount ? L", " : TranslateT(" and "), rc);
+ needComma = true;
+ DrawNextRulePart(hdc, clLine1, TranslateT("incoming presences"), rc);
+ }
+ if (pRule->GetPackets() & JABBER_PL_RULE_TYPE_PRESENCE_OUT) {
+ --itemCount;
+ if (needComma)
+ DrawNextRulePart(hdc, clLine1, itemCount ? L", " : TranslateT(" and "), rc);
+ needComma = true;
+ DrawNextRulePart(hdc, clLine1, TranslateT("outgoing presences"), rc);
+ }
+ if (pRule->GetPackets() & JABBER_PL_RULE_TYPE_IQ) {
+ --itemCount;
+ if (needComma)
+ DrawNextRulePart(hdc, clLine1, itemCount ? L", " : TranslateT(" and "), rc);
+ needComma = true;
+ DrawNextRulePart(hdc, clLine1, TranslateT("queries"), rc);
+ }
+ DrawNextRulePart(hdc, clLine1, L".", rc);
}
-
- if (!szCurrentSelectedList || (SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SELECTSTRING, -1, (LPARAM)szCurrentSelectedList) == LB_ERR))
- SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SETCURSEL, 0, 0);
- if (szCurrentSelectedList)
- mir_free(szCurrentSelectedList);
}
- PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_LB_LISTS, LBN_SELCHANGE), 0);
- EnableEditorControls();
-}
+ void DrawRulesList(LPDRAWITEMSTRUCT lpdis)
+ {
+ if (lpdis->itemID == -1)
+ return;
-BOOL CJabberDlgPrivacyLists::OnWmMeasureItem(UINT, WPARAM, LPARAM lParam)
-{
- LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT)lParam;
- if ((lpmis->CtlID != IDC_PL_RULES_LIST) && (lpmis->CtlID != IDC_LB_LISTS))
- return FALSE;
+ CPrivacyListRule *pRule = (CPrivacyListRule *)lpdis->itemData;
+
+ COLORREF clLine1, clLine2, clBack;
+ if (lpdis->itemState & ODS_SELECTED) {
+ FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_HIGHLIGHT));
+ clBack = GetSysColor(COLOR_HIGHLIGHT);
+ clLine1 = GetSysColor(COLOR_HIGHLIGHTTEXT);
+ }
+ else {
+ FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_WINDOW));
+ clBack = GetSysColor(COLOR_WINDOW);
+ clLine1 = GetSysColor(COLOR_WINDOWTEXT);
+ }
+ clLine2 = RGB(
+ GetRValue(clLine1) * 0.66 + GetRValue(clBack) * 0.34,
+ GetGValue(clLine1) * 0.66 + GetGValue(clBack) * 0.34,
+ GetBValue(clLine1) * 0.66 + GetBValue(clBack) * 0.34);
+
+ SetBkMode(lpdis->hDC, TRANSPARENT);
+
+ RECT rc;
+ if (!pRule) {
+ rc = lpdis->rcItem;
+ rc.left += 25;
+
+ int len = SendDlgItemMessage(m_hwnd, lpdis->CtlID, LB_GETTEXTLEN, lpdis->itemID, 0) + 1;
+ wchar_t *str = (wchar_t *)_alloca(len * sizeof(wchar_t));
+ SendDlgItemMessage(m_hwnd, lpdis->CtlID, LB_GETTEXT, lpdis->itemID, (LPARAM)str);
+ DrawNextRulePart(lpdis->hDC, clLine1, str, &rc);
+ }
+ else if (pRule->GetType() == Else) {
+ rc = lpdis->rcItem;
+ rc.left += 25;
- TEXTMETRIC tm = { 0 };
- HDC hdc = GetDC(GetDlgItem(m_hwnd, lpmis->CtlID));
- GetTextMetrics(hdc, &tm);
- ReleaseDC(GetDlgItem(m_hwnd, lpmis->CtlID), hdc);
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("Else "), &rc);
+ DrawRuleAction(lpdis->hDC, clLine1, clLine2, pRule, &rc);
+ }
+ else {
+ rc = lpdis->rcItem;
+ rc.bottom -= (rc.bottom - rc.top) / 2;
+ rc.left += 25;
- if (lpmis->CtlID == IDC_PL_RULES_LIST)
- lpmis->itemHeight = tm.tmHeight * 2;
- else if (lpmis->CtlID == IDC_LB_LISTS)
- lpmis->itemHeight = tm.tmHeight;
+ Utf2T wszRule(pRule->GetValue());
+ switch (pRule->GetType()) {
+ case Jid:
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("If Jabber ID is '"), &rc);
+ DrawNextRulePart(lpdis->hDC, clLine1, wszRule, &rc);
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("'"), &rc);
- if (lpmis->itemHeight < 18) lpmis->itemHeight = 18;
+ if (MCONTACT hContact = m_proto->HContactFromJID(pRule->GetValue())) {
+ wchar_t *szName = Clist_GetContactDisplayName(hContact);
+ if (szName) {
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT(" (nickname: "), &rc);
+ DrawNextRulePart(lpdis->hDC, clLine1, szName, &rc);
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT(")"), &rc);
+ }
+ }
+ break;
- return TRUE;
-}
+ case Group:
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("If group is '"), &rc);
+ DrawNextRulePart(lpdis->hDC, clLine1, wszRule, &rc);
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("'"), &rc);
+ break;
-/////////////////////////////////////////////////////////////////////////////////////////
+ case Subscription:
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("If subscription is '"), &rc);
+ DrawNextRulePart(lpdis->hDC, clLine1, wszRule, &rc);
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("'"), &rc);
+ break;
+ }
-struct
-{
- wchar_t *textEng;
- char *icon;
- wchar_t *text;
-}
-static drawItems[] =
-{
- { LPGENW("Message"), "pl_msg_allow" },
- { LPGENW("Presence (in)"), "pl_prin_allow" },
- { LPGENW("Presence (out)"), "pl_prout_allow" },
- { LPGENW("Query"), "pl_iq_allow" }
-};
+ rc = lpdis->rcItem;
+ rc.top += (rc.bottom - rc.top) / 2;
+ rc.left += 25;
-BOOL CJabberDlgPrivacyLists::OnWmDrawItem(UINT, WPARAM, LPARAM lParam)
-{
- LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
-
- if (lpdis->CtlID == IDC_PL_RULES_LIST)
- DrawRulesList(lpdis);
- else if (lpdis->CtlID == IDC_LB_LISTS)
- DrawLists(lpdis);
- else if (lpdis->CtlID == IDC_CANVAS) {
- int totalWidth = -5; // spacing for last item
- for (auto &it : drawItems) {
- SIZE sz = { 0 };
- it.text = TranslateW(it.textEng);
- GetTextExtentPoint32(lpdis->hDC, it.text, (int)mir_wstrlen(it.text), &sz);
- totalWidth += sz.cx + 18 + 5; // 18 pixels for icon, 5 pixel spacing
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("then "), &rc);
+ DrawRuleAction(lpdis->hDC, clLine1, clLine2, pRule, &rc);
}
- COLORREF clText = GetSysColor(COLOR_BTNTEXT);
- RECT rc = lpdis->rcItem;
- rc.left = (rc.left + rc.right - totalWidth) / 2;
+ DrawIconEx(lpdis->hDC, lpdis->rcItem.left + 4, (lpdis->rcItem.top + lpdis->rcItem.bottom - 16) / 2,
+ m_proto->LoadIconEx("main"), 16, 16, 0, nullptr, DI_NORMAL);
- for (auto &it : drawItems) {
- DrawIconEx(lpdis->hDC, rc.left, (rc.top + rc.bottom - 16) / 2, m_proto->LoadIconEx(it.icon),
+ if (pRule)
+ DrawIconEx(lpdis->hDC, lpdis->rcItem.left + 4, (lpdis->rcItem.top + lpdis->rcItem.bottom - 16) / 2,
+ m_proto->LoadIconEx(pRule->GetAction() ? "disco_ok" : "disco_fail"),
16, 16, 0, nullptr, DI_NORMAL);
- rc.left += 18;
- DrawNextRulePart(lpdis->hDC, clText, it.text, &rc);
- rc.left += 5;
+
+ if (lpdis->itemState & ODS_FOCUS) {
+ LRESULT sel = SendDlgItemMessage(m_hwnd, lpdis->CtlID, LB_GETCURSEL, 0, 0);
+ if ((sel == LB_ERR) || (sel == (LRESULT)lpdis->itemID))
+ DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
}
}
- else return FALSE;
- return TRUE;
-}
+ void DrawLists(LPDRAWITEMSTRUCT lpdis)
+ {
+ if (lpdis->itemID == -1)
+ return;
-BOOL CJabberDlgPrivacyLists::OnWmGetMinMaxInfo(UINT, WPARAM, LPARAM lParam)
-{
- LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;
- lpmmi->ptMinTrackSize.x = 550;
- lpmmi->ptMinTrackSize.y = 390;
- return 0;
-}
+ CPrivacyList *pList = (CPrivacyList *)lpdis->itemData;
-void CJabberDlgPrivacyLists::ShowAdvancedList(CPrivacyList *pList)
-{
- int nLbSel = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCURSEL, 0, 0);
- SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_RESETCONTENT, 0, 0);
+ COLORREF clLine1, clLine2, clBack;
+ if (lpdis->itemState & ODS_SELECTED) {
+ FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_HIGHLIGHT));
+ clBack = GetSysColor(COLOR_HIGHLIGHT);
+ clLine1 = GetSysColor(COLOR_HIGHLIGHTTEXT);
+ }
+ else {
+ FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_WINDOW));
+ clBack = GetSysColor(COLOR_WINDOW);
+ clLine1 = GetSysColor(COLOR_WINDOWTEXT);
+ }
+ clLine2 = RGB(
+ GetRValue(clLine1) * 0.66 + GetRValue(clBack) * 0.34,
+ GetGValue(clLine1) * 0.66 + GetGValue(clBack) * 0.34,
+ GetBValue(clLine1) * 0.66 + GetBValue(clBack) * 0.34);
- BOOL bListEmpty = TRUE;
+ SetBkMode(lpdis->hDC, TRANSPARENT);
- CPrivacyListRule* pRule = pList->GetFirstRule();
- while (pRule) {
- bListEmpty = FALSE;
- wchar_t szTypeValue[512];
- switch (pRule->GetType()) {
- case Jid:
- mir_snwprintf(szTypeValue, L"If Jabber ID is '%s' then", pRule->GetValue());
- break;
- case Group:
- mir_snwprintf(szTypeValue, L"If group is '%s' then", pRule->GetValue());
- break;
- case Subscription:
- mir_snwprintf(szTypeValue, L"If subscription is '%s' then", pRule->GetValue());
- break;
- case Else:
- mir_snwprintf(szTypeValue, L"Else");
- break;
+ char *szDefault, *szActive;
+ {
+ mir_cslock lck(m_proto->m_privacyListManager.m_cs);
+ szDefault = NEWSTR_ALLOCA(m_proto->m_privacyListManager.GetDefaultListName());
+ szActive = NEWSTR_ALLOCA(m_proto->m_privacyListManager.GetActiveListName());
}
- wchar_t szPackets[512];
- szPackets[0] = '\0';
+ RECT rc;
+ rc = lpdis->rcItem;
+ rc.left += 3;
- DWORD dwPackets = pRule->GetPackets();
- if (!dwPackets)
- dwPackets = JABBER_PL_RULE_TYPE_ALL;
- if (dwPackets == JABBER_PL_RULE_TYPE_ALL)
- mir_wstrcpy(szPackets, L"all");
+ bool bActive = false;
+ bool bDefault = false;
+ char *szName;
+
+ if (!pList) {
+ if (!szActive) bActive = true;
+ if (!szDefault) bDefault = true;
+ szName = Translate("<none>");
+ }
else {
- if (dwPackets & JABBER_PL_RULE_TYPE_MESSAGE)
- mir_wstrcat(szPackets, L"messages");
- if (dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_IN) {
- if (mir_wstrlen(szPackets))
- mir_wstrcat(szPackets, L", ");
- mir_wstrcat(szPackets, L"presence-in");
- }
- if (dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_OUT) {
- if (mir_wstrlen(szPackets))
- mir_wstrcat(szPackets, L", ");
- mir_wstrcat(szPackets, L"presence-out");
- }
- if (dwPackets & JABBER_PL_RULE_TYPE_IQ) {
- if (mir_wstrlen(szPackets))
- mir_wstrcat(szPackets, L", ");
- mir_wstrcat(szPackets, L"queries");
- }
+ if (!mir_strcmp(pList->GetListName(), szActive)) bActive = true;
+ if (!mir_strcmp(pList->GetListName(), szDefault)) bDefault = true;
+ szName = pList->GetListName();
}
- wchar_t szListItem[512];
- mir_snwprintf(szListItem, L"%s %s %s", szTypeValue, pRule->GetAction() ? L"allow" : L"deny", szPackets);
-
- LRESULT nItemId = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_ADDSTRING, 0, (LPARAM)szListItem);
- SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_SETITEMDATA, nItemId, (LPARAM)pRule);
+ HFONT hfnt = nullptr;
+ if (bActive) {
+ LOGFONT lf;
+ GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf);
+ lf.lfWeight = FW_BOLD;
+ hfnt = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf));
+ }
- pRule = pRule->GetNext();
- }
+ DrawNextRulePart(lpdis->hDC, clLine1, Utf2T(szName), &rc);
- EnableWindow(GetDlgItem(m_hwnd, IDC_PL_RULES_LIST), !bListEmpty);
- if (bListEmpty)
- SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_ADDSTRING, 0, (LPARAM)TranslateT("List has no rules, empty lists will be deleted then changes applied"));
- else
- SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_SETCURSEL, nLbSel, 0);
+ if (bActive && bDefault)
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT(" (act., def.)"), &rc);
+ else if (bActive)
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT(" (active)"), &rc);
+ else if (bDefault)
+ DrawNextRulePart(lpdis->hDC, clLine2, TranslateT(" (default)"), &rc);
- PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_PL_RULES_LIST, LBN_SELCHANGE), 0);
-}
+ DrawIconEx(lpdis->hDC, lpdis->rcItem.right - 16 - 4, (lpdis->rcItem.top + lpdis->rcItem.bottom - 16) / 2,
+ m_proto->LoadIconEx(bActive ? "pl_list_active" : "pl_list_any"),
+ 16, 16, 0, nullptr, DI_NORMAL);
-void CJabberDlgPrivacyLists::DrawNextRulePart(HDC hdc, COLORREF color, const wchar_t *text, RECT *rc)
-{
- SetTextColor(hdc, color);
- DrawText(hdc, text, -1, rc, DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS);
+ if (bDefault)
+ DrawIconEx(lpdis->hDC, lpdis->rcItem.right - 16 - 4, (lpdis->rcItem.top + lpdis->rcItem.bottom - 16) / 2,
+ m_proto->LoadIconEx("disco_ok"),
+ 16, 16, 0, nullptr, DI_NORMAL);
- SIZE sz;
- GetTextExtentPoint32(hdc, text, (int)mir_wstrlen(text), &sz);
- rc->left += sz.cx;
-}
+ if (hfnt)
+ DeleteObject(SelectObject(lpdis->hDC, hfnt));
-void CJabberDlgPrivacyLists::DrawRuleAction(HDC hdc, COLORREF clLine1, COLORREF, CPrivacyListRule *pRule, RECT *rc)
-{
- DrawNextRulePart(hdc, clLine1, pRule->GetAction() ? TranslateT("allow ") : TranslateT("deny "), rc);
- if (!pRule->GetPackets() || (pRule->GetPackets() == JABBER_PL_RULE_TYPE_ALL))
- DrawNextRulePart(hdc, clLine1, TranslateT("all."), rc);
- else {
- bool needComma = false;
- int itemCount =
- ((pRule->GetPackets() & JABBER_PL_RULE_TYPE_MESSAGE) ? 1 : 0) +
- ((pRule->GetPackets() & JABBER_PL_RULE_TYPE_PRESENCE_IN) ? 1 : 0) +
- ((pRule->GetPackets() & JABBER_PL_RULE_TYPE_PRESENCE_OUT) ? 1 : 0) +
- ((pRule->GetPackets() & JABBER_PL_RULE_TYPE_IQ) ? 1 : 0);
-
- if (pRule->GetPackets() & JABBER_PL_RULE_TYPE_MESSAGE) {
- --itemCount;
- needComma = true;
- DrawNextRulePart(hdc, clLine1, TranslateT("messages"), rc);
+ if (lpdis->itemState & ODS_FOCUS) {
+ int sel = SendDlgItemMessage(m_hwnd, lpdis->CtlID, LB_GETCURSEL, 0, 0);
+ if ((sel == LB_ERR) || (sel == (int)lpdis->itemID))
+ DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
}
- if (pRule->GetPackets() & JABBER_PL_RULE_TYPE_PRESENCE_IN) {
- --itemCount;
- if (needComma)
- DrawNextRulePart(hdc, clLine1, itemCount ? L", " : TranslateT(" and "), rc);
- needComma = true;
- DrawNextRulePart(hdc, clLine1, TranslateT("incoming presences"), rc);
- }
- if (pRule->GetPackets() & JABBER_PL_RULE_TYPE_PRESENCE_OUT) {
- --itemCount;
- if (needComma)
- DrawNextRulePart(hdc, clLine1, itemCount ? L", " : TranslateT(" and "), rc);
- needComma = true;
- DrawNextRulePart(hdc, clLine1, TranslateT("outgoing presences"), rc);
- }
- if (pRule->GetPackets() & JABBER_PL_RULE_TYPE_IQ) {
- --itemCount;
- if (needComma)
- DrawNextRulePart(hdc, clLine1, itemCount ? L", " : TranslateT(" and "), rc);
- needComma = true;
- DrawNextRulePart(hdc, clLine1, TranslateT("queries"), rc);
- }
- DrawNextRulePart(hdc, clLine1, L".", rc);
}
-}
-void CJabberDlgPrivacyLists::DrawRulesList(LPDRAWITEMSTRUCT lpdis)
-{
- if (lpdis->itemID == -1)
- return;
+ void CListResetOptions()
+ {
+ m_clcClist.SetBkBitmap(0, nullptr);
+ m_clcClist.SetBkColor(GetSysColor(COLOR_WINDOW));
+ m_clcClist.SetGreyoutFlags(0);
+ m_clcClist.SetLeftMargin(4);
+ m_clcClist.SetIndent(10);
+ m_clcClist.SetHideEmptyGroups(false);
+ m_clcClist.SetHideOfflineRoot(false);
+ for (int i = 0; i <= FONTID_MAX; i++)
+ m_clcClist.SetTextColor(i, GetSysColor(COLOR_WINDOWTEXT));
+ }
+
+ void CListFilter()
+ {
+ for (auto &hContact : Contacts()) {
+ char *proto = GetContactProto(hContact);
+ if (!proto || mir_strcmp(proto, m_proto->m_szModuleName))
+ if (HANDLE hItem = m_clcClist.FindContact(hContact))
+ m_clcClist.DeleteItem(hItem);
+ }
+ }
- CPrivacyListRule *pRule = (CPrivacyListRule *)lpdis->itemData;
+ void CListResetIcons(HANDLE hItem, bool hide = false)
+ {
+ for (int i = 0; i < 4; i++)
+ m_clcClist.SetExtraImage(hItem, i, hide ? EMPTY_EXTRA_ICON : 0);
+ }
- COLORREF clLine1, clLine2, clBack;
- if (lpdis->itemState & ODS_SELECTED) {
- FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_HIGHLIGHT));
- clBack = GetSysColor(COLOR_HIGHLIGHT);
- clLine1 = GetSysColor(COLOR_HIGHLIGHTTEXT);
+ void CListSetupIcons(HANDLE hItem, int iSlot, DWORD dwProcess, BOOL bAction)
+ {
+ if (dwProcess && !m_clcClist.GetExtraImage(hItem, iSlot))
+ m_clcClist.SetExtraImage(hItem, iSlot, iSlot * 2 + (bAction ? 1 : 2));
}
- else {
- FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_WINDOW));
- clBack = GetSysColor(COLOR_WINDOW);
- clLine1 = GetSysColor(COLOR_WINDOWTEXT);
+
+ HANDLE CListAddContact(char *jid)
+ {
+ MCONTACT hContact = m_proto->HContactFromJID(jid);
+ if (hContact)
+ return m_clcClist.FindContact(hContact);
+
+ HANDLE hItem = clc_info.findJid(jid);
+ if (!hItem) {
+ Utf2T wzJid(jid);
+
+ CLCINFOITEM cii = { 0 };
+ cii.cbSize = sizeof(cii);
+ cii.pszText = wzJid;
+ hItem = m_clcClist.AddInfoItem(&cii);
+ CListResetIcons(hItem);
+ clc_info.addJid(hItem, jid);
+ }
+ return hItem;
}
- clLine2 = RGB(
- GetRValue(clLine1) * 0.66 + GetRValue(clBack) * 0.34,
- GetGValue(clLine1) * 0.66 + GetGValue(clBack) * 0.34,
- GetBValue(clLine1) * 0.66 + GetBValue(clBack) * 0.34);
- SetBkMode(lpdis->hDC, TRANSPARENT);
+ void CListApplyList(CPrivacyList *pList)
+ {
+ clc_info.pList = pList;
+
+ bool bHideIcons = pList ? false : true;
+ CListResetIcons(clc_info.hItemDefault, bHideIcons);
+ CListResetIcons(clc_info.hItemSubBoth, bHideIcons);
+ CListResetIcons(clc_info.hItemSubFrom, bHideIcons);
+ CListResetIcons(clc_info.hItemSubNone, bHideIcons);
+ CListResetIcons(clc_info.hItemSubTo, bHideIcons);
+
+ // group handles start with 1 (0 is "root")
+ for (MGROUP iGroup = 1; Clist_GroupGetName(iGroup, nullptr) != nullptr; iGroup++) {
+ HANDLE hItem = m_clcClist.FindGroup(iGroup);
+ if (hItem)
+ CListResetIcons(hItem, bHideIcons);
+ }
- RECT rc;
- if (!pRule) {
- rc = lpdis->rcItem;
- rc.left += 25;
+ for (auto &hContact : Contacts()) {
+ HANDLE hItem = m_clcClist.FindContact(hContact);
+ if (hItem)
+ CListResetIcons(hItem, bHideIcons);
+ }
- int len = SendDlgItemMessage(m_hwnd, lpdis->CtlID, LB_GETTEXTLEN, lpdis->itemID, 0) + 1;
- wchar_t *str = (wchar_t *)_alloca(len * sizeof(wchar_t));
- SendDlgItemMessage(m_hwnd, lpdis->CtlID, LB_GETTEXT, lpdis->itemID, (LPARAM)str);
- DrawNextRulePart(lpdis->hDC, clLine1, str, &rc);
- }
- else if (pRule->GetType() == Else) {
- rc = lpdis->rcItem;
- rc.left += 25;
+ for (auto &it : clc_info.newJids)
+ CListResetIcons(it->hItem, bHideIcons);
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("Else "), &rc);
- DrawRuleAction(lpdis->hDC, clLine1, clLine2, pRule, &rc);
- }
- else {
- rc = lpdis->rcItem;
- rc.bottom -= (rc.bottom - rc.top) / 2;
- rc.left += 25;
+ if (!pList)
+ goto lbl_return;
- Utf2T wszRule(pRule->GetValue());
- switch (pRule->GetType()) {
- case Jid:
- {
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("If Jabber ID is '"), &rc);
- DrawNextRulePart(lpdis->hDC, clLine1, wszRule, &rc);
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("'"), &rc);
+ for (CPrivacyListRule *pRule = pList->GetFirstRule(); pRule; pRule = pRule->GetNext()) {
+ HANDLE hItem = nullptr;
+ switch (pRule->GetType()) {
+ case Jid:
+ hItem = CListAddContact(pRule->GetValue());
+ break;
- if (MCONTACT hContact = m_proto->HContactFromJID(pRule->GetValue())) {
- wchar_t *szName = Clist_GetContactDisplayName(hContact);
- if (szName) {
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT(" (nickname: "), &rc);
- DrawNextRulePart(lpdis->hDC, clLine1, szName, &rc);
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT(")"), &rc);
- }
- }
+ case Group:
+ hItem = m_clcClist.FindGroup(Clist_GroupExists(Utf2T(pRule->GetValue())));
+ break;
+
+ case Subscription:
+ if (!mir_strcmp(pRule->GetValue(), "none")) hItem = clc_info.hItemSubNone;
+ else if (!mir_strcmp(pRule->GetValue(), "from")) hItem = clc_info.hItemSubFrom;
+ else if (!mir_strcmp(pRule->GetValue(), "to")) hItem = clc_info.hItemSubTo;
+ else if (!mir_strcmp(pRule->GetValue(), "both")) hItem = clc_info.hItemSubBoth;
+ break;
+
+ case Else:
+ hItem = clc_info.hItemDefault;
break;
}
- case Group:
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("If group is '"), &rc);
- DrawNextRulePart(lpdis->hDC, clLine1, wszRule, &rc);
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("'"), &rc);
- break;
+ if (!hItem)
+ continue;
- case Subscription:
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("If subscription is '"), &rc);
- DrawNextRulePart(lpdis->hDC, clLine1, wszRule, &rc);
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("'"), &rc);
- break;
+ DWORD dwPackets = pRule->GetPackets();
+ if (!dwPackets) dwPackets = JABBER_PL_RULE_TYPE_ALL;
+ CListSetupIcons(hItem, 0, dwPackets & JABBER_PL_RULE_TYPE_MESSAGE, pRule->GetAction());
+ CListSetupIcons(hItem, 1, dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_IN, pRule->GetAction());
+ CListSetupIcons(hItem, 2, dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_OUT, pRule->GetAction());
+ CListSetupIcons(hItem, 3, dwPackets & JABBER_PL_RULE_TYPE_IQ, pRule->GetAction());
}
- rc = lpdis->rcItem;
- rc.top += (rc.bottom - rc.top) / 2;
- rc.left += 25;
-
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT("then "), &rc);
- DrawRuleAction(lpdis->hDC, clLine1, clLine2, pRule, &rc);
+lbl_return:
+ clc_info.bChanged = false;
}
- DrawIconEx(lpdis->hDC, lpdis->rcItem.left + 4, (lpdis->rcItem.top + lpdis->rcItem.bottom - 16) / 2,
- m_proto->LoadIconEx("main"), 16, 16, 0, nullptr, DI_NORMAL);
+ DWORD CListGetPackets(HANDLE hItem, bool bAction)
+ {
+ DWORD result = 0;
- if (pRule)
- DrawIconEx(lpdis->hDC, lpdis->rcItem.left + 4, (lpdis->rcItem.top + lpdis->rcItem.bottom - 16) / 2,
- m_proto->LoadIconEx(pRule->GetAction() ? "disco_ok" : "disco_fail"),
- 16, 16, 0, nullptr, DI_NORMAL);
+ int iIcon = m_clcClist.GetExtraImage(hItem, 0);
+ if (bAction && (iIcon == 1)) result |= JABBER_PL_RULE_TYPE_MESSAGE;
+ else if (!bAction && (iIcon == 2)) result |= JABBER_PL_RULE_TYPE_MESSAGE;
- if (lpdis->itemState & ODS_FOCUS) {
- LRESULT sel = SendDlgItemMessage(m_hwnd, lpdis->CtlID, LB_GETCURSEL, 0, 0);
- if ((sel == LB_ERR) || (sel == (LRESULT)lpdis->itemID))
- DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
- }
-}
+ iIcon = m_clcClist.GetExtraImage(hItem, 1);
+ if (bAction && (iIcon == 3)) result |= JABBER_PL_RULE_TYPE_PRESENCE_IN;
+ else if (!bAction && (iIcon == 4)) result |= JABBER_PL_RULE_TYPE_PRESENCE_IN;
-void CJabberDlgPrivacyLists::DrawLists(LPDRAWITEMSTRUCT lpdis)
-{
- if (lpdis->itemID == -1)
- return;
+ iIcon = m_clcClist.GetExtraImage(hItem, 2);
+ if (bAction && (iIcon == 5)) result |= JABBER_PL_RULE_TYPE_PRESENCE_OUT;
+ else if (!bAction && (iIcon == 6)) result |= JABBER_PL_RULE_TYPE_PRESENCE_OUT;
- CPrivacyList *pList = (CPrivacyList *)lpdis->itemData;
+ iIcon = m_clcClist.GetExtraImage(hItem, 3);
+ if (bAction && (iIcon == 7)) result |= JABBER_PL_RULE_TYPE_IQ;
+ else if (!bAction && (iIcon == 8)) result |= JABBER_PL_RULE_TYPE_IQ;
- COLORREF clLine1, clLine2, clBack;
- if (lpdis->itemState & ODS_SELECTED) {
- FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_HIGHLIGHT));
- clBack = GetSysColor(COLOR_HIGHLIGHT);
- clLine1 = GetSysColor(COLOR_HIGHLIGHTTEXT);
+ return result;
}
- else {
- FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_WINDOW));
- clBack = GetSysColor(COLOR_WINDOW);
- clLine1 = GetSysColor(COLOR_WINDOWTEXT);
- }
- clLine2 = RGB(
- GetRValue(clLine1) * 0.66 + GetRValue(clBack) * 0.34,
- GetGValue(clLine1) * 0.66 + GetGValue(clBack) * 0.34,
- GetBValue(clLine1) * 0.66 + GetBValue(clBack) * 0.34);
-
- SetBkMode(lpdis->hDC, TRANSPARENT);
- char *szDefault, *szActive;
+ void CListBuildList(CPrivacyList *pList)
{
- mir_cslock lck(m_proto->m_privacyListManager.m_cs);
- szDefault = NEWSTR_ALLOCA(m_proto->m_privacyListManager.GetDefaultListName());
- szActive = NEWSTR_ALLOCA(m_proto->m_privacyListManager.GetActiveListName());
- }
+ if (!pList || !clc_info.bChanged)
+ return;
- RECT rc;
- rc = lpdis->rcItem;
- rc.left += 3;
+ clc_info.bChanged = false;
- bool bActive = false;
- bool bDefault = false;
- char *szName;
+ DWORD dwOrder = 0;
+ DWORD dwPackets = 0;
- if (!pList) {
- if (!szActive) bActive = true;
- if (!szDefault) bDefault = true;
- szName = Translate("<none>");
- }
- else {
- if (!mir_strcmp(pList->GetListName(), szActive)) bActive = true;
- if (!mir_strcmp(pList->GetListName(), szDefault)) bDefault = true;
- szName = pList->GetListName();
- }
+ HANDLE hItem;
+ char *szJid = nullptr;
- HFONT hfnt = nullptr;
- if (bActive) {
- LOGFONT lf;
- GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf);
- lf.lfWeight = FW_BOLD;
- hfnt = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf));
- }
+ pList->RemoveAllRules();
- DrawNextRulePart(lpdis->hDC, clLine1, Utf2T(szName), &rc);
+ for (auto &it : clc_info.newJids) {
+ hItem = it->hItem;
+ szJid = it->jid;
- if (bActive && bDefault)
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT(" (act., def.)"), &rc);
- else if (bActive)
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT(" (active)"), &rc);
- else if (bDefault)
- DrawNextRulePart(lpdis->hDC, clLine2, TranslateT(" (default)"), &rc);
+ if (dwPackets = CListGetPackets(hItem, true))
+ pList->AddRule(Jid, szJid, TRUE, dwOrder++, dwPackets);
+ if (dwPackets = CListGetPackets(hItem, false))
+ pList->AddRule(Jid, szJid, FALSE, dwOrder++, dwPackets);
+ }
- DrawIconEx(lpdis->hDC, lpdis->rcItem.right - 16 - 4, (lpdis->rcItem.top + lpdis->rcItem.bottom - 16) / 2,
- m_proto->LoadIconEx(bActive ? "pl_list_active" : "pl_list_any"),
- 16, 16, 0, nullptr, DI_NORMAL);
+ for (auto &hContact : Contacts()) {
+ hItem = m_clcClist.FindContact(hContact);
- if (bDefault)
- DrawIconEx(lpdis->hDC, lpdis->rcItem.right - 16 - 4, (lpdis->rcItem.top + lpdis->rcItem.bottom - 16) / 2,
- m_proto->LoadIconEx("disco_ok"),
- 16, 16, 0, nullptr, DI_NORMAL);
-
- if (hfnt)
- DeleteObject(SelectObject(lpdis->hDC, hfnt));
+ ptrW jid(m_proto->getWStringA(hContact, "jid"));
+ if (jid == nullptr)
+ if ((jid = m_proto->getWStringA(hContact, "ChatRoomID")) == nullptr)
+ continue;
- if (lpdis->itemState & ODS_FOCUS) {
- int sel = SendDlgItemMessage(m_hwnd, lpdis->CtlID, LB_GETCURSEL, 0, 0);
- if ((sel == LB_ERR) || (sel == (int)lpdis->itemID))
- DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
- }
-}
+ if (dwPackets = CListGetPackets(hItem, true))
+ pList->AddRule(Jid, szJid, TRUE, dwOrder++, dwPackets);
+ if (dwPackets = CListGetPackets(hItem, false))
+ pList->AddRule(Jid, szJid, FALSE, dwOrder++, dwPackets);
+ }
-void CJabberDlgPrivacyLists::CListResetOptions()
-{
- m_clcClist.SetBkBitmap(0, nullptr);
- m_clcClist.SetBkColor(GetSysColor(COLOR_WINDOW));
- m_clcClist.SetGreyoutFlags(0);
- m_clcClist.SetLeftMargin(4);
- m_clcClist.SetIndent(10);
- m_clcClist.SetHideEmptyGroups(false);
- m_clcClist.SetHideOfflineRoot(false);
- for (int i = 0; i <= FONTID_MAX; i++)
- m_clcClist.SetTextColor(i, GetSysColor(COLOR_WINDOWTEXT));
-}
+ // group handles start with 1 (0 is "root")
+ wchar_t *grpName;
+ for (MGROUP iGroup = 1; (grpName = Clist_GroupGetName(iGroup, nullptr)) != nullptr; iGroup++) {
+ hItem = m_clcClist.FindGroup(iGroup);
+ if (dwPackets = CListGetPackets(hItem, true))
+ pList->AddRule(Group, T2Utf(grpName), TRUE, dwOrder++, dwPackets);
+ if (dwPackets = CListGetPackets(hItem, false))
+ pList->AddRule(Group, T2Utf(grpName), FALSE, dwOrder++, dwPackets);
+ }
-void CJabberDlgPrivacyLists::CListFilter()
-{
- for (auto &hContact : Contacts()) {
- char *proto = GetContactProto(hContact);
- if (!proto || mir_strcmp(proto, m_proto->m_szModuleName))
- if (HANDLE hItem = m_clcClist.FindContact(hContact))
- m_clcClist.DeleteItem(hItem);
- }
-}
+ hItem = clc_info.hItemSubBoth;
+ szJid = "both";
+ if (dwPackets = CListGetPackets(hItem, true))
+ pList->AddRule(Subscription, szJid, TRUE, dwOrder++, dwPackets);
+ if (dwPackets = CListGetPackets(hItem, false))
+ pList->AddRule(Subscription, szJid, FALSE, dwOrder++, dwPackets);
-void CJabberDlgPrivacyLists::CListResetIcons(HANDLE hItem, bool hide)
-{
- for (int i = 0; i < 4; i++)
- m_clcClist.SetExtraImage(hItem, i, hide ? EMPTY_EXTRA_ICON : 0);
-}
+ hItem = clc_info.hItemSubFrom;
+ szJid = "from";
+ if (dwPackets = CListGetPackets(hItem, true))
+ pList->AddRule(Subscription, szJid, TRUE, dwOrder++, dwPackets);
+ if (dwPackets = CListGetPackets(hItem, false))
+ pList->AddRule(Subscription, szJid, FALSE, dwOrder++, dwPackets);
-void CJabberDlgPrivacyLists::CListSetupIcons(HANDLE hItem, int iSlot, DWORD dwProcess, BOOL bAction)
-{
- if (dwProcess && !m_clcClist.GetExtraImage(hItem, iSlot))
- m_clcClist.SetExtraImage(hItem, iSlot, iSlot * 2 + (bAction ? 1 : 2));
-}
+ hItem = clc_info.hItemSubNone;
+ szJid = "none";
+ if (dwPackets = CListGetPackets(hItem, true))
+ pList->AddRule(Subscription, szJid, TRUE, dwOrder++, dwPackets);
+ if (dwPackets = CListGetPackets(hItem, false))
+ pList->AddRule(Subscription, szJid, FALSE, dwOrder++, dwPackets);
-HANDLE CJabberDlgPrivacyLists::CListAddContact(char *jid)
-{
- MCONTACT hContact = m_proto->HContactFromJID(jid);
- if (hContact)
- return m_clcClist.FindContact(hContact);
+ hItem = clc_info.hItemSubTo;
+ szJid = "to";
+ if (dwPackets = CListGetPackets(hItem, true))
+ pList->AddRule(Subscription, szJid, TRUE, dwOrder++, dwPackets);
+ if (dwPackets = CListGetPackets(hItem, false))
+ pList->AddRule(Subscription, szJid, FALSE, dwOrder++, dwPackets);
- HANDLE hItem = clc_info.findJid(jid);
- if (!hItem) {
- Utf2T wzJid(jid);
+ hItem = clc_info.hItemDefault;
+ szJid = nullptr;
+ if (dwPackets = CListGetPackets(hItem, true))
+ pList->AddRule(Else, szJid, TRUE, dwOrder++, dwPackets);
+ if (dwPackets = CListGetPackets(hItem, false))
+ pList->AddRule(Else, szJid, FALSE, dwOrder++, dwPackets);
- CLCINFOITEM cii = { 0 };
- cii.cbSize = sizeof(cii);
- cii.pszText = wzJid;
- hItem = m_clcClist.AddInfoItem(&cii);
- CListResetIcons(hItem);
- clc_info.addJid(hItem, jid);
+ pList->Reorder();
+ pList->SetModified();
}
- return hItem;
-}
-void CJabberDlgPrivacyLists::CListApplyList(CPrivacyList *pList)
-{
- clc_info.pList = pList;
+ void EnableEditorControls()
+ {
+ BOOL bListsLoaded, bListsModified;
+ {
+ mir_cslock lck(m_proto->m_privacyListManager.m_cs);
+ bListsLoaded = m_proto->m_privacyListManager.IsAllListsLoaded();
+ bListsModified = m_proto->m_privacyListManager.IsModified() || clc_info.bChanged;
+ }
- bool bHideIcons = pList ? false : true;
+ int nCurSel = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCURSEL, 0, 0);
+ int nItemCount = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCOUNT, 0, 0);
+ BOOL bSelected = nCurSel != CB_ERR;
+ BOOL bListSelected = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETCOUNT, 0, 0);
+ bListSelected = bListSelected && (SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETCURSEL, 0, 0) != LB_ERR);
+ bListSelected = bListSelected && SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETITEMDATA, SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETCURSEL, 0, 0), 0);
- CListResetIcons(clc_info.hItemDefault, bHideIcons);
- CListResetIcons(clc_info.hItemSubBoth, bHideIcons);
- CListResetIcons(clc_info.hItemSubFrom, bHideIcons);
- CListResetIcons(clc_info.hItemSubNone, bHideIcons);
- CListResetIcons(clc_info.hItemSubTo, bHideIcons);
+ m_edtNewJid.Enable(bListsLoaded && bListSelected);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_TXT_OTHERJID), bListsLoaded && bListSelected);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_ADDJID), bListsLoaded && bListSelected);
- // group handles start with 1 (0 is "root")
- for (MGROUP iGroup = 1; Clist_GroupGetName(iGroup, nullptr) != nullptr; iGroup++) {
- HANDLE hItem = m_clcClist.FindGroup(iGroup);
- if (hItem)
- CListResetIcons(hItem, bHideIcons);
- }
+ EnableWindow(GetDlgItem(m_hwnd, IDC_ADD_RULE), bListsLoaded && bListSelected);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_EDIT_RULE), bListsLoaded && bSelected);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_REMOVE_RULE), bListsLoaded && bSelected);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_UP_RULE), bListsLoaded && bSelected && nCurSel != 0);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_DOWN_RULE), bListsLoaded && bSelected && nCurSel != (nItemCount - 1));
+ EnableWindow(GetDlgItem(m_hwnd, IDC_REMOVE_LIST), bListsLoaded && bListSelected);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_APPLY), bListsLoaded && bListsModified);
- for (auto &hContact : Contacts()) {
- HANDLE hItem = m_clcClist.FindContact(hContact);
- if (hItem)
- CListResetIcons(hItem, bHideIcons);
+ if (bListsLoaded)
+ SetStatusText(TranslateT("Ready."));
}
- for (auto &it : clc_info.newJids)
- CListResetIcons(it->hItem, bHideIcons);
-
- if (!pList)
- goto lbl_return;
+ static LRESULT CALLBACK LstListsSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+ {
+ switch (msg) {
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
+ if (wParam == VK_INSERT)
+ return UIEmulateBtnClick(GetParent(hwnd), IDC_ADD_LIST);
+ if (wParam == VK_DELETE)
+ return UIEmulateBtnClick(GetParent(hwnd), IDC_REMOVE_LIST);
+ if (wParam == VK_SPACE) {
+ if (GetAsyncKeyState(VK_CONTROL))
+ return UIEmulateBtnClick(GetParent(hwnd), IDC_SET_DEFAULT);
+ return UIEmulateBtnClick(GetParent(hwnd), IDC_ACTIVATE);
+ }
- for (CPrivacyListRule *pRule = pList->GetFirstRule(); pRule; pRule = pRule->GetNext()) {
- HANDLE hItem = nullptr;
- switch (pRule->GetType()) {
- case Jid:
- hItem = CListAddContact(pRule->GetValue());
break;
+ }
+ return mir_callNextSubclass(hwnd, LstListsSubclassProc, msg, wParam, lParam);
+ }
- case Group:
- hItem = m_clcClist.FindGroup(Clist_GroupExists(Utf2T(pRule->GetValue())));
- break;
+ static LRESULT CALLBACK LstRulesSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+ {
+ switch (msg) {
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
+ if (wParam == VK_INSERT)
+ return UIEmulateBtnClick(GetParent(hwnd), IDC_ADD_RULE);
+ if (wParam == VK_DELETE)
+ return UIEmulateBtnClick(GetParent(hwnd), IDC_REMOVE_RULE);
+ if ((wParam == VK_UP) && (lParam & (1UL << 29)))
+ return UIEmulateBtnClick(GetParent(hwnd), IDC_UP_RULE);
+ if ((wParam == VK_DOWN) && (lParam & (1UL << 29)))
+ return UIEmulateBtnClick(GetParent(hwnd), IDC_DOWN_RULE);
+ if (wParam == VK_F2)
+ return UIEmulateBtnClick(GetParent(hwnd), IDC_EDIT_RULE);
- case Subscription:
- if (!mir_strcmp(pRule->GetValue(), "none")) hItem = clc_info.hItemSubNone;
- else if (!mir_strcmp(pRule->GetValue(), "from")) hItem = clc_info.hItemSubFrom;
- else if (!mir_strcmp(pRule->GetValue(), "to")) hItem = clc_info.hItemSubTo;
- else if (!mir_strcmp(pRule->GetValue(), "both")) hItem = clc_info.hItemSubBoth;
break;
+ }
+ return mir_callNextSubclass(hwnd, LstRulesSubclassProc, msg, wParam, lParam);
+ }
- case Else:
- hItem = clc_info.hItemDefault;
- break;
+ BOOL CanExit()
+ {
+ BOOL bModified;
+ {
+ mir_cslock lck(m_proto->m_privacyListManager.m_cs);
+ bModified = m_proto->m_privacyListManager.IsModified();
}
- if (!hItem)
- continue;
+ if (clc_info.bChanged)
+ bModified = TRUE;
+
+ if (!bModified)
+ return TRUE;
+
+ if (IDYES == MessageBox(m_hwnd, TranslateT("Privacy lists are not saved, discard any changes and exit?"), TranslateT("Are you sure?"), MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2))
+ return TRUE;
- DWORD dwPackets = pRule->GetPackets();
- if (!dwPackets) dwPackets = JABBER_PL_RULE_TYPE_ALL;
- CListSetupIcons(hItem, 0, dwPackets & JABBER_PL_RULE_TYPE_MESSAGE, pRule->GetAction());
- CListSetupIcons(hItem, 1, dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_IN, pRule->GetAction());
- CListSetupIcons(hItem, 2, dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_OUT, pRule->GetAction());
- CListSetupIcons(hItem, 3, dwPackets & JABBER_PL_RULE_TYPE_IQ, pRule->GetAction());
+ return FALSE;
}
-lbl_return:
- clc_info.bChanged = false;
-}
+ CCtrlMButton m_btnSimple, m_btnAdvanced, m_btnAddJid, m_btnActivate, m_btnSetDefault;
+ CCtrlMButton m_btnEditRule, m_btnAddRule, m_btnRemoveRule, m_btnUpRule, m_btnDownRule;
+ CCtrlMButton m_btnAddList, m_btnRemoveList;
+ CCtrlButton m_btnApply;
+ CCtrlListBox m_lbLists, m_lbRules;
+ CCtrlClc m_clcClist;
+ CCtrlEdit m_edtNewJid;
-DWORD CJabberDlgPrivacyLists::CListGetPackets(HANDLE hItem, bool bAction)
-{
- DWORD result = 0;
+public:
+ CJabberDlgPrivacyLists(CJabberProto *proto) :
+ CSuper(proto, IDD_PRIVACY_LISTS),
+ m_btnSimple(this, IDC_BTN_SIMPLE, proto->LoadIconEx("group"), LPGEN("Simple mode")),
+ m_btnAdvanced(this, IDC_BTN_ADVANCED, proto->LoadIconEx("sd_view_list"), LPGEN("Advanced mode")),
+ m_btnAddJid(this, IDC_ADDJID, proto->LoadIconEx("addroster"), LPGEN("Add JID")),
+ m_btnActivate(this, IDC_ACTIVATE, proto->LoadIconEx("pl_list_active"), LPGEN("Activate")),
+ m_btnSetDefault(this, IDC_SET_DEFAULT, proto->LoadIconEx("pl_list_default"), LPGEN("Set default")),
+ m_btnEditRule(this, IDC_EDIT_RULE, SKINICON_OTHER_RENAME, LPGEN("Edit rule")),
+ m_btnAddRule(this, IDC_ADD_RULE, SKINICON_OTHER_ADDCONTACT, LPGEN("Add rule")),
+ m_btnRemoveRule(this, IDC_REMOVE_RULE, SKINICON_OTHER_DELETE, LPGEN("Delete rule")),
+ m_btnUpRule(this, IDC_UP_RULE, proto->LoadIconEx("arrow_up"), LPGEN("Move rule up")),
+ m_btnDownRule(this, IDC_DOWN_RULE, proto->LoadIconEx("arrow_down"), LPGEN("Move rule down")),
+ m_btnAddList(this, IDC_ADD_LIST, SKINICON_OTHER_ADDCONTACT, LPGEN("Add list...")),
+ m_btnRemoveList(this, IDC_REMOVE_LIST, SKINICON_OTHER_DELETE, LPGEN("Remove list")),
+ m_btnApply(this, IDC_APPLY),
+ m_lbLists(this, IDC_LB_LISTS),
+ m_lbRules(this, IDC_PL_RULES_LIST),
+ m_clcClist(this, IDC_CLIST),
+ m_edtNewJid(this, IDC_NEWJID)
+ {
+ m_btnSimple.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnSimple_OnClick);
+ m_btnAdvanced.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnAdvanced_OnClick);
+ m_btnAddJid.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnAddJid_OnClick);
+ m_btnActivate.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnActivate_OnClick);
+ m_btnSetDefault.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnSetDefault_OnClick);
+ m_btnEditRule.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnEditRule_OnClick);
+ m_btnAddRule.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnAddRule_OnClick);
+ m_btnRemoveRule.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnRemoveRule_OnClick);
+ m_btnUpRule.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnUpRule_OnClick);
+ m_btnDownRule.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnDownRule_OnClick);
+ m_btnAddList.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnAddList_OnClick);
+ m_btnRemoveList.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnRemoveList_OnClick);
+ m_btnApply.OnClick = Callback(this, &CJabberDlgPrivacyLists::btnApply_OnClick);
+
+ m_lbLists.OnSelChange = Callback(this, &CJabberDlgPrivacyLists::lbLists_OnSelChange);
+ m_lbLists.OnDblClick = Callback(this, &CJabberDlgPrivacyLists::lbLists_OnDblClick);
+ m_lbRules.OnSelChange = Callback(this, &CJabberDlgPrivacyLists::lbRules_OnSelChange);
+ m_lbRules.OnDblClick = Callback(this, &CJabberDlgPrivacyLists::lbRules_OnDblClick);
+
+ m_clcClist.OnNewContact =
+ m_clcClist.OnListRebuilt = Callback(this, &CJabberDlgPrivacyLists::clcClist_OnUpdate);
+ m_clcClist.OnOptionsChanged = Callback(this, &CJabberDlgPrivacyLists::clcClist_OnOptionsChanged);
+ m_clcClist.OnClick = Callback(this, &CJabberDlgPrivacyLists::clcClist_OnClick);
+ }
- int iIcon = m_clcClist.GetExtraImage(hItem, 0);
- if (bAction && (iIcon == 1)) result |= JABBER_PL_RULE_TYPE_MESSAGE;
- else if (!bAction && (iIcon == 2)) result |= JABBER_PL_RULE_TYPE_MESSAGE;
+ bool OnInitDialog() override
+ {
+ CSuper::OnInitDialog();
- iIcon = m_clcClist.GetExtraImage(hItem, 1);
- if (bAction && (iIcon == 3)) result |= JABBER_PL_RULE_TYPE_PRESENCE_IN;
- else if (!bAction && (iIcon == 4)) result |= JABBER_PL_RULE_TYPE_PRESENCE_IN;
+ Window_SetIcon_IcoLib(m_hwnd, g_GetIconHandle(IDI_PRIVACY_LISTS));
- iIcon = m_clcClist.GetExtraImage(hItem, 2);
- if (bAction && (iIcon == 5)) result |= JABBER_PL_RULE_TYPE_PRESENCE_OUT;
- else if (!bAction && (iIcon == 6)) result |= JABBER_PL_RULE_TYPE_PRESENCE_OUT;
+ EnableWindow(GetDlgItem(m_hwnd, IDC_ADD_RULE), FALSE);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_EDIT_RULE), FALSE);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_REMOVE_RULE), FALSE);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_UP_RULE), FALSE);
+ EnableWindow(GetDlgItem(m_hwnd, IDC_DOWN_RULE), FALSE);
- iIcon = m_clcClist.GetExtraImage(hItem, 3);
- if (bAction && (iIcon == 7)) result |= JABBER_PL_RULE_TYPE_IQ;
- else if (!bAction && (iIcon == 8)) result |= JABBER_PL_RULE_TYPE_IQ;
+ m_proto->QueryPrivacyLists();
- return result;
-}
+ LOGFONT lf;
+ GetObject((HFONT)SendDlgItemMessage(m_hwnd, IDC_TXT_LISTS, WM_GETFONT, 0, 0), sizeof(lf), &lf);
+ lf.lfWeight = FW_BOLD;
+ HFONT hfnt = CreateFontIndirect(&lf);
+ SendDlgItemMessage(m_hwnd, IDC_TXT_LISTS, WM_SETFONT, (WPARAM)hfnt, TRUE);
+ SendDlgItemMessage(m_hwnd, IDC_TXT_RULES, WM_SETFONT, (WPARAM)hfnt, TRUE);
+
+ SetWindowLongPtr(m_clcClist.GetHwnd(), GWL_STYLE,
+ GetWindowLongPtr(m_clcClist.GetHwnd(), GWL_STYLE) | CLS_HIDEEMPTYGROUPS | CLS_USEGROUPS | CLS_GREYALTERNATE);
+ m_clcClist.SetExStyle(CLS_EX_DISABLEDRAGDROP | CLS_EX_TRACKSELECT);
+
+ HIMAGELIST hIml = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 9, 9);
+ ImageList_AddIcon_Icolib(hIml, Skin_LoadIcon(SKINICON_OTHER_SMALLDOT));
+ ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_msg_allow"));
+ ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_msg_deny"));
+ ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_prin_allow"));
+ ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_prin_deny"));
+ ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_prout_allow"));
+ ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_prout_deny"));
+ ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_iq_allow"));
+ ImageList_AddIcon_Icolib(hIml, m_proto->LoadIconEx("pl_iq_deny"));
+ m_clcClist.SetExtraImageList(hIml);
+ m_clcClist.SetExtraColumns(4);
+
+ m_btnSimple.MakePush();
+ m_btnAdvanced.MakePush();
-void CJabberDlgPrivacyLists::CListBuildList(CPrivacyList *pList)
-{
- if (!pList || !clc_info.bChanged)
- return;
+ CLCINFOITEM cii = { 0 };
+ cii.cbSize = sizeof(cii);
+ cii.flags = CLCIIF_GROUPFONT;
- clc_info.bChanged = false;
+ cii.pszText = TranslateT("** Default **");
+ clc_info.hItemDefault = m_clcClist.AddInfoItem(&cii);
- DWORD dwOrder = 0;
- DWORD dwPackets = 0;
+ cii.pszText = TranslateT("** Subscription: both **");
+ clc_info.hItemSubBoth = m_clcClist.AddInfoItem(&cii);
- HANDLE hItem;
- char *szJid = nullptr;
+ cii.pszText = TranslateT("** Subscription: to **");
+ clc_info.hItemSubTo = m_clcClist.AddInfoItem(&cii);
- pList->RemoveAllRules();
+ cii.pszText = TranslateT("** Subscription: from **");
+ clc_info.hItemSubFrom = m_clcClist.AddInfoItem(&cii);
- for (auto &it : clc_info.newJids) {
- hItem = it->hItem;
- szJid = it->jid;
+ cii.pszText = TranslateT("** Subscription: none **");
+ clc_info.hItemSubNone = m_clcClist.AddInfoItem(&cii);
- if (dwPackets = CListGetPackets(hItem, true))
- pList->AddRule(Jid, szJid, TRUE, dwOrder++, dwPackets);
- if (dwPackets = CListGetPackets(hItem, false))
- pList->AddRule(Jid, szJid, FALSE, dwOrder++, dwPackets);
- }
+ CListResetOptions();
+ CListFilter();
+ CListApplyList(nullptr);
- for (auto &hContact : Contacts()) {
- hItem = m_clcClist.FindContact(hContact);
+ if (m_proto->getByte("plistsWnd_simpleMode", 1)) {
+ UIShowControls(m_hwnd, idSimpleControls, SW_SHOW);
+ UIShowControls(m_hwnd, idAdvancedControls, SW_HIDE);
+ CheckDlgButton(m_hwnd, IDC_BTN_SIMPLE, BST_CHECKED);
+ }
+ else {
+ UIShowControls(m_hwnd, idSimpleControls, SW_HIDE);
+ UIShowControls(m_hwnd, idAdvancedControls, SW_SHOW);
+ CheckDlgButton(m_hwnd, IDC_BTN_ADVANCED, BST_CHECKED);
+ }
- ptrW jid(m_proto->getWStringA(hContact, "jid"));
- if (jid == nullptr)
- if ((jid = m_proto->getWStringA(hContact, "ChatRoomID")) == nullptr)
- continue;
+ mir_subclassWindow(GetDlgItem(m_hwnd, IDC_LB_LISTS), LstListsSubclassProc);
+ mir_subclassWindow(GetDlgItem(m_hwnd, IDC_PL_RULES_LIST), LstRulesSubclassProc);
- if (dwPackets = CListGetPackets(hItem, true))
- pList->AddRule(Jid, szJid, TRUE, dwOrder++, dwPackets);
- if (dwPackets = CListGetPackets(hItem, false))
- pList->AddRule(Jid, szJid, FALSE, dwOrder++, dwPackets);
+ SetStatusText(TranslateT("Loading..."));
+
+ Utils_RestoreWindowPosition(m_hwnd, 0, m_proto->m_szModuleName, "plistsWnd_sz");
+ return true;
}
- // group handles start with 1 (0 is "root")
- wchar_t *grpName;
- for (MGROUP iGroup = 1; (grpName = Clist_GroupGetName(iGroup, nullptr)) != nullptr; iGroup++) {
- hItem = m_clcClist.FindGroup(iGroup);
- if (dwPackets = CListGetPackets(hItem, true))
- pList->AddRule(Group, T2Utf(grpName), TRUE, dwOrder++, dwPackets);
- if (dwPackets = CListGetPackets(hItem, false))
- pList->AddRule(Group, T2Utf(grpName), FALSE, dwOrder++, dwPackets);
- }
-
- hItem = clc_info.hItemSubBoth;
- szJid = "both";
- if (dwPackets = CListGetPackets(hItem, true))
- pList->AddRule(Subscription, szJid, TRUE, dwOrder++, dwPackets);
- if (dwPackets = CListGetPackets(hItem, false))
- pList->AddRule(Subscription, szJid, FALSE, dwOrder++, dwPackets);
-
- hItem = clc_info.hItemSubFrom;
- szJid = "from";
- if (dwPackets = CListGetPackets(hItem, true))
- pList->AddRule(Subscription, szJid, TRUE, dwOrder++, dwPackets);
- if (dwPackets = CListGetPackets(hItem, false))
- pList->AddRule(Subscription, szJid, FALSE, dwOrder++, dwPackets);
-
- hItem = clc_info.hItemSubNone;
- szJid = "none";
- if (dwPackets = CListGetPackets(hItem, true))
- pList->AddRule(Subscription, szJid, TRUE, dwOrder++, dwPackets);
- if (dwPackets = CListGetPackets(hItem, false))
- pList->AddRule(Subscription, szJid, FALSE, dwOrder++, dwPackets);
-
- hItem = clc_info.hItemSubTo;
- szJid = "to";
- if (dwPackets = CListGetPackets(hItem, true))
- pList->AddRule(Subscription, szJid, TRUE, dwOrder++, dwPackets);
- if (dwPackets = CListGetPackets(hItem, false))
- pList->AddRule(Subscription, szJid, FALSE, dwOrder++, dwPackets);
-
- hItem = clc_info.hItemDefault;
- szJid = nullptr;
- if (dwPackets = CListGetPackets(hItem, true))
- pList->AddRule(Else, szJid, TRUE, dwOrder++, dwPackets);
- if (dwPackets = CListGetPackets(hItem, false))
- pList->AddRule(Else, szJid, FALSE, dwOrder++, dwPackets);
+ bool OnClose() override
+ {
+ if (!CanExit())
+ return false;
- pList->Reorder();
- pList->SetModified();
-}
+ DestroyWindow(m_hwnd);
+ return CSuper::OnClose();
+ }
-void CJabberDlgPrivacyLists::EnableEditorControls()
-{
- BOOL bListsLoaded, bListsModified;
+ void OnDestroy() override
{
- mir_cslock lck(m_proto->m_privacyListManager.m_cs);
- bListsLoaded = m_proto->m_privacyListManager.IsAllListsLoaded();
- bListsModified = m_proto->m_privacyListManager.IsModified() || clc_info.bChanged;
- }
-
- int nCurSel = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCURSEL, 0, 0);
- int nItemCount = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCOUNT, 0, 0);
- BOOL bSelected = nCurSel != CB_ERR;
- BOOL bListSelected = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETCOUNT, 0, 0);
- bListSelected = bListSelected && (SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETCURSEL, 0, 0) != LB_ERR);
- bListSelected = bListSelected && SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETITEMDATA, SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETCURSEL, 0, 0), 0);
-
- m_edtNewJid.Enable(bListsLoaded && bListSelected);
- EnableWindow(GetDlgItem(m_hwnd, IDC_TXT_OTHERJID), bListsLoaded && bListSelected);
- EnableWindow(GetDlgItem(m_hwnd, IDC_ADDJID), bListsLoaded && bListSelected);
-
- EnableWindow(GetDlgItem(m_hwnd, IDC_ADD_RULE), bListsLoaded && bListSelected);
- EnableWindow(GetDlgItem(m_hwnd, IDC_EDIT_RULE), bListsLoaded && bSelected);
- EnableWindow(GetDlgItem(m_hwnd, IDC_REMOVE_RULE), bListsLoaded && bSelected);
- EnableWindow(GetDlgItem(m_hwnd, IDC_UP_RULE), bListsLoaded && bSelected && nCurSel != 0);
- EnableWindow(GetDlgItem(m_hwnd, IDC_DOWN_RULE), bListsLoaded && bSelected && nCurSel != (nItemCount - 1));
- EnableWindow(GetDlgItem(m_hwnd, IDC_REMOVE_LIST), bListsLoaded && bListSelected);
- EnableWindow(GetDlgItem(m_hwnd, IDC_APPLY), bListsLoaded && bListsModified);
-
- if (bListsLoaded)
- SetStatusText(TranslateT("Ready."));
-}
+ m_proto->m_pDlgPrivacyLists = nullptr;
-LRESULT CALLBACK CJabberDlgPrivacyLists::LstListsSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- switch (msg) {
- case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- if (wParam == VK_INSERT)
- return UIEmulateBtnClick(GetParent(hwnd), IDC_ADD_LIST);
- if (wParam == VK_DELETE)
- return UIEmulateBtnClick(GetParent(hwnd), IDC_REMOVE_LIST);
- if (wParam == VK_SPACE) {
- if (GetAsyncKeyState(VK_CONTROL))
- return UIEmulateBtnClick(GetParent(hwnd), IDC_SET_DEFAULT);
- return UIEmulateBtnClick(GetParent(hwnd), IDC_ACTIVATE);
- }
+ // Wipe all data and query lists without contents
+ m_proto->m_privacyListManager.RemoveAllLists();
+ m_proto->QueryPrivacyLists();
+ m_proto->m_privacyListManager.SetModified(FALSE);
+
+ // Delete custom bold font
+ DeleteObject((HFONT)SendDlgItemMessage(m_hwnd, IDC_TXT_LISTS, WM_GETFONT, 0, 0));
- break;
+ m_proto->setByte("plistsWnd_simpleMode", IsDlgButtonChecked(m_hwnd, IDC_BTN_SIMPLE));
+
+ Utils_SaveWindowPosition(m_hwnd, 0, m_proto->m_szModuleName, "plistsWnd_sz");
+
+ CSuper::OnDestroy();
}
- return mir_callNextSubclass(hwnd, CJabberDlgPrivacyLists::LstListsSubclassProc, msg, wParam, lParam);
-}
-LRESULT CALLBACK CJabberDlgPrivacyLists::LstRulesSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- switch (msg) {
- case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- if (wParam == VK_INSERT)
- return UIEmulateBtnClick(GetParent(hwnd), IDC_ADD_RULE);
- if (wParam == VK_DELETE)
- return UIEmulateBtnClick(GetParent(hwnd), IDC_REMOVE_RULE);
- if ((wParam == VK_UP) && (lParam & (1UL << 29)))
- return UIEmulateBtnClick(GetParent(hwnd), IDC_UP_RULE);
- if ((wParam == VK_DOWN) && (lParam & (1UL << 29)))
- return UIEmulateBtnClick(GetParent(hwnd), IDC_DOWN_RULE);
- if (wParam == VK_F2)
- return UIEmulateBtnClick(GetParent(hwnd), IDC_EDIT_RULE);
-
- break;
- }
- return mir_callNextSubclass(hwnd, CJabberDlgPrivacyLists::LstRulesSubclassProc, msg, wParam, lParam);
-}
+ void OnProtoRefresh(WPARAM, LPARAM) override
+ {
+ LRESULT sel = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETCURSEL, 0, 0);
+ wchar_t *szCurrentSelectedList = nullptr;
+ if (sel != LB_ERR) {
+ LRESULT len = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETTEXTLEN, sel, 0) + 1;
+ szCurrentSelectedList = (wchar_t *)mir_alloc(len * sizeof(wchar_t));
+ SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETTEXT, sel, (LPARAM)szCurrentSelectedList);
+ }
-BOOL CJabberDlgPrivacyLists::CanExit()
-{
- BOOL bModified;
+ SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_RESETCONTENT, 0, 0);
+
+ LRESULT nItemId = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_ADDSTRING, 0, (LPARAM)TranslateT("<none>"));
+ SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SETITEMDATA, nItemId, 0);
+ {
+ mir_cslock lck(m_proto->m_privacyListManager.m_cs);
+
+ CPrivacyList *pList = m_proto->m_privacyListManager.GetFirstList();
+ while (pList) {
+ if (!pList->IsDeleted()) {
+ nItemId = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_ADDSTRING, 0, (LPARAM)pList->GetListName());
+ SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SETITEMDATA, nItemId, (LPARAM)pList);
+ }
+ pList = pList->GetNext();
+ }
+
+ if (!szCurrentSelectedList || (SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SELECTSTRING, -1, (LPARAM)szCurrentSelectedList) == LB_ERR))
+ SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SETCURSEL, 0, 0);
+ if (szCurrentSelectedList)
+ mir_free(szCurrentSelectedList);
+ }
+
+ PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_LB_LISTS, LBN_SELCHANGE), 0);
+ EnableEditorControls();
+ }
+
+ int Resizer(UTILRESIZECONTROL *urc) override
{
- mir_cslock lck(m_proto->m_privacyListManager.m_cs);
- bModified = m_proto->m_privacyListManager.IsModified();
+ switch (urc->wId) {
+ case IDC_HEADERBAR:
+ return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORX_WIDTH;
+ case IDC_BTN_SIMPLE:
+ case IDC_BTN_ADVANCED:
+ return RD_ANCHORX_RIGHT | RD_ANCHORY_TOP;
+ case IDC_LB_LISTS:
+ return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORY_HEIGHT;
+ case IDC_PL_RULES_LIST:
+ case IDC_CLIST:
+ return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORY_HEIGHT | RD_ANCHORX_WIDTH;
+ case IDC_NEWJID:
+ case IDC_CANVAS:
+ return RD_ANCHORX_LEFT | RD_ANCHORX_WIDTH | RD_ANCHORY_BOTTOM;
+ case IDC_ADD_LIST:
+ case IDC_ACTIVATE:
+ case IDC_REMOVE_LIST:
+ case IDC_SET_DEFAULT:
+ case IDC_TXT_OTHERJID:
+ case IDC_ADD_RULE:
+ case IDC_UP_RULE:
+ case IDC_EDIT_RULE:
+ case IDC_DOWN_RULE:
+ case IDC_REMOVE_RULE:
+ return RD_ANCHORX_LEFT | RD_ANCHORY_BOTTOM;
+ case IDC_ADDJID:
+ case IDC_APPLY:
+ case IDCANCEL:
+ return RD_ANCHORX_RIGHT | RD_ANCHORY_BOTTOM;
+ }
+ return CSuper::Resizer(urc);
}
- if (clc_info.bChanged)
- bModified = TRUE;
+ UI_MESSAGE_MAP(CJabberDlgPrivacyLists, CSuper);
+ UI_MESSAGE(WM_MEASUREITEM, OnWmMeasureItem);
+ UI_MESSAGE(WM_DRAWITEM, OnWmDrawItem);
+ UI_MESSAGE(WM_GETMINMAXINFO, OnWmGetMinMaxInfo);
+ UI_MESSAGE_MAP_END();
+
+ BOOL OnWmMeasureItem(UINT, WPARAM, LPARAM lParam)
+ {
+ LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT)lParam;
+ if ((lpmis->CtlID != IDC_PL_RULES_LIST) && (lpmis->CtlID != IDC_LB_LISTS))
+ return FALSE;
- if (!bModified)
- return TRUE;
+ TEXTMETRIC tm = { 0 };
+ HDC hdc = GetDC(GetDlgItem(m_hwnd, lpmis->CtlID));
+ GetTextMetrics(hdc, &tm);
+ ReleaseDC(GetDlgItem(m_hwnd, lpmis->CtlID), hdc);
+
+ if (lpmis->CtlID == IDC_PL_RULES_LIST)
+ lpmis->itemHeight = tm.tmHeight * 2;
+ else if (lpmis->CtlID == IDC_LB_LISTS)
+ lpmis->itemHeight = tm.tmHeight;
+
+ if (lpmis->itemHeight < 18)
+ lpmis->itemHeight = 18;
- if (IDYES == MessageBox(m_hwnd, TranslateT("Privacy lists are not saved, discard any changes and exit?"), TranslateT("Are you sure?"), MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2))
return TRUE;
+ }
- return FALSE;
-}
+ BOOL OnWmDrawItem(UINT, WPARAM, LPARAM lParam)
+ {
+ struct
+ {
+ wchar_t *textEng;
+ char *icon;
+ wchar_t *text;
+ }
+ static drawItems[] =
+ {
+ { LPGENW("Message"), "pl_msg_allow" },
+ { LPGENW("Presence (in)"), "pl_prin_allow" },
+ { LPGENW("Presence (out)"), "pl_prout_allow" },
+ { LPGENW("Query"), "pl_iq_allow" }
+ };
-void CJabberDlgPrivacyLists::btnSimple_OnClick(CCtrlButton *)
-{
- CheckDlgButton(m_hwnd, IDC_BTN_SIMPLE, BST_CHECKED);
- CheckDlgButton(m_hwnd, IDC_BTN_ADVANCED, BST_UNCHECKED);
- UIShowControls(m_hwnd, idSimpleControls, SW_SHOW);
- UIShowControls(m_hwnd, idAdvancedControls, SW_HIDE);
- CListApplyList(GetSelectedList(m_hwnd));
-}
+ LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
+
+ if (lpdis->CtlID == IDC_PL_RULES_LIST)
+ DrawRulesList(lpdis);
+ else if (lpdis->CtlID == IDC_LB_LISTS)
+ DrawLists(lpdis);
+ else if (lpdis->CtlID == IDC_CANVAS) {
+ int totalWidth = -5; // spacing for last item
+ for (auto &it : drawItems) {
+ SIZE sz = { 0 };
+ it.text = TranslateW(it.textEng);
+ GetTextExtentPoint32(lpdis->hDC, it.text, (int)mir_wstrlen(it.text), &sz);
+ totalWidth += sz.cx + 18 + 5; // 18 pixels for icon, 5 pixel spacing
+ }
-void CJabberDlgPrivacyLists::btnAdvanced_OnClick(CCtrlButton *)
-{
- CheckDlgButton(m_hwnd, IDC_BTN_SIMPLE, BST_UNCHECKED);
- CheckDlgButton(m_hwnd, IDC_BTN_ADVANCED, BST_CHECKED);
- UIShowControls(m_hwnd, idSimpleControls, SW_HIDE);
- UIShowControls(m_hwnd, idAdvancedControls, SW_SHOW);
- CListBuildList(GetSelectedList(m_hwnd));
- PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_LB_LISTS, LBN_SELCHANGE), 0);
-}
+ COLORREF clText = GetSysColor(COLOR_BTNTEXT);
+ RECT rc = lpdis->rcItem;
+ rc.left = (rc.left + rc.right - totalWidth) / 2;
-void CJabberDlgPrivacyLists::btnAddJid_OnClick(CCtrlButton *)
-{
- CListAddContact(ptrA(m_edtNewJid.GetTextU()));
- m_edtNewJid.SetTextA("");
-}
+ for (auto &it : drawItems) {
+ DrawIconEx(lpdis->hDC, rc.left, (rc.top + rc.bottom - 16) / 2, m_proto->LoadIconEx(it.icon),
+ 16, 16, 0, nullptr, DI_NORMAL);
+ rc.left += 18;
+ DrawNextRulePart(lpdis->hDC, clText, it.text, &rc);
+ rc.left += 5;
+ }
+ }
+ else return FALSE;
-void CJabberDlgPrivacyLists::btnActivate_OnClick(CCtrlButton *)
-{
- if (!m_proto->m_bJabberOnline)
- return;
+ return TRUE;
+ }
- mir_cslockfull lck(m_proto->m_privacyListManager.m_cs);
+ BOOL OnWmGetMinMaxInfo(UINT, WPARAM, LPARAM lParam)
+ {
+ LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;
+ lpmmi->ptMinTrackSize.x = 550;
+ lpmmi->ptMinTrackSize.y = 390;
+ return 0;
+ }
- CPrivacyList *pList = GetSelectedList(m_hwnd);
- if (pList && pList->IsModified()) {
- lck.unlock();
- MessageBox(m_hwnd, TranslateT("Please save list before activating"), TranslateT("First, save the list"), MB_OK | MB_ICONSTOP);
- return;
+ void btnSimple_OnClick(CCtrlButton*)
+ {
+ CheckDlgButton(m_hwnd, IDC_BTN_SIMPLE, BST_CHECKED);
+ CheckDlgButton(m_hwnd, IDC_BTN_ADVANCED, BST_UNCHECKED);
+ UIShowControls(m_hwnd, idSimpleControls, SW_SHOW);
+ UIShowControls(m_hwnd, idAdvancedControls, SW_HIDE);
+ CListApplyList(GetSelectedList(m_hwnd));
}
- EnableWindow(GetDlgItem(m_hwnd, IDC_ACTIVATE), FALSE);
- SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_ACTIVATE), GWLP_USERDATA, (LONG_PTR)pList);
- XmlNodeIq iq(m_proto->AddIQ(&CJabberProto::OnIqResultPrivacyListActive, JABBER_IQ_TYPE_SET, nullptr, 0, -1, pList));
- TiXmlElement *query = iq << XQUERY(JABBER_FEAT_PRIVACY_LISTS);
- TiXmlElement *active = query << XCHILD("active");
- if (pList)
- active << XATTR("name", pList->GetListName());
- lck.unlock();
- SetStatusText(TranslateW(JABBER_PL_BUSY_MSG));
- m_proto->m_ThreadInfo->send(iq);
-}
+ void btnAdvanced_OnClick(CCtrlButton*)
+ {
+ CheckDlgButton(m_hwnd, IDC_BTN_SIMPLE, BST_UNCHECKED);
+ CheckDlgButton(m_hwnd, IDC_BTN_ADVANCED, BST_CHECKED);
+ UIShowControls(m_hwnd, idSimpleControls, SW_HIDE);
+ UIShowControls(m_hwnd, idAdvancedControls, SW_SHOW);
+ CListBuildList(GetSelectedList(m_hwnd));
+ PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_LB_LISTS, LBN_SELCHANGE), 0);
+ }
-void CJabberDlgPrivacyLists::btnSetDefault_OnClick(CCtrlButton *)
-{
- if (!m_proto->m_bJabberOnline)
- return;
+ void btnAddJid_OnClick(CCtrlButton*)
+ {
+ CListAddContact(ptrA(m_edtNewJid.GetTextU()));
+ m_edtNewJid.SetTextA("");
+ }
- mir_cslockfull lck(m_proto->m_privacyListManager.m_cs);
+ void btnActivate_OnClick(CCtrlButton*)
+ {
+ if (!m_proto->m_bJabberOnline)
+ return;
+
+ mir_cslockfull lck(m_proto->m_privacyListManager.m_cs);
+
+ CPrivacyList *pList = GetSelectedList(m_hwnd);
+ if (pList && pList->IsModified()) {
+ lck.unlock();
+ MessageBox(m_hwnd, TranslateT("Please save list before activating"), TranslateT("First, save the list"), MB_OK | MB_ICONSTOP);
+ return;
+ }
+ EnableWindow(GetDlgItem(m_hwnd, IDC_ACTIVATE), FALSE);
+ SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_ACTIVATE), GWLP_USERDATA, (LONG_PTR)pList);
+ XmlNodeIq iq(m_proto->AddIQ(&CJabberProto::OnIqResultPrivacyListActive, JABBER_IQ_TYPE_SET, nullptr, 0, -1, pList));
+ TiXmlElement *query = iq << XQUERY(JABBER_FEAT_PRIVACY_LISTS);
+ TiXmlElement *active = query << XCHILD("active");
+ if (pList)
+ active << XATTR("name", pList->GetListName());
- CPrivacyList *pList = GetSelectedList(m_hwnd);
- if (pList && pList->IsModified()) {
lck.unlock();
- MessageBox(m_hwnd, TranslateT("Please save list before you make it the default list"), TranslateT("First, save the list"), MB_OK | MB_ICONSTOP);
- return;
+ SetStatusText(TranslateW(JABBER_PL_BUSY_MSG));
+ m_proto->m_ThreadInfo->send(iq);
}
- EnableWindow(GetDlgItem(m_hwnd, IDC_SET_DEFAULT), FALSE);
- SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_SET_DEFAULT), GWLP_USERDATA, (LONG_PTR)pList);
- XmlNodeIq iq(m_proto->AddIQ(&CJabberProto::OnIqResultPrivacyListDefault, JABBER_IQ_TYPE_SET, nullptr, 0, -1, pList));
- TiXmlElement *query = iq << XQUERY(JABBER_FEAT_PRIVACY_LISTS);
- TiXmlElement *defaultTag = query << XCHILD("default");
- if (pList)
- defaultTag->SetAttribute("name", pList->GetListName());
+ void btnSetDefault_OnClick(CCtrlButton*)
+ {
+ if (!m_proto->m_bJabberOnline)
+ return;
- lck.unlock();
- SetStatusText(TranslateW(JABBER_PL_BUSY_MSG));
- m_proto->m_ThreadInfo->send(iq);
-}
+ mir_cslockfull lck(m_proto->m_privacyListManager.m_cs);
-void CJabberDlgPrivacyLists::lbLists_OnSelChange(CCtrlListBox *)
-{
- LRESULT nCurSel = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETCURSEL, 0, 0);
- if (nCurSel == LB_ERR)
- return;
+ CPrivacyList *pList = GetSelectedList(m_hwnd);
+ if (pList && pList->IsModified()) {
+ lck.unlock();
+ MessageBox(m_hwnd, TranslateT("Please save list before you make it the default list"), TranslateT("First, save the list"), MB_OK | MB_ICONSTOP);
+ return;
+ }
+ EnableWindow(GetDlgItem(m_hwnd, IDC_SET_DEFAULT), FALSE);
+ SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_SET_DEFAULT), GWLP_USERDATA, (LONG_PTR)pList);
- LRESULT nErr = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETITEMDATA, nCurSel, 0);
- if (nErr == LB_ERR)
- return;
- if (nErr == 0) {
- if (IsWindowVisible(m_clcClist.GetHwnd())) {
- CListBuildList(clc_info.pList);
- CListApplyList(nullptr);
+ XmlNodeIq iq(m_proto->AddIQ(&CJabberProto::OnIqResultPrivacyListDefault, JABBER_IQ_TYPE_SET, nullptr, 0, -1, pList));
+ TiXmlElement *query = iq << XQUERY(JABBER_FEAT_PRIVACY_LISTS);
+ TiXmlElement *defaultTag = query << XCHILD("default");
+ if (pList)
+ defaultTag->SetAttribute("name", pList->GetListName());
+
+ lck.unlock();
+ SetStatusText(TranslateW(JABBER_PL_BUSY_MSG));
+ m_proto->m_ThreadInfo->send(iq);
+ }
+
+ void lbLists_OnSelChange(CCtrlListBox *)
+ {
+ LRESULT nCurSel = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETCURSEL, 0, 0);
+ if (nCurSel == LB_ERR)
+ return;
+
+ LRESULT nErr = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_GETITEMDATA, nCurSel, 0);
+ if (nErr == LB_ERR)
+ return;
+ if (nErr == 0) {
+ if (IsWindowVisible(m_clcClist.GetHwnd())) {
+ CListBuildList(clc_info.pList);
+ CListApplyList(nullptr);
+ }
+ else {
+ EnableWindow(GetDlgItem(m_hwnd, IDC_PL_RULES_LIST), FALSE);
+ SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_RESETCONTENT, 0, 0);
+ SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_ADDSTRING, 0, (LPARAM)TranslateT("No list selected"));
+ }
+ EnableEditorControls();
+ return;
}
- else {
- EnableWindow(GetDlgItem(m_hwnd, IDC_PL_RULES_LIST), FALSE);
- SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_RESETCONTENT, 0, 0);
- SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_ADDSTRING, 0, (LPARAM)TranslateT("No list selected"));
+ {
+ mir_cslock lck(m_proto->m_privacyListManager.m_cs);
+ if (IsWindowVisible(m_clcClist.GetHwnd())) {
+ CListBuildList(clc_info.pList);
+ CListApplyList((CPrivacyList*)nErr);
+ }
+ else ShowAdvancedList((CPrivacyList*)nErr);
}
EnableEditorControls();
- return;
}
+
+ void lbLists_OnDblClick(CCtrlListBox*)
+ {
+ PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_ACTIVATE, 0), 0);
+ }
+
+ void lbRules_OnSelChange(CCtrlListBox*)
+ {
+ EnableEditorControls();
+ }
+
+ void lbRules_OnDblClick(CCtrlListBox*)
+ {
+ PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_EDIT_RULE, 0), 0);
+ }
+
+ void btnEditRule_OnClick(CCtrlButton*)
{
+ // FIXME: potential deadlock due to PLM lock while editing rule
mir_cslock lck(m_proto->m_privacyListManager.m_cs);
- if (IsWindowVisible(m_clcClist.GetHwnd())) {
- CListBuildList(clc_info.pList);
- CListApplyList((CPrivacyList*)nErr);
+
+ CPrivacyListRule* pRule = GetSelectedRule(m_hwnd);
+ CPrivacyList *pList = GetSelectedList(m_hwnd);
+ if (pList && pRule) {
+ CJabberDlgPrivacyRule dlgPrivacyRule(m_proto, m_hwnd, pRule);
+ int nResult = dlgPrivacyRule.DoModal();
+ if (nResult) {
+ pList->SetModified();
+ PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
+ }
}
- else ShowAdvancedList((CPrivacyList*)nErr);
}
- EnableEditorControls();
-}
-void CJabberDlgPrivacyLists::lbLists_OnDblClick(CCtrlListBox*)
-{
- PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_ACTIVATE, 0), 0);
-}
+ void btnAddRule_OnClick(CCtrlButton*)
+ {
+ // FIXME: potential deadlock due to PLM lock while editing rule
+ mir_cslock lck(m_proto->m_privacyListManager.m_cs);
-void CJabberDlgPrivacyLists::lbRules_OnSelChange(CCtrlListBox*)
-{
- EnableEditorControls();
-}
+ CPrivacyList *pList = GetSelectedList(m_hwnd);
+ if (pList) {
+ CPrivacyListRule* pRule = new CPrivacyListRule(m_proto, Jid, "", FALSE);
+ CJabberDlgPrivacyRule dlgPrivacyRule(m_proto, m_hwnd, pRule);
+ int nResult = dlgPrivacyRule.DoModal();
+ if (nResult) {
+ pList->AddRule(pRule);
+ pList->Reorder();
+ pList->SetModified();
+ PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
+ }
+ else delete pRule;
+ }
+ }
-void CJabberDlgPrivacyLists::lbRules_OnDblClick(CCtrlListBox*)
-{
- PostMessage(m_hwnd, WM_COMMAND, MAKEWPARAM(IDC_EDIT_RULE, 0), 0);
-}
+ void btnRemoveRule_OnClick(CCtrlButton*)
+ {
+ mir_cslock lck(m_proto->m_privacyListManager.m_cs);
-void CJabberDlgPrivacyLists::btnEditRule_OnClick(CCtrlButton*)
-{
- // FIXME: potential deadlock due to PLM lock while editing rule
- mir_cslock lck(m_proto->m_privacyListManager.m_cs);
-
- CPrivacyListRule* pRule = GetSelectedRule(m_hwnd);
- CPrivacyList *pList = GetSelectedList(m_hwnd);
- if (pList && pRule) {
- CJabberDlgPrivacyRule dlgPrivacyRule(m_proto, m_hwnd, pRule);
- int nResult = dlgPrivacyRule.DoModal();
- if (nResult) {
+ CPrivacyList *pList = GetSelectedList(m_hwnd);
+ CPrivacyListRule* pRule = GetSelectedRule(m_hwnd);
+
+ if (pList && pRule) {
+ pList->RemoveRule(pRule);
+ int nCurSel = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCURSEL, 0, 0);
+ int nItemCount = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCOUNT, 0, 0);
+ SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_SETCURSEL, nCurSel != nItemCount - 1 ? nCurSel : nCurSel - 1, 0);
+ pList->Reorder();
pList->SetModified();
PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
}
}
-}
-void CJabberDlgPrivacyLists::btnAddRule_OnClick(CCtrlButton*)
-{
- // FIXME: potential deadlock due to PLM lock while editing rule
- mir_cslock lck(m_proto->m_privacyListManager.m_cs);
-
- CPrivacyList *pList = GetSelectedList(m_hwnd);
- if (pList) {
- CPrivacyListRule* pRule = new CPrivacyListRule(m_proto, Jid, "", FALSE);
- CJabberDlgPrivacyRule dlgPrivacyRule(m_proto, m_hwnd, pRule);
- int nResult = dlgPrivacyRule.DoModal();
- if (nResult) {
- pList->AddRule(pRule);
+ void btnUpRule_OnClick(CCtrlButton*)
+ {
+ mir_cslock lck(m_proto->m_privacyListManager.m_cs);
+
+ CPrivacyList *pList = GetSelectedList(m_hwnd);
+ CPrivacyListRule* pRule = GetSelectedRule(m_hwnd);
+ int nCurSel = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCURSEL, 0, 0);
+
+ if (pList && pRule && nCurSel) {
+ pRule->SetOrder(pRule->GetOrder() - 11);
+ SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_SETCURSEL, nCurSel - 1, 0);
pList->Reorder();
pList->SetModified();
PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
}
- else delete pRule;
}
-}
-
-void CJabberDlgPrivacyLists::btnRemoveRule_OnClick(CCtrlButton*)
-{
- mir_cslock lck(m_proto->m_privacyListManager.m_cs);
- CPrivacyList *pList = GetSelectedList(m_hwnd);
- CPrivacyListRule* pRule = GetSelectedRule(m_hwnd);
+ void btnDownRule_OnClick(CCtrlButton*)
+ {
+ mir_cslock lck(m_proto->m_privacyListManager.m_cs);
- if (pList && pRule) {
- pList->RemoveRule(pRule);
+ CPrivacyList *pList = GetSelectedList(m_hwnd);
+ CPrivacyListRule* pRule = GetSelectedRule(m_hwnd);
int nCurSel = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCURSEL, 0, 0);
int nItemCount = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCOUNT, 0, 0);
- SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_SETCURSEL, nCurSel != nItemCount - 1 ? nCurSel : nCurSel - 1, 0);
- pList->Reorder();
- pList->SetModified();
- PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
- }
-}
-
-void CJabberDlgPrivacyLists::btnUpRule_OnClick(CCtrlButton*)
-{
- mir_cslock lck(m_proto->m_privacyListManager.m_cs);
- CPrivacyList *pList = GetSelectedList(m_hwnd);
- CPrivacyListRule* pRule = GetSelectedRule(m_hwnd);
- int nCurSel = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCURSEL, 0, 0);
-
- if (pList && pRule && nCurSel) {
- pRule->SetOrder(pRule->GetOrder() - 11);
- SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_SETCURSEL, nCurSel - 1, 0);
- pList->Reorder();
- pList->SetModified();
- PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
+ if (pList && pRule && (nCurSel != (nItemCount - 1))) {
+ pRule->SetOrder(pRule->GetOrder() + 11);
+ SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_SETCURSEL, nCurSel + 1, 0);
+ pList->Reorder();
+ pList->SetModified();
+ PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
+ }
}
-}
-
-void CJabberDlgPrivacyLists::btnDownRule_OnClick(CCtrlButton*)
-{
- mir_cslock lck(m_proto->m_privacyListManager.m_cs);
- CPrivacyList *pList = GetSelectedList(m_hwnd);
- CPrivacyListRule* pRule = GetSelectedRule(m_hwnd);
- int nCurSel = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCURSEL, 0, 0);
- int nItemCount = SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_GETCOUNT, 0, 0);
+ void btnAddList_OnClick(CCtrlButton*)
+ {
+ // FIXME: line length is hard coded in dialog procedure
+ CJabberDlgPrivacyAddList dlgPrivacyAddList(m_proto, m_hwnd);
+ int nRetVal = dlgPrivacyAddList.DoModal();
+ if (nRetVal && mir_strlen(dlgPrivacyAddList.szLine)) {
+ mir_cslockfull lck(m_proto->m_privacyListManager.m_cs);
+
+ CPrivacyList *pList = m_proto->m_privacyListManager.FindList(dlgPrivacyAddList.szLine);
+ if (pList == nullptr) {
+ m_proto->m_privacyListManager.AddList(dlgPrivacyAddList.szLine);
+ pList = m_proto->m_privacyListManager.FindList(dlgPrivacyAddList.szLine);
+ if (pList) {
+ pList->SetModified(TRUE);
+ pList->SetLoaded(TRUE);
+ }
+ }
+ if (pList)
+ pList->SetDeleted(FALSE);
+ int nSelected = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SELECTSTRING, -1, (LPARAM)dlgPrivacyAddList.szLine);
+ if (nSelected == CB_ERR) {
+ nSelected = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_ADDSTRING, 0, (LPARAM)dlgPrivacyAddList.szLine);
+ SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SETITEMDATA, nSelected, (LPARAM)pList);
+ SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SETCURSEL, nSelected, 0);
+ }
- if (pList && pRule && (nCurSel != (nItemCount - 1))) {
- pRule->SetOrder(pRule->GetOrder() + 11);
- SendDlgItemMessage(m_hwnd, IDC_PL_RULES_LIST, LB_SETCURSEL, nCurSel + 1, 0);
- pList->Reorder();
- pList->SetModified();
- PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
+ lck.unlock();
+ PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
+ }
}
-}
-void CJabberDlgPrivacyLists::btnAddList_OnClick(CCtrlButton*)
-{
- // FIXME: line length is hard coded in dialog procedure
- CJabberDlgPrivacyAddList dlgPrivacyAddList(m_proto, m_hwnd);
- int nRetVal = dlgPrivacyAddList.DoModal();
- if (nRetVal && mir_strlen(dlgPrivacyAddList.szLine)) {
+ void btnRemoveList_OnClick(CCtrlButton*)
+ {
mir_cslockfull lck(m_proto->m_privacyListManager.m_cs);
- CPrivacyList *pList = m_proto->m_privacyListManager.FindList(dlgPrivacyAddList.szLine);
- if (pList == nullptr) {
- m_proto->m_privacyListManager.AddList(dlgPrivacyAddList.szLine);
- pList = m_proto->m_privacyListManager.FindList(dlgPrivacyAddList.szLine);
- if (pList) {
- pList->SetModified(TRUE);
- pList->SetLoaded(TRUE);
+ CPrivacyList *pList = GetSelectedList(m_hwnd);
+ if (pList) {
+ char *szListName = pList->GetListName();
+ if ((m_proto->m_privacyListManager.GetActiveListName() && !mir_strcmp(szListName, m_proto->m_privacyListManager.GetActiveListName())) ||
+ (m_proto->m_privacyListManager.GetDefaultListName() && !mir_strcmp(szListName, m_proto->m_privacyListManager.GetDefaultListName()))) {
+ lck.unlock();
+ MessageBox(m_hwnd, TranslateT("Can't remove active or default list"), TranslateT("Sorry"), MB_OK | MB_ICONSTOP);
+ return;
}
- }
- if (pList)
- pList->SetDeleted(FALSE);
- int nSelected = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SELECTSTRING, -1, (LPARAM)dlgPrivacyAddList.szLine);
- if (nSelected == CB_ERR) {
- nSelected = SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_ADDSTRING, 0, (LPARAM)dlgPrivacyAddList.szLine);
- SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SETITEMDATA, nSelected, (LPARAM)pList);
- SendDlgItemMessage(m_hwnd, IDC_LB_LISTS, LB_SETCURSEL, nSelected, 0);
+ pList->SetDeleted();
+ pList->SetModified();
}
lck.unlock();
PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
}
-}
-void CJabberDlgPrivacyLists::btnRemoveList_OnClick(CCtrlButton *)
-{
- mir_cslockfull lck(m_proto->m_privacyListManager.m_cs);
-
- CPrivacyList *pList = GetSelectedList(m_hwnd);
- if (pList) {
- char *szListName = pList->GetListName();
- if ((m_proto->m_privacyListManager.GetActiveListName() && !mir_strcmp(szListName, m_proto->m_privacyListManager.GetActiveListName())) ||
- (m_proto->m_privacyListManager.GetDefaultListName() && !mir_strcmp(szListName, m_proto->m_privacyListManager.GetDefaultListName()))) {
- lck.unlock();
- MessageBox(m_hwnd, TranslateT("Can't remove active or default list"), TranslateT("Sorry"), MB_OK | MB_ICONSTOP);
+ void btnApply_OnClick(CCtrlButton*)
+ {
+ if (!m_proto->m_bJabberOnline) {
+ SetStatusText(TranslateT("Unable to save list because you are currently offline."));
return;
}
- pList->SetDeleted();
- pList->SetModified();
- }
+ {
+ mir_cslock lck(m_proto->m_privacyListManager.m_cs);
+ if (IsWindowVisible(m_clcClist.GetHwnd()))
+ CListBuildList(clc_info.pList);
+
+ CPrivacyListModifyUserParam *pUserData = nullptr;
+ CPrivacyList *pList = m_proto->m_privacyListManager.GetFirstList();
+ while (pList) {
+ if (pList->IsModified()) {
+ CPrivacyListRule* pRule = pList->GetFirstRule();
+ if (!pRule)
+ pList->SetDeleted();
+ if (pList->IsDeleted()) {
+ pList->RemoveAllRules();
+ pRule = nullptr;
+ }
+ pList->SetModified(FALSE);
+
+ if (!pUserData)
+ pUserData = new CPrivacyListModifyUserParam();
+
+ pUserData->m_dwCount++;
+
+ XmlNodeIq iq(m_proto->AddIQ(&CJabberProto::OnIqResultPrivacyListModify, JABBER_IQ_TYPE_SET, nullptr, 0, -1, pUserData));
+ TiXmlElement *query = iq << XQUERY(JABBER_FEAT_PRIVACY_LISTS);
+ TiXmlElement *listTag = query << XCHILD("list") << XATTR("name", pList->GetListName());
+
+ while (pRule) {
+ TiXmlElement *itemTag = listTag << XCHILD("item");
+ switch (pRule->GetType()) {
+ case Jid:
+ itemTag << XATTR("type", "jid");
+ break;
+ case Group:
+ itemTag << XATTR("type", "group");
+ break;
+ case Subscription:
+ itemTag << XATTR("type", "subscription");
+ break;
+ }
+ if (pRule->GetType() != Else)
+ itemTag << XATTR("value", pRule->GetValue());
+ if (pRule->GetAction())
+ itemTag << XATTR("action", "allow");
+ else
+ itemTag << XATTR("action", "deny");
+ itemTag << XATTRI("order", pRule->GetOrder());
+ DWORD dwPackets = pRule->GetPackets();
+ if (dwPackets != JABBER_PL_RULE_TYPE_ALL) {
+ if (dwPackets & JABBER_PL_RULE_TYPE_IQ)
+ itemTag << XCHILD("iq");
+ if (dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_IN)
+ itemTag << XCHILD("presence-in");
+ if (dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_OUT)
+ itemTag << XCHILD("presence-out");
+ if (dwPackets & JABBER_PL_RULE_TYPE_MESSAGE)
+ itemTag << XCHILD("message");
+ }
+ pRule = pRule->GetNext();
+ }
- lck.unlock();
- PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
-}
+ m_proto->m_ThreadInfo->send(iq);
+ }
+ pList = pList->GetNext();
+ }
+ }
-void CJabberDlgPrivacyLists::btnApply_OnClick(CCtrlButton *)
-{
- if (!m_proto->m_bJabberOnline) {
- SetStatusText(TranslateT("Unable to save list because you are currently offline."));
- return;
+ SetStatusText(TranslateW(JABBER_PL_BUSY_MSG));
+ PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
}
+ void OnCommand_Close(HWND /*hwndCtrl*/, WORD /*idCtrl*/, WORD /*idCode*/)
{
- mir_cslock lck(m_proto->m_privacyListManager.m_cs);
if (IsWindowVisible(m_clcClist.GetHwnd()))
CListBuildList(clc_info.pList);
- CPrivacyListModifyUserParam *pUserData = nullptr;
- CPrivacyList *pList = m_proto->m_privacyListManager.GetFirstList();
- while (pList) {
- if (pList->IsModified()) {
- CPrivacyListRule* pRule = pList->GetFirstRule();
- if (!pRule)
- pList->SetDeleted();
- if (pList->IsDeleted()) {
- pList->RemoveAllRules();
- pRule = nullptr;
- }
- pList->SetModified(FALSE);
-
- if (!pUserData)
- pUserData = new CPrivacyListModifyUserParam();
-
- pUserData->m_dwCount++;
-
- XmlNodeIq iq(m_proto->AddIQ(&CJabberProto::OnIqResultPrivacyListModify, JABBER_IQ_TYPE_SET, nullptr, 0, -1, pUserData));
- TiXmlElement *query = iq << XQUERY(JABBER_FEAT_PRIVACY_LISTS);
- TiXmlElement *listTag = query << XCHILD("list") << XATTR("name", pList->GetListName());
-
- while (pRule) {
- TiXmlElement *itemTag = listTag << XCHILD("item");
- switch (pRule->GetType()) {
- case Jid:
- itemTag << XATTR("type", "jid");
- break;
- case Group:
- itemTag << XATTR("type", "group");
- break;
- case Subscription:
- itemTag << XATTR("type", "subscription");
- break;
- }
- if (pRule->GetType() != Else)
- itemTag << XATTR("value", pRule->GetValue());
- if (pRule->GetAction())
- itemTag << XATTR("action", "allow");
- else
- itemTag << XATTR("action", "deny");
- itemTag << XATTRI("order", pRule->GetOrder());
- DWORD dwPackets = pRule->GetPackets();
- if (dwPackets != JABBER_PL_RULE_TYPE_ALL) {
- if (dwPackets & JABBER_PL_RULE_TYPE_IQ)
- itemTag << XCHILD("iq");
- if (dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_IN)
- itemTag << XCHILD("presence-in");
- if (dwPackets & JABBER_PL_RULE_TYPE_PRESENCE_OUT)
- itemTag << XCHILD("presence-out");
- if (dwPackets & JABBER_PL_RULE_TYPE_MESSAGE)
- itemTag << XCHILD("message");
- }
- pRule = pRule->GetNext();
- }
-
- m_proto->m_ThreadInfo->send(iq);
- }
- pList = pList->GetNext();
- }
+ if (CanExit())
+ DestroyWindow(m_hwnd);
}
- SetStatusText(TranslateW(JABBER_PL_BUSY_MSG));
- PostMessage(m_hwnd, WM_JABBER_REFRESH, 0, 0);
-}
-
-void CJabberDlgPrivacyLists::OnCommand_Close(HWND /*hwndCtrl*/, WORD /*idCtrl*/, WORD /*idCode*/)
-{
- if (IsWindowVisible(m_clcClist.GetHwnd()))
- CListBuildList(clc_info.pList);
-
- if (CanExit())
- DestroyWindow(m_hwnd);
-}
-
-void CJabberDlgPrivacyLists::clcClist_OnUpdate(CCtrlClc::TEventInfo*)
-{
- CListFilter();
- CListApplyList(GetSelectedList(m_hwnd));
-}
+ void clcClist_OnUpdate(CCtrlClc::TEventInfo*)
+ {
+ CListFilter();
+ CListApplyList(GetSelectedList(m_hwnd));
+ }
-void CJabberDlgPrivacyLists::clcClist_OnOptionsChanged(CCtrlClc::TEventInfo*)
-{
- CListResetOptions();
- CListApplyList(GetSelectedList(m_hwnd));
-}
+ void clcClist_OnOptionsChanged(CCtrlClc::TEventInfo*)
+ {
+ CListResetOptions();
+ CListApplyList(GetSelectedList(m_hwnd));
+ }
-void CJabberDlgPrivacyLists::clcClist_OnClick(CCtrlClc::TEventInfo *evt)
-{
- if (evt->info->iColumn == -1)
- return;
+ void clcClist_OnClick(CCtrlClc::TEventInfo *evt)
+ {
+ if (evt->info->iColumn == -1)
+ return;
- DWORD hitFlags;
- HANDLE hItem = m_clcClist.HitTest(evt->info->pt.x, evt->info->pt.y, &hitFlags);
- if (hItem == nullptr || !(hitFlags & CLCHT_ONITEMEXTRA))
- return;
+ DWORD hitFlags;
+ HANDLE hItem = m_clcClist.HitTest(evt->info->pt.x, evt->info->pt.y, &hitFlags);
+ if (hItem == nullptr || !(hitFlags & CLCHT_ONITEMEXTRA))
+ return;
- int iImage = m_clcClist.GetExtraImage(hItem, evt->info->iColumn);
- if (iImage != EMPTY_EXTRA_ICON) {
- if (iImage == 0)
- iImage = evt->info->iColumn * 2 + 2;
- else if (iImage == evt->info->iColumn * 2 + 2)
- iImage = evt->info->iColumn * 2 + 1;
- else
- iImage = 0;
+ int iImage = m_clcClist.GetExtraImage(hItem, evt->info->iColumn);
+ if (iImage != EMPTY_EXTRA_ICON) {
+ if (iImage == 0)
+ iImage = evt->info->iColumn * 2 + 2;
+ else if (iImage == evt->info->iColumn * 2 + 2)
+ iImage = evt->info->iColumn * 2 + 1;
+ else
+ iImage = 0;
- m_clcClist.SetExtraImage(hItem, evt->info->iColumn, iImage);
+ m_clcClist.SetExtraImage(hItem, evt->info->iColumn, iImage);
- clc_info.bChanged = true;
+ clc_info.bChanged = true;
- EnableEditorControls();
+ EnableEditorControls();
+ }
}
-}
+};
-int CJabberDlgPrivacyLists::Resizer(UTILRESIZECONTROL *urc)
-{
- switch (urc->wId) {
- case IDC_HEADERBAR:
- return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORX_WIDTH;
- case IDC_BTN_SIMPLE:
- case IDC_BTN_ADVANCED:
- return RD_ANCHORX_RIGHT | RD_ANCHORY_TOP;
- case IDC_LB_LISTS:
- return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORY_HEIGHT;
- case IDC_PL_RULES_LIST:
- case IDC_CLIST:
- return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORY_HEIGHT | RD_ANCHORX_WIDTH;
- case IDC_NEWJID:
- case IDC_CANVAS:
- return RD_ANCHORX_LEFT | RD_ANCHORX_WIDTH | RD_ANCHORY_BOTTOM;
- case IDC_ADD_LIST:
- case IDC_ACTIVATE:
- case IDC_REMOVE_LIST:
- case IDC_SET_DEFAULT:
- case IDC_TXT_OTHERJID:
- case IDC_ADD_RULE:
- case IDC_UP_RULE:
- case IDC_EDIT_RULE:
- case IDC_DOWN_RULE:
- case IDC_REMOVE_RULE:
- return RD_ANCHORX_LEFT | RD_ANCHORY_BOTTOM;
- case IDC_ADDJID:
- case IDC_APPLY:
- case IDCANCEL:
- return RD_ANCHORX_RIGHT | RD_ANCHORY_BOTTOM;
- }
- return CSuper::Resizer(urc);
-}
+/////////////////////////////////////////////////////////////////////////////////////////
INT_PTR __cdecl CJabberProto::OnMenuHandlePrivacyLists(WPARAM, LPARAM)
{
|