X-Git-Url: http://secure.phpeclipse.com 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 index 0000000..5af3fbf --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/JavaEditorHoverConfigurationBlock.java @@ -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); + } + } +}