OSDN Git Service

refactor
[winmerge-jp/winmerge-jp.git] / Externals / crystaledit / editlib / dialogs / ctextmarkerdlg.cpp
1 /**\r
2  *  @file ctextmarkerdlg.cpp\r
3  *\r
4  *  @brief Implementation of Marker-dialog.\r
5  */\r
6 \r
7 #include "StdAfx.h"\r
8 #include "resource.h"\r
9 #include "ctextmarkerdlg.h"\r
10 #include "ccrystaltextmarkers.h"\r
11 #include "DDXHelper.h"\r
12 #include "../ccrystaltextview.h"\r
13 #include <algorithm>\r
14 \r
15 #ifdef _DEBUG\r
16 #define new DEBUG_NEW\r
17 #endif\r
18 \r
19 /////////////////////////////////////////////////////////////////////////////\r
20 // CTextMarkerDlg dialog\r
21 \r
22 \r
23 CTextMarkerDlg::CTextMarkerDlg (CCrystalTextMarkers & markers, const CString& sText, DWORD dwFlags)\r
24 : CDialog (CTextMarkerDlg::IDD, nullptr)\r
25 , m_markers(markers)\r
26 , m_nCurItemIndex(0)\r
27 , m_tempMarkers(markers)\r
28 , m_nBgColorIndex(0)\r
29 , m_bMatchCase((dwFlags & FIND_MATCH_CASE) != 0)\r
30 , m_bWholeWord((dwFlags & FIND_WHOLE_WORD) != 0)\r
31 , m_bRegExp((dwFlags & FIND_REGEXP) != 0)\r
32 , m_bMarkersEnabled(markers.GetEnabled())\r
33 {\r
34         if (!sText.IsEmpty())\r
35         {\r
36                 m_tempMarkers.SetMarker(m_tempMarkers.MakeNewId(), sText, dwFlags, \r
37                         static_cast<COLORINDEX>(static_cast<int>(COLORINDEX_MARKERBKGND1) + (m_tempMarkers.GetMarkers().size() % 3)));\r
38         }\r
39 }\r
40 \r
41 void CTextMarkerDlg::\r
42 DoDataExchange (CDataExchange * pDX)\r
43 {\r
44         CDialog::DoDataExchange (pDX);\r
45         //{{AFX_DATA_MAP(CTextMarkerDlg)\r
46         DDX_Control(pDX, IDC_EDIT_MARKER_LIST, m_listMarkers);\r
47         if (!pDX->m_bSaveAndValidate)\r
48                 UpdateDataListView(false);\r
49         DDX_Control(pDX, IDC_EDIT_WHOLE_WORD, m_ctlWholeWord);\r
50         DDX_Control(pDX, IDC_EDIT_MARKER_BGCOLORIDX, m_ctlBgColorIdx);\r
51         DDX_Text(pDX, IDC_EDIT_FINDTEXT, m_sFindWhat);\r
52         DDX_CBIndex(pDX, IDC_EDIT_MARKER_BGCOLORIDX, m_nBgColorIndex);\r
53         DDX_Check(pDX, IDC_EDIT_MATCH_CASE, m_bMatchCase);\r
54         DDX_Check(pDX, IDC_EDIT_REGEXP, m_bRegExp);\r
55         DDX_Check(pDX, IDC_EDIT_WHOLE_WORD, m_bWholeWord);\r
56         DDX_Check(pDX, IDC_EDIT_MARKERS_ENABLED, m_bMarkersEnabled);\r
57         if (pDX->m_bSaveAndValidate)\r
58                 UpdateDataListView(true);\r
59         else\r
60                 m_ctlWholeWord.EnableWindow(m_bRegExp ? FALSE : TRUE);\r
61         //}}AFX_DATA_MAP\r
62 }\r
63 \r
64 BEGIN_MESSAGE_MAP (CTextMarkerDlg, CDialog)\r
65 //{{AFX_MSG_MAP(CTextMarkerDlg)\r
66 ON_BN_CLICKED(IDC_EDIT_REGEXP, OnBnclickedEditRegExp)\r
67 ON_BN_CLICKED(IDC_EDIT_MARKER_NEW, &CTextMarkerDlg::OnBnClickedEditMarkerNew)\r
68 ON_BN_CLICKED(IDC_EDIT_MARKER_DELETE, &CTextMarkerDlg::OnBnClickedEditMarkerDelete)\r
69 ON_BN_CLICKED(ID_APPLY_NOW, &CTextMarkerDlg::OnBnClickedApplyNow)\r
70 ON_NOTIFY(LVN_ITEMCHANGED, IDC_EDIT_MARKER_LIST, &CTextMarkerDlg::OnItemchangedEditMarkerList)\r
71 ON_CBN_EDITCHANGE(IDC_EDIT_FINDTEXT, &CTextMarkerDlg::OnEditchangeEditFindtext)\r
72 ON_NOTIFY(LVN_ITEMCHANGING, IDC_EDIT_MARKER_LIST, &CTextMarkerDlg::OnItemchangingEditMarkerList)\r
73 //}}AFX_MSG_MAP\r
74 END_MESSAGE_MAP ()\r
75 \r
76 /////////////////////////////////////////////////////////////////////////////\r
77 // CTextMarkerDlg message handlers\r
78 \r
79 BOOL CTextMarkerDlg::OnInitDialog ()\r
80 {\r
81         LangTranslateDialog(m_hWnd);\r
82         CDialog::OnInitDialog ();\r
83 \r
84         CString fmt{LoadResString(IDS_MARKER_COLOR_FMT).c_str()};\r
85         for (int i = 0; i < 3; ++i)\r
86         {\r
87                 CString str;\r
88                 str.Format(fmt, i + 1);\r
89                 m_ctlBgColorIdx.InsertString(-1, str);\r
90         }\r
91 \r
92         m_listMarkers.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_ONECLICKACTIVATE | LVS_EX_FULLROWSELECT);\r
93         std::vector<CString> keys;\r
94         for (const auto& marker : m_tempMarkers.GetMarkers())\r
95                 keys.push_back(marker.first);\r
96         std::sort(keys.begin(), keys.end());\r
97         int i = 0;\r
98         for (const auto& key: keys)\r
99         {\r
100                 const auto& marker = m_tempMarkers.GetMarkers()[key];\r
101                 if (marker.bUserDefined)\r
102                 {\r
103                         m_listMarkers.InsertItem(LVIF_TEXT | LVIF_PARAM,\r
104                                 m_listMarkers.GetItemCount(), \r
105                                 marker.sFindWhat, 0, 0, 0,\r
106                                 reinterpret_cast<LPARAM>((const tchar_t *)(m_tempMarkers.GetMarkers().find(key)->first)));\r
107                         m_listMarkers.SetCheck(i, marker.bVisible);\r
108                         ++i;\r
109                 }\r
110         }\r
111         if (i > 0)\r
112                 m_listMarkers.SetItemState(static_cast<int>(i - 1), \r
113                         LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);\r
114 \r
115         UpdateData(FALSE);\r
116         return true;\r
117 }\r
118 \r
119 int CTextMarkerDlg::GetSelectedItemIndex() const\r
120 {\r
121         for (int i = 0; i < m_listMarkers.GetItemCount(); ++i)\r
122         {\r
123                 if ((m_listMarkers.GetItemState(i, LVIS_SELECTED) & LVIS_SELECTED) != 0)\r
124                         return i;\r
125         }\r
126         return -1;\r
127 }\r
128 \r
129 void CTextMarkerDlg::UpdateDataListView(bool bSaveAndValidate)\r
130 {\r
131         if (!bSaveAndValidate)\r
132         {\r
133                 for (int i = 0; i < m_listMarkers.GetItemCount(); ++i)\r
134                 {\r
135                         const tchar_t *pKey = reinterpret_cast<tchar_t *>(m_listMarkers.GetItemData(i));\r
136                         CCrystalTextMarkers::Marker& marker = m_tempMarkers.GetMarkers().at(pKey);\r
137                         if (m_listMarkers.GetItemState(i, LVIS_SELECTED))\r
138                         {\r
139                                 m_sFindWhat = marker.sFindWhat;\r
140                                 m_nBgColorIndex = static_cast<int>(marker.nBgColorIndex) - COLORINDEX_MARKERBKGND1;\r
141                                 if (m_nBgColorIndex < 0)\r
142                                         m_nBgColorIndex = 0;\r
143                                 m_bWholeWord = (marker.dwFlags & FIND_WHOLE_WORD) != 0;\r
144                                 m_bMatchCase = (marker.dwFlags & FIND_MATCH_CASE) != 0;\r
145                                 m_bRegExp = (marker.dwFlags & FIND_REGEXP) != 0;\r
146                                 if (m_bRegExp)\r
147                                         m_bWholeWord = false;\r
148                         }\r
149                 }\r
150         }\r
151         else\r
152         {\r
153                 for (int i = 0; i < m_listMarkers.GetItemCount(); ++i)\r
154                 {\r
155                         const tchar_t *pKey = reinterpret_cast<tchar_t *>(m_listMarkers.GetItemData(i));\r
156                         CCrystalTextMarkers::Marker& marker = m_tempMarkers.GetMarkers().at(pKey);\r
157                         if (m_listMarkers.GetItemState(i, LVIS_SELECTED))\r
158                         {\r
159                                 marker.sFindWhat = m_sFindWhat;\r
160                                 marker.nBgColorIndex = static_cast<COLORINDEX>(m_nBgColorIndex + COLORINDEX_MARKERBKGND1);\r
161                                 marker.dwFlags = GetLastSearchFlags();\r
162                         }\r
163                 }\r
164         }\r
165 }\r
166 \r
167 DWORD CTextMarkerDlg::GetLastSearchFlags() const\r
168 {\r
169         return\r
170                 (m_bMatchCase ? FIND_MATCH_CASE : 0) |\r
171                 (m_bWholeWord ? FIND_WHOLE_WORD : 0) |\r
172                 (m_bRegExp ? FIND_REGEXP : 0);\r
173 }\r
174 \r
175 void CTextMarkerDlg::OnBnclickedEditRegExp()\r
176 {\r
177         UpdateData();\r
178 }\r
179 \r
180 void CTextMarkerDlg::OnBnClickedEditMarkerNew()\r
181 {\r
182         CString name = m_tempMarkers.MakeNewId();\r
183         CString sFindWhat = LoadResString(IDS_MARKER_NEW_PATTERN).c_str();\r
184         m_tempMarkers.SetMarker(name, sFindWhat, GetLastSearchFlags(), \r
185                 static_cast<COLORINDEX>(static_cast<int>(COLORINDEX_MARKERBKGND1) + (m_tempMarkers.GetMarkers().size() % 3)));\r
186         int i = GetSelectedItemIndex();\r
187         if (i >= 0)\r
188                 m_listMarkers.SetItemState(i, 0, LVIS_SELECTED);\r
189         m_listMarkers.InsertItem(LVIF_TEXT | LVIF_STATE | LVIF_PARAM,\r
190                 m_listMarkers.GetItemCount(), sFindWhat, LVIS_SELECTED, LVIS_SELECTED, 0,\r
191                 reinterpret_cast<LPARAM>((const tchar_t *)(m_tempMarkers.GetMarkers().find(name)->first)));\r
192         m_listMarkers.SetCheck(m_listMarkers.GetItemCount() - 1, 1);\r
193 }\r
194 \r
195 void CTextMarkerDlg::OnBnClickedEditMarkerDelete()\r
196 {\r
197         int i = GetSelectedItemIndex();\r
198         if (i < 0)\r
199                 return;\r
200         const tchar_t *pKey = reinterpret_cast<tchar_t *>(m_listMarkers.GetItemData(i));\r
201         m_listMarkers.DeleteItem(i);\r
202         m_tempMarkers.GetMarkers().erase(pKey);\r
203         if (i >= m_listMarkers.GetItemCount() - 1)\r
204                 i = m_listMarkers.GetItemCount() - 1;\r
205         if (i >= 0)\r
206                 m_listMarkers.SetItemState(i, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);\r
207 }\r
208 \r
209 void CTextMarkerDlg::OnBnClickedApplyNow()\r
210 {\r
211         UpdateData(TRUE);\r
212         for (int i = 0; i < m_listMarkers.GetItemCount(); ++i)\r
213         {\r
214                 const tchar_t *pKey = reinterpret_cast<tchar_t *>(m_listMarkers.GetItemData(i));\r
215                 m_tempMarkers.GetMarkers()[pKey].bVisible = !!m_listMarkers.GetCheck(i);\r
216         }\r
217         m_tempMarkers.SetEnabled(m_bMarkersEnabled);\r
218         m_markers = m_tempMarkers;\r
219         m_markers.UpdateViews();\r
220 }\r
221 \r
222 void CTextMarkerDlg::OnOK()\r
223 {\r
224         OnBnClickedApplyNow();\r
225         CDialog::OnOK();\r
226 }\r
227 \r
228 void CTextMarkerDlg::OnEditchangeEditFindtext()\r
229 {\r
230         int i = GetSelectedItemIndex();\r
231         if (i < 0)\r
232                 return;\r
233         CString sFindWhat;\r
234         GetDlgItemText(IDC_EDIT_FINDTEXT, sFindWhat);\r
235         m_listMarkers.SetItemText(i, 0, sFindWhat);\r
236 }\r
237 \r
238 void CTextMarkerDlg::OnItemchangingEditMarkerList(NMHDR *, LRESULT *pResult)\r
239 {\r
240         UpdateData(TRUE);\r
241         *pResult = 0;\r
242 }\r
243 \r
244 void CTextMarkerDlg::OnItemchangedEditMarkerList(NMHDR *, LRESULT *pResult)\r
245 {\r
246         UpdateData(FALSE);\r
247         *pResult = 0;\r
248 }\r