au.gov.ansto.bragg.nbi.ui.widgets.HMControlWidget.java Source code

Java tutorial

Introduction

Here is the source code for au.gov.ansto.bragg.nbi.ui.widgets.HMControlWidget.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 au.gov.ansto.bragg.nbi.ui.widgets;

import java.net.URI;
import java.util.LinkedHashMap;
import java.util.Map;

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.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.gumtree.core.service.ServiceUtils;
import org.gumtree.gumnix.sics.control.ControllerStatus;
import org.gumtree.gumnix.sics.control.controllers.CommandStatus;
import org.gumtree.gumnix.sics.control.controllers.ComponentData;
import org.gumtree.gumnix.sics.control.controllers.ICommandController;
import org.gumtree.gumnix.sics.control.events.SicsControllerEvent;
import org.gumtree.gumnix.sics.core.SicsCore;
import org.gumtree.gumnix.sics.io.ISicsProxyListener;
import org.gumtree.gumnix.sics.io.SicsIOException;
import org.gumtree.gumnix.sics.io.SicsProxyListenerAdapter;
import org.gumtree.service.dataaccess.IDataAccessManager;
import org.gumtree.service.eventbus.IFilteredEventHandler;
import org.gumtree.ui.util.SafeUIRunner;
import org.gumtree.ui.util.forms.FormControlWidget;
import org.gumtree.util.PlatformUtils;
import org.gumtree.widgets.swt.util.UIResources;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import au.gov.ansto.bragg.nbi.ui.internal.InternalImage;

public class HMControlWidget extends FormControlWidget {

    private static final Logger logger = LoggerFactory.getLogger(HMControlWidget.class);

    private static final String PATH_HISTMEM = "/commands/histogram/histmem";

    private ISicsProxyListener proxyListener;

    private IDataAccessManager dam;

    private IFilteredEventHandler<SicsControllerEvent> eventHandler;

    private ICommandController commandController;

    private Map<URI, Object> controlMap;

    public HMControlWidget(Composite parent, int style) {
        super(parent, style);
        init();
    }

    private void bindProxy() {
        // Get command controller
        Job job = new Job("Get command controller") {
            protected IStatus run(IProgressMonitor monitor) {
                // Check if SICS is ready
                if (SicsCore.getSicsController() == null) {
                    schedule(500);
                    return Status.OK_STATUS;
                }
                // Get controller
                commandController = (ICommandController) SicsCore.getSicsController()
                        .findComponentController(PATH_HISTMEM);
                // Create UI
                SafeUIRunner.asyncExec(new SafeRunnable() {
                    public void run() throws Exception {
                        createUI();
                    }
                });
                return Status.OK_STATUS;
            }
        };
        job.schedule();
    }

    private void unbindProxy() {
        commandController = null;
        // Disable UI
        SafeUIRunner.asyncExec(new SafeRunnable() {
            public void run() throws Exception {
                HMControlWidget.this.setEnabled(false);
            }
        });
    }

    protected void init() {
        /*********************************************************************
         * Initialise
         *********************************************************************/
        controlMap = new LinkedHashMap<URI, Object>();

        /*********************************************************************
         * Setup data access manager
         *********************************************************************/
        dam = ServiceUtils.getService(IDataAccessManager.class);

        /*********************************************************************
         * Setup event handler
         *********************************************************************/
        eventHandler = new IFilteredEventHandler<SicsControllerEvent>() {
            public void handleEvent(SicsControllerEvent event) {
                Class<?> representation = String.class;
                if ("status".equals(event.getURI().getQuery())) {
                    representation = ControllerStatus.class;
                }
                updateData(event.getURI(), dam.get(event.getURI(), representation));
            }

            public boolean isDispatchable(SicsControllerEvent event) {
                return controlMap.containsKey(event.getURI());
            }
        };
        PlatformUtils.getPlatformEventBus().subscribe(eventHandler);

        /*********************************************************************
         * Setup SICS
         *********************************************************************/
        // Connect now
        if (SicsCore.getDefaultProxy().isConnected()) {
            bindProxy();
        }

        // Setup to handle dynamic connection
        proxyListener = new SicsProxyListenerAdapter() {
            public void proxyConnected() {
                bindProxy();
            }

            public void proxyDisconnected() {
                unbindProxy();
            }
        };
        SicsCore.getDefaultProxy().addProxyListener(proxyListener);
    }

    private void createUI() {
        /*********************************************************************
         * Initialise
         *********************************************************************/
        for (Control child : this.getChildren()) {
            child.dispose();
        }
        setEnabled(true);
        controlMap.clear();

        /*********************************************************************
         * Setup UI
         *********************************************************************/
        GridLayoutFactory.swtDefaults().numColumns(4).applyTo(this);

        Label label = getToolkit().createLabel(this, "Mode");
        label.setFont(UIResources.getDefaultFont(SWT.BOLD));
        GridDataFactory.swtDefaults().hint(45, SWT.DEFAULT).applyTo(label);

        label = getToolkit().createLabel(this, "Preset");
        label.setFont(UIResources.getDefaultFont(SWT.BOLD));
        GridDataFactory.swtDefaults().hint(45, SWT.DEFAULT).applyTo(label);

        final Button controlButton = getToolkit().createButton(this, "", SWT.PUSH);
        controlButton.setImage(InternalImage.START_32.getImage());
        GridDataFactory.swtDefaults().span(1, 2).applyTo(controlButton);
        controlMap.put(URI.create("sics://hdb" + PATH_HISTMEM + "/feedback/status"), controlButton);

        Button pauseButton = getToolkit().createButton(this, "", SWT.PUSH);
        pauseButton.setImage(InternalImage.PAUSE_32.getImage());
        GridDataFactory.swtDefaults().span(1, 2).applyTo(pauseButton);

        final ComboViewer comboViewer = new ComboViewer(this);
        comboViewer.setContentProvider(new ArrayContentProvider());
        comboViewer.setLabelProvider(new LabelProvider());
        URI availableModeURI = URI.create("sics://hdb" + PATH_HISTMEM + "/mode?values");
        String[] availableModes = dam.get(availableModeURI, String.class).split(",");
        for (int i = 0; i < availableModes.length; i++) {
            availableModes[i] = availableModes[i].trim();
        }
        comboViewer.setInput(availableModes);
        GridDataFactory.swtDefaults().hint(45, SWT.DEFAULT).applyTo(comboViewer.getControl());
        controlMap.put(URI.create("sics://hdb" + PATH_HISTMEM + "/mode"), comboViewer);

        final Text presetText = getToolkit().createText(this, "");
        GridDataFactory.swtDefaults().hint(45, SWT.DEFAULT).applyTo(presetText);
        controlMap.put(URI.create("sics://hdb" + PATH_HISTMEM + "/preset"), presetText);

        /*********************************************************************
         * Button logics
         *********************************************************************/
        controlButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                try {
                    if (controlButton.getData("status") != null && controlButton.getData("status").equals("idle")) {
                        SicsCore.getSicsController().setValue(PATH_HISTMEM + "/cmd",
                                ComponentData.createData("start"));
                        SicsCore.getSicsController().setValue(PATH_HISTMEM + "/preset",
                                ComponentData.createData(presetText.getText()));
                        SicsCore.getSicsController().setValue(PATH_HISTMEM + "/mode", ComponentData.createData(
                                (String) ((StructuredSelection) comboViewer.getSelection()).getFirstElement()));
                        commandController.asyncExecute();
                    } else {
                        SicsCore.getSicsController().setValue(PATH_HISTMEM + "/cmd",
                                ComponentData.createData("stop"));
                        commandController.asyncExecute();
                    }
                } catch (SicsIOException e) {
                    logger.error("Failed to pause.", e);
                }

            }
        });

        pauseButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                if (commandController != null) {
                    try {
                        SicsCore.getSicsController().setValue(PATH_HISTMEM + "/cmd",
                                ComponentData.createData("pause"));
                        commandController.asyncExecute();
                    } catch (SicsIOException e) {
                        logger.error("Failed to pause.", e);
                    }
                }
            }
        });

        /*********************************************************************
         * Update content
         *********************************************************************/
        for (URI uri : controlMap.keySet()) {
            updateData(controlMap.get(uri), dam.get(uri, String.class));
        }

        /*********************************************************************
         * Layout
         *********************************************************************/
        this.layout(true, true);
    }

    private void updateData(final Object control, final Object data) {
        SafeUIRunner.asyncExec(new SafeRunnable() {
            public void run() throws Exception {
                if (control instanceof ComboViewer) {
                    // Update Mode
                    ((ComboViewer) control).setSelection(new StructuredSelection(data));
                } else if (control instanceof Text) {
                    // Update preset
                    ((Text) control).setText(data.toString());
                } else if (control instanceof Button) {
                    // Command status
                    if (CommandStatus.valueOf((String) data).equals(CommandStatus.IDLE)) {
                        ((Button) control).setImage(InternalImage.START_32.getImage());
                        ((Button) control).setData("status", "idle");
                    } else {
                        ((Button) control).setImage(InternalImage.STOP_32.getImage());
                        ((Button) control).setData("status", "running");
                    }
                }
            }
        });
    }

    protected void widgetDispose() {
        if (proxyListener != null) {
            SicsCore.getDefaultProxy().removeProxyListener(proxyListener);
            proxyListener = null;
        }
        if (eventHandler != null) {
            PlatformUtils.getPlatformEventBus().unsubscribe(eventHandler);
            eventHandler = null;
        }
        if (controlMap != null) {
            controlMap.clear();
            controlMap = null;
        }
        dam = null;
        commandController = null;
    }

    public void afterParametersSet() {
    }

}