refactory: added UI removed from core plugin.
[phpeclipse.git] / net.sourceforge.phpeclipse.ui / src / net / sourceforge / phpdt / internal / ui / text / java / hover / JavaEditorTextHoverDescriptor.java
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 (file)
index 0000000..3d65241
--- /dev/null
@@ -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 <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 = 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 <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;
+       }
+}