/******************************************************************************* * Copyright (c) 2006, 2017 IBM Corporation and others. * 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 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.team.examples.filesystem.ui; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IStorage; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.content.IContentType; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.team.core.history.IFileRevision; import org.eclipse.team.examples.filesystem.FileSystemPlugin; import org.eclipse.team.ui.history.HistoryPage; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IEditorRegistry; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.BaseSelectionListenerAction; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.progress.IProgressService; public class OpenFileSystemRevisionAction extends BaseSelectionListenerAction { private IStructuredSelection selection; HistoryPage page; public OpenFileSystemRevisionAction(String text) { super(text); } public void run() { IStructuredSelection structSel = selection; Object[] objArray = structSel.toArray(); for (int i = 0; i < objArray.length; i++) { Object tempRevision = objArray[i]; final IFileRevision revision = (IFileRevision) tempRevision; if (revision == null || !revision.exists()) { MessageDialog.openError(page.getSite().getShell(), "Deleted Revision", "Can't open a deleted revision"); } else { IRunnableWithProgress runnable = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException { IStorage file; try { file = revision.getStorage(monitor); String id = getEditorID(file.getName(), file.getContents()); if (file instanceof IFile) { //if this is the current workspace file, open it IDE.openEditor(page.getSite().getPage(), (IFile) file); } else { FileSystemRevisionEditorInput fileRevEditorInput = new FileSystemRevisionEditorInput(revision); if (!editorAlreadyOpenOnContents(fileRevEditorInput)) page.getSite().getPage().openEditor(fileRevEditorInput, id); } } catch (CoreException e) { throw new InvocationTargetException(e); } } }; IProgressService progressService = PlatformUI.getWorkbench().getProgressService(); try { progressService.run(false, false, runnable); } catch (InvocationTargetException e) { // ignore } catch (InterruptedException e) { // ignore } } } } /* private */String getEditorID(String fileName, InputStream contents) { IWorkbench workbench = FileSystemPlugin.getPlugin().getWorkbench(); IEditorRegistry registry = workbench.getEditorRegistry(); IContentType type = null; if (contents != null) { try { type = Platform.getContentTypeManager().findContentTypeFor(contents, fileName); } catch (IOException e) { // ignore } } if (type == null) { type = Platform.getContentTypeManager().findContentTypeFor(fileName); } IEditorDescriptor descriptor = registry.getDefaultEditor(fileName, type); String id; if (descriptor == null || descriptor.isOpenExternal()) { id = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$ } else { id = descriptor.getId(); } return id; } protected boolean updateSelection(IStructuredSelection selection) { this.selection = selection; return shouldShow(); } public void setPage(HistoryPage page) { this.page = page; } private boolean shouldShow() { IStructuredSelection structSel = selection; Object[] objArray = structSel.toArray(); if (objArray.length == 0) return false; for (int i = 0; i < objArray.length; i++) { IFileRevision revision = (IFileRevision) objArray[i]; //check to see if any of the selected revisions are deleted revisions if (revision != null && !revision.exists()) return false; } return true; } boolean editorAlreadyOpenOnContents(FileSystemRevisionEditorInput input) { IEditorReference[] editorRefs = page.getSite().getPage().getEditorReferences(); for (int i = 0; i < editorRefs.length; i++) { IEditorPart part = editorRefs[i].getEditor(false); if (part != null && part.getEditorInput() instanceof FileSystemRevisionEditorInput) { IFileRevision inputRevision = (IFileRevision) input.getAdapter(IFileRevision.class); IFileRevision editorRevision = part.getEditorInput().getAdapter(IFileRevision.class); if (inputRevision.equals(editorRevision)) { //make the editor that already contains the revision current page.getSite().getPage().activate(part); return true; } } } return false; } }