OSDN Git Service

Fixed issue #118: Enhancement: "Git Clone" from SVN repository with additional start...
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / CloneDlg.cpp
index f3d83d1..382d3f4 100644 (file)
@@ -4,16 +4,28 @@
 #include "stdafx.h"\r
 #include "TortoiseProc.h"\r
 #include "CloneDlg.h"\r
-\r
-\r
+#include "BrowseFolder.h"\r
+#include "MessageBox.h"\r
+#include "AppUtils.h"\r
 // CCloneDlg dialog\r
 \r
-IMPLEMENT_DYNCREATE(CCloneDlg, CDHtmlDialog)\r
+IMPLEMENT_DYNCREATE(CCloneDlg, CResizableStandAloneDialog)\r
 \r
 CCloneDlg::CCloneDlg(CWnd* pParent /*=NULL*/)\r
-       : CDHtmlDialog(CCloneDlg::IDD, CCloneDlg::IDH, pParent)\r
+       : CResizableStandAloneDialog(CCloneDlg::IDD, pParent)\r
+       , m_Directory(_T(""))\r
 {\r
+    m_bAutoloadPuttyKeyFile = CAppUtils::IsSSHPutty();\r
+\r
+       m_bSVN = FALSE;\r
+       m_bSVNTrunk = FALSE;\r
+       m_bSVNTags = FALSE;\r
+       m_bSVNBranch = FALSE;;\r
+       m_strSVNTrunk = _T("trunk");\r
+       m_strSVNTags = _T("tags");\r
+       m_strSVNBranchs = _T("branches");\r
 \r
+       m_nSVNFrom = 0;\r
 }\r
 \r
 CCloneDlg::~CCloneDlg()\r
@@ -22,47 +34,339 @@ CCloneDlg::~CCloneDlg()
 \r
 void CCloneDlg::DoDataExchange(CDataExchange* pDX)\r
 {\r
-       CDHtmlDialog::DoDataExchange(pDX);\r
+       CResizableStandAloneDialog::DoDataExchange(pDX);\r
+       DDX_Control(pDX, IDC_URLCOMBO, m_URLCombo);\r
+    DDX_Control(pDX, IDC_PUTTYKEYFILE, m_PuttyKeyCombo);\r
+       DDX_Text(pDX, IDC_CLONE_DIR, m_Directory);\r
+    DDX_Check(pDX,IDC_PUTTYKEY_AUTOLOAD, m_bAutoloadPuttyKeyFile);\r
+\r
+       DDX_Check(pDX,IDC_CHECK_SVN, m_bSVN);\r
+       DDX_Check(pDX,IDC_CHECK_SVN_TRUNK, m_bSVNTrunk);\r
+       DDX_Check(pDX,IDC_CHECK_SVN_TAG, m_bSVNTags);\r
+       DDX_Check(pDX,IDC_CHECK_SVN_BRANCH, m_bSVNBranch);\r
+       DDX_Check(pDX,IDC_CHECK_SVN_FROM, m_bSVNFrom);\r
+\r
+       DDX_Text(pDX, IDC_EDIT_SVN_TRUNK, m_strSVNTrunk);\r
+       DDX_Text(pDX, IDC_EDIT_SVN_TAG, m_strSVNTags);\r
+       DDX_Text(pDX, IDC_EDIT_SVN_BRANCH, m_strSVNBranchs);\r
+       DDX_Text(pDX, IDC_EDIT_SVN_FROM, this->m_nSVNFrom);\r
+\r
 }\r
 \r
 BOOL CCloneDlg::OnInitDialog()\r
 {\r
-       CDHtmlDialog::OnInitDialog();\r
+       CResizableStandAloneDialog::OnInitDialog();\r
+       AddAnchor(IDC_URLCOMBO, TOP_LEFT, TOP_RIGHT);\r
+       AddAnchor(IDC_CLONE_BROWSE_URL, TOP_RIGHT);\r
+       AddAnchor(IDC_CLONE_DIR, TOP_LEFT,TOP_RIGHT);\r
+       AddAnchor(IDC_CLONE_DIR_BROWSE, TOP_RIGHT);\r
+       AddAnchor(IDOK,BOTTOM_RIGHT);\r
+       AddAnchor(IDCANCEL,BOTTOM_RIGHT);\r
+\r
+    AddAnchor(IDC_GROUP_CLONE,TOP_LEFT,TOP_RIGHT);\r
+    AddAnchor(IDC_PUTTYKEYFILE_BROWSE,TOP_RIGHT);\r
+    AddAnchor(IDC_PUTTYKEY_AUTOLOAD,TOP_LEFT);\r
+    AddAnchor(IDC_PUTTYKEYFILE,TOP_LEFT,TOP_RIGHT);\r
+       AddAnchor(IDC_CLONE_GROUP_SVN,TOP_LEFT,TOP_RIGHT);\r
+       AddAnchor(IDHELP, BOTTOM_RIGHT);\r
+\r
+       this->AddOthersToAnchor();\r
+\r
+       m_URLCombo.SetURLHistory(TRUE);\r
+       m_URLCombo.LoadHistory(_T("Software\\TortoiseGit\\History\\repoURLS"), _T("url"));\r
+       if(m_URL.IsEmpty())\r
+       {\r
+               CString str=CAppUtils::GetClipboardLink();\r
+               if(str.IsEmpty())\r
+                       m_URLCombo.SetCurSel(0);\r
+               else\r
+                       m_URLCombo.SetWindowText(str);\r
+       }\r
+       else\r
+               m_URLCombo.SetWindowText(m_URL);\r
+\r
+       CWnd *window=this->GetDlgItem(IDC_CLONE_DIR);\r
+       if(window)\r
+               SHAutoComplete(window->m_hWnd, SHACF_FILESYSTEM);\r
+\r
+    m_PuttyKeyCombo.SetPathHistory(TRUE);\r
+    m_PuttyKeyCombo.LoadHistory(_T("Software\\TortoiseGit\\History\\puttykey"), _T("key"));\r
+    m_PuttyKeyCombo.SetCurSel(0);\r
+\r
+    this->GetDlgItem(IDC_PUTTYKEY_AUTOLOAD)->EnableWindow( CAppUtils::IsSSHPutty() );\r
+    this->GetDlgItem(IDC_PUTTYKEYFILE)->EnableWindow(m_bAutoloadPuttyKeyFile);\r
+    this->GetDlgItem(IDC_PUTTYKEYFILE_BROWSE)->EnableWindow(m_bAutoloadPuttyKeyFile);\r
+       \r
+    EnableSaveRestore(_T("CloneDlg"));\r
+       \r
+       OnBnClickedCheckSvn();\r
+\r
        return TRUE;  // return TRUE  unless you set the focus to a control\r
 }\r
 \r
-BEGIN_MESSAGE_MAP(CCloneDlg, CDHtmlDialog)\r
+BEGIN_MESSAGE_MAP(CCloneDlg, CResizableStandAloneDialog)\r
        ON_BN_CLICKED(IDC_CLONE_BROWSE_URL, &CCloneDlg::OnBnClickedCloneBrowseUrl)\r
        ON_BN_CLICKED(IDC_CLONE_DIR_BROWSE, &CCloneDlg::OnBnClickedCloneDirBrowse)\r
+    ON_BN_CLICKED(IDC_PUTTYKEYFILE_BROWSE, &CCloneDlg::OnBnClickedPuttykeyfileBrowse)\r
+    ON_BN_CLICKED(IDC_PUTTYKEY_AUTOLOAD, &CCloneDlg::OnBnClickedPuttykeyAutoload)\r
+       ON_CBN_SELCHANGE(IDC_URLCOMBO, &CCloneDlg::OnCbnSelchangeUrlcombo)\r
+       ON_NOTIFY(CBEN_BEGINEDIT, IDC_URLCOMBO, &CCloneDlg::OnCbenBegineditUrlcombo)\r
+       ON_NOTIFY(CBEN_ENDEDIT, IDC_URLCOMBO, &CCloneDlg::OnCbenEndeditUrlcombo)\r
+       ON_CBN_EDITCHANGE(IDC_URLCOMBO, &CCloneDlg::OnCbnEditchangeUrlcombo)\r
+       ON_BN_CLICKED(IDC_CHECK_SVN, &CCloneDlg::OnBnClickedCheckSvn)\r
+       ON_BN_CLICKED(IDC_CHECK_SVN_TRUNK, &CCloneDlg::OnBnClickedCheckSvnTrunk)\r
+       ON_BN_CLICKED(IDC_CHECK_SVN_TAG, &CCloneDlg::OnBnClickedCheckSvnTag)\r
+       ON_BN_CLICKED(IDC_CHECK_SVN_BRANCH, &CCloneDlg::OnBnClickedCheckSvnBranch)\r
+       ON_BN_CLICKED(IDC_CHECK_SVN_FROM, &CCloneDlg::OnBnClickedCheckSvnFrom)\r
 END_MESSAGE_MAP()\r
 \r
-BEGIN_DHTML_EVENT_MAP(CCloneDlg)\r
-       DHTML_EVENT_ONCLICK(_T("ButtonOK"), OnButtonOK)\r
-       DHTML_EVENT_ONCLICK(_T("ButtonCancel"), OnButtonCancel)\r
-END_DHTML_EVENT_MAP()\r
-\r
 \r
 \r
 // CCloneDlg message handlers\r
 \r
-HRESULT CCloneDlg::OnButtonOK(IHTMLElement* /*pElement*/)\r
+void CCloneDlg::OnOK()\r
 {\r
-       OnOK();\r
-       return S_OK;\r
+       this->m_URLCombo.GetWindowTextW(m_URL);\r
+       m_URL.Trim();\r
+       UpdateData(TRUE);\r
+       if(m_URL.IsEmpty() || m_Directory.IsEmpty())\r
+       {\r
+               CMessageBox::Show(NULL, _T("URL or Directory can't be empty"), _T("TortoiseGit"), MB_OK);\r
+               return;\r
+       }\r
+\r
+       m_URLCombo.SaveHistory();\r
+    m_PuttyKeyCombo.SaveHistory();\r
+\r
+    this->m_PuttyKeyCombo.GetWindowText(m_strPuttyKeyFile);\r
+       CResizableDialog::OnOK();\r
+\r
 }\r
 \r
-HRESULT CCloneDlg::OnButtonCancel(IHTMLElement* /*pElement*/)\r
+void CCloneDlg::OnCancel()\r
 {\r
-       OnCancel();\r
-       return S_OK;\r
+       CResizableDialog::OnCancel();\r
 }\r
 \r
 void CCloneDlg::OnBnClickedCloneBrowseUrl()\r
 {\r
        // TODO: Add your control notification handler code here\r
+       CBrowseFolder browseFolder;\r
+       browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;\r
+       CString strCloneDirectory;\r
+       this->m_URLCombo.GetWindowTextW(strCloneDirectory);\r
+       if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK) \r
+       {\r
+               this->m_URLCombo.SetWindowTextW(strCloneDirectory);\r
+       }\r
 }\r
 \r
 void CCloneDlg::OnBnClickedCloneDirBrowse()\r
 {\r
        // TODO: Add your control notification handler code here\r
+       CBrowseFolder browseFolder;\r
+       browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;\r
+       CString strCloneDirectory = this->m_Directory;\r
+       if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK) \r
+       {\r
+               UpdateData(TRUE);\r
+               m_Directory = strCloneDirectory;\r
+               UpdateData(FALSE);\r
+       }\r
+}\r
+\r
+void CCloneDlg::OnEnChangeCloneDir()\r
+{\r
+       // TODO:  If this is a RICHEDIT control, the control will not\r
+       // send this notification unless you override the CDHtmlDialog::OnInitDialog()\r
+       // function and call CRichEditCtrl().SetEventMask()\r
+       // with the ENM_CHANGE flag ORed into the mask.\r
+\r
+       // TODO:  Add your control notification handler code here\r
+}\r
+\r
+void CCloneDlg::OnBnClickedPuttykeyfileBrowse()\r
+{\r
+    // TODO: Add your control notification handler code here\r
+    CFileDialog dlg(TRUE,NULL,\r
+                                       NULL,\r
+                                       OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,\r
+                                       _T("Putty Private Key(*.ppk)|*.ppk|All Files(*.*)|*.*||"));\r
+       \r
+       this->UpdateData();\r
+       if(dlg.DoModal()==IDOK)\r
+       {\r
+        this->m_PuttyKeyCombo.SetWindowText( dlg.GetPathName() );\r
+       }\r
+\r
+}\r
+\r
+void CCloneDlg::OnBnClickedPuttykeyAutoload()\r
+{\r
+    // TODO: Add your control notification handler code here\r
+    this->UpdateData();\r
+    this->GetDlgItem(IDC_PUTTYKEYFILE)->EnableWindow(m_bAutoloadPuttyKeyFile);\r
+    this->GetDlgItem(IDC_PUTTYKEYFILE_BROWSE)->EnableWindow(m_bAutoloadPuttyKeyFile);\r
+\r
+}\r
+\r
+void CCloneDlg::OnCbnSelchangeUrlcombo()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+}\r
+\r
+void CCloneDlg::OnCbenBegineditUrlcombo(NMHDR *pNMHDR, LRESULT *pResult)\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       *pResult = 0;\r
+}\r
+\r
+void CCloneDlg::OnCbenEndeditUrlcombo(NMHDR *pNMHDR, LRESULT *pResult)\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       *pResult = 0;\r
+}\r
+\r
+void CCloneDlg::OnCbnEditchangeUrlcombo()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       this->UpdateData();\r
+       CString url;\r
+       m_URLCombo.GetWindowText(url);\r
+\r
+       if(m_OldURL == url )\r
+               return;\r
+\r
+       m_OldURL=url;\r
+\r
+       //if(url.IsEmpty())\r
+       //      return;\r
+\r
+       CString old;\r
+       old=m_ModuleName;\r
+\r
+       url.Replace(_T('\\'),_T('/'));\r
+       int start=url.ReverseFind(_T('/'));\r
+       if(start<0)\r
+       {\r
+               start = url.ReverseFind(_T(':'));\r
+               if(start <0)\r
+                       start = url.ReverseFind(_T('@'));\r
+\r
+               if(start<0)\r
+                       start = 0;\r
+       }\r
+       CString temp;\r
+       temp=url.Mid(start+1);\r
+       \r
+       temp=temp.MakeLower();\r
+\r
+       int end;\r
+       end=temp.Find(_T(".git"));\r
+       if(end<0)\r
+               end=temp.GetLength();\r
+\r
+       //CString modulename;\r
+       m_ModuleName=url.Mid(start+1,end);\r
+       \r
+       start = m_Directory.ReverseFind(_T('\\'));\r
+       if(start <0 )\r
+               start = m_Directory.ReverseFind(_T('/'));\r
+       if(start <0 )\r
+               start =0;\r
+\r
+       int dirstart=m_Directory.Find(old,start);\r
+       if(dirstart>=0 && (dirstart+old.GetLength() == m_Directory.GetLength()) )\r
+       {\r
+               m_Directory=m_Directory.Left(dirstart);\r
+               m_Directory+=m_ModuleName;\r
+\r
+       }else\r
+       {\r
+               if(m_Directory.GetLength()>0 && \r
+                       (m_Directory[m_Directory.GetLength()-1] != _T('\\') ||\r
+                       m_Directory[m_Directory.GetLength()-1] != _T('/') ) )\r
+               {\r
+                       m_Directory+=_T('\\');\r
+               }\r
+               m_Directory += m_ModuleName;\r
+       }\r
+\r
+       if(m_Directory.GetLength()>0)\r
+       {\r
+               if( m_Directory[m_Directory.GetLength()-1] == _T('\\') ||\r
+                       m_Directory[m_Directory.GetLength()-1] == _T('/')\r
+                  )\r
+               {\r
+                       m_Directory=m_Directory.Left(m_Directory.GetLength()-1);\r
+               }\r
+\r
+       }\r
+       this->UpdateData(FALSE);\r
+}\r
+\r
+void CCloneDlg::OnBnClickedCheckSvn()\r
+{\r
+       this->UpdateData();\r
+\r
+       if(this->m_bSVN)\r
+       {\r
+               CString str;\r
+               m_URLCombo.GetWindowText(str);\r
+\r
+               while(str.GetLength()>=1 && \r
+                       str[str.GetLength()-1] == _T('\\') &&\r
+                       str[str.GetLength()-1] == _T('/'))\r
+               {\r
+                       str=str.Left(str.GetLength()-1);\r
+               }\r
+               if(str.GetLength()>=5 && (str.Right(5).MakeLower() == _T("trunk") ))\r
+               {\r
+                       this->m_bSVNBranch=this->m_bSVNTags=this->m_bSVNTrunk = FALSE;\r
+                       this->UpdateData(FALSE);\r
+               }else\r
+               {\r
+                       this->m_bSVNBranch=this->m_bSVNTags=this->m_bSVNTrunk = TRUE;\r
+                       this->UpdateData(FALSE);\r
+               }\r
+\r
+       }\r
+\r
+       // TODO: Add your control notification handler code here\r
+       OnBnClickedCheckSvnTrunk();\r
+       OnBnClickedCheckSvnTag();\r
+       OnBnClickedCheckSvnBranch();\r
+       OnBnClickedCheckSvnFrom();\r
+}\r
+\r
+void CCloneDlg::OnBnClickedCheckSvnTrunk()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData(TRUE);\r
+       this->GetDlgItem(IDC_CHECK_SVN_TRUNK)->EnableWindow(this->m_bSVN);\r
+       this->GetDlgItem(IDC_EDIT_SVN_TRUNK)->EnableWindow(this->m_bSVNTrunk&&this->m_bSVN);\r
+}\r
+\r
+void CCloneDlg::OnBnClickedCheckSvnTag()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData(TRUE);\r
+       this->GetDlgItem(IDC_CHECK_SVN_TAG)->EnableWindow(this->m_bSVN);\r
+       this->GetDlgItem(IDC_EDIT_SVN_TAG)->EnableWindow(this->m_bSVNTags&&this->m_bSVN);\r
+}\r
+\r
+void CCloneDlg::OnBnClickedCheckSvnBranch()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData(TRUE);\r
+       this->GetDlgItem(IDC_CHECK_SVN_BRANCH)->EnableWindow(this->m_bSVN);\r
+       this->GetDlgItem(IDC_EDIT_SVN_BRANCH)->EnableWindow(this->m_bSVNBranch&&this->m_bSVN);\r
+}\r
+\r
+void CCloneDlg::OnBnClickedCheckSvnFrom()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData(TRUE);\r
+       this->GetDlgItem(IDC_CHECK_SVN_FROM)->EnableWindow(this->m_bSVN);\r
+       this->GetDlgItem(IDC_EDIT_SVN_FROM)->EnableWindow(this->m_bSVNFrom&&this->m_bSVN);\r
 }\r