/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.eclipse.ide.ui.utils; import org.eclipse.core.filebuffers.FileBuffers; import org.eclipse.core.filebuffers.ITextFileBuffer; import org.eclipse.core.filebuffers.ITextFileBufferManager; import org.eclipse.core.filebuffers.LocationKind; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextOperationTarget; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.texteditor.ITextEditor; import tern.ITernProject; import tern.eclipse.ide.core.IIDETernProject; import tern.eclipse.ide.core.TernCorePlugin; import tern.eclipse.ide.internal.ui.Trace; import tern.eclipse.ide.ui.TernUIPlugin; import tern.server.protocol.outline.IJSNode; import tern.utils.StringUtils; /** * Editor utilities. * */ public class EditorUtils { private EditorUtils() { } public static IEditorPart openInEditor(IFile file, int start, int length, boolean activate) { IEditorPart editor = null; IWorkbenchPage page = TernUIPlugin.getActivePage(); try { if (start > 0) { editor = IDE.openEditor(page, file, activate); ITextEditor textEditor = null; if (editor instanceof ITextEditor) textEditor = (ITextEditor) editor; else if (editor instanceof IAdaptable) textEditor = (ITextEditor) editor .getAdapter(ITextEditor.class); if (textEditor != null) { IDocument document = textEditor.getDocumentProvider() .getDocument(editor.getEditorInput()); // int start = document.getLineOffset(line - 1); textEditor.selectAndReveal(start, length); page.activate(editor); } else { IMarker marker = file .createMarker("org.eclipse.core.resources.textmarker"); marker.setAttribute("lineNumber", start); editor = IDE.openEditor(page, marker, activate); marker.delete(); } } else { editor = IDE.openEditor(page, file, activate); } } catch (CoreException e) { e.printStackTrace(); } return editor; } public static void openInEditor(IJSNode node) { IFile file = getFile(node); openInEditor(node, file); } public static void openInEditor(IJSNode node, IFile file) { if (file != null && file.exists()) { Long start = node.getStart(); Long end = node.getEnd(); EditorUtils.openInEditor( file, start != null ? start.intValue() : -1, start != null && end != null ? end.intValue() - start.intValue() : -1, true); } } public static IFile getFile(IJSNode node) { IIDETernProject ternProject = (IIDETernProject) node.getTernProject(); String file = node.getFile(); if (StringUtils.isEmpty(file)) { return null; } return ternProject.getIDEFile(node.getFile()); } /** * Returns the file of the given editor and null otherwise. * * @param editor * @return the file of the given editor and null otherwise. */ public static IFile getFile(IEditorPart editor) { IResource resource = getResource(editor); return (resource != null && resource.getType() == IResource.FILE ? (IFile) resource : null); } /** * Returns the resource of the given editor and null otherwise. * * @param editor * @return the resource of the given editor and null otherwise. */ public static IResource getResource(IEditorPart editor) { return (IResource) editor.getEditorInput().getAdapter(IResource.class); } public static ITextEditor getEditor(IWorkbenchPartReference ref) { IWorkbenchPart part = ref.getPart(true);// ref.getPage().getActivePart(); if (part != null && part instanceof ITextEditor) { return (ITextEditor) part; } return null; } public static IDocument getDocument(ITextEditor editor) { return editor.getDocumentProvider().getDocument( editor.getEditorInput()); } public static ISourceViewer getSourceViewer(IEditorPart editor) { if (editor == null) { return null; } ISourceViewer viewer = (ISourceViewer) editor .getAdapter(ITextOperationTarget.class); return viewer; } /** * Returns the file from the given {@link IDocument}. */ public static IFile getFile(IDocument document) { ITextFileBufferManager bufferManager = FileBuffers .getTextFileBufferManager(); // get the buffer manager ITextFileBuffer buffer = bufferManager.getTextFileBuffer(document); IPath location = buffer == null ? null : buffer.getLocation(); if (location == null) { return null; } return ResourcesPlugin.getWorkspace().getRoot().getFile(location); } /** * Returns the {@link IDocument} from the given file and null if it's not * possible. */ public static IDocument getDocument(IFile file) { ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager(); IPath location = file.getLocation(); boolean connected = false; try { ITextFileBuffer buffer = manager.getTextFileBuffer(location, LocationKind.NORMALIZE); if (buffer == null) { // no existing file buffer..create one manager.connect(location, LocationKind.NORMALIZE, new NullProgressMonitor()); connected = true; buffer = manager.getTextFileBuffer(location, LocationKind.NORMALIZE); if (buffer == null) { return null; } } return buffer.getDocument(); } catch (CoreException ce) { Trace.trace(Trace.SEVERE, "Error while get document from file", ce); return null; } finally { if (connected) { try { manager.disconnect(location, LocationKind.NORMALIZE, new NullProgressMonitor()); } catch (CoreException e) { Trace.trace(Trace.SEVERE, "Error while get document from file", e); } } } } }