1 // TortoiseSVN - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2003-2008 - TortoiseSVN
\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
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
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
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
27 IMPLEMENT_DYNAMIC(CSetProgsAdvDlg, CDialog)
\r
28 CSetProgsAdvDlg::CSetProgsAdvDlg(const CString& type, CWnd* pParent /*=NULL*/)
\r
29 : CDialog(CSetProgsAdvDlg::IDD, pParent)
\r
31 , m_regToolKey(_T("Software\\TortoiseSVN\\") + type + _T("Tools"))
\r
32 , m_ToolsValid(false)
\r
36 CSetProgsAdvDlg::~CSetProgsAdvDlg()
\r
40 void CSetProgsAdvDlg::LoadData()
\r
47 if (m_regToolKey.getValues(values))
\r
49 for (POSITION pos = values.GetHeadPosition(); pos != NULL; )
\r
51 CString ext = values.GetNext(pos);
\r
52 m_Tools[ext] = CRegString(m_regToolKey.m_path + _T("\\") + ext);
\r
56 m_ToolsValid = true;
\r
60 int CSetProgsAdvDlg::SaveData()
\r
64 // Remove all registry values which are no longer in the list
\r
66 if (m_regToolKey.getValues(values))
\r
68 for (POSITION pos = values.GetHeadPosition(); pos != NULL; )
\r
70 CString ext = values.GetNext(pos);
\r
71 if (m_Tools.find(ext) == m_Tools.end())
\r
73 CRegString to_remove(m_regToolKey.m_path + _T("\\") + ext);
\r
74 to_remove.removeValue();
\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
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
92 void CSetProgsAdvDlg::DoDataExchange(CDataExchange* pDX)
\r
94 CDialog::DoDataExchange(pDX);
\r
95 DDX_Control(pDX, IDC_TOOLLISTCTRL, m_ToolListCtrl);
\r
97 if (pDX->m_bSaveAndValidate)
\r
100 int count = m_ToolListCtrl.GetItemCount();
\r
101 for (int i = 0; i < count; i++)
\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
110 m_ToolListCtrl.DeleteAllItems();
\r
111 for (TOOL_MAP::iterator it = m_Tools.begin(); it != m_Tools.end() ; it++)
\r
113 CString ext = it->first;
\r
114 CString value = it->second;
\r
115 AddExtension(ext, value);
\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
131 BOOL CSetProgsAdvDlg::OnInitDialog()
\r
133 CDialog::OnInitDialog();
\r
135 m_ToolListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);
\r
137 m_ToolListCtrl.DeleteAllItems();
\r
138 int c = ((CHeaderCtrl*)(m_ToolListCtrl.GetDlgItem(0)))->GetItemCount()-1;
\r
140 m_ToolListCtrl.DeleteColumn(c--);
\r
143 theme.SetWindowTheme(m_ToolListCtrl.GetSafeHwnd(), L"Explorer", NULL);
\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
151 m_ToolListCtrl.SetRedraw(FALSE);
\r
153 int maxcol = ((CHeaderCtrl*)(m_ToolListCtrl.GetDlgItem(0)))->GetItemCount()-1;
\r
155 for (col = mincol; col <= maxcol; col++)
\r
157 m_ToolListCtrl.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);
\r
159 m_ToolListCtrl.SetRedraw(TRUE);
\r
161 temp.LoadString(m_sType == _T("Diff") ? IDS_DLGTITLE_ADV_DIFF : IDS_DLGTITLE_ADV_MERGE);
\r
162 SetWindowText(temp);
\r
170 int CSetProgsAdvDlg::AddExtension(const CString& ext, const CString& tool)
\r
172 // Note: list control automatically sorts entries
\r
173 int index = m_ToolListCtrl.InsertItem(0, ext);
\r
176 m_ToolListCtrl.SetItemText(index, 1, tool);
\r
181 int CSetProgsAdvDlg::FindExtension(const CString& ext)
\r
183 int count = m_ToolListCtrl.GetItemCount();
\r
185 for (int i = 0; i < count; i++)
\r
187 if (m_ToolListCtrl.GetItemText(i, 0) == ext)
\r
194 void CSetProgsAdvDlg::EnableBtns()
\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
202 // CSetProgsPage message handlers
\r
204 void CSetProgsAdvDlg::OnBnClickedAddtool()
\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
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
217 m_ToolListCtrl.SetFocus();
\r
220 void CSetProgsAdvDlg::OnBnClickedEdittool()
\r
222 int selected = m_ToolListCtrl.GetSelectionMark();
\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
230 if (m_ToolListCtrl.DeleteItem(selected))
\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
240 m_ToolListCtrl.SetFocus();
\r
243 void CSetProgsAdvDlg::OnBnClickedRemovetool()
\r
245 int selected = m_ToolListCtrl.GetSelectionMark();
\r
248 m_ToolListCtrl.SetRedraw(FALSE);
\r
249 if (m_ToolListCtrl.DeleteItem(selected))
\r
251 if (m_ToolListCtrl.GetItemCount() <= selected)
\r
255 m_ToolListCtrl.SetItemState(selected, UINT(-1), LVIS_SELECTED|LVIS_FOCUSED);
\r
256 m_ToolListCtrl.SetSelectionMark(selected);
\r
259 m_ToolListCtrl.SetRedraw(TRUE);
\r
263 m_ToolListCtrl.SetFocus();
\r
266 void CSetProgsAdvDlg::OnNMDblclkToollistctrl(NMHDR * /* pNMHDR */, LRESULT *pResult)
\r
268 OnBnClickedEdittool();
\r
272 void CSetProgsAdvDlg::OnLvnItemchangedToollistctrl(NMHDR * /* pNMHDR */, LRESULT *pResult)
\r
279 void CSetProgsAdvDlg::OnBnClickedRestoredefaults()
\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
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
292 if (file.Right(3).CompareNoCase(_T("vbs"))==0)
\r
294 kind = _T(" //E:vbscript");
\r
296 if (file.Right(2).CompareNoCase(_T("js"))==0)
\r
298 kind = _T(" //E:javascript");
\r
301 if (m_sType.Compare(_T("Diff"))==0)
\r
303 if (filename.Left(5).CompareNoCase(_T("diff-"))==0)
\r
305 CRegString diffreg = CRegString(_T("Software\\TortoiseSVN\\DiffTools\\")+ext);
\r
306 diffreg = _T("wscript.exe \"") + file + _T("\" %base %mine") + kind;
\r
309 else if (m_sType.Compare(_T("Merge"))==0)
\r
311 if (filename.Left(6).CompareNoCase(_T("merge-"))==0)
\r
313 CRegString diffreg = CRegString(_T("Software\\TortoiseSVN\\MergeTools\\")+ext);
\r
314 diffreg = _T("wscript.exe \"") + file + _T("\" %merged %theirs %mine %base") + kind;
\r
318 m_ToolsValid = FALSE;
\r