Refactored: Deduplicate code
[TortoiseGit.git] / src / TortoiseProc / Settings / SettingGitRemote.cpp
blob9931c7f615bacaa32fb72131319ea8569d8068e6
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2012 - TortoiseGit
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.
19 // SettingGitRemote.cpp : implementation file
22 #include "stdafx.h"
23 #include "TortoiseProc.h"
24 #include "SettingGitRemote.h"
25 #include "Settings.h"
26 #include "GitAdminDir.h"
27 #include "MessageBox.h"
28 #include "git.h"
30 // CSettingGitRemote dialog
32 IMPLEMENT_DYNAMIC(CSettingGitRemote, ISettingsPropPage)
34 CSettingGitRemote::CSettingGitRemote(CString cmdPath)
35 : ISettingsPropPage(CSettingGitRemote::IDD)
36 , m_strRemote(_T(""))
37 , m_strUrl(_T(""))
38 , m_strPuttyKeyfile(_T(""))
39 , m_cmdPath(cmdPath)
42 m_ChangedMask = 0;
45 CSettingGitRemote::~CSettingGitRemote()
49 void CSettingGitRemote::DoDataExchange(CDataExchange* pDX)
51 CPropertyPage::DoDataExchange(pDX);
52 DDX_Control(pDX, IDC_LIST_REMOTE, m_ctrlRemoteList);
53 DDX_Text(pDX, IDC_EDIT_REMOTE, m_strRemote);
54 DDX_Text(pDX, IDC_EDIT_URL, m_strUrl);
55 DDX_Text(pDX, IDC_EDIT_PUTTY_KEY, m_strPuttyKeyfile);
59 BEGIN_MESSAGE_MAP(CSettingGitRemote, CPropertyPage)
60 ON_BN_CLICKED(IDC_BUTTON_BROWSE, &CSettingGitRemote::OnBnClickedButtonBrowse)
61 ON_BN_CLICKED(IDC_BUTTON_ADD, &CSettingGitRemote::OnBnClickedButtonAdd)
62 ON_LBN_SELCHANGE(IDC_LIST_REMOTE, &CSettingGitRemote::OnLbnSelchangeListRemote)
63 ON_EN_CHANGE(IDC_EDIT_REMOTE, &CSettingGitRemote::OnEnChangeEditRemote)
64 ON_EN_CHANGE(IDC_EDIT_URL, &CSettingGitRemote::OnEnChangeEditUrl)
65 ON_EN_CHANGE(IDC_EDIT_PUTTY_KEY, &CSettingGitRemote::OnEnChangeEditPuttyKey)
66 ON_BN_CLICKED(IDC_BUTTON_REMOVE, &CSettingGitRemote::OnBnClickedButtonRemove)
67 END_MESSAGE_MAP()
69 BOOL CSettingGitRemote::OnInitDialog()
71 ISettingsPropPage::OnInitDialog();
73 //CString str=((CSettings*)GetParent())->m_CmdPath.GetWinPath();
74 CString proj;
75 if( g_GitAdminDir.HasAdminDir(m_cmdPath,&proj) )
77 CString title;
78 this->GetWindowText(title);
79 this->SetWindowText(title + _T(" - ") + proj);
82 STRING_VECTOR remotes;
83 g_Git.GetRemoteList(remotes);
84 m_ctrlRemoteList.ResetContent();
85 for (size_t i = 0; i < remotes.size(); i++)
86 m_ctrlRemoteList.AddString(remotes[i]);
88 //this->GetDlgItem(IDC_EDIT_REMOTE)->EnableWindow(FALSE);
89 this->UpdateData(FALSE);
90 return TRUE;
92 // CSettingGitRemote message handlers
94 void CSettingGitRemote::OnBnClickedButtonBrowse()
96 CFileDialog dlg(TRUE,NULL,
97 NULL,
98 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
99 CString(MAKEINTRESOURCE(IDS_PUTTYKEYFILEFILTER)));
101 this->UpdateData();
102 if(dlg.DoModal()==IDOK)
104 this->m_strPuttyKeyfile = dlg.GetPathName();
105 this->UpdateData(FALSE);
106 OnEnChangeEditPuttyKey();
110 void CSettingGitRemote::OnBnClickedButtonAdd()
112 this->UpdateData();
114 if(m_strRemote.IsEmpty())
116 CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_REMOTEEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
117 return;
119 if(m_strUrl.IsEmpty())
121 CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_URLEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
122 return;
125 m_ChangedMask = REMOTE_NAME |REMOTE_URL |REMOTE_PUTTYKEY;
126 if(IsRemoteExist(m_strRemote))
128 CString msg;
129 msg.Format(IDS_PROC_GITCONFIG_OVERWRITEREMOTE, m_strRemote);
130 if(CMessageBox::Show(NULL, msg, _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == IDYES)
132 m_ChangedMask &= ~REMOTE_NAME;
134 else
135 return;
138 this->OnApply();
141 BOOL CSettingGitRemote::IsRemoteExist(CString &remote)
143 CString str;
144 for(int i=0;i<m_ctrlRemoteList.GetCount();i++)
146 m_ctrlRemoteList.GetText(i,str);
147 if(str == remote)
149 return true;
152 return false;
155 void CSettingGitRemote::OnLbnSelchangeListRemote()
157 CWaitCursor wait;
159 if(m_ChangedMask)
161 if(CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_SAVEREMOTE, IDS_APPNAME, 1, IDI_QUESTION, IDS_SAVEBUTTON, IDS_DISCARDBUTTON) == 1)
162 OnApply();
164 SetModified(FALSE);
166 CString cmd,output;
167 int index;
168 index = this->m_ctrlRemoteList.GetCurSel();
169 if(index<0)
171 m_strUrl.Empty();
172 m_strRemote.Empty();
173 m_strPuttyKeyfile.Empty();
174 this->UpdateData(FALSE);
175 return;
177 CString remote;
178 m_ctrlRemoteList.GetText(index,remote);
179 this->m_strRemote=remote;
181 cmd.Format(_T("remote.%s.url"),remote);
182 m_strUrl.Empty();
183 m_strUrl = g_Git.GetConfigValue(cmd, CP_UTF8);
185 cmd.Format(_T("remote.%s.puttykeyfile"),remote);
187 this->m_strPuttyKeyfile = g_Git.GetConfigValue(cmd, CP_UTF8);
189 m_ChangedMask=0;
191 GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(TRUE);
192 GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(TRUE);
193 this->UpdateData(FALSE);
197 void CSettingGitRemote::OnEnChangeEditRemote()
199 m_ChangedMask|=REMOTE_NAME;
201 this->UpdateData();
202 if( (!this->m_strRemote.IsEmpty())&&(!this->m_strUrl.IsEmpty()) )
203 this->SetModified();
204 else
205 this->SetModified(0);
208 void CSettingGitRemote::OnEnChangeEditUrl()
210 m_ChangedMask|=REMOTE_URL;
212 this->UpdateData();
213 if( (!this->m_strRemote.IsEmpty())&&(!this->m_strUrl.IsEmpty()) )
214 this->SetModified();
215 else
216 this->SetModified(0);
219 void CSettingGitRemote::OnEnChangeEditPuttyKey()
221 m_ChangedMask|=REMOTE_PUTTYKEY;
223 this->UpdateData();
224 if( (!this->m_strRemote.IsEmpty())&&(!this->m_strUrl.IsEmpty()) )
225 this->SetModified();
226 else
227 this->SetModified(0);
229 void CSettingGitRemote::Save(CString key,CString value)
231 CString cmd,out;
233 cmd.Format(_T("remote.%s.%s"),this->m_strRemote,key);
234 if (g_Git.SetConfigValue(cmd, value, CONFIG_LOCAL, CP_UTF8, &g_Git.m_CurrentDir))
236 CString msg;
237 msg.Format(IDS_PROC_SAVECONFIGFAILED, cmd, value);
238 CMessageBox::Show(NULL, msg, _T("TortoiseGit"), MB_OK | MB_ICONERROR);
241 BOOL CSettingGitRemote::OnApply()
243 CWaitCursor wait;
244 this->UpdateData();
245 if(m_ChangedMask & REMOTE_NAME)
247 //Add Remote
248 if(m_strRemote.IsEmpty())
250 CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_REMOTEEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
251 return FALSE;
253 if(m_strUrl.IsEmpty())
255 CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_URLEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
256 return FALSE;
258 CString cmd,out;
259 cmd.Format(_T("git.exe remote add \"%s\" \"%s\""),m_strRemote,m_strUrl);
260 if (g_Git.Run(cmd, &out, CP_UTF8))
262 CMessageBox::Show(NULL,out,_T("TorotiseGit"),MB_OK|MB_ICONERROR);
263 return FALSE;
265 m_ChangedMask &= ~REMOTE_URL;
267 this->m_ctrlRemoteList.AddString(m_strRemote);
268 GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(TRUE);
270 if(m_ChangedMask & REMOTE_URL)
272 m_strUrl.Replace(L'\\', L'/');
273 Save(_T("url"),this->m_strUrl);
276 if(m_ChangedMask & REMOTE_PUTTYKEY)
278 Save(_T("puttykeyfile"),this->m_strPuttyKeyfile);
281 SetModified(FALSE);
283 m_ChangedMask = 0;
284 return ISettingsPropPage::OnApply();
286 void CSettingGitRemote::OnBnClickedButtonRemove()
288 int index;
289 index=m_ctrlRemoteList.GetCurSel();
290 if(index>=0)
292 CString str;
293 m_ctrlRemoteList.GetText(index,str);
294 CString msg;
295 msg.Format(IDS_PROC_GITCONFIG_DELETEREMOTE, str);
296 if(CMessageBox::Show(NULL, msg, _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION) == IDYES)
298 CString cmd,out;
299 cmd.Format(_T("git.exe remote rm %s"),str);
300 if (g_Git.Run(cmd, &out, CP_UTF8))
302 CMessageBox::Show(NULL, out,_T("TortoiseGit"),MB_OK|MB_ICONERROR);
303 return;
306 m_ctrlRemoteList.DeleteString(index);
307 OnLbnSelchangeListRemote();