2 * @file LineFiltersDlg.cpp
4 * @brief Implementation of Line Filter dialog
8 #include "LineFiltersList.h"
10 #include "LineFiltersDlg.h"
11 #include "Constants.h"
17 /////////////////////////////////////////////////////////////////////////////
18 // CPropLineFilter property page
20 IMPLEMENT_DYNAMIC(LineFiltersDlg, CTrPropertyPage)
25 LineFiltersDlg::LineFiltersDlg()
26 : CTrPropertyPage(LineFiltersDlg::IDD)
29 //{{AFX_DATA_INIT(LineFiltersDlg)
30 m_bIgnoreRegExp = false;
32 m_strCaption = theApp.LoadDialogCaption(m_lpszTemplateName).c_str();
33 m_psp.pszTitle = m_strCaption;
34 m_psp.dwFlags |= PSP_USETITLE;
35 m_psp.hIcon = AfxGetApp()->LoadIcon(IDI_LINEFILTER);
36 m_psp.dwFlags |= PSP_USEHICON;
39 void LineFiltersDlg::DoDataExchange(CDataExchange* pDX)
41 CPropertyPage::DoDataExchange(pDX);
42 //{{AFX_DATA_MAP(LineFiltersDlg)
43 DDX_Check(pDX, IDC_IGNOREREGEXP, m_bIgnoreRegExp);
44 DDX_Control(pDX, IDC_LFILTER_LIST, m_filtersList);
49 BEGIN_MESSAGE_MAP(LineFiltersDlg, CTrPropertyPage)
50 //{{AFX_MSG_MAP(LineFiltersDlg)
51 ON_COMMAND(ID_HELP, OnHelp)
52 ON_BN_CLICKED(IDC_LFILTER_ADDBTN, OnBnClickedLfilterAddBtn)
53 ON_BN_CLICKED(IDC_LFILTER_EDITBTN, OnBnClickedLfilterEditbtn)
54 ON_BN_CLICKED(IDC_LFILTER_REMOVEBTN, OnBnClickedLfilterRemovebtn)
55 ON_NOTIFY(LVN_ITEMACTIVATE, IDC_LFILTER_LIST, OnLvnItemActivateLfilterList)
56 ON_NOTIFY(LVN_KEYDOWN, IDC_LFILTER_LIST, OnLvnKeyDownLfilterList)
57 ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LFILTER_LIST, OnEndLabelEditLfilterList)
62 /////////////////////////////////////////////////////////////////////////////
63 // CPropLineFilter message handlers
66 * @brief Initialize the dialog.
68 BOOL LineFiltersDlg::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
79 * @brief Initialize the filter list in the dialog.
80 * This function adds current line filters to the filter list.
82 void LineFiltersDlg::InitList()
84 // Show selection across entire row.
85 // Also enable infotips.
86 m_filtersList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES | 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 String title = _("Regular expression");
92 m_filtersList.InsertColumn(1, title.c_str(), LVCFMT_LEFT, pointToPixel(570));
94 size_t count = m_pList->GetCount();
95 for (size_t i = 0; i < count; i++)
97 const LineFilterItem &item = m_pList->GetAt(i);
98 AddRow(item.filterStr, item.enabled);
100 m_filtersList.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
105 * @brief Open help from mainframe when user presses F1.
107 void LineFiltersDlg::OnHelp()
109 theApp.ShowHelp(FilterHelpLocation);
113 * @brief Add new row to the list control.
114 * @param [in] Filter string to add.
115 * @param [in] enabled Is filter enabled?
116 * @return Index of added row.
118 int LineFiltersDlg::AddRow(const String& filter /*= nullptr*/, bool enabled /*= false*/)
120 int items = m_filtersList.GetItemCount();
121 int ind = m_filtersList.InsertItem(items, filter.c_str());
122 m_filtersList.SetCheck(ind, enabled);
127 * @brief Edit currently selected filter.
129 void LineFiltersDlg::EditSelectedFilter()
131 m_filtersList.SetFocus();
132 int sel = m_filtersList.GetNextItem(-1, LVNI_SELECTED);
135 m_filtersList.EditLabel(sel);
140 * @brief Called when Add-button is clicked.
142 void LineFiltersDlg::OnBnClickedLfilterAddBtn()
144 int ind = AddRow(_T(""));
147 m_filtersList.SetItemState(ind, LVIS_SELECTED, LVIS_SELECTED);
148 m_filtersList.EnsureVisible(ind, FALSE);
149 EditSelectedFilter();
154 * @brief Called when Edit button is clicked.
156 void LineFiltersDlg::OnBnClickedLfilterEditbtn()
158 EditSelectedFilter();
162 * @brief Save filters to list when exiting the dialog.
164 void LineFiltersDlg::OnOK()
168 for (int i = 0; i < m_filtersList.GetItemCount(); i++)
170 String text = m_filtersList.GetItemText(i, 0);
171 bool enabled = !!m_filtersList.GetCheck(i);
173 m_pList->AddFilter(text, enabled);
176 AfxGetApp()->WriteProfileInt(_T("Settings"), _T("FilterStartPage"), GetParentSheet()->GetActiveIndex());
178 CPropertyPage::OnClose();
182 * @brief Sets external filter list.
183 * @param [in] list External filter list.
185 void LineFiltersDlg::SetList(LineFiltersList * list)
191 * @brief Called when Remove button is clicked.
193 void LineFiltersDlg::OnBnClickedLfilterRemovebtn()
195 int sel = m_filtersList.GetNextItem(-1, LVNI_SELECTED);
198 m_filtersList.DeleteItem(sel);
201 int newSel = min(m_filtersList.GetItemCount() - 1, sel);
204 m_filtersList.SetItemState(newSel, LVIS_SELECTED, LVIS_SELECTED);
205 bool bPartialOk = false;
206 m_filtersList.EnsureVisible(newSel, bPartialOk);
211 * @brief Called when the user activates an item.
213 void LineFiltersDlg::OnLvnItemActivateLfilterList(NMHDR *pNMHDR, LRESULT *pResult)
215 EditSelectedFilter();
220 * @brief Called when a key has been pressed while the list has the focus.
222 void LineFiltersDlg::OnLvnKeyDownLfilterList(NMHDR *pNMHDR, LRESULT *pResult)
224 LPNMKEY pNMKey = reinterpret_cast<LPNMKEY>(pNMHDR);
225 if (LOWORD(pNMKey->nVKey) == VK_F2)
227 EditSelectedFilter();
233 * @brief Called when in-place editing has finished.
235 void LineFiltersDlg::OnEndLabelEditLfilterList(NMHDR *pNMHDR, LRESULT *pResult)