OSDN Git Service

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