org.csstudio.opibuilder.visualparts.OPIColorDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.csstudio.opibuilder.visualparts.OPIColorDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Oak Ridge National Laboratory.
 * 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
 ******************************************************************************/
package org.csstudio.opibuilder.visualparts;

import org.csstudio.opibuilder.OPIBuilderPlugin;
import org.csstudio.opibuilder.util.MediaService;
import org.csstudio.opibuilder.util.OPIColor;
import org.csstudio.ui.util.CustomMediaFactory;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Canvas;
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.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Scale;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;

/**The dialog for selecting OPIColor.
 * @author Xihui Chen
 *
 */
public class OPIColorDialog extends HelpTrayDialog {

    private OPIColor opiColor;
    private TableViewer preDefinedColorsViewer;
    private Label outputTextLabel;
    private String title;

    private Group rgbGroup = null;
    private Label redLabel = null;
    private Scale redScale = null;
    private Spinner redSpinner = null;
    private Label greenLabel = null;
    private Scale greenScale = null;
    private Spinner greenSpinner = null;
    private Label blueLabel = null;
    private Scale blueScale = null;
    private Spinner blueSpinner = null;
    private Canvas colorCanvas;

    protected OPIColorDialog(Shell parentShell, OPIColor color, String dialogTitle) {
        super(parentShell);
        setShellStyle(getShellStyle() | SWT.RESIZE);
        this.title = dialogTitle;
        this.opiColor = color.getCopy();
        //        if(color.isPreDefined())
        //            this.opiColor = new OPIColor(color.getColorName(),
        //                    new RGB(color.getRGBValue().red, color.getRGBValue().green, color.getRGBValue().blue));
        //        else
        //            this.opiColor = new OPIColor(new RGB(color.getRGBValue().red, color.getRGBValue().green, color.getRGBValue().blue));
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void configureShell(final Shell shell) {
        super.configureShell(shell);
        if (title != null) {
            shell.setText(title);
        }
    }

    @Override
    protected String getHelpResourcePath() {
        return "/" + OPIBuilderPlugin.PLUGIN_ID + "/html/ColorFont.html"; //$NON-NLS-1$; //$NON-NLS-2$
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        final Composite parent_Composite = (Composite) super.createDialogArea(parent);

        final Composite mainComposite = new Composite(parent_Composite, SWT.None);
        mainComposite.setLayout(new GridLayout(2, false));
        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gridData.heightHint = 300;
        mainComposite.setLayoutData(gridData);
        final Composite leftComposite = new Composite(mainComposite, SWT.None);
        leftComposite.setLayout(new GridLayout(1, false));
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.widthHint = 220;
        leftComposite.setLayoutData(gd);
        createLabel(leftComposite, "Choose from Predefined Colors:");

        preDefinedColorsViewer = createPredefinedColorsTableViewer(leftComposite);
        preDefinedColorsViewer.setInput(MediaService.getInstance().getAllPredefinedColors());

        Composite rightComposite = new Composite(mainComposite, SWT.None);
        rightComposite.setLayout(new GridLayout(1, false));
        gd = new GridData(SWT.LEFT, SWT.BEGINNING, true, true);
        rightComposite.setLayoutData(gd);

        createLabel(rightComposite, "");

        Button colorDialogButton = new Button(rightComposite, SWT.PUSH);
        colorDialogButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
        colorDialogButton.setText("Choose from Color Dialog");
        colorDialogButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                ColorDialog dialog = new ColorDialog(Display.getCurrent().getActiveShell());
                dialog.setRGB(opiColor.getRGBValue());
                RGB rgb = dialog.open();
                if (rgb != null) {
                    opiColor.setColorValue(rgb);
                    preDefinedColorsViewer.setSelection(null);

                    setRGBEditValue(rgb);

                    outputTextLabel.setText(opiColor.getColorName());
                    colorCanvas.setBackground(CustomMediaFactory.getInstance().getColor(opiColor.getRGBValue()));
                }
            }
        });

        createRGBEditGroup(rightComposite);

        Group group = new Group(rightComposite, SWT.None);
        group.setLayoutData(new GridData(SWT.FILL, SWT.END, true, true));
        group.setLayout(new GridLayout(3, false));
        group.setText("Output");

        colorCanvas = new Canvas(group, SWT.BORDER);
        colorCanvas.setBackground(CustomMediaFactory.getInstance().getColor(opiColor.getRGBValue()));
        gd = new GridData(SWT.LEFT, SWT.TOP, false, false);
        gd.widthHint = 30;
        gd.heightHint = 30;
        colorCanvas.setLayoutData(gd);

        outputTextLabel = new Label(group, SWT.None);
        outputTextLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        outputTextLabel.setText(opiColor.getColorName());

        if (opiColor.isPreDefined())
            preDefinedColorsViewer.setSelection(new StructuredSelection(opiColor));
        else
            preDefinedColorsViewer.setSelection(null);
        return parent_Composite;
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        super.createButtonsForButtonBar(parent);
        //this will help resolve a bug on GTK: The table widget in GTK
        //will force one item selected if it got the focus.
        getButton(IDialogConstants.OK_ID).setFocus();
    }

    /**
     * @param rightComposite
     */
    private void createRGBEditGroup(Composite rightComposite) {

        GridData rgbGD = new GridData();
        rgbGD.horizontalAlignment = org.eclipse.swt.layout.GridData.CENTER;
        rgbGD.grabExcessHorizontalSpace = true;
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 3;
        rgbGroup = new Group(rightComposite, SWT.NONE);
        rgbGroup.setLayout(gridLayout);
        redLabel = new Label(rgbGroup, SWT.NONE);
        redLabel.setText("Red");
        redLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
        redLabel.setLayoutData(rgbGD);
        redScale = new Scale(rgbGroup, SWT.NONE);
        redScale.setMaximum(255);
        redScale.setIncrement(1);
        redScale.setPageIncrement(51);
        redSpinner = new Spinner(rgbGroup, SWT.BORDER);
        redSpinner.setMaximum(255);
        redSpinner.setLayoutData(rgbGD);

        greenLabel = new Label(rgbGroup, SWT.NONE);
        greenLabel.setText("Green");
        greenLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN));
        greenLabel.setLayoutData(rgbGD);
        greenScale = new Scale(rgbGroup, SWT.NONE);
        greenScale.setPageIncrement(51);
        greenScale.setMaximum(255);

        greenSpinner = new Spinner(rgbGroup, SWT.BORDER);
        greenSpinner.setMaximum(255);
        greenSpinner.setLayoutData(rgbGD);
        blueLabel = new Label(rgbGroup, SWT.NONE);
        blueLabel.setText("Blue");
        blueLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
        blueScale = new Scale(rgbGroup, SWT.NONE);
        blueScale.setPageIncrement(51);
        blueScale.setMaximum(255);
        blueSpinner = new Spinner(rgbGroup, SWT.BORDER);
        blueSpinner.setMaximum(255);

        setRGBEditValue(opiColor.getRGBValue());

        redScale.addSelectionListener(new RGBEditListener(0));
        redSpinner.addSelectionListener(new RGBEditListener(0));

        greenScale.addSelectionListener(new RGBEditListener(1));
        greenSpinner.addSelectionListener(new RGBEditListener(1));

        blueScale.addSelectionListener(new RGBEditListener(2));
        blueSpinner.addSelectionListener(new RGBEditListener(2));

        rgbGroup.setTabList(
                new Control[] { redScale, greenScale, blueScale, redSpinner, greenSpinner, blueSpinner });

    }

    /**
     * Creates and configures a {@link TableViewer}.
     *
     * @param parent
     *            The parent for the table
     * @return The {@link TableViewer}
     */
    private TableViewer createPredefinedColorsTableViewer(final Composite parent) {
        TableViewer viewer = new TableViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE);
        viewer.setContentProvider(new BaseWorkbenchContentProvider() {
            @Override
            public Object[] getElements(final Object element) {
                return (Object[]) element;
            }
        });
        viewer.setLabelProvider(new WorkbenchLabelProvider());
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                refreshGUIOnSelection();
            }
        });
        viewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        MenuManager menuManager = new MenuManager();
        menuManager.add(new ReloadColorFileAction());
        viewer.getTable().setMenu(menuManager.createContextMenu(viewer.getTable()));
        viewer.addDoubleClickListener(new IDoubleClickListener() {

            @Override
            public void doubleClick(DoubleClickEvent event) {
                okPressed();
            }
        });
        return viewer;
    }

    /**
     * Refreshes the enabled-state of the actions.
     */
    private void refreshGUIOnSelection() {
        IStructuredSelection selection = (IStructuredSelection) preDefinedColorsViewer.getSelection();
        if (!selection.isEmpty() && selection.getFirstElement() instanceof OPIColor) {
            opiColor = ((OPIColor) selection.getFirstElement()).getCopy();
            setRGBEditValue(opiColor.getRGBValue());
            outputTextLabel.setText(opiColor.getColorName());
            colorCanvas.setBackground(CustomMediaFactory.getInstance().getColor(opiColor.getRGBValue()));

        }
    }

    /**
     * Creates a label with the given text.
     *
     * @param parent
     *            The parent for the label
     * @param text
     *            The text for the label
     */
    private void createLabel(final Composite parent, final String text) {
        Label label = new Label(parent, SWT.WRAP);
        label.setText(text);
        label.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
    }

    public OPIColor getOutput() {
        return opiColor;
    }

    /**
     * @param rgb
     */
    private void setRGBEditValue(RGB rgb) {
        redScale.setSelection(rgb.red);
        redSpinner.setSelection(rgb.red);
        greenScale.setSelection(rgb.green);
        greenSpinner.setSelection(rgb.green);
        blueScale.setSelection(rgb.blue);
        blueSpinner.setSelection(rgb.blue);
    }

    class RGBEditListener extends SelectionAdapter {
        private int type;
        private Scale scale;
        private Spinner spinner;

        public RGBEditListener(int type) {
            this.type = type;
            if (type == 0) {
                scale = redScale;
                spinner = redSpinner;
            } else if (type == 1) {
                scale = greenScale;
                spinner = greenSpinner;
            } else if (type == 2) {
                scale = blueScale;
                spinner = blueSpinner;
            }

        }

        @Override
        public void widgetSelected(SelectionEvent e) {
            RGB rgb = opiColor.getRGBValue();
            int newValue = 0;

            if (e.getSource() instanceof Scale) {
                newValue = ((Scale) e.getSource()).getSelection();
                spinner.setSelection(newValue);
            } else if (e.getSource() instanceof Spinner) {
                newValue = ((Spinner) e.getSource()).getSelection();
                scale.setSelection(newValue);
            }
            if (type == 0)
                rgb.red = newValue;
            else if (type == 1)
                rgb.green = newValue;
            else if (type == 2)
                rgb.blue = newValue;
            opiColor.setColorValue(rgb);
            preDefinedColorsViewer.setSelection(null);
            colorCanvas.setBackground(CustomMediaFactory.getInstance().getColor(opiColor.getRGBValue()));
            outputTextLabel.setText(opiColor.getColorName());
        }
    }

    class ReloadColorFileAction extends Action {
        public ReloadColorFileAction() {
            setText("Reload List From Color File");
            setImageDescriptor(CustomMediaFactory.getInstance()
                    .getImageDescriptorFromPlugin(OPIBuilderPlugin.PLUGIN_ID, "icons/refresh.gif"));
        }

        @Override
        public void run() {
            MediaService.getInstance().reloadColorFile();
            Job job = new Job("Update Colors Viewer") {

                @Override
                protected IStatus run(IProgressMonitor monitor) {
                    Display.getDefault().asyncExec(new Runnable() {

                        @Override
                        public void run() {
                            if (!preDefinedColorsViewer.getControl().isDisposed())
                                preDefinedColorsViewer
                                        .setInput(MediaService.getInstance().getAllPredefinedColors());
                        }
                    });

                    monitor.done();
                    return Status.OK_STATUS;
                }
            };
            job.schedule();

        }

    }

}