org.cfeclipse.cfml.preferences.CFPreviewerUpdater.java Source code

Java tutorial

Introduction

Here is the source code for org.cfeclipse.cfml.preferences.CFPreviewerUpdater.java

Source

/*******************************************************************************
 * 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;
        }
    }
}