X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/EditorUtility.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/EditorUtility.java new file mode 100644 index 0000000..33d847c --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/EditorUtility.java @@ -0,0 +1,436 @@ +/******************************************************************************* + * 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; + } +}