com.planetmayo.debrief.satc_rcp.views.TrackStatesView.java Source code

Java tutorial

Introduction

Here is the source code for com.planetmayo.debrief.satc_rcp.views.TrackStatesView.java

Source

/*
 *    Debrief - the Open Source Maritime Analysis Application
 *    http://debrief.info
 *
 *    (C) 2000-2014, PlanetMayo Ltd
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the Eclipse Public License v1.0
 *    (http://www.eclipse.org/legal/epl-v10.html)
 *
 *    This library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 */
package com.planetmayo.debrief.satc_rcp.views;

import java.text.SimpleDateFormat;
import java.util.Collection;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.part.ViewPart;

import com.planetmayo.debrief.satc.model.generator.IBoundsManager;
import com.planetmayo.debrief.satc.model.generator.IConstrainSpaceListener;
import com.planetmayo.debrief.satc.model.generator.ISolver;
import com.planetmayo.debrief.satc.model.manager.ISolversManager;
import com.planetmayo.debrief.satc.model.manager.ISolversManagerListener;
import com.planetmayo.debrief.satc.model.states.BaseRange.IncompatibleStateException;
import com.planetmayo.debrief.satc.model.states.BoundedState;
import com.planetmayo.debrief.satc.model.states.CourseRange;
import com.planetmayo.debrief.satc.model.states.LocationRange;
import com.planetmayo.debrief.satc.model.states.SpeedRange;
import com.planetmayo.debrief.satc.util.GeoSupport;
import com.planetmayo.debrief.satc_rcp.SATC_Activator;
import com.planetmayo.debrief.satc_rcp.ui.UIListener;
import com.vividsolutions.jts.geom.Geometry;

/**
 * view that monitors the current set of bounded states
 * 
 * @author ian
 * 
 */
public class TrackStatesView extends ViewPart implements IConstrainSpaceListener {

    class NameSorter extends ViewerSorter {
    }

    class ViewContentProvider implements IStructuredContentProvider {
        private Collection<BoundedState> _myData;

        @Override
        public void dispose() {
        }

        @Override
        public Object[] getElements(Object parent) {
            Object[] res;
            if ((_myData != null) && (!_myData.isEmpty())) {
                // try getting it as a set
                res = _myData.toArray();
            } else
                res = null;
            return res;
        }

        @SuppressWarnings("unchecked")
        @Override
        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
            _myData = (Collection<BoundedState>) newInput;
        }

    }

    class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {

        @Override
        public Image getColumnImage(Object obj, int index) {
            return getImage(obj);
        }

        @Override
        public String getColumnText(Object obj, int index) {
            BoundedState bs = (BoundedState) obj;
            return bs.getTime().toString();
            // return getText(obj);
        }

        @Override
        public Image getImage(Object obj) {
            return null;
            // return PlatformUI.getWorkbench().getSharedImages()
            // .getImage(ISharedImages.IMG_OBJ_ELEMENT);
        }
    }

    /**
     * The ID of the view as specified by the extension.
     */
    public static final String ID = "com.planetmayo.debrief.satc.views.TrackStatesView";

    private ISolversManager _solversManager;
    private ISolver _activeSolver;

    private TableViewer viewer;
    private SimpleDateFormat _df = new SimpleDateFormat("MMM/dd HH:mm:ss");

    private IConstrainSpaceListener constrainSpaceListener;
    private ISolversManagerListener solversManagerListener;
    /**
     * let user indicate whether we wish to display intermediate bounded states
     * 
     */
    private Action _debugMode;
    private Action _testSolverAction;
    private Action _testSetActive;

    private ISolver _testSolver;

    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
    }

    /**
     * This is a callback that will allow us to create the viewer and initialize
     * it.
     */
    @Override
    public void createPartControl(Composite parent) {
        _solversManager = SATC_Activator.getDefault().getService(ISolversManager.class, true);

        viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        viewer.setContentProvider(new ViewContentProvider());
        viewer.setLabelProvider(new ViewLabelProvider());
        viewer.setSorter(new NameSorter());
        viewer.setInput(null);
        viewer.getTable().setHeaderVisible(true);
        viewer.setSorter(new ViewerSorter() {

            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                BoundedState c1 = (BoundedState) e1;
                BoundedState c2 = (BoundedState) e2;
                return c1.compareTo(c2);
            }
        });

        // ok, sort out the columns
        TableViewerColumn col1 = new TableViewerColumn(viewer, SWT.NONE);
        col1.getColumn().setText("Time");
        col1.getColumn().setWidth(200);
        col1.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                BoundedState bs = (BoundedState) element;
                // return bs.getTime().toString();
                return _df.format(bs.getTime());
            }
        });

        // ok, sort out the columns
        TableViewerColumn col2 = new TableViewerColumn(viewer, SWT.NONE);
        col2.getColumn().setText("Location");
        col2.getColumn().setWidth(100);
        col2.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                String res;
                BoundedState bs = (BoundedState) element;
                LocationRange loc = bs.getLocation();
                if (loc != null) {
                    Geometry myArea = loc.getGeometry();
                    Geometry theBoundary = myArea.convexHull();
                    double theArea = theBoundary.getArea();
                    res = myArea.getCoordinates().length + "pts " + (int) (theArea * 100000);
                } else
                    res = "n/a";

                return res;
            }
        });

        // ok, sort out the columns
        TableViewerColumn col3 = new TableViewerColumn(viewer, SWT.NONE);
        col3.getColumn().setText("Speed");
        col3.getColumn().setWidth(100);
        col3.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                String res;
                BoundedState bs = (BoundedState) element;
                SpeedRange range = bs.getSpeed();
                if (range != null)
                    res = (int) GeoSupport.MSec2kts(range.getMin()) + " - "
                            + (int) GeoSupport.MSec2kts(range.getMax());
                else
                    res = "n/a";

                return res;
            }
        });

        // ok, sort out the columns
        TableViewerColumn col4 = new TableViewerColumn(viewer, SWT.NONE);
        col4.getColumn().setText("Course");
        col4.getColumn().setWidth(100);
        col4.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                String res;
                BoundedState bs = (BoundedState) element;
                CourseRange range = bs.getCourse();
                if (range != null)
                    res = (int) Math.toDegrees(range.getMin()) + " - " + (int) Math.toDegrees(range.getMax());
                else
                    res = "n/a";

                return res;
            }
        });

        TableViewerColumn col5 = new TableViewerColumn(viewer, SWT.NONE);
        col5.getColumn().setText("Leg");
        col5.getColumn().setWidth(100);
        col5.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                String res;
                BoundedState bs = (BoundedState) element;
                String leg = bs.getMemberOf();
                if (leg != null)
                    res = leg;
                else
                    res = " ";

                return res;
            }
        });

        makeActions();
        contributeToActionBars();

        initListeners(parent.getDisplay());
        _solversManager.addSolversManagerListener(solversManagerListener);
        setActiveSolver(_solversManager.getActiveSolver());
    }

    private void initListeners(Display display) {
        solversManagerListener = new ISolversManagerListener() {

            @Override
            public void solverCreated(ISolver solver) {
            }

            @Override
            public void activeSolverChanged(ISolver activeSolver) {
                setActiveSolver(activeSolver);
            }
        };
        solversManagerListener = UIListener.wrap(display, ISolversManagerListener.class, solversManagerListener);
        constrainSpaceListener = UIListener.wrap(display, IConstrainSpaceListener.class, this);
    }

    @Override
    public void dispose() {
        _solversManager.removeSolverManagerListener(solversManagerListener);
        if (_activeSolver != null) {
            _activeSolver.getBoundsManager().removeConstrainSpaceListener(constrainSpaceListener);
        }
        super.dispose();
    }

    private void setActiveSolver(ISolver solver) {
        if (_activeSolver != null) {
            _activeSolver.getBoundsManager().removeConstrainSpaceListener(constrainSpaceListener);
        }
        viewer.setInput(null);
        _activeSolver = solver;
        if (_activeSolver != null) {
            _activeSolver.getBoundsManager().addConstrainSpaceListener(constrainSpaceListener);
        }
    }

    @Override
    public void statesBounded(IBoundsManager boundsManager) {
        viewer.setInput(_activeSolver.getProblemSpace().states());
    }

    @Override
    public void restarted(IBoundsManager boundsManager) {
        viewer.setInput(null);
    }

    @Override
    public void error(IBoundsManager boundsManager, IncompatibleStateException ex) {
        // TODO: switch UI to be a composite view, with a label above the table.
        // the label is normally hidden , and shown when
        // when we get incompatible states. Show the message in that label, and
        // disable the table

        viewer.setInput(null);
        //
        // MessageDialog.openInformation(Display.getDefault().getActiveShell(),
        // "Bounding states", "Incompatible states found");
    }

    @Override
    public void stepped(IBoundsManager boundsManager, int thisStep, int totalSteps) {
        if (_debugMode.isChecked()) {
            viewer.setInput(_activeSolver.getProblemSpace().states());
        }
    }

    private void fillLocalPullDown(IMenuManager manager) {
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(_testSetActive);
        manager.add(_testSolverAction);
        manager.add(_debugMode);
    }

    private void makeActions() {
        _debugMode = new Action("Debug Mode", SWT.TOGGLE) {
        };
        _debugMode.setText("Debug Mode");
        _debugMode.setChecked(false);
        _debugMode.setToolTipText("Track all states (including application of each Contribution)");
        _testSetActive = new Action("Set active") {

            @Override
            public void run() {
                _solversManager.setActiveSolver(_testSolver);
            }
        };
        _testSetActive.setEnabled(false);
        _testSolverAction = new Action("Create Test solver") {
            @Override
            public void run() {
                _testSolver = _solversManager.createSolver("Test solver from another view");
                _testSetActive.setEnabled(true);
            }
        };
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    @Override
    public void setFocus() {
        viewer.getControl().setFocus();
    }

}