gov.redhawk.sca.ui.DeviceAssignmentComposite.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.sca.ui.DeviceAssignmentComposite.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.sca.ui;

import gov.redhawk.model.sca.ScaDevice;
import gov.redhawk.model.sca.ScaDeviceManager;
import gov.redhawk.model.sca.ScaDomainManager;
import gov.redhawk.model.sca.ScaPackage;
import gov.redhawk.model.sca.commands.ScaModelCommand;
import gov.redhawk.sca.util.PropertyChangeSupport;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import mil.jpeojtrs.sca.sad.SadComponentInstantiation;
import mil.jpeojtrs.sca.sad.SadComponentPlacement;
import mil.jpeojtrs.sca.sad.SoftwareAssembly;

import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ListDialog;

import CF.DeviceAssignmentType;

/**
 * @since 8.0
 * 
 */
public class DeviceAssignmentComposite extends Composite {

    private static class DeviceAssignmentRef {
        public static final String PROP_DEVICE = "device";

        private final SadComponentInstantiation component;
        private ScaDevice<?> device;
        private final PropertyChangeSupport beanSupport = new PropertyChangeSupport(this);

        public DeviceAssignmentRef(final SadComponentInstantiation component) {
            super();
            this.component = component;
        }

        public SadComponentInstantiation getComponent() {
            return this.component;
        }

        public ScaDevice<?> getDevice() {
            return this.device;
        }

        public void addPropertyChangeListener(final PropertyChangeListener listener) {
            this.beanSupport.addPropertyChangeListener(listener);
        }

        public void setDevice(final ScaDevice<?> device) {
            final ScaDevice<?> oldValue = this.device;
            this.device = device;
            this.beanSupport.firePropertyChange(DeviceAssignmentRef.PROP_DEVICE, oldValue, this.device);
        }
    }

    private static class ComponentLabelProvider extends CellLabelProvider {

        @Override
        public void update(final ViewerCell cell) {
            final DeviceAssignmentRef ref = (DeviceAssignmentRef) cell.getElement();
            cell.setText(ref.getComponent().getUsageName());
        }

    }

    private static class DeviceSelectionContentProvider implements IStructuredContentProvider {

        @Override
        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {

        }

        @Override
        public void dispose() {

        }

        @Override
        public Object[] getElements(final Object inputElement) {
            final List<Object> retVal = new ArrayList<Object>();
            retVal.add("AUTO");
            if (inputElement instanceof ScaDomainManager) {
                final ScaDomainManager domain = (ScaDomainManager) inputElement;
                ScaModelCommand.execute(domain, new ScaModelCommand() {

                    @Override
                    public void execute() {
                        final Set<ScaDevice<?>> devices = new HashSet<ScaDevice<?>>();
                        for (final ScaDeviceManager devMgr : domain.getDeviceManagers()) {
                            devices.addAll(devMgr.getAllDevices());
                        }
                        retVal.addAll(devices);
                    }
                });
            }
            return retVal.toArray();
        }
    }

    private static class DeviceSelectionLabelProvider extends LabelProvider {
        @Override
        public String getText(final Object element) {
            if (element instanceof ScaDevice<?>) {
                return ((ScaDevice<?>) element).getLabel();
            }
            return "AUTO";
        }
    }

    private static class DeviceLabelProvider extends CellLabelProvider {

        @Override
        public void update(final ViewerCell cell) {
            final DeviceAssignmentRef ref = (DeviceAssignmentRef) cell.getElement();
            if (ref.getDevice() == null) {
                cell.setText("AUTO");
            } else {
                cell.setText(ref.getDevice().getLabel());
            }
        }

    }

    private static class DeviceEditingSupport extends EditingSupport {

        private final ComboBoxViewerCellEditor cellViewer;

        public DeviceEditingSupport(final ColumnViewer viewer) {
            super(viewer);
            this.cellViewer = new ComboBoxViewerCellEditor((Composite) getViewer().getControl());
            this.cellViewer.setLabelProvider(new DeviceSelectionLabelProvider());
            this.cellViewer.setContentProvider(new DeviceSelectionContentProvider());

        }

        public void setScaDomainManager(final ScaDomainManager domain) {
            if (domain != null) {
                this.cellViewer.setInput(domain);
            } else {
                this.cellViewer.setInput("");
            }
        }

        @Override
        protected CellEditor getCellEditor(final Object element) {
            return this.cellViewer;
        }

        @Override
        protected boolean canEdit(final Object element) {
            return true;
        }

        @Override
        protected Object getValue(final Object element) {
            Object retVal = ((DeviceAssignmentRef) element).getDevice();
            if (retVal == null) {
                retVal = "AUTO";
            }
            return retVal;
        }

        @Override
        protected void setValue(final Object element, final Object value) {
            if (value instanceof ScaDevice<?>) {
                ((DeviceAssignmentRef) element).setDevice((ScaDevice<?>) value);
            } else {
                ((DeviceAssignmentRef) element).setDevice(null);
            }
            getViewer().refresh(element);
        }

    }

    private final Adapter domainListener = new AdapterImpl() {
        @Override
        public void notifyChanged(final org.eclipse.emf.common.notify.Notification msg) {
            switch (msg.getFeatureID(ScaDomainManager.class)) {
            case ScaPackage.SCA_DOMAIN_MANAGER__CONNECTED:
                if (DeviceAssignmentComposite.this.disposed) {
                    if (msg.getNotifier() instanceof EObject) {
                        ((EObject) msg.getNotifier()).eAdapters().remove(this);
                    }
                    return;
                }
                if (msg.getNewBooleanValue()) {
                    PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {

                        @Override
                        public void run() {
                            if (DeviceAssignmentComposite.this.disposed) {
                                return;
                            }
                            restoreSettings(DeviceAssignmentComposite.this.currentSettings);
                            if (!DeviceAssignmentComposite.this.deviceAssignmentViewer.getControl().isDisposed()) {
                                DeviceAssignmentComposite.this.deviceAssignmentViewer.refresh();
                            }
                        }

                    });
                }
                break;
            default:
                break;
            }
        }
    };

    private boolean disposed;

    private List<DeviceAssignmentRef> deviceAssignments = new ArrayList<DeviceAssignmentComposite.DeviceAssignmentRef>();
    private TableViewer deviceAssignmentViewer;
    private ScaDomainManager domain;
    private DeviceEditingSupport deviceEditor;

    private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
    private final PropertyChangeListener listener = new PropertyChangeListener() {

        @Override
        public void propertyChange(final PropertyChangeEvent evt) {
            DeviceAssignmentComposite.this.propertyChangeSupport.firePropertyChange(evt);
        }
    };

    private Map<String, String> currentSettings;

    public DeviceAssignmentComposite(final Composite parent, final int style) {
        super(parent, style);
        createControl();
    }

    @Override
    public void dispose() {
        this.disposed = true;
        super.dispose();
    }

    public void setScaDomainManager(final ScaDomainManager domain) {
        if (this.domain != null) {
            this.domain.eAdapters().remove(this.domainListener);
        }
        this.domain = domain;
        if (this.deviceEditor != null) {
            this.deviceEditor.setScaDomainManager(this.domain);
        }
        if (this.domain != null) {
            this.domain.eAdapters().add(this.domainListener);
        }
        if (this.deviceAssignmentViewer != null) {
            restoreSettings(this.currentSettings);
            this.deviceAssignmentViewer.refresh();
        }
    }

    private void createControl() {
        setLayout(new GridLayout(2, false));

        final Composite composite = new Composite(this, SWT.NONE);
        composite.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).grab(true, true).create());
        final TableColumnLayout tableLayout = new TableColumnLayout();
        composite.setLayout(tableLayout);

        this.deviceAssignmentViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.SINGLE);
        this.deviceAssignmentViewer.setContentProvider(new ArrayContentProvider());
        this.deviceAssignmentViewer.getTable().setHeaderVisible(true);
        this.deviceAssignmentViewer.getTable().setLinesVisible(true);

        final TableViewerColumn componentColumn = new TableViewerColumn(this.deviceAssignmentViewer, SWT.LEFT);
        componentColumn.setLabelProvider(new ComponentLabelProvider());
        componentColumn.getColumn().setText("Component");

        final TableViewerColumn deviceColumn = new TableViewerColumn(this.deviceAssignmentViewer, SWT.CENTER);
        deviceColumn.setLabelProvider(new DeviceLabelProvider());
        deviceColumn.getColumn().setText("Device");
        this.deviceEditor = new DeviceEditingSupport(this.deviceAssignmentViewer);
        this.deviceEditor.setScaDomainManager(this.domain);
        deviceColumn.setEditingSupport(this.deviceEditor);

        tableLayout.setColumnData(componentColumn.getColumn(), new ColumnWeightData(150));
        tableLayout.setColumnData(deviceColumn.getColumn(), new ColumnWeightData(280));

        new Label(this, SWT.None).setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());

        final Button applyToAll = new Button(this, SWT.PUSH);
        applyToAll.setText("Apply To All...");
        applyToAll.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                handleApplyToAll();
            }

        });
        applyToAll.setLayoutData(GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).create());

    }

    public void setSoftwareAssembly(final SoftwareAssembly waveformFactory) {
        this.deviceAssignments = new ArrayList<DeviceAssignmentRef>();
        if (waveformFactory != null) {
            for (final SadComponentPlacement cp : waveformFactory.getPartitioning().getComponentPlacement()) {
                for (final SadComponentInstantiation ci : cp.getComponentInstantiation()) {
                    final DeviceAssignmentRef ref = new DeviceAssignmentRef(ci);
                    this.deviceAssignments.add(ref);
                    ref.addPropertyChangeListener(this.listener);
                }
            }
        }
        if (this.deviceAssignmentViewer != null) {
            this.deviceAssignmentViewer.setInput(this.deviceAssignments);
        }
    }

    private void handleApplyToAll() {
        final ListDialog dialog = new ListDialog(getShell());
        dialog.setContentProvider(new DeviceSelectionContentProvider());
        dialog.setLabelProvider(new DeviceSelectionLabelProvider());
        dialog.setMessage("Select Device to apply to all components:");
        dialog.setTitle("Apply To All");
        if (this.domain != null) {
            dialog.setInput(this.domain);
        }
        if (dialog.open() == Window.OK) {
            ScaDevice<?> device = null;
            if (dialog.getResult().length > 0 && dialog.getResult()[0] instanceof ScaDevice<?>) {
                device = (ScaDevice<?>) dialog.getResult()[0];
            }
            for (final DeviceAssignmentRef ref : this.deviceAssignments) {
                ref.setDevice(device);
            }
            this.deviceAssignmentViewer.refresh();
        }
    }

    public void storeSettings(final Map<String, String> deviceAssignmentMap) {
        for (final DeviceAssignmentRef ref : this.deviceAssignments) {
            final ScaDevice<?> device = ref.getDevice();
            if (device != null) {
                deviceAssignmentMap.put(ref.getComponent().getId(), device.getIdentifier());
            } else {
                deviceAssignmentMap.put(ref.getComponent().getId(), null);
            }
        }
    }

    public DeviceAssignmentType[] getDeviceAssignment() {
        final List<DeviceAssignmentType> retVal = new ArrayList<DeviceAssignmentType>();
        final Map<String, String> deviceAssignment = new HashMap<String, String>();
        storeSettings(deviceAssignment);
        for (final Map.Entry<String, String> entry : deviceAssignment.entrySet()) {
            if (entry.getValue() != null) {
                retVal.add(new DeviceAssignmentType(entry.getKey(), entry.getValue()));
            }
        }
        return retVal.toArray(new DeviceAssignmentType[retVal.size()]);
    }

    public void restoreSettings(final Map<String, String> deviceAssignmentMap) {
        this.currentSettings = deviceAssignmentMap;
        for (final DeviceAssignmentRef ref : this.deviceAssignments) {
            ScaDevice<?> device = null;
            if (deviceAssignmentMap != null) {
                final String deviceId = deviceAssignmentMap.get(ref.getComponent().getId());
                device = this.domain.getDevice(deviceId);
            }
            ref.setDevice(device);
        }
        if (!this.deviceAssignmentViewer.getControl().isDisposed()) {
            this.deviceAssignmentViewer.refresh();
        }
    }

    public void setDefaults() {
        for (final DeviceAssignmentRef ref : this.deviceAssignments) {
            ref.setDevice(null);
        }
        if (!this.deviceAssignmentViewer.getControl().isDisposed()) {
            this.deviceAssignmentViewer.refresh();
        }
    }

    public void addPropertyChangeListener(final PropertyChangeListener listener) {
        this.propertyChangeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(final PropertyChangeListener listener) {
        this.propertyChangeSupport.removePropertyChangeListener(listener);
    }

}