/*******************************************************************************
* Copyright (c) 2000, 2005 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.cfeclipse.cfml.preferences;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.cfeclipse.cfml.editors.CFConfiguration;
import org.cfeclipse.cfml.editors.formatters.CFMLFormattingStrategy;
import org.cfeclipse.cfml.editors.formatters.FormattingPreferences;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.texteditor.AbstractTextEditor;
/**
* Handles changes for Ant preview viewers.
*
* @since 3.0
*/
class CFPreviewerUpdater {
private Color fForegroundColor= null;
private Color fBackgroundColor= null;
private Color fSelectionBackgroundColor= null;
private Color fSelectionForegroundColor= null;
/**
* Creates a source preview updater for the given viewer, configuration and preference store.
*
* @param viewer the viewer
* @param configuration the configuration
* @param preferenceStore the preference store
*/
public CFPreviewerUpdater(final SourceViewer viewer, final CFConfiguration configuration, final IPreferenceStore preferenceStore) {
initializeViewerColors(viewer, preferenceStore);
final IPropertyChangeListener fontChangeListener= new IPropertyChangeListener() {
/*
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(JFaceResources.TEXT_FONT)) {
Font font= JFaceResources.getFont(JFaceResources.TEXT_FONT);
viewer.getTextWidget().setFont(font);
}
}
};
final IPropertyChangeListener propertyChangeListener= new IPropertyChangeListener() {
/*
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
String property= event.getProperty();
if (AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND.equals(property) || AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT.equals(property) ||
AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND.equals(property) || AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT.equals(property) ||
AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND.equals(property) || AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT.equals(property) ||
AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND.equals(property) || AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT.equals(property))
{
initializeViewerColors(viewer, preferenceStore);
}
/*
if (configuration.affectsTextPresentation(event)) {
configuration.adaptToPreferenceChange(event);
viewer.invalidateTextPresentation();
}
*/
if (FormattingPreferences.affectsFormatting(event)) {
format(viewer, preferenceStore);
}
}
/**
* @param viewer
* @param preferenceStore
*/
private void format(final SourceViewer sourceViewer, final IPreferenceStore store) {
String contents= loadPreviewContentFromFile("FormatPreviewCode.txt");
FormattingPreferences prefs= new FormattingPreferences();
prefs.setPreferenceStore(store);
CFMLFormattingStrategy formatter = new CFMLFormattingStrategy();
contents = formatter.format(contents, prefs, "", false);
viewer.getDocument().set(contents);
}
};
viewer.getTextWidget().addDisposeListener(new DisposeListener() {
/*
* @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
*/
public void widgetDisposed(DisposeEvent e) {
preferenceStore.removePropertyChangeListener(propertyChangeListener);
JFaceResources.getFontRegistry().removeListener(fontChangeListener);
}
});
JFaceResources.getFontRegistry().addListener(fontChangeListener);
preferenceStore.addPropertyChangeListener(propertyChangeListener);
}
/**
* Initializes the given viewer's colors.
*
* @param viewer the viewer to be initialized
* @since 2.0
*/
protected void initializeViewerColors(ISourceViewer viewer, IPreferenceStore store) {
StyledText styledText= viewer.getTextWidget();
// ----------- foreground color --------------------
Color color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT)
? null
: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND, styledText.getDisplay());
styledText.setForeground(color);
if (fForegroundColor != null) {
fForegroundColor.dispose();
}
fForegroundColor= color;
// ---------- background color ----------------------
color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)
? null
: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND, styledText.getDisplay());
styledText.setBackground(color);
if (fBackgroundColor != null) {
fBackgroundColor.dispose();
}
fBackgroundColor= color;
// ----------- selection foreground color --------------------
color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT)
? null
: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND, styledText.getDisplay());
styledText.setSelectionForeground(color);
if (fSelectionForegroundColor != null) {
fSelectionForegroundColor.dispose();
}
fSelectionForegroundColor= color;
// ---------- selection background color ----------------------
color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT)
? null
: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND, styledText.getDisplay());
styledText.setSelectionBackground(color);
if (fSelectionBackgroundColor != null) {
fSelectionBackgroundColor.dispose();
}
fSelectionBackgroundColor= color;
}
/**
* Creates a color from the information stored in the given preference store.
* Returns <code>null</code> if there is no such information available.
*
* @param store the store to read from
* @param key the key used for the lookup in the preference store
* @param display the display used create the color
* @return the created color according to the specification in the preference store
* @since 2.0
*/
private Color createColor(IPreferenceStore store, String key, Display display) {
RGB rgb= null;
if (store.contains(key)) {
if (store.isDefault(key))
rgb= PreferenceConverter.getDefaultColor(store, key);
else
rgb= PreferenceConverter.getColor(store, key);
if (rgb != null)
return new Color(display, rgb);
}
return null;
}
protected String loadPreviewContentFromFile(String filename) {
String line;
String separator= System.getProperty("line.separator"); //$NON-NLS-1$
StringBuffer buffer= new StringBuffer(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) {
io.printStackTrace();
//CFMLPlugin.log(io);
} finally {
if (reader != null) {
try { reader.close(); } catch (IOException e) {}
}
}
return buffer.toString();
}
public void dispose() {
if (fForegroundColor != null) {
fForegroundColor.dispose();
fForegroundColor= null;
}
if (fBackgroundColor != null) {
fBackgroundColor.dispose();
fBackgroundColor= null;
}
if (fSelectionForegroundColor != null) {
fSelectionForegroundColor.dispose();
fSelectionForegroundColor= null;
}
if (fSelectionBackgroundColor != null) {
fSelectionBackgroundColor.dispose();
fSelectionBackgroundColor= null;
}
}
}