/**
* 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.launch.ui.tabs;
import gov.redhawk.model.sca.ScaDomainManager;
import gov.redhawk.model.sca.provider.ScaItemProviderAdapterFactory;
import gov.redhawk.sca.ScaPlugin;
import gov.redhawk.sca.launch.ScaLaunchConfigurationConstants;
import gov.redhawk.sca.launch.ui.ScaUIImages;
import gov.redhawk.sca.ui.parts.FormFilteredTree;
import gov.redhawk.sca.ui.wizards.InstallApplicationContentProvider;
import gov.redhawk.sca.ui.wizards.WizardSadItemProviderAdapterFactory;
import gov.redhawk.sca.util.PropertyChangeSupport;
import java.beans.PropertyChangeListener;
import java.util.Comparator;
import mil.jpeojtrs.sca.sad.SoftwareAssembly;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.progress.WorkbenchJob;
/**
*
*/
public class WaveformMainTab extends AbstractLaunchConfigurationTab {
public static final String SAD = "SOFTWARE_ASSEMBLY";
public static final String DOMAIN = "SCA_DOMAIN_MANAGER";
private Image mainImage;
private Button startWaveform;
private InstallApplicationContentProvider contentProvider;
private FormFilteredTree waveformSelectionList;
private ComboViewer domainCombo;
private String waveformProfile;
private final PropertyChangeSupport support = new PropertyChangeSupport(this);
private Button openEditorButton;
private ScaItemProviderAdapterFactory adapterFactory;
public WaveformMainTab() {
this.mainImage = ScaUIImages.DESC_MAIN_TAB.createImage();
}
@Override
public Image getImage() {
return this.mainImage;
}
@Override
public void dispose() {
if (this.adapterFactory != null) {
this.adapterFactory.dispose();
this.adapterFactory = null;
}
if (this.mainImage != null) {
this.mainImage.dispose();
this.mainImage = null;
}
super.dispose();
}
public SoftwareAssembly getSoftwareAssembly() {
return (SoftwareAssembly) ((IStructuredSelection) this.waveformSelectionList.getViewer().getSelection()).getFirstElement();
}
public ScaDomainManager getScaDomainManager() {
return (ScaDomainManager) ((IStructuredSelection) this.domainCombo.getSelection()).getFirstElement();
}
public void addPropertyChangeListener(final PropertyChangeListener listener) {
this.support.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(final PropertyChangeListener listener) {
this.support.removePropertyChangeListener(listener);
}
/**
* {@inheritDoc}
*/
@Override
public void createControl(final Composite parent) {
// create the top level composite for the dialog area
final Composite composite = new Composite(parent, SWT.NONE);
setControl(composite);
composite.setFont(parent.getFont());
composite.setLayout(new GridLayout(2, false));
final Label domainName = new Label(composite, SWT.None);
domainName.setText("Domain:");
this.adapterFactory = new ScaItemProviderAdapterFactory();
this.domainCombo = new ComboViewer(composite, SWT.BORDER);
this.domainCombo.setContentProvider(new ArrayContentProvider());
this.domainCombo.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
this.domainCombo.setInput(ScaPlugin.getDefault().getDomainManagerRegistry(parent.getDisplay()).getDomains());
this.domainCombo.getControl().setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
this.domainCombo.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent event) {
final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
final Object element = selection.getFirstElement();
if (element instanceof ScaDomainManager) {
final ScaDomainManager domain = (ScaDomainManager) element;
WaveformMainTab.this.waveformSelectionList.getViewer().setInput(domain);
} else {
WaveformMainTab.this.waveformSelectionList.getViewer().setInput("");
}
WaveformMainTab.this.support.firePropertyChange(WaveformMainTab.DOMAIN, null, getScaDomainManager());
updateLaunchConfigurationDialog();
}
});
this.waveformSelectionList = new FormFilteredTree(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, new PatternFilter());
this.waveformSelectionList.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).span(2, 1).create());
this.contentProvider = new InstallApplicationContentProvider();
this.contentProvider.addContentCompletionListener(new JobChangeAdapter() {
@Override
public void done(final IJobChangeEvent event) {
WorkbenchJob job = new WorkbenchJob("Restore Selection") {
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
if (!getControl().isDisposed()) {
restorePreviousWaveformSelection();
}
return Status.OK_STATUS;
}
};
job.schedule();
}
});
this.waveformSelectionList.getViewer().setContentProvider(this.contentProvider);
this.waveformSelectionList.getViewer().setLabelProvider(new AdapterFactoryLabelProvider(new WizardSadItemProviderAdapterFactory()));
this.waveformSelectionList.getViewer().setComparator(new ViewerComparator() {
private Comparator<String> viewerComparator;
@Override
protected Comparator<String> getComparator() {
if (this.viewerComparator == null) {
this.viewerComparator = new Comparator<String>() {
@Override
public int compare(final String s1, final String s2) {
return s1.compareToIgnoreCase(s2);
}
};
}
return this.viewerComparator;
}
});
this.startWaveform = new Button(composite, SWT.CHECK);
this.startWaveform.setText("Start the waveform after launching");
this.startWaveform.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).grab(false, false).create());
this.startWaveform.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
updateLaunchConfigurationDialog();
}
});
this.openEditorButton = new Button(composite, SWT.CHECK);
this.openEditorButton.setText("Open editor after launch");
this.openEditorButton.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).grab(false, false).create());
this.openEditorButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
updateLaunchConfigurationDialog();
}
});
this.waveformSelectionList.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent event) {
final Object selected = ((StructuredSelection) event.getSelection()).getFirstElement();
if (selected instanceof SoftwareAssembly) {
final SoftwareAssembly sad = (SoftwareAssembly) selected;
WaveformMainTab.this.waveformProfile = sad.eResource().getURI().path();
} else {
WaveformMainTab.this.waveformProfile = "";
}
WaveformMainTab.this.support.firePropertyChange(WaveformMainTab.SAD, null, getSoftwareAssembly());
updateLaunchConfigurationDialog();
}
});
}
private void restorePreviousWaveformSelection() {
final TreeViewer viewer = this.waveformSelectionList.getViewer();
viewer.refresh();
SoftwareAssembly selection = null;
if (this.contentProvider.getChildren() != null) {
for (final SoftwareAssembly s : this.contentProvider.getChildren()) {
if (s.eResource().getURI().path().equals(this.waveformProfile)) {
selection = s;
}
}
}
if (selection != null) {
viewer.setSelection(new StructuredSelection(selection));
}
}
/**
* {@inheritDoc}
*/
@Override
public void setDefaults(final ILaunchConfigurationWorkingCopy configuration) {
if (this.domainCombo != null) {
this.domainCombo.setSelection(new StructuredSelection());
}
}
@Override
public boolean isValid(final ILaunchConfiguration launchConfig) {
setMessage(null);
setErrorMessage(null);
return validateDomain() && validateWaveformSelection();
}
private boolean validateWaveformSelection() {
final ISelection selection = this.waveformSelectionList.getViewer().getSelection();
if (selection.isEmpty()) {
setErrorMessage("Must select a waveform to launch");
return false;
}
return true;
}
private boolean validateDomain() {
final ISelection selection = this.domainCombo.getSelection();
if (selection.isEmpty()) {
setErrorMessage("Must select a domain");
return false;
}
return true;
}
/**
* {@inheritDoc}
*/
@Override
public void initializeFrom(final ILaunchConfiguration configuration) {
try {
final String domainName = configuration.getAttribute(ScaLaunchConfigurationConstants.ATT_DOMAIN_NAME, "");
this.waveformProfile = configuration.getAttribute(ScaLaunchConfigurationConstants.ATT_PROFILE, "");
final boolean autoStart = configuration.getAttribute(ScaLaunchConfigurationConstants.ATT_START,
ScaLaunchConfigurationConstants.DEFAULT_VALUE_ATT_START);
final boolean openEditor = configuration.getAttribute(ScaLaunchConfigurationConstants.ATT_OPEN,
ScaLaunchConfigurationConstants.DEFAULT_VALUE_ATT_OPEN);
for (final ScaDomainManager domain : ScaPlugin.getDefault().getDomainManagerRegistry(Display.getCurrent()).getDomains()) {
if (domainName.equals(domain.getLabel())) {
this.domainCombo.setSelection(new StructuredSelection(domain));
break;
}
}
this.startWaveform.setSelection(autoStart);
this.openEditorButton.setSelection(openEditor);
restorePreviousWaveformSelection();
} catch (final CoreException e) {
// PASS
}
}
/**
* {@inheritDoc}
*/
@Override
public void performApply(final ILaunchConfigurationWorkingCopy configuration) {
String domainName = "";
final IStructuredSelection domainSelection = (IStructuredSelection) this.domainCombo.getSelection();
final Object domain = domainSelection.getFirstElement();
if (domain instanceof ScaDomainManager) {
domainName = ((ScaDomainManager) domain).getLabel();
}
configuration.setAttribute(ScaLaunchConfigurationConstants.ATT_DOMAIN_NAME, domainName);
configuration.setAttribute(ScaLaunchConfigurationConstants.ATT_START, this.startWaveform.getSelection());
configuration.setAttribute(ScaLaunchConfigurationConstants.ATT_PROFILE, this.waveformProfile);
configuration.setAttribute(ScaLaunchConfigurationConstants.ATT_OPEN, this.openEditorButton.getSelection());
}
/**
* {@inheritDoc}
*/
@Override
public String getName() {
return "Main";
}
}