/*******************************************************************************
* 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.sad.internal.ui.wizard;
import gov.redhawk.common.ui.AdapterFactoryCellLabelProvider;
import java.util.ArrayList;
import java.util.List;
import mil.jpeojtrs.sca.partitioning.ComponentInstantiation;
import mil.jpeojtrs.sca.partitioning.ComponentSupportedInterface;
import mil.jpeojtrs.sca.partitioning.ComponentSupportedInterfaceStub;
import mil.jpeojtrs.sca.partitioning.ProvidesPort;
import mil.jpeojtrs.sca.partitioning.ProvidesPortStub;
import mil.jpeojtrs.sca.partitioning.UsesPort;
import mil.jpeojtrs.sca.partitioning.UsesPortStub;
import mil.jpeojtrs.sca.partitioning.provider.PartitioningItemProviderAdapterFactory;
import mil.jpeojtrs.sca.sad.SadComponentInstantiation;
import mil.jpeojtrs.sca.sad.SoftwareAssembly;
import mil.jpeojtrs.sca.sad.provider.SadItemProviderAdapterFactory;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.Disposable;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;
/**
*
*/
public class ExternalPortWizard extends Wizard implements IWorkbenchWizard {
private class ExternalPortWizardPage extends WizardPage {
private SadComponentInstantiation componentSelection;
private EObject portSelection;
private Disposable disposable;
private AdapterFactory adapterFactory;
private TableViewer componentViewer;
private TableViewer portViewer;
private String portDescription;
protected ExternalPortWizardPage(final String pageName, final ImageDescriptor titleImage) {
super(pageName, "External Port", titleImage);
this.setDescription("Select the component and then the port of the component you wish to be marked as an "
+ "external port.");
this.disposable = new Disposable();
this.adapterFactory = createAdapterFactory();
}
@Override
public void createControl(final Composite parent) {
final Composite composite = new Composite(parent, SWT.None);
composite.setLayout(new GridLayout());
createSelectComponent(composite);
createSelectPort(composite);
createDescription(composite);
setPageComplete(false);
setControl(composite);
}
@Override
public void dispose() {
disposable.dispose();
super.dispose();
}
private AdapterFactory createAdapterFactory() {
AdapterFactory factory = new ComposedAdapterFactory(new AdapterFactory[] { new SadItemProviderAdapterFactory(), new PartitioningItemProviderAdapterFactory() });
disposable.add(factory);
return factory;
}
private void createDescription(final Composite composite) {
Label label = new Label(composite, SWT.NONE);
label.setText("Description (Optional):");
final Text text = new Text(composite, SWT.MULTI | SWT.BORDER);
text.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, 150).create());
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(final ModifyEvent e) {
ExternalPortWizardPage.this.portDescription = text.getText();
}
});
}
private void createSelectPort(final Composite composite) {
Label label = new Label(composite, SWT.None);
label.setText("Select Port:");
this.portViewer = new TableViewer(composite, SWT.SINGLE | SWT.BORDER);
final TableLayout tableLayout = new TableLayout();
tableLayout.addColumnData(new ColumnWeightData(100, 10, false)); // SUPPRESS CHECKSTYLE MagicNumber
this.portViewer.getTable().setLayout(tableLayout);
this.portViewer.getTable().setLayoutData(GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, 150).create());
new TableViewerColumn(this.portViewer, SWT.LEFT);
this.portViewer.setLabelProvider(new AdapterFactoryCellLabelProvider(this.adapterFactory));
this.portViewer.setContentProvider(new 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 ComponentInstantiation ci = (ComponentInstantiation) inputElement;
final List<EObject> retVal = new ArrayList<EObject>();
retVal.addAll(ci.getUses());
retVal.addAll(ci.getProvides());
return retVal.toArray();
}
});
this.portViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent event) {
ExternalPortWizardPage.this.portSelection = (EObject) ((IStructuredSelection) event.getSelection()).getFirstElement();
updatePageComplete();
}
});
this.portViewer.setComparator(new ViewerComparator() {
@Override
public int category(final Object element) {
if (element instanceof ComponentSupportedInterface || element instanceof ComponentSupportedInterfaceStub) {
return 1;
}
if (element instanceof ProvidesPort || element instanceof ProvidesPortStub) {
return 2;
}
if (element instanceof UsesPort || element instanceof UsesPortStub) {
return 3; // SUPPRESS CHECKSTYLE MagicNumber
}
return super.category(element);
}
});
}
private void createSelectComponent(final Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setText("Select Component:");
this.componentViewer = new TableViewer(parent, SWT.SINGLE | SWT.BORDER);
final TableLayout tableLayout = new TableLayout();
tableLayout.addColumnData(new ColumnWeightData(100, 10, false)); // SUPPRESS CHECKSTYLE MagicNumber
this.componentViewer.getTable().setLayout(tableLayout);
this.componentViewer.getTable().setLayoutData(GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, 150).create());
new TableViewerColumn(this.componentViewer, SWT.LEFT);
this.componentViewer.setLabelProvider(new AdapterFactoryCellLabelProvider(this.adapterFactory));
this.componentViewer.setComparator(new ViewerComparator());
this.componentViewer.setContentProvider(new 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) {
List<SadComponentInstantiation> instantiations = ((SoftwareAssembly) inputElement).getAllComponentInstantiations();
return instantiations.toArray();
}
});
this.componentViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent event) {
ExternalPortWizardPage.this.componentSelection = (SadComponentInstantiation) ((IStructuredSelection) event.getSelection())
.getFirstElement();
ExternalPortWizardPage.this.portViewer.setInput(ExternalPortWizardPage.this.componentSelection);
updatePageComplete();
}
});
this.componentViewer.setInput(ExternalPortWizard.this.softwareAssembly);
}
private void updatePageComplete() {
setPageComplete(this.componentSelection != null && this.portSelection != null);
}
}
private ExternalPortWizardPage page;
private IStructuredSelection selection;
private SoftwareAssembly softwareAssembly;
public ExternalPortWizard() {
this.setWindowTitle("Add external Port");
this.setNeedsProgressMonitor(false);
this.setHelpAvailable(false);
}
@Override
public void addPages() {
this.page = new ExternalPortWizardPage("externalPort", null);
this.addPage(this.page);
}
public EObject getPortSelection() {
return this.page.portSelection;
}
public SadComponentInstantiation getComponentSelection() {
return this.page.componentSelection;
}
public String getPortDescription() {
return this.page.portDescription;
}
@Override
public boolean performFinish() {
return true;
}
public void setSoftwareAssembly(final SoftwareAssembly softwareAssembly) {
this.softwareAssembly = softwareAssembly;
}
public SoftwareAssembly getSoftwareAssembly() {
return this.softwareAssembly;
}
@Override
public void init(final IWorkbench workbench, final IStructuredSelection selection) {
this.selection = selection;
if (this.selection.getFirstElement() instanceof SoftwareAssembly) {
setSoftwareAssembly((SoftwareAssembly) this.selection.getFirstElement());
}
}
}