OSDN Git Service

Show Ignore Sub Menu
[tortoisegit/TortoiseGitJp.git] / TortoiseProc / Settings / SetProgsAdvDlg.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-2008 - TortoiseSVN\r
4 \r
5 // This program is free software; you can redistribute it and/or\r
6 // modify it under the terms of the GNU General Public License\r
7 // as published by the Free Software Foundation; either version 2\r
8 // of the License, or (at your option) any later version.\r
9 \r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 \r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, write to the Free Software Foundation,\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
18 //\r
19 #include "stdafx.h"\r
20 #include "TortoiseProc.h"\r
21 #include "ToolAssocDlg.h"\r
22 #include "SetProgsAdvDlg.h"\r
23 #include "XPTheme.h"\r
24 #include "PathUtils.h"\r
25 #include "DirFileEnum.h"\r
26 \r
27 IMPLEMENT_DYNAMIC(CSetProgsAdvDlg, CDialog)\r
28 CSetProgsAdvDlg::CSetProgsAdvDlg(const CString& type, CWnd* pParent /*=NULL*/)\r
29         : CDialog(CSetProgsAdvDlg::IDD, pParent)\r
30         , m_sType(type)\r
31         , m_regToolKey(_T("Software\\TortoiseSVN\\") + type + _T("Tools"))\r
32         , m_ToolsValid(false)\r
33 {\r
34 }\r
35 \r
36 CSetProgsAdvDlg::~CSetProgsAdvDlg()\r
37 {\r
38 }\r
39 \r
40 void CSetProgsAdvDlg::LoadData()\r
41 {\r
42         if (!m_ToolsValid)\r
43         {\r
44                 m_Tools.clear();\r
45 \r
46                 CStringList values;\r
47                 if (m_regToolKey.getValues(values))\r
48                 {\r
49                         for (POSITION pos = values.GetHeadPosition(); pos != NULL; )\r
50                         {\r
51                                 CString ext = values.GetNext(pos);\r
52                                 m_Tools[ext] = CRegString(m_regToolKey.m_path + _T("\\") + ext);\r
53                         }\r
54                 }\r
55 \r
56                 m_ToolsValid = true;\r
57         }\r
58 }\r
59 \r
60 int CSetProgsAdvDlg::SaveData()\r
61 {\r
62         if (m_ToolsValid)\r
63         {\r
64                 // Remove all registry values which are no longer in the list\r
65                 CStringList values;\r
66                 if (m_regToolKey.getValues(values))\r
67                 {\r
68                         for (POSITION pos = values.GetHeadPosition(); pos != NULL; )\r
69                         {\r
70                                 CString ext = values.GetNext(pos);\r
71                                 if (m_Tools.find(ext) == m_Tools.end())\r
72                                 {\r
73                                         CRegString to_remove(m_regToolKey.m_path + _T("\\") + ext);\r
74                                         to_remove.removeValue();\r
75                                 }\r
76                         }\r
77                 }\r
78 \r
79                 // Add or update new or changed values\r
80                 for (TOOL_MAP::iterator it = m_Tools.begin(); it != m_Tools.end() ; it++)\r
81                 {\r
82                         CString ext = it->first;\r
83                         CString new_value = it->second;\r
84                         CRegString reg_value(m_regToolKey.m_path + _T("\\") + ext);\r
85                         if (reg_value != new_value)\r
86                                 reg_value = new_value;\r
87                 }\r
88         }\r
89         return 0;\r
90 }\r
91 \r
92 void CSetProgsAdvDlg::DoDataExchange(CDataExchange* pDX)\r
93 {\r
94         CDialog::DoDataExchange(pDX);\r
95         DDX_Control(pDX, IDC_TOOLLISTCTRL, m_ToolListCtrl);\r
96 \r
97         if (pDX->m_bSaveAndValidate)\r
98         {\r
99                 m_Tools.clear();\r
100                 int count = m_ToolListCtrl.GetItemCount();\r
101                 for (int i = 0; i < count; i++)\r
102                 {\r
103                         CString ext = m_ToolListCtrl.GetItemText(i, 0);\r
104                         CString value = m_ToolListCtrl.GetItemText(i, 1);\r
105                         m_Tools[ext] = value;\r
106                 }\r
107         }\r
108         else\r
109         {\r
110                 m_ToolListCtrl.DeleteAllItems();\r
111                 for (TOOL_MAP::iterator it = m_Tools.begin(); it != m_Tools.end() ; it++)\r
112                 {\r
113                         CString ext = it->first;\r
114                         CString value = it->second;\r
115                         AddExtension(ext, value);\r
116                 }\r
117         }\r
118 }\r
119 \r
120 \r
121 BEGIN_MESSAGE_MAP(CSetProgsAdvDlg, CDialog)\r
122         ON_BN_CLICKED(IDC_ADDTOOL, OnBnClickedAddtool)\r
123         ON_BN_CLICKED(IDC_REMOVETOOL, OnBnClickedRemovetool)\r
124         ON_BN_CLICKED(IDC_EDITTOOL, OnBnClickedEdittool)\r
125         ON_NOTIFY(NM_DBLCLK, IDC_TOOLLISTCTRL, OnNMDblclkToollistctrl)\r
126         ON_NOTIFY(LVN_ITEMCHANGED, IDC_TOOLLISTCTRL, &CSetProgsAdvDlg::OnLvnItemchangedToollistctrl)\r
127         ON_BN_CLICKED(IDC_RESTOREDEFAULTS, &CSetProgsAdvDlg::OnBnClickedRestoredefaults)\r
128 END_MESSAGE_MAP()\r
129 \r
130 \r
131 BOOL CSetProgsAdvDlg::OnInitDialog()\r
132 {\r
133         CDialog::OnInitDialog();\r
134 \r
135         m_ToolListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);\r
136 \r
137         m_ToolListCtrl.DeleteAllItems();\r
138         int c = ((CHeaderCtrl*)(m_ToolListCtrl.GetDlgItem(0)))->GetItemCount()-1;\r
139         while (c>=0)\r
140                 m_ToolListCtrl.DeleteColumn(c--);\r
141 \r
142         CXPTheme theme;\r
143         theme.SetWindowTheme(m_ToolListCtrl.GetSafeHwnd(), L"Explorer", NULL);\r
144 \r
145         CString temp;\r
146         temp.LoadString(IDS_PROGS_EXTCOL);\r
147         m_ToolListCtrl.InsertColumn(0, temp);\r
148         temp.LoadString(IDS_PROGS_TOOLCOL);\r
149         m_ToolListCtrl.InsertColumn(1, temp);\r
150 \r
151         m_ToolListCtrl.SetRedraw(FALSE);\r
152         int mincol = 0;\r
153         int maxcol = ((CHeaderCtrl*)(m_ToolListCtrl.GetDlgItem(0)))->GetItemCount()-1;\r
154         int col;\r
155         for (col = mincol; col <= maxcol; col++)\r
156         {\r
157                 m_ToolListCtrl.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);\r
158         }\r
159         m_ToolListCtrl.SetRedraw(TRUE);\r
160 \r
161         temp.LoadString(m_sType == _T("Diff") ? IDS_DLGTITLE_ADV_DIFF : IDS_DLGTITLE_ADV_MERGE);\r
162         SetWindowText(temp);\r
163 \r
164         LoadData();\r
165         UpdateData(FALSE);\r
166         EnableBtns();\r
167         return TRUE;\r
168 }\r
169 \r
170 int CSetProgsAdvDlg::AddExtension(const CString& ext, const CString& tool)\r
171 {\r
172         // Note: list control automatically sorts entries\r
173         int index = m_ToolListCtrl.InsertItem(0, ext);\r
174         if (index >= 0)\r
175         {\r
176                 m_ToolListCtrl.SetItemText(index, 1, tool);\r
177         }\r
178         return index;\r
179 }\r
180 \r
181 int CSetProgsAdvDlg::FindExtension(const CString& ext)\r
182 {\r
183         int count = m_ToolListCtrl.GetItemCount();\r
184 \r
185         for (int i = 0; i < count; i++)\r
186         {\r
187                 if (m_ToolListCtrl.GetItemText(i, 0) == ext)\r
188                         return i;\r
189         }\r
190 \r
191         return -1;\r
192 }\r
193 \r
194 void CSetProgsAdvDlg::EnableBtns()\r
195 {\r
196         bool enable_btns = m_ToolListCtrl.GetSelectedCount() > 0;\r
197         GetDlgItem(IDC_EDITTOOL)->EnableWindow(enable_btns);\r
198         GetDlgItem(IDC_REMOVETOOL)->EnableWindow(enable_btns);\r
199 }\r
200 \r
201 \r
202 // CSetProgsPage message handlers\r
203 \r
204 void CSetProgsAdvDlg::OnBnClickedAddtool()\r
205 {\r
206         CToolAssocDlg dlg(m_sType, true);;\r
207         dlg.m_sExtension = _T("");\r
208         dlg.m_sTool = _T("");\r
209         if (dlg.DoModal() == IDOK)\r
210         {\r
211                 int index = AddExtension(dlg.m_sExtension, dlg.m_sTool);\r
212                 m_ToolListCtrl.SetItemState(index, UINT(-1), LVIS_SELECTED|LVIS_FOCUSED);\r
213                 m_ToolListCtrl.SetSelectionMark(index);\r
214         }\r
215 \r
216         EnableBtns();\r
217         m_ToolListCtrl.SetFocus();\r
218 }\r
219 \r
220 void CSetProgsAdvDlg::OnBnClickedEdittool()\r
221 {\r
222         int selected = m_ToolListCtrl.GetSelectionMark();\r
223         if (selected >= 0)\r
224         {\r
225                 CToolAssocDlg dlg(m_sType, false);;\r
226                 dlg.m_sExtension = m_ToolListCtrl.GetItemText(selected, 0);\r
227                 dlg.m_sTool = m_ToolListCtrl.GetItemText(selected, 1);\r
228                 if (dlg.DoModal() == IDOK)\r
229                 {\r
230                         if (m_ToolListCtrl.DeleteItem(selected))\r
231                         {\r
232                                 selected = AddExtension(dlg.m_sExtension, dlg.m_sTool);\r
233                                 m_ToolListCtrl.SetItemState(selected, UINT(-1), LVIS_SELECTED|LVIS_FOCUSED);\r
234                                 m_ToolListCtrl.SetSelectionMark(selected);\r
235                         }\r
236                 }\r
237         }\r
238 \r
239         EnableBtns();\r
240         m_ToolListCtrl.SetFocus();\r
241 }\r
242 \r
243 void CSetProgsAdvDlg::OnBnClickedRemovetool()\r
244 {\r
245         int selected = m_ToolListCtrl.GetSelectionMark();\r
246         if (selected >= 0)\r
247         {\r
248                 m_ToolListCtrl.SetRedraw(FALSE);\r
249                 if (m_ToolListCtrl.DeleteItem(selected))\r
250                 {\r
251                         if (m_ToolListCtrl.GetItemCount() <= selected)\r
252                                 --selected;\r
253                         if (selected >= 0)\r
254                         {\r
255                                 m_ToolListCtrl.SetItemState(selected, UINT(-1), LVIS_SELECTED|LVIS_FOCUSED);\r
256                                 m_ToolListCtrl.SetSelectionMark(selected);\r
257                         }\r
258                 }\r
259                 m_ToolListCtrl.SetRedraw(TRUE);\r
260         }\r
261 \r
262         EnableBtns();\r
263         m_ToolListCtrl.SetFocus();\r
264 }\r
265 \r
266 void CSetProgsAdvDlg::OnNMDblclkToollistctrl(NMHDR * /* pNMHDR */, LRESULT *pResult)\r
267 {\r
268         OnBnClickedEdittool();\r
269         *pResult = 0;\r
270 }\r
271 \r
272 void CSetProgsAdvDlg::OnLvnItemchangedToollistctrl(NMHDR * /* pNMHDR */, LRESULT *pResult)\r
273 {\r
274         EnableBtns();\r
275 \r
276         *pResult = 0;\r
277 }\r
278 \r
279 void CSetProgsAdvDlg::OnBnClickedRestoredefaults()\r
280 {\r
281         // set the custom diff/merge scripts\r
282         CString scriptsdir = CPathUtils::GetAppParentDirectory();\r
283         scriptsdir += _T("Diff-Scripts");\r
284         CSimpleFileFind files(scriptsdir);\r
285         while (files.FindNextFileNoDirectories())\r
286         {\r
287                 CString file = files.GetFilePath();\r
288                 CString filename = files.GetFileName();\r
289                 CString ext = file.Mid(file.ReverseFind('-')+1);\r
290                 ext = _T(".")+ext.Left(ext.ReverseFind('.'));\r
291                 CString kind;\r
292                 if (file.Right(3).CompareNoCase(_T("vbs"))==0)\r
293                 {\r
294                         kind = _T(" //E:vbscript");\r
295                 }\r
296                 if (file.Right(2).CompareNoCase(_T("js"))==0)\r
297                 {\r
298                         kind = _T(" //E:javascript");\r
299                 }\r
300 \r
301                 if (m_sType.Compare(_T("Diff"))==0)\r
302                 {\r
303                         if (filename.Left(5).CompareNoCase(_T("diff-"))==0)\r
304                         {\r
305                                 CRegString diffreg = CRegString(_T("Software\\TortoiseSVN\\DiffTools\\")+ext);\r
306                                 diffreg = _T("wscript.exe \"") + file + _T("\" %base %mine") + kind;\r
307                         }\r
308                 }\r
309                 else if (m_sType.Compare(_T("Merge"))==0)\r
310                 {\r
311                         if (filename.Left(6).CompareNoCase(_T("merge-"))==0)\r
312                         {\r
313                                 CRegString diffreg = CRegString(_T("Software\\TortoiseSVN\\MergeTools\\")+ext);\r
314                                 diffreg = _T("wscript.exe \"") + file + _T("\" %merged %theirs %mine %base") + kind;\r
315                         }\r
316                 }\r
317         }\r
318         m_ToolsValid = FALSE;\r
319         LoadData();\r
320         UpdateData(FALSE);\r
321         EnableBtns();\r
322 }\r