1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2003-2008 - TortoiseSVN
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "TortoiseProc.h"
21 #include "ToolAssocDlg.h"
22 #include "SetProgsAdvDlg.h"
23 #include "PathUtils.h"
24 #include "DirFileEnum.h"
26 IMPLEMENT_DYNAMIC(CSetProgsAdvDlg
, CDialog
)
27 CSetProgsAdvDlg::CSetProgsAdvDlg(const CString
& type
, CWnd
* pParent
/*=NULL*/)
28 : CDialog(CSetProgsAdvDlg::IDD
, pParent
)
30 , m_regToolKey(_T("Software\\TortoiseGit\\") + type
+ _T("Tools"))
35 CSetProgsAdvDlg::~CSetProgsAdvDlg()
39 void CSetProgsAdvDlg::LoadData()
46 if (m_regToolKey
.getValues(values
))
48 for (POSITION pos
= values
.GetHeadPosition(); pos
!= NULL
; )
50 CString ext
= values
.GetNext(pos
);
51 m_Tools
[ext
] = CRegString(m_regToolKey
.m_path
+ _T("\\") + ext
);
59 int CSetProgsAdvDlg::SaveData()
63 // Remove all registry values which are no longer in the list
65 if (m_regToolKey
.getValues(values
))
67 for (POSITION pos
= values
.GetHeadPosition(); pos
!= NULL
; )
69 CString ext
= values
.GetNext(pos
);
70 if (m_Tools
.find(ext
) == m_Tools
.end())
72 CRegString
to_remove(m_regToolKey
.m_path
+ _T("\\") + ext
);
73 to_remove
.removeValue();
78 // Add or update new or changed values
79 for (TOOL_MAP::iterator it
= m_Tools
.begin(); it
!= m_Tools
.end() ; it
++)
81 CString ext
= it
->first
;
82 CString new_value
= it
->second
;
83 CRegString
reg_value(m_regToolKey
.m_path
+ _T("\\") + ext
);
84 if (reg_value
!= new_value
)
85 reg_value
= new_value
;
91 void CSetProgsAdvDlg::DoDataExchange(CDataExchange
* pDX
)
93 CDialog::DoDataExchange(pDX
);
94 DDX_Control(pDX
, IDC_TOOLLISTCTRL
, m_ToolListCtrl
);
96 if (pDX
->m_bSaveAndValidate
)
99 int count
= m_ToolListCtrl
.GetItemCount();
100 for (int i
= 0; i
< count
; i
++)
102 CString ext
= m_ToolListCtrl
.GetItemText(i
, 0);
103 CString value
= m_ToolListCtrl
.GetItemText(i
, 1);
104 m_Tools
[ext
] = value
;
109 m_ToolListCtrl
.DeleteAllItems();
110 for (TOOL_MAP::iterator it
= m_Tools
.begin(); it
!= m_Tools
.end() ; it
++)
112 CString ext
= it
->first
;
113 CString value
= it
->second
;
114 AddExtension(ext
, value
);
120 BEGIN_MESSAGE_MAP(CSetProgsAdvDlg
, CDialog
)
121 ON_BN_CLICKED(IDC_ADDTOOL
, OnBnClickedAddtool
)
122 ON_BN_CLICKED(IDC_REMOVETOOL
, OnBnClickedRemovetool
)
123 ON_BN_CLICKED(IDC_EDITTOOL
, OnBnClickedEdittool
)
124 ON_NOTIFY(NM_DBLCLK
, IDC_TOOLLISTCTRL
, OnNMDblclkToollistctrl
)
125 ON_NOTIFY(LVN_ITEMCHANGED
, IDC_TOOLLISTCTRL
, &CSetProgsAdvDlg::OnLvnItemchangedToollistctrl
)
126 ON_BN_CLICKED(IDC_RESTOREDEFAULTS
, &CSetProgsAdvDlg::OnBnClickedRestoredefaults
)
130 BOOL
CSetProgsAdvDlg::OnInitDialog()
132 CDialog::OnInitDialog();
134 m_ToolListCtrl
.SetExtendedStyle(LVS_EX_FULLROWSELECT
| LVS_EX_DOUBLEBUFFER
);
136 m_ToolListCtrl
.DeleteAllItems();
137 int c
= ((CHeaderCtrl
*)(m_ToolListCtrl
.GetDlgItem(0)))->GetItemCount()-1;
139 m_ToolListCtrl
.DeleteColumn(c
--);
141 SetWindowTheme(m_hWnd
, L
"Explorer", NULL
);
144 temp
.LoadString(IDS_PROGS_EXTCOL
);
145 m_ToolListCtrl
.InsertColumn(0, temp
);
146 temp
.LoadString(IDS_PROGS_TOOLCOL
);
147 m_ToolListCtrl
.InsertColumn(1, temp
);
149 m_ToolListCtrl
.SetRedraw(FALSE
);
151 int maxcol
= ((CHeaderCtrl
*)(m_ToolListCtrl
.GetDlgItem(0)))->GetItemCount()-1;
153 for (col
= mincol
; col
<= maxcol
; col
++)
155 m_ToolListCtrl
.SetColumnWidth(col
,LVSCW_AUTOSIZE_USEHEADER
);
157 m_ToolListCtrl
.SetRedraw(TRUE
);
159 temp
.LoadString(m_sType
== _T("Diff") ? IDS_DLGTITLE_ADV_DIFF
: IDS_DLGTITLE_ADV_MERGE
);
168 int CSetProgsAdvDlg::AddExtension(const CString
& ext
, const CString
& tool
)
170 // Note: list control automatically sorts entries
171 int index
= m_ToolListCtrl
.InsertItem(0, ext
);
174 m_ToolListCtrl
.SetItemText(index
, 1, tool
);
179 int CSetProgsAdvDlg::FindExtension(const CString
& ext
)
181 int count
= m_ToolListCtrl
.GetItemCount();
183 for (int i
= 0; i
< count
; i
++)
185 if (m_ToolListCtrl
.GetItemText(i
, 0) == ext
)
192 void CSetProgsAdvDlg::EnableBtns()
194 bool enable_btns
= m_ToolListCtrl
.GetSelectedCount() > 0;
195 GetDlgItem(IDC_EDITTOOL
)->EnableWindow(enable_btns
);
196 GetDlgItem(IDC_REMOVETOOL
)->EnableWindow(enable_btns
);
200 // CSetProgsPage message handlers
202 void CSetProgsAdvDlg::OnBnClickedAddtool()
204 CToolAssocDlg
dlg(m_sType
, true);;
205 dlg
.m_sExtension
= _T("");
206 dlg
.m_sTool
= _T("");
207 if (dlg
.DoModal() == IDOK
)
209 int index
= AddExtension(dlg
.m_sExtension
, dlg
.m_sTool
);
210 m_ToolListCtrl
.SetItemState(index
, UINT(-1), LVIS_SELECTED
|LVIS_FOCUSED
);
211 m_ToolListCtrl
.SetSelectionMark(index
);
215 m_ToolListCtrl
.SetFocus();
218 void CSetProgsAdvDlg::OnBnClickedEdittool()
220 int selected
= m_ToolListCtrl
.GetSelectionMark();
223 CToolAssocDlg
dlg(m_sType
, false);;
224 dlg
.m_sExtension
= m_ToolListCtrl
.GetItemText(selected
, 0);
225 dlg
.m_sTool
= m_ToolListCtrl
.GetItemText(selected
, 1);
226 if (dlg
.DoModal() == IDOK
)
228 if (m_ToolListCtrl
.DeleteItem(selected
))
230 selected
= AddExtension(dlg
.m_sExtension
, dlg
.m_sTool
);
231 m_ToolListCtrl
.SetItemState(selected
, UINT(-1), LVIS_SELECTED
|LVIS_FOCUSED
);
232 m_ToolListCtrl
.SetSelectionMark(selected
);
238 m_ToolListCtrl
.SetFocus();
241 void CSetProgsAdvDlg::OnBnClickedRemovetool()
243 int selected
= m_ToolListCtrl
.GetSelectionMark();
246 m_ToolListCtrl
.SetRedraw(FALSE
);
247 if (m_ToolListCtrl
.DeleteItem(selected
))
249 if (m_ToolListCtrl
.GetItemCount() <= selected
)
253 m_ToolListCtrl
.SetItemState(selected
, UINT(-1), LVIS_SELECTED
|LVIS_FOCUSED
);
254 m_ToolListCtrl
.SetSelectionMark(selected
);
257 m_ToolListCtrl
.SetRedraw(TRUE
);
261 m_ToolListCtrl
.SetFocus();
264 void CSetProgsAdvDlg::OnNMDblclkToollistctrl(NMHDR
* /* pNMHDR */, LRESULT
*pResult
)
266 OnBnClickedEdittool();
270 void CSetProgsAdvDlg::OnLvnItemchangedToollistctrl(NMHDR
* /* pNMHDR */, LRESULT
*pResult
)
277 void CSetProgsAdvDlg::OnBnClickedRestoredefaults()
279 // set the custom diff/merge scripts
280 CString scriptsdir
= CPathUtils::GetAppParentDirectory();
281 scriptsdir
+= _T("Diff-Scripts");
282 CSimpleFileFind
files(scriptsdir
);
283 while (files
.FindNextFileNoDirectories())
285 CString file
= files
.GetFilePath();
286 CString filename
= files
.GetFileName();
287 CString ext
= file
.Mid(file
.ReverseFind('-')+1);
288 ext
= _T(".")+ext
.Left(ext
.ReverseFind('.'));
290 if (file
.Right(3).CompareNoCase(_T("vbs"))==0)
292 kind
= _T(" //E:vbscript");
294 if (file
.Right(2).CompareNoCase(_T("js"))==0)
296 kind
= _T(" //E:javascript");
299 if (m_sType
.Compare(_T("Diff"))==0)
301 if (filename
.Left(5).CompareNoCase(_T("diff-"))==0)
303 CRegString diffreg
= CRegString(_T("Software\\TortoiseGit\\DiffTools\\")+ext
);
304 diffreg
= _T("wscript.exe \"") + file
+ _T("\" %base %mine") + kind
;
307 else if (m_sType
.Compare(_T("Merge"))==0)
309 if (filename
.Left(6).CompareNoCase(_T("merge-"))==0)
311 CRegString diffreg
= CRegString(_T("Software\\TortoiseGit\\MergeTools\\")+ext
);
312 diffreg
= _T("wscript.exe \"") + file
+ _T("\" %merged %theirs %mine %base") + kind
;
316 m_ToolsValid
= FALSE
;