gov.redhawk.prf.internal.ui.editor.detailspart.StructSequencePropertyDetailsPage.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.prf.internal.ui.editor.detailspart.StructSequencePropertyDetailsPage.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.prf.internal.ui.editor.detailspart;

import gov.redhawk.common.ui.editor.FormLayoutFactory;
import gov.redhawk.prf.internal.ui.editor.PropertiesSection;
import gov.redhawk.prf.internal.ui.editor.composite.BasicStructPropertyComposite;
import gov.redhawk.prf.internal.ui.editor.composite.StructSequencePropertyComposite;
import gov.redhawk.prf.internal.ui.handlers.PropertyHandler;

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

import mil.jpeojtrs.sca.prf.PrfPackage;
import mil.jpeojtrs.sca.prf.Properties;
import mil.jpeojtrs.sca.prf.SimpleRef;
import mil.jpeojtrs.sca.prf.StructSequence;
import mil.jpeojtrs.sca.prf.StructValue;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.ComputedValue;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.FeaturePath;
import org.eclipse.emf.databinding.IEMFListProperty;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

/**
 * The Class SimplePropertyDetailsPage.
 */
public class StructSequencePropertyDetailsPage extends BasicStructPropertyDetailsPage {

    private StructSequencePropertyComposite structSequenceComposite;
    private StructSequence sequence;

    /**
     * Instantiates a new simple property details page.
     * 
     * @param section the section
     */
    public StructSequencePropertyDetailsPage(final PropertiesSection section) {
        super(section);
    }

    /**
     * @param parent
     * @param toolkit
     */
    @Override
    protected BasicStructPropertyComposite createSection(final Composite parent, final FormToolkit toolkit) {
        final Section newSection = toolkit.createSection(parent, Section.EXPANDED | ExpandableComposite.TITLE_BAR);
        newSection.clientVerticalSpacing = FormLayoutFactory.SECTION_HEADER_VERTICAL_SPACING;
        newSection.setText("Struct Sequence Property");
        newSection.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());

        // Align the master and details section headers (misalignment caused
        // by section toolbar icons)
        getPage().alignSectionHeaders(getSection().getSection(), newSection);

        this.structSequenceComposite = new StructSequencePropertyComposite(newSection, SWT.NONE, toolkit);
        toolkit.adapt(this.structSequenceComposite);
        newSection.setClient(this.structSequenceComposite);
        return this.structSequenceComposite;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void addListeners() {
        super.addListeners();

        /**
         * Add a new StructValue.
         */
        this.structSequenceComposite.getAddButton().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                PropertyHandler.addStructValue(getAdapterFactory(), getEditingDomain(),
                        StructSequencePropertyDetailsPage.this.sequence);
            }
        });

        /**
         * Remove the selected StructValues from the sequence.
         */
        this.structSequenceComposite.getRemoveButton().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                final List<Object> removeStructVals = new ArrayList<Object>();
                for (final Object obj : getSelection()) {
                    if (obj instanceof StructValue) {
                        removeStructVals.add(obj);
                    }
                }
                PropertyHandler.removeProperty(getAdapterFactory(), getEditingDomain(),
                        (Properties) StructSequencePropertyDetailsPage.this.sequence.eContainer(),
                        removeStructVals);
                StructSequencePropertyDetailsPage.this.structSequenceComposite.getStructValueViewer().refresh();
            }
        });

        /**
         * Enable remove button if a StructValue is selected.  Update the page selection.
         */
        this.structSequenceComposite.getStructValueViewer()
                .addSelectionChangedListener(new ISelectionChangedListener() {

                    /**
                     * {@inheritDoc}
                     */
                    @Override
                    public void selectionChanged(final SelectionChangedEvent event) {
                        final List<Object> selection = getSelection();
                        boolean remove = !selection.isEmpty();
                        if (remove) {
                            for (final Object obj : getSelection()) {
                                if (obj instanceof SimpleRef) {
                                    remove = false;
                                    break;
                                }
                            }
                        }
                        StructSequencePropertyDetailsPage.this.structSequenceComposite.getRemoveButton()
                                .setEnabled(remove);
                        getPage().setSelection(event.getSelection());
                    }
                });
    }

    /**
     * Gets the current selection from the viewer.
     * 
     * @return the list of selected objects
     */
    private List<Object> getSelection() {
        return Arrays
                .asList(((IStructuredSelection) this.structSequenceComposite.getStructValueViewer().getSelection())
                        .toArray());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected List<Binding> bind(final DataBindingContext context, final EObject input) {
        final List<Binding> bindings = super.bind(context, input);
        this.sequence = (StructSequence) input;

        this.structSequenceComposite.getStructValueViewer().setInput(this.sequence);
        final IObservableValue target = SWTObservables.observeEnabled(this.structSequenceComposite.getAddButton());

        final IEMFListProperty property = EMFProperties.list(FeaturePath
                .fromList(PrfPackage.Literals.STRUCT_SEQUENCE__STRUCT, PrfPackage.Literals.STRUCT__SIMPLE));
        final IObservableList list = property.observe(this.sequence);

        final IObservableValue value = new ComputedValue() {
            @Override
            protected Object calculate() {
                return list.isEmpty();
            }
        };
        //Only enable the button if the list isn't empty
        bindings.add(context.bindValue(target, value, null, new UpdateValueStrategy() {
            @Override
            public Object convert(final Object value) {
                return !((Boolean) value);

            }
        }));

        return bindings;
    }
}