blob: 3100e36e4719992f6821e34125a4b7a84b4ee9d8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2018 IBM Corporation and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
*******************************************************************************/
package org.eclipse.dltk.ui.preferences;
import static org.eclipse.dltk.ui.PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED_SUFFIX;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.dltk.compiler.task.TaskTagUtils;
import org.eclipse.dltk.compiler.util.Util;
import org.eclipse.dltk.internal.ui.coloring.ColoringConfigurationModelCollector;
import org.eclipse.dltk.internal.ui.editor.ScriptSourceViewer;
import org.eclipse.dltk.internal.ui.editor.semantic.highlighting.SemanticHighlightingManager;
import org.eclipse.dltk.internal.ui.preferences.ScriptSourcePreviewerUpdater;
import org.eclipse.dltk.internal.ui.text.DLTKColorManager;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.dltk.ui.PreferenceConstants;
import org.eclipse.dltk.ui.PreferencesAdapter;
import org.eclipse.dltk.ui.coloring.ColoringPreferences;
import org.eclipse.dltk.ui.coloring.IColoringCategoryConstants;
import org.eclipse.dltk.ui.coloring.IColoringPreferenceProvider;
import org.eclipse.dltk.ui.editor.highlighting.ISemanticHighlightingUpdater;
import org.eclipse.dltk.ui.editor.highlighting.SemanticHighlighting;
import org.eclipse.dltk.ui.text.IColorManager;
import org.eclipse.dltk.ui.text.ScriptSourceViewerConfiguration;
import org.eclipse.dltk.ui.text.ScriptTextTools;
import org.eclipse.dltk.ui.util.PixelConverter;
import org.eclipse.jface.preference.ColorSelector;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.IOverviewRuler;
import org.eclipse.jface.text.source.IVerticalRuler;
import org.eclipse.jface.text.source.projection.ProjectionViewer;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
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.ViewerComparator;
import org.eclipse.osgi.util.NLS;
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.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.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.texteditor.ChainedPreferenceStore;
import org.eclipse.ui.texteditor.ITextEditor;
/**
* Configures Editor hover preferences. TODO: We need to add support for user
* categories here...
*/
public abstract class AbstractScriptEditorColoringConfigurationBlock extends
AbstractConfigurationBlock implements IColoringCategoryConstants {
/**
* Item in the highlighting color list.
*/
protected static class HighlightingColorListItem {
/** Display name */
private String fDisplayName;
/** Color preference key */
private String fColorKey;
/** Bold preference key */
private String fBoldKey;
/** Italic preference key */
private String fItalicKey;
/**
* Strikethrough preference key.
*/
private String fStrikethroughKey;
/**
* Underline preference key.
*/
private String fUnderlineKey;
private final String fCategory;
/**
* 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, String category) {
fDisplayName = displayName;
fColorKey = colorKey;
fBoldKey = boldKey;
fItalicKey = italicKey;
fStrikethroughKey = strikethroughKey;
fUnderlineKey = underlineKey;
fCategory = category;
}
/**
* @since 2.0
*/
public String[] getKeys() {
return new String[] { fColorKey, fBoldKey, fItalicKey,
fStrikethroughKey, fUnderlineKey };
}
/**
* @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;
}
/**
* @return the category name
*/
public String getCategory() {
return fCategory;
}
}
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 category,
String enableKey) {
super(displayName, colorKey, boldKey, italicKey, strikethroughKey,
underlineKey, category);
Assert.isNotNull(enableKey);
fEnableKey = enableKey;
}
/**
* @return the enablement preference key
*/
public String getEnableKey() {
return fEnableKey;
}
@Override
public String[] getKeys() {
final String[] keys = super.getKeys();
final String[] result = new String[keys.length + 1];
System.arraycopy(keys, 0, result, 0, keys.length);
result[keys.length] = fEnableKey;
return result;
}
}
/**
* Color list label provider.
*/
private class ColorListLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
if (element instanceof String) {
return (String) element;
}
return ((HighlightingColorListItem) element).getDisplayName();
}
}
/**
* Color list content provider.
*/
protected String[] getCategories() {
return new String[] { sCoreCategory, sDocumentationCategory,
sCommentsCategory };
}
protected class ColorListContentProvider implements ITreeContentProvider {
@Override
public Object[] getElements(Object inputElement) {
List<String> categorys = new ArrayList<>();
for (String cat : getCategories()) {
if (getElementsForCategory(cat).length > 0) {
categorys.add(cat);
}
}
for (HighlightingColorListItem item : fListModel) {
if (!categorys.contains(item.getCategory())) {
categorys.add(item.getCategory());
}
}
return categorys.toArray();
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof String) {
String entry = (String) parentElement;
return getElementsForCategory(entry);
}
return new Object[0];
}
@Override
public Object getParent(Object element) {
if (element instanceof HighlightingColorListItem) {
return ((HighlightingColorListItem) element).getCategory();
}
return null;
}
@Override
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 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
*/
protected final java.util.List<HighlightingColorListItem> fListModel = new ArrayList<>();
/**
* Highlighting color list viewer
*/
private StructuredViewer fListViewer;
/**
* Semantic highlighting manager
*/
private SemanticHighlightingManager fSemanticHighlightingManager;
/**
* The previewer.
*/
private ProjectionViewer fPreviewViewer;
/**
* The color manager.
*/
private IColorManager fColorManager;
protected String[][] getSyntaxColorListModel() {
final ColoringConfigurationModelCollector collector = new ColoringConfigurationModelCollector();
final String natureId = getNatureId();
Assert.isNotNull(natureId);
final IColoringPreferenceProvider[] providers = ColoringPreferences
.getProviders(natureId);
if (providers != null) {
for (IColoringPreferenceProvider provider : providers) {
provider.providePreferences(collector);
}
}
return collector.getColorListModel();
}
/**
* @since 3.0
*/
protected String getNatureId() {
return null;
}
protected abstract ProjectionViewer createPreviewViewer(Composite parent,
IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
boolean showAnnotationsOverview, int styles,
IPreferenceStore store);
protected abstract ScriptSourceViewerConfiguration createSimpleSourceViewerConfiguration(
IColorManager colorManager, IPreferenceStore preferenceStore,
ITextEditor editor, boolean configureFormatter);
protected abstract void setDocumentPartitioning(IDocument document);
protected Object[] getElementsForCategory(String entry) {
List<HighlightingColorListItem> elements = new ArrayList<>();
for (HighlightingColorListItem item : this.fListModel) {
if (entry.equals(item.getCategory())) {
elements.add(item);
}
}
return elements.toArray();
}
public AbstractScriptEditorColoringConfigurationBlock(
OverlayPreferenceStore store) {
super(store);
fColorManager = new DLTKColorManager(false);
final Set<String> colorKeys = new HashSet<>();
final String[][] model = getSyntaxColorListModel();
for (int i = 0, n = model.length; i < n; i++) {
final String colorKey = model[i][1];
if (colorKeys.add(colorKey)) {
if (model[i].length == 3) {
fListModel.add(new HighlightingColorListItem(model[i][0],
colorKey, colorKey + BOLD, colorKey + ITALIC,
colorKey + STRIKETHROUGH, colorKey + UNDERLINE,
model[i][2]));
} else {
fListModel.add(new SemanticHighlightingColorListItem(
model[i][0], colorKey, colorKey + BOLD,
colorKey + ITALIC, colorKey + STRIKETHROUGH,
colorKey + UNDERLINE, model[i][2], colorKey
+ EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED_SUFFIX));
}
}
}
final SemanticHighlighting[] highlightings = getSemanticHighlightings();
for (int i = 0; i < highlightings.length; ++i) {
final SemanticHighlighting h = highlightings[i];
if (h.isSemanticOnly()) {
final String colorKey = h.getPreferenceKey();
if (colorKeys.add(colorKey)) {
fListModel.add(new SemanticHighlightingColorListItem(
h.getDisplayName(), colorKey, colorKey + BOLD,
colorKey + ITALIC, colorKey + STRIKETHROUGH,
colorKey + UNDERLINE, sCoreCategory,
h.getEnabledPreferenceKey()));
}
} else if (!colorKeys.contains(h.getPreferenceKey())) {
final String msgText = PreferencesMessages.DLTKEditorPreferencePage_coloring_semantic_not_configurable;
DLTKUIPlugin.warn(NLS.bind(msgText, h.getPreferenceKey()));
}
}
store.addKeys(createOverlayStoreKeys());
}
private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
ArrayList<OverlayPreferenceStore.OverlayKey> overlayKeys = new ArrayList<>();
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) {
final SemanticHighlightingColorListItem shItem = (SemanticHighlightingColorListItem) item;
final String enableKey = shItem.getEnableKey();
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.BOOLEAN, enableKey));
}
}
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
*/
@Override
public Control createControl(Composite parent) {
initializeDialogUnits(parent);
return createSyntaxPage(parent);
}
@Override
public void initialize() {
super.initialize();
fListViewer.setInput(fListModel);
fListViewer.setSelection(new StructuredSelection(sCoreCategory));
}
@Override
public void performDefaults() {
super.performDefaults();
handleSyntaxColorListSelection();
uninstallSemanticHighlighting();
installSemanticHighlighting();
fPreviewViewer.invalidateTextPresentation();
}
@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.DLTKEditorColoringConfigurationBlock_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.
// EditorColoringConfigurationBlock_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.DLTKEditorPreferencePage_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(getColorListContentProvider());
fListViewer.setComparator(new ViewerComparator() {
@Override
public int category(Object element) {
// don't sort the top level categories
if (sCoreCategory.equals(element))
return 0;
if (sDocumentationCategory.equals(element))
return 1;
if (sCommentsCategory.equals(element))
return 2;
// custom category
if (element instanceof String)
return 3;
// 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 (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.DLTKEditorPreferencePage_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.DLTKEditorPreferencePage_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.DLTKEditorPreferencePage_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.DLTKEditorPreferencePage_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.DLTKEditorPreferencePage_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.DLTKEditorPreferencePage_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.DLTKEditorPreferencePage_preview);
label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Control previewer = createPreviewer(colorComposite);
if (previewer != null) {
gd = new GridData(GridData.FILL_BOTH);
gd.widthHint = convertWidthInCharsToPixels(20);
gd.heightHint = convertHeightInCharsToPixels(5);
previewer.setLayoutData(gd);
} else {
label.dispose();
}
fListViewer.addSelectionChangedListener(
event -> handleSyntaxColorListSelection());
foregroundColorButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// do nothing
}
@Override
public void widgetSelected(SelectionEvent e) {
HighlightingColorListItem item = getHighlightingColorListItem();
PreferenceConverter.setValue(getPreferenceStore(),
item.getColorKey(),
fSyntaxForegroundColorEditor.getColorValue());
}
});
fBoldCheckBox.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// do nothing
}
@Override
public void widgetSelected(SelectionEvent e) {
HighlightingColorListItem item = getHighlightingColorListItem();
getPreferenceStore().setValue(item.getBoldKey(),
fBoldCheckBox.getSelection());
}
});
fItalicCheckBox.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// do nothing
}
@Override
public void widgetSelected(SelectionEvent e) {
HighlightingColorListItem item = getHighlightingColorListItem();
getPreferenceStore().setValue(item.getItalicKey(),
fItalicCheckBox.getSelection());
}
});
fStrikethroughCheckBox.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// do nothing
}
@Override
public void widgetSelected(SelectionEvent e) {
HighlightingColorListItem item = getHighlightingColorListItem();
getPreferenceStore().setValue(item.getStrikethroughKey(),
fStrikethroughCheckBox.getSelection());
}
});
fUnderlineCheckBox.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// do nothing
}
@Override
public void widgetSelected(SelectionEvent e) {
HighlightingColorListItem item = getHighlightingColorListItem();
getPreferenceStore().setValue(item.getUnderlineKey(),
fUnderlineCheckBox.getSelection());
}
});
fEnableCheckbox.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// do nothing
}
@Override
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;
}
/**
* @return
*/
protected IContentProvider getColorListContentProvider() {
return new ColorListContentProvider();
}
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 = this.createPreviewViewer(parent, null, null, false,
SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER, store);
if (fPreviewViewer == null) {
return null;
}
ScriptSourceViewerConfiguration configuration = createSimpleSourceViewerConfiguration(
fColorManager, store, null, false);
fPreviewViewer.configure(configuration);
if (fPreviewViewer.getTextWidget().getTabs() == 0) {
fPreviewViewer.getTextWidget().setTabs(4);
}
new ScriptSourcePreviewerUpdater(fPreviewViewer, configuration, store);
fPreviewViewer.setEditable(false);
String content = getPreviewContent();
IDocument document = new Document(content);
this.setDocumentPartitioning(document);
fPreviewViewer.setDocument(document);
installSemanticHighlighting();
return fPreviewViewer.getControl();
}
private Preferences createTemporaryCorePreferenceStore() {
Preferences store = new Preferences();
TaskTagUtils.initializeDefaultValues(store);
return store;
}
protected ScriptTextTools getTextTools() {
return null;
}
/**
* Returns the array of the {@link SemanticHighlighting}s that should be
* listed in the color preferences dialog. If there is no semantic
* highlighting - the empty array should be returned.
*
* If the color key is already listed in the array returned by the
* {@link #getSyntaxColorListModel()} it will not be added again - only new
* items are added to the list.
*
* @return
*/
protected SemanticHighlighting[] getSemanticHighlightings() {
final ScriptTextTools textTools = getTextTools();
return textTools != null ? textTools.getSemanticHighlightings()
: new SemanticHighlighting[0];
}
/**
* Install Semantic Highlighting on the previewer
*/
private void installSemanticHighlighting() {
final ScriptTextTools textTools = getTextTools();
if (fSemanticHighlightingManager == null && textTools != null) {
final ISemanticHighlightingUpdater updater = textTools
.getSemanticPositionUpdater(getNatureId());
if (updater != null) {
fSemanticHighlightingManager = new SemanticHighlightingManager(
updater);
fSemanticHighlightingManager.install(
(ScriptSourceViewer) fPreviewViewer, fColorManager,
getPreferenceStore());
}
}
}
/**
* Uninstall Semantic Highlighting from the previewer
*/
private void uninstallSemanticHighlighting() {
if (fSemanticHighlightingManager != null) {
fSemanticHighlightingManager.uninstall();
fSemanticHighlightingManager = null;
}
}
/**
* Returns the current highlighting color list item.
*
* @return the current highlighting color list item
*
*/
private HighlightingColorListItem getHighlightingColorListItem() {
IStructuredSelection selection = fListViewer.getStructuredSelection();
Object element = selection.getFirstElement();
if (element instanceof String)
return null;
return (HighlightingColorListItem) element;
}
protected String getPreviewContent() {
StringBuffer buffer = new StringBuffer(512);
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(getPreviewContentReader()));
String line = null;
while ((line = reader.readLine()) != null) {
if (buffer.length() != 0) {
buffer.append(Util.LINE_SEPARATOR);
}
buffer.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
}
}
}
return buffer.toString();
}
protected InputStream getPreviewContentReader() {
return null;
}
}