/******************************************************************************* * Copyright (c) 2006 Business Objects Software Limited and others. * All rights reserved. * This file is 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: * Business Objects Software Limited - initial API and implementation based on Eclipse 3.1.2 code for * /org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/JavaEditorColoringConfigurationBlock.java * Eclipse source is available at: http://www.eclipse.org/downloads/ *******************************************************************************/ /* * CALEditorColoringConfigurationBlock.java * Creation date: Feb 14, 2006. * By: Edward Lam */ package org.openquark.cal.eclipse.ui.preferences; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import org.eclipse.core.runtime.Preferences; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.swt.graphics.GC; 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.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.swt.widgets.Scrollable; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.preference.ColorSelector; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.texteditor.ChainedPreferenceStore; import org.eclipse.ui.editors.text.EditorsUI; import org.openquark.cal.eclipse.core.CoreOptionIDs; import org.openquark.cal.eclipse.ui.CALEclipseUIPlugin; import org.openquark.cal.eclipse.ui.caleditor.CALSourceViewer; import org.openquark.cal.eclipse.ui.preferences.OverlayPreferenceStore.OverlayKey; import org.openquark.cal.eclipse.ui.text.CALPartitions; import org.openquark.cal.eclipse.ui.text.ColorManager; import org.openquark.cal.eclipse.ui.text.PreferencesAdapter; import org.openquark.cal.eclipse.ui.text.SimpleCALSourceViewerConfiguration; import org.openquark.cal.eclipse.ui.util.PixelConverter; /** * Configures CAL Editor syntax coloring preferences. * * @author Edward Lam */ class CALEditorColoringConfigurationBlock extends AbstractConfigurationBlock { /** * Item in the highlighting color list. */ private static class HighlightingColorListItem { /** Display name */ private final String fDisplayName; /** Color preference key */ private final String fColorKey; /** Bold preference key */ private final String fBoldKey; /** Italic preference key */ private final String fItalicKey; /** * Strikethrough preference key. */ private final String fStrikethroughKey; /** * Underline preference key. */ private final String fUnderlineKey; /** * Initialize the item with the given values. * @param displayName the display name * @param colorKey the color preference key * @param boldKey the bold preference key * @param italicKey the italic preference key * @param strikethroughKey the strikethrough preference key * @param underlineKey the underline preference key */ public HighlightingColorListItem(String displayName, String colorKey, String boldKey, String italicKey, String strikethroughKey, String underlineKey) { fDisplayName = displayName; fColorKey = colorKey; fBoldKey = boldKey; fItalicKey = italicKey; fStrikethroughKey = strikethroughKey; fUnderlineKey = underlineKey; } /** * @return the bold preference key */ public String getBoldKey() { return fBoldKey; } /** * @return the bold preference key */ public String getItalicKey() { return fItalicKey; } /** * @return the strikethrough preference key */ public String getStrikethroughKey() { return fStrikethroughKey; } /** * @return the underline preference key */ public String getUnderlineKey() { return fUnderlineKey; } /** * @return the color preference key */ public String getColorKey() { return fColorKey; } /** * @return the display name */ public String getDisplayName() { return fDisplayName; } } private static class SemanticHighlightingColorListItem extends HighlightingColorListItem { /** Enablement preference key */ private final String fEnableKey; /** * Initialize the item with the given values. * @param displayName the display name * @param colorKey the color preference key * @param boldKey the bold preference key * @param italicKey the italic preference key * @param strikethroughKey the strikethroughKey preference key * @param underlineKey the underlineKey preference key * @param enableKey the enable preference key */ public SemanticHighlightingColorListItem(String displayName, String colorKey, String boldKey, String italicKey, String strikethroughKey, String underlineKey, String enableKey) { super(displayName, colorKey, boldKey, italicKey, strikethroughKey, underlineKey); fEnableKey = enableKey; } /** * @return the enablement preference key */ public String getEnableKey() { return fEnableKey; } } /** * Color list label provider. */ private static class ColorListLabelProvider extends LabelProvider { /* * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { if (element instanceof String) { return (String) element; } return ((HighlightingColorListItem)element).getDisplayName(); } } /** * Color list content provider. */ private class ColorListContentProvider implements ITreeContentProvider { /* * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object inputElement) { return new String[] {fJavaCategory, fJavadocCategory, fCommentsCategory}; } /* * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { } /* * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public Object[] getChildren(Object parentElement) { if (parentElement instanceof String) { String entry = (String)parentElement; if (fJavaCategory.equals(entry)) { return fListModel.subList(7, fListModel.size()).toArray(); } if (fJavadocCategory.equals(entry)) { return fListModel.subList(1, 3).toArray(); } if (fCommentsCategory.equals(entry)) { return fListModel.subList(4, 7).toArray(); } } return new Object[0]; } public Object getParent(Object element) { if (element instanceof String) { return null; } int index = fListModel.indexOf(element); if (index < 4) { return fJavadocCategory; } if (index >= 7) { return fJavaCategory; } return fCommentsCategory; } public boolean hasChildren(Object element) { return element instanceof String; } } private static final String BOLD = PreferenceConstants.EDITOR_BOLD_SUFFIX; /** * Preference key suffix for italic preferences. */ private static final String ITALIC = PreferenceConstants.EDITOR_ITALIC_SUFFIX; /** * Preference key suffix for strikethrough preferences. */ private static final String STRIKETHROUGH = PreferenceConstants.EDITOR_STRIKETHROUGH_SUFFIX; /** * Preference key suffix for underline preferences. */ private static final String UNDERLINE = PreferenceConstants.EDITOR_UNDERLINE_SUFFIX; private static final String COMPILER_TASK_TAGS = CoreOptionIDs.COMPILER_TASK_TAGS; /** * The keys of the overlay store. */ private final String[][] fSyntaxColorListModel= new String[][] { { PreferencesMessages.JavaEditorPreferencePage_javaDocKeywords, PreferenceConstants.EDITOR_CALDOC_KEYWORD_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_javaDocHtmlTags, PreferenceConstants.EDITOR_CALDOC_TAG_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_javaDocOthers, PreferenceConstants.EDITOR_CALDOC_DEFAULT_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_javaDocLinks, PreferenceConstants.EDITOR_CALDOC_LINKS_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_multiLineComment, PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_singleLineComment, PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_javaCommentTaskTags, PreferenceConstants.EDITOR_TASK_TAG_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_keywords, PreferenceConstants.EDITOR_CAL_KEYWORD_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_keywords2, PreferenceConstants.EDITOR_CAL_KEYWORD_RETURN_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_operators, PreferenceConstants.EDITOR_CAL_OPERATOR_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_consNames, PreferenceConstants.EDITOR_CAL_ANNOTATION_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_literals, PreferenceConstants.EDITOR_STRING_COLOR }, { PreferencesMessages.JavaEditorPreferencePage_others, PreferenceConstants.EDITOR_CAL_DEFAULT_COLOR }, }; private final String fJavaCategory = PreferencesMessages.JavaEditorPreferencePage_coloring_category_java; private final String fJavadocCategory = PreferencesMessages.JavaEditorPreferencePage_coloring_category_javadoc; private final String fCommentsCategory = PreferencesMessages.JavaEditorPreferencePage_coloring_category_comments; private ColorSelector fSyntaxForegroundColorEditor; private Label fColorEditorLabel; private Button fBoldCheckBox; private Button fEnableCheckbox; /** * Check box for italic preference. */ private Button fItalicCheckBox; /** * Check box for strikethrough preference. */ private Button fStrikethroughCheckBox; /** * Check box for underline preference. */ private Button fUnderlineCheckBox; /** * Highlighting color list */ private final java.util.List<HighlightingColorListItem> fListModel= new ArrayList<HighlightingColorListItem>(); /** * Highlighting color list viewer */ private StructuredViewer fListViewer; // /** // * Semantic highlighting manager // */ // private SemanticHighlightingManager fSemanticHighlightingManager; /** * The previewer. */ private CALSourceViewer fPreviewViewer; /** * The color manager. */ private final ColorManager fColorManager; /** * The font metrics. */ private FontMetrics fFontMetrics; public CALEditorColoringConfigurationBlock(OverlayPreferenceStore store) { super(store); fColorManager = new ColorManager(false); for (final String[] listModelElement : fSyntaxColorListModel) { fListModel.add(new HighlightingColorListItem (listModelElement[0], listModelElement[1], listModelElement[1] + BOLD, listModelElement[1] + ITALIC, listModelElement[1] + STRIKETHROUGH, listModelElement[1] + UNDERLINE)); } // SemanticHighlighting[] semanticHighlightings= SemanticHighlightings.getSemanticHighlightings(); // for (int i= 0, n= semanticHighlightings.length; i < n; i++) // fListModel.add( // new SemanticHighlightingColorListItem( // semanticHighlightings[i].getDisplayName(), // SemanticHighlightings.getColorPreferenceKey(semanticHighlightings[i]), // SemanticHighlightings.getBoldPreferenceKey(semanticHighlightings[i]), // SemanticHighlightings.getItalicPreferenceKey(semanticHighlightings[i]), // SemanticHighlightings.getStrikethroughPreferenceKey(semanticHighlightings[i]), // SemanticHighlightings.getUnderlinePreferenceKey(semanticHighlightings[i]), // SemanticHighlightings.getEnabledPreferenceKey(semanticHighlightings[i]) // )); store.addKeys(createOverlayStoreKeys()); } private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() { ArrayList<OverlayKey> overlayKeys= new ArrayList<OverlayKey>(); for (int i = 0, n = fListModel.size(); i < n; i++) { HighlightingColorListItem item = fListModel.get(i); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, item.getColorKey())); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, item.getBoldKey())); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, item.getItalicKey())); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, item.getStrikethroughKey())); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, item.getUnderlineKey())); if (item instanceof SemanticHighlightingColorListItem) { overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ((SemanticHighlightingColorListItem)item).getEnableKey())); } } OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()]; overlayKeys.toArray(keys); return keys; } /** * Creates page for hover preferences. * * @param parent the parent composite * @return the control for the preference page */ public Control createControl(Composite parent) { initializeDialogUnits(parent); return createSyntaxPage(parent); } /** * Returns the number of pixels corresponding to the width of the given * number of characters. * <p> * This method may only be called after <code>initializeDialogUnits</code> * has been called. * </p> * <p> * Clients may call this framework method, but should not override it. * </p> * * @param chars * the number of characters * @return the number of pixels */ private int convertWidthInCharsToPixels(int chars) { // test for failure to initialize for backward compatibility if (fFontMetrics == null) { return 0; } return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars); } /** * Returns the number of pixels corresponding to the height of the given * number of characters. * <p> * This method may only be called after <code>initializeDialogUnits</code> * has been called. * </p> * <p> * Clients may call this framework method, but should not override it. * </p> * * @param chars * the number of characters * @return the number of pixels */ private int convertHeightInCharsToPixels(int chars) { // test for failure to initialize for backward compatibility if (fFontMetrics == null) { return 0; } return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars); } @Override public void initialize() { super.initialize(); fListViewer.setInput(fListModel); fListViewer.setSelection(new StructuredSelection(fJavaCategory)); } @Override public void performDefaults() { super.performDefaults(); handleSyntaxColorListSelection(); // uninstallSemanticHighlighting(); // installSemanticHighlighting(); fPreviewViewer.invalidateTextPresentation(); } /* * @see org.eclipse.jdt.internal.ui.preferences.IPreferenceConfigurationBlock#dispose() */ @Override public void dispose() { // uninstallSemanticHighlighting(); fColorManager.dispose(); super.dispose(); } private void handleSyntaxColorListSelection() { HighlightingColorListItem item = getHighlightingColorListItem(); if (item == null) { fEnableCheckbox.setEnabled(false); fSyntaxForegroundColorEditor.getButton().setEnabled(false); fColorEditorLabel.setEnabled(false); fBoldCheckBox.setEnabled(false); fItalicCheckBox.setEnabled(false); fStrikethroughCheckBox.setEnabled(false); fUnderlineCheckBox.setEnabled(false); return; } RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), item.getColorKey()); fSyntaxForegroundColorEditor.setColorValue(rgb); fBoldCheckBox.setSelection(getPreferenceStore().getBoolean(item.getBoldKey())); fItalicCheckBox.setSelection(getPreferenceStore().getBoolean(item.getItalicKey())); fStrikethroughCheckBox.setSelection(getPreferenceStore().getBoolean(item.getStrikethroughKey())); fUnderlineCheckBox.setSelection(getPreferenceStore().getBoolean(item.getUnderlineKey())); if (item instanceof SemanticHighlightingColorListItem) { fEnableCheckbox.setEnabled(true); boolean enable = getPreferenceStore().getBoolean(((SemanticHighlightingColorListItem)item).getEnableKey()); fEnableCheckbox.setSelection(enable); fSyntaxForegroundColorEditor.getButton().setEnabled(enable); fColorEditorLabel.setEnabled(enable); fBoldCheckBox.setEnabled(enable); fItalicCheckBox.setEnabled(enable); fStrikethroughCheckBox.setEnabled(enable); fUnderlineCheckBox.setEnabled(enable); } else { fSyntaxForegroundColorEditor.getButton().setEnabled(true); fColorEditorLabel.setEnabled(true); fBoldCheckBox.setEnabled(true); fItalicCheckBox.setEnabled(true); fStrikethroughCheckBox.setEnabled(true); fUnderlineCheckBox.setEnabled(true); fEnableCheckbox.setEnabled(false); fEnableCheckbox.setSelection(true); } } private Control createSyntaxPage(final Composite parent) { Composite colorComposite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; colorComposite.setLayout(layout); Link link = new Link(colorComposite, SWT.NONE); link.setText(PreferencesMessages.JavaEditorColoringConfigurationBlock_link); link.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { PreferencesUtil.createPreferenceDialogOn(parent.getShell(), e.text, null, null); } }); // TODO replace by link-specific tooltips when // bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=88866 gets fixed // link.setToolTipText(PreferencesMessages.JavaEditorColoringConfigurationBlock_link_tooltip); GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, false); gridData.widthHint = 150; // only expand further if anyone else requires it gridData.horizontalSpan = 2; link.setLayoutData(gridData); addFiller(colorComposite, 1); Label label; label = new Label(colorComposite, SWT.LEFT); label.setText(PreferencesMessages.JavaEditorPreferencePage_coloring_element); label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Composite editorComposite = new Composite(colorComposite, SWT.NONE); layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.marginWidth = 0; editorComposite.setLayout(layout); GridData gd = new GridData(SWT.FILL, SWT.BEGINNING, true, false); editorComposite.setLayoutData(gd); fListViewer = new TreeViewer(editorComposite, SWT.SINGLE | SWT.BORDER); fListViewer.setLabelProvider(new ColorListLabelProvider()); fListViewer.setContentProvider(new ColorListContentProvider()); fListViewer.setSorter(new ViewerSorter() { @Override public int category(Object element) { // don't sort the top level categories if (fJavaCategory.equals(element)) { return 0; } if (fJavadocCategory.equals(element)) { return 1; } if (fCommentsCategory.equals(element)) { return 2; } // to sort semantic settings after partition based ones: // if (element instanceof SemanticHighlightingColorListItem) // return 1; return 0; } }); gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, true); gd.heightHint = convertHeightInCharsToPixels(9); int maxWidth = 0; for (final HighlightingColorListItem item : fListModel) { maxWidth = Math.max(maxWidth, convertWidthInCharsToPixels(item.getDisplayName().length())); } ScrollBar vBar = ((Scrollable)fListViewer.getControl()).getVerticalBar(); if (vBar != null) { maxWidth += vBar.getSize().x * 3; // scrollbars and tree indentation guess } gd.widthHint = maxWidth; fListViewer.getControl().setLayoutData(gd); Composite stylesComposite = new Composite(editorComposite, SWT.NONE); layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; layout.numColumns = 2; stylesComposite.setLayout(layout); stylesComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); fEnableCheckbox = new Button(stylesComposite, SWT.CHECK); fEnableCheckbox.setText(PreferencesMessages.JavaEditorPreferencePage_enable); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalAlignment = GridData.BEGINNING; gd.horizontalSpan = 2; fEnableCheckbox.setLayoutData(gd); fColorEditorLabel = new Label(stylesComposite, SWT.LEFT); fColorEditorLabel.setText(PreferencesMessages.JavaEditorPreferencePage_color); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent = 20; fColorEditorLabel.setLayoutData(gd); fSyntaxForegroundColorEditor = new ColorSelector(stylesComposite); Button foregroundColorButton = fSyntaxForegroundColorEditor.getButton(); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); foregroundColorButton.setLayoutData(gd); fBoldCheckBox = new Button(stylesComposite, SWT.CHECK); fBoldCheckBox.setText(PreferencesMessages.JavaEditorPreferencePage_bold); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent = 20; gd.horizontalSpan = 2; fBoldCheckBox.setLayoutData(gd); fItalicCheckBox = new Button(stylesComposite, SWT.CHECK); fItalicCheckBox.setText(PreferencesMessages.JavaEditorPreferencePage_italic); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent = 20; gd.horizontalSpan = 2; fItalicCheckBox.setLayoutData(gd); fStrikethroughCheckBox = new Button(stylesComposite, SWT.CHECK); fStrikethroughCheckBox.setText(PreferencesMessages.JavaEditorPreferencePage_strikethrough); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent = 20; gd.horizontalSpan = 2; fStrikethroughCheckBox.setLayoutData(gd); fUnderlineCheckBox = new Button(stylesComposite, SWT.CHECK); fUnderlineCheckBox.setText(PreferencesMessages.JavaEditorPreferencePage_underline); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent = 20; gd.horizontalSpan = 2; fUnderlineCheckBox.setLayoutData(gd); label = new Label(colorComposite, SWT.LEFT); label.setText(PreferencesMessages.JavaEditorPreferencePage_preview); label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Control previewer = createPreviewer(colorComposite); gd = new GridData(GridData.FILL_BOTH); gd.widthHint = convertWidthInCharsToPixels(20); gd.heightHint = convertHeightInCharsToPixels(5); previewer.setLayoutData(gd); fListViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { handleSyntaxColorListSelection(); } }); foregroundColorButton.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // do nothing } public void widgetSelected(SelectionEvent e) { HighlightingColorListItem item= getHighlightingColorListItem(); PreferenceConverter.setValue(getPreferenceStore(), item.getColorKey(), fSyntaxForegroundColorEditor.getColorValue()); } }); fBoldCheckBox.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // do nothing } public void widgetSelected(SelectionEvent e) { HighlightingColorListItem item= getHighlightingColorListItem(); getPreferenceStore().setValue(item.getBoldKey(), fBoldCheckBox.getSelection()); } }); fItalicCheckBox.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // do nothing } public void widgetSelected(SelectionEvent e) { HighlightingColorListItem item= getHighlightingColorListItem(); getPreferenceStore().setValue(item.getItalicKey(), fItalicCheckBox.getSelection()); } }); fStrikethroughCheckBox.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // do nothing } public void widgetSelected(SelectionEvent e) { HighlightingColorListItem item= getHighlightingColorListItem(); getPreferenceStore().setValue(item.getStrikethroughKey(), fStrikethroughCheckBox.getSelection()); } }); fUnderlineCheckBox.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // do nothing } public void widgetSelected(SelectionEvent e) { HighlightingColorListItem item= getHighlightingColorListItem(); getPreferenceStore().setValue(item.getUnderlineKey(), fUnderlineCheckBox.getSelection()); } }); fEnableCheckbox.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // do nothing } public void widgetSelected(SelectionEvent e) { HighlightingColorListItem item= getHighlightingColorListItem(); if (item instanceof SemanticHighlightingColorListItem) { boolean enable= fEnableCheckbox.getSelection(); getPreferenceStore().setValue(((SemanticHighlightingColorListItem)item).getEnableKey(), enable); fEnableCheckbox.setSelection(enable); fSyntaxForegroundColorEditor.getButton().setEnabled(enable); fColorEditorLabel.setEnabled(enable); fBoldCheckBox.setEnabled(enable); fItalicCheckBox.setEnabled(enable); fStrikethroughCheckBox.setEnabled(enable); fUnderlineCheckBox.setEnabled(enable); // uninstallSemanticHighlighting(); // installSemanticHighlighting(); } } }); colorComposite.layout(false); return colorComposite; } 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 Control createPreviewer(Composite parent) { IPreferenceStore generalTextStore = EditorsUI.getPreferenceStore(); IPreferenceStore store = new ChainedPreferenceStore(new IPreferenceStore[]{getPreferenceStore(), new PreferencesAdapter(createTemporaryCorePreferenceStore()), generalTextStore}); fPreviewViewer = new CALSourceViewer(parent, null, null, false, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER, store); SimpleCALSourceViewerConfiguration configuration = new SimpleCALSourceViewerConfiguration(fColorManager, store, null, CALPartitions.CAL_PARTITIONING, false); fPreviewViewer.configure(configuration); // fake 1.5 source to get 1.5 features right. configuration.handlePropertyChangeEvent(new PropertyChangeEvent(this, CoreOptionIDs.COMPILER_SOURCE, CoreOptionIDs.VERSION_1_4, CoreOptionIDs.VERSION_1_5)); Font font = JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT); fPreviewViewer.getTextWidget().setFont(font); CALSourcePreviewerUpdater.configureViewer(fPreviewViewer, configuration, store); fPreviewViewer.setEditable(false); String content = loadPreviewContentFromFile("ColorSettingPreviewCode.txt"); //$NON-NLS-1$ IDocument document = new Document(content); CALEclipseUIPlugin.getDefault().getCALTextTools().setupCALDocumentPartitioner(document, CALPartitions.CAL_PARTITIONING); fPreviewViewer.setDocument(document); // installSemanticHighlighting(); return fPreviewViewer.getControl(); } private Preferences createTemporaryCorePreferenceStore() { Preferences result = new Preferences(); result.setValue(COMPILER_TASK_TAGS, "TASK,TODO"); //$NON-NLS-1$ return result; } private String loadPreviewContentFromFile(String filename) { String line; String separator = System.getProperty("line.separator"); //$NON-NLS-1$ StringBuilder buffer = new StringBuilder(512); BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(filename))); while ((line = reader.readLine()) != null) { buffer.append(line); buffer.append(separator); } } catch (IOException io) { CALEclipseUIPlugin.log(io); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { } } } return buffer.toString(); } // /** // * Install Semantic Highlighting on the previewer // * // */ // private void installSemanticHighlighting() { // if (fSemanticHighlightingManager == null) { // fSemanticHighlightingManager= new SemanticHighlightingManager(); // fSemanticHighlightingManager.install(fPreviewViewer, fColorManager, getPreferenceStore(), createPreviewerRanges()); // } // } // // // /** // * Uninstall Semantic Highlighting from the previewer // * // */ // private void uninstallSemanticHighlighting() { // if (fSemanticHighlightingManager != null) { // fSemanticHighlightingManager.uninstall(); // fSemanticHighlightingManager= null; // } // } // // // /** // * Create the hard coded previewer ranges // * // * @return the hard coded previewer ranges // */ // private SemanticHighlightingManager.HighlightedRange[][] createPreviewerRanges() { // return new SemanticHighlightingManager.HighlightedRange[][] { // { createHighlightedRange( 6, 13, 9, SemanticHighlightings.DEPRECATED_MEMBER) }, // { createHighlightedRange( 6, 23, 1, SemanticHighlightings.TYPE_VARIABLE) }, // { createHighlightedRange( 7, 26, 8, SemanticHighlightings.STATIC_FINAL_FIELD), createHighlightedRange(7, 26, 8, SemanticHighlightings.STATIC_FIELD), createHighlightedRange(7, 26, 8, SemanticHighlightings.FIELD) }, // { createHighlightedRange( 9, 20, 11, SemanticHighlightings.STATIC_FIELD), createHighlightedRange(9, 20, 11, SemanticHighlightings.FIELD) }, // { createHighlightedRange(11, 9, 1, SemanticHighlightings.TYPE_VARIABLE) }, // { createHighlightedRange(11, 11, 5, SemanticHighlightings.FIELD) }, // { createHighlightedRange(13, 19, 5, SemanticHighlightings.ANNOTATION_ELEMENT_REFERENCE) }, // { createHighlightedRange(14, 12, 3, SemanticHighlightings.METHOD_DECLARATION), createHighlightedRange(14, 12, 3, SemanticHighlightings.METHOD) }, // { createHighlightedRange(14, 24, 9, SemanticHighlightings.PARAMETER_VARIABLE) }, // { createHighlightedRange(15, 2, 14, SemanticHighlightings.ABSTRACT_METHOD_INVOCATION), createHighlightedRange(15, 2, 14, SemanticHighlightings.METHOD) }, // { createHighlightedRange(16, 6, 5, SemanticHighlightings.LOCAL_VARIABLE_DECLARATION) }, // { createHighlightedRange(16, 16, 8, SemanticHighlightings.INHERITED_METHOD_INVOCATION), createHighlightedRange(16, 16, 8, SemanticHighlightings.METHOD) }, // { createHighlightedRange(17, 2, 12, SemanticHighlightings.STATIC_METHOD_INVOCATION), createHighlightedRange(17, 2, 12, SemanticHighlightings.METHOD) }, // { createHighlightedRange(18, 9, 3, SemanticHighlightings.METHOD) }, // { createHighlightedRange(18, 13, 5, SemanticHighlightings.LOCAL_VARIABLE) }, // { createHighlightedRange(18, 22, 9, SemanticHighlightings.AUTOBOXING) }, // }; // } // // // /** // * Create a highlighted range on the previewers document with the given line, column, length and key. // * // * @param line the line // * @param column the column // * @param length the length // * @param key the key // * @return the highlighted range // */ // private HighlightedRange createHighlightedRange(int line, int column, int length, String key) { // try { // IDocument document= fPreviewViewer.getDocument(); // int offset= document.getLineOffset(line) + column; // return new HighlightedRange(offset, length, key); // } catch (BadLocationException x) { // CALEclipseUIPlugin.log(x); // } // return null; // } /** * Returns the current highlighting color list item. * * @return the current highlighting color list item */ private HighlightingColorListItem getHighlightingColorListItem() { IStructuredSelection selection = (IStructuredSelection)fListViewer.getSelection(); Object element = selection.getFirstElement(); if (element instanceof String) { return null; } return (HighlightingColorListItem)element; } /** * Initializes the computation of horizontal and vertical dialog units based * on the size of current font. * <p> * This method must be called before any of the dialog unit based conversion * methods are called. * </p> * * @param testControl * a control from which to obtain the current font */ private void initializeDialogUnits(Control testControl) { // Compute and store a font metric GC gc = new GC(testControl); gc.setFont(JFaceResources.getDialogFont()); fFontMetrics = gc.getFontMetrics(); gc.dispose(); } }