gov.redhawk.ide.octave.ui.wizard.MFileVariableMapingWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.ide.octave.ui.wizard.MFileVariableMapingWizardPage.java

Source

/*******************************************************************************
 * This file is protected by Copyright. 
 * Please refer to the COPYRIGHT file distributed with this source distribution.
 *
 * This file is part of REDHAWK IDE.
 *
 * 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
 *******************************************************************************/
package gov.redhawk.ide.octave.ui.wizard;

import gov.redhawk.ide.codegen.ICodeGeneratorDescriptor;
import gov.redhawk.ide.codegen.ImplementationSettings;
import gov.redhawk.ide.codegen.ui.ICodegenWizardPage;
import gov.redhawk.ide.octave.ui.OctaveProjectPlugin;
import gov.redhawk.ide.octave.ui.OctaveFunctionVariables;
import gov.redhawk.ide.octave.ui.OctaveMFileTableLabelProvider;
import gov.redhawk.ide.octave.ui.OctaveMFileTableMappingEditingSupport;
import gov.redhawk.ide.octave.ui.OctaveMFileTableTypeEditingSupport;
import gov.redhawk.ide.octave.ui.OctaveProjectProperties;
import gov.redhawk.ide.octave.ui.OctaveVariableMappingEnum;
import gov.redhawk.ide.octave.ui.OctaveVariableTypeEnum;

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

import mil.jpeojtrs.sca.spd.Implementation;
import mil.jpeojtrs.sca.spd.SoftPkg;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.ValidationStatusProvider;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.databinding.wizard.WizardPageSupport;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.plugin.AbstractUIPlugin;

/**
 * @since 8.1
 */
public class MFileVariableMapingWizardPage extends WizardPage implements ICodegenWizardPage {

    private static final ImageDescriptor TITLE_IMAGE = AbstractUIPlugin
            .imageDescriptorFromPlugin(OctaveProjectPlugin.PLUGIN_ID, "icons/octaveLogo.png");
    private static final int NUM_COLUMNS = 1;
    private OctaveProjectProperties octaveProjProps;
    private DataBindingContext dataBindingContext = new DataBindingContext();
    private TableViewerColumn typeColumn;
    private TableViewerColumn mappingColumn;
    private WritableValue validationValue = new WritableValue();
    private IValidator validator = new IValidator() {

        @Override
        public IStatus validate(Object value) {
            StringBuilder builder = new StringBuilder();
            List<OctaveFunctionVariables> vars = new ArrayList<OctaveFunctionVariables>();
            vars.addAll(octaveProjProps.getFunctionInputs());
            vars.addAll(octaveProjProps.getFunctionOutputs());

            for (OctaveFunctionVariables ofv : vars) {
                OctaveVariableMappingEnum mapping = ofv.getMapping();
                OctaveVariableTypeEnum type = ofv.getType();

                if (mapping.equals(OctaveVariableMappingEnum.PORT) && type.equals(OctaveVariableTypeEnum.String)) {
                    builder.append("Variable " + ofv.getName() + " may not have a port type of string.\n");
                }

                if (mapping.equals(OctaveVariableMappingEnum.PROPERTY_SEQUENCE)
                        && type.equals(OctaveVariableTypeEnum.String)) {
                    builder.append(
                            "Variable " + ofv.getName() + " may not have a sequence property of string type.\n");
                }
            }
            IStatus mStatus;
            if (builder.length() == 0) {
                mStatus = Status.OK_STATUS;
            } else {
                mStatus = new Status(IStatus.ERROR, OctaveProjectPlugin.PLUGIN_ID, builder.toString(), null);
            }
            validationValue.setValue(mStatus);
            return mStatus;
        }
    };

    // These aren't really used but are needed because of the inheritance 
    private Implementation impl;
    private ImplementationSettings implSettings;

    public MFileVariableMapingWizardPage(OctaveProjectProperties octaveProjProps, String name,
            String componentType) {
        super(name, "Map M-file", MFileVariableMapingWizardPage.TITLE_IMAGE);
        this.octaveProjProps = octaveProjProps;
        validationValue.setValue(Status.OK_STATUS);
    }

    @Override
    public void createControl(Composite parent) {
        final Composite client = new Composite(parent, SWT.NULL);

        // Creates the basic layout of the UI elements
        createUIElements(client);

        this.setControl(client);
    }

    private void createUIElements(Composite client) {
        client.setLayout(new GridLayout(MFileVariableMapingWizardPage.NUM_COLUMNS, false));

        final Group mFileInputsGroup = new Group(client, SWT.None);
        mFileInputsGroup.setLayout(new GridLayout(1, false));
        mFileInputsGroup.setLayoutData(GridDataFactory.fillDefaults().grab(true, true)
                .span(MFileVariableMapingWizardPage.NUM_COLUMNS, 1).create());
        mFileInputsGroup.setText("Inputs");

        final Group mFileOutputsGroup = new Group(client, SWT.None);
        mFileOutputsGroup.setLayout(new GridLayout(1, false));
        mFileOutputsGroup.setLayoutData(GridDataFactory.fillDefaults().grab(true, true)
                .span(MFileVariableMapingWizardPage.NUM_COLUMNS, 1).create());
        mFileOutputsGroup.setText("Outputs");

        createOctaveTable(mFileInputsGroup, "functionInputs");
        createOctaveTable(mFileOutputsGroup, "functionOutputs");

        dataBindingContext.addValidationStatusProvider(new ValidationStatusProvider() {
            private IObservableList list = new WritableList();
            {
                list.add(validationValue);
            }

            @Override
            public IObservableValue getValidationStatus() {
                return validationValue;
            }

            @Override
            public IObservableList getTargets() {
                return list;
            }

            @Override
            public IObservableList getModels() {
                return Observables.emptyObservableList();
            }
        });

        WizardPageSupport.create(this, this.dataBindingContext);

        this.setControl(client);
    }

    private void createOctaveTable(Group mFileInputsGroup, String propName) {
        // Example code found: http://www.subshell.com/en/subshell/blog/Eclipse-RCP-Comboboxes-inside-a-JFace-TableViewer100.html
        TableLayout theTableLayout = new TableLayout();
        theTableLayout.addColumnData(new ColumnWeightData(1));
        theTableLayout.addColumnData(new ColumnWeightData(1));
        theTableLayout.addColumnData(new ColumnWeightData(1));

        Table theTable = new Table(mFileInputsGroup, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL);
        theTable.setLinesVisible(true);
        theTable.setHeaderVisible(true);
        theTable.setLayout(theTableLayout);

        TableViewer theTableViewer = new TableViewer(theTable);
        theTableViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        TableViewerColumn nameIDColumn = new TableViewerColumn(theTableViewer, SWT.NONE);
        nameIDColumn.getColumn().setText("Name/ID");

        mappingColumn = new TableViewerColumn(theTableViewer, SWT.NONE);
        mappingColumn.getColumn().setText("Mapping");

        typeColumn = new TableViewerColumn(theTableViewer, SWT.NONE);
        typeColumn.getColumn().setText("Type");

        theTableViewer.setContentProvider(new ArrayContentProvider());
        theTableViewer.setLabelProvider(new OctaveMFileTableLabelProvider());

        Binding binding = this.dataBindingContext.bindValue(ViewerProperties.input().observe(theTableViewer),
                BeanProperties.value(propName).observe(this.octaveProjProps), null, null);

        EditingSupport octaveTypeEditingSupport = new OctaveMFileTableTypeEditingSupport(typeColumn.getViewer(),
                this.validator);
        typeColumn.setEditingSupport(octaveTypeEditingSupport);

        EditingSupport octaveMappingEditingSupport = new OctaveMFileTableMappingEditingSupport(
                mappingColumn.getViewer(), this.validator);
        mappingColumn.setEditingSupport(octaveMappingEditingSupport);

        // add cool control decoration
        ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT);
    }

    @Override
    public boolean isPageComplete() {
        if (this.octaveProjProps == null || this.octaveProjProps.getPrimaryMFile() == null) {
            return false;
        }

        return super.isPageComplete();
    }

    public DataBindingContext getDataBindingContext() {
        return dataBindingContext;
    }

    @Override
    public void configure(SoftPkg softpkg, Implementation impl, ICodeGeneratorDescriptor desc,
            ImplementationSettings implSettings, String componentType) {
        this.impl = impl;
        this.implSettings = implSettings;
    }

    @Override
    public ImplementationSettings getSettings() {
        return this.implSettings;
    }

    @Override
    public boolean canFinish() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void setCanFlipToNextPage(boolean canFlip) {
        // TODO Auto-generated method stub

    }

    @Override
    public void setCanFinish(boolean canFinish) {
        // TODO Auto-generated method stub

    }

}