OSDN Git Service

Fix Issue 91: clone dialog generates bad directory name based on URL, ignores overrid
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / CloneDlg.cpp
index 2207031..f391552 100644 (file)
@@ -6,7 +6,7 @@
 #include "CloneDlg.h"\r
 #include "BrowseFolder.h"\r
 #include "MessageBox.h"\r
-\r
+#include "AppUtils.h"\r
 // CCloneDlg dialog\r
 \r
 IMPLEMENT_DYNCREATE(CCloneDlg, CResizableStandAloneDialog)\r
@@ -15,7 +15,7 @@ CCloneDlg::CCloneDlg(CWnd* pParent /*=NULL*/)
        : CResizableStandAloneDialog(CCloneDlg::IDD, pParent)\r
        , m_Directory(_T(""))\r
 {\r
-\r
+    m_bAutoloadPuttyKeyFile = CAppUtils::IsSSHPutty();\r
 }\r
 \r
 CCloneDlg::~CCloneDlg()\r
@@ -26,7 +26,10 @@ void CCloneDlg::DoDataExchange(CDataExchange* 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
 }\r
 \r
 BOOL CCloneDlg::OnInitDialog()\r
@@ -39,26 +42,51 @@ BOOL CCloneDlg::OnInitDialog()
        AddAnchor(IDOK,BOTTOM_RIGHT);\r
        AddAnchor(IDCANCEL,BOTTOM_RIGHT);\r
 \r
+    AddAnchor(IDC_GROUP_CLONE,TOP_LEFT,BOTTOM_RIGHT);\r
+    AddAnchor(IDC_PUTTYKEYFILE_BROWSE,BOTTOM_RIGHT);\r
+    AddAnchor(IDC_PUTTYKEY_AUTOLOAD,BOTTOM_LEFT);\r
+    AddAnchor(IDC_PUTTYKEYFILE,BOTTOM_LEFT,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
-               m_URLCombo.SetCurSel(0);\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.SetWindowTextW(m_URL);\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
-       EnableSaveRestore(_T("CloneDlg"));\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
        return TRUE;  // return TRUE  unless you set the focus to a control\r
 }\r
 \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
 END_MESSAGE_MAP()\r
 \r
 \r
@@ -70,12 +98,16 @@ void CCloneDlg::OnOK()
        this->m_URLCombo.GetWindowTextW(m_URL);\r
        m_URL.Trim();\r
        UpdateData(TRUE);\r
-       if(m_URL.IsEmpty()||m_Directory.IsEmpty())\r
+       if(m_URL.IsEmpty() || m_Directory.IsEmpty())\r
        {\r
-               CMessageBox::Show(NULL,_T("URL or Dir can't empty"),_T("TortiseGit"),MB_OK);\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
@@ -121,3 +153,122 @@ void CCloneDlg::OnEnChangeCloneDir()
 \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
+       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