de.uniluebeck.itm.spyglass.plugin.nodesensorrange.NodeSensorRangeOptionsComposite.java Source code

Java tutorial

Introduction

Here is the source code for de.uniluebeck.itm.spyglass.plugin.nodesensorrange.NodeSensorRangeOptionsComposite.java

Source

/*
 * --------------------------------------------------------------------------------
 * This file is part of the WSN visualization framework SpyGlass. Copyright (C)
 * 2004-2007 by the SwarmNet (www.swarmnet.de) project SpyGlass is free
 * software; you can redistribute it and/or modify it under the terms of the BSD
 * License. Refer to spyglass-licence.txt file in the root of the SpyGlass
 * source tree for further details.
 * --------------------------------------------------------------------------------
 */
package de.uniluebeck.itm.spyglass.plugin.nodesensorrange;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;

import com.cloudgarden.resource.SWTResourceManager;

import de.uniluebeck.itm.spyglass.gui.databinding.converter.ColorToRGBConverter;
import de.uniluebeck.itm.spyglass.gui.databinding.converter.RGBToColorConverter;
import de.uniluebeck.itm.spyglass.gui.databinding.validator.IntegerRangeValidator;
import de.uniluebeck.itm.spyglass.plugin.nodesensorrange.NodeSensorRangeXMLConfig.Config;
import de.uniluebeck.itm.spyglass.plugin.nodesensorrange.NodeSensorRangeXMLConfig.NodeSensorRange;
import de.uniluebeck.itm.spyglass.plugin.nodesensorrange.NodeSensorRangeXMLConfig.RANGE_TYPE;

// --------------------------------------------------------------------------------
/**
 * @author bimschas
 * 
 */
public class NodeSensorRangeOptionsComposite extends Composite {

    {
        // Register as a resource user - SWTResourceManager will
        // handle the obtaining and disposing of resources
        SWTResourceManager.registerResourceUser(this);
    }

    private NodeSensorRangePreferencePage page;

    private Group groupDefaultRange;

    private Group groupPerNodeConfig;

    private CLabel defaultRangeForegroundColor;

    private Combo defaultRangeType;

    private Button buttonForegroundColor;

    private Button buttonOptions;

    private Button buttonBackgroundColor;

    private CLabel defaultRangeBackgroundColor;

    private Text defaultBackgroundAlphaTransparency;

    private Text defaultLineWidth;

    public NodeSensorRangeOptionsComposite(final Composite parent) {
        super(parent, SWT.NONE);
        initGUI();
    }

    static Text createIntText(final Composite composite, final GridData data, final ModifyListener modifyListener) {
        final Text text = new Text(composite, SWT.BORDER);
        text.setLayoutData(data);
        text.addListener(SWT.Verify, new Listener() {
            @Override
            public void handleEvent(final Event event) {
                final String boxText = text.getText();
                final String string = event.text;
                try {
                    Integer.parseInt(boxText.concat(string));
                } catch (final NumberFormatException exc) {
                    event.doit = false;
                }
            }
        });
        text.addModifyListener(modifyListener);
        return text;
    }

    private void initGUI() {

        GridData data;
        Label label;

        setLayout(new GridLayout());
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        data.grabExcessVerticalSpace = true;
        setLayoutData(data);

        {
            data = new GridData(SWT.TOP, SWT.LEFT, true, true);
            data.horizontalAlignment = GridData.FILL;
            data.verticalAlignment = GridData.FILL;

            groupDefaultRange = new Group(this, SWT.NONE);
            groupDefaultRange.setLayoutData(data);
            groupDefaultRange.setLayout(new GridLayout(4, false));
            groupDefaultRange.setText("Default range");

            {
                // elements of group "default range"
                {
                    // first line
                    label = new Label(groupDefaultRange, SWT.NONE);
                    label.setText("Line width");

                    data = new GridData();
                    data.widthHint = 40;
                    data.horizontalSpan = 3;

                    defaultLineWidth = new Text(groupDefaultRange, SWT.BORDER);
                    defaultLineWidth.setLayoutData(data);

                }
                {
                    // second line
                    label = new Label(groupDefaultRange, SWT.NONE);
                    label.setText("Line color");

                    data = new GridData();
                    data.widthHint = 40;

                    defaultRangeForegroundColor = new CLabel(groupDefaultRange, SWT.BORDER);
                    defaultRangeForegroundColor.setLayoutData(data);

                    data = new GridData();
                    data.horizontalSpan = 2;

                    buttonForegroundColor = new Button(groupDefaultRange, SWT.PUSH | SWT.CENTER);
                    buttonForegroundColor.setText("Change...");
                    buttonForegroundColor.setLayoutData(data);
                    buttonForegroundColor.addSelectionListener(new SelectionAdapter() {
                        @Override
                        public void widgetSelected(final SelectionEvent evt) {
                            final ColorDialog dlg = new ColorDialog(getShell());
                            dlg.setRGB(defaultRangeForegroundColor.getBackground().getRGB());
                            final RGB selectedColor = dlg.open();
                            if (selectedColor != null) {
                                defaultRangeForegroundColor.setBackground(new Color(getDisplay(), selectedColor));
                                page.markFormDirty();
                            }
                        }
                    });
                }
                {
                    // third line
                    label = new Label(groupDefaultRange, SWT.NONE);
                    label.setText("Background color");

                    data = new GridData();
                    data.widthHint = 40;

                    defaultRangeBackgroundColor = new CLabel(groupDefaultRange, SWT.BORDER);
                    defaultRangeBackgroundColor.setLayoutData(data);

                    data = new GridData();
                    data.horizontalSpan = 2;

                    buttonBackgroundColor = new Button(groupDefaultRange, SWT.PUSH | SWT.CENTER);
                    buttonBackgroundColor.setText("Change...");
                    buttonBackgroundColor.setLayoutData(data);
                    buttonBackgroundColor.addSelectionListener(new SelectionAdapter() {
                        @Override
                        public void widgetSelected(final SelectionEvent evt) {
                            final ColorDialog dlg = new ColorDialog(getShell());
                            dlg.setRGB(defaultRangeBackgroundColor.getBackground().getRGB());
                            final RGB selectedColor = dlg.open();
                            if (selectedColor != null) {
                                defaultRangeBackgroundColor.setBackground(new Color(getDisplay(), selectedColor));
                                page.markFormDirty();
                            }
                        }
                    });
                }
                {
                    // fourth line
                    label = new Label(groupDefaultRange, SWT.NONE);
                    label.setText("Background alpha transparency");

                    data = new GridData();
                    data.widthHint = 40;

                    defaultBackgroundAlphaTransparency = new Text(groupDefaultRange, SWT.BORDER);
                    defaultBackgroundAlphaTransparency.setLayoutData(data);

                    data = new GridData();
                    data.horizontalSpan = 2;
                    label = new Label(groupDefaultRange, SWT.NONE);
                    label.setText("[0 (transparent) - 255 (opaque)]");
                    label.setLayoutData(data);

                }
                {
                    // fifth line
                    label = new Label(groupDefaultRange, SWT.NONE);
                    label.setText("Type");

                    data = new GridData();
                    data.widthHint = 100;
                    data.horizontalSpan = 2;

                    defaultRangeType = new Combo(groupDefaultRange, SWT.DROP_DOWN | SWT.READ_ONLY);
                    defaultRangeType.setLayoutData(data);
                    defaultRangeType.add(RANGE_TYPE.Circle.toString());
                    defaultRangeType.add(RANGE_TYPE.Rectangle.toString());
                    defaultRangeType.add(RANGE_TYPE.Cone.toString());

                    data = new GridData();
                    // data.horizontalSpan = 2;
                    buttonOptions = new Button(groupDefaultRange, SWT.PUSH | SWT.CENTER);
                    buttonOptions.setText("Options...");
                    buttonOptions.setLayoutData(data);
                    buttonOptions.addSelectionListener(new SelectionAdapter() {
                        @Override
                        public void widgetSelected(final SelectionEvent e) {

                            final String selectedRangeType = defaultRangeType.getText();

                            final NodeSensorRange defaultRange = defaultConfigClone.getRange();
                            // defaultConfigWrapper.getConfig().getRange();
                            final NodeRangeDialog dialog = NodeRangeDialog.createDialog(getShell(),
                                    RANGE_TYPE.valueOf(selectedRangeType), defaultRange);

                            if (Window.OK == dialog.open()) {
                                // defaultConfigWrapper.getConfig().setRange(dialog.range);
                                defaultConfigClone.setRange(dialog.range);
                            }

                        }
                    });
                }
                // end of group "default range"
            }

            data = new GridData(SWT.TOP, SWT.LEFT, true, true);
            data.horizontalAlignment = GridData.FILL;
            data.verticalAlignment = GridData.FILL;

            groupPerNodeConfig = new Group(this, SWT.NONE);
            groupPerNodeConfig.setLayoutData(data);
            groupPerNodeConfig.setLayout(new GridLayout(2, false));
            groupPerNodeConfig.setText("Per Node Configuration");

            perNodeConfigurationComposite.addPerNodeConfigurationTable(groupPerNodeConfig);

        }

    }

    public NodeSensorRangePerNodeConfigurationComposite getPerNodeConfigurationComposite() {
        return perNodeConfigurationComposite;
    }

    private NodeSensorRangePerNodeConfigurationComposite perNodeConfigurationComposite = new NodeSensorRangePerNodeConfigurationComposite();

    private PropertyChangeListener dirtyListener = new PropertyChangeListener() {
        @Override
        public void propertyChange(final PropertyChangeEvent evt) {
            page.markFormDirty();
        }
    };

    private Config defaultConfigClone;

    public void setDatabinding(final DataBindingContext dbc, final NodeSensorRangeXMLConfig.Config config,
            final NodeSensorRangePreferencePage page) {

        this.page = page;
        defaultConfigClone = config.clone();
        defaultConfigClone.addPropertyChangeListener(dirtyListener);

        IObservableValue obsModel;
        ISWTObservableValue obsWidget;
        UpdateValueStrategy usTargetToModel;
        UpdateValueStrategy usModelToTarget;
        final Realm realm = dbc.getValidationRealm();

        {
            obsWidget = SWTObservables.observeText(defaultLineWidth, SWT.Modify);
            obsModel = BeansObservables.observeValue(realm, defaultConfigClone,
                    NodeSensorRangeXMLConfig.PROPERTYNAME_LINE_WIDTH);
            usTargetToModel = new UpdateValueStrategy(UpdateValueStrategy.POLICY_CONVERT);
            usTargetToModel.setAfterConvertValidator(new IntegerRangeValidator("Line Width", 1, Integer.MAX_VALUE));
            dbc.bindValue(obsWidget, obsModel, usTargetToModel, null);
        }
        {
            obsWidget = SWTObservables.observeSelection(defaultRangeType);
            obsModel = BeansObservables.observeValue(realm, defaultConfigClone,
                    NodeSensorRangeXMLConfig.PROPERTYNAME_RANGE_TYPE);
            usTargetToModel = new UpdateValueStrategy(UpdateValueStrategy.POLICY_CONVERT)
                    .setConverter(new NodeSensorRangeTypeConverter(String.class, Enum.class));
            dbc.bindValue(obsWidget, obsModel, usTargetToModel, null);
        }
        {
            obsWidget = SWTObservables.observeBackground(defaultRangeForegroundColor);
            obsModel = BeansObservables.observeValue(realm, defaultConfigClone,
                    NodeSensorRangeXMLConfig.PROPERTYNAME_COLOR_R_G_B);

            usTargetToModel = new UpdateValueStrategy(UpdateValueStrategy.POLICY_CONVERT);
            usTargetToModel.setConverter(new ColorToRGBConverter());
            usModelToTarget = new UpdateValueStrategy();
            usModelToTarget.setConverter(new RGBToColorConverter());
            dbc.bindValue(obsWidget, obsModel, usTargetToModel, usModelToTarget);
        }
        {
            obsWidget = SWTObservables.observeBackground(defaultRangeBackgroundColor);
            obsModel = BeansObservables.observeValue(realm, defaultConfigClone,
                    NodeSensorRangeXMLConfig.PROPERTYNAME_BACKGROUND_R_G_B);
            usTargetToModel = new UpdateValueStrategy(UpdateValueStrategy.POLICY_CONVERT);
            usTargetToModel.setConverter(new ColorToRGBConverter());
            usModelToTarget = new UpdateValueStrategy();
            usModelToTarget.setConverter(new RGBToColorConverter());
            dbc.bindValue(obsWidget, obsModel, usTargetToModel, usModelToTarget);
        }
        {
            obsWidget = SWTObservables.observeText(defaultBackgroundAlphaTransparency, SWT.Modify);
            obsModel = BeansObservables.observeValue(realm, defaultConfigClone,
                    NodeSensorRangeXMLConfig.PROPERTYNAME_BACKGROUND_ALPHA);
            usTargetToModel = new UpdateValueStrategy(UpdateValueStrategy.POLICY_CONVERT);
            usTargetToModel
                    .setAfterConvertValidator(new IntegerRangeValidator("Background Alpha Transparency", 0, 255));
            dbc.bindValue(obsWidget, obsModel, usTargetToModel, null);
        }

        perNodeConfigurationComposite.setDataBinding(dbc, page);

    }

    @Override
    public void dispose() {
        defaultConfigClone.removePropertyChangeListener(dirtyListener);
        super.dispose();
    }

    // --------------------------------------------------------------------------------
    /**
     * @return
     */
    public Config getDefaultConfig() {
        return defaultConfigClone;
    }
}