net.sourceforge.eclipseccase.ui.preferences.DecoratorPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.eclipseccase.ui.preferences.DecoratorPreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2002, 2004 eclipse-ccase.sourceforge.net.
 * 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:
 *     Matthew Conway - initial API and implementation
 *     IBM Corporation - concepts and ideas taken from Eclipse code
 *     Gunnar Wagenknecht - reworked to Eclipse 3.0 API and code clean-up
 *******************************************************************************/
package net.sourceforge.eclipseccase.ui.preferences;

import net.sourceforge.eclipseccase.ui.ClearCaseImages;

import java.io.File;
import java.net.MalformedURLException;
import java.util.*;
import net.sourceforge.eclipseccase.ui.*;
import net.sourceforge.eclipseccase.ui.ClearCaseDecorator.CachedImageDescriptor;
import net.sourceforge.eclipseccase.ui.viewsupport.OverlayIcon;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.preference.*;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.team.ui.TeamImages;
import org.eclipse.ui.*;
import org.eclipse.ui.ide.IDE.SharedImages;

/**
 * The preference page for the ClearCase label decorator.
 */
public class DecoratorPreferencePage extends FieldEditorPreferencePageWithCategories
        implements IWorkbenchPreferencePage {

    /**
     * Provides a fixed mock resource tree for showing the preview.
     */
    private final class PreviewContentProvider implements ITreeContentProvider {

        public void dispose() {
            // empty
        }

        public Object[] getChildren(Object parentElement) {
            if (parentElement == ResourcesPlugin.getWorkspace().getRoot())
                return new String[] { PREVIEW_PROJECT };
            else if (parentElement.equals(PREVIEW_PROJECT))
                return new String[] { PREVIEW_CHECKEDIN_TXT, PREVIEW_CHECKEDOUT_JAVA, PREVIEW_LINKED_FOLDER,
                        PREVIEW_DERIVED_OBJECT, PREVIEW_IGNORED_TXT, PREVIEW_HIJACKEDARCHIVE_ZIP,
                        PREVIEW_UNKNOWNSTATE_TXT, PREVIEW_VIEWPRIVATE_TXT };
            else if (parentElement.equals(PREVIEW_FOLDER))
                return new String[] { PREVIEW_CHECKEDIN_TXT, PREVIEW_VIEWPRIVATE_TXT };
            else
                return new Object[0];
        }

        public Object[] getElements(Object inputElement) {
            return getChildren(inputElement);
        }

        public Object getParent(Object element) {
            return null;
        }

        public boolean hasChildren(Object element) {
            if (element.equals(PREVIEW_PROJECT) || element.equals(PREVIEW_FOLDER)
                    || element == ResourcesPlugin.getWorkspace().getRoot())
                return true;
            else
                return false;
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // empty
        }
    }

    /**
     * Label provider creates a dummy CVSDecoration using the preferences set in
     * this page. The decoration properties are assigned to the different named
     * resources in the preview tree so that most of the decoration options are
     * shown
     */
    private final class PreviewLabelProvider extends LabelProvider implements IFontProvider, IColorProvider {

        public Color getBackground(Object element) {
            return null;
        }

        private ImageDescriptor getElementBackgroundImage() {
            // if (!customClearCaseElementsBackground.getBooleanValue())
            return IMG_DESC_ELEMENT_BG;

            // String customImage =
            // imageClearCaseElementsBackground.getStringValue();
            // if (null == customImage || customImage.trim().length() == 0)
            // return ImageDescriptor.getMissingImageDescriptor();
            //
            //         if (!(customImage.toLowerCase().endsWith(".gif") //$NON-NLS-1$
            //               || customImage.toLowerCase().endsWith(".jpg") //$NON-NLS-1$
            //         || customImage.toLowerCase().endsWith(".png"))) //$NON-NLS-1$
            // return ImageDescriptor.getMissingImageDescriptor();
            //
            // // create image
            // File imageFile = new File(customImage);
            // if (imageFile.canRead()) {
            // try {
            // return ImageDescriptor.createFromURL(imageFile.toURL());
            // } catch (MalformedURLException e) {
            // // ignore
            // }
            // }
            // // ensure image is not null
            // return ImageDescriptor.getMissingImageDescriptor();
        }

        public Font getFont(Object element) {
            return null;
        }

        public Color getForeground(Object element) {
            return null;
        }

        @Override
        public Image getImage(Object element) {
            Image baseImage;
            if (element.equals(PREVIEW_PROJECT)) {
                baseImage = PlatformUI.getWorkbench().getSharedImages().getImage(SharedImages.IMG_OBJ_PROJECT);
            } else if (element.equals(PREVIEW_FOLDER) || element.equals(PREVIEW_LINKED_FOLDER)) {
                baseImage = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
            } else {
                baseImage = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
            }

            ImageDescriptor overlay = null;
            ImageDescriptor background = null;
            if (element.equals(PREVIEW_IGNORED_TXT)) {
                // nothing
            } else if (element.equals(PREVIEW_PROJECT)) {
                // checked in
                // dirty (has checkouts and hijacked)
                // if (dirtyFolders.getBooleanValue()) {
                // overlay = IMG_DESC_DIRTY;
                // } else if (decorateCheckedIn.getBooleanValue()) {
                // overlay = IMG_DESC_CHECKED_IN;
                // }
                overlay = IMG_DESC_CHECKED_IN;
                // background
                if (decorateClearCaseElements.getBooleanValue()) {
                    background = getElementBackgroundImage();
                }
            } else if (element.equals(PREVIEW_FOLDER)) {
                // checked in
                // dirty (has view private and checked in)
                // if (dirtyFoldersWithViewPrivate.getBooleanValue() &&
                // dirtyFolders.getBooleanValue() &&
                // decorateViewPrivate.getBooleanValue()) {
                // overlay = IMG_DESC_DIRTY;
                // } else if (decorateCheckedIn.getBooleanValue()) {
                // overlay = IMG_DESC_CHECKED_IN;
                // }
                overlay = IMG_DESC_CHECKED_IN;
                // background
                if (decorateClearCaseElements.getBooleanValue()) {
                    background = getElementBackgroundImage();
                }
            } else if (element.equals(PREVIEW_VIEWPRIVATE_TXT)) {
                // view private
                if (decorateViewPrivate.getBooleanValue()) {
                    overlay = IMG_DESC_NEW_RESOURCE;
                }
            } else if (element.equals(PREVIEW_EDITEDSOMEWHERE_JAVA)) {
                // edited in another view or branch
                if (decorateEdited.getBooleanValue()) {
                    overlay = IMG_DESC_EDITED;
                }
                // background
                if (decorateClearCaseElements.getBooleanValue()) {
                    background = getElementBackgroundImage();
                }
            } else if (element.equals(PREVIEW_UNKNOWNSTATE_TXT)) {
                // unknown state
                if (decorateUnknown.getBooleanValue()) {
                    overlay = IMG_DESC_UNKNOWN_STATE;
                }
            } else if (element.equals(PREVIEW_CHECKEDIN_TXT)) {
                // checked in
                if (decorateCheckedIn.getBooleanValue()) {
                    overlay = IMG_DESC_CHECKED_IN;
                }
                // background
                if (decorateClearCaseElements.getBooleanValue()) {
                    background = getElementBackgroundImage();
                }
            } else if (element.equals(PREVIEW_CHECKEDOUT_JAVA)) {
                // checked out
                overlay = IMG_DESC_CHECKED_OUT;
                // background
                if (decorateClearCaseElements.getBooleanValue()) {
                    background = getElementBackgroundImage();
                }
            } else if (element.equals(PREVIEW_DERIVED_OBJECT)) {
                if (decorateDerivedObjects.getBooleanValue()) {
                    overlay = IMG_DESC_DERIVED_OBJECT;
                }
            } else if (element.equals(PREVIEW_HIJACKEDARCHIVE_ZIP)) {
                // hijacked
                if (decorateHijacked.getBooleanValue()) {
                    overlay = IMG_DESC_HIJACKED;
                }
                // background
                if (decorateClearCaseElements.getBooleanValue()) {
                    background = getElementBackgroundImage();
                }
            } else if (element.equals(PREVIEW_LINKED_FOLDER)) {
                // linked
                overlay = IMG_DESC_LINK;
                // background
                if (decorateClearCaseElements.getBooleanValue()) {
                    background = getElementBackgroundImage();
                }
            }

            if (null == overlay && null == background)
                return baseImage;

            // Otherwise
            ImageDescriptor[] overlays = null != overlay ? new ImageDescriptor[] { overlay }
                    : new ImageDescriptor[0];
            int[] locations = null != overlay ? new int[] { OverlayIcon.BOTTOM_RIGHT } : new int[0];
            ImageDescriptor[] backgrounds = null != background ? new ImageDescriptor[] { background } : null;
            ImageDescriptor resultImageDescriptor = new OverlayIcon(baseImage, overlays, locations, backgrounds,
                    new Point(baseImage.getBounds().width, baseImage.getBounds().height));
            if (imageCache == null) {
                imageCache = new HashMap(10);
            }
            Image image = (Image) imageCache.get(overlay);
            if (image == null) {
                image = resultImageDescriptor.createImage();
                imageCache.put(resultImageDescriptor, image);
            }
            return image;
        }

        @Override
        public String getText(Object element) {
            String prefix = null;
            String suffix = null;
            if (element.equals(PREVIEW_IGNORED_TXT)) {
                // nothing
            } else if (element.equals(PREVIEW_PROJECT)) {
                // version info
                if (addVersionInfo.getBooleanValue()) {
                    suffix = PREVIEW_VERSION_1;
                }
                // view name
                if (addViewInfoToProjects.getBooleanValue()) {
                    if (null == suffix) {
                        suffix = PREVIEW_VIEW_TAG;
                    } else {
                        suffix += PREVIEW_VIEW_TAG;
                    }
                }
                // checked in
                // dirty (has checkouts and hijacked)
                if (decorateElementStatesWithTextPrefix.getBooleanValue()) {
                    //               if (dirtyFolders.getBooleanValue()) {
                    //                  prefix = prefixDirtyResources.getStringValue();
                    //               } else {
                    //                  prefix = prefixCheckedInResources.getStringValue();
                    //               }
                    prefix = prefixCheckedInResources.getStringValue();
                }
            } else if (element.equals(PREVIEW_FOLDER)) {
                // version info
                if (addVersionInfo.getBooleanValue()) {
                    suffix = PREVIEW_VERSION_2;
                }
                // checked in
                // dirty (has view private and checked in)
                if (decorateElementStatesWithTextPrefix.getBooleanValue()) {
                    //               if (dirtyFoldersWithViewPrivate.getBooleanValue() && dirtyFolders.getBooleanValue()) {
                    //                  prefix = prefixDirtyResources.getStringValue();
                    //               } else {
                    //                  prefix = prefixCheckedInResources.getStringValue();
                    //               }
                    prefix = prefixCheckedInResources.getStringValue();
                }
            } else if (element.equals(PREVIEW_VIEWPRIVATE_TXT)) {
                // view private
                if (decorateElementStatesWithTextPrefix.getBooleanValue()) {
                    prefix = prefixViewPrivateResources.getStringValue();
                }
            } else if (element.equals(PREVIEW_EDITEDSOMEWHERE_JAVA)) {
                // version info
                if (addVersionInfo.getBooleanValue()) {
                    suffix = PREVIEW_VERSION_3;
                }
                // edited in another view or branch
                if (decorateElementStatesWithTextPrefix.getBooleanValue()) {
                    prefix = prefixResourcesEditedBySomeoneElse.getStringValue();
                }
            } else if (element.equals(PREVIEW_UNKNOWNSTATE_TXT)) {
                // unknown state
                if (decorateElementStatesWithTextPrefix.getBooleanValue()) {
                    prefix = prefixResourcesWithUnknownState.getStringValue();
                }
            } else if (element.equals(PREVIEW_CHECKEDIN_TXT)) {
                // version info
                if (addVersionInfo.getBooleanValue()) {
                    suffix = PREVIEW_VERSION_4;
                }
                // checked in
                if (decorateElementStatesWithTextPrefix.getBooleanValue()) {
                    prefix = prefixCheckedInResources.getStringValue();
                }
            } else if (element.equals(PREVIEW_CHECKEDOUT_JAVA)) {
                // checked out
            } else if (element.equals(PREVIEW_HIJACKEDARCHIVE_ZIP)) {
                // hijacked
                if (decorateElementStatesWithTextPrefix.getBooleanValue()) {
                    prefix = prefixHijackedResources.getStringValue();
                }
            } else if (element.equals(PREVIEW_LINKED_FOLDER)) {
                // linked
                suffix = PREVIEW_LINKE_TARGET;
            }

            StringBuffer buffer = new StringBuffer();
            if (prefix != null) {
                buffer.append(prefix);
            }
            buffer.append((String) element);
            if (suffix != null) {
                buffer.append(suffix);
            }
            return buffer.toString();
        }
    }

    /** category 'General' */
    private static final String CAT_GENERAL = PreferenceMessages
            .getString("DecoratorPreferencePage.category.general"); //$NON-NLS-1$

    /** category 'Icons' */
    private static final String CAT_IMAGES = PreferenceMessages
            .getString("DecoratorPreferencePage.category.images"); //$NON-NLS-1$

    /** category 'Text' */
    private static final String CAT_TEXT = PreferenceMessages.getString("DecoratorPreferencePage.category.text"); //$NON-NLS-1$

    /** array with all categories */
    private static final String[] CATEGORIES = new String[] { CAT_TEXT, CAT_IMAGES /*
                                                                                   * ,
                                                                                   * CAT_GENERAL
                                                                                   */ };

    /** cached descriptor */
    static final ImageDescriptor IMG_DESC_CHECKED_IN;

    /** cached descriptor */
    static final ImageDescriptor IMG_DESC_DERIVED_OBJECT;

    /** cached descriptor */
    static final ImageDescriptor IMG_DESC_CHECKED_OUT;

    /** cached descriptor */
    static final ImageDescriptor IMG_DESC_DIRTY;

    /** cached descriptor */
    static final ImageDescriptor IMG_DESC_EDITED;

    /** cached descriptor */
    static ImageDescriptor IMG_DESC_ELEMENT_BG;

    /** cached descriptor */
    static final ImageDescriptor IMG_DESC_HIJACKED;

    /** cached descriptor */
    static final ImageDescriptor IMG_DESC_LINK;

    /** cached descriptor */
    static final ImageDescriptor IMG_DESC_LINK_WARNING;

    /** cached descriptor */
    static final ImageDescriptor IMG_DESC_NEW_RESOURCE;

    /** cached descriptor */
    static ImageDescriptor IMG_DESC_UNKNOWN_STATE;

    private static final String PREVIEW_CHECKEDIN_TXT = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.checkedInFile"); //$NON-NLS-1$

    private static final String PREVIEW_CHECKEDOUT_JAVA = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.checkedOutFile"); //$NON-NLS-1$

    private static final String PREVIEW_EDITEDSOMEWHERE_JAVA = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.editedBySomeoneElseFile"); //$NON-NLS-1$

    private static final String PREVIEW_FOLDER = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.folder"); //$NON-NLS-1$

    private static final String PREVIEW_HIJACKEDARCHIVE_ZIP = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.hijackedFile"); //$NON-NLS-1$

    private static final String PREVIEW_IGNORED_TXT = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.ignoredFile"); //$NON-NLS-1$

    private static final String PREVIEW_LINKE_TARGET = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.linkTarget"); //$NON-NLS-1$

    private static final String PREVIEW_LINKED_FOLDER = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.linkedFolder"); //$NON-NLS-1$

    private static final String PREVIEW_PROJECT = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.project"); //$NON-NLS-1$

    private static final String PREVIEW_UNKNOWNSTATE_TXT = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.unknownStateFile"); //$NON-NLS-1$

    private static final String PREVIEW_VERSION_1 = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.version1"); //$NON-NLS-1$

    private static final String PREVIEW_VERSION_2 = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.version2"); //$NON-NLS-1$

    private static final String PREVIEW_VERSION_3 = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.version3"); //$NON-NLS-1$

    private static final String PREVIEW_VERSION_4 = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.version4"); //$NON-NLS-1$

    private static final String PREVIEW_VIEW_TAG = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.viewTag"); //$NON-NLS-1$

    private static final String PREVIEW_VIEWPRIVATE_TXT = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.viewPrivateFile"); //$NON-NLS-1$

    private static final String PREVIEW_DERIVED_OBJECT = PreferenceMessages
            .getString("DecoratorPreferencePage.preview.derivedObject"); //$NON-NLS-1$

    static {
        IMG_DESC_DIRTY = new CachedImageDescriptor(
                TeamImages.getImageDescriptor(org.eclipse.team.ui.ISharedImages.IMG_DIRTY_OVR));
        IMG_DESC_CHECKED_IN = new CachedImageDescriptor(
                TeamImages.getImageDescriptor(org.eclipse.team.ui.ISharedImages.IMG_CHECKEDIN_OVR));
        IMG_DESC_CHECKED_OUT = new CachedImageDescriptor(
                ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_CHECKEDOUT_OVR));
        IMG_DESC_NEW_RESOURCE = new CachedImageDescriptor(
                ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_QUESTIONABLE_OVR));
        IMG_DESC_EDITED = new CachedImageDescriptor(
                ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_EDITED_OVR));
        IMG_DESC_UNKNOWN_STATE = new CachedImageDescriptor(
                ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_UNKNOWN_OVR));
        IMG_DESC_DERIVED_OBJECT = new CachedImageDescriptor(
                ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_DERIVEDOBJECT_OVR));
        IMG_DESC_LINK = new CachedImageDescriptor(ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_LINK_OVR));
        IMG_DESC_LINK_WARNING = new CachedImageDescriptor(
                ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_LINK_WARNING_OVR));
        IMG_DESC_HIJACKED = new CachedImageDescriptor(
                ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_HIJACKED_OVR));
        IMG_DESC_ELEMENT_BG = new CachedImageDescriptor(
                ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_ELEMENT_BG));
    }

    BooleanFieldEditor addVersionInfo;

    BooleanFieldEditor addViewInfoToProjects;

    // MasterBooleanFieldEditor customClearCaseElementsBackground;

    BooleanFieldEditor decorateCheckedIn;

    BooleanFieldEditor decorateDerivedObjects;

    MasterBooleanFieldEditor decorateClearCaseElements;

    BooleanFieldEditor decorateEdited;

    MasterBooleanFieldEditor decorateElementStatesWithTextPrefix;

    BooleanFieldEditor decorateHijacked;

    BooleanFieldEditor decorateUnknown;

    BooleanFieldEditor decorateViewPrivate;

    MasterBooleanFieldEditor dirtyFolders;

    BooleanFieldEditor dirtyFoldersWithViewPrivate;

    /** Cache for folder images that have been overlayed with sample CVS icons */
    Map imageCache;

    // FileFieldEditor imageClearCaseElementsBackground;

    StringFieldEditor prefixCheckedInResources;

    StringFieldEditor prefixDirtyResources;

    StringFieldEditor prefixHijackedResources;

    StringFieldEditor prefixResourcesEditedBySomeoneElse;

    StringFieldEditor prefixResourcesWithUnknownState;

    StringFieldEditor prefixViewPrivateResources;

    /** Tree that provides a preview of the decorations */
    TreeViewer previewTree;

    /**
     * Update the preview tree when a theme changes.
     */
    private final IPropertyChangeListener themeListener = new IPropertyChangeListener() {

        public void propertyChange(PropertyChangeEvent event) {
            previewTree.refresh(true /* update labels */);
        }
    };

    /**
     * Creates a new instance.
     */
    public DecoratorPreferencePage() {
        super();

        // Set the preference store for the preference page.
        setPreferenceStore(ClearCaseUI.getInstance().getPreferenceStore());

        setDescription(PreferenceMessages.getString("DecoratorPreferencePage.description")); //$NON-NLS-1$
    }

    /**
     * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
     */
    @Override
    protected void createFieldEditors() {
        /*
         * // general dirtyFolders = new
         * MasterBooleanFieldEditor(ClearCaseUIPreferences
         * .DECORATE_FOLDERS_DIRTY,
         * PreferenceMessages.getString("DecoratorPreferencePage.folders.dirty"
         * ), //$NON-NLS-1$ getFieldEditorParent(CAT_GENERAL));
         * addField(dirtyFolders);
         * 
         * dirtyFoldersWithViewPrivate = new
         * BooleanFieldEditor(ClearCaseUIPreferences
         * .DECORATE_FOLDERS_CONTAINING_VIEW_PRIVATE_DIRTY,
         * PreferenceMessages.getString
         * ("DecoratorPreferencePage.folders.dirty.withViewPrivate"),
         * getFieldEditorParent(CAT_GENERAL));//$NON-NLS-1$
         * addField(dirtyFoldersWithViewPrivate);
         * dirtyFolders.addSlave(dirtyFoldersWithViewPrivate);
         */

        // image decoration

        decorateClearCaseElements = new MasterBooleanFieldEditor(ClearCaseUIPreferences.DECORATE_CLEARCASE_ELEMENTS,
                PreferenceMessages.getString("DecoratorPreferencePage.clearCaseElements"), //$NON-NLS-1$
                getFieldEditorParent(CAT_IMAGES));
        addField(decorateClearCaseElements);

        //      customClearCaseElementsBackground = new MasterBooleanFieldEditor(ClearCaseUIPreferences.IMAGE_CLEARCASE_ELEMENTS_BACKGROUND_CUSTOM, PreferenceMessages.getString("DecoratorPreferencePage.customClearCaseElementsBackground"), getFieldEditorParent(CAT_IMAGES)); //$NON-NLS-1$
        // decorateClearCaseElements.addSlave(customClearCaseElementsBackground);
        // addField(customClearCaseElementsBackground);

        //      imageClearCaseElementsBackground = new FileFieldEditor(ClearCaseUIPreferences.IMAGE_CLEARCASE_ELEMENTS_BACKGROUND, PreferenceMessages.getString("DecoratorPreferencePage.imageClearCaseElementsBackground"), getFieldEditorParent(CAT_IMAGES)); //$NON-NLS-1$
        //      imageClearCaseElementsBackground.setFileExtensions(new String[] { "*.gif;*.jpg;*.png" }); //$NON-NLS-1$
        // imageClearCaseElementsBackground.setEmptyStringAllowed(true);
        // customClearCaseElementsBackground.addSlave(imageClearCaseElementsBackground);
        // addField(imageClearCaseElementsBackground);

        decorateCheckedIn = new BooleanFieldEditor(ClearCaseUIPreferences.DECORATE_CHECKED_IN_ELEMENTS,
                PreferenceMessages.getString("DecoratorPreferencePage.checkedIn"), //$NON-NLS-1$
                getFieldEditorParent(CAT_IMAGES));
        addField(decorateCheckedIn);

        // decorateEdited = new BooleanFieldEditor(ClearCaseUIPreferences.DECORATE_EDITED_ELEMENTS, PreferenceMessages.getString("DecoratorPreferencePage.edited"), getFieldEditorParent(CAT_IMAGES)); //$NON-NLS-1$
        // addField(decorateEdited);

        decorateHijacked = new BooleanFieldEditor(ClearCaseUIPreferences.DECORATE_HIJACKED_ELEMENTS,
                PreferenceMessages.getString("DecoratorPreferencePage.hijacked"), //$NON-NLS-1$
                getFieldEditorParent(CAT_IMAGES));
        addField(decorateHijacked);

        decorateViewPrivate = new BooleanFieldEditor(ClearCaseUIPreferences.DECORATE_VIEW_PRIVATE_ELEMENTS,
                PreferenceMessages.getString("DecoratorPreferencePage.viewPrivate"), //$NON-NLS-1$
                getFieldEditorParent(CAT_IMAGES));
        addField(decorateViewPrivate);

        decorateDerivedObjects = new BooleanFieldEditor(ClearCaseUIPreferences.DECORATE_DERIVED_OBJECTS,
                PreferenceMessages.getString("DecoratorPreferencePage.derivedObjects"), //$NON-NLS-1$
                getFieldEditorParent(CAT_IMAGES));
        addField(decorateDerivedObjects);

        decorateUnknown = new BooleanFieldEditor(ClearCaseUIPreferences.DECORATE_UNKNOWN_ELEMENTS,
                PreferenceMessages.getString("DecoratorPreferencePage.unknown"), //$NON-NLS-1$
                getFieldEditorParent(CAT_IMAGES));
        addField(decorateUnknown);

        // text decorations

        addViewInfoToProjects = new BooleanFieldEditor(ClearCaseUIPreferences.DECORATE_PROJECTS_WITH_VIEW_INFO,
                PreferenceMessages.getString("DecoratorPreferencePage.addViewInfoToProjects"), //$NON-NLS-1$
                getFieldEditorParent(CAT_TEXT));
        addField(addViewInfoToProjects);

        addVersionInfo = new BooleanFieldEditor(ClearCaseUIPreferences.DECORATE_ELEMENTS_WITH_VERSION_INFO,
                PreferenceMessages.getString("DecoratorPreferencePage.appendVersionInfoToResources"), //$NON-NLS-1$
                getFieldEditorParent(CAT_TEXT));
        addField(addVersionInfo);

        decorateElementStatesWithTextPrefix = new MasterBooleanFieldEditor(
                ClearCaseUIPreferences.DECORATE_ELEMENT_STATES_WITH_TEXT_PREFIX,
                PreferenceMessages.getString("DecoratorPreferencePage.prependResourceNamesWithStateInfoFor"), //$NON-NLS-1$
                getFieldEditorParent(CAT_TEXT));
        addField(decorateElementStatesWithTextPrefix);

        prefixCheckedInResources = new StringFieldEditor(ClearCaseUIPreferences.TEXT_PREFIX_CHECKED_IN_ELEMENTS,
                PreferenceMessages.getString("DecoratorPreferencePage.checkedInResources"), 4, //$NON-NLS-1$
                getFieldEditorParent(CAT_TEXT));
        addField(prefixCheckedInResources);
        decorateElementStatesWithTextPrefix.addSlave(prefixCheckedInResources);

        prefixDirtyResources = new StringFieldEditor(ClearCaseUIPreferences.TEXT_PREFIX_DIRTY_ELEMENTS,
                PreferenceMessages.getString("DecoratorPreferencePage.dirtyResources"), 4, //$NON-NLS-1$
                getFieldEditorParent(CAT_TEXT));
        addField(prefixDirtyResources);
        decorateElementStatesWithTextPrefix.addSlave(prefixDirtyResources);

        prefixHijackedResources = new StringFieldEditor(ClearCaseUIPreferences.TEXT_PREFIX_HIJACKED_ELEMENTS,
                PreferenceMessages.getString("DecoratorPreferencePage.hijackedResources"), 4, //$NON-NLS-1$
                getFieldEditorParent(CAT_TEXT));
        addField(prefixHijackedResources);
        decorateElementStatesWithTextPrefix.addSlave(prefixHijackedResources);

        prefixViewPrivateResources = new StringFieldEditor(ClearCaseUIPreferences.TEXT_PREFIX_VIEW_PRIVATE_ELEMENTS,
                PreferenceMessages.getString("DecoratorPreferencePage.viewPrivateResources"), 4, //$NON-NLS-1$
                getFieldEditorParent(CAT_TEXT));
        addField(prefixViewPrivateResources);
        decorateElementStatesWithTextPrefix.addSlave(prefixViewPrivateResources);

        //      prefixResourcesEditedBySomeoneElse = new StringFieldEditor(ClearCaseUIPreferences.TEXT_PREFIX_EDITED_ELEMENTS, PreferenceMessages.getString("DecoratorPreferencePage.resourcesEditedBySomeoneElse"), 4, //$NON-NLS-1$
        // getFieldEditorParent(CAT_TEXT));
        // addField(prefixResourcesEditedBySomeoneElse);
        // decorateElementStatesWithTextPrefix.addSlave(prefixResourcesEditedBySomeoneElse);

        prefixResourcesWithUnknownState = new StringFieldEditor(ClearCaseUIPreferences.TEXT_PREFIX_UNKNOWN_ELEMENTS,
                PreferenceMessages.getString("DecoratorPreferencePage.resourcesWithUnknownState"), 4, //$NON-NLS-1$
                getFieldEditorParent(CAT_TEXT));
        addField(prefixResourcesWithUnknownState);
        decorateElementStatesWithTextPrefix.addSlave(prefixResourcesWithUnknownState);
    }

    /**
     * Creates a preview.
     * 
     * @see net.sourceforge.eclipseccase.ui.preferences.FieldEditorPreferencePageWithCategories#createInformationAreaContent(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createInformationAreaContent(Composite parent) {
        // Preview Pane
        previewTree = new TreeViewer(parent);
        GridData data = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
        data.heightHint = 200;
        previewTree.getTree().setLayoutData(data);
        previewTree.setContentProvider(new PreviewContentProvider());
        previewTree.setLabelProvider(new PreviewLabelProvider());
        previewTree.setInput(ResourcesPlugin.getWorkspace().getRoot());
        previewTree.expandAll();

        // track theme changes
        PlatformUI.getWorkbench().getThemeManager().addPropertyChangeListener(themeListener);

        return previewTree.getControl();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.preference.FieldEditorPreferencePage#dispose()
     */
    @Override
    public void dispose() {

        // remove theme listener
        PlatformUI.getWorkbench().getThemeManager().removePropertyChangeListener(themeListener);

        // dispose image cache
        if (null != imageCache) {
            Iterator images = imageCache.values().iterator();
            while (images.hasNext()) {
                Image image = (Image) images.next();
                image.dispose();
            }
            imageCache = null;
        }

        // call super
        super.dispose();
    }

    /*
     * (non-Javadoc)
     * 
     * @seenet.sourceforge.eclipseccase.ui.preferences.
     * FieldEditorPreferencePageWithCategories#getCategories()
     */
    @Override
    protected String[] getCategories() {
        return CATEGORIES;
    }

    /*
     * (non-Javadoc)
     * 
     * @seenet.sourceforge.eclipseccase.ui.preferences.
     * FieldEditorPreferencePageWithCategories#getDescription(java.lang.String)
     */
    @Override
    protected String getDescription(String category) {
        //      if (CAT_GENERAL.equals(category))
        //         return PreferenceMessages.getString("DecoratorPreferencePage.category.general.description"); //$NON-NLS-1$
        //      if (CAT_IMAGES.equals(category))
        //         return PreferenceMessages.getString("DecoratorPreferencePage.category.images.description"); //$NON-NLS-1$
        //      if (CAT_TEXT.equals(category))
        //         return PreferenceMessages.getString("DecoratorPreferencePage.category.text.description"); //$NON-NLS-1$

        return null;
    }

    public void init(IWorkbench workbench) {
        // nothing
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.preference.IPreferencePage#performOk()
     */
    @Override
    public boolean performOk() {
        if (super.performOk()) {
            // refresh the decorator
            IDecoratorManager manager = PlatformUI.getWorkbench().getDecoratorManager();
            if (manager.getEnabled(ClearCaseDecorator.ID)) {
                ClearCaseDecorator activeDecorator = (ClearCaseDecorator) manager
                        .getBaseLabelProvider(ClearCaseDecorator.ID);
                if (activeDecorator != null) {
                    activeDecorator.refresh();
                }
            }
            return true;
        }

        return false;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.preference.FieldEditorPreferencePage#propertyChange
     * (org.eclipse.jface.util.PropertyChangeEvent)
     */
    @Override
    public void propertyChange(PropertyChangeEvent event) {

        if (FieldEditor.VALUE.equals(event.getProperty())) {
            previewTree.refresh(true /* update labels */);
        }

        // call super
        super.propertyChange(event);
    }

}