2 * @file IgnoredSubstitutionsDlg.cpp
4 * @brief Implementation of Ignored Substitutions dialog
8 #include "IgnoredSubstitutionsList.h"
10 #include "IgnoredSubstitutionsDlg.h"
11 #include <Poco/Exception.h>
17 /** @brief Location for file compare specific help to open. */
18 static TCHAR FilterHelpLocation[] = _T("::/htmlhelp/Filters.html");
20 /////////////////////////////////////////////////////////////////////////////
21 // CPropLineFilter property page
23 IMPLEMENT_DYNAMIC(IgnoredSubstitutionsDlg, CTrPropertyPage)
28 IgnoredSubstitutionsDlg::IgnoredSubstitutionsDlg()
29 : CTrPropertyPage(IgnoredSubstitutionsDlg::IDD)
30 , m_pIgnoredSubstitutionsList(nullptr)
32 //{{AFX_DATA_INIT(IgnoredSubstitutionsFiltersDlg)
35 m_strCaption = theApp.LoadDialogCaption(m_lpszTemplateName).c_str();
36 m_psp.pszTitle = m_strCaption;
37 m_psp.dwFlags |= PSP_USETITLE;
38 m_psp.hIcon = AfxGetApp()->LoadIcon(IDI_LINEFILTER);
39 m_psp.dwFlags |= PSP_USEHICON;
42 void IgnoredSubstitutionsDlg::DoDataExchange(CDataExchange* pDX)
44 CPropertyPage::DoDataExchange(pDX);
45 //{{AFX_DATA_MAP(IgnoredSubstitutionsFiltersDlg)
46 DDX_Check(pDX, IDC_IGNORED_SUSBSTITUTIONS_ENABLED, m_bEnabled);
47 DDX_Control(pDX, IDC_IGNORED_SUBSTITUTIONS_FILTER, m_listFilters);
51 BEGIN_MESSAGE_MAP(IgnoredSubstitutionsDlg, CTrPropertyPage)
52 //{{AFX_MSG_MAP(IgnoredSubstitutionsFiltersDlg)
53 ON_COMMAND(ID_HELP, OnHelp)
54 ON_BN_CLICKED(IDC_LFILTER_ADDBTN, OnBnClickedAddBtn)
55 ON_BN_CLICKED(IDC_LFILTER_CLEARBTN, OnBnClickedClearBtn)
56 ON_BN_CLICKED(IDC_LFILTER_REMOVEBTN, OnBnClickedRemovebtn)
57 ON_NOTIFY(LVN_ENDLABELEDIT, IDC_IGNORED_SUBSTITUTIONS_FILTER, OnEndLabelEdit)
62 /////////////////////////////////////////////////////////////////////////////
63 // CPropLineFilter message handlers
66 * @brief Initialize the dialog.
68 BOOL IgnoredSubstitutionsDlg::OnInitDialog()
70 CTrPropertyPage::OnInitDialog();
74 return TRUE; // return TRUE unless you set the focus to a control
75 // EXCEPTION: OCX Property Pages should return FALSE
78 static CString RemoveMnemonic(String text)
80 Poco::RegularExpression re("\\(&.\\)|&|:");
81 std::string textu8 = ucr::toUTF8(text);
82 re.subst(textu8, "", Poco::RegularExpression::RE_GLOBAL);
83 return ucr::toTString(textu8).c_str();
86 void IgnoredSubstitutionsDlg::InitList()
88 m_listFilters.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
90 const int lpx = CClientDC(this).GetDeviceCaps(LOGPIXELSX);
91 auto pointToPixel = [lpx](int point) { return MulDiv(point, lpx, 72); };
93 m_listFilters.InsertColumn(0, RemoveMnemonic(_("Fi&nd what:")), LVCFMT_LEFT, pointToPixel(150));
94 m_listFilters.InsertColumn(1, RemoveMnemonic(_("Re&place with:")), LVCFMT_LEFT, pointToPixel(150));
95 m_listFilters.InsertColumn(2, RemoveMnemonic(_("Regular &expression")), LVCFMT_LEFT, pointToPixel(120));
96 m_listFilters.InsertColumn(3, RemoveMnemonic(_("Match &case")), LVCFMT_LEFT, pointToPixel(120));
97 m_listFilters.InsertColumn(4, RemoveMnemonic(_("Match &whole word only")), LVCFMT_LEFT, pointToPixel(120));
98 m_listFilters.SetBooleanValueColumn(2);
99 m_listFilters.SetBooleanValueColumn(3);
100 m_listFilters.SetBooleanValueColumn(4);
102 if (m_pIgnoredSubstitutionsList)
104 for (int i = 0; i < (int)m_pIgnoredSubstitutionsList->GetCount(); i++)
106 const IgnoredSubstitution& item = m_pIgnoredSubstitutionsList->GetAt(i);
107 m_listFilters.InsertItem(i, item.pattern.c_str());
108 m_listFilters.SetItemText(i, 1, item.replacement.c_str());
109 m_listFilters.SetItemBooleanValue(i, 2, item.useRegExp);
110 m_listFilters.SetItemBooleanValue(i, 3, item.caseSensitive);
111 m_listFilters.SetItemBooleanValue(i, 4, item.matchWholeWordOnly);
112 m_listFilters.SetCheck(i, item.enabled);
118 * @brief Open help from mainframe when user presses F1.
120 void IgnoredSubstitutionsDlg::OnHelp()
122 theApp.ShowHelp(FilterHelpLocation);
126 * @brief Called when Add-button is clicked.
128 void IgnoredSubstitutionsDlg::OnBnClickedAddBtn()
130 int num = m_listFilters.GetItemCount();
131 int ind = m_listFilters.InsertItem(num, _("<Edit here>").c_str());
132 m_listFilters.SetItemText(num, 1, _("<Edit here>").c_str());
133 m_listFilters.SetItemBooleanValue(num, 2, false);
134 m_listFilters.SetItemBooleanValue(num, 3, false);
135 m_listFilters.SetItemBooleanValue(num, 4, false);
136 m_listFilters.SetCheck(num);
140 m_listFilters.SetItemState(ind, LVIS_SELECTED, LVIS_SELECTED);
141 m_listFilters.EnsureVisible(ind, FALSE);
146 * @brief Called when Clear-button is clicked.
148 void IgnoredSubstitutionsDlg::OnBnClickedClearBtn()
150 m_listFilters.DeleteAllItems();
154 * @brief Save filters to list when exiting the dialog.
156 BOOL IgnoredSubstitutionsDlg::OnApply()
158 m_pIgnoredSubstitutionsList->Empty();
160 for (int i = 0; i < m_listFilters.GetItemCount(); i++)
162 String symbolBeforeRename = m_listFilters.GetItemText(i, 0);
163 String symbolAfterRename = m_listFilters.GetItemText(i, 1);
164 bool useRegExp = m_listFilters.GetItemBooleanValue(i, 2);
165 bool caseSensitive = m_listFilters.GetItemBooleanValue(i, 3);
166 bool matchWholeWordOnly = m_listFilters.GetItemBooleanValue(i, 4);
168 matchWholeWordOnly = false;
169 bool enabled = !!m_listFilters.GetCheck(i);
170 m_pIgnoredSubstitutionsList->Add(symbolBeforeRename, symbolAfterRename,
171 useRegExp, caseSensitive, matchWholeWordOnly, enabled);
177 m_pIgnoredSubstitutionsList->MakeSubstitutionList(true);
179 catch (Poco::RegularExpressionException& e)
181 AfxMessageBox(ucr::toTString(e.message()).c_str(), MB_OK | MB_ICONEXCLAMATION);
185 AfxGetApp()->WriteProfileInt(_T("Settings"), _T("FilterStartPage"), GetParentSheet()->GetActiveIndex());
190 * @brief Sets external filter list.
191 * @param [in] list External filter list.
193 void IgnoredSubstitutionsDlg::SetList(IgnoredSubstitutionsList *list)
195 m_pIgnoredSubstitutionsList = list;
199 * @brief Called when Remove button is clicked.
201 void IgnoredSubstitutionsDlg::OnBnClickedRemovebtn()
203 int sel = m_listFilters.GetNextItem(-1, LVNI_SELECTED);
206 m_listFilters.DeleteItem(sel);
209 int newSel = min(m_listFilters.GetItemCount() - 1, sel);
212 m_listFilters.SetItemState(newSel, LVIS_SELECTED, LVIS_SELECTED);
213 bool bPartialOk = false;
214 m_listFilters.EnsureVisible(newSel, bPartialOk);
219 * @brief Called when in-place editing has finished.
221 void IgnoredSubstitutionsDlg::OnEndLabelEdit(NMHDR *pNMHDR, LRESULT *pResult)
223 m_listFilters.OnEndLabelEdit(pNMHDR, pResult);