au.gov.ansto.bragg.nbi.ui.realtime.RealtimeDataViewer.java Source code

Java tutorial

Introduction

Here is the source code for au.gov.ansto.bragg.nbi.ui.realtime.RealtimeDataViewer.java

Source

/*******************************************************************************
 * Copyright (c) 2010 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: 
 *    Norman Xiong (nxi@Bragg Institute) - initial API and implementation
 ******************************************************************************/
package au.gov.ansto.bragg.nbi.ui.realtime;

import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.gumtree.data.ui.viewers.PlotViewer;
import org.gumtree.gumnix.sics.control.ServerStatus;
import org.gumtree.gumnix.sics.control.controllers.IComponentController;
import org.gumtree.gumnix.sics.core.SicsCore;
import org.gumtree.gumnix.sics.ui.util.DynamicControllerNode;
import org.gumtree.vis.dataset.XYTimeSeriesSet;
import org.gumtree.vis.interfaces.ITimePlot;

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

/**
 * @author nxi
 *
 */
public class RealtimeDataViewer extends Composite {

    private static final int DEFAULT_UPDATE_PERIOD = 2000;
    private int updatePeriod = DEFAULT_UPDATE_PERIOD;
    private IRealtimeResourceProvider resourceProvider;
    private FormToolkit formToolkit;
    private Combo resourceCombo;
    private Combo contentCombo;
    private Button addButton;
    private Button removeButton;
    private Text timeText;
    private ITimePlot timePlot;
    private Thread updateThread;
    private boolean isDisposed;
    private PlotViewer plotViewer;

    /**
     * @param parent
     * @param style
     */
    public RealtimeDataViewer(Composite parent, int style) {
        super(parent, style);
        isDisposed = false;
        GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(this);

        Composite controlComposite = getFormToolkit().createComposite(this);
        GridLayoutFactory.fillDefaults().margins(0, 4).numColumns(3).applyTo(controlComposite);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(controlComposite);

        Composite addResourceComposite = getFormToolkit().createComposite(controlComposite);
        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(addResourceComposite);
        GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.FILL).grab(true, false).applyTo(addResourceComposite);
        Composite removeResourceComposite = getFormToolkit().createComposite(controlComposite);
        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(removeResourceComposite);
        GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.FILL).grab(true, false)
                .applyTo(removeResourceComposite);
        Composite timeComposite = getFormToolkit().createComposite(controlComposite);
        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(timeComposite);
        GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.FILL).grab(true, false).applyTo(timeComposite);

        //      Label resourceLabel = getFormToolkit().createLabel(addResourceComposite, "Add");
        //      GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(resourceLabel);
        //      Label contentLabel = getFormToolkit().createLabel(removeResourceComposite, "Remove");
        //      GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(contentLabel);

        resourceCombo = new Combo(addResourceComposite, SWT.DROP_DOWN);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(resourceCombo);
        addButton = getFormToolkit().createButton(addResourceComposite, "", SWT.PUSH);
        GridDataFactory.swtDefaults().applyTo(addButton);
        addButton.setImage(
                Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/add_resource.gif").createImage());

        contentCombo = new Combo(removeResourceComposite, SWT.DROP_DOWN);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(contentCombo);
        removeButton = getFormToolkit().createButton(removeResourceComposite, "", SWT.PUSH);
        GridDataFactory.swtDefaults().applyTo(removeButton);
        removeButton.setImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/remove_resource.gif")
                .createImage());

        updateResourceCombo();

        timeText = getFormToolkit().createText(timeComposite, "2");
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(16, SWT.DEFAULT).indent(0, 2)
                .applyTo(timeText);
        Label timeUnits = getFormToolkit().createLabel(timeComposite, "s");
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).indent(0, 2).applyTo(timeUnits);
        timeText.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                String text = timeText.getText();
                try {
                    double value = Double.valueOf(text);
                    int time = (int) (value * 1000);
                    if (time < 500) {
                        time = 500;
                    }
                    setUpdatePeriod(time);
                } catch (Exception e2) {
                }
            }
        });
        //      Composite plotComposite = getFormToolkit().createComposite(parent);
        //      GridLayoutFactory.fillDefaults().applyTo(plotComposite);
        //      plotComposite = new PlotComposite(this, SWT.NONE);
        plotViewer = new PlotViewer(this, SWT.NONE);
        GridLayoutFactory.fillDefaults().margins(0, 0).applyTo(plotViewer);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(plotViewer);
        DropTarget dt = new DropTarget(plotViewer, DND.DROP_MOVE);
        dt.setTransfer(new Transfer[] { LocalSelectionTransfer.getTransfer() });
        dt.addDropListener(new DropTargetAdapter() {
            public void drop(DropTargetEvent event) {
                if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)) {
                    //                LocalSelectionTransfer.getTransfer().setSelection(treeViewer.getSelection());
                    ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
                    if (selection != null && selection instanceof IStructuredSelection) {
                        IStructuredSelection structures = (IStructuredSelection) selection;
                        for (Object struct : structures.toList()) {
                            if (struct instanceof DynamicControllerNode) {
                                IComponentController controller = ((DynamicControllerNode) struct).getController();
                                try {
                                    String deviceId = controller.getId();
                                    if (deviceId != null) {
                                        IRealtimeResource resource = resourceProvider.getResource(deviceId);
                                        if (resource == null) {
                                            resource = resourceProvider.getResource(controller.getPath());
                                        }
                                        if (resource != null && resource instanceof SicsRealtimeResource) {
                                            timePlot.addTimeSeriesSet(resource.getTimeSeriesSet());
                                            resourceProvider.addResourceToUpdateList(resource);
                                            timePlot.updatePlot();
                                            contentCombo.add(resource.getName());
                                            contentCombo.setData(resource.getName(), resource);
                                            contentCombo.update();
                                            contentCombo.getParent().getParent().layout(true, true);
                                        }
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                }
            }
        });
        plotViewer.setDataset(new XYTimeSeriesSet());
        timePlot = (ITimePlot) plotViewer.getPlot();
        timePlot.setAutoUpdate(false);
        addListeners();
    }

    private void addListeners() {
        addButton.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                Display.getDefault().asyncExec(new Runnable() {

                    @Override
                    public void run() {
                        IRealtimeResource resource = null;
                        try {
                            String name = resourceCombo.getItem(resourceCombo.getSelectionIndex());
                            resource = (IRealtimeResource) resourceCombo.getData(name);
                        } catch (Exception e) {
                        }
                        if (resource != null) {
                            addRealtimeResource(resource);
                        }
                    }
                });
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }
        });

        removeButton.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                Display.getDefault().asyncExec(new Runnable() {

                    @Override
                    public void run() {
                        IRealtimeResource resource = null;
                        try {
                            String name = contentCombo.getItem(contentCombo.getSelectionIndex());
                            resource = (IRealtimeResource) contentCombo.getData(name);
                        } catch (Exception e) {
                        }
                        if (resource != null) {
                            removeRealtimeResource(resource);
                        }
                    }
                });
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {

            }
        });

        addDisposeListener(new DisposeListener() {

            @Override
            public void widgetDisposed(DisposeEvent e) {
                dispose();
            }
        });
    }

    private void addRealtimeResource(IRealtimeResource resource) {
        String resourceName = resource.getName();
        String[] existingItems = contentCombo.getItems();
        for (String item : existingItems) {
            if (item.equals(resourceName)) {
                return;
            }
        }
        timePlot.addTimeSeriesSet(resource.getTimeSeriesSet());
        resourceProvider.addResourceToUpdateList(resource);
        timePlot.updatePlot();
        contentCombo.add(resourceName);
        contentCombo.setData(resourceName, resource);
        //      contentCombo.select(contentCombo.getItemCount() - 1);
    }

    private void removeRealtimeResource(IRealtimeResource resource) {
        timePlot.removeTimeSeriesSet(resource.getTimeSeriesSet());
        resourceProvider.removeResourceFromUpdateList(resource);
        timePlot.updatePlot();
        contentCombo.remove(resource.getName());
        contentCombo.setText("");
    }

    public void updateResourceCombo() {
        if (resourceCombo != null && !resourceCombo.isDisposed()) {
            resourceCombo.removeAll();
            if (resourceProvider == null) {
                return;
            }
            for (IRealtimeResource resource : resourceProvider.getResourceList()) {
                String resourceName = resource.getName();
                resourceCombo.add(resourceName);
                resourceCombo.setData(resourceName, resource);
            }
            resourceCombo.update();
            resourceCombo.getParent().getParent().layout(true, true);
        }
        //      contentCombo.redraw();
    }

    /**
     * @param resourceProvider the resourceProvider to set
     */
    public void setResourceProvider(IRealtimeResourceProvider resourceProvider) {
        this.resourceProvider = resourceProvider;
        //      Thread thread = new Thread(new Runnable(){
        //         
        //         @Override
        //         public void run() {
        //            LoopRunner.run(new ILoopExitCondition() {
        //               
        //               @Override
        //               public boolean getExitCondition() {
        //                  if (SicsCore.getDefaultProxy() != null && SicsCore.getDefaultProxy().isConnected() && SicsCore.getSicsController() != null){
        //                     try {
        //                        Thread.sleep(1000);
        //                     } catch (InterruptedException e) {
        //                     }
        //                     Display.getDefault().asyncExec(new Runnable() {
        //                        
        //                        @Override
        //                        public void run() {
        //                           updateResourceCombo();
        //                        }
        //                     });
        //                     startUpdateThread();
        //                     return true;
        //                  }
        //                  return isDisposed;
        //               }
        //            }, -1, 1000);
        //         }
        //         
        //      });
        //      thread.start();
    }

    public void startUpdateThread() {
        if (updateThread == null) {
            updateThread = new Thread(new Runnable() {

                @Override
                public void run() {

                    while (!isDisposed) {
                        if (resourceProvider != null) {
                            try {
                                if (SicsCore.getDefaultProxy() != null && SicsCore.getDefaultProxy().isConnected()
                                        && SicsCore.getSicsController() != null
                                        && SicsCore.getSicsController().getServerStatus() != ServerStatus.UNKNOWN) {
                                    resourceProvider.updateResource();
                                    timePlot.updatePlot();
                                    //                        ((ChartPanel) timePlot).chartChanged(null);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                        try {
                            Thread.sleep(updatePeriod);
                        } catch (InterruptedException e) {
                            break;
                        }
                    }
                }
            });
            updateThread.start();
        }
    }

    /**
     * @return the resourceProvider
     */
    public IRealtimeResourceProvider getResourceProvider() {
        return resourceProvider;
    }

    protected FormToolkit getFormToolkit() {
        if (formToolkit == null) {
            formToolkit = new FormToolkit(Display.getCurrent());
        }
        return formToolkit;
    }

    @Override
    public void dispose() {
        if (updateThread != null) {
            try {
                if (updateThread.isAlive()) {
                    updateThread.interrupt();
                }
            } catch (Exception ex) {
            }
            updateThread = null;
        }
        if (resourceProvider != null) {
            resourceProvider.clear();
            resourceProvider = null;
        }
        plotViewer.dispose();
        timePlot = null;
        resourceCombo = null;
        contentCombo = null;
        addButton = null;
        removeButton = null;
        formToolkit.dispose();
        isDisposed = true;
        super.dispose();
    }

    /**
     * @param updatePeriod the updatePeriod to set
     */
    public void setUpdatePeriod(int updatePeriod) {
        this.updatePeriod = updatePeriod;
    }

    @Override
    public boolean isDisposed() {
        return super.isDisposed() || isDisposed;
    }
}