/* * Copyright (c) 2003-2004 Christopher Lenz and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * Christopher Lenz - initial API and implementation * * $Id: SyntaxPreviewer.java,v 1.1 2004-09-02 18:11:50 jsurfer Exp $ */ package net.sourceforge.phpeclipse.css.ui.internal.preferences; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import net.sourceforge.phpeclipse.css.ui.CssUI; import net.sourceforge.phpeclipse.css.ui.internal.CssUIPreferences; import net.sourceforge.phpeclipse.css.ui.internal.text.CssSourceViewerConfiguration; import net.sourceforge.phpeclipse.css.ui.text.CssTextTools; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; /** * A previewer for the syntax styling preferences, used to give real time * feedback on changes to the preferences. */ public class SyntaxPreviewer extends SourceViewer { // Constants --------------------------------------------------------------- /** * Alias for the preference constant EDITOR_BACKGROUND_COLOR. */ private static final String BACKGROUND_COLOR = CssUIPreferences.EDITOR_BACKGROUND_COLOR; /** * Alias for the preference constant * EDITOR_BACKGROUND_DEFAULT_COLOR. */ private static final String BACKGROUND_DEFAULT_COLOR = CssUIPreferences.EDITOR_BACKGROUND_DEFAULT_COLOR; // Instance Variables ------------------------------------------------------ /** * The preference store used for loading the style settings. */ private IPreferenceStore fStore; /** * Listener that handles changes to the preference store. */ private IPropertyChangeListener fPropertyChangeListener = new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if (affectsPresentation(event)) { updateColors(); } invalidateTextPresentation(); } }; private CssTextTools fTextTools; /** * The cached background color of the previewer. */ private Color fBackgroundColor; // Constructors ------------------------------------------------------------ /** * Constructor. * * @param parent The parent composite * @param store The preference store to use for loading the style settings */ public SyntaxPreviewer(Composite parent, IPreferenceStore store) { super(parent, null, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); this.fStore = store; this.fTextTools = new CssTextTools(this.fStore); configure(new CssSourceViewerConfiguration( this.fTextTools, this.fStore)); setEditable(false); getTextWidget().setFont(JFaceResources.getTextFont()); IDocument document = new Document( loadTextFromResource("preview.css")); //$NON-NLS-1$ this.fTextTools.setupDocument(document); setDocument(document); this.fStore.addPropertyChangeListener(this.fPropertyChangeListener); } // SourceViewer Implementation --------------------------------------------- /** * @see org.eclipse.jface.text.TextViewer#handleDispose() */ protected void handleDispose() { if (this.fStore != null) { if (this.fPropertyChangeListener != null) { this.fStore.removePropertyChangeListener( this.fPropertyChangeListener); this.fPropertyChangeListener = null; } this.fStore = null; } if (this.fTextTools != null) { this.fTextTools.dispose(); this.fTextTools = null; } if ((this.fBackgroundColor != null) && !this.fBackgroundColor.isDisposed()) { this.fBackgroundColor.dispose(); } super.handleDispose(); } // Private Methods --------------------------------------------------------- private boolean affectsPresentation(PropertyChangeEvent event) { String p = event.getProperty(); if (BACKGROUND_COLOR.equals(p) || BACKGROUND_DEFAULT_COLOR.equals(p)) { return true; } return false; } /** * Creates a color from the information stored in the given preference * store. * * @param key The preference key under which the color is stored * @param display The display * @return The color found, or null if no corresponding * preference is available */ private Color createColor(String key, Display display) { Color color = null; if (this.fStore.contains(key)) { RGB rgb = null; if (this.fStore.isDefault(key)) { rgb = PreferenceConverter.getDefaultColor(this.fStore, key); } else { rgb = PreferenceConverter.getColor(this.fStore, key); } if (rgb != null) { color = new Color(display, rgb); } } return color; } /** * Loads and returns the text stored in the specified resource. * * @param name The resource name * @return The text loaded from the resource, or an empty string if there * was an error reading the resource contents */ private String loadTextFromResource(String name) { 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(name))); while ((line = reader.readLine()) != null) { buffer.append(line); buffer.append(separator); } } catch (IOException io) { CssUI.log(io); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { // ignore } } } return buffer.toString(); } /** * Updates the previewer colors. */ private void updateColors() { if (this.fStore != null) { StyledText styledText = getTextWidget(); Color color = null; if (!this.fStore.getBoolean(BACKGROUND_DEFAULT_COLOR)) { color = createColor(BACKGROUND_COLOR, styledText.getDisplay()); } styledText.setBackground(color); if (this.fBackgroundColor != null) { this.fBackgroundColor.dispose(); } this.fBackgroundColor = color; } } }