org.gumtree.gumnix.sics.ui.widgets.SynopticsStatusWidget.java Source code

Java tutorial

Introduction

Here is the source code for org.gumtree.gumnix.sics.ui.widgets.SynopticsStatusWidget.java

Source

/*******************************************************************************
 * Copyright (c) 2007 Australian Nuclear Science and Technology Organisation.
 * 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:
 *     Tony Lam (Bragg Institute) - initial API and implementation
 *******************************************************************************/

package org.gumtree.gumnix.sics.ui.widgets;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
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.gumtree.gumnix.sics.control.ControllerStatus;
import org.gumtree.service.dataaccess.IDataHandler;
import org.gumtree.ui.util.SafeUIRunner;

public class SynopticsStatusWidget extends AbstractSicsDeviceWidget {

    private static final String PROP_DATA = "data";

    private static final String PROP_UNIT = "unit";

    private static final String PROP_LABEL = "label";

    private String imageURI;

    private Image backgroundImage;

    private List<String> labelList = new ArrayList<String>();

    private List<Integer> xCoordinateList = new ArrayList<Integer>();

    private List<Integer> yCoordinateList = new ArrayList<Integer>();

    public SynopticsStatusWidget(Composite parent, int style) {
        super(parent, style);
        // TODO Auto-generated constructor stub
    }

    protected void widgetDispose() {
        imageURI = null;
        if (backgroundImage != null) {
            backgroundImage.dispose();
            backgroundImage = null;
        }
        if (labelList != null) {
            labelList.clear();
            labelList = null;
        }
        if (xCoordinateList != null) {
            xCoordinateList.clear();
            xCoordinateList = null;
        }
        if (yCoordinateList != null) {
            yCoordinateList.clear();
            yCoordinateList = null;
        }
        super.widgetDispose();
    }

    protected void initialise() {
    }

    protected void createUI() {
        /*********************************************************************
         * Initialise
         *********************************************************************/
        for (Control child : this.getChildren()) {
            child.dispose();
        }
        setLayout(new FormLayout());
        /*********************************************************************
         * Devices
         *********************************************************************/
        for (int i = 0; i < deviceURIs.size(); i++) {
            Label label = getToolkit().createLabel(this, "");
            label.setData(PROP_LABEL, labelList.get(i));
            label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
            FormData formData = new FormData();
            formData.left = new FormAttachment(xCoordinateList.get(i), 0);
            formData.top = new FormAttachment(yCoordinateList.get(i), 0);
            label.setLayoutData(formData);

            // Register control
            uriMap.put(deviceURIs.get(i), label);
            URI nameURI = URI.create(deviceURIs.get(i).toString() + "?sicsdev");
            uriMap.put(nameURI, label);
            URI unitURI = URI.create(deviceURIs.get(i).toString() + "?units");
            uriMap.put(unitURI, label);
            URI statusURI = URI.create(deviceURIs.get(i).toString() + "?status");
            uriMap.put(statusURI, label);

            // Fetch initial value
            getDataAccessManager().get(nameURI, String.class, new DataHandler<String>());
            getDataAccessManager().get(unitURI, String.class, new DataHandler<String>());
            getDataAccessManager().get(statusURI, ControllerStatus.class, new DataHandler<ControllerStatus>());
            getDataAccessManager().get(deviceURIs.get(i), String.class, new DataHandler<String>());
        }
        /*********************************************************************
         * Background
         *********************************************************************/
        Label imageLabel = getToolkit().createLabel(this, "");
        if (backgroundImage != null) {
            backgroundImage.dispose();
        }
        backgroundImage = getDataAccessManager().get(URI.create(imageURI), Image.class);
        imageLabel.setImage(backgroundImage);
        FormData formData = new FormData();
        formData.left = new FormAttachment(0, 0);
        formData.top = new FormAttachment(0, 0);
        imageLabel.setLayoutData(formData);
        /*********************************************************************
         * Final preparation
         *********************************************************************/
        setEnabled(true);
        getParent().getParent().layout(true, true);
    }

    protected void updateWidgetData(URI uri, Object widget, Object data) {
        Control control = (Control) widget;
        /*********************************************************************
         * Handle status
         *********************************************************************/
        if (uri.toString().endsWith("status")) {
            ControllerStatus status = (ControllerStatus) data;
            if (status.equals(ControllerStatus.OK)) {
                control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
                control.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
            } else if (status.equals(ControllerStatus.RUNNING)) {
                control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GREEN));
                control.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
            } else if (status.equals(ControllerStatus.ERROR)) {
                control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_RED));
                control.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
            }
            return;
        }

        /*********************************************************************
         * Store data
         *********************************************************************/
        if (uri.toString().endsWith("sicsdev")
                && (control.getData(PROP_LABEL) == null || ((String) control.getData(PROP_LABEL)).length() == 0)) {
            control.setData(PROP_LABEL, data);
        } else if (uri.toString().endsWith("units")) {
            control.setData(PROP_UNIT, data);
        } else {
            control.setData(PROP_DATA, data);
        }

        /*********************************************************************
         * Reconstruct data
         *********************************************************************/
        StringBuilder builder = new StringBuilder();
        if (control.getData(PROP_LABEL) != null) {
            builder.append(control.getData(PROP_LABEL));
            builder.append(": ");
        }
        if (control.getData(PROP_DATA) != null) {
            builder.append(control.getData(PROP_DATA));
        }
        if (control.getData(PROP_UNIT) != null) {
            builder.append(" ");
            builder.append(control.getData(PROP_UNIT));
        }

        /*********************************************************************
         * Display data
         *********************************************************************/
        if (control instanceof Label) {
            ((Label) control).setText(builder.toString());
            layout(true, true);
        }
    }

    /*************************************************************************
     * Getters and setters
     *************************************************************************/

    public void setImageURI(String imageURI) {
        this.imageURI = imageURI;
    }

    public void setLabels(String labels) {
        String[] labelTokens = labels.split(",");
        labelList = new ArrayList<String>();
        for (String label : labelTokens) {
            labelList.add(label.trim());
        }
    }

    public void setxCoordinates(String xCoordinates) {
        String[] xCoordinateTokens = xCoordinates.split(",");
        xCoordinateList = new ArrayList<Integer>();
        for (String xCoordinate : xCoordinateTokens) {
            xCoordinate = xCoordinate.trim();
            if (xCoordinate.length() == 0) {
                xCoordinateList.add(0);
            } else {
                xCoordinateList.add(Integer.parseInt(xCoordinate.trim()));
            }
        }
    }

    public void setyCoordinates(String yCoordinates) {
        String[] yCoordinateTokens = yCoordinates.split(",");
        yCoordinateList = new ArrayList<Integer>();
        for (String yCoordinate : yCoordinateTokens) {
            yCoordinate = yCoordinate.trim();
            if (yCoordinate.length() == 0) {
                yCoordinateList.add(0);
            } else {
                yCoordinateList.add(Integer.parseInt(yCoordinate.trim()));
            }
        }
    }

    /*************************************************************************
     * Internal classes
     *************************************************************************/

    private class DataHandler<T> implements IDataHandler<T> {
        public void handleData(final URI uri, final T data) {
            SafeUIRunner.asyncExec(new SafeRunnable() {
                public void run() throws Exception {
                    if (isDisposed()) {
                        return;
                    }
                    updateWidgetData(uri, uriMap.get(uri), data);
                }
            });
        }

        public void handleError(URI uri, Exception exception) {
        }
    }

}