--- /dev/null
+/*******************************************************************************
+ * 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 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;
+//incastrix
+//import org.eclipse.jface.text.Assert;
+import org.eclipse.core.runtime.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) {
+ PHPeclipsePlugin.log(new Status(IStatus.ERROR, PHPeclipsePlugin
+ .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 <code>null</code> 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 <code>true</code> 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 = PHPeclipsePlugin.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 = PHPeclipsePlugin.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 <code>true</code> 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;
+ }
+}