1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2003-2011 - 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"
25 IMPLEMENT_DYNAMIC(CSetProgsAdvDlg
, CResizableStandAloneDialog
)
26 CSetProgsAdvDlg::CSetProgsAdvDlg(const CString
& type
, CWnd
* pParent
/*=NULL*/)
27 : CResizableStandAloneDialog(CSetProgsAdvDlg::IDD
, pParent
)
29 , m_regToolKey(_T("Software\\TortoiseGit\\") + type
+ _T("Tools"))
34 CSetProgsAdvDlg::~CSetProgsAdvDlg()
38 void CSetProgsAdvDlg::LoadData()
45 if (m_regToolKey
.getValues(values
))
47 for (POSITION pos
= values
.GetHeadPosition(); pos
!= NULL
; )
49 CString ext
= values
.GetNext(pos
);
50 m_Tools
[ext
] = CRegString(m_regToolKey
.m_path
+ _T("\\") + ext
);
58 int CSetProgsAdvDlg::SaveData()
62 // Remove all registry values which are no longer in the list
64 if (m_regToolKey
.getValues(values
))
66 for (POSITION pos
= values
.GetHeadPosition(); pos
!= NULL
; )
68 CString ext
= values
.GetNext(pos
);
69 if (m_Tools
.find(ext
) == m_Tools
.end())
71 CRegString
to_remove(m_regToolKey
.m_path
+ _T("\\") + ext
);
72 to_remove
.removeValue();
77 // Add or update new or changed values
78 for (TOOL_MAP::iterator it
= m_Tools
.begin(); it
!= m_Tools
.end() ; ++it
)
80 CString ext
= it
->first
;
81 CString new_value
= it
->second
;
82 CRegString
reg_value(m_regToolKey
.m_path
+ _T("\\") + ext
);
83 if (reg_value
!= new_value
)
84 reg_value
= new_value
;
90 void CSetProgsAdvDlg::DoDataExchange(CDataExchange
* pDX
)
92 CResizableStandAloneDialog::DoDataExchange(pDX
);
93 DDX_Control(pDX
, IDC_TOOLLISTCTRL
, m_ToolListCtrl
);
95 if (pDX
->m_bSaveAndValidate
)
98 int count
= m_ToolListCtrl
.GetItemCount();
99 for (int i
= 0; i
< count
; i
++)
101 CString ext
= m_ToolListCtrl
.GetItemText(i
, 0);
102 CString value
= m_ToolListCtrl
.GetItemText(i
, 1);
103 m_Tools
[ext
] = value
;
108 m_ToolListCtrl
.DeleteAllItems();
109 for (TOOL_MAP::iterator it
= m_Tools
.begin(); it
!= m_Tools
.end() ; ++it
)
111 CString ext
= it
->first
;
112 CString value
= it
->second
;
113 AddExtension(ext
, value
);
119 BEGIN_MESSAGE_MAP(CSetProgsAdvDlg
, CResizableStandAloneDialog
)
120 ON_BN_CLICKED(IDC_ADDTOOL
, OnBnClickedAddtool
)
121 ON_BN_CLICKED(IDC_REMOVETOOL
, OnBnClickedRemovetool
)
122 ON_BN_CLICKED(IDC_EDITTOOL
, OnBnClickedEdittool
)
123 ON_NOTIFY(NM_DBLCLK
, IDC_TOOLLISTCTRL
, OnNMDblclkToollistctrl
)
124 ON_NOTIFY(LVN_ITEMCHANGED
, IDC_TOOLLISTCTRL
, &CSetProgsAdvDlg::OnLvnItemchangedToollistctrl
)
125 ON_BN_CLICKED(IDC_RESTOREDEFAULTS
, &CSetProgsAdvDlg::OnBnClickedRestoredefaults
)
129 BOOL
CSetProgsAdvDlg::OnInitDialog()
131 CResizableStandAloneDialog::OnInitDialog();
133 m_ToolListCtrl
.SetExtendedStyle(LVS_EX_FULLROWSELECT
| LVS_EX_DOUBLEBUFFER
);
135 m_ToolListCtrl
.DeleteAllItems();
136 int c
= ((CHeaderCtrl
*)(m_ToolListCtrl
.GetDlgItem(0)))->GetItemCount()-1;
138 m_ToolListCtrl
.DeleteColumn(c
--);
140 SetWindowTheme(m_ToolListCtrl
.GetSafeHwnd(), L
"Explorer", NULL
);
143 temp
.LoadString(IDS_PROGS_EXTCOL
);
144 m_ToolListCtrl
.InsertColumn(0, temp
);
145 temp
.LoadString(IDS_PROGS_TOOLCOL
);
146 m_ToolListCtrl
.InsertColumn(1, temp
);
148 m_ToolListCtrl
.SetRedraw(FALSE
);
150 int maxcol
= ((CHeaderCtrl
*)(m_ToolListCtrl
.GetDlgItem(0)))->GetItemCount()-1;
152 for (col
= mincol
; col
<= maxcol
; col
++)
154 m_ToolListCtrl
.SetColumnWidth(col
,LVSCW_AUTOSIZE_USEHEADER
);
156 m_ToolListCtrl
.SetRedraw(TRUE
);
158 temp
.LoadString(m_sType
== _T("Diff") ? IDS_DLGTITLE_ADV_DIFF
: IDS_DLGTITLE_ADV_MERGE
);
165 AddAnchor(IDC_GROUP
, TOP_LEFT
, BOTTOM_RIGHT
);
166 AddAnchor(IDC_TOOLLISTCTRL
, TOP_LEFT
, BOTTOM_RIGHT
);
167 AddAnchor(IDC_ADDTOOL
, BOTTOM_LEFT
);
168 AddAnchor(IDC_EDITTOOL
, BOTTOM_LEFT
);
169 AddAnchor(IDC_REMOVETOOL
, BOTTOM_LEFT
);
170 AddAnchor(IDC_RESTOREDEFAULTS
, BOTTOM_LEFT
);
171 AddAnchor(IDOK
, BOTTOM_RIGHT
);
172 AddAnchor(IDCANCEL
, BOTTOM_RIGHT
);
177 int CSetProgsAdvDlg::AddExtension(const CString
& ext
, const CString
& tool
)
179 // Note: list control automatically sorts entries
180 int index
= m_ToolListCtrl
.InsertItem(0, ext
);
183 m_ToolListCtrl
.SetItemText(index
, 1, tool
);
188 int CSetProgsAdvDlg::FindExtension(const CString
& ext
)
190 int count
= m_ToolListCtrl
.GetItemCount();
192 for (int i
= 0; i
< count
; i
++)
194 if (m_ToolListCtrl
.GetItemText(i
, 0) == ext
)
201 void CSetProgsAdvDlg::EnableBtns()
203 bool enable_btns
= m_ToolListCtrl
.GetSelectedCount() > 0;
204 GetDlgItem(IDC_EDITTOOL
)->EnableWindow(enable_btns
);
205 GetDlgItem(IDC_REMOVETOOL
)->EnableWindow(enable_btns
);
209 // CSetProgsPage message handlers
211 void CSetProgsAdvDlg::OnBnClickedAddtool()
213 CToolAssocDlg
dlg(m_sType
, true);
214 dlg
.m_sExtension
= _T("");
215 dlg
.m_sTool
= _T("");
216 if (dlg
.DoModal() == IDOK
)
218 int index
= AddExtension(dlg
.m_sExtension
, dlg
.m_sTool
);
219 m_ToolListCtrl
.SetItemState(index
, UINT(-1), LVIS_SELECTED
|LVIS_FOCUSED
);
220 m_ToolListCtrl
.SetSelectionMark(index
);
224 m_ToolListCtrl
.SetFocus();
227 void CSetProgsAdvDlg::OnBnClickedEdittool()
229 int selected
= m_ToolListCtrl
.GetSelectionMark();
232 CToolAssocDlg
dlg(m_sType
, false);
233 dlg
.m_sExtension
= m_ToolListCtrl
.GetItemText(selected
, 0);
234 dlg
.m_sTool
= m_ToolListCtrl
.GetItemText(selected
, 1);
235 if (dlg
.DoModal() == IDOK
)
237 if (m_ToolListCtrl
.DeleteItem(selected
))
239 selected
= AddExtension(dlg
.m_sExtension
, dlg
.m_sTool
);
240 m_ToolListCtrl
.SetItemState(selected
, UINT(-1), LVIS_SELECTED
|LVIS_FOCUSED
);
241 m_ToolListCtrl
.SetSelectionMark(selected
);
247 m_ToolListCtrl
.SetFocus();
250 void CSetProgsAdvDlg::OnBnClickedRemovetool()
252 int selected
= m_ToolListCtrl
.GetSelectionMark();
255 m_ToolListCtrl
.SetRedraw(FALSE
);
256 if (m_ToolListCtrl
.DeleteItem(selected
))
258 if (m_ToolListCtrl
.GetItemCount() <= selected
)
262 m_ToolListCtrl
.SetItemState(selected
, UINT(-1), LVIS_SELECTED
|LVIS_FOCUSED
);
263 m_ToolListCtrl
.SetSelectionMark(selected
);
266 m_ToolListCtrl
.SetRedraw(TRUE
);
270 m_ToolListCtrl
.SetFocus();
273 void CSetProgsAdvDlg::OnNMDblclkToollistctrl(NMHDR
* /* pNMHDR */, LRESULT
*pResult
)
275 OnBnClickedEdittool();
279 void CSetProgsAdvDlg::OnLvnItemchangedToollistctrl(NMHDR
* /* pNMHDR */, LRESULT
*pResult
)
286 void CSetProgsAdvDlg::OnBnClickedRestoredefaults()
288 CAppUtils::SetupDiffScripts(true, m_sType
);
289 m_ToolsValid
= FALSE
;