org.eclipse.stem.ui.views.SimulationControlView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.stem.ui.views.SimulationControlView.java

Source

package org.eclipse.stem.ui.views;

/*******************************************************************************
 * Copyright (c) 2006 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.stem.jobs.simulation.ISimulation;
import org.eclipse.stem.jobs.simulation.ISimulationManagerListener;
import org.eclipse.stem.jobs.simulation.SimulationManager;
import org.eclipse.stem.jobs.simulation.SimulationManagerEvent;
import org.eclipse.stem.ui.Activator;
import org.eclipse.stem.ui.ISharedImages;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.part.ViewPart;

/**
 * This class implements an eclipse view that displays the state of the
 * currently active simulations and GUI controls that allow the simulations to
 * be managed.
 * 
 */
public class SimulationControlView extends ViewPart implements ISimulationManagerListener {

    /**
     * Our reference to the simulation manager
     */
    private SimulationManager simulationManager = null;

    /**
     * The collection of simulation controls
     */
    private List<SimulationControl> controlList = new ArrayList<SimulationControl>();

    /**
     * The identifier of the Simulation Control View
     */
    public static final String ID_SIMULATION_CONTROL_VIEW = "org.eclipse.stem.ui.views.simulationcontrolview"; //$NON-NLS-1$

    // The scrolled composite -- allows control composite to scroll
    private ScrolledComposite scrollComposite = null;

    // The control composite -- holds the controls
    private Composite controlComposite = null;

    // Actions for master simulation control
    Action runAction, resetAction, pauseAction, stepAction, stopAction;

    // Used by a part to access its menu, tool bar, and status line managers.
    IActionBars actionBars = null;

    // Menu manager for this view
    IMenuManager dropDownMenu = null;

    // Tool bar manager for this view
    IToolBarManager toolBar = null;

    // Some constants we need to set preferred sizes of SWT controls
    private static final int SCROLL_MIN_LENGTH = 100;

    private static final int SCROLL_MIN_HEIGTH = 1600;

    /**
     * Constructor
     * 
     */
    public SimulationControlView() {
        super();
        // Set our reference to the simulation manager
        simulationManager = SimulationManager.getManager();
        simulationManager.addSimulationManagerListener(this);
    }

    /**
     * This is the method where the view is put together piece by piece
     * 
     * @param parent
     */
    @Override
    public void createPartControl(Composite parent) {

        final int COLUMNS = 1;

        scrollComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.BORDER);
        scrollComposite.setExpandHorizontal(true);
        scrollComposite.setExpandVertical(true);
        scrollComposite.setMinSize(SCROLL_MIN_LENGTH, SCROLL_MIN_HEIGTH);
        scrollComposite.setLayout(new GridLayout());
        controlComposite = new Composite(scrollComposite, SWT.NONE);
        scrollComposite.setContent(controlComposite);
        // setup the layout
        GridData data = new GridData(GridData.FILL_BOTH);
        controlComposite.setLayoutData(data);
        GridLayout layout = new GridLayout();
        layout.numColumns = COLUMNS;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        controlComposite.setLayout(layout);

        // Create the actions for master simulation control
        runAction = new Action(Messages.getString("SCView.Run"), ImageDescriptor.createFromImage(Activator //$NON-NLS-1$
                .getDefault().getImageRegistry().get(ISharedImages.RUN_ICON))) {
            public void run() {
                masterRunAction();
            }
        };

        pauseAction = new Action(Messages.getString("SCView.Pause"), ImageDescriptor //$NON-NLS-1$
                .createFromImage(Activator.getDefault().getImageRegistry().get(ISharedImages.PAUSE_ICON))) {
            public void run() {
                masterPauseAction();
            }
        };

        resetAction = new Action(Messages.getString("SCView.Reset"), ImageDescriptor //$NON-NLS-1$
                .createFromImage(Activator.getDefault().getImageRegistry().get(ISharedImages.RESET_ICON))) {
            public void run() {
                masterResetAction();
            }
        };

        stepAction = new Action(Messages.getString("SCView.Step"), ImageDescriptor //$NON-NLS-1$
                .createFromImage(Activator.getDefault().getImageRegistry().get(ISharedImages.STEP_ICON))) {
            public void run() {
                masterStepAction();
            }
        };

        stopAction = new Action(Messages.getString("SCView.Stop"), ImageDescriptor //$NON-NLS-1$
                .createFromImage(Activator.getDefault().getImageRegistry().get(ISharedImages.STOP_ICON))) {
            public void run() {
                masterStopAction();
            }
        };

        // Set disabled icons for our master control

        runAction.setDisabledImageDescriptor(ImageDescriptor
                .createFromImage(Activator.getDefault().getImageRegistry().get(ISharedImages.DISABLED_RUN_ICON)));

        pauseAction.setDisabledImageDescriptor(ImageDescriptor
                .createFromImage(Activator.getDefault().getImageRegistry().get(ISharedImages.DISABLED_PAUSE_ICON)));

        resetAction.setDisabledImageDescriptor(ImageDescriptor
                .createFromImage(Activator.getDefault().getImageRegistry().get(ISharedImages.DISABLED_RESET_ICON)));

        stepAction.setDisabledImageDescriptor(ImageDescriptor
                .createFromImage(Activator.getDefault().getImageRegistry().get(ISharedImages.DISABLED_STEP_ICON)));

        stopAction.setDisabledImageDescriptor(ImageDescriptor
                .createFromImage(Activator.getDefault().getImageRegistry().get(ISharedImages.DISABLED_STOP_ICON)));

        // Initial state if master control should be DISABLED
        runAction.setEnabled(false);
        pauseAction.setEnabled(false);
        resetAction.setEnabled(false);
        stepAction.setEnabled(false);
        stopAction.setEnabled(false);

        // get the action manager for this view
        actionBars = getViewSite().getActionBars();

        // get the drop down menu manager for this view
        dropDownMenu = actionBars.getMenuManager();

        // get the tool bar manager for this view
        toolBar = actionBars.getToolBarManager();

        // Add all actions to drop down menu on the right corner of this view
        dropDownMenu.add(runAction);
        dropDownMenu.add(pauseAction);
        dropDownMenu.add(resetAction);
        dropDownMenu.add(stepAction);
        dropDownMenu.add(stopAction);

        // Add all actions to the tool bar of this view
        toolBar.add(runAction);
        toolBar.add(pauseAction);
        toolBar.add(resetAction);
        toolBar.add(stepAction);
        toolBar.add(stopAction);

        // if any active Simulations, use them
        List<ISimulation> list = simulationManager.getActiveSimulations();

        for (ISimulation sim : list) {
            addSimulation(sim);
        }
    }

    /**
     * Enable use of master control for active simulations
     * 
     * @param enabled
     */
    protected void enableMasterControl(boolean enabled) {
        // Initial state if master control should be DISABLED
        runAction.setEnabled(enabled);
        pauseAction.setEnabled(enabled);
        resetAction.setEnabled(enabled);
        stepAction.setEnabled(enabled);
        stopAction.setEnabled(enabled);
    }

    // Run all simulations -- set state of all simulations to RUNNING
    protected void masterRunAction() {
        Iterator iter = controlList.iterator();
        while (iter.hasNext()) {
            SimulationControl simulationControl = (SimulationControl) iter.next();
            simulationControl.run();
        }
    }

    // Pause all simulations -- set state of all simulations to PAUSED
    protected void masterPauseAction() {
        Iterator iter = controlList.iterator();
        while (iter.hasNext()) {
            SimulationControl simulationControl = (SimulationControl) iter.next();
            simulationControl.pause();
        }
    }

    // Reset all simulations -- set state of all simulations to RESET
    protected void masterResetAction() {
        Iterator iter = controlList.iterator();
        while (iter.hasNext()) {
            SimulationControl simulationControl = (SimulationControl) iter.next();
            simulationControl.reset();
        }
    }

    // Step all simulations -- step in all simulations
    protected void masterStepAction() {
        Iterator iter = controlList.iterator();
        while (iter.hasNext()) {
            SimulationControl simulationControl = (SimulationControl) iter.next();
            simulationControl.step();
        }
    }

    // Stop all simulations
    protected void masterStopAction() {
        Iterator iter = controlList.iterator();
        while (iter.hasNext()) {
            SimulationControl simulationControl = (SimulationControl) iter.next();
            simulationControl.stop();
        }
    }

    /**
     * 
     * @return the list of simulation controls
     */
    public List<SimulationControl> getSimulationControlList() {
        return controlList;
    }

    /**
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
     */
    @Override
    public void setFocus() {
        // Nothing
    }

    /**
     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
     */
    @Override
    public void dispose() {

        // Are we listening to the simulation manager?
        if (simulationManager != null) {
            // Yes
            // Not any more
            simulationManager.removeListener(this);
        }

        if (controlList.isEmpty() == false) {
            Iterator iter = controlList.listIterator();
            while (iter.hasNext()) {
                SimulationControl sctrl = (SimulationControl) iter.next();
                sctrl.dispose();
                iter.remove();
            }
        }

    } // dispose

    /**
     * A simulation has been started or stopped.
     * We have registered for SimulationManager.addListener() and 
     * so we are informed when a simulation is started and when
     * one is stopped. 
     * 
     * @see org.eclipse.stem.jobs.simulation.ISimulationManagerListener#simulationsChanged(org.eclipse.stem.jobs.simulation.SimulationManagerEvent)
     */
    public void simulationsChanged(SimulationManagerEvent event) {

        ISimulation[] simulations = null;

        // add a simulation control for each new simulation...
        simulations = event.getSimulationsAdded();
        for (int i = 0; i < simulations.length; i++) {
            addSimulation(simulations[i]);
        }

        // remove the corresponding simulation control for all stopped
        // simulations...
        simulations = event.getSimulationsRemoved();
        for (int i = 0; i < simulations.length; i++) {
            removeSimulation(simulations[i]);
        }

        scrollComposite.setContent(controlComposite);
        controlComposite.layout(true);
        scrollComposite.layout(true);

        //controlComposite.redraw();
        scrollComposite.redraw();

        // Refresh our reference to the simulation manager
        //      simulationManager = SimulationManager.getManager();
        //      simulationManager.addSimulationManagerListener(this);

    }

    /**
     * add a simulation control panel 
     * for an added or existing ISimulation 
     * 
     * @param sim  Instance of ISimulation
     */
    private void addSimulation(ISimulation sim) {
        controlComposite.setRedraw(true);
        scrollComposite.setRedraw(true);
        SimulationControl simulationControl = new SimulationControl(controlComposite, sim);
        controlComposite.addControlListener(simulationControl);
        controlList.add(simulationControl);
        if (controlList.size() > 0) {
            enableMasterControl(true);
        }

        controlComposite.layout(true);
        scrollComposite.layout(true);

        scrollComposite.redraw();
    }

    /**
     * remove a simulation control panel 
     * for an added or existing ISimulation 
     * 
     * @param sim  Instance of ISimulation
     */
    private void removeSimulation(ISimulation simulation) {
        controlComposite.setRedraw(true);
        scrollComposite.setRedraw(true);

        Control[] ctrls = controlComposite.getChildren();

        for (int j = 0; j < ctrls.length; j++) {
            SimulationControl simulationControl = (SimulationControl) ctrls[j];
            if (simulation.equals(simulationControl.getSimulation())) {
                controlComposite.removeControlListener(simulationControl);
                controlList.remove(simulationControl);
                // Create a temporary composite
                Composite tempComposite = new Composite(scrollComposite, SWT.NONE);
                // Set the temporary composite to be the parent of the
                // control we want to remove :
                simulationControl.setParent(tempComposite);
                // Now get rid of the temporary composite and its children
                tempComposite.dispose();
                simulationControl.dispose();
                break;
            }
        }

        if (controlList.size() == 0) {
            enableMasterControl(false);
        }

        controlComposite.layout(true);
        scrollComposite.layout(true);

        scrollComposite.redraw();
    }
}