2 * @file SubstitutionFiltersDlg.cpp
4 * @brief Implementation of Substitution Filters dialog
8 #include "SubstitutionFiltersList.h"
10 #include "SubstitutionFiltersDlg.h"
11 #include "Constants.h"
12 #include <Poco/Exception.h>
18 /////////////////////////////////////////////////////////////////////////////
19 // CPropLineFilter property page
21 IMPLEMENT_DYNAMIC(SubstitutionFiltersDlg, CTrPropertyPage)
26 SubstitutionFiltersDlg::SubstitutionFiltersDlg()
27 : CTrPropertyPage(SubstitutionFiltersDlg::IDD)
28 , m_pSubstitutionFiltersList(nullptr)
30 //{{AFX_DATA_INIT(SubstitutionFiltersFiltersDlg)
33 m_strCaption = theApp.LoadDialogCaption(m_lpszTemplateName).c_str();
34 m_psp.pszTitle = m_strCaption;
35 m_psp.dwFlags |= PSP_USETITLE;
36 m_psp.hIcon = AfxGetApp()->LoadIcon(IDI_SUBSTITUTIONFILTER);
37 m_psp.dwFlags |= PSP_USEHICON;
40 void SubstitutionFiltersDlg::DoDataExchange(CDataExchange* pDX)
42 CPropertyPage::DoDataExchange(pDX);
43 //{{AFX_DATA_MAP(SubstitutionFiltersFiltersDlg)
44 DDX_Check(pDX, IDC_IGNORED_SUSBSTITUTIONS_ENABLED, m_bEnabled);
45 DDX_Control(pDX, IDC_SUBSTITUTION_FILTERS, m_listFilters);
49 BEGIN_MESSAGE_MAP(SubstitutionFiltersDlg, CTrPropertyPage)
50 //{{AFX_MSG_MAP(SubstitutionFiltersFiltersDlg)
51 ON_COMMAND(ID_HELP, OnHelp)
52 ON_BN_CLICKED(IDC_LFILTER_ADDBTN, OnBnClickedAddBtn)
53 ON_BN_CLICKED(IDC_LFILTER_CLEARBTN, OnBnClickedClearBtn)
54 ON_BN_CLICKED(IDC_LFILTER_REMOVEBTN, OnBnClickedRemovebtn)
59 /////////////////////////////////////////////////////////////////////////////
60 // CPropLineFilter message handlers
63 * @brief Initialize the dialog.
65 BOOL SubstitutionFiltersDlg::OnInitDialog()
67 m_bEnabled = m_pSubstitutionFiltersList->GetEnabled();
68 CTrPropertyPage::OnInitDialog();
72 return TRUE; // return TRUE unless you set the focus to a control
73 // EXCEPTION: OCX Property Pages should return FALSE
76 static CString RemoveMnemonic(const String& text)
78 Poco::RegularExpression re("\\(&.\\)|&|:");
79 std::string textu8 = ucr::toUTF8(text);
80 re.subst(textu8, "", Poco::RegularExpression::RE_GLOBAL);
81 return ucr::toTString(textu8).c_str();
84 void SubstitutionFiltersDlg::InitList()
86 m_listFilters.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
88 const int lpx = CClientDC(this).GetDeviceCaps(LOGPIXELSX);
89 auto pointToPixel = [lpx](int point) { return MulDiv(point, lpx, 72); };
91 m_listFilters.InsertColumn(0, RemoveMnemonic(_("Fi&nd what:")), LVCFMT_LEFT, pointToPixel(150));
92 m_listFilters.InsertColumn(1, RemoveMnemonic(_("Re&place with:")), LVCFMT_LEFT, pointToPixel(150));
93 m_listFilters.InsertColumn(2, RemoveMnemonic(_("Regular &expression")), LVCFMT_LEFT, pointToPixel(120));
94 m_listFilters.InsertColumn(3, RemoveMnemonic(_("Match &case")), LVCFMT_LEFT, pointToPixel(120));
95 m_listFilters.InsertColumn(4, RemoveMnemonic(_("Match &whole word only")), LVCFMT_LEFT, pointToPixel(120));
96 m_listFilters.SetBooleanValueColumn(2);
97 m_listFilters.SetBooleanValueColumn(3);
98 m_listFilters.SetBooleanValueColumn(4);
100 if (m_pSubstitutionFiltersList)
102 for (int i = 0; i < (int)m_pSubstitutionFiltersList->GetCount(); i++)
104 const SubstitutionFilter& item = m_pSubstitutionFiltersList->GetAt(i);
105 m_listFilters.InsertItem(i, item.pattern.c_str());
106 m_listFilters.SetItemText(i, 1, item.replacement.c_str());
107 m_listFilters.SetItemBooleanValue(i, 2, item.useRegExp);
108 m_listFilters.SetItemBooleanValue(i, 3, item.caseSensitive);
109 m_listFilters.SetItemBooleanValue(i, 4, item.matchWholeWordOnly);
110 m_listFilters.SetCheck(i, item.enabled);
116 * @brief Open help from mainframe when user presses F1.
118 void SubstitutionFiltersDlg::OnHelp()
120 theApp.ShowHelp(FilterHelpLocation);
124 * @brief Called when Add-button is clicked.
126 void SubstitutionFiltersDlg::OnBnClickedAddBtn()
128 int num = m_listFilters.GetItemCount();
129 int ind = m_listFilters.InsertItem(num, _("<Edit here>").c_str());
130 m_listFilters.SetItemText(num, 1, _("<Edit here>").c_str());
131 m_listFilters.SetItemBooleanValue(num, 2, false);
132 m_listFilters.SetItemBooleanValue(num, 3, false);
133 m_listFilters.SetItemBooleanValue(num, 4, false);
134 m_listFilters.SetCheck(num);
138 m_listFilters.SetItemState(ind, LVIS_SELECTED, LVIS_SELECTED);
139 m_listFilters.EnsureVisible(ind, FALSE);
144 * @brief Called when Clear-button is clicked.
146 void SubstitutionFiltersDlg::OnBnClickedClearBtn()
148 m_listFilters.DeleteAllItems();
152 * @brief Save filters to list when exiting the dialog.
154 BOOL SubstitutionFiltersDlg::OnApply()
156 m_pSubstitutionFiltersList->Empty();
158 for (int i = 0; i < m_listFilters.GetItemCount(); i++)
160 String symbolBeforeRename = m_listFilters.GetItemText(i, 0);
161 String symbolAfterRename = m_listFilters.GetItemText(i, 1);
162 bool useRegExp = m_listFilters.GetItemBooleanValue(i, 2);
163 bool caseSensitive = m_listFilters.GetItemBooleanValue(i, 3);
164 bool matchWholeWordOnly = m_listFilters.GetItemBooleanValue(i, 4);
166 matchWholeWordOnly = false;
167 bool enabled = !!m_listFilters.GetCheck(i);
168 m_pSubstitutionFiltersList->Add(symbolBeforeRename, symbolAfterRename,
169 useRegExp, caseSensitive, matchWholeWordOnly, enabled);
175 m_pSubstitutionFiltersList->MakeSubstitutionList(true);
177 catch (Poco::RegularExpressionException& e)
179 AfxMessageBox(ucr::toTString(e.message()).c_str(), MB_OK | MB_ICONEXCLAMATION);
183 m_pSubstitutionFiltersList->SetEnabled(m_bEnabled);
184 AfxGetApp()->WriteProfileInt(_T("Settings"), _T("FilterStartPage"), GetParentSheet()->GetActiveIndex());
189 * @brief Sets external filter list.
190 * @param [in] list External filter list.
192 void SubstitutionFiltersDlg::SetList(SubstitutionFiltersList *list)
194 m_pSubstitutionFiltersList = list;
198 * @brief Called when Remove button is clicked.
200 void SubstitutionFiltersDlg::OnBnClickedRemovebtn()
202 int sel = m_listFilters.GetNextItem(-1, LVNI_SELECTED);
205 m_listFilters.DeleteItem(sel);
208 int newSel = min(m_listFilters.GetItemCount() - 1, sel);
211 m_listFilters.SetItemState(newSel, LVIS_SELECTED, LVIS_SELECTED);
212 bool bPartialOk = false;
213 m_listFilters.EnsureVisible(newSel, bPartialOk);