X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/java/hover/JavaEditorTextHoverDescriptor.java b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/java/hover/JavaEditorTextHoverDescriptor.java new file mode 100644 index 0000000..3d65241 --- /dev/null +++ b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/java/hover/JavaEditorTextHoverDescriptor.java @@ -0,0 +1,366 @@ +/******************************************************************************* + * 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.phpdt.internal.ui.text.java.hover; + +import java.text.Collator; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.StringTokenizer; + +import net.sourceforge.phpdt.ui.PreferenceConstants; +import net.sourceforge.phpdt.ui.text.java.hover.IJavaEditorTextHover; +//import net.sourceforge.phpeclipse.PHPeclipsePlugin; +import net.sourceforge.phpeclipse.phpeditor.EditorUtility; +import net.sourceforge.phpeclipse.ui.WebUI; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.text.Assert; +import org.eclipse.swt.SWT; +import org.osgi.framework.Bundle; + +/** + * Describes a Java editor text hover. + * + * @since 2.1 + */ +public class JavaEditorTextHoverDescriptor implements Comparable { + + private static final String JAVA_EDITOR_TEXT_HOVER_EXTENSION_POINT = "net.sourceforge.phpeclipse.phpEditorTextHovers"; //$NON-NLS-1$ + + private static final String HOVER_TAG = "hover"; //$NON-NLS-1$ + + private static final String ID_ATTRIBUTE = "id"; //$NON-NLS-1$ + + private static final String CLASS_ATTRIBUTE = "class"; //$NON-NLS-1$ + + private static final String LABEL_ATTRIBUTE = "label"; //$NON-NLS-1$ + + private static final String ACTIVATE_PLUG_IN_ATTRIBUTE = "activate"; //$NON-NLS-1$ + + private static final String DESCRIPTION_ATTRIBUTE = "description"; //$NON-NLS-1$ + + public static final String NO_MODIFIER = "0"; //$NON-NLS-1$ + + public static final String DISABLED_TAG = "!"; //$NON-NLS-1$ + + public static final String VALUE_SEPARATOR = ";"; //$NON-NLS-1$ + + private int fStateMask; + + private String fModifierString; + + private boolean fIsEnabled; + + private IConfigurationElement fElement; + + /** + * Returns all Java editor text hovers contributed to the workbench. + */ + public static JavaEditorTextHoverDescriptor[] getContributedHovers() { + IExtensionRegistry registry = Platform.getExtensionRegistry(); + IConfigurationElement[] elements = registry + .getConfigurationElementsFor(JAVA_EDITOR_TEXT_HOVER_EXTENSION_POINT); + JavaEditorTextHoverDescriptor[] hoverDescs = createDescriptors(elements); + initializeFromPreferences(hoverDescs); + return hoverDescs; + } + + /** + * Computes the state mask for the given modifier string. + * + * @param modifiers + * the string with the modifiers, separated by '+', '-', ';', ',' + * or '.' + * @return the state mask or -1 if the input is invalid + */ + public static int computeStateMask(String modifiers) { + if (modifiers == null) + return -1; + + if (modifiers.length() == 0) + return SWT.NONE; + + int stateMask = 0; + StringTokenizer modifierTokenizer = new StringTokenizer(modifiers, + ",;.:+-* "); //$NON-NLS-1$ + while (modifierTokenizer.hasMoreTokens()) { + int modifier = EditorUtility + .findLocalizedModifier(modifierTokenizer.nextToken()); + if (modifier == 0 || (stateMask & modifier) == modifier) + return -1; + stateMask = stateMask | modifier; + } + return stateMask; + } + + /** + * Creates a new Java Editor text hover descriptor from the given + * configuration element. + */ + private JavaEditorTextHoverDescriptor(IConfigurationElement element) { + Assert.isNotNull(element); + fElement = element; + } + + /** + * Creates the Java editor text hover. + */ + public IJavaEditorTextHover createTextHover() { + String pluginId = fElement.getDeclaringExtension().getNamespace(); + boolean isHoversPlugInActivated = Platform.getBundle(pluginId) + .getState() == Bundle.ACTIVE; + if (isHoversPlugInActivated || canActivatePlugIn()) { + try { + return (IJavaEditorTextHover) fElement + .createExecutableExtension(CLASS_ATTRIBUTE); + } catch (CoreException x) { + WebUI.log(new Status(IStatus.ERROR, WebUI + .getPluginId(), 0, JavaHoverMessages + .getString("JavaTextHover.createTextHover"), null)); //$NON-NLS-1$ + } + } + + return null; + } + + // ---- XML Attribute accessors + // --------------------------------------------- + + /** + * Returns the hover's id. + */ + public String getId() { + return fElement.getAttribute(ID_ATTRIBUTE); + } + + /** + * Returns the hover's class name. + */ + public String getHoverClassName() { + return fElement.getAttribute(CLASS_ATTRIBUTE); + } + + /** + * Returns the hover's label. + */ + public String getLabel() { + String label = fElement.getAttribute(LABEL_ATTRIBUTE); + if (label != null) + return label; + + // Return simple class name + label = getHoverClassName(); + int lastDot = label.lastIndexOf('.'); + if (lastDot >= 0 && lastDot < label.length() - 1) + return label.substring(lastDot + 1); + else + return label; + } + + /** + * Returns the hover's description. + * + * @return the hover's description or null if not provided + */ + public String getDescription() { + return fElement.getAttribute(DESCRIPTION_ATTRIBUTE); + } + + public boolean canActivatePlugIn() { + return Boolean.valueOf( + fElement.getAttribute(ACTIVATE_PLUG_IN_ATTRIBUTE)) + .booleanValue(); + } + + public boolean equals(Object obj) { + if (obj == null || !obj.getClass().equals(this.getClass()) + || getId() == null) + return false; + return getId().equals(((JavaEditorTextHoverDescriptor) obj).getId()); + } + + public int hashCode() { + return getId().hashCode(); + } + + /* + * Implements a method from IComparable + */ + public int compareTo(Object o) { + return Collator.getInstance().compare(getLabel(), + ((JavaEditorTextHoverDescriptor) o).getLabel()); + } + + // /** + // * @param descriptor a JavaEditorTextHoverDescriptor + // * @return true if this contributed hover depends on the + // other one + // */ + // public boolean dependsOn(JavaEditorTextHoverDescriptor descriptor) { + // if (descriptor == null) + // return false; + // + // IPluginDescriptor thisPluginDescriptor= + // fElement.getDeclaringExtension().getDeclaringPluginDescriptor(); + // IPluginDescriptor otherPluginDescriptor= + // descriptor.fElement.getDeclaringExtension().getDeclaringPluginDescriptor(); + // return dependsOn(thisPluginDescriptor, otherPluginDescriptor); + // } + + // private boolean dependsOn(IPluginDescriptor descriptor0, + // IPluginDescriptor descriptor1) { + // + // IPluginRegistry registry= Platform.getPluginRegistry(); + // IPluginPrerequisite[] prerequisites= + // descriptor0.getPluginPrerequisites(); + // + // for (int i= 0; i < prerequisites.length; i++) { + // IPluginPrerequisite prerequisite= prerequisites[i]; + // String id= prerequisite.getUniqueIdentifier(); + // IPluginDescriptor descriptor= registry.getPluginDescriptor(id); + // + // if (descriptor != null && (descriptor.equals(descriptor1) || + // dependsOn(descriptor, descriptor1))) + // return true; + // } + // + // return false; + // } + + private static JavaEditorTextHoverDescriptor[] createDescriptors( + IConfigurationElement[] elements) { + List result = new ArrayList(elements.length); + for (int i = 0; i < elements.length; i++) { + IConfigurationElement element = elements[i]; + if (HOVER_TAG.equals(element.getName())) { + JavaEditorTextHoverDescriptor desc = new JavaEditorTextHoverDescriptor( + element); + result.add(desc); + } + } + Collections.sort(result); + return (JavaEditorTextHoverDescriptor[]) result + .toArray(new JavaEditorTextHoverDescriptor[result.size()]); + } + + private static void initializeFromPreferences( + JavaEditorTextHoverDescriptor[] hovers) { + String compiledTextHoverModifiers = WebUI.getDefault() + .getPreferenceStore().getString( + PreferenceConstants.EDITOR_TEXT_HOVER_MODIFIERS); + + StringTokenizer tokenizer = new StringTokenizer( + compiledTextHoverModifiers, VALUE_SEPARATOR); + HashMap idToModifier = new HashMap(tokenizer.countTokens() / 2); + + while (tokenizer.hasMoreTokens()) { + String id = tokenizer.nextToken(); + if (tokenizer.hasMoreTokens()) + idToModifier.put(id, tokenizer.nextToken()); + } + + String compiledTextHoverModifierMasks = WebUI.getDefault() + .getPreferenceStore().getString( + PreferenceConstants.EDITOR_TEXT_HOVER_MODIFIER_MASKS); + + tokenizer = new StringTokenizer(compiledTextHoverModifierMasks, + VALUE_SEPARATOR); + HashMap idToModifierMask = new HashMap(tokenizer.countTokens() / 2); + + while (tokenizer.hasMoreTokens()) { + String id = tokenizer.nextToken(); + if (tokenizer.hasMoreTokens()) + idToModifierMask.put(id, tokenizer.nextToken()); + } + + for (int i = 0; i < hovers.length; i++) { + String modifierString = (String) idToModifier + .get(hovers[i].getId()); + boolean enabled = true; + if (modifierString == null) + modifierString = DISABLED_TAG; + + if (modifierString.startsWith(DISABLED_TAG)) { + enabled = false; + modifierString = modifierString.substring(1); + } + + if (modifierString.equals(NO_MODIFIER)) + modifierString = ""; //$NON-NLS-1$ + + hovers[i].fModifierString = modifierString; + hovers[i].fIsEnabled = enabled; + hovers[i].fStateMask = computeStateMask(modifierString); + if (hovers[i].fStateMask == -1) { + // Fallback: use stored modifier masks + try { + hovers[i].fStateMask = Integer + .parseInt((String) idToModifierMask.get(hovers[i] + .getId())); + } catch (NumberFormatException ex) { + hovers[i].fStateMask = -1; + } + // Fix modifier string + int stateMask = hovers[i].fStateMask; + if (stateMask == -1) + hovers[i].fModifierString = ""; //$NON-NLS-1$ + else + hovers[i].fModifierString = EditorUtility + .getModifierString(stateMask); + } + } + } + + /** + * Returns the configured modifier getStateMask for this hover. + * + * @return the hover modifier stateMask or -1 if no hover is configured + */ + public int getStateMask() { + return fStateMask; + } + + /** + * Returns the modifier String as set in the preference store. + * + * @return the modifier string + */ + public String getModifierString() { + return fModifierString; + } + + /** + * Returns whether this hover is enabled or not. + * + * @return true if enabled + */ + public boolean isEnabled() { + return fIsEnabled; + } + + /** + * Returns this hover descriptors configuration element. + * + * @return the configuration element + * @since 3.0 + */ + public IConfigurationElement getConfigurationElement() { + return fElement; + } +}