diff options
author | Konrad Kügler | 2014-02-15 18:33:09 +0000 |
---|---|---|
committer | Konrad Kügler | 2014-03-30 21:27:33 +0000 |
commit | df90f993af83abcfe818e595daf61dba08fdb4c6 (patch) | |
tree | e065e6a8acc31446f118df4caab90585136cbd6b | |
parent | f51188fa7f4b702d7cb78d158b171c16a63a48b6 (diff) | |
download | egit-df90f993af83abcfe818e595daf61dba08fdb4c6.tar.gz egit-df90f993af83abcfe818e595daf61dba08fdb4c6.tar.xz egit-df90f993af83abcfe818e595daf61dba08fdb4c6.zip |
Open workspace version from context menu of the compare editor
Bug: 426614
Change-Id: I93393f73d0ba246c45e2d9918b06bcefd9334e1f
Signed-off-by: Konrad Kügler <swamblumat-eclipsebugs@yahoo.de>
5 files changed, 150 insertions, 7 deletions
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/CommitFileRevision.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/CommitFileRevision.java index ee0f2ca420..822b2653e5 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/CommitFileRevision.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/CommitFileRevision.java @@ -35,7 +35,8 @@ import org.eclipse.team.core.history.ITag; * An {@link IFileRevision} for a version of a specified resource in the * specified commit (revision). */ -class CommitFileRevision extends GitFileRevision { +class CommitFileRevision extends GitFileRevision implements + OpenWorkspaceVersionEnabled { private final Repository db; private final RevCommit commit; @@ -61,7 +62,11 @@ class CommitFileRevision extends GitFileRevision { blobId = blob; } - String getGitPath() { + public Repository getRepository() { + return db; + } + + public String getGitPath() { return path; } diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/IndexFileRevision.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/IndexFileRevision.java index a9bb41d213..11aeb0781c 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/IndexFileRevision.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/IndexFileRevision.java @@ -27,7 +27,8 @@ import org.eclipse.osgi.util.NLS; import org.eclipse.team.core.history.IFileRevision; /** An {@link IFileRevision} for the version in the Git index. */ -public class IndexFileRevision extends GitFileRevision { +public class IndexFileRevision extends GitFileRevision implements + OpenWorkspaceVersionEnabled { // This is to maintain compatibility with the old behavior private static final int FIRST_AVAILABLE = -1; @@ -102,4 +103,12 @@ public class IndexFileRevision extends GitFileRevision { CoreText.IndexFileRevision_errorLookingUpPath, path), e)); } } + + public Repository getRepository() { + return db; + } + + public String getGitPath() { + return path; + } } diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/OpenWorkspaceVersionEnabled.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/OpenWorkspaceVersionEnabled.java new file mode 100644 index 0000000000..a5b7233320 --- /dev/null +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/OpenWorkspaceVersionEnabled.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (C) 2014, Konrad Kügler <swamblumat-eclipsebugs@yahoo.de> + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.egit.core.internal.storage; + +import org.eclipse.jgit.lib.Repository; + +/** + * Provides the workspace version of a file. <br> + * + * This interface serves as a hint to GitCompareFileRevisionEditorInput to + * provide a "Open Workspace Version" action to the user. + */ +public interface OpenWorkspaceVersionEnabled { + + /** + * @return the repository containing this file + */ + public Repository getRepository(); + + /** + * @return the file path relative to the repository's working directory + */ + public String getGitPath(); + +} diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/EgitUiEditorUtils.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/EgitUiEditorUtils.java index ceb7ef34ca..bccf1b5068 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/EgitUiEditorUtils.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/EgitUiEditorUtils.java @@ -133,14 +133,16 @@ public class EgitUiEditorUtils { * @param file * File to open an editor for. {@code file} must exist. * @param page + * @return the created editor or null in case of an error */ - public static void openEditor(File file, IWorkbenchPage page) { + public static IEditorPart openEditor(File file, IWorkbenchPage page) { if (!file.exists()) - return; + return null; IFile fileResource = ResourceUtil.getFileForLocation(new Path(file.getAbsolutePath())); if (fileResource != null) { try { - IDE.openEditor(page, fileResource, OpenStrategy.activateOnOpen()); + return IDE.openEditor(page, fileResource, + OpenStrategy.activateOnOpen()); } catch (PartInitException e) { Activator.handleError(UIText.EgitUiEditorUtils_openFailed, e, true); @@ -149,13 +151,14 @@ public class EgitUiEditorUtils { IFileStore store = EFS.getLocalFileSystem().getStore( new Path(file.getAbsolutePath())); try { - IDE.openEditor(page, new FileStoreEditorInput(store), + return IDE.openEditor(page, new FileStoreEditorInput(store), EditorsUI.DEFAULT_TEXT_EDITOR_ID); } catch (PartInitException e) { Activator.handleError(UIText.EgitUiEditorUtils_openFailed, e, true); } } + return null; } private static String getEditorId(FileRevisionEditorInput editorInput) { diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/GitCompareFileRevisionEditorInput.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/GitCompareFileRevisionEditorInput.java index f8c5bc5045..e71256ac30 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/GitCompareFileRevisionEditorInput.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/GitCompareFileRevisionEditorInput.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.egit.ui.internal; +import java.io.File; import java.lang.reflect.InvocationTargetException; import org.eclipse.compare.CompareConfiguration; @@ -33,18 +34,33 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.egit.core.Activator; import org.eclipse.egit.core.internal.storage.IndexFileRevision; +import org.eclipse.egit.core.internal.storage.OpenWorkspaceVersionEnabled; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.graphics.Image; +import org.eclipse.team.core.history.IFileRevision; import org.eclipse.team.internal.ui.Utils; import org.eclipse.team.internal.ui.synchronize.EditableSharedDocumentAdapter.ISharedDocumentAdapterListener; import org.eclipse.team.internal.ui.synchronize.LocalResourceSaveableComparison; import org.eclipse.team.internal.ui.synchronize.LocalResourceTypedElement; import org.eclipse.team.ui.synchronize.SaveableCompareEditorInput; +import org.eclipse.ui.IEditorPart; import org.eclipse.ui.ISaveablesLifecycleListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.Saveable; import org.eclipse.ui.SaveablesLifecycleEvent; +import org.eclipse.ui.texteditor.ITextEditor; /** * The input provider for the compare editor when working on resources @@ -449,6 +465,85 @@ public class GitCompareFileRevisionEditorInput extends SaveableCompareEditorInpu } } } + + @Override + public void registerContextMenu(MenuManager menu, + final ISelectionProvider selectionProvider) { + super.registerContextMenu(menu, selectionProvider); + registerOpenWorkspaceVersion(menu, selectionProvider); + } + + private void registerOpenWorkspaceVersion(MenuManager menu, + final ISelectionProvider selectionProvider) { + FileRevisionTypedElement leftRevision = getLeftRevision(); + if (leftRevision != null) { + IFileRevision fileRevision = leftRevision.getFileRevision(); + if (fileRevision instanceof OpenWorkspaceVersionEnabled) { + OpenWorkspaceVersionEnabled workspaceVersion = (OpenWorkspaceVersionEnabled) fileRevision; + final File workspaceFile = new File(workspaceVersion + .getRepository().getWorkTree(), + workspaceVersion.getGitPath()); + if (workspaceFile.exists()) + menu.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + Action action = new OpenWorkspaceVersionAction( + UIText.CommitFileDiffViewer_OpenWorkingTreeVersionInEditorMenuLabel, + selectionProvider, workspaceFile); + manager.insertAfter("file", action); //$NON-NLS-1$ + } + }); + } + } + } + + private class OpenWorkspaceVersionAction extends Action { + + private final ISelectionProvider selectionProvider; + + private final File workspaceFile; + + private OpenWorkspaceVersionAction(String text, + ISelectionProvider selectionProvider, File workspaceFile) { + super(text); + this.selectionProvider = selectionProvider; + this.workspaceFile = workspaceFile; + } + + @Override + public void run() { + int selectedLine = 0; + if (selectionProvider.getSelection() instanceof ITextSelection) { + ITextSelection selection = (ITextSelection) selectionProvider + .getSelection(); + selectedLine = selection.getStartLine(); + } + + IWorkbenchWindow window = PlatformUI.getWorkbench() + .getActiveWorkbenchWindow(); + IWorkbenchPage page = window.getActivePage(); + IEditorPart editor = EgitUiEditorUtils.openEditor(workspaceFile, + page); + selectLine(editor, selectedLine); + } + + private void selectLine(IEditorPart editorPart, int selectedLine) { + if (editorPart instanceof ITextEditor) { + ITextEditor editor = (ITextEditor) editorPart; + IDocument document = editor.getDocumentProvider().getDocument( + editor.getEditorInput()); + if (document != null) + try { + IRegion line = document + .getLineInformation(selectedLine); + editor.selectAndReveal(line.getOffset(), 0); + } catch (BadLocationException e) { + // line seems not to exist in + // workspace version + } + } + } + } + /** * ITypedElement without content. May be used to indicate that a file is not * available. |