From e758e12da4e6ff2ef989abedf7fa11875a278789 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Thu, 9 Apr 2009 22:19:28 +0800 Subject: [PATCH] Detect clipboard URL at clone and push and pull dialog URL input box. Signed-off-by: Frank Li --- src/TortoiseProc/AppUtils.cpp | 49 ++++++++++++++++++++++++++++++++++++ src/TortoiseProc/AppUtils.h | 2 ++ src/TortoiseProc/CloneDlg.cpp | 8 +++++- src/TortoiseProc/PullFetchDlg.cpp | 24 +++++++++++++++--- src/TortoiseProc/PullFetchDlg.h | 3 ++- src/TortoiseProc/PushDlg.cpp | 6 ++++- src/TortoiseProc/TortoiseProc.vcproj | 28 +++++++++++++-------- 7 files changed, 104 insertions(+), 16 deletions(-) diff --git a/src/TortoiseProc/AppUtils.cpp b/src/TortoiseProc/AppUtils.cpp index 7feffa1..38a9846 100644 --- a/src/TortoiseProc/AppUtils.cpp +++ b/src/TortoiseProc/AppUtils.cpp @@ -1868,3 +1868,52 @@ bool CAppUtils::IsSSHPutty() } return false; } + +CString CAppUtils::GetClipboardLink() +{ + if (!OpenClipboard(NULL)) + return CString(); + + CString sClipboardText; + HGLOBAL hglb = GetClipboardData(CF_TEXT); + if (hglb) + { + LPCSTR lpstr = (LPCSTR)GlobalLock(hglb); + sClipboardText = CString(lpstr); + GlobalUnlock(hglb); + } + hglb = GetClipboardData(CF_UNICODETEXT); + if (hglb) + { + LPCTSTR lpstr = (LPCTSTR)GlobalLock(hglb); + sClipboardText = lpstr; + GlobalUnlock(hglb); + } + CloseClipboard(); + + if(!sClipboardText.IsEmpty()) + { + if(sClipboardText[0] == _T('\"') && sClipboardText[sClipboardText.GetLength()-1] == _T('\"')) + sClipboardText=sClipboardText.Mid(1,sClipboardText.GetLength()-2); + + if(sClipboardText.Find( _T("http://")) == 0) + return sClipboardText; + + if(sClipboardText.Find( _T("https://")) == 0) + return sClipboardText; + + if(sClipboardText.Find( _T("git://")) == 0) + return sClipboardText; + + if(sClipboardText.Find( _T("ssh://")) == 0) + return sClipboardText; + + if(sClipboardText.GetLength()>=2) + if( sClipboardText[1] == _T(':') ) + if( (sClipboardText[0] >= 'A' && sClipboardText[0] <= 'Z') + || (sClipboardText[0] >= 'a' && sClipboardText[0] <= 'z') ) + return sClipboardText; + } + + return CString(_T("")); +} \ No newline at end of file diff --git a/src/TortoiseProc/AppUtils.h b/src/TortoiseProc/AppUtils.h index bdd1363..69aec1b 100644 --- a/src/TortoiseProc/AppUtils.h +++ b/src/TortoiseProc/AppUtils.h @@ -191,6 +191,8 @@ public: static bool LaunchPAgent(CString *keyfile=NULL,CString * pRemote=NULL); + static CString GetClipboardLink(); + private: static CString PickDiffTool(const CTGitPath& file1, const CTGitPath& file2); static bool GetMimeType(const CTGitPath& file, CString& mimetype); diff --git a/src/TortoiseProc/CloneDlg.cpp b/src/TortoiseProc/CloneDlg.cpp index eea84de..25b5826 100644 --- a/src/TortoiseProc/CloneDlg.cpp +++ b/src/TortoiseProc/CloneDlg.cpp @@ -52,7 +52,13 @@ BOOL CCloneDlg::OnInitDialog() m_URLCombo.SetURLHistory(TRUE); m_URLCombo.LoadHistory(_T("Software\\TortoiseGit\\History\\repoURLS"), _T("url")); if(m_URL.IsEmpty()) - m_URLCombo.SetCurSel(0); + { + CString str=CAppUtils::GetClipboardLink(); + if(str.IsEmpty()) + m_URLCombo.SetCurSel(0); + else + m_URLCombo.SetWindowText(str); + } else m_URLCombo.SetWindowText(m_URL); diff --git a/src/TortoiseProc/PullFetchDlg.cpp b/src/TortoiseProc/PullFetchDlg.cpp index ef8a0f0..5e2f3e6 100644 --- a/src/TortoiseProc/PullFetchDlg.cpp +++ b/src/TortoiseProc/PullFetchDlg.cpp @@ -67,23 +67,39 @@ BOOL CPullFetchDlg::OnInitDialog() m_Other.SetURLHistory(TRUE); m_Other.LoadHistory(_T("Software\\TortoiseGit\\History\\PullURLS"), _T("url")); - m_Other.SetCurSel(0); + CString clippath=CAppUtils::GetClipboardLink(); + if(clippath.IsEmpty()) + m_Other.SetCurSel(0); + else + m_Other.SetWindowText(clippath); m_RemoteBranch.LoadHistory(_T("Software\\TortoiseGit\\History\\PullRemoteBranch"), _T("br")); m_RemoteBranch.SetCurSel(0); + CString WorkingDir=g_Git.m_CurrentDir; + if(m_IsPull) - this->SetWindowTextW(_T("Pull")); + this->SetWindowTextW(CString(_T("Pull - "))+WorkingDir); else - this->SetWindowTextW(_T("Fetch")); + this->SetWindowTextW(CString(_T("Fetch - "))+WorkingDir); STRING_VECTOR list; + + CRegString remote(CString(_T("Software\\TortoiseGit\\History\\PullRemote\\")+WorkingDir)); + m_RemoteReg = remote; + int sel=0; if(!g_Git.GetRemoteList(list)) { for(unsigned int i=0;im_RemoteManage.SetURL(CString()); return TRUE; @@ -127,6 +143,8 @@ void CPullFetchDlg::OnBnClickedOk() } + m_RemoteReg = m_Remote.GetString(); + m_Other.SaveHistory(); m_RemoteBranch.SaveHistory(); this->OnOK(); diff --git a/src/TortoiseProc/PullFetchDlg.h b/src/TortoiseProc/PullFetchDlg.h index f8f5184..3297236 100644 --- a/src/TortoiseProc/PullFetchDlg.h +++ b/src/TortoiseProc/PullFetchDlg.h @@ -3,6 +3,7 @@ #include "StandAloneDlg.h" #include "HistoryCombo.h" #include "HyperLink.h" +#include "registry.h" // CPullFetchDlg dialog class CPullFetchDlg : public CResizableStandAloneDialog @@ -22,7 +23,7 @@ protected: CHistoryCombo m_Other; CHistoryCombo m_RemoteBranch; virtual BOOL OnInitDialog(); - + CRegString m_RemoteReg; DECLARE_MESSAGE_MAP() public: diff --git a/src/TortoiseProc/PushDlg.cpp b/src/TortoiseProc/PushDlg.cpp index 8f181be..7022c2a 100644 --- a/src/TortoiseProc/PushDlg.cpp +++ b/src/TortoiseProc/PushDlg.cpp @@ -87,7 +87,11 @@ BOOL CPushDlg::OnInitDialog() CString WorkingDir=g_Git.m_CurrentDir; WorkingDir.Replace(_T(':'),_T('_')); m_RemoteURL.LoadHistory(CString(_T("Software\\TortoiseGit\\History\\PushURLS\\"))+WorkingDir, _T("url")); - m_RemoteURL.SetCurSel(0); + CString clippath=CAppUtils::GetClipboardLink(); + if(clippath.IsEmpty()) + m_RemoteURL.SetCurSel(0); + else + m_RemoteURL.SetWindowText(clippath); m_RemoteURL.EnableWindow(FALSE); CheckRadioButton(IDC_RD_REMOTE,IDC_RD_URL,IDC_RD_REMOTE); diff --git a/src/TortoiseProc/TortoiseProc.vcproj b/src/TortoiseProc/TortoiseProc.vcproj index ced05cc..4209ea9 100644 --- a/src/TortoiseProc/TortoiseProc.vcproj +++ b/src/TortoiseProc/TortoiseProc.vcproj @@ -556,11 +556,11 @@ > + + + + @@ -836,11 +844,11 @@ >