2 * @file LineFiltersDlg.cpp
4 * @brief Implementation of Line Filter dialog
8 #include "LineFiltersList.h"
10 #include "LineFiltersDlg.h"
16 /** @brief Location for file compare specific help to open. */
17 static TCHAR FilterHelpLocation[] = _T("::/htmlhelp/Filters.html");
19 /////////////////////////////////////////////////////////////////////////////
20 // CPropLineFilter property page
22 IMPLEMENT_DYNAMIC(LineFiltersDlg, CTrPropertyPage)
27 LineFiltersDlg::LineFiltersDlg()
28 : CTrPropertyPage(LineFiltersDlg::IDD)
31 //{{AFX_DATA_INIT(LineFiltersDlg)
32 m_bIgnoreRegExp = false;
34 m_strCaption = theApp.LoadDialogCaption(m_lpszTemplateName).c_str();
35 m_psp.pszTitle = m_strCaption;
36 m_psp.dwFlags |= PSP_USETITLE;
37 m_psp.hIcon = AfxGetApp()->LoadIcon(IDI_LINEFILTER);
38 m_psp.dwFlags |= PSP_USEHICON;
41 void LineFiltersDlg::DoDataExchange(CDataExchange* pDX)
43 CPropertyPage::DoDataExchange(pDX);
44 //{{AFX_DATA_MAP(LineFiltersDlg)
45 DDX_Check(pDX, IDC_IGNOREREGEXP, m_bIgnoreRegExp);
46 DDX_Control(pDX, IDC_LFILTER_LIST, m_filtersList);
51 BEGIN_MESSAGE_MAP(LineFiltersDlg, CTrPropertyPage)
52 //{{AFX_MSG_MAP(LineFiltersDlg)
53 ON_COMMAND(ID_HELP, OnHelp)
54 ON_BN_CLICKED(IDC_LFILTER_ADDBTN, OnBnClickedLfilterAddBtn)
55 ON_BN_CLICKED(IDC_LFILTER_EDITBTN, OnBnClickedLfilterEditbtn)
56 ON_BN_CLICKED(IDC_LFILTER_REMOVEBTN, OnBnClickedLfilterRemovebtn)
57 ON_NOTIFY(LVN_ITEMACTIVATE, IDC_LFILTER_LIST, OnLvnItemActivateLfilterList)
58 ON_NOTIFY(LVN_KEYDOWN, IDC_LFILTER_LIST, OnLvnKeyDownLfilterList)
59 ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LFILTER_LIST, OnEndLabelEditLfilterList)
64 /////////////////////////////////////////////////////////////////////////////
65 // CPropLineFilter message handlers
68 * @brief Initialize the dialog.
70 BOOL LineFiltersDlg::OnInitDialog()
72 CTrPropertyPage::OnInitDialog();
76 return TRUE; // return TRUE unless you set the focus to a control
77 // EXCEPTION: OCX Property Pages should return FALSE
81 * @brief Initialize the filter list in the dialog.
82 * This function adds current line filters to the filter list.
84 void LineFiltersDlg::InitList()
86 // Show selection across entire row.
87 // Also enable infotips.
88 m_filtersList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES | 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 String title = _("Regular expression");
94 m_filtersList.InsertColumn(1, title.c_str(), LVCFMT_LEFT, pointToPixel(570));
96 size_t count = m_pList->GetCount();
97 for (size_t i = 0; i < count; i++)
99 const LineFilterItem &item = m_pList->GetAt(i);
100 AddRow(item.filterStr, item.enabled);
102 m_filtersList.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
107 * @brief Open help from mainframe when user presses F1.
109 void LineFiltersDlg::OnHelp()
111 theApp.ShowHelp(FilterHelpLocation);
115 * @brief Add new row to the list control.
116 * @param [in] Filter string to add.
117 * @param [in] enabled Is filter enabled?
118 * @return Index of added row.
120 int LineFiltersDlg::AddRow(const String& filter /*= nullptr*/, bool enabled /*= false*/)
122 int items = m_filtersList.GetItemCount();
123 int ind = m_filtersList.InsertItem(items, filter.c_str());
124 m_filtersList.SetCheck(ind, enabled);
129 * @brief Edit currently selected filter.
131 void LineFiltersDlg::EditSelectedFilter()
133 m_filtersList.SetFocus();
134 int sel = m_filtersList.GetNextItem(-1, LVNI_SELECTED);
137 m_filtersList.EditLabel(sel);
142 * @brief Called when Add-button is clicked.
144 void LineFiltersDlg::OnBnClickedLfilterAddBtn()
146 int ind = AddRow(_T(""));
149 m_filtersList.SetItemState(ind, LVIS_SELECTED, LVIS_SELECTED);
150 m_filtersList.EnsureVisible(ind, FALSE);
151 EditSelectedFilter();
156 * @brief Called when Edit button is clicked.
158 void LineFiltersDlg::OnBnClickedLfilterEditbtn()
160 EditSelectedFilter();
164 * @brief Save filters to list when exiting the dialog.
166 void LineFiltersDlg::OnOK()
170 for (int i = 0; i < m_filtersList.GetItemCount(); i++)
172 String text = m_filtersList.GetItemText(i, 0);
173 bool enabled = !!m_filtersList.GetCheck(i);
175 m_pList->AddFilter(text, enabled);
178 AfxGetApp()->WriteProfileInt(_T("Settings"), _T("FilterStartPage"), GetParentSheet()->GetActiveIndex());
180 CPropertyPage::OnClose();
184 * @brief Sets external filter list.
185 * @param [in] list External filter list.
187 void LineFiltersDlg::SetList(LineFiltersList * list)
193 * @brief Called when Remove button is clicked.
195 void LineFiltersDlg::OnBnClickedLfilterRemovebtn()
197 int sel = m_filtersList.GetNextItem(-1, LVNI_SELECTED);
200 m_filtersList.DeleteItem(sel);
203 int newSel = min(m_filtersList.GetItemCount() - 1, sel);
206 m_filtersList.SetItemState(newSel, LVIS_SELECTED, LVIS_SELECTED);
207 bool bPartialOk = false;
208 m_filtersList.EnsureVisible(newSel, bPartialOk);
213 * @brief Called when the user activates an item.
215 void LineFiltersDlg::OnLvnItemActivateLfilterList(NMHDR *pNMHDR, LRESULT *pResult)
217 EditSelectedFilter();
222 * @brief Called when a key has been pressed while the list has the focus.
224 void LineFiltersDlg::OnLvnKeyDownLfilterList(NMHDR *pNMHDR, LRESULT *pResult)
226 LPNMKEY pNMKey = reinterpret_cast<LPNMKEY>(pNMHDR);
227 if (LOWORD(pNMKey->nVKey) == VK_F2)
229 EditSelectedFilter();
235 * @brief Called when in-place editing has finished.
237 void LineFiltersDlg::OnEndLabelEditLfilterList(NMHDR *pNMHDR, LRESULT *pResult)