From 7f0839e108ce4f76c4bf62a1bb9d4d8b747795ea Mon Sep 17 00:00:00 2001 From: Sven Strickroth Date: Fri, 25 May 2012 18:20:19 +0200 Subject: [PATCH] RepoBrowser: Allow to open files Signed-off-by: Sven Strickroth --- src/TortoiseProc/RepositoryBrowser.cpp | 68 ++++++++++++++++++++++++++++++++-- src/TortoiseProc/RepositoryBrowser.h | 13 ++++++- 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/src/TortoiseProc/RepositoryBrowser.cpp b/src/TortoiseProc/RepositoryBrowser.cpp index d6923d4ec..78270751d 100644 --- a/src/TortoiseProc/RepositoryBrowser.cpp +++ b/src/TortoiseProc/RepositoryBrowser.cpp @@ -259,11 +259,19 @@ void CRepositoryBrowser::OnNMDblclk_RepoList(NMHDR *pNMHDR, LRESULT *pResult) return; CShadowFilesTree * pItem = (CShadowFilesTree *)m_RepoList.GetItemData(pNmItemActivate->iItem); - if (pItem == NULL || !pItem->m_bFolder) + if (pItem == NULL) return; - FillListCtrlForShadowTree(pItem); - m_RepoTree.SelectItem(pItem->m_hTree); + if (!pItem->m_bFolder) + { + OpenFile(pItem->GetFullName(), OPEN); + return; + } + else + { + FillListCtrlForShadowTree(pItem); + m_RepoTree.SelectItem(pItem->m_hTree); + } } void CRepositoryBrowser::Refresh() @@ -463,6 +471,16 @@ void CRepositoryBrowser::OnContextMenu_RepoList(CPoint point) if (selectedLeafs.size() == 1) { + popupMenu.AppendMenuIcon(eCmd_Open, IDS_REPOBROWSE_OPEN, IDI_OPEN); + popupMenu.SetDefaultItem(eCmd_Open, FALSE); + if (!selectedLeafs.at(0)->m_bFolder) + { + popupMenu.AppendMenuIcon(eCmd_OpenWith, IDS_LOG_POPUP_OPENWITH, IDI_OPEN); + popupMenu.AppendMenuIcon(eCmd_OpenWithAlternativeEditor, IDS_LOG_POPUP_VIEWREV); + } + + popupMenu.AppendMenu(MF_SEPARATOR); + CString temp; temp.LoadString(IDS_MENULOG); popupMenu.AppendMenuIcon(eCmd_ViewLog, temp, IDI_LOG); @@ -493,6 +511,15 @@ void CRepositoryBrowser::OnContextMenu_RepoList(CPoint point) CAppUtils::RunTortoiseProc(sCmd); } break; + case eCmd_Open: + OpenFile(selectedLeafs.at(0)->GetFullName(), OPEN); + break; + case eCmd_OpenWith: + OpenFile(selectedLeafs.at(0)->GetFullName(), OPEN_WITH); + break; + case eCmd_OpenWithAlternativeEditor: + OpenFile(selectedLeafs.at(0)->GetFullName(), ALTERNATIVEEDITOR); + break; case eCmd_SaveAs: FileSaveAs(selectedLeafs.at(0)->GetFullName()); break; @@ -816,3 +843,38 @@ void CRepositoryBrowser::FileSaveAs(const CString path) } } } + +void CRepositoryBrowser::OpenFile(const CString path, eOpenType mode) +{ + CTGitPath gitPath(path); + + CString temppath; + CString file; + GetTempPath(temppath); + file.Format(_T("%s%s_%s%s"), temppath, gitPath.GetBaseFilename(), m_sRevision.Left(g_Git.GetShortHASHLength()), gitPath.GetFileExtension()); + + CString out; + if(g_Git.GetOneFile(m_sRevision, gitPath, file)) + { + out.Format(IDS_STATUSLIST_CHECKOUTFILEFAILED, gitPath.GetGitPathString(), m_sRevision, file); + MessageBox(out, _T("TortoiseGit"), MB_OK); + return; + } + + if (mode == ALTERNATIVEEDITOR) + { + CAppUtils::LaunchAlternativeEditor(file); + return; + } + else if (mode == OPEN) + { + int ret = HINSTANCE_ERROR; + ret = (int)ShellExecute(this->m_hWnd, NULL, file, NULL, NULL, SW_SHOW); + + if (ret > HINSTANCE_ERROR) + return; + } + + CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ") + file; + CAppUtils::LaunchApplication(cmd, NULL, false); +} diff --git a/src/TortoiseProc/RepositoryBrowser.h b/src/TortoiseProc/RepositoryBrowser.h index 47422a106..267589105 100644 --- a/src/TortoiseProc/RepositoryBrowser.h +++ b/src/TortoiseProc/RepositoryBrowser.h @@ -77,7 +77,10 @@ public: enum eCmd { - eCmd_ViewLog = WM_APP, + eCmd_Open = WM_APP, + eCmd_OpenWith, + eCmd_OpenWithAlternativeEditor, + eCmd_ViewLog, eCmd_SaveAs, eCmd_CopyPath, }; @@ -89,6 +92,13 @@ public: eCol_FileSize, }; + enum eOpenType + { + ALTERNATIVEEDITOR, + OPEN, + OPEN_WITH, + }; + private: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support @@ -122,6 +132,7 @@ private: void OnContextMenu_RepoList(CPoint point); void FileSaveAs(const CString path); + void OpenFile(const CString path, eOpenType mode); afx_msg void OnBnClickedButtonRevision(); -- 2.11.4.GIT