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

Java tutorial

Introduction

Here is the source code for com.planetmayo.debrief.satc_rcp.views.TestHarnessView.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.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.nebula.widgets.formattedtext.FormattedText;
import org.eclipse.nebula.widgets.formattedtext.IntegerFormatter;
import org.eclipse.nebula.widgets.formattedtext.LongFormatter;
import org.eclipse.nebula.widgets.formattedtext.NumberFormatter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.part.ViewPart;

import com.planetmayo.debrief.satc.log.LogFactory;
import com.planetmayo.debrief.satc.model.generator.ISolutionGenerator;
import com.planetmayo.debrief.satc.model.generator.ISolver;
import com.planetmayo.debrief.satc.model.generator.impl.Solver;
import com.planetmayo.debrief.satc.model.generator.impl.SwitchableSolutionGenerator;
import com.planetmayo.debrief.satc.model.generator.impl.bf.BFSolutionGenerator;
import com.planetmayo.debrief.satc.model.generator.impl.ga.GAParameters;
import com.planetmayo.debrief.satc.model.generator.impl.ga.GASolutionGenerator;
import com.planetmayo.debrief.satc.model.generator.impl.sa.SAParameters;
import com.planetmayo.debrief.satc.model.generator.impl.sa.SASolutionGenerator;
import com.planetmayo.debrief.satc.model.manager.ISolversManager;
import com.planetmayo.debrief.satc.model.manager.ISolversManagerListener;
import com.planetmayo.debrief.satc.support.TestSupport;
import com.planetmayo.debrief.satc.util.GeoSupport;
import com.planetmayo.debrief.satc.util.calculator.GeoCalculatorType;
import com.planetmayo.debrief.satc_rcp.SATC_Activator;
import com.planetmayo.debrief.satc_rcp.io.XStreamIO;
import com.planetmayo.debrief.satc_rcp.io.XStreamIO.XStreamReader;
import com.planetmayo.debrief.satc_rcp.io.XStreamIO.XStreamWriter;
import com.planetmayo.debrief.satc_rcp.model.SpatialViewSettings;
import com.planetmayo.debrief.satc_rcp.ui.UIListener;
import com.planetmayo.debrief.satc_rcp.ui.UIUtils;

/**
 * This sample class demonstrates how to plug-in a new workbench view. The view
 * shows data obtained from the model. The sample creates a dummy model on the
 * fly, but a real implementation would connect to the model available either in
 * this or another plug-in (e.g. the workspace). The view is connected to the
 * model using a content provider.
 * <p>
 * The view uses a label provider to define how model objects should be
 * presented in the view. Each view can present the same model objects using
 * different labels and icons, if needed. Alternatively, a single label provider
 * can be shared between views in order to ensure that objects of the same type
 * are presented in the same way everywhere.
 * <p>
 */

public class TestHarnessView extends ViewPart {

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

    /*
     * The content provider class is responsible for providing objects to the
     * view. It can wrap existing objects in adapters or simply return objects
     * as-is. These objects may be sensitive to the current input of the view, or
     * ignore it and always show the same content (like Task List, for example).
     */
    private Shell _shell;
    private Action _restartAction;
    private Action _stepAction;
    private Action _clearAction;
    private Action _playAction;
    private Action _populateGoodAction;
    private Action _liveAction;
    private Action _saveAction;
    private Action _loadAction;
    private Action _useFastCalculator;

    private Button _useGAButton;
    private Button _useSAButton;

    private Composite _currentSolutionGeneratorComposite;
    private Composite _saParametersComposite;
    private Composite _gaParametersComposite;

    private ComboViewer _solvers;

    private DataBindingContext _context;
    private Binder<GASolutionGenerator> _gaBinder;
    private Binder<SASolutionGenerator> _saBinder;
    private List<Control> bfGraphControls = new ArrayList<Control>();
    private List<Control> gaGraphControls = new ArrayList<Control>();
    private PropertyChangeListener _liveRunningListener;

    private ISolver _activeSolver;
    private ISolversManager _solversManager;
    private ISolversManagerListener solversManagerListener;
    private int solverNumber = 1;
    private boolean _settingActiveSolver;

    private SpatialViewSettings _spatialSettings;

    public TestHarnessView() {
        _solversManager = SATC_Activator.getDefault().getService(ISolversManager.class, false);
        _spatialSettings = SATC_Activator.getDefault().getService(SpatialViewSettings.class, true);
    }

    @Override
    public void createPartControl(Composite parent) {
        _shell = parent.getShell();
        _context = new DataBindingContext();

        makeActions();
        fillLocalToolBar(getViewSite().getActionBars().getToolBarManager());
        solversManagerListener = UIListener.wrap(parent.getDisplay(), ISolversManagerListener.class,
                new ISolversManagerListener() {
                    @Override
                    public void solverCreated(ISolver solver) {
                        _solvers.add(solver);
                    }

                    @Override
                    public void activeSolverChanged(ISolver activeSolver) {
                        setActiveSolver(activeSolver);
                    }
                });
        _solversManager.addSolversManagerListener(solversManagerListener);

        Composite form = new Composite(parent, SWT.NONE);
        createSolversGroup(form);
        createSpatialOptionsGroup(form);
        createAlgorithmsGroup(form);

        setActiveSolver(_solversManager.getActiveSolver());
        form.setLayout(UIUtils.createGridLayoutWithoutMargins(1, false));
        form.pack();
    }

    @Override
    public void dispose() {
        super.dispose();
        _solversManager.removeSolverManagerListener(solversManagerListener);
        _context.dispose();
    }

    @Override
    public void setFocus() {
    }

    private void createSolversGroup(Composite parent) {
        Group solversGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
        solversGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        solversGroup.setText("Solvers");
        solversGroup.setLayout(new GridLayout(3, false));

        UIUtils.createLabel(solversGroup, "Solvers", new GridData());
        _solvers = new ComboViewer(solversGroup);
        _solvers.getCombo().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        _solvers.setLabelProvider(new LabelProvider() {

            @Override
            public String getText(Object element) {
                return ((ISolver) element).getName();
            }
        });
        _solvers.addPostSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent e) {
                if (_settingActiveSolver) {
                    return;
                }
                StructuredSelection selection = (StructuredSelection) e.getSelection();
                ISolver solver = (ISolver) selection.getFirstElement();
                _solversManager.setActiveSolver(solver);
            }
        });
        for (ISolver solver : _solversManager.getAvailableSolvers()) {
            _solvers.add(solver);
        }

        Button newSolver = new Button(solversGroup, SWT.PUSH);
        newSolver.setText("New");
        newSolver.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                ISolver newSolver = _solversManager.createSolver("Solver " + solverNumber);
                solverNumber++;
                _solvers.setSelection(new StructuredSelection(newSolver));
            }
        });
    }

    private void createSpatialOptionsGroup(Composite parent) {
        Composite checkBoxForm = new Composite(parent, SWT.NONE);
        checkBoxForm.setLayoutData(new GridData(GridData.FILL_BOTH));
        FillLayout verticalLayout = new FillLayout(SWT.VERTICAL);

        // insert the diagnostics panels
        Group group1 = new Group(checkBoxForm, SWT.SHADOW_ETCHED_IN);
        group1.setLayout(verticalLayout);
        group1.setText("Constrain problem space");

        Group group2 = new Group(checkBoxForm, SWT.SHADOW_ETCHED_IN);
        group2.setLayout(verticalLayout);
        group2.setText("Generate Solutions");

        checkBoxForm.setLayout(new FillLayout(SWT.HORIZONTAL));
        final Button btn1 = new Button(group1, SWT.CHECK);
        btn1.setText("Show all bounds");
        btn1.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowAllBounds(btn1.getSelection());
            }
        });
        final Button btn2a = new Button(group1, SWT.CHECK);
        btn2a.setText("Show leg start bounds");
        btn2a.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowLegEndBounds(btn2a.getSelection());
            }
        });
        final Button btn2b = new Button(group1, SWT.CHECK);
        btn2b.setText("Show target solution");
        btn2b.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowTargetSolution(btn2b.getSelection());
            }
        });

        final Button btn3 = new Button(group2, SWT.CHECK);
        btn3.setText("Show points");
        btn3.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowPoints(btn3.getSelection());
            }
        });
        bfGraphControls.add(btn3);

        final Button btn4 = new Button(group2, SWT.CHECK);
        btn4.setText("Show achievable points");
        btn4.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowAchievablePoints(btn4.getSelection());
            }
        });
        bfGraphControls.add(btn4);

        final Button btn5 = new Button(group2, SWT.CHECK);
        btn5.setText("Show all routes");
        btn5.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowRoutes(btn5.getSelection());
            }
        });
        bfGraphControls.add(btn5);

        final Button btn6a = new Button(group2, SWT.CHECK);
        btn6a.setText("Show routes with scores");
        btn6a.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowRoutesWithScores(btn6a.getSelection());
            }
        });
        bfGraphControls.add(btn6a);

        final Button btn6b = new Button(group2, SWT.CHECK);
        btn6b.setText("Show generated points");
        btn6b.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowRoutePoints(btn6b.getSelection());
            }
        });
        bfGraphControls.add(btn6b);

        final Button btn6c = new Button(group2, SWT.CHECK);
        btn6c.setText("Show labels for generated points");
        btn6c.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowRoutePointLabels(btn6c.getSelection());
            }
        });
        bfGraphControls.add(btn6c);

        final Button btn7 = new Button(group2, SWT.CHECK);
        btn7.setText("Show intermediate GA");
        btn7.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowIntermediateGASolutions(btn7.getSelection());
            }
        });
        btn7.setVisible(false);
        gaGraphControls.add(btn7);

        final Button btn8 = new Button(group2, SWT.CHECK);
        btn8.setText("Show recommended solution");
        btn8.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                _spatialSettings.setShowRecommendedSolutions(btn8.getSelection());
            }
        });
    }

    private void createAlgorithmsGroup(Composite parent) {
        Group gaGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
        gaGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
        gaGroup.setText("Genetic algorithm parameters");
        gaGroup.setLayout(UIUtils.createGridLayoutWithoutMargins(1, false));

        GridData gridData = new GridData();
        gridData.horizontalSpan = 2;
        Composite composite = UIUtils.createEmptyComposite(gaGroup, new RowLayout(SWT.HORIZONTAL), gridData);

        _useGAButton = new Button(composite, SWT.CHECK);
        _useGAButton.setText("Use GA");
        _useGAButton.setLayoutData(new RowData(150, SWT.DEFAULT));

        _useSAButton = new Button(composite, SWT.CHECK);
        _useSAButton.setSelection(false);
        _useSAButton.setText("Use Simulated Annealing");

        _currentSolutionGeneratorComposite = new Composite(gaGroup, SWT.NONE);
        _currentSolutionGeneratorComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
        _currentSolutionGeneratorComposite.setLayout(new StackLayout());

        _gaParametersComposite = new Composite(_currentSolutionGeneratorComposite, SWT.NONE);
        _gaParametersComposite.setLayout(new GridLayout(2, false));
        createGAParameters(_gaParametersComposite);

        _saParametersComposite = new Composite(_currentSolutionGeneratorComposite, SWT.NONE);
        _saParametersComposite.setLayout(new GridLayout(2, false));
        createSAParameters(_saParametersComposite);

        addChangeGeneratorListeners();
    }

    private void createGAParameters(Composite gaParameters) {
        UIUtils.createLabel(gaParameters, "Consider alterations:", new GridData());
        final Button considerAlteringLegs = new Button(gaParameters, SWT.CHECK);
        considerAlteringLegs.setLayoutData(new GridData());

        UIUtils.createLabel(gaParameters, "Population size:", new GridData());
        final FormattedText populationSize = new FormattedText(gaParameters);
        populationSize.setFormatter(new LongFormatter());
        populationSize.getControl().setLayoutData(new GridData(100, SWT.DEFAULT));

        UIUtils.createLabel(gaParameters, "Elitizm:", new GridData());
        final FormattedText elitizm = new FormattedText(gaParameters);
        elitizm.setFormatter(new LongFormatter());
        elitizm.getControl().setLayoutData(new GridData(100, SWT.DEFAULT));

        UIUtils.createLabel(gaParameters, "Stagnation steps:", new GridData());
        final FormattedText stagnation = new FormattedText(gaParameters);
        stagnation.setFormatter(new LongFormatter());
        stagnation.getControl().setLayoutData(new GridData(100, SWT.DEFAULT));

        UIUtils.createLabel(gaParameters, "Timeout:", new GridData());
        final FormattedText timeout = new FormattedText(gaParameters);
        timeout.setFormatter(new IntegerFormatter("###,##0"));
        timeout.getControl().setLayoutData(new GridData(100, SWT.DEFAULT));

        UIUtils.createLabel(gaParameters, "Mutation Prob:", new GridData());
        final FormattedText mutation = new FormattedText(gaParameters);
        mutation.setFormatter(new NumberFormatter("0.0#"));
        mutation.getControl().setLayoutData(new GridData(100, SWT.DEFAULT));

        UIUtils.createLabel(gaParameters, "Timeout between iteration:    ", new GridData());
        final FormattedText timeoutIteration = new FormattedText(gaParameters);
        timeoutIteration.setFormatter(new LongFormatter());
        timeoutIteration.getControl().setLayoutData(new GridData(100, SWT.DEFAULT));

        _gaBinder = new Binder<GASolutionGenerator>(_context) {

            @Override
            protected void doBind(GASolutionGenerator gaSolutionGenerator) {
                GAParameters parameters = gaSolutionGenerator.getParameters();
                add(_context.bindValue(
                        WidgetProperties.text(SWT.Modify).observeDelayed(100, populationSize.getControl()),
                        BeansObservables.observeValue(parameters, GAParameters.POPULATION_SIZE)));
                add(_context.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(100, elitizm.getControl()),
                        BeansObservables.observeValue(parameters, GAParameters.ELITIZM)));
                add(_context.bindValue(
                        WidgetProperties.text(SWT.Modify).observeDelayed(100, stagnation.getControl()),
                        BeansObservables.observeValue(parameters, GAParameters.STAGNATION_STEPS)));
                add(_context.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(100, timeout.getControl()),
                        BeansObservables.observeValue(parameters, GAParameters.TIMEOUT)));
                add(_context.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(100, mutation.getControl()),
                        BeansObservables.observeValue(parameters, GAParameters.MUTATION_PROBABILITY)));
                add(_context.bindValue(
                        WidgetProperties.text(SWT.Modify).observeDelayed(100, timeoutIteration.getControl()),
                        BeansObservables.observeValue(parameters, GAParameters.TIMEOUT_BETWEEN_ITERATIONS)));
                add(_context.bindValue(WidgetProperties.selection().observe(considerAlteringLegs),
                        BeansObservables.observeValue(parameters, GAParameters.USE_ALTERING_LEGS)));
            }
        };
    }

    private void createSAParameters(Composite parent) {
        UIUtils.createLabel(parent, "Start temperature:", new GridData());
        final FormattedText startTemperature = new FormattedText(parent);
        startTemperature.setFormatter(new NumberFormatter("0.0##"));
        startTemperature.getControl().setLayoutData(new GridData(100, SWT.DEFAULT));

        UIUtils.createLabel(parent, "End temperature:", new GridData());
        final FormattedText endTemperature = new FormattedText(parent);
        endTemperature.setFormatter(new NumberFormatter("0.0##"));
        endTemperature.getControl().setLayoutData(new GridData(100, SWT.DEFAULT));

        UIUtils.createLabel(parent, "Parallel threads:", new GridData());
        final FormattedText parallelThreads = new FormattedText(parent);
        parallelThreads.setFormatter(new LongFormatter());
        parallelThreads.getControl().setLayoutData(new GridData(100, SWT.DEFAULT));

        UIUtils.createLabel(parent, "Iterations in thread:", new GridData());
        final FormattedText iterations = new FormattedText(parent);
        iterations.setFormatter(new LongFormatter());
        iterations.getControl().setLayoutData(new GridData(100, SWT.DEFAULT));

        GridData checkboxData = new GridData();
        checkboxData.horizontalSpan = 2;
        final Button startOnCenter = new Button(parent, SWT.CHECK);
        startOnCenter.setText("Start on center");
        startOnCenter.setLayoutData(checkboxData);

        final Button joinedIterations = new Button(parent, SWT.CHECK);
        joinedIterations.setText("Joined iterations");
        joinedIterations.setLayoutData(checkboxData);

        _saBinder = new Binder<SASolutionGenerator>(_context) {

            @Override
            protected void doBind(SASolutionGenerator saSolutionGenerator) {
                add(_context.bindValue(
                        WidgetProperties.text(SWT.Modify).observeDelayed(100, startTemperature.getControl()),
                        BeansObservables.observeValue(saSolutionGenerator.getParameters(),
                                SAParameters.START_TEMPRATURE)));
                add(_context.bindValue(
                        WidgetProperties.text(SWT.Modify).observeDelayed(100, endTemperature.getControl()),
                        BeansObservables.observeValue(saSolutionGenerator.getParameters(),
                                SAParameters.END_TEMPRATURE)));
                add(_context.bindValue(
                        WidgetProperties.text(SWT.Modify).observeDelayed(100, parallelThreads.getControl()),
                        BeansObservables.observeValue(saSolutionGenerator.getParameters(),
                                SAParameters.PARALLEL_THREADS)));
                add(_context.bindValue(
                        WidgetProperties.text(SWT.Modify).observeDelayed(100, iterations.getControl()),
                        BeansObservables.observeValue(saSolutionGenerator.getParameters(),
                                SAParameters.ITERATIONS_IN_THREAD)));
                add(_context.bindValue(WidgetProperties.selection().observe(startOnCenter), BeansObservables
                        .observeValue(saSolutionGenerator.getParameters(), SAParameters.START_ON_CENTER)));
                add(_context.bindValue(WidgetProperties.selection().observe(joinedIterations), BeansObservables
                        .observeValue(saSolutionGenerator.getParameters(), SAParameters.JOINED_ITERATIONS)));
            }
        };
    }

    private void addChangeGeneratorListeners() {
        _useGAButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                if (_activeSolver != null
                        && (_activeSolver.getSolutionGenerator() instanceof SwitchableSolutionGenerator)) {
                    SwitchableSolutionGenerator g = (SwitchableSolutionGenerator) _activeSolver
                            .getSolutionGenerator();
                    if (_useGAButton.getSelection()) {
                        g.switchToGA();
                    } else {
                        g.switchToBF();
                    }
                    selectSolutionGenerator(g);
                }
            }
        });
        _useSAButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                if (_activeSolver != null
                        && (_activeSolver.getSolutionGenerator() instanceof SwitchableSolutionGenerator)) {
                    SwitchableSolutionGenerator g = (SwitchableSolutionGenerator) _activeSolver
                            .getSolutionGenerator();
                    if (_useSAButton.getSelection()) {
                        g.switchToSA();
                    } else {
                        g.switchToBF();
                    }
                    selectSolutionGenerator(g);
                }
            }
        });

    }

    private void setActiveSolver(ISolver solver) {
        _settingActiveSolver = true;
        try {
            if (_activeSolver != null) {
                ((Solver) _activeSolver).removePropertyChangeListener(ISolver.LIVE_RUNNING, _liveRunningListener);
            }
            _activeSolver = solver;
            _gaBinder.clear();
            _saBinder.clear();

            boolean enabled = solver != null;
            _clearAction.setEnabled(enabled);
            _populateGoodAction.setEnabled(enabled);
            _restartAction.setEnabled(enabled);
            _stepAction.setEnabled(enabled);
            _playAction.setEnabled(enabled);
            _liveAction.setEnabled(enabled);
            _saveAction.setEnabled(enabled);
            _loadAction.setEnabled(enabled);
            _useGAButton.setEnabled(false);
            _useSAButton.setEnabled(false);

            if (solver != null) {
                _solvers.setSelection(new StructuredSelection(solver));
                if (solver.getSolutionGenerator() instanceof SwitchableSolutionGenerator) {
                    _useGAButton.setEnabled(true);
                    _useSAButton.setEnabled(true);
                }
                selectSolutionGenerator(solver.getSolutionGenerator());

                _liveAction.setChecked(_activeSolver.isLiveRunning());
                _liveRunningListener = new PropertyChangeListener() {

                    @Override
                    public void propertyChange(PropertyChangeEvent evt) {
                        _liveAction.setChecked(_activeSolver.isLiveRunning());
                    }
                };
                ((Solver) _activeSolver).addPropertyChangeListener(ISolver.LIVE_RUNNING, _liveRunningListener);
            }
        } finally {
            _settingActiveSolver = false;
        }
    }

    private void selectSolutionGenerator(ISolutionGenerator solutionGenerator) {
        _saBinder.clear();
        _gaBinder.clear();

        _useSAButton.setSelection(false);
        _useGAButton.setSelection(false);
        if (solutionGenerator instanceof SwitchableSolutionGenerator) {
            solutionGenerator = ((SwitchableSolutionGenerator) solutionGenerator).getCurrentGenerator();
        }
        StackLayout layout = (StackLayout) _currentSolutionGeneratorComposite.getLayout();
        layout.topControl = null;
        setVisible(false, bfGraphControls);
        setVisible(false, gaGraphControls);

        if (solutionGenerator instanceof SASolutionGenerator) {
            _useSAButton.setSelection(true);
            _saBinder.bind((SASolutionGenerator) solutionGenerator);
            layout.topControl = _saParametersComposite;
        }
        if (solutionGenerator instanceof GASolutionGenerator) {
            _useGAButton.setSelection(true);
            _gaBinder.bind((GASolutionGenerator) solutionGenerator);
            layout.topControl = _gaParametersComposite;
            setVisible(true, gaGraphControls);
        }
        if (solutionGenerator instanceof BFSolutionGenerator) {
            setVisible(true, bfGraphControls);
        }
        _currentSolutionGeneratorComposite.layout();
    }

    private void setVisible(boolean visible, List<Control> controls) {
        for (Control control : controls) {
            control.setVisible(visible);
        }
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(_useFastCalculator);
        manager.add(new Separator());

        manager.add(_clearAction);
        manager.add(_restartAction);
        manager.add(new Separator());

        manager.add(_populateGoodAction);
        manager.add(new Separator());

        manager.add(_stepAction);
        manager.add(_playAction);
        manager.add(_liveAction);
        manager.add(new Separator());

        manager.add(_saveAction);
        manager.add(_loadAction);
    }

    private void makeActions() {
        _populateGoodAction = new Action() {
            @Override
            public void run() {
                new TestSupport().loadGoodData(_activeSolver);
            }
        };
        _populateGoodAction.setText("Pop Good");
        _populateGoodAction.setToolTipText("Load some good data");

        _clearAction = new Action() {
            @Override
            public void run() {
                // clear the bounded states
                _activeSolver.clear();
            }
        };
        _clearAction.setText("Clear");
        _clearAction.setToolTipText("Clear the track generator contributions");

        _liveAction = new Action("Live", SWT.TOGGLE) {

            @Override
            public void run() {
                _activeSolver.setLiveRunning(_liveAction.isChecked());
            }
        };

        _restartAction = new Action() {
            @Override
            public void run() {
                // clear the bounded states
                _activeSolver.getBoundsManager().restart();
            }
        };
        _restartAction.setText("Restart");
        _restartAction.setToolTipText("Reset the track generator");

        _stepAction = new Action() {
            @Override
            public void run() {
                _activeSolver.getBoundsManager().step();
            }
        };
        _stepAction.setText("Step");
        _stepAction.setToolTipText("Process the next contribution");

        _playAction = new Action() {
            @Override
            public void run() {
                _activeSolver.run(true, true);
            }
        };
        _playAction.setText("Play");
        _playAction.setToolTipText("Process all contributions");

        _saveAction = new Action("Save") {

            @Override
            public void run() {
                doSave();
            }
        };
        _saveAction.setToolTipText("Save solver to file");

        _loadAction = new Action("Load") {

            @Override
            public void run() {
                doLoad();
            }
        };
        _loadAction.setToolTipText("Load solver from file");

        _useFastCalculator = new Action("Fast Calc", SWT.TOGGLE) {

            @Override
            public void run() {
                GeoSupport.setCalculatorType(
                        _useFastCalculator.isChecked() ? GeoCalculatorType.FAST : GeoCalculatorType.ORIGINAL);
            }
        };
        _useFastCalculator.setChecked(true);
    }

    private void doLoad() {
        FileDialog dialog = new FileDialog(_shell, SWT.OPEN);
        dialog.setFilterExtensions(new String[] { "*.xml" });
        String fileSelected = dialog.open();

        if (fileSelected != null) {
            InputStream inputStream;
            try {
                inputStream = new FileInputStream(fileSelected);
                XStreamReader reader = XStreamIO.newReader(inputStream, fileSelected);
                if (reader.isLoaded()) {
                    _activeSolver.load(reader);
                    _activeSolver.run(true, false);
                }
            } catch (FileNotFoundException e) {
                LogFactory.getLog().error("Can't read input file:" + fileSelected, e);
            }
        }
    }

    private void doSave() {
        FileDialog dialog = new FileDialog(_shell, SWT.SAVE);
        dialog.setFilterExtensions(new String[] { "*.xml" });

        String filename = dialog.open();
        if (filename == null) {
            return;
        }

        XStreamWriter writer = XStreamIO.newWriter();
        _activeSolver.save(writer);
        try {
            writer.process(new FileOutputStream(filename));
        } catch (FileNotFoundException e) {
            LogFactory.getLog().error("Can't find output file", e);
        }
    }

    private abstract static class Binder<T> {
        protected List<Binding> bindings;
        protected DataBindingContext context;

        public Binder(DataBindingContext context) {
            this.context = context;
            bindings = new ArrayList<Binding>();
        }

        protected void add(Binding binding) {
            bindings.add(binding);
        }

        public void clear() {
            for (Binding binding : bindings) {
                context.removeBinding(binding);
            }
            bindings.clear();
        }

        public void bind(T objectToBind) {
            clear();
            doBind(objectToBind);
        }

        protected abstract void doBind(T objectToBind);
    }
}