au.gov.ansto.bragg.kowari.exp.command.AdvancedParameter.java Source code

Java tutorial

Introduction

Here is the source code for au.gov.ansto.bragg.kowari.exp.command.AdvancedParameter.java

Source

/******************************************************************************* 
* Copyright (c) 2008 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.kowari.exp.command;

import java.beans.PropertyChangeListener;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
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.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.gumtree.gumnix.sics.batch.ui.util.SicsBatchUIUtils;
import org.slf4j.LoggerFactory;

import au.gov.ansto.bragg.kowari.exp.commandView.AbstractScanCommandView;
import au.gov.ansto.bragg.kowari.exp.commandView.DndTransferData;

/**
 * @author nxi
 * Created on 05/08/2009
 */
public class AdvancedParameter extends AbstractScanParameter {

    protected List<SingleADParameter> parameters;
    private int numberOfPoints;
    private boolean doCreateFile = false;

    private int currentPosition;

    /**
     * @return the numberOfPositions
     */
    public int getNumberOfPoints() {
        return numberOfPoints;
    }

    /**
     * @param numberOfPositions the numberOfPositions to set
     */
    public void setNumberOfPoints(int numberOfPoints) {
        int oldValue = this.numberOfPoints;
        this.numberOfPoints = numberOfPoints;
        firePropertyChange("numberOfPoints", oldValue, numberOfPoints);
        for (SingleADParameter parameter : parameters)
            parameter.calculateStepSize();
    }

    /**
     * @return the doCreateFile
     */
    public boolean getDoCreateFile() {
        return doCreateFile;
    }

    /**
     * @param doCreateFile the doCreateFile to set
     */
    public void setDoCreateFile(boolean doCreateFile) {
        boolean oldValue = this.doCreateFile;
        this.doCreateFile = doCreateFile;
        firePropertyChange("doCreateFile", oldValue, doCreateFile);
    }

    /**
     * 
     */
    public AdvancedParameter() {
        super();
        parameters = new ArrayList<SingleADParameter>();
    }

    /* (non-Javadoc)
     * @see au.gov.ansto.bragg.kowari.exp.command.AbstractScanParameter#createParameterUI(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createParameterUI(final Composite parent, final AbstractScanCommandView commandView,
            final FormToolkit toolkit) {
        final Group parameterGroup = new Group(parent, SWT.NULL);
        //      toolkit.adapt(parameterGroup);
        //      parameterGroup.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
        parameterGroup.setBackground(parent.getBackground());
        parameterGroup.setText("Dimension-" + commandView.getCommand().indexOfParameter(this));

        //      GridLayoutFactory.swtDefaults().spacing(6, 0).numColumns(5).applyTo(parameterGroup);
        GridDataFactory.swtDefaults().align(SWT.BEGINNING, SWT.TOP).applyTo(parameterGroup);

        //      Composite singleParameterComposite = toolkit.createComposite(parent);
        //      GridLayoutFactory.swtDefaults().margins(0, 0).spacing(6, 4).numColumns(5).applyTo(singleParameterComposite);
        if (parameters.size() == 0) {
            SingleADParameter parameter = new SingleADParameter(this);
            parameter.setScanVariable("sx");
            parameters.add(parameter);
        }
        for (SingleADParameter parameter : parameters) {
            parameter.createParameterUI(parameterGroup, commandView, toolkit);
        }

        final Text numberOfPointsText = toolkit.createText(parent, "");
        GridDataFactory.swtDefaults().align(SWT.CENTER, SWT.TOP).indent(0, 12)
                .hint(WIDTH_PARAMETER_LONG, SWT.DEFAULT).applyTo(numberOfPointsText);
        addValidator(numberOfPointsText, ParameterValidator.integerValidator);

        final Button multiFileButton = toolkit.createButton(parent, "multiple_files", SWT.RADIO);
        GridDataFactory.swtDefaults().align(SWT.CENTER, SWT.TOP).indent(0, 12).hint(80, SWT.DEFAULT)
                .applyTo(multiFileButton);

        multiFileButton.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                firePropertyChange("multiple files", null, true);
            }

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

        Realm.runWithDefault(SWTObservables.getRealm(Display.getDefault()), new Runnable() {
            public void run() {
                DataBindingContext bindingContext = new DataBindingContext();
                bindingContext.bindValue(SWTObservables.observeText(numberOfPointsText, SWT.Modify),
                        BeansObservables.observeValue(getInstance(), "numberOfPoints"), new UpdateValueStrategy(),
                        new UpdateValueStrategy());
                bindingContext.bindValue(SWTObservables.observeSelection(multiFileButton),
                        BeansObservables.observeValue(getInstance(), "doCreateFile"), new UpdateValueStrategy(),
                        new UpdateValueStrategy());
            }
        });

        final AbstractScanCommand command = commandView.getCommand();

        Button addButton = toolkit.createButton(parent, "", SWT.PUSH);
        GridDataFactory.swtDefaults().align(SWT.CENTER, SWT.TOP).indent(0, 9).hint(24, 24).applyTo(addButton);
        try {
            addButton.setImage(SicsBatchUIUtils.getBatchEditorImage("ADD"));
        } catch (FileNotFoundException e2) {
            LoggerFactory.getLogger(this.getClass()).error("can not find ADD image", e2);
        }
        addButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                addNewParameter(command);
                commandView.refreshParameterComposite();
                //            notifyPropertyChanged(newCommand, null);
            }
        });

        Button removeButton = toolkit.createButton(parent, "", SWT.PUSH);
        GridDataFactory.swtDefaults().align(SWT.CENTER, SWT.TOP).indent(0, 9).hint(24, 24).applyTo(removeButton);
        try {
            removeButton.setImage(SicsBatchUIUtils.getBatchEditorImage("REMOVE"));
        } catch (FileNotFoundException e1) {
            LoggerFactory.getLogger(this.getClass()).error("can not find REMOVE image", e1);
        }
        removeButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                removeParameter(command);
                commandView.refreshParameterComposite();
            }
        });

        DragSource dragSource = new DragSource(parameterGroup, DND.DROP_MOVE);
        dragSource.setTransfer(new Transfer[] { LocalSelectionTransfer.getTransfer() });
        final AdvancedParameter parameter = this;
        dragSource.addDragListener(new DragSourceAdapter() {

            @Override
            public void dragFinished(DragSourceEvent event) {
                LocalSelectionTransfer.getTransfer().setSelection(null);
            }

            @Override
            public void dragSetData(DragSourceEvent event) {
                if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) {
                    DndTransferData transferData = new DndTransferData();
                    transferData.setParent(command);
                    transferData.setChild(parameter);
                    LocalSelectionTransfer.getTransfer().setSelection(new StructuredSelection(transferData));
                }
            }
        });

        DropTarget dropTarget = new DropTarget(parameterGroup, DND.DROP_MOVE);
        final AdvancedParameter parentParameter = this;
        dropTarget.setTransfer(new Transfer[] { LocalSelectionTransfer.getTransfer() });
        dropTarget.addDropListener(new DropTargetAdapter() {
            @Override
            public void drop(DropTargetEvent event) {
                if (event.data instanceof StructuredSelection) {
                    DndTransferData transferData = (DndTransferData) ((StructuredSelection) event.data)
                            .getFirstElement();
                    Object parentData = transferData.getParent();
                    Object child = transferData.getChild();
                    if (parentData == parentParameter) {
                        Point relativePoint = parameterGroup.toControl(new Point(event.x, event.y));
                        int index = 0;
                        for (Control control : parameterGroup.getChildren()) {
                            if (control instanceof Combo) {
                                if (relativePoint.y < control.getBounds().y + control.getBounds().height) {
                                    break;
                                }
                                index++;
                            }
                        }
                        if (child instanceof SingleADParameter) {
                            SingleADParameter parameter = (SingleADParameter) child;
                            int currentIndex = indexOfSingleADParameter(parameter);
                            if (currentIndex == index) {
                                return;
                            }
                            removeSigleParameter(parameter);
                            insertSigleADParameter(index, parameter);
                            commandView.refreshParameterComposite();
                        }
                    } else if (parentData == command) {
                        Point relativePoint = parent.toControl(new Point(event.x, event.y));
                        int index = 0;
                        for (Control control : parent.getChildren()) {
                            if (control instanceof Group) {
                                if (relativePoint.y < (control.getBounds().y + control.getBounds().height)) {
                                    break;
                                }
                                index++;
                            }
                        }
                        if (child instanceof AdvancedParameter) {
                            AdvancedParameter parameter = (AdvancedParameter) child;
                            int currentIndex = command.indexOfParameter(parameter);
                            if (currentIndex == index) {
                                return;
                            }
                            command.removeParameter(parameter);
                            command.insertParameter(index, parameter);
                            commandView.refreshParameterComposite();
                        }
                    }
                }
            }
        });
    }

    @Override
    protected void addNewParameter(AbstractScanCommand command) {
        AdvancedParameter newParameter = new AdvancedParameter();
        //      SingleADParameter singleParameter = new SingleADParameter(this);
        //      newParameter.insertSigleADParameter(0, singleParameter);
        //      newParameter.setScanVariable(scanVariable);
        //      newParameter.setStartPosition(startPosition);
        //      newParameter.setFinishPosition(finishPosition);
        //      newParameter.setNumberOfSteps(numberOfSteps);
        command.insertParameter(command.indexOfParameter(this) + 1, newParameter);
    }

    public void insertSigleADParameter(int index, SingleADParameter parameter) {
        parameters.add(index, parameter);
        firePropertyChange("parameter_add", null, parameter);
    }

    public int indexOfSingleADParameter(SingleADParameter parameter) {
        return parameters.indexOf(parameter);
    }

    /* (non-Javadoc)
     * @see au.gov.ansto.bragg.kowari.exp.command.AbstractScanParameter#iterationGetNext()
     */
    @Override
    public String iterationGetNext() {
        //      String script = "drive " + scanVariable + " " + currentPosition + "\n";
        //      if (finishPosition == startPosition)
        //         currentPosition = Float.NaN;
        //      else if (numberOfPoints == 1)
        //         currentPosition += finishPosition - startPosition;
        //      else
        //         currentPosition += (finishPosition - startPosition) / (numberOfPoints - 1);
        if (parameters.size() == 0 || numberOfPoints == 0)
            return "";
        if (currentPosition >= numberOfPoints)
            return "";
        String script = "";
        for (SingleADParameter parameter : parameters) {
            script += parameter.iterationGetPoint(currentPosition, numberOfPoints) + "\n";
        }
        if (doCreateFile)
            script += AbstractScanCommand.NEW_FILE_TEXT;
        currentPosition++;
        return script;
    }

    /* (non-Javadoc)
     * @see au.gov.ansto.bragg.kowari.exp.command.AbstractScanParameter#iterationHasNext()
     */
    @Override
    public boolean iterationHasNext() {
        if (numberOfPoints <= 0)
            return false;
        if (numberOfPoints == 1)
            return currentPosition == 0;
        if (currentPosition >= numberOfPoints)
            return false;
        else
            return true;
    }

    /* (non-Javadoc)
     * @see au.gov.ansto.bragg.kowari.exp.command.AbstractScanParameter#startIteration()
     */
    @Override
    public void startIteration() {
        currentPosition = 0;
    }

    @Override
    public String toString() {
        String string = "";
        if (parameters.size() == 0)
            return string;
        if (parameters.size() == 1)
            return parameters.get(0).toString() + " " + numberOfPoints;
        String variables = "<";
        String starts = "<";
        String finishes = "<";
        for (SingleADParameter parameter : parameters) {
            //         string += "<" + parameter.toString() + ">";
            variables += parameter.getScanVariable() + ",";
            starts += parameter.getStartPosition() + ",";
            finishes += parameter.getFinishPosition() + ",";
        }
        variables = variables.substring(0, variables.length() - 1) + ">";
        starts = starts.substring(0, starts.length() - 1) + ">";
        finishes = finishes.substring(0, finishes.length() - 1) + ">";
        return string + variables + " " + starts + " " + finishes + " " + numberOfPoints;
    }

    public void removeSigleParameter(SingleADParameter singleADParameter) {
        if (parameters != null && parameters.size() > 1) {
            parameters.remove(singleADParameter);
            firePropertyChange("parameter_remove", null, singleADParameter);
        }
    }

    @Override
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        super.addPropertyChangeListener(listener);
        if (parameters != null)
            for (SingleADParameter parameter : parameters)
                parameter.addPropertyChangeListener(listener);
    }

    @Override
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        super.removePropertyChangeListener(listener);
        if (parameters != null)
            for (SingleADParameter parameter : parameters)
                parameter.removePropertyChangeListener(listener);
    }

    @Override
    public String getForLoopHead(String indexName, String indent) {
        String script = indent + "for {set " + indexName + " 0} {$" + indexName + " < " + numberOfPoints
                + "} {incr " + indexName + "} {\n";
        //      indent += "\t";
        //      if (doCreateFile) {
        //         script += indent + AbstractScanCommand.NEW_FILE_TEXT;
        //         script += indent + "set savenumber 0\n";
        //      }
        return script;
    }

    @Override
    public String getDriveScript(String indexName, String indent) {
        String script = "";
        for (AbstractScanParameter parameter : parameters) {
            script += parameter.getDriveScript(indexName, indent);
        }
        return script;
    }

    @Override
    public String getBroadcastScript(String indexName, String indent) {
        String script = "";
        for (AbstractScanParameter parameter : parameters) {
            script += parameter.getBroadcastScript(indexName, indent);
        }
        return script;
    }

    @Override
    public String getPritable(boolean isFirstLine) {
        String text = "";
        SingleADParameter p1 = parameters.get(0);
        if (isFirstLine) {
            text += p1.getPritable(isFirstLine) + "\t" + numberOfPoints + "\t"
                    + (doCreateFile ? "multiple_files" : "");
        } else {
            if (parameters.size() > 1) {
                for (int i = 1; i < parameters.size(); i++) {
                    text += parameters.get(i).getPritable(isFirstLine) + "\n";
                }
            }
        }
        return text;
    }

    public List<SingleADParameter> getADParameters() {
        return parameters;
    }
}