/******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpeclipse.phpeditor; import net.sourceforge.phpdt.core.ICompilationUnit; import net.sourceforge.phpdt.core.IJavaElement; import net.sourceforge.phpdt.core.IJavaProject; import net.sourceforge.phpdt.core.IMember; import net.sourceforge.phpdt.core.IWorkingCopy; import net.sourceforge.phpdt.core.JavaCore; import net.sourceforge.phpdt.core.JavaModelException; import net.sourceforge.phpdt.internal.corext.util.JavaModelUtil; import net.sourceforge.phpdt.ui.JavaUI; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.jface.action.Action; import org.eclipse.swt.SWT; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorRegistry; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.texteditor.ITextEditor; /** * A number of routines for working with JavaElements in editors * * Use 'isOpenInEditor' to test if an element is already open in a editor Use * 'openInEditor' to force opening an element in a editor With 'getWorkingCopy' * you get the working copy (element in the editor) of an element */ public class EditorUtility { // public static boolean isEditorInput(Object element, IEditorPart editor) { // if (editor != null) { // try { // return editor.getEditorInput().equals(getEditorInput(element)); // } catch (JavaModelException x) { // PHPeclipsePlugin.log(x.getStatus()); // } // } // return false; // } /** * Tests if a cu is currently shown in an editor * * @return the IEditorPart if shown, null if element is not open in an * editor */ // public static IEditorPart isOpenInEditor(Object inputElement) { // IEditorInput input = null; // // try { // input = getEditorInput(inputElement); // } catch (JavaModelException x) { // PHPeclipsePlugin.log(x.getStatus()); // } // // if (input != null) { // IWorkbenchPage p = PHPeclipsePlugin.getActivePage(); // if (p != null) { // return p.findEditor(input); // } // } // // return null; // } /** * Opens a Java editor for an element such as IJavaElement, * IFile, or IStorage. The editor is * activated by default. * * @return the IEditorPart or null if wrong element type or opening failed */ public static IEditorPart openInEditor(Object inputElement) throws JavaModelException, PartInitException { return openInEditor(inputElement, true); } /** * Opens a Java editor for an element (IJavaElement, IFile, IStorage...) * * @return the IEditorPart or null if wrong element type or opening failed */ public static IEditorPart openInEditor(Object inputElement, boolean activate) throws JavaModelException, PartInitException { if (inputElement instanceof IFile) return openInEditor((IFile) inputElement, activate); IEditorInput input = getEditorInput(inputElement); if (input instanceof IFileEditorInput) { IFileEditorInput fileInput = (IFileEditorInput) input; return openInEditor(fileInput.getFile(), activate); } if (input != null) return openInEditor(input, getEditorID(input, inputElement), activate); return null; } /** * Selects a Java Element in an editor */ public static void revealInEditor(IEditorPart part, IJavaElement element) { if (element != null && part instanceof PHPEditor) { ((PHPEditor) part).setSelection(element); } } private static IEditorPart openInEditor(IFile file, boolean activate) throws PartInitException { if (file != null) { IWorkbenchPage p = PHPeclipsePlugin.getActivePage(); if (p != null) { IEditorPart editorPart = IDE.openEditor(p, file, activate); initializeHighlightRange(editorPart); return editorPart; } } return null; } private static IEditorPart openInEditor(IEditorInput input, String editorID, boolean activate) throws PartInitException { if (input != null) { IWorkbenchPage p = PHPeclipsePlugin.getActivePage(); if (p != null) { IEditorPart editorPart = p .openEditor(input, editorID, activate); initializeHighlightRange(editorPart); return editorPart; } } return null; } private static void initializeHighlightRange(IEditorPart editorPart) { if (editorPart instanceof ITextEditor) { TogglePresentationAction toggleAction = new TogglePresentationAction(); // Initialize editor toggleAction.setEditor((ITextEditor) editorPart); // Reset action toggleAction.setEditor(null); } } /** * @deprecated Made it public again for java debugger UI. */ public static String getEditorID(IEditorInput input, Object inputObject) { IEditorRegistry registry = PlatformUI.getWorkbench() .getEditorRegistry(); IEditorDescriptor descriptor = registry.getDefaultEditor(input .getName()); if (descriptor != null) return descriptor.getId(); return null; } private static IEditorInput getEditorInput(IJavaElement element) throws JavaModelException { while (element != null) { if (element instanceof IWorkingCopy && ((IWorkingCopy) element).isWorkingCopy()) element = ((IWorkingCopy) element).getOriginalElement(); if (element instanceof ICompilationUnit) { ICompilationUnit unit = (ICompilationUnit) element; IResource resource = unit.getResource(); if (resource instanceof IFile) return new FileEditorInput((IFile) resource); } // if (element instanceof IClassFile) // return new InternalClassFileEditorInput((IClassFile) element); // element = element.getParent(); } return null; } public static IEditorInput getEditorInput(Object input) throws JavaModelException { if (input instanceof IJavaElement) return getEditorInput((IJavaElement) input); if (input instanceof IFile) return new FileEditorInput((IFile) input); // if (input instanceof IStorage) // return new JarEntryEditorInput((IStorage)input); return null; } /** * If the current active editor edits a java element return it, else return * null */ // public static IJavaElement getActiveEditorJavaInput() { // IWorkbenchPage page = PHPeclipsePlugin.getActivePage(); // if (page != null) { // IEditorPart part = page.getActiveEditor(); // if (part != null) { // IEditorInput editorInput = part.getEditorInput(); // if (editorInput != null) { // return (IJavaElement) editorInput // .getAdapter(IJavaElement.class); // } // } // } // return null; // } /** * Gets the working copy of an compilation unit opened in an editor * * @param part * the editor part * @param cu * the original compilation unit (or another working copy) * @return the working copy of the compilation unit, or null if not found */ public static ICompilationUnit getWorkingCopy(ICompilationUnit cu) { if (cu == null) return null; if (cu.isWorkingCopy()) return cu; return (ICompilationUnit) cu.findSharedWorkingCopy(JavaUI .getBufferFactory()); } /** * Gets the working copy of an member opened in an editor * * @param member * the original member or a member in a working copy * @return the corresponding member in the shared working copy or * null if not found */ // public static IMember getWorkingCopy(IMember member) // throws JavaModelException { // ICompilationUnit cu = member.getCompilationUnit(); // if (cu != null) { // ICompilationUnit workingCopy = getWorkingCopy(cu); // if (workingCopy != null) { // return JavaModelUtil.findMemberInCompilationUnit(workingCopy, // member); // } // } // return null; // } /** * Returns the compilation unit for the given java element. * * @param element * the java element whose compilation unit is searched for * @return the compilation unit of the given java element */ private static ICompilationUnit getCompilationUnit(IJavaElement element) { if (element == null) return null; if (element instanceof IMember) return ((IMember) element).getCompilationUnit(); int type = element.getElementType(); if (IJavaElement.COMPILATION_UNIT == type) return (ICompilationUnit) element; if (IJavaElement.CLASS_FILE == type) return null; return getCompilationUnit(element.getParent()); } /** * Returns the working copy of the given java element. * * @param javaElement * the javaElement for which the working copyshould be found * @param reconcile * indicates whether the working copy must be reconcile prior to * searching it * @return the working copy of the given element or null if * none */ public static IJavaElement getWorkingCopy(IJavaElement element, boolean reconcile) throws JavaModelException { ICompilationUnit unit = getCompilationUnit(element); if (unit == null) return null; if (unit.isWorkingCopy()) return element; ICompilationUnit workingCopy = getWorkingCopy(unit); if (workingCopy != null) { if (reconcile) { synchronized (workingCopy) { workingCopy.reconcile(); return JavaModelUtil.findInCompilationUnit(workingCopy, element); } } else { return JavaModelUtil .findInCompilationUnit(workingCopy, element); } } return null; } /** * Maps the localized modifier name to a code in the same manner as * #findModifier. * * @return the SWT modifier bit, or 0 if no match was found * @see findModifier * @since 2.1.1 */ public static int findLocalizedModifier(String token) { if (token == null) return 0; if (token.equalsIgnoreCase(Action.findModifierString(SWT.CTRL))) return SWT.CTRL; if (token.equalsIgnoreCase(Action.findModifierString(SWT.SHIFT))) return SWT.SHIFT; if (token.equalsIgnoreCase(Action.findModifierString(SWT.ALT))) return SWT.ALT; if (token.equalsIgnoreCase(Action.findModifierString(SWT.COMMAND))) return SWT.COMMAND; return 0; } /** * Returns the modifier string for the given SWT modifier modifier bits. * * @param stateMask * the SWT modifier bits * @return the modifier string * @since 2.1.1 */ public static String getModifierString(int stateMask) { String modifierString = ""; //$NON-NLS-1$ if ((stateMask & SWT.CTRL) == SWT.CTRL) modifierString = appendModifierString(modifierString, SWT.CTRL); if ((stateMask & SWT.ALT) == SWT.ALT) modifierString = appendModifierString(modifierString, SWT.ALT); if ((stateMask & SWT.SHIFT) == SWT.SHIFT) modifierString = appendModifierString(modifierString, SWT.SHIFT); if ((stateMask & SWT.COMMAND) == SWT.COMMAND) modifierString = appendModifierString(modifierString, SWT.COMMAND); return modifierString; } /** * Appends to modifier string of the given SWT modifier bit to the given * modifierString. * * @param modifierString * the modifier string * @param modifier * an int with SWT modifier bit * @return the concatenated modifier string * @since 2.1.1 */ private static String appendModifierString(String modifierString, int modifier) { if (modifierString == null) modifierString = ""; //$NON-NLS-1$ String newModifierString = Action.findModifierString(modifier); if (modifierString.length() == 0) return newModifierString; return PHPEditorMessages .getFormattedString( "EditorUtility.concatModifierStrings", new String[] { modifierString, newModifierString }); //$NON-NLS-1$ } /** * Returns the Java project for a given editor input or null * if no corresponding Java project exists. * * @param input * the editor input * @return the corresponding Java project * * @since 3.0 */ public static IJavaProject getJavaProject(IEditorInput input) { IJavaProject jProject = null; if (input instanceof IFileEditorInput) { IProject project = ((IFileEditorInput) input).getFile() .getProject(); if (project != null) { jProject = JavaCore.create(project); if (!jProject.exists()) jProject = null; } } // else if (input instanceof IClassFileEditorInput) { // jProject= // ((IClassFileEditorInput)input).getClassFile().getJavaProject(); // } return jProject; } }