diff options
Diffstat (limited to 'org.eclipse.egit.ui/src')
4 files changed, 104 insertions, 26 deletions
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 4d094a507f..4fe6911125 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 @@ -53,10 +53,15 @@ import org.eclipse.ui.texteditor.ITextEditor; public class EgitUiEditorUtils { /** + * Opens an {@link IFileRevision} is the configured editor. + * * @param page + * to open the editor in * @param revision + * to open * @param monitor - * @return the part + * for progress reporting + * @return the part; may be {@code null} if an external editor was opened * @throws CoreException */ public static IEditorPart openEditor(IWorkbenchPage page, @@ -94,35 +99,39 @@ public class EgitUiEditorUtils { SubMonitor progress = SubMonitor.convert(monitor, 1); FileRevisionEditorInput fileRevEditorInput = FileRevisionEditorInput .createEditorInputFor(revision, progress.newChild(1)); - openEditor(page, fileRevEditorInput, EditorsUI.DEFAULT_TEXT_EDITOR_ID); + page.openEditor(fileRevEditorInput, EditorsUI.DEFAULT_TEXT_EDITOR_ID); } /** + * Opens an editor for a {@link FileRevisionEditorInput}. + * * @param page + * to open the editor in * @param editorInput - * @return the part + * to open + * @return the part; may be {@code null} if an external editor was opened * @throws PartInitException */ public static IEditorPart openEditor(IWorkbenchPage page, FileRevisionEditorInput editorInput) throws PartInitException { - String id = getEditorId(editorInput); - return openEditor(page, editorInput, id); + return openEditor(page, editorInput, getEditor(editorInput)); } /** * @param page * @param editorInput - * @param editorId + * @param editor * @return the part * @throws PartInitException */ private static IEditorPart openEditor(IWorkbenchPage page, - FileRevisionEditorInput editorInput, String editorId) + FileRevisionEditorInput editorInput, IEditorDescriptor editor) throws PartInitException { + String editorId = editor.getId(); try { IEditorPart part = page.openEditor(editorInput, editorId, OpenStrategy.activateOnOpen()); - if (part == null) { + if (part == null && !editor.isOpenExternal()) { throw new PartInitException(NLS.bind( UIText.EgitUiUtils_CouldNotOpenEditorMessage, editorId)); } @@ -167,24 +176,22 @@ public class EgitUiEditorUtils { return null; } - private static String getEditorId(FileRevisionEditorInput editorInput) { - String id = getEditorId(editorInput.getFileRevision().getName(), - getContentType(editorInput)); - return id; - } - - private static String getEditorId(String fileName, IContentType type) { + private static IEditorDescriptor getEditor( + FileRevisionEditorInput editorInput) { IEditorRegistry registry = PlatformUI.getWorkbench() .getEditorRegistry(); + String fileName = editorInput.getFileRevision().getName(); + IContentType type = getContentType(editorInput); IEditorDescriptor descriptor = registry .getDefaultEditor(fileName, type); - String id; - if (descriptor == null || descriptor.isOpenExternal()) { - id = EditorsUI.DEFAULT_TEXT_EDITOR_ID; - } else { - id = descriptor.getId(); + if (descriptor != null) { + descriptor = IDE.overrideDefaultEditorAssociation(editorInput, type, + descriptor); + } + if (descriptor == null) { + descriptor = registry.findEditor(EditorsUI.DEFAULT_TEXT_EDITOR_ID); } - return id; + return descriptor; } private static IContentType getContentType( diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java index 9e76587ab6..78abd80410 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java @@ -3055,6 +3055,9 @@ public class UIText extends NLS { public static String FileRevisionEditorInput_NameAndRevisionTitle; /** */ + public static String FileRevisionEditorInput_cannotWriteTempFile; + + /** */ public static String FileTreeContentProvider_NonWorkspaceResourcesNode; /** */ diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/revision/FileRevisionEditorInput.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/revision/FileRevisionEditorInput.java index 8042ed5c80..dd3ad10bd7 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/revision/FileRevisionEditorInput.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/revision/FileRevisionEditorInput.java @@ -13,8 +13,13 @@ *******************************************************************************/ package org.eclipse.egit.ui.internal.revision; +import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.net.URI; +import java.nio.file.Files; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; import java.util.Date; import org.eclipse.core.resources.IEncodedStorage; @@ -24,13 +29,15 @@ import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.PlatformObject; import org.eclipse.egit.core.AdapterUtils; +import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.internal.PreferenceBasedDateFormatter; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.osgi.util.NLS; import org.eclipse.team.core.history.IFileRevision; +import org.eclipse.ui.IPathEditorInput; import org.eclipse.ui.IPersistableElement; import org.eclipse.ui.IStorageEditorInput; import org.eclipse.ui.model.IWorkbenchAdapter; @@ -39,12 +46,17 @@ import org.eclipse.ui.model.IWorkbenchAdapter; * An Editor input for file revisions */ public class FileRevisionEditorInput extends PlatformObject implements - IWorkbenchAdapter, IStorageEditorInput { + IWorkbenchAdapter, IStorageEditorInput, IPathEditorInput { + + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat( + "yyyyMMdd_HHmmss"); //$NON-NLS-1$ private final Object fileRevision; private final IStorage storage; + private IPath tmpFile = null; + /** * @param revision * the file revision @@ -190,9 +202,9 @@ public class FileRevisionEditorInput extends PlatformObject implements public String getName() { IFileRevision rev = AdapterUtils.adapt(this, IFileRevision.class); if (rev != null) { - return NLS.bind( + return MessageFormat.format( UIText.FileRevisionEditorInput_NameAndRevisionTitle, - new String[] { rev.getName(), rev.getContentIdentifier() }); + rev.getName(), rev.getContentIdentifier()); } IFileState state = AdapterUtils.adapt(this, IFileState.class); if (state != null) { @@ -200,7 +212,6 @@ public class FileRevisionEditorInput extends PlatformObject implements .formatDate(new Date(state.getModificationTime())); } return storage.getName(); - } @Override @@ -289,4 +300,60 @@ public class FileRevisionEditorInput extends PlatformObject implements } return null; } + + @Override + public IPath getPath() { + if (tmpFile == null) { + tmpFile = writeTempFile(); + } + return tmpFile; + } + + private IPath writeTempFile() { + java.nio.file.Path path; + try { + String tempName = getRevisionPrefix() + storage.getName(); + // Same name length limit as in DirCacheCheckout.checkoutEntry() + if (tempName.length() > 200) { + tempName = storage.getName(); + } + path = Files.createTempDirectory("egit") //$NON-NLS-1$ + .resolve(tempName); + try (InputStream in = storage.getContents()) { + Files.copy(in, path); + } + path = path.toAbsolutePath(); + } catch (CoreException | IOException e) { + Activator.logError(MessageFormat.format( + UIText.FileRevisionEditorInput_cannotWriteTempFile, + storage.getName()), e); + // We mustn't return null; doing so might cause an NPE in + // WorkBenchPage.busyOpenEditor() + return new Path(""); //$NON-NLS-1$ + } + File file = path.toFile(); + file.setReadOnly(); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + if (file.setWritable(true) && file.delete()) { + file.getParentFile().delete(); + } else { + // Couldn't delete: re-set as read-only + file.setReadOnly(); + } + })); + return new Path(path.toString()); + } + + private String getRevisionPrefix() { + IFileRevision rev = AdapterUtils.adapt(this, IFileRevision.class); + if (rev != null) { + return rev.getContentIdentifier() + '_'; + } + IFileState state = AdapterUtils.adapt(this, IFileState.class); + if (state != null) { + return DATE_FORMAT.format(new Date(state.getModificationTime())) + + '_'; + } + return ""; //$NON-NLS-1$ + } } diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties index ae69c0f41b..f51b402739 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties @@ -1027,6 +1027,7 @@ FetchWizard_windowTitleWithSource=Fetch from: {0} FileDiffContentProvider_errorGettingDifference=Can''t get file difference of {0}. FileDiffLabelProvider_RenamedFromToolTip=Renamed from {0} FileRevisionEditorInput_NameAndRevisionTitle={0} {1} +FileRevisionEditorInput_cannotWriteTempFile=Cannot write temporary file for {0}. FileTreeContentProvider_NonWorkspaceResourcesNode=Non-workspace files FindToolbar_NextTooltip=Go to next commit matching the search criteria FindToolbar_PreviousTooltip=Go to previous commit matching the search criteria |