| /******************************************************************************* |
| * Copyright (c) 2001, 2006 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 |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| *******************************************************************************/ |
| package org.eclipse.wst.sse.ui.internal.preferences.ui; |
| |
| import java.io.CharArrayReader; |
| import java.util.Dictionary; |
| import java.util.List; |
| |
| import org.eclipse.jface.preference.ColorSelector; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.jface.resource.JFaceResources; |
| import org.eclipse.jface.text.TextAttribute; |
| import org.eclipse.jface.util.IPropertyChangeListener; |
| import org.eclipse.jface.util.PropertyChangeEvent; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.accessibility.ACC; |
| import org.eclipse.swt.accessibility.AccessibleAdapter; |
| import org.eclipse.swt.accessibility.AccessibleControlAdapter; |
| import org.eclipse.swt.accessibility.AccessibleControlEvent; |
| import org.eclipse.swt.accessibility.AccessibleControlListener; |
| import org.eclipse.swt.accessibility.AccessibleEvent; |
| import org.eclipse.swt.custom.StyleRange; |
| import org.eclipse.swt.custom.StyledText; |
| import org.eclipse.swt.events.KeyEvent; |
| import org.eclipse.swt.events.KeyListener; |
| import org.eclipse.swt.events.MouseEvent; |
| import org.eclipse.swt.events.MouseListener; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.events.TraverseEvent; |
| import org.eclipse.swt.events.TraverseListener; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Font; |
| import org.eclipse.swt.graphics.RGB; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Combo; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser; |
| import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; |
| import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion; |
| import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList; |
| import org.eclipse.wst.sse.core.internal.util.Debug; |
| import org.eclipse.wst.sse.ui.internal.SSEUIMessages; |
| import org.eclipse.wst.sse.ui.internal.util.EditorUtility; |
| import org.w3c.dom.Node; |
| |
| import com.ibm.icu.text.Collator; |
| |
| /** |
| * This class is configurable by setting 3 properties: 1) an array of Strings |
| * as the styleNames; one unique entry for every style type meant to be |
| * configurable by the user 2) a Dictionary of descriptions, mapping the |
| * styleNames to unique descriptions - meant for use within the selection |
| * ComboBox TODO (pa) this should probably be working off document partitions |
| * now (2.1+) 3) a Dictionary mapping parsed ITextRegion contexts (strings) to |
| * the locally defined styleNames |
| * |
| */ |
| public class StyledTextColorPicker extends Composite { |
| protected class DescriptionSorter extends org.eclipse.wst.sse.ui.internal.util.Sorter { |
| Collator collator = Collator.getInstance(); |
| |
| public boolean compare(Object elementOne, Object elementTwo) { |
| /** |
| * Returns true if elementTwo is 'greater than' elementOne This is |
| * the 'ordering' method of the sort operation. Each subclass |
| * overides this method with the particular implementation of the |
| * 'greater than' concept for the objects being sorted. |
| */ |
| return (collator.compare(elementOne.toString(), elementTwo.toString())) < 0; |
| } |
| } |
| |
| public static final String BACKGROUND = "background"; //$NON-NLS-1$ |
| public static final String BOLD = "bold"; //$NON-NLS-1$ |
| public static final String COLOR = "color"; //$NON-NLS-1$ |
| |
| // names for preference elements ... non-NLS |
| public static final String FOREGROUND = "foreground"; //$NON-NLS-1$ |
| public static final String ITALIC = "italic"; //$NON-NLS-1$ |
| public static final String NAME = "name"; //$NON-NLS-1$ |
| |
| protected static final boolean showItalic = false; |
| protected AccessibleControlListener backgroundAccListener = new AccessibleControlAdapter() { |
| /** |
| * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getValue(AccessibleControlEvent) |
| */ |
| public void getValue(AccessibleControlEvent e) { |
| if (e.childID == ACC.CHILDID_SELF) { |
| e.result = fBackground.getColorValue().toString(); |
| } |
| } |
| }; |
| protected SelectionListener buttonListener = new SelectionListener() { |
| |
| public void widgetDefaultSelected(SelectionEvent e) { |
| widgetSelected(e); |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| String namedStyle = getStyleName(fStyleCombo.getItem(fStyleCombo.getSelectionIndex())); |
| if (namedStyle == null) |
| return; |
| if (e.widget == fBold) { |
| // get current (newly old) style |
| String prefString = getPreferenceStore().getString(namedStyle); |
| String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString); |
| if (stylePrefs != null) { |
| String oldValue = stylePrefs[2]; |
| String newValue = String.valueOf(fBold.getSelection()); |
| if (!newValue.equals(oldValue)) { |
| stylePrefs[2] = newValue; |
| String newPrefString = ColorHelper.packStylePreferences(stylePrefs); |
| getPreferenceStore().setValue(namedStyle, newPrefString); |
| refresh(); |
| } |
| } |
| } else if (showItalic && e.widget == fItalic) { |
| // get current (newly old) style |
| String prefString = getPreferenceStore().getString(namedStyle); |
| String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString); |
| if (stylePrefs != null) { |
| String oldValue = stylePrefs[3]; |
| String newValue = String.valueOf(fItalic.getSelection()); |
| if (!newValue.equals(oldValue)) { |
| stylePrefs[3] = newValue; |
| String newPrefString = ColorHelper.packStylePreferences(stylePrefs); |
| getPreferenceStore().setValue(namedStyle, newPrefString); |
| refresh(); |
| } |
| } |
| } else if (e.widget == fClearStyle) { |
| getPreferenceStore().setToDefault(namedStyle); |
| refresh(); |
| } |
| } |
| }; |
| |
| protected SelectionListener comboListener = new SelectionListener() { |
| |
| public void widgetDefaultSelected(SelectionEvent e) { |
| widgetSelected(e); |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| int selectedIndex = fStyleCombo.getSelectionIndex(); |
| String description = selectedIndex >= 0 ? fStyleCombo.getItem(selectedIndex) : null; |
| activate(getStyleName(description)); |
| } |
| }; |
| protected ColorSelector fBackground; |
| protected Label fBackgroundLabel; |
| protected Button fBold; |
| protected Button fClearStyle; |
| // Dictionary mapping the ITextRegion types above to color names, which |
| // are, in turn, attributes |
| protected Dictionary fContextStyleMap = null; |
| protected Color fDefaultBackground = getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND); |
| |
| protected Color fDefaultForeground = getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND); |
| // Dictionary mapping the ITextRegion types above to display strings, for |
| // use in the combo box |
| protected Dictionary fDescriptions = null; |
| protected ColorSelector fForeground; |
| protected Label fForegroundLabel; |
| // private String fGeneratorKey; |
| protected String fInput = ""; //$NON-NLS-1$ |
| protected Button fItalic; |
| |
| private IStructuredDocumentRegion fNodes = null; |
| // defect 200764 - ACC:display values for color buttons |
| protected AccessibleControlListener foregroundAccListener = new AccessibleControlAdapter() { |
| /** |
| * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getValue(AccessibleControlEvent) |
| */ |
| public void getValue(AccessibleControlEvent e) { |
| if (e.childID == ACC.CHILDID_SELF) { |
| e.result = fForeground.getColorValue().toString(); |
| } |
| } |
| }; |
| // A RegionParser, which will turn the input into |
| // IStructuredDocumentRegion(s) and Regions |
| protected RegionParser fParser = null; |
| |
| private IPreferenceStore fPreferenceStore; |
| protected Combo fStyleCombo = null; |
| // The list of supported ITextRegion types [Strings] |
| protected List fStyleList = null; |
| |
| // controls in picker |
| protected StyledText fText = null; |
| |
| /** |
| * XMLTextColorPicker constructor comment. |
| * |
| * @param parent |
| * org.eclipse.swt.widgets.Composite |
| * @param style |
| * int |
| */ |
| public StyledTextColorPicker(Composite parent, int style) { |
| super(parent, style); |
| //GridLayout |
| GridLayout layout = new GridLayout(); |
| layout.numColumns = 1; |
| setLayout(layout); |
| createControls(this); |
| } |
| |
| // activate controls based on the given local color type |
| protected void activate(String namedStyle) { |
| if (namedStyle == null) { |
| fForeground.setEnabled(false); |
| fBackground.setEnabled(false); |
| fClearStyle.setEnabled(false); |
| fBold.setEnabled(false); |
| if (showItalic) |
| fItalic.setEnabled(false); |
| fForegroundLabel.setEnabled(false); |
| fBackgroundLabel.setEnabled(false); |
| } |
| else { |
| fForeground.setEnabled(true); |
| fBackground.setEnabled(true); |
| fClearStyle.setEnabled(true); |
| fBold.setEnabled(true); |
| if (showItalic) |
| fItalic.setEnabled(true); |
| fForegroundLabel.setEnabled(true); |
| fBackgroundLabel.setEnabled(true); |
| |
| } |
| TextAttribute attribute = getAttribute(namedStyle); |
| Color color = attribute.getForeground(); |
| if (color == null) { |
| color = fDefaultForeground; |
| } |
| fForeground.setColorValue(color.getRGB()); |
| |
| color = attribute.getBackground(); |
| if (color == null) { |
| color = fDefaultBackground; |
| } |
| fBackground.setColorValue(color.getRGB()); |
| |
| fBold.setSelection((attribute.getStyle() & SWT.BOLD) != 0); |
| if (showItalic) |
| fItalic.setSelection((attribute.getStyle() & SWT.ITALIC) != 0); |
| } |
| |
| protected void applyStyles() { |
| if (fText == null || fText.isDisposed() || fInput == null || fInput.length() == 0) |
| return; |
| // List regions = fParser.getRegions(); |
| IStructuredDocumentRegion node = fNodes; |
| while (node != null) { |
| ITextRegionList regions = node.getRegions(); |
| for (int i = 0; i < regions.size(); i++) { |
| ITextRegion currentRegion = regions.get(i); |
| // lookup the local coloring type and apply it |
| String namedStyle = (String) getContextStyleMap().get(currentRegion.getType()); |
| if (namedStyle == null) |
| continue; |
| TextAttribute attribute = getAttribute(namedStyle); |
| if (attribute == null) |
| continue; |
| StyleRange style = new StyleRange(node.getStartOffset(currentRegion), currentRegion.getLength(), attribute.getForeground(), attribute.getBackground(), attribute.getStyle()); |
| fText.setStyleRange(style); |
| } |
| node = node.getNext(); |
| } |
| } |
| |
| protected void close() { |
| } |
| |
| /** |
| * Creates an new checkbox instance and sets the default layout data. |
| * |
| * @param group |
| * the composite in which to create the checkbox |
| * @param label |
| * the string to set into the checkbox |
| * @return the new checkbox |
| */ |
| private Button createCheckBox(Composite group, String label) { |
| Button button = new Button(group, SWT.CHECK | SWT.CENTER); |
| if (label != null) |
| button.setText(label); |
| GridData data = new GridData(GridData.FILL_BOTH); |
| data.horizontalAlignment = GridData.HORIZONTAL_ALIGN_END; |
| // data.verticalAlignment = GridData.VERTICAL_ALIGN_FILL; |
| button.setLayoutData(data); |
| return button; |
| } |
| |
| private Combo createCombo(Composite parent, String[] labels, int selectedItem) { |
| Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY); |
| combo.setItems(labels); |
| if (selectedItem >= 0) |
| combo.select(selectedItem); |
| GridData data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalAlignment = GridData.HORIZONTAL_ALIGN_FILL; |
| combo.setLayoutData(data); |
| return combo; |
| } |
| |
| /** |
| * Creates composite control and sets the default layout data. |
| */ |
| private Composite createComposite(Composite parent, int numColumns) { |
| Composite composite = new Composite(parent, SWT.NULL); |
| //GridLayout |
| GridLayout layout = new GridLayout(); |
| layout.numColumns = numColumns; |
| layout.horizontalSpacing = 5; |
| layout.makeColumnsEqualWidth = false; |
| composite.setLayout(layout); |
| //GridData |
| GridData data = new GridData(GridData.FILL_VERTICAL); |
| data.grabExcessVerticalSpace = false; |
| data.verticalAlignment = GridData.VERTICAL_ALIGN_CENTER; |
| composite.setLayoutData(data); |
| return composite; |
| } |
| |
| protected void createControls(Composite parent) { |
| Composite styleRow = createComposite(parent, 3); |
| // row 1 - content type label, combo box, restore defaults |
| createLabel(styleRow, SSEUIMessages.Content_type__UI_); //$NON-NLS-1$ = "Content type:" |
| // Contexts combo box |
| fStyleCombo = createCombo(styleRow, new String[0], -1); |
| fClearStyle = createPushButton(styleRow, SSEUIMessages.Restore_Default_UI_); //$NON-NLS-1$ = "Restore Default" |
| Composite styleRow2; |
| if (showItalic) |
| styleRow2 = createComposite(parent, 7); |
| else |
| styleRow2 = createComposite(parent, 6); |
| // row 2 - foreground label, button, background label, button, bold, |
| // italics? |
| fForegroundLabel = createLabel(styleRow2, SSEUIMessages.Foreground_UI_); //$NON-NLS-1$ = "Foreground" |
| fForeground = new ColorSelector(styleRow2); |
| fForeground.getButton().setLayoutData(new GridData()); |
| setAccessible(fForeground.getButton(), fForegroundLabel.getText()); |
| fForeground.getButton().getAccessible().addAccessibleControlListener(foregroundAccListener); // defect |
| // 200764 |
| // - |
| // ACC:display |
| // values |
| // for |
| // color |
| // buttons |
| ((GridData) fForeground.getButton().getLayoutData()).minimumWidth = 20; |
| fBackgroundLabel = createLabel(styleRow2, SSEUIMessages.Background_UI_); //$NON-NLS-1$ = "Background" |
| fBackground = new ColorSelector(styleRow2); |
| fBackground.getButton().setLayoutData(new GridData()); |
| setAccessible(fBackground.getButton(), fBackgroundLabel.getText()); |
| fBackground.getButton().getAccessible().addAccessibleControlListener(backgroundAccListener); // defect |
| // 200764 |
| // - |
| // ACC:display |
| // values |
| // for |
| // color |
| // buttons |
| ((GridData) fBackground.getButton().getLayoutData()).minimumWidth = 20; |
| createLabel(styleRow2, ""); //$NON-NLS-1$ |
| fBold = createCheckBox(styleRow2, SSEUIMessages.Bold_UI_); |
| if (showItalic) |
| fItalic = createCheckBox(styleRow2, SSEUIMessages.Italics_UI); |
| // // Defaults checkbox |
| fForeground.setEnabled(false); |
| fBackground.setEnabled(false); |
| fClearStyle.setEnabled(false); |
| fBold.setEnabled(false); |
| if (showItalic) |
| fItalic.setEnabled(false); |
| fForegroundLabel.setEnabled(false); |
| fBackgroundLabel.setEnabled(false); |
| Composite sample = createComposite(parent, 1); |
| createLabel(sample, SSEUIMessages.Sample_text__UI_); //$NON-NLS-1$ = "&Sample text:" |
| // BUG141089 - make sure text is left-aligned |
| fText = new StyledText(sample, SWT.LEFT_TO_RIGHT | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.READ_ONLY); |
| GridData data = new GridData(GridData.FILL_BOTH); |
| fText.setLayoutData(data); |
| fText.setEditable(false); |
| fText.setBackground(fDefaultBackground); |
| fText.setFont(JFaceResources.getTextFont()); |
| fText.addKeyListener(getTextKeyListener()); |
| fText.addSelectionListener(getTextSelectionListener()); |
| fText.addMouseListener(getTextMouseListener()); |
| fText.addTraverseListener(getTraverseListener()); // defect 220377 - |
| // Provide tab |
| // traversal for |
| // fText widget |
| setAccessible(fText, SSEUIMessages.Sample_text__UI_); //$NON-NLS-1$ = "&Sample text:" |
| fForeground.addListener(new IPropertyChangeListener() { |
| public void propertyChange(PropertyChangeEvent event) { |
| if (event.getProperty().equals(ColorSelector.PROP_COLORCHANGE)) { |
| // get current (newly old) style |
| String namedStyle = getStyleName(fStyleCombo.getItem(fStyleCombo.getSelectionIndex())); |
| String prefString = getPreferenceStore().getString(namedStyle); |
| String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString); |
| if (stylePrefs != null) { |
| String oldValue = stylePrefs[0]; |
| String newValue = "null"; //$NON-NLS-1$ |
| Object newValueObject = event.getNewValue(); |
| if (newValueObject instanceof RGB) { |
| newValue = ColorHelper.toRGBString((RGB)newValueObject); |
| } |
| |
| if (!newValue.equals(oldValue)) { |
| stylePrefs[0] = newValue; |
| String newPrefString = ColorHelper.packStylePreferences(stylePrefs); |
| getPreferenceStore().setValue(namedStyle, newPrefString); |
| refresh(); |
| } |
| } |
| } |
| } |
| }); |
| fBackground.addListener(new IPropertyChangeListener() { |
| public void propertyChange(PropertyChangeEvent event) { |
| if (event.getProperty().equals(ColorSelector.PROP_COLORCHANGE)) { |
| // get current (newly old) style |
| String namedStyle = getStyleName(fStyleCombo.getItem(fStyleCombo.getSelectionIndex())); |
| String prefString = getPreferenceStore().getString(namedStyle); |
| String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString); |
| if (stylePrefs != null) { |
| String oldValue = stylePrefs[1]; |
| |
| String newValue = "null"; //$NON-NLS-1$ |
| Object newValueObject = event.getNewValue(); |
| if (newValueObject instanceof RGB) { |
| newValue = ColorHelper.toRGBString((RGB)newValueObject); |
| } |
| |
| if (!newValue.equals(oldValue)) { |
| stylePrefs[1] = newValue; |
| String newPrefString = ColorHelper.packStylePreferences(stylePrefs); |
| getPreferenceStore().setValue(namedStyle, newPrefString); |
| refresh(); |
| } |
| } |
| } |
| } |
| }); |
| |
| fClearStyle.addSelectionListener(buttonListener); |
| fBold.addSelectionListener(buttonListener); |
| if (showItalic) |
| fItalic.addSelectionListener(buttonListener); |
| fStyleCombo.addSelectionListener(comboListener); |
| } |
| |
| /** |
| * Utility method that creates a label instance and sets the default |
| * layout data. |
| */ |
| private Label createLabel(Composite parent, String text) { |
| Label label = new Label(parent, SWT.LEFT); |
| label.setText(text); |
| GridData data = new GridData(); |
| data.horizontalAlignment = GridData.FILL; |
| label.setLayoutData(data); |
| return label; |
| } |
| |
| private Button createPushButton(Composite parent, String label) { |
| Button button = new Button(parent, SWT.PUSH); |
| button.setText(label); |
| GridData data = new GridData(GridData.FILL_BOTH); |
| // data.horizontalAlignment = GridData.FILL; |
| button.setLayoutData(data); |
| return button; |
| } |
| |
| protected TextAttribute getAttribute(String namedStyle) { |
| TextAttribute ta = new TextAttribute(getDefaultForeground(), getDefaultBackground(), SWT.NORMAL); |
| |
| if (namedStyle != null && getPreferenceStore() != null) { |
| String prefString = getPreferenceStore().getString(namedStyle); |
| String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString); |
| if (stylePrefs != null) { |
| RGB foreground = ColorHelper.toRGB(stylePrefs[0]); |
| RGB background = ColorHelper.toRGB(stylePrefs[1]); |
| |
| int fontModifier = SWT.NORMAL; |
| boolean bold = Boolean.valueOf(stylePrefs[2]).booleanValue(); |
| if (bold) |
| fontModifier = fontModifier | SWT.BOLD; |
| |
| if (showItalic) { |
| boolean italic = Boolean.valueOf(stylePrefs[3]).booleanValue(); |
| if (italic) |
| fontModifier = fontModifier | SWT.ITALIC; |
| } |
| |
| ta = new TextAttribute((foreground != null) ? EditorUtility.getColor(foreground) : null, (background != null) ? EditorUtility.getColor(background) : null, fontModifier); |
| } |
| } |
| return ta; |
| } |
| |
| // defect 200764 - ACC:display values for color buttons |
| /** |
| * @return String - color Button b's current RBG value |
| */ |
| // private String getColorButtonValue(Button b) { |
| // if ((b == null) || (b.getImage() == null) || (b.getImage().getImageData() == null) || (b.getImage().getImageData().getRGBs() == null) || (b.getImage().getImageData().getRGBs()[0] == null)) |
| // return null; |
| // String val = b.getImage().getImageData().getRGBs()[0].toString(); |
| // return val; |
| // } |
| |
| /** |
| * @deprecated use getPreferenceStore instead left for legacy clients, |
| * delete by WTP M4 |
| */ |
| public Node getColorsNode() { |
| //return fColorsNode; |
| return null; |
| } |
| |
| /** |
| * @return java.util.Dictionary |
| */ |
| public Dictionary getContextStyleMap() { |
| return fContextStyleMap; |
| } |
| |
| /** |
| * @return org.eclipse.swt.graphics.Color |
| */ |
| public Color getDefaultBackground() { |
| return fDefaultBackground; |
| } |
| |
| /** |
| * @return org.eclipse.swt.graphics.Color |
| */ |
| public Color getDefaultForeground() { |
| return fDefaultForeground; |
| } |
| |
| /** |
| * @return java.util.Dictionary |
| */ |
| public Dictionary getDescriptions() { |
| return fDescriptions; |
| } |
| |
| public Font getFont() { |
| return fText.getFont(); |
| } |
| |
| protected String getNamedStyleAtOffset(int offset) { |
| // ensure the offset is clean |
| if (offset >= fInput.length()) |
| return getNamedStyleAtOffset(fInput.length() - 1); |
| else if (offset < 0) |
| return getNamedStyleAtOffset(0); |
| // find the ITextRegion at this offset |
| if (fNodes == null) |
| return null; |
| IStructuredDocumentRegion aNode = fNodes; |
| while (aNode != null && !aNode.containsOffset(offset)) |
| aNode = aNode.getNext(); |
| if (aNode != null) { |
| // find the ITextRegion's Context at this offset |
| ITextRegion interest = aNode.getRegionAtCharacterOffset(offset); |
| if (interest == null) |
| return null; |
| if (offset > aNode.getTextEndOffset(interest)) |
| return null; |
| String regionContext = interest.getType(); |
| if (regionContext == null) |
| return null; |
| // find the named style (internal/selectable name) for that |
| // context |
| String namedStyle = (String) getContextStyleMap().get(regionContext); |
| if (namedStyle != null) { |
| return namedStyle; |
| } |
| } |
| return null; |
| } |
| |
| |
| public RegionParser getParser() { |
| return fParser; |
| } |
| |
| private IPreferenceStore getPreferenceStore() { |
| return fPreferenceStore; |
| } |
| |
| /** |
| * @return String[] |
| */ |
| public List getStyleList() { |
| return fStyleList; |
| } |
| |
| private String getStyleName(String description) { |
| if (description == null) |
| return null; |
| String styleName = null; |
| java.util.Enumeration keys = getDescriptions().keys(); |
| while (keys.hasMoreElements()) { |
| String test = keys.nextElement().toString(); |
| if (getDescriptions().get(test).equals(description)) { |
| styleName = test; |
| break; |
| } |
| } |
| return styleName; |
| } |
| |
| public String getText() { |
| return fInput; |
| } |
| |
| private KeyListener getTextKeyListener() { |
| return new KeyListener() { |
| public void keyPressed(KeyEvent e) { |
| if (e.widget instanceof StyledText) { |
| int x = ((StyledText) e.widget).getCaretOffset(); |
| selectColorAtOffset(x); |
| } |
| } |
| |
| public void keyReleased(KeyEvent e) { |
| if (e.widget instanceof StyledText) { |
| int x = ((StyledText) e.widget).getCaretOffset(); |
| selectColorAtOffset(x); |
| } |
| } |
| }; |
| } |
| |
| private MouseListener getTextMouseListener() { |
| return new MouseListener() { |
| public void mouseDoubleClick(MouseEvent e) { |
| } |
| |
| public void mouseDown(MouseEvent e) { |
| } |
| |
| public void mouseUp(MouseEvent e) { |
| if (e.widget instanceof StyledText) { |
| int x = ((StyledText) e.widget).getCaretOffset(); |
| selectColorAtOffset(x); |
| } |
| } |
| }; |
| } |
| |
| private SelectionListener getTextSelectionListener() { |
| return new SelectionListener() { |
| public void widgetDefaultSelected(SelectionEvent e) { |
| selectColorAtOffset(e.x); |
| if (e.widget instanceof StyledText) { |
| ((StyledText) e.widget).setSelection(e.x); |
| } |
| } |
| |
| // Commented out when moving to RC2 to remove "unused" error/warning |
| // public void widgetDoubleSelected(SelectionEvent e) { |
| // selectColorAtOffset(e.x); |
| // if (e.widget instanceof StyledText) { |
| // ((StyledText) e.widget).setSelection(e.x); |
| // } |
| // } |
| |
| public void widgetSelected(SelectionEvent e) { |
| selectColorAtOffset(e.x); |
| if (e.widget instanceof StyledText) { |
| ((StyledText) e.widget).setSelection(e.x); |
| } |
| } |
| }; |
| } |
| |
| // defect 220377 - Provide tab traversal for fText widget |
| private TraverseListener getTraverseListener() { |
| return new TraverseListener() { |
| /** |
| * @see org.eclipse.swt.events.TraverseListener#keyTraversed(TraverseEvent) |
| */ |
| public void keyTraversed(TraverseEvent e) { |
| if (e.widget instanceof StyledText) { |
| if ((e.detail == SWT.TRAVERSE_TAB_NEXT) || (e.detail == SWT.TRAVERSE_TAB_PREVIOUS)) |
| e.doit = true; |
| } |
| } |
| }; |
| } |
| |
| // refresh the GUI after a color change |
| public void refresh() { |
| fText.setRedraw(false); |
| int selectedIndex = fStyleCombo.getSelectionIndex(); |
| String description = selectedIndex >= 0 ? fStyleCombo.getItem(selectedIndex) : null; |
| activate(getStyleName(description)); |
| // update Font |
| fText.setFont(JFaceResources.getTextFont()); |
| // reapplyStyles |
| applyStyles(); |
| fText.setRedraw(true); |
| } |
| |
| public void releasePickerResources() { |
| // if (fForeground != null && !fForeground.isDisposed() && fForeground.getImage() != null) |
| // fForeground.getImage().dispose(); |
| // if (fBackground != null && !fBackground.isDisposed() && fBackground.getImage() != null) |
| // fBackground.getImage().dispose(); |
| } |
| |
| private void selectColorAtOffset(int offset) { |
| String namedStyle = getNamedStyleAtOffset(offset); |
| if (namedStyle == null) { |
| fStyleCombo.deselectAll(); |
| activate(null); |
| return; |
| } |
| String description = (String) getDescriptions().get(namedStyle); |
| if (description == null) |
| return; |
| int itemCount = fStyleCombo.getItemCount(); |
| for (int i = 0; i < itemCount; i++) { |
| if (fStyleCombo.getItem(i).equals(description)) { |
| fStyleCombo.select(i); |
| break; |
| } |
| } |
| activate(namedStyle); |
| } |
| |
| /** |
| * Specifically set the reporting name of a control for accessibility |
| */ |
| private void setAccessible(Control control, String name) { |
| if (control == null) |
| return; |
| final String n = name; |
| control.getAccessible().addAccessibleListener(new AccessibleAdapter() { |
| public void getName(AccessibleEvent e) { |
| if (e.childID == ACC.CHILDID_SELF) |
| e.result = n; |
| } |
| }); |
| } |
| |
| /** |
| * @deprecated use setPreferenceStore instead left for legacy clients, |
| * delete by WTP M4 |
| */ |
| public void setColorsNode(Node newColorsNode) { |
| //fColorsNode = newColorsNode; |
| } |
| |
| /** |
| * @param newContextStyleMap |
| * java.util.Dictionary |
| */ |
| public void setContextStyleMap(Dictionary newContextStyleMap) { |
| fContextStyleMap = newContextStyleMap; |
| } |
| |
| /** |
| * @param newDefaultBackground |
| * org.eclipse.swt.graphics.Color |
| */ |
| public void setDefaultBackground(Color newDefaultBackground) { |
| fDefaultBackground = newDefaultBackground; |
| } |
| |
| /** |
| * @deprecated use setPreferenceStore instead left for legacy clients, |
| * delete by WTP M4 |
| */ |
| public void setDefaultColorsNode(Node newDefaultColorsNode) { |
| //fDefaultColorsNode = newDefaultColorsNode; |
| } |
| |
| /** |
| * @param newDefaultForeground |
| * org.eclipse.swt.graphics.Color |
| */ |
| public void setDefaultForeground(Color newDefaultForeground) { |
| fDefaultForeground = newDefaultForeground; |
| } |
| |
| /** |
| * @param newDescriptions |
| * java.util.Dictionary |
| */ |
| public void setDescriptions(Dictionary newDescriptions) { |
| fDescriptions = newDescriptions; |
| updateStyleList(); |
| } |
| |
| public void setFont(Font font) { |
| fText.setFont(font); |
| fText.redraw(); |
| } |
| |
| /** |
| * @deprecated generator key should no longer be needed |
| */ |
| public void setGeneratorKey(String key) { |
| // fGeneratorKey = key; |
| } |
| |
| /** |
| * @param newParser |
| */ |
| public void setParser(RegionParser newParser) { |
| fParser = newParser; |
| } |
| |
| public void setPreferenceStore(IPreferenceStore store) { |
| fPreferenceStore = store; |
| } |
| |
| /** |
| * @param newStyleList |
| * String[] |
| */ |
| public void setStyleList(List newStyleList) { |
| fStyleList = newStyleList; |
| updateStyleList(); |
| } |
| |
| public void setText(String s) { |
| fInput = s; |
| getParser().reset(new CharArrayReader(fInput.toCharArray())); |
| fNodes = getParser().getDocumentRegions(); |
| if (Debug.displayInfo) |
| System.out.println("Length of input: " //$NON-NLS-1$ |
| //$NON-NLS-1$ |
| + s.length() + ", " //$NON-NLS-1$ |
| + getParser().getRegions().size() + " regions."); //$NON-NLS-1$ |
| if (fText != null) |
| fText.setText(s); |
| applyStyles(); |
| } |
| |
| |
| |
| /** |
| * @return org.eclipse.swt.graphics.RGB |
| * @param anRGBString |
| * java.lang.String |
| * @param defaultRGB |
| * org.eclipse.swt.graphics.RGB |
| */ |
| // TODO: never used |
| RGB toRGB(String anRGBString, RGB defaultRGB) { |
| RGB result = ColorHelper.toRGB(anRGBString); |
| if (result == null) |
| return defaultRGB; |
| return result; |
| } |
| |
| private void updateStyleList() { |
| if (fStyleList == null || fDescriptions == null) |
| return; |
| String[] descriptions = new String[fStyleList.size()]; |
| for (int i = 0; i < fStyleList.size(); i++) { |
| if (fStyleList.get(i) != null) |
| descriptions[i] = (String) getDescriptions().get(fStyleList.get(i)); |
| else |
| descriptions[i] = (String) fStyleList.get(i); |
| } |
| Object[] sortedObjects = new DescriptionSorter().sort(descriptions); |
| String[] sortedDescriptions = new String[descriptions.length]; |
| for (int i = 0; i < descriptions.length; i++) { |
| sortedDescriptions[i] = sortedObjects[i].toString(); |
| } |
| fStyleCombo.setItems(sortedDescriptions); |
| fStyleCombo.select(0); //defect 219855 - initially select first item |
| // in comboBox |
| // fStyleCombo.deselectAll(); |
| } |
| |
| |
| |
| } |