/******************************************************************************* * Copyright (c) 2007, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.internal.editors.text; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.StringTokenizer; import com.ibm.icu.text.Collator; 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.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; 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.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; import org.eclipse.ui.texteditor.HyperlinkDetectorDescriptor; import org.eclipse.ui.texteditor.HyperlinkDetectorTargetDescriptor; import org.eclipse.ui.editors.text.EditorsUI; /** * Configures hyperlink detector preferences. * * @since 3.3 */ class HyperlinkDetectorsConfigurationBlock implements IPreferenceConfigurationBlock { private static final class ListItem { final String id; final String name; final String targetName; String modifierKeys= ""; //$NON-NLS-1$ ListItem(String id, String name, String targetName, String modifierKeys) { this.id= id; this.name= name; this.targetName= targetName; this.modifierKeys= modifierKeys; } } private static final class ItemContentProvider implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { return (ListItem[]) inputElement; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } private final class ItemLabelProvider implements ITableLabelProvider { /* * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage(Object element, int columnIndex) { return null; } /* * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText(Object element, int columnIndex) { switch (columnIndex) { case 0: return ((ListItem) element).name; case 1: String text= ((ListItem) element).modifierKeys; if (text == null) return fHyperlinkDefaultKeyModifierText.getText(); return text; case 2: return ((ListItem) element).targetName; default: Assert.isLegal(false); } return null; // cannot happen } /* * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener) */ public void addListener(ILabelProviderListener listener) { } /* * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose() */ public void dispose() { } /* * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String) */ public boolean isLabelProperty(Object element, String property) { return false; } /* * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener) */ public void removeListener(ILabelProviderListener listener) { } } private static final String MODIFIER_DELIMITER= TextEditorMessages.HyperlinkKeyModifier_delimiter; private OverlayPreferenceStore fStore; private CheckboxTableViewer fHyperlinkDetectorsViewer; private ListItem[] fListModel; private final HyperlinkDetectorDescriptor[] fHyperlinkDetectorDescriptors; private Text fHyperlinkDefaultKeyModifierText; private Text fHyperlinkKeyModifierText; private Button fHyperlinksEnabledCheckBox; private StatusInfo fHyperlinkKeyModifierStatus; private PreferencePage fPreferencePage; public HyperlinkDetectorsConfigurationBlock(PreferencePage preferencePage, OverlayPreferenceStore store) { Assert.isNotNull(store); Assert.isNotNull(preferencePage); fStore= store; fPreferencePage= preferencePage; fHyperlinkDetectorDescriptors= EditorsUI.getHyperlinkDetectorRegistry().getHyperlinkDetectorDescriptors(); fStore.addKeys(createOverlayStoreKeys()); } private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() { ArrayList overlayKeys= new ArrayList(); for (int i= 0; i < fHyperlinkDetectorDescriptors.length; i++) { overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, fHyperlinkDetectorDescriptors[i].getId())); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, fHyperlinkDetectorDescriptors[i].getId() + HyperlinkDetectorDescriptor.STATE_MASK_POSTFIX)); } overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_KEY_MODIFIER)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINKS_ENABLED)); OverlayPreferenceStore.OverlayKey[] keys= new OverlayPreferenceStore.OverlayKey[overlayKeys.size()]; overlayKeys.toArray(keys); return keys; } /* * @see org.eclipse.ui.internal.editors.text.IPreferenceConfigurationBlock#createControl(org.eclipse.swt.widgets.Composite) */ public Control createControl(Composite parent) { PixelConverter pixelConverter= new PixelConverter(parent); Composite composite= new Composite(parent, SWT.NONE); GridLayout layout= new GridLayout(); layout.numColumns= 2; layout.marginHeight= 0; layout.marginWidth= 0; composite.setLayout(layout); addFiller(composite, 2); String label= TextEditorMessages.HyperlinksEnabled_label; fHyperlinksEnabledCheckBox= addCheckBox(composite, label, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINKS_ENABLED, 0); fHyperlinksEnabledCheckBox.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { boolean state= fHyperlinksEnabledCheckBox.getSelection(); fHyperlinkDefaultKeyModifierText.setEnabled(state); fHyperlinkKeyModifierText.setEnabled(state && getSelectedItem() != null); fHyperlinkDetectorsViewer.getTable().setEnabled(state); handleHyperlinkKeyModifierModified(); } public void widgetDefaultSelected(SelectionEvent e) { } }); // Text field for default modifier string label= TextEditorMessages.HyperlinkDefaultKeyModifier_label; fHyperlinkDefaultKeyModifierText= (Text)addTextField(composite, label, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_KEY_MODIFIER, 15, 20, pixelConverter)[1]; fHyperlinkDefaultKeyModifierText.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 modifierString= fHyperlinkDefaultKeyModifierText.getText(); Point selection= fHyperlinkDefaultKeyModifierText.getSelection(); int i= selection.x - 1; while (i > -1 && Character.isWhitespace(modifierString.charAt(i))) { i--; } boolean needsPrefixDelimiter= i > -1 && !String.valueOf(modifierString.charAt(i)).equals(MODIFIER_DELIMITER); i= selection.y; while (i < modifierString.length() && Character.isWhitespace(modifierString.charAt(i))) { i++; } boolean needsPostfixDelimiter= i < modifierString.length() && !String.valueOf(modifierString.charAt(i)).equals(MODIFIER_DELIMITER); String insertString; if (needsPrefixDelimiter && needsPostfixDelimiter) insertString= NLSUtility.format(TextEditorMessages.HyperlinkKeyModifier_insertDelimiterAndModifierAndDelimiter, Action.findModifierString(e.stateMask)); else if (needsPrefixDelimiter) insertString= NLSUtility.format(TextEditorMessages.HyperlinkKeyModifier_insertDelimiterAndModifier, Action.findModifierString(e.stateMask)); else if (needsPostfixDelimiter) insertString= NLSUtility.format(TextEditorMessages.HyperlinkKeyModifier_insertModifierAndDelimiter, Action.findModifierString(e.stateMask)); else insertString= Action.findModifierString(e.stateMask); fHyperlinkDefaultKeyModifierText.insert(insertString); } } }); fHyperlinkDefaultKeyModifierText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { handleHyperlinkDefaultKeyModifierModified(); } }); addFiller(composite, 2); Composite editorComposite= new Composite(composite, SWT.NONE); GridData gd; gd= new GridData(SWT.FILL, SWT.TOP, true, false); gd.horizontalSpan= 2; gd.horizontalIndent= 20; editorComposite.setLayoutData(gd); TableColumnLayout tableColumnlayout= new TableColumnLayout(); editorComposite.setLayout(tableColumnlayout); // Hyperlink detector table Table hyperlinkDetectorTable= new Table(editorComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION | SWT.CHECK); hyperlinkDetectorTable.setHeaderVisible(true); hyperlinkDetectorTable.setLinesVisible(true); hyperlinkDetectorTable.setFont(parent.getFont()); hyperlinkDetectorTable.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { handleListSelection(); } public void widgetDefaultSelected(SelectionEvent e) { } }); ColumnLayoutData columnLayoutData= new ColumnWeightData(1); TableColumn nameColumn= new TableColumn(hyperlinkDetectorTable, SWT.NONE, 0); nameColumn.setText(TextEditorMessages.HyperlinkDetectorTable_nameColumn); tableColumnlayout.setColumnData(nameColumn, columnLayoutData); TableColumn modifierKeysColumn= new TableColumn(hyperlinkDetectorTable, SWT.NONE, 1); modifierKeysColumn.setText(TextEditorMessages.HyperlinkDetectorTable_modifierKeysColumn); tableColumnlayout.setColumnData(modifierKeysColumn, columnLayoutData); TableColumn targetNameColumn= new TableColumn(hyperlinkDetectorTable, SWT.NONE, 2); targetNameColumn.setText(TextEditorMessages.HyperlinkDetectorTable_targetNameColumn); tableColumnlayout.setColumnData(targetNameColumn, columnLayoutData); fHyperlinkDetectorsViewer= new CheckboxTableViewer(hyperlinkDetectorTable); fHyperlinkDetectorsViewer.setUseHashlookup(true); fHyperlinkDetectorsViewer.addCheckStateListener(new ICheckStateListener() { /* * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent) */ public void checkStateChanged(CheckStateChangedEvent event) { String id= ((ListItem)event.getElement()).id; if (id == null) return; fStore.setValue(id, !event.getChecked()); } }); fHyperlinkDetectorsViewer.setLabelProvider(new ItemLabelProvider()); fHyperlinkDetectorsViewer.setContentProvider(new ItemContentProvider()); gd= new GridData(SWT.FILL, SWT.FILL, true , false); gd.heightHint= pixelConverter.convertHeightInCharsToPixels(10); fHyperlinkDetectorsViewer.getControl().setLayoutData(gd); // addFiller(composite, 2); // Text field for modifier string label= TextEditorMessages.HyperlinkKeyModifier_label; fHyperlinkKeyModifierText= (Text)addTextField(composite, label, null, 15, 20, pixelConverter)[1]; fHyperlinkKeyModifierText.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 modifierString= fHyperlinkKeyModifierText.getText(); Point selection= fHyperlinkKeyModifierText.getSelection(); int i= selection.x - 1; while (i > -1 && Character.isWhitespace(modifierString.charAt(i))) { i--; } boolean needsPrefixDelimiter= i > -1 && !String.valueOf(modifierString.charAt(i)).equals(MODIFIER_DELIMITER); i= selection.y; while (i < modifierString.length() && Character.isWhitespace(modifierString.charAt(i))) { i++; } boolean needsPostfixDelimiter= i < modifierString.length() && !String.valueOf(modifierString.charAt(i)).equals(MODIFIER_DELIMITER); String insertString; if (needsPrefixDelimiter && needsPostfixDelimiter) insertString= NLSUtility.format(TextEditorMessages.HyperlinkKeyModifier_insertDelimiterAndModifierAndDelimiter, Action.findModifierString(e.stateMask)); else if (needsPrefixDelimiter) insertString= NLSUtility.format(TextEditorMessages.HyperlinkKeyModifier_insertDelimiterAndModifier, Action.findModifierString(e.stateMask)); else if (needsPostfixDelimiter) insertString= NLSUtility.format(TextEditorMessages.HyperlinkKeyModifier_insertModifierAndDelimiter, Action.findModifierString(e.stateMask)); else insertString= Action.findModifierString(e.stateMask); fHyperlinkKeyModifierText.insert(insertString); } } }); fHyperlinkKeyModifierText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { handleHyperlinkKeyModifierModified(); } }); return composite; } /* * @see org.eclipse.ui.internal.editors.text.IPreferenceConfigurationBlock#applyData(java.lang.Object) * @since 3.4 */ public void applyData(Object data) { } private void addFiller(Composite composite, int horizontalSpan) { PixelConverter pixelConverter= new PixelConverter(composite); Label filler= new Label(composite, SWT.LEFT ); GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); gd.horizontalSpan= horizontalSpan; gd.heightHint= pixelConverter.convertHeightInCharsToPixels(1) / 2; filler.setLayoutData(gd); } private Button addCheckBox(Composite composite, String label, final String key, int indentation) { final Button checkBox= new Button(composite, SWT.CHECK); checkBox.setText(label); GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent= indentation; gd.horizontalSpan= 2; checkBox.setLayoutData(gd); checkBox.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { boolean value= checkBox.getSelection(); fStore.setValue(key, value); } }); return checkBox; } private Control[] addTextField(Composite composite, String label, final String key, int textLimit, int indentation, PixelConverter pixelConverter) { Label labelControl= new Label(composite, SWT.NONE); labelControl.setText(label); GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent= indentation; labelControl.setLayoutData(gd); final Text textControl= new Text(composite, SWT.BORDER | SWT.SINGLE); gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.widthHint= pixelConverter.convertWidthInCharsToPixels(textLimit + 1); textControl.setLayoutData(gd); textControl.setTextLimit(textLimit); textControl.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String value= textControl.getText(); if (key != null) fStore.setValue(key, value); } }); return new Control[] {labelControl, textControl}; } private Object[] getCheckedItems() { List result= new ArrayList(); for (int i= 0; i < fListModel.length; i++) if (!fStore.getBoolean(fListModel[i].id)) result.add(fListModel[i]); return result.toArray(); } /* * @see org.eclipse.ui.internal.editors.text.IPreferenceConfigurationBlock#canPerformOk() */ public boolean canPerformOk() { return true; } /* * @see PreferencePage#performOk() */ public void performOk() { fStore.setValue(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_KEY_MODIFIER_MASK, computeStateMask(fHyperlinkKeyModifierText.getText())); } /* * @see PreferencePage#performDefaults() */ public void performDefaults() { fStore.loadDefaults(); initialize(); } private void handleListSelection() { ListItem item= getSelectedItem(); if (item == null) { fHyperlinkKeyModifierText.setEnabled(false); return; } fHyperlinkKeyModifierText.setEnabled(fHyperlinkDetectorsViewer.getChecked(item)); String text= item.modifierKeys; if (text == null) text= fHyperlinkDefaultKeyModifierText.getText(); fHyperlinkKeyModifierText.setText(text); } public void initialize() { String modifierString= fStore.getString(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_KEY_MODIFIER); if (computeStateMask(modifierString) == -1) { // Fix possible illegal modifier string int stateMask= fStore.getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_KEY_MODIFIER_MASK); if (stateMask == -1) fHyperlinkDefaultKeyModifierText.setText(""); //$NON-NLS-1$ else fHyperlinkDefaultKeyModifierText.setText(getModifierString(stateMask)); } else fHyperlinkDefaultKeyModifierText.setText(modifierString); boolean isEnabled= fStore.getBoolean(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINKS_ENABLED); fHyperlinksEnabledCheckBox.setSelection(isEnabled); fHyperlinkKeyModifierText.setEnabled(isEnabled); fHyperlinkDefaultKeyModifierText.setEnabled(isEnabled); fListModel= createListModel(); fHyperlinkDetectorsViewer.setInput(fListModel); fHyperlinkDetectorsViewer.setAllChecked(false); fHyperlinkDetectorsViewer.setCheckedElements(getCheckedItems()); fHyperlinkDetectorsViewer.getTable().setEnabled(isEnabled); fHyperlinkKeyModifierText.setText(""); //$NON-NLS-1$ handleListSelection(); } private ListItem[] createListModel() { ArrayList listModelItems= new ArrayList(); for (int i= 0; i < fHyperlinkDetectorDescriptors.length; i++) { HyperlinkDetectorDescriptor desc= fHyperlinkDetectorDescriptors[i]; HyperlinkDetectorTargetDescriptor target= desc.getTarget(); int stateMask= fStore.getInt(desc.getId() + HyperlinkDetectorDescriptor.STATE_MASK_POSTFIX); String modifierKeys= getModifierString(stateMask); listModelItems.add(new ListItem(desc.getId(), desc.getName(), target.getName(), modifierKeys)); } Comparator comparator= new Comparator() { /* * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ public int compare(Object o1, Object o2) { if (!(o2 instanceof ListItem)) return -1; if (!(o1 instanceof ListItem)) return 1; String label1= ((ListItem)o1).name; String label2= ((ListItem)o2).name; return Collator.getInstance().compare(label1, label2); } }; Collections.sort(listModelItems, comparator); ListItem[] items= new ListItem[listModelItems.size()]; listModelItems.toArray(items); return items; } private ListItem getSelectedItem() { return (ListItem)((IStructuredSelection) fHyperlinkDetectorsViewer.getSelection()).getFirstElement(); } private void handleHyperlinkKeyModifierModified() { String modifiers= fHyperlinkKeyModifierText.getText(); int stateMask= computeStateMask(modifiers); if (fHyperlinksEnabledCheckBox.getSelection() && (stateMask == -1 || (stateMask & SWT.SHIFT) != 0)) { if (stateMask == -1) fHyperlinkKeyModifierStatus= new StatusInfo(IStatus.ERROR, NLSUtility.format(TextEditorMessages.HyperlinkKeyModifier_error_modifierIsNotValid, modifiers)); else fHyperlinkKeyModifierStatus= new StatusInfo(IStatus.ERROR, TextEditorMessages.HyperlinkKeyModifier_error_shiftIsDisabled); applyToStatusLine(getHyperlinkKeyModifierStatus()); fPreferencePage.setValid(getHyperlinkKeyModifierStatus().isOK()); } else { ListItem item= getSelectedItem(); if (item != null) { if (item.modifierKeys != null || !modifiers.equalsIgnoreCase(fHyperlinkDefaultKeyModifierText.getText())) item.modifierKeys= modifiers; fHyperlinkDetectorsViewer.refresh(getSelectedItem()); fStore.setValue(item.id + HyperlinkDetectorDescriptor.STATE_MASK_POSTFIX, stateMask); } fHyperlinkKeyModifierStatus= new StatusInfo(); fPreferencePage.setValid(true); applyToStatusLine(fHyperlinkKeyModifierStatus); } } private void handleHyperlinkDefaultKeyModifierModified() { String modifiers= fHyperlinkDefaultKeyModifierText.getText(); int stateMask= computeStateMask(modifiers); if (fHyperlinksEnabledCheckBox.getSelection() && (stateMask == -1 || (stateMask & SWT.SHIFT) != 0)) { if (stateMask == -1) fHyperlinkKeyModifierStatus= new StatusInfo(IStatus.ERROR, NLSUtility.format(TextEditorMessages.HyperlinkKeyModifier_error_modifierIsNotValid, modifiers)); else fHyperlinkKeyModifierStatus= new StatusInfo(IStatus.ERROR, TextEditorMessages.HyperlinkKeyModifier_error_shiftIsDisabled); applyToStatusLine(getHyperlinkKeyModifierStatus()); fPreferencePage.setValid(getHyperlinkKeyModifierStatus().isOK()); } else { fStore.setValue(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_KEY_MODIFIER, modifiers); fHyperlinkKeyModifierStatus= new StatusInfo(); fPreferencePage.setValid(true); applyToStatusLine(fHyperlinkKeyModifierStatus); fHyperlinkDetectorsViewer.refresh(); handleListSelection(); } } private IStatus getHyperlinkKeyModifierStatus() { if (fHyperlinkKeyModifierStatus == null) fHyperlinkKeyModifierStatus= new StatusInfo(); return fHyperlinkKeyModifierStatus; } /** * 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 */ private static final 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= findLocalizedModifier(modifierTokenizer.nextToken()); if (modifier == 0 || (stateMask & modifier) == modifier) return -1; stateMask= stateMask | modifier; } return stateMask; } /** * Maps the localized modifier name to a code in the same * manner as #findModifier. * * @param modifierName the modifier name * @return the SWT modifier bit, or <code>0</code> if no match was found */ private static final int findLocalizedModifier(String modifierName) { if (modifierName == null) return 0; if (modifierName.equalsIgnoreCase(Action.findModifierString(SWT.CTRL))) return SWT.CTRL; if (modifierName.equalsIgnoreCase(Action.findModifierString(SWT.SHIFT))) return SWT.SHIFT; if (modifierName.equalsIgnoreCase(Action.findModifierString(SWT.ALT))) return SWT.ALT; if (modifierName.equalsIgnoreCase(Action.findModifierString(SWT.COMMAND))) return SWT.COMMAND; return 0; } /** * Returns the modifier string for the given SWT modifier * modifier bits. * * @param stateMask the SWT modifier bits * @return the modifier string */ private static final String getModifierString(int stateMask) { if (stateMask == -1) return null; String modifierString= ""; //$NON-NLS-1$ if ((stateMask & SWT.CTRL) == SWT.CTRL) modifierString= appendModifierString(modifierString, SWT.CTRL); if ((stateMask & SWT.ALT) == SWT.ALT) modifierString= appendModifierString(modifierString, SWT.ALT); if ((stateMask & SWT.SHIFT) == SWT.SHIFT) modifierString= appendModifierString(modifierString, SWT.SHIFT); if ((stateMask & SWT.COMMAND) == SWT.COMMAND) modifierString= appendModifierString(modifierString, SWT.COMMAND); return modifierString; } /** * Appends to modifier string of the given SWT modifier bit * to the given modifierString. * * @param modifierString the modifier string * @param modifier an int with SWT modifier bit * @return the concatenated modifier string */ private static final String appendModifierString(String modifierString, int modifier) { if (modifierString == null) modifierString= ""; //$NON-NLS-1$ String newModifierString= Action.findModifierString(modifier); if (modifierString.length() == 0) return newModifierString; return NLSUtility.format(TextEditorMessages.HyperlinkKeyModifier_concatModifierStrings, new String[] {modifierString, newModifierString}); } /** * Applies the status to the status line of a dialog page. * * @param status the status */ private void applyToStatusLine(IStatus status) { String message= status.getMessage(); switch (status.getSeverity()) { case IStatus.OK: fPreferencePage.setMessage(message, IMessageProvider.NONE); fPreferencePage.setErrorMessage(null); break; case IStatus.WARNING: fPreferencePage.setMessage(message, IMessageProvider.WARNING); fPreferencePage.setErrorMessage(null); break; case IStatus.INFO: fPreferencePage.setMessage(message, IMessageProvider.INFORMATION); fPreferencePage.setErrorMessage(null); break; default: if (message.length() == 0) { message= null; } fPreferencePage.setMessage(null); fPreferencePage.setErrorMessage(message); break; } } /* * @see org.eclipse.ui.internal.editors.text.IPreferenceConfigurationBlock#dispose() */ public void dispose() { } }