1) Moved net.sourceforge.phpeclipse.ui\src\net\sourceforge\phpdt back to net.sourcefo...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / ui / preferences / JavaEditorHoverConfigurationBlock.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/JavaEditorHoverConfigurationBlock.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/JavaEditorHoverConfigurationBlock.java
new file mode 100644 (file)
index 0000000..5af3fbf
--- /dev/null
@@ -0,0 +1,481 @@
+/*******************************************************************************
+ * 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.preferences;
+
+import java.util.HashMap;
+import java.util.StringTokenizer;
+
+import net.sourceforge.phpdt.internal.ui.dialogs.StatusInfo;
+import net.sourceforge.phpdt.internal.ui.dialogs.StatusUtil;
+import net.sourceforge.phpdt.internal.ui.text.java.hover.JavaEditorTextHoverDescriptor;
+import net.sourceforge.phpdt.internal.ui.util.PixelConverter;
+import net.sourceforge.phpdt.ui.PreferenceConstants;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+//incastrix
+//import org.eclipse.jface.text.Assert;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Configures Java Editor hover preferences.
+ * 
+ * @since 2.1
+ */
+class JavaEditorHoverConfigurationBlock {
+
+       private static final String DELIMITER = PreferencesMessages
+                       .getString("JavaEditorHoverConfigurationBlock.delimiter"); //$NON-NLS-1$
+
+       // Data structure to hold the values which are edited by the user
+       private static class HoverConfig {
+
+               private String fModifierString;
+
+               private boolean fIsEnabled;
+
+               private int fStateMask;
+
+               private HoverConfig(String modifier, int stateMask, boolean enabled) {
+                       fModifierString = modifier;
+                       fIsEnabled = enabled;
+                       fStateMask = stateMask;
+               }
+       }
+
+       private IPreferenceStore fStore;
+
+       private HoverConfig[] fHoverConfigs;
+
+       private Text fModifierEditor;
+
+       private Button fEnableField;
+
+       private List fHoverList;
+
+       private Text fDescription;
+
+       private Button fShowHoverAffordanceCheckbox;
+
+       private JavaEditorPreferencePage fMainPreferencePage;
+
+       private StatusInfo fStatus;
+
+       public JavaEditorHoverConfigurationBlock(
+                       JavaEditorPreferencePage mainPreferencePage, IPreferenceStore store) {
+               Assert.isNotNull(mainPreferencePage);
+               Assert.isNotNull(store);
+               fMainPreferencePage = mainPreferencePage;
+               fStore = store;
+       }
+
+       /**
+        * Creates page for hover preferences.
+        */
+       public Control createControl(Composite parent) {
+
+               PixelConverter pixelConverter = new PixelConverter(parent);
+
+               Composite hoverComposite = new Composite(parent, SWT.NULL);
+               GridLayout layout = new GridLayout();
+               layout.numColumns = 2;
+               hoverComposite.setLayout(layout);
+               GridData gd = new GridData(GridData.GRAB_HORIZONTAL
+                               | GridData.VERTICAL_ALIGN_FILL);
+               hoverComposite.setLayoutData(gd);
+
+               Label label = new Label(hoverComposite, SWT.NONE);
+               label
+                               .setText(PreferencesMessages
+                                               .getString("JavaEditorHoverConfigurationBlock.hoverPreferences")); //$NON-NLS-1$
+               gd = new GridData(GridData.FILL_HORIZONTAL);
+               gd.horizontalAlignment = GridData.BEGINNING;
+               gd.horizontalSpan = 2;
+               label.setLayoutData(gd);
+               gd = new GridData(GridData.GRAB_HORIZONTAL
+                               | GridData.VERTICAL_ALIGN_FILL);
+
+               // Hover list
+               fHoverList = new List(hoverComposite, SWT.SINGLE | SWT.V_SCROLL
+                               | SWT.BORDER);
+               gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING
+                               | GridData.FILL_HORIZONTAL);
+               int listHeight = 10 * fHoverList.getItemHeight();
+               gd.heightHint = listHeight;
+               fHoverList.setLayoutData(gd);
+               fHoverList.addSelectionListener(new SelectionListener() {
+                       public void widgetSelected(SelectionEvent e) {
+                               handleHoverListSelection();
+                       }
+
+                       public void widgetDefaultSelected(SelectionEvent e) {
+                       }
+               });
+
+               Composite stylesComposite = new Composite(hoverComposite, SWT.NONE);
+               layout = new GridLayout();
+               layout.marginHeight = 0;
+               layout.marginWidth = 0;
+               layout.numColumns = 2;
+               stylesComposite.setLayout(layout);
+               gd = new GridData(GridData.FILL_HORIZONTAL);
+               gd.heightHint = listHeight + (2 * fHoverList.getBorderWidth());
+               stylesComposite.setLayoutData(gd);
+
+               // Enabled checkbox
+               fEnableField = new Button(stylesComposite, SWT.CHECK);
+               fEnableField.setText(PreferencesMessages
+                               .getString("JavaEditorHoverConfigurationBlock.enabled")); //$NON-NLS-1$
+               gd = new GridData(GridData.FILL_HORIZONTAL);
+               gd.horizontalAlignment = GridData.BEGINNING;
+               gd.horizontalSpan = 2;
+               fEnableField.setLayoutData(gd);
+               fEnableField.addSelectionListener(new SelectionListener() {
+                       public void widgetSelected(SelectionEvent e) {
+                               int i = fHoverList.getSelectionIndex();
+                               boolean state = fEnableField.getSelection();
+                               fModifierEditor.setEnabled(state);
+                               fHoverConfigs[i].fIsEnabled = state;
+                               handleModifierModified();
+                       }
+
+                       public void widgetDefaultSelected(SelectionEvent e) {
+                       }
+               });
+
+               // Text field for modifier string
+               label = new Label(stylesComposite, SWT.LEFT);
+               label.setText(PreferencesMessages
+                               .getString("JavaEditorHoverConfigurationBlock.keyModifier")); //$NON-NLS-1$
+               fModifierEditor = new Text(stylesComposite, SWT.BORDER);
+               gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+               fModifierEditor.setLayoutData(gd);
+
+               fModifierEditor.addKeyListener(new KeyListener() {
+                       private boolean isModifierCandidate;
+
+                       public void keyPressed(KeyEvent e) {
+                               isModifierCandidate = e.keyCode > 0 && e.character == 0
+                                               && e.stateMask == 0;
+                       }
+
+                       public void keyReleased(KeyEvent e) {
+                               if (isModifierCandidate && e.stateMask > 0
+                                               && e.stateMask == e.stateMask && e.character == 0) {// &&
+                                                                                                                                                       // e.time
+                                                                                                                                                       // -time
+                                                                                                                                                       // <
+                                                                                                                                                       // 1000)
+                                                                                                                                                       // {
+                                       String text = fModifierEditor.getText();
+                                       Point selection = fModifierEditor.getSelection();
+                                       int i = selection.x - 1;
+                                       while (i > -1 && Character.isWhitespace(text.charAt(i))) {
+                                               i--;
+                                       }
+                                       boolean needsPrefixDelimiter = i > -1
+                                                       && !String.valueOf(text.charAt(i))
+                                                                       .equals(DELIMITER);
+
+                                       i = selection.y;
+                                       while (i < text.length()
+                                                       && Character.isWhitespace(text.charAt(i))) {
+                                               i++;
+                                       }
+                                       boolean needsPostfixDelimiter = i < text.length()
+                                                       && !String.valueOf(text.charAt(i))
+                                                                       .equals(DELIMITER);
+
+                                       String insertString;
+
+                                       if (needsPrefixDelimiter && needsPostfixDelimiter)
+                                               insertString = PreferencesMessages
+                                                               .getFormattedString(
+                                                                               "JavaEditorHoverConfigurationBlock.insertDelimiterAndModifierAndDelimiter", new String[] { Action.findModifierString(e.stateMask) }); //$NON-NLS-1$
+                                       else if (needsPrefixDelimiter)
+                                               insertString = PreferencesMessages
+                                                               .getFormattedString(
+                                                                               "JavaEditorHoverConfigurationBlock.insertDelimiterAndModifier", new String[] { Action.findModifierString(e.stateMask) }); //$NON-NLS-1$
+                                       else if (needsPostfixDelimiter)
+                                               insertString = PreferencesMessages
+                                                               .getFormattedString(
+                                                                               "JavaEditorHoverConfigurationBlock.insertModifierAndDelimiter", new String[] { Action.findModifierString(e.stateMask) }); //$NON-NLS-1$
+                                       else
+                                               insertString = Action.findModifierString(e.stateMask);
+
+                                       if (insertString != null)
+                                               fModifierEditor.insert(insertString);
+                               }
+                       }
+               });
+
+               fModifierEditor.addModifyListener(new ModifyListener() {
+                       public void modifyText(ModifyEvent e) {
+                               handleModifierModified();
+                       }
+               });
+
+               // Description
+               Label descriptionLabel = new Label(stylesComposite, SWT.LEFT);
+               descriptionLabel.setText(PreferencesMessages
+                               .getString("JavaEditorHoverConfigurationBlock.description")); //$NON-NLS-1$
+               gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
+               gd.horizontalSpan = 2;
+               descriptionLabel.setLayoutData(gd);
+               fDescription = new Text(stylesComposite, SWT.LEFT | SWT.WRAP
+                               | SWT.MULTI | SWT.READ_ONLY | SWT.BORDER);
+               gd = new GridData(GridData.FILL_BOTH);
+               gd.horizontalSpan = 2;
+               fDescription.setLayoutData(gd);
+
+               // Vertical filler
+               Label filler = new Label(hoverComposite, SWT.LEFT);
+               gd = new GridData(GridData.BEGINNING | GridData.VERTICAL_ALIGN_FILL);
+               gd.heightHint = pixelConverter.convertHeightInCharsToPixels(1) / 3;
+               filler.setLayoutData(gd);
+
+               // Affordance checkbox
+               fShowHoverAffordanceCheckbox = new Button(hoverComposite, SWT.CHECK);
+               fShowHoverAffordanceCheckbox.setText(PreferencesMessages
+                               .getString("JavaEditorHoverConfigurationBlock.showAffordance")); //$NON-NLS-1$
+               gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+               gd.horizontalIndent = 0;
+               gd.horizontalSpan = 2;
+               fShowHoverAffordanceCheckbox.setLayoutData(gd);
+
+               initialize();
+
+               Dialog.applyDialogFont(hoverComposite);
+               return hoverComposite;
+       }
+
+       private JavaEditorTextHoverDescriptor[] getContributedHovers() {
+               return PHPeclipsePlugin.getDefault()
+                               .getJavaEditorTextHoverDescriptors();
+       }
+
+       void initialize() {
+               JavaEditorTextHoverDescriptor[] hoverDescs = getContributedHovers();
+               fHoverConfigs = new HoverConfig[hoverDescs.length];
+               for (int i = 0; i < hoverDescs.length; i++) {
+                       fHoverConfigs[i] = new HoverConfig(hoverDescs[i]
+                                       .getModifierString(), hoverDescs[i].getStateMask(),
+                                       hoverDescs[i].isEnabled());
+                       fHoverList.add(hoverDescs[i].getLabel());
+               }
+               initializeFields();
+       }
+
+       void initializeFields() {
+               fHoverList.getDisplay().asyncExec(new Runnable() {
+                       public void run() {
+                               if (fHoverList != null && !fHoverList.isDisposed()) {
+                                       fHoverList.select(0);
+                                       handleHoverListSelection();
+                               }
+                       }
+               });
+               fShowHoverAffordanceCheckbox
+                               .setSelection(fStore
+                                               .getBoolean(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE));
+       }
+
+       void performOk() {
+               StringBuffer buf = new StringBuffer();
+               StringBuffer maskBuf = new StringBuffer();
+               for (int i = 0; i < fHoverConfigs.length; i++) {
+                       buf.append(getContributedHovers()[i].getId());
+                       buf.append(JavaEditorTextHoverDescriptor.VALUE_SEPARATOR);
+                       if (!fHoverConfigs[i].fIsEnabled)
+                               buf.append(JavaEditorTextHoverDescriptor.DISABLED_TAG);
+                       String modifier = fHoverConfigs[i].fModifierString;
+                       if (modifier == null || modifier.length() == 0)
+                               modifier = JavaEditorTextHoverDescriptor.NO_MODIFIER;
+                       buf.append(modifier);
+                       buf.append(JavaEditorTextHoverDescriptor.VALUE_SEPARATOR);
+
+                       maskBuf.append(getContributedHovers()[i].getId());
+                       maskBuf.append(JavaEditorTextHoverDescriptor.VALUE_SEPARATOR);
+                       maskBuf.append(fHoverConfigs[i].fStateMask);
+                       maskBuf.append(JavaEditorTextHoverDescriptor.VALUE_SEPARATOR);
+               }
+               fStore.setValue(PreferenceConstants.EDITOR_TEXT_HOVER_MODIFIERS, buf
+                               .toString());
+               fStore.setValue(PreferenceConstants.EDITOR_TEXT_HOVER_MODIFIER_MASKS,
+                               maskBuf.toString());
+
+               fStore.setValue(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE,
+                               fShowHoverAffordanceCheckbox.getSelection());
+
+               PHPeclipsePlugin.getDefault().resetJavaEditorTextHoverDescriptors();
+       }
+
+       void performDefaults() {
+               restoreFromPreferences();
+               initializeFields();
+       }
+
+       private void restoreFromPreferences() {
+
+               fShowHoverAffordanceCheckbox
+                               .setSelection(fStore
+                                               .getBoolean(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE));
+
+               String compiledTextHoverModifiers = fStore
+                               .getString(PreferenceConstants.EDITOR_TEXT_HOVER_MODIFIERS);
+
+               StringTokenizer tokenizer = new StringTokenizer(
+                               compiledTextHoverModifiers,
+                               JavaEditorTextHoverDescriptor.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,
+                               JavaEditorTextHoverDescriptor.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 < fHoverConfigs.length; i++) {
+                       String modifierString = (String) idToModifier
+                                       .get(getContributedHovers()[i].getId());
+                       boolean enabled = true;
+                       if (modifierString == null)
+                               modifierString = JavaEditorTextHoverDescriptor.DISABLED_TAG;
+
+                       if (modifierString
+                                       .startsWith(JavaEditorTextHoverDescriptor.DISABLED_TAG)) {
+                               enabled = false;
+                               modifierString = modifierString.substring(1);
+                       }
+
+                       if (modifierString
+                                       .equals(JavaEditorTextHoverDescriptor.NO_MODIFIER))
+                               modifierString = ""; //$NON-NLS-1$
+
+                       fHoverConfigs[i].fModifierString = modifierString;
+                       fHoverConfigs[i].fIsEnabled = enabled;
+                       fHoverConfigs[i].fStateMask = JavaEditorTextHoverDescriptor
+                                       .computeStateMask(modifierString);
+
+                       if (fHoverConfigs[i].fStateMask == -1) {
+                               try {
+                                       fHoverConfigs[i].fStateMask = Integer
+                                                       .parseInt((String) idToModifierMask
+                                                                       .get(getContributedHovers()[i].getId()));
+                               } catch (NumberFormatException ex) {
+                                       fHoverConfigs[i].fStateMask = -1;
+                               }
+                       }
+               }
+       }
+
+       private void handleModifierModified() {
+               int i = fHoverList.getSelectionIndex();
+               String modifiers = fModifierEditor.getText();
+               fHoverConfigs[i].fModifierString = modifiers;
+               fHoverConfigs[i].fStateMask = JavaEditorTextHoverDescriptor
+                               .computeStateMask(modifiers);
+               if (fHoverConfigs[i].fIsEnabled && fHoverConfigs[i].fStateMask == -1)
+                       fStatus = new StatusInfo(
+                                       IStatus.ERROR,
+                                       PreferencesMessages
+                                                       .getFormattedString(
+                                                                       "JavaEditorHoverConfigurationBlock.modifierIsNotValid", fHoverConfigs[i].fModifierString)); //$NON-NLS-1$
+               else
+                       fStatus = new StatusInfo();
+               updateStatus();
+       }
+
+       private void handleHoverListSelection() {
+               int i = fHoverList.getSelectionIndex();
+               boolean enabled = fHoverConfigs[i].fIsEnabled;
+               fEnableField.setSelection(enabled);
+               fModifierEditor.setEnabled(enabled);
+               fModifierEditor.setText(fHoverConfigs[i].fModifierString);
+               String description = getContributedHovers()[i].getDescription();
+               if (description == null)
+                       description = ""; //$NON-NLS-1$
+               fDescription.setText(description);
+       }
+
+       IStatus getStatus() {
+               if (fStatus == null)
+                       fStatus = new StatusInfo();
+               return fStatus;
+       }
+
+       private void updateStatus() {
+               int i = 0;
+               HashMap stateMasks = new HashMap(fHoverConfigs.length);
+               while (fStatus.isOK() && i < fHoverConfigs.length) {
+                       if (fHoverConfigs[i].fIsEnabled) {
+                               String label = getContributedHovers()[i].getLabel();
+                               Integer stateMask = new Integer(fHoverConfigs[i].fStateMask);
+                               if (fHoverConfigs[i].fStateMask == -1)
+                                       fStatus = new StatusInfo(
+                                                       IStatus.ERROR,
+                                                       PreferencesMessages
+                                                                       .getFormattedString(
+                                                                                       "JavaEditorHoverConfigurationBlock.modifierIsNotValidForHover", new String[] { fHoverConfigs[i].fModifierString, label })); //$NON-NLS-1$
+                               else if (stateMasks.containsKey(stateMask))
+                                       fStatus = new StatusInfo(
+                                                       IStatus.ERROR,
+                                                       PreferencesMessages
+                                                                       .getFormattedString(
+                                                                                       "JavaEditorHoverConfigurationBlock.duplicateModifier", new String[] { label, (String) stateMasks.get(stateMask) })); //$NON-NLS-1$
+                               else
+                                       stateMasks.put(stateMask, label);
+                       }
+                       i++;
+               }
+
+               if (fStatus.isOK())
+                       fMainPreferencePage.updateStatus(fStatus);
+               else {
+                       fMainPreferencePage.setValid(false);
+                       StatusUtil.applyToStatusLine(fMainPreferencePage, fStatus);
+               }
+       }
+}