OSDN Git Service

Fix failed test
[winmerge-jp/winmerge-jp.git] / Src / LineFiltersDlg.cpp
1 /**
2  *  @file LineFiltersDlg.cpp
3  *
4  *  @brief Implementation of Line Filter dialog
5  */ 
6
7 #include "stdafx.h"
8 #include "LineFiltersList.h"
9 #include "Merge.h"
10 #include "LineFiltersDlg.h"
11
12 #ifdef _DEBUG
13 #define new DEBUG_NEW
14 #endif
15
16 /** @brief Location for file compare specific help to open. */
17 static TCHAR FilterHelpLocation[] = _T("::/htmlhelp/Filters.html");
18
19 /////////////////////////////////////////////////////////////////////////////
20 // CPropLineFilter property page
21
22 IMPLEMENT_DYNAMIC(LineFiltersDlg, CTrPropertyPage)
23
24 /**
25  * @brief Constructor.
26  */
27 LineFiltersDlg::LineFiltersDlg()
28 : CTrPropertyPage(LineFiltersDlg::IDD)
29 , m_pList(nullptr)
30 {
31         //{{AFX_DATA_INIT(LineFiltersDlg)
32         m_bIgnoreRegExp = false;
33         //}}AFX_DATA_INIT
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;
39 }
40
41 void LineFiltersDlg::DoDataExchange(CDataExchange* pDX)
42 {
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);
47         //}}AFX_DATA_MAP
48 }
49
50
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)
60         //}}AFX_MSG_MAP
61 END_MESSAGE_MAP()
62
63
64 /////////////////////////////////////////////////////////////////////////////
65 // CPropLineFilter message handlers
66
67 /**
68  * @brief Initialize the dialog.
69  */
70 BOOL LineFiltersDlg::OnInitDialog()
71 {
72         CTrPropertyPage::OnInitDialog();
73
74         InitList();
75         
76         return TRUE;  // return TRUE unless you set the focus to a control
77                       // EXCEPTION: OCX Property Pages should return FALSE
78 }
79
80 /**
81  * @brief Initialize the filter list in the dialog.
82  * This function adds current line filters to the filter list.
83  */
84 void LineFiltersDlg::InitList()
85 {
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);
89
90         const int lpx = CClientDC(this).GetDeviceCaps(LOGPIXELSX);
91         auto pointToPixel = [lpx](int point) { return MulDiv(point, lpx, 72); };
92
93         String title = _("Regular expression");
94         m_filtersList.InsertColumn(1, title.c_str(), LVCFMT_LEFT, pointToPixel(570));
95
96         size_t count = m_pList->GetCount();
97         for (size_t i = 0; i < count; i++)
98         {
99                 const LineFilterItem &item = m_pList->GetAt(i);
100                 AddRow(item.filterStr, item.enabled);
101         }
102         m_filtersList.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
103         UpdateData(FALSE);
104 }
105
106 /**
107  * @brief Open help from mainframe when user presses F1.
108  */
109 void LineFiltersDlg::OnHelp()
110 {
111         theApp.ShowHelp(FilterHelpLocation);
112 }
113
114 /**
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.
119  */
120 int LineFiltersDlg::AddRow(const String& filter /*= nullptr*/, bool enabled /*= false*/)
121 {
122         int items = m_filtersList.GetItemCount();
123         int ind = m_filtersList.InsertItem(items, filter.c_str());
124         m_filtersList.SetCheck(ind, enabled);
125         return ind;
126 }
127
128 /**
129  * @brief Edit currently selected filter.
130  */
131 void LineFiltersDlg::EditSelectedFilter()
132 {
133         m_filtersList.SetFocus();
134         int sel = m_filtersList.GetNextItem(-1, LVNI_SELECTED);
135         if (sel > -1)
136         {
137                 m_filtersList.EditLabel(sel);
138         }
139 }
140
141 /**
142  * @brief Called when Add-button is clicked.
143  */
144 void LineFiltersDlg::OnBnClickedLfilterAddBtn()
145 {
146         int ind = AddRow(_T(""));
147         if (ind >= -1)
148         {
149                 m_filtersList.SetItemState(ind, LVIS_SELECTED, LVIS_SELECTED);
150                 m_filtersList.EnsureVisible(ind, FALSE);
151                 EditSelectedFilter();
152         }
153 }
154
155 /**
156  * @brief Called when Edit button is clicked.
157  */
158 void LineFiltersDlg::OnBnClickedLfilterEditbtn()
159 {
160         EditSelectedFilter();
161 }
162
163 /**
164  * @brief Save filters to list when exiting the dialog.
165  */
166 void LineFiltersDlg::OnOK()
167 {
168         m_pList->Empty();
169
170         for (int i = 0; i < m_filtersList.GetItemCount(); i++)
171         {
172                 String text = m_filtersList.GetItemText(i, 0);
173                 bool enabled = !!m_filtersList.GetCheck(i);
174
175                 m_pList->AddFilter(text, enabled);
176         }
177
178         AfxGetApp()->WriteProfileInt(_T("Settings"), _T("FilterStartPage"), GetParentSheet()->GetActiveIndex());
179
180         CPropertyPage::OnClose();
181 }
182
183 /**
184  * @brief Sets external filter list.
185  * @param [in] list External filter list.
186  */
187 void LineFiltersDlg::SetList(LineFiltersList * list)
188 {
189         m_pList = list;
190 }
191
192 /**
193  * @brief Called when Remove button is clicked.
194  */
195 void LineFiltersDlg::OnBnClickedLfilterRemovebtn()
196 {
197         int sel = m_filtersList.GetNextItem(-1, LVNI_SELECTED);
198         if (sel != -1)
199         {
200                 m_filtersList.DeleteItem(sel);
201         }
202
203         int newSel = min(m_filtersList.GetItemCount() - 1, sel);
204         if (newSel >= -1)
205         {
206                 m_filtersList.SetItemState(newSel, LVIS_SELECTED, LVIS_SELECTED);
207                 bool bPartialOk = false;
208                 m_filtersList.EnsureVisible(newSel, bPartialOk);
209         }
210 }
211
212 /**
213  * @brief Called when the user activates an item.
214  */
215 void LineFiltersDlg::OnLvnItemActivateLfilterList(NMHDR *pNMHDR, LRESULT *pResult)
216 {
217         EditSelectedFilter();
218         *pResult = 0;
219 }
220
221 /**
222  * @brief Called when a key has been pressed while the list has the focus.
223  */
224 void LineFiltersDlg::OnLvnKeyDownLfilterList(NMHDR *pNMHDR, LRESULT *pResult)
225 {
226         LPNMKEY pNMKey = reinterpret_cast<LPNMKEY>(pNMHDR);
227         if (LOWORD(pNMKey->nVKey) == VK_F2)
228         {
229                 EditSelectedFilter();
230         }
231         *pResult = 0;
232 }
233
234 /**
235  * @brief Called when in-place editing has finished.
236  */
237 void LineFiltersDlg::OnEndLabelEditLfilterList(NMHDR *pNMHDR, LRESULT *pResult)
238 {
239         *pResult = 1;
240 }