com.byterefinery.rmbench.preferences.TableThemesPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for com.byterefinery.rmbench.preferences.TableThemesPreferencePage.java

Source

/*
 * created 20.09.2005
 *
 * Copyright 2009, ByteRefinery
 * 
 * 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
 * 
 * $Id: TableThemesPreferencePage.java 678 2008-02-17 22:52:09Z cse $
 */
package com.byterefinery.rmbench.preferences;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

import com.byterefinery.rmbench.RMBenchPlugin;
import com.byterefinery.rmbench.extension.TableThemeExtension;
import com.byterefinery.rmbench.extension.TableTypeExtension;
import com.byterefinery.rmbench.util.ColorRegistry;

/**
 * preference page for editing the color settings for predefined table type themes
 * 
 * @author cse
 */
public class TableThemesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    private static final RGB NULL_RGB = new RGB(0, 0, 0);
    private ColorRegistry colorRegistry = new ColorRegistry();

    private Button changeThemeButton;
    private Button deleteThemeButton;

    private TreeViewer themesViewer;

    private final Map<TableThemeExtension, ColorDefinition[]> colorDefinitionMap = new TreeMap<TableThemeExtension, ColorDefinition[]>(
            new Comparator<TableThemeExtension>() {
                public int compare(TableThemeExtension o1, TableThemeExtension o2) {
                    return o1.getLabel().compareTo(o2.getLabel());
                }
            });

    private ColorDefinition selectedColorDefinition;

    protected Control createContents(Composite parent) {

        Composite mainComposite = new Composite(parent, SWT.NULL);
        mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        GridLayout layout = new GridLayout();
        layout.verticalSpacing = 10;
        mainComposite.setLayout(layout);

        createTypeThemesGroup(mainComposite);

        return mainComposite;
    }

    public void init(IWorkbench workbench) {
        setPreferenceStore(RMBenchPlugin.getDefault().getPreferenceStore());
    }

    protected void performDefaults() {
        for (ColorDefinition[] colorDefinitions : colorDefinitionMap.values()) {
            for (int i = 0; i < colorDefinitions.length; i++) {
                colorDefinitions[i].setRGB(PreferenceHandler.getDefaultRGB(colorDefinitions[i].id), true);
                themesViewer.update(colorDefinitions[i], null);
            }
        }
        super.performDefaults();
    }

    public boolean performOk() {

        for (ColorDefinition[] colorDefinitions : colorDefinitionMap.values()) {
            for (int i = 0; i < colorDefinitions.length; i++) {
                if (colorDefinitions[i].isChanged) {
                    if (colorDefinitions[i].isDefault)
                        PreferenceHandler.setDefaultRGB(colorDefinitions[i].id);
                    else
                        PreferenceHandler.setRGB(colorDefinitions[i].id, colorDefinitions[i].value);
                }
            }
        }
        colorRegistry.dispose();
        return super.performOk();
    }

    private void createTypeThemesGroup(Composite mainComposite) {

        Composite themesGroup = new Composite(mainComposite, SWT.NULL);
        themesGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        GridLayout layout = new GridLayout(2, false);
        themesGroup.setLayout(layout);

        themesViewer = new TreeViewer(themesGroup, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
        data.heightHint = Math.max(175, convertHeightInCharsToPixels(10));
        themesViewer.getTree().setLayoutData(data);

        themesViewer.setContentProvider(new ThemeContentProvider());
        themesViewer.setLabelProvider(new TableThemeLabelProvider());
        initColorDefinitions();
        themesViewer.setInput(colorDefinitionMap);
        themesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                Object selection = ((StructuredSelection) themesViewer.getSelection()).getFirstElement();
                if (selection instanceof ColorDefinition) {
                    selectedColorDefinition = (ColorDefinition) selection;
                    setThemeButtonsEnabled(true);
                } else
                    setThemeButtonsEnabled(false);
            }
        });

        Composite themeButtonsGroup = new Composite(themesGroup, SWT.NULL);
        themeButtonsGroup.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
        themeButtonsGroup.setLayout(new GridLayout());

        changeThemeButton = new Button(themeButtonsGroup, SWT.PUSH);
        changeThemeButton.setText(Messages.buttonChange);
        changeThemeButton.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
        changeThemeButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                ColorDialog colorDialog = new ColorDialog(themesViewer.getTree().getShell());
                if (selectedColorDefinition.value != null)
                    colorDialog.setRGB(selectedColorDefinition.value);
                RGB newColor = colorDialog.open();
                if (newColor != null) {
                    selectedColorDefinition.setRGB(newColor, false);
                    themesViewer.update(selectedColorDefinition, null);
                }
            }
        });
        deleteThemeButton = new Button(themeButtonsGroup, SWT.PUSH);
        deleteThemeButton.setText(Messages.buttonDelete);
        deleteThemeButton.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
        deleteThemeButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                selectedColorDefinition.setRGB(null, false);
                themesViewer.update(selectedColorDefinition, null);
            }
        });
        setThemeButtonsEnabled(false);
    }

    private void initColorDefinitions() {
        TableThemeExtension[] themeExtensions = RMBenchPlugin.getExtensionManager().getTableThemeExtensions();
        for (int i = 0; i < themeExtensions.length; i++) {
            TableThemeExtension extension = themeExtensions[i];

            colorDefinitionMap.put(extension, new ColorDefinition[] {
                    new ColorDefinition(extension.getTitleBgId(), Messages.titleBgColor, extension.titleBgColor),
                    new ColorDefinition(extension.getTitleFgId(), Messages.titleFgColor, extension.titleFgColor),
                    new ColorDefinition(extension.getBodyBgId(), Messages.bodyBgColor, extension.bodyBgColor),
                    new ColorDefinition(extension.getBodyFgId(), Messages.bodyFgColor, extension.bodyFgColor) });
        }
    }

    private void setThemeButtonsEnabled(boolean enabled) {
        changeThemeButton.setEnabled(enabled);
        deleteThemeButton.setEnabled(enabled);
    }

    private class TableThemeLabelProvider extends LabelProvider {

        private HashMap<Color, Image> images = new HashMap<Color, Image>();
        private int imageSize = -1;
        private int usableImageSize = -1;
        private Image emptyImage;

        public void dispose() {
            super.dispose();
            for (Image image : images.values()) {
                image.dispose();
            }
            images.clear();

            if (emptyImage != null) {
                emptyImage.dispose();
                emptyImage = null;
            }
        }

        public Image getImage(Object element) {
            if (element instanceof ColorDefinition) {
                Color c = ((ColorDefinition) element).getColor();
                if (c == null)
                    return null;

                Image image = (Image) images.get(c);
                if (image == null) {
                    Display display = Display.getCurrent();
                    ensureImageSize(display);
                    image = new Image(display, imageSize, imageSize);

                    GC gc = new GC(image);
                    gc.setBackground(themesViewer.getControl().getBackground());
                    gc.setForeground(themesViewer.getControl().getBackground());
                    gc.drawRectangle(0, 0, imageSize - 1, imageSize - 1);

                    gc.setForeground(themesViewer.getControl().getForeground());
                    gc.setBackground(c);

                    int offset = (imageSize - usableImageSize) / 2;
                    gc.drawRectangle(offset, offset, usableImageSize - offset, usableImageSize - offset);
                    gc.fillRectangle(offset + 1, offset + 1, usableImageSize - offset - 1,
                            usableImageSize - offset - 1);
                    gc.dispose();

                    images.put(c, image);
                }
                return image;

            } else {
                return null;
            }
        }

        private void ensureImageSize(Display display) {
            if (imageSize == -1) {
                imageSize = themesViewer.getTree().getItemHeight();
                usableImageSize = Math.max(1, imageSize - 4);
            }
        }

        public String getText(Object element) {
            if (element instanceof ColorDefinition)
                return ((ColorDefinition) element).label;
            else {
                TableThemeExtension themeExtension = (TableThemeExtension) element;
                StringBuffer buf = new StringBuffer(themeExtension.getLabel());
                buf.append(" [");
                TableTypeExtension[] typeExtensions = themeExtension.typeExtensions;
                for (int i = 0; i < typeExtensions.length; i++) {
                    buf.append(typeExtensions[i].getLabel());
                    if (i < typeExtensions.length - 1)
                        buf.append(",");
                }
                buf.append("]");
                return buf.toString();
            }
        }
    }

    private class ColorDefinition {
        final String id;
        final String label;

        RGB value;
        boolean isDefault = true;
        boolean isChanged = false;

        private ColorDefinition(String id, String label, RGB value) {
            this.id = id;
            this.label = label;
            RGB preferenceRgb = PreferenceHandler.getRGB(id);
            this.value = preferenceRgb;// != null ? preferenceRgb : value;
        }

        public void setRGB(RGB newColor, boolean isDefault) {
            value = newColor;
            colorRegistry.put(id, newColor != null ? newColor : NULL_RGB);
            this.isDefault = isDefault;
            this.isChanged = true;
        }

        public Color getColor() {
            if (value == null)
                return null;

            Color color = colorRegistry.get(id);
            if (color == null) {
                colorRegistry.put(id, value);
                color = colorRegistry.get(id);
            }
            return color;
        }
    }

    private class ThemeContentProvider implements ITreeContentProvider {

        public Object[] getChildren(Object parentElement) {
            TableThemeExtension extension = (TableThemeExtension) parentElement;
            return (ColorDefinition[]) colorDefinitionMap.get(extension);
        }

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

        public boolean hasChildren(Object element) {
            return element instanceof TableThemeExtension;
        }

        public Object[] getElements(Object inputElement) {
            return ((Map<?, ?>) inputElement).keySet().toArray();
        }

        public void dispose() {
        }

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