org.eclipse.birt.report.designer.ui.dialogs.StyleBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.birt.report.designer.ui.dialogs.StyleBuilder.java

Source

/*******************************************************************************
 * Copyright (c) 2004 Actuate Corporation.
 * 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:
 *  Actuate Corporation  - initial API and implementation
 *******************************************************************************/

package org.eclipse.birt.report.designer.ui.dialogs;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.eclipse.birt.report.designer.internal.ui.dialogs.BackgroundPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.BaseStylePreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.BlockPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.BorderPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.BoxPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.CommentsPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.FontPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.FormatDateTimePreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.FormatNumberPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.FormatStringPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.GeneralPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.HighlightsPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.MapPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.PageBreakPreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.SizePreferencePage;
import org.eclipse.birt.report.designer.internal.ui.dialogs.StylePreferenceNode;
import org.eclipse.birt.report.designer.nls.Messages;
import org.eclipse.birt.report.designer.ui.util.UIUtil;
import org.eclipse.birt.report.model.api.AbstractThemeHandle;
import org.eclipse.birt.report.model.api.ReportElementHandle;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.preference.IPreferenceNode;
import org.eclipse.jface.preference.IPreferencePage;
import org.eclipse.jface.preference.PreferenceContentProvider;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;

/**
 * Presents style builder dialog.
 */

public class StyleBuilder extends PreferenceDialog {

    protected Logger logger = Logger.getLogger(StyleBuilder.class.getName());

    public static final String DLG_TITLE_NEW = Messages.getString("SytleBuilder.DialogTitle.New"); //$NON-NLS-1$
    public static final String DLG_TITLE_EDIT = Messages.getString("SytleBuilder.DialogTitle.Edit"); //$NON-NLS-1$

    protected String title;

    /**
     * Constructor
     * 
     * @param parentShell
     * @param handle
     */
    public StyleBuilder(Shell parentShell, ReportElementHandle handle, String title) {
        this(parentShell, handle, null, title);
    }

    /**
     * Constructor
     * 
     * @param parentShell
     * @param handle
     */
    public StyleBuilder(Shell parentShell, ReportElementHandle handle, AbstractThemeHandle theme, String title) {
        super(parentShell, createPreferenceManager(handle, theme));
        setHelpAvailable(false);
        IPreferenceNode[] nodes = this.getPreferenceManager().getRootSubNodes();
        for (int i = 0; i < nodes.length; i++) {
            ((BaseStylePreferencePage) nodes[i].getPage()).setBuilder(this);
        }
        this.title = title;

    }

    protected TreeViewer createTreeViewer(Composite parent) {
        final Tree tree = new Tree(parent,
                SWT.FULL_SELECTION | SWT.SINGLE | SWT.HIDE_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);

        // configure the widget
        // tree.setLinesVisible( false );
        tree.setHeaderVisible(false);
        columns = new TreeColumn[2];
        columns[0] = new TreeColumn(tree, SWT.LEFT);
        columns[0].setWidth(0);
        columns[1] = new TreeColumn(tree, SWT.LEFT);
        columns[1].setWidth(getLastRightWidth());
        tree.addControlListener(new ControlAdapter() {

            public void controlResized(ControlEvent e) {
                TreeItem[] items = viewer.getTree().getItems();

                if (items != null) {

                    String[] itemContents = new String[items.length];
                    for (int i = 0; i < items.length; i++) {
                        itemContents[i] = items[i].getText(1);
                    }

                    int maxString = UIUtil.getMaxStringWidth(itemContents, tree);

                    maxString += (16 + 16);

                    columns[1].setWidth(maxString > getLastRightWidth() ? maxString : getLastRightWidth());
                }
            }

        });
        viewer = new TreeViewer(tree);
        addListeners(viewer);
        viewer.setLabelProvider(new PreferenceTreeLabelProvider());
        viewer.setContentProvider(new PreferenceContentProvider());
        return viewer;
    }

    public void refreshPagesStatus() {
        if (viewer != null) {
            viewer.refresh();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.window.Window#open()
     */
    public int open() {
        setSelectedNode("General"); //$NON-NLS-1$
        return super.open();
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets
     * .Shell)
     */
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(title);
    }

    private static PreferenceManager createPreferenceManager(ReportElementHandle handle,
            AbstractThemeHandle theme) {
        PreferenceManager preferenceManager = new PreferenceManager('/');

        // Get the pages from the registry
        List<IPreferenceNode> pageContributions = new ArrayList<IPreferenceNode>();

        // adds preference pages into page contributions.
        pageContributions.add(new StylePreferenceNode("General", //$NON-NLS-1$
                new GeneralPreferencePage(handle, theme)));
        pageContributions.add(new StylePreferenceNode("Font", //$NON-NLS-1$
                new FontPreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("Size", //$NON-NLS-1$
                new SizePreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("Background", //$NON-NLS-1$
                new BackgroundPreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("Block", //$NON-NLS-1$
                new BlockPreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("Box", //$NON-NLS-1$
                new BoxPreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("Border", //$NON-NLS-1$
                new BorderPreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("Number Format", //$NON-NLS-1$
                new FormatNumberPreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("DateTime Format", //$NON-NLS-1$
                new FormatDateTimePreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("String Format", //$NON-NLS-1$
                new FormatStringPreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("PageBreak", //$NON-NLS-1$
                new PageBreakPreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("Map", //$NON-NLS-1$
                new MapPreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("Highlights", //$NON-NLS-1$
                new HighlightsPreferencePage(handle)));
        pageContributions.add(new StylePreferenceNode("Comments", //$NON-NLS-1$
                new CommentsPreferencePage(handle)));

        // Add the contributions to the manager
        Iterator<IPreferenceNode> it = pageContributions.iterator();
        while (it.hasNext()) {
            IPreferenceNode node = it.next();
            preferenceManager.addToRoot(node);
        }
        return preferenceManager;
    }

    private void saveAll(final boolean closeDialog) {
        SafeRunner.run(new SafeRunnable() {

            private boolean errorOccurred;

            private boolean invalid;

            public void run() {
                errorOccurred = false;
                invalid = false;
                try {
                    // Notify all the pages and give them a chance to abort
                    Iterator nodes = getPreferenceManager().getElements(PreferenceManager.PRE_ORDER).iterator();
                    while (nodes.hasNext()) {
                        IPreferenceNode node = (IPreferenceNode) nodes.next();
                        IPreferencePage page = node.getPage();
                        if (page != null) {
                            if (!page.performOk()) {
                                invalid = true;
                                return;
                            }
                        }
                    }
                } catch (Exception e) {
                    handleException(e);
                } finally {
                    // Give subclasses the choice to save the state of the
                    // preference pages.
                    if (!errorOccurred) {
                        handleSave();
                    }

                    // Need to restore state
                    if (!invalid && closeDialog) {
                        close();
                    }

                }
            }

            public void handleException(Throwable e) {
                errorOccurred = true;
                if (Platform.isRunning()) {
                    String bundle = Platform.PI_RUNTIME;
                    Platform.getLog(Platform.getBundle(bundle))
                            .log(new Status(IStatus.ERROR, bundle, 0, e.toString(), e));
                } else {
                    logger.log(Level.SEVERE, e.getMessage(), e);
                }

                setSelectedNodePreference(null);
                String message = ""; //$NON-NLS-1$
                MessageDialog.openError(getShell(), "", message); //$NON-NLS-1$

            }
        });

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.preference.PreferenceDialog#okPressed()
     */
    protected void okPressed() {
        saveAll(true);
    }

    private RGB titleAreaRGB;
    Color titleAreaColor;
    private Label titleLabel;
    private Label titleImageLabel;
    private Image titleImage;
    private Image titleAreaImage;
    public static final String DLG_IMG_TITLE_BANNER = "dialog_title_banner_image"; //$NON-NLS-1$
    public static final String DLG_IMG_TITLE_ERROR = DLG_IMG_MESSAGE_ERROR;
    private Label messageImageLabel;
    private Text messageLabel;
    private int messageLabelHeight;
    private Label leftFillerLabel, bottomFillerLabel;
    private String errorMessage;
    private boolean showingError = false;
    private String message = ""; //$NON-NLS-1$
    private Image messageImage;

    private static final int H_GAP_IMAGE = 5;
    static {
        ImageRegistry reg = JFaceResources.getImageRegistry();
        if (reg.get(DLG_IMG_TITLE_BANNER) == null)
            reg.put(DLG_IMG_TITLE_BANNER,
                    ImageDescriptor.createFromFile(TitleAreaDialog.class, "images/title_banner.gif"));//$NON-NLS-1$
    }

    protected Control createDialogArea(Composite parent) {
        createDialogTitleArea(parent);

        setTitleTitle(Messages.getString("StyleBuilder.Title")); //$NON-NLS-1$

        updateMessage(""); //$NON-NLS-1$

        return super.createDialogArea(parent);
    }

    private void createDialogTitleArea(Composite parent) {

        Composite contents = new Composite(parent, SWT.NONE);
        contents.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        FormLayout layout = new FormLayout();
        contents.setLayout(layout);

        dialogTitleArea = new Composite(contents, SWT.NONE);
        initializeDialogUnits(dialogTitleArea);

        FormData titleAreaData = new FormData();
        titleAreaData.top = new FormAttachment(0, 0);
        titleAreaData.left = new FormAttachment(0, 0);
        titleAreaData.right = new FormAttachment(100, 0);
        dialogTitleArea.setLayoutData(titleAreaData);

        layout = new FormLayout();
        dialogTitleArea.setLayout(layout);

        // add a dispose listener
        dialogTitleArea.addDisposeListener(new DisposeListener() {

            public void widgetDisposed(DisposeEvent e) {
                if (titleAreaColor != null) {
                    titleAreaColor.dispose();
                }
            }
        });
        // Determine the background color of the title bar
        Display display = dialogTitleArea.getDisplay();
        Color background;
        Color foreground;
        if (titleAreaRGB != null) {
            titleAreaColor = new Color(display, titleAreaRGB);
            background = titleAreaColor;
            foreground = null;
        } else {
            background = JFaceColors.getBannerBackground(display);
            foreground = JFaceColors.getBannerForeground(display);
        }

        dialogTitleArea.setBackground(background);
        int verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        int horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
        // Dialog image @ right
        titleImageLabel = new Label(dialogTitleArea, SWT.CENTER);
        titleImageLabel.setBackground(background);
        if (titleAreaImage == null)
            titleImageLabel.setImage(JFaceResources.getImage(DLG_IMG_TITLE_BANNER));
        else
            titleImageLabel.setImage(titleAreaImage);

        FormData imageData = new FormData();
        imageData.top = new FormAttachment(0, 0);
        // Note: do not use horizontalSpacing on the right as that would be a
        // regression from
        // the R2.x style where there was no margin on the right and images are
        // flush to the right
        // hand side. see reopened comments in 41172
        imageData.right = new FormAttachment(100, 0); // horizontalSpacing
        titleImageLabel.setLayoutData(imageData);
        // Title label @ top, left
        titleLabel = new Label(dialogTitleArea, SWT.LEFT);
        JFaceColors.setColors(titleLabel, foreground, background);
        titleLabel.setFont(JFaceResources.getBannerFont());
        titleLabel.setText(" ");//$NON-NLS-1$
        FormData titleData = new FormData();
        titleData.top = new FormAttachment(0, verticalSpacing);
        titleData.right = new FormAttachment(titleImageLabel);
        titleData.left = new FormAttachment(0, horizontalSpacing);
        titleLabel.setLayoutData(titleData);
        // Message image @ bottom, left
        messageImageLabel = new Label(dialogTitleArea, SWT.CENTER);
        messageImageLabel.setBackground(background);
        // Message label @ bottom, center
        messageLabel = new Text(dialogTitleArea, SWT.WRAP | SWT.READ_ONLY);
        JFaceColors.setColors(messageLabel, foreground, background);
        messageLabel.setText(" \n "); // two lines//$NON-NLS-1$
        messageLabel.setFont(JFaceResources.getDialogFont());
        messageLabelHeight = messageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
        // Filler labels
        leftFillerLabel = new Label(dialogTitleArea, SWT.CENTER);
        leftFillerLabel.setBackground(background);
        bottomFillerLabel = new Label(dialogTitleArea, SWT.CENTER);
        bottomFillerLabel.setBackground(background);
        setLayoutsForNormalMessage(verticalSpacing, horizontalSpacing);
        determineTitleImageLargest();

        Label titleBarSeparator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
        titleBarSeparator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    }

    private void determineTitleImageLargest() {
        int titleY = titleImageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
        int verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        int labelY = titleLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
        labelY += verticalSpacing;
        labelY += messageLabelHeight;
        labelY += verticalSpacing;
        titleImageLargest = titleY > labelY;
    }

    private void setLayoutsForNormalMessage(int verticalSpacing, int horizontalSpacing) {
        FormData messageImageData = new FormData();
        messageImageData.top = new FormAttachment(titleLabel, verticalSpacing);
        messageImageData.left = new FormAttachment(0, H_GAP_IMAGE);
        messageImageLabel.setLayoutData(messageImageData);
        FormData messageLabelData = new FormData();
        messageLabelData.top = new FormAttachment(titleLabel, verticalSpacing);
        messageLabelData.right = new FormAttachment(titleImageLabel);
        messageLabelData.left = new FormAttachment(messageImageLabel, horizontalSpacing);
        messageLabelData.height = messageLabelHeight;
        if (titleImageLargest)
            messageLabelData.bottom = new FormAttachment(titleImageLabel, 0, SWT.BOTTOM);
        messageLabel.setLayoutData(messageLabelData);
        FormData fillerData = new FormData();
        fillerData.left = new FormAttachment(0, horizontalSpacing);
        fillerData.top = new FormAttachment(messageImageLabel, 0);
        fillerData.bottom = new FormAttachment(messageLabel, 0, SWT.BOTTOM);
        bottomFillerLabel.setLayoutData(fillerData);
        FormData data = new FormData();
        data.top = new FormAttachment(messageImageLabel, 0, SWT.TOP);
        data.left = new FormAttachment(0, 0);
        data.bottom = new FormAttachment(messageImageLabel, 0, SWT.BOTTOM);
        data.right = new FormAttachment(messageImageLabel, 0);
        leftFillerLabel.setLayoutData(data);
    }

    /**
     * Display the given error message. The currently displayed message is saved
     * and will be redisplayed when the error message is set to
     * <code>null</code>.
     * 
     * @param newErrorMessage
     *            the newErrorMessage to display or <code>null</code>
     */
    public void setErrorMessage(String newErrorMessage) {
        // Any change?
        if (errorMessage == null ? newErrorMessage == null : errorMessage.equals(newErrorMessage))
            return;
        errorMessage = newErrorMessage;

        // Clear or set error message.
        if (errorMessage == null) {
            if (showingError) {
                // we were previously showing an error
                showingError = false;
            }
            // show the message
            // avoid calling setMessage in case it is overridden to call
            // setErrorMessage,
            // which would result in a recursive infinite loop
            if (message == null) // this should probably never happen since
                // setMessage does this conversion....
                message = ""; //$NON-NLS-1$
            updateMessage(message);
            messageImageLabel.setImage(messageImage);
            setImageLabelVisible(messageImage != null);
        } else {
            // Add in a space for layout purposes but do not
            // change the instance variable
            String displayedErrorMessage = " " + errorMessage; //$NON-NLS-1$
            updateMessage(displayedErrorMessage);
            if (!showingError) {
                // we were not previously showing an error
                showingError = true;
                messageImageLabel.setImage(JFaceResources.getImage(DLG_IMG_TITLE_ERROR));
                setImageLabelVisible(true);
            }
        }
        layoutForNewMessage();
    }

    private void setImageLabelVisible(boolean visible) {
        messageImageLabel.setVisible(visible);
        bottomFillerLabel.setVisible(visible);
        leftFillerLabel.setVisible(visible);
    }

    /**
     * Re-layout the labels for the new message.
     */
    private void layoutForNewMessage() {
        int verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        int horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
        // If there are no images then layout as normal
        if (errorMessage == null && messageImage == null) {
            setImageLabelVisible(false);
            setLayoutsForNormalMessage(verticalSpacing, horizontalSpacing);
        } else {
            messageImageLabel.setVisible(true);
            bottomFillerLabel.setVisible(true);
            leftFillerLabel.setVisible(true);
            /**
             * Note that we do not use horizontalSpacing here as when the
             * background of the messages changes there will be gaps between the
             * icon label and the message that are the background color of the
             * shell. We add a leading space elsewhere to compendate for this.
             */
            FormData data = new FormData();
            data.left = new FormAttachment(0, H_GAP_IMAGE);
            data.top = new FormAttachment(titleLabel, verticalSpacing);
            messageImageLabel.setLayoutData(data);
            data = new FormData();
            data.top = new FormAttachment(messageImageLabel, 0);
            data.left = new FormAttachment(0, 0);
            data.bottom = new FormAttachment(messageLabel, 0, SWT.BOTTOM);
            data.right = new FormAttachment(messageImageLabel, 0, SWT.RIGHT);
            bottomFillerLabel.setLayoutData(data);
            data = new FormData();
            data.top = new FormAttachment(messageImageLabel, 0, SWT.TOP);
            data.left = new FormAttachment(0, 0);
            data.bottom = new FormAttachment(messageImageLabel, 0, SWT.BOTTOM);
            data.right = new FormAttachment(messageImageLabel, 0);
            leftFillerLabel.setLayoutData(data);
            FormData messageLabelData = new FormData();
            messageLabelData.top = new FormAttachment(titleLabel, verticalSpacing);
            messageLabelData.right = new FormAttachment(titleImageLabel);
            messageLabelData.left = new FormAttachment(messageImageLabel, 0);
            messageLabelData.height = messageLabelHeight;
            if (titleImageLargest)
                messageLabelData.bottom = new FormAttachment(titleImageLabel, 0, SWT.BOTTOM);
            messageLabel.setLayoutData(messageLabelData);
        }
        // Do not layout before the dialog area has been created
        // to avoid incomplete calculations.
        if (dialogArea != null) {
            dialogTitleArea.getParent().layout(true);
            dialogTitleArea.layout(true);
        }
    }

    public void setTitleMessage(String newMessage, int newType) {
        Image newImage = null;
        if (newMessage != null) {
            switch (newType) {
            case IMessageProvider.NONE:
                break;
            case IMessageProvider.INFORMATION:
                newImage = JFaceResources.getImage(DLG_IMG_MESSAGE_INFO);
                break;
            case IMessageProvider.WARNING:
                newImage = JFaceResources.getImage(DLG_IMG_MESSAGE_WARNING);
                break;
            case IMessageProvider.ERROR:
                newImage = JFaceResources.getImage(DLG_IMG_MESSAGE_ERROR);
                break;
            }
        }
        showTitleMessage(newMessage, newImage);
    }

    /**
     * Show the new message and image.
     * 
     * @param newMessage
     * @param newImage
     */
    private void showTitleMessage(String newMessage, Image newImage) {
        // Any change?
        if (message.equals(newMessage) && messageImage == newImage) {
            return;
        }
        message = newMessage;
        if (message == null)
            message = "";//$NON-NLS-1$
        // Message string to be shown - if there is an image then add in
        // a space to the message for layout purposes
        String shownMessage = (newImage == null) ? message : " " + message; //$NON-NLS-1$  
        messageImage = newImage;
        if (!showingError) {
            // we are not showing an error
            updateMessage(shownMessage);
            messageImageLabel.setImage(messageImage);
            setImageLabelVisible(messageImage != null);
        }
        layoutForNewMessage();
    }

    private void updateMessage(String newMessage) {
        if (newMessage != null && newMessage.length() > 0)
            messageLabel.setText(newMessage);
        else if (DLG_TITLE_EDIT.equals(title))
            setTitleMessage(Messages.getString("StyleBuilder.Edit.Info")); //$NON-NLS-1$
        else if (DLG_TITLE_NEW.equals(title))
            setTitleMessage(Messages.getString("StyleBuilder.New.Info")); //$NON-NLS-1$
    }

    public void setTitleMessage(String message) {
        if (messageLabel != null) {
            messageLabel.setText(message);
            layoutForNewMessage();
        }
    }

    public void setTitleTitle(String title) {
        if (titleLabel != null) {
            titleLabel.setText(title);
            layoutForNewMessage();
        }
    }

    private boolean titleImageLargest = true;

    private TreeViewer viewer;

    private Composite dialogTitleArea;

    private TreeColumn[] columns;

    public boolean isTitleImageLargest() {
        return titleImageLargest;
    }

    public void setTitleImageLargest(boolean titleImageLargest) {
        this.titleImageLargest = titleImageLargest;
    }

    public Image getTitleImage() {
        return titleImage;
    }

    public void setTitleImage(Image titleImage) {
        this.titleImage = titleImage;
    }

    private static class PreferenceTreeLabelProvider implements ITableLabelProvider {

        public Image getColumnImage(Object element, int columnIndex) {
            if (columnIndex == 1)
                return ((IPreferenceNode) element).getLabelImage();
            else
                return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            if (columnIndex == 1)
                return ((IPreferenceNode) element).getLabelText();
            else
                return ""; //$NON-NLS-1$
        }

        public void addListener(ILabelProviderListener listener) {

        }

        public void dispose() {

        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {

        }

    }

}