/******************************************************************************* * 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.spd.internal.ui.editor.wizard; import org.eclipse.core.databinding.Binding; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.conversion.Converter; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.databinding.EMFDataBindingContext; import org.eclipse.emf.databinding.EMFObservables; import org.eclipse.emf.databinding.EMFProperties; import org.eclipse.emf.databinding.EMFUpdateValueStrategy; import org.eclipse.emf.databinding.FeaturePath; import org.eclipse.emf.databinding.IEMFValueProperty; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory; import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.databinding.viewers.ViewersObservables; import org.eclipse.jface.databinding.wizard.WizardPageSupport; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.window.Window; 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.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.part.PageBook; import gov.redhawk.ide.sdr.ui.SdrUiPlugin; import gov.redhawk.ide.sdr.ui.navigator.SdrNavigatorContentProvider; import gov.redhawk.ide.sdr.ui.navigator.SdrNavigatorLabelProvider; import gov.redhawk.ide.sdr.ui.navigator.SdrViewerSorter; import gov.redhawk.ide.spd.internal.ui.editor.provider.ImplementationDetailsSectionPropertyRefItemProvider; import gov.redhawk.ide.spd.internal.ui.parts.PropertyElementSelectorDialog; import gov.redhawk.ui.util.EMFEmptyStringToNullUpdateValueStrategy; import gov.redhawk.ui.validation.EmfValidationStatusProvider; import mil.jpeojtrs.sca.prf.AbstractProperty; import mil.jpeojtrs.sca.prf.Simple; import mil.jpeojtrs.sca.spd.Dependency; import mil.jpeojtrs.sca.spd.Implementation; import mil.jpeojtrs.sca.spd.PropertyRef; import mil.jpeojtrs.sca.spd.SoftPkg; import mil.jpeojtrs.sca.spd.SoftPkgRef; import mil.jpeojtrs.sca.spd.SpdFactory; import mil.jpeojtrs.sca.spd.SpdPackage; import mil.jpeojtrs.sca.util.ScaResourceFactoryUtil; public class DependencyWizardPage extends WizardPage { private static final int NUM_COLUMNS = 3; private static final String PAGE_NAME = "dependencyConfigPage"; private Dependency dependency; private EMFDataBindingContext context; private WizardPageSupport pageSupport; private ComposedAdapterFactory adapterFactory; private PageBook detailsPageBook; private Group propertyRefGroup; private Group softPkgRefGroup; private Text valueText; private Text refIdText; private TreeViewer softPkgRefViewer; private ComboViewer dependencyTypeComboViewer; private final ResourceSet resourceSet = ScaResourceFactoryUtil.createResourceSet(); private final Resource dependencyResource; private Text propNameText; /** * @param pageName * @param title * @param titleImage */ public DependencyWizardPage() { super(DependencyWizardPage.PAGE_NAME, "New Dependency", null); this.setDescription("Set values of new dependency."); setPageComplete(false); this.dependencyResource = this.resourceSet.createResource(URI.createURI("virtual:///dependency.xml")); final Dependency tmp = SpdFactory.eINSTANCE.createDependency(); tmp.setPropertyRef(SpdFactory.eINSTANCE.createPropertyRef()); this.dependencyResource.getContents().add(tmp); setDependency(tmp); } /** * {@inheritDoc} */ @Override public void dispose() { super.dispose(); if (this.pageSupport != null) { this.pageSupport.dispose(); this.pageSupport = null; } if (this.context != null) { this.context.dispose(); this.context = null; } } /** * @return the processor */ public Dependency getDependency() { return this.dependency; } /** * {@inheritDoc} */ @Override public void createControl(final Composite parent) { // Create an adapter factory that yields item providers. // this.adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE); this.adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory()); this.adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory()); final Composite client = new Composite(parent, SWT.NULL); client.setLayout(new GridLayout(2, false)); Label label; final Combo dependencyKindCombo; label = new Label(client, SWT.NULL); label.setText("Kind:"); dependencyKindCombo = new Combo(client, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY); dependencyKindCombo.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(1, 1).create()); dependencyKindCombo.setItems(new String[] { "Property Reference", "Shared Library (SoftPkg) Reference" }); dependencyKindCombo.addModifyListener(new ModifyListener() { @Override public void modifyText(final ModifyEvent e) { if (dependencyKindCombo.getSelectionIndex() == 0) { if (DependencyWizardPage.this.dependency.getPropertyRef() == null) { DependencyWizardPage.this.dependency.setPropertyRef(SpdFactory.eINSTANCE.createPropertyRef()); } DependencyWizardPage.this.dependency.setSoftPkgRef(null); DependencyWizardPage.this.detailsPageBook.showPage(DependencyWizardPage.this.propertyRefGroup); dependencyTypeComboViewer.setInput(new String[] { "allocation", "matching", "other" }); } else if (dependencyKindCombo.getSelectionIndex() == 1) { DependencyWizardPage.this.dependency.setPropertyRef(null); if (DependencyWizardPage.this.dependency.getSoftPkgRef() == null) { DependencyWizardPage.this.dependency.setSoftPkgRef(SpdFactory.eINSTANCE.createSoftPkgRef()); } DependencyWizardPage.this.detailsPageBook.showPage(DependencyWizardPage.this.softPkgRefGroup); dependencyTypeComboViewer.setInput(new String[] { "other" }); } } }); label = new Label(client, SWT.NULL); label.setText("Type:"); this.dependencyTypeComboViewer = new ComboViewer(client, SWT.DROP_DOWN | SWT.BORDER); this.dependencyTypeComboViewer.getControl().setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(1, 1).create()); this.dependencyTypeComboViewer.setContentProvider(new ArrayContentProvider()); this.dependencyTypeComboViewer.setInput(new String[0]); this.dependencyTypeComboViewer.setComparator(new ViewerComparator()); this.detailsPageBook = new PageBook(client, SWT.NONE); this.detailsPageBook.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).span(2, 1).create()); createPropertyRefGroup(this.detailsPageBook); createSoftPkgRefGroup(this.detailsPageBook); if (this.dependency.getSoftPkgRef() != null) { dependencyKindCombo.select(1); this.detailsPageBook.showPage(DependencyWizardPage.this.softPkgRefGroup); } else if (this.dependency.getPropertyRef() != null) { dependencyKindCombo.select(0); this.detailsPageBook.showPage(DependencyWizardPage.this.propertyRefGroup); } else { dependencyKindCombo.select(0); this.detailsPageBook.showPage(DependencyWizardPage.this.propertyRefGroup); } // Bind and validate this.context = new EMFDataBindingContext(); initBindings(); this.context.addValidationStatusProvider(new EmfValidationStatusProvider(this.dependency, this.context, this.adapterFactory)); this.pageSupport = WizardPageSupport.create(this, this.context); this.setControl(client); } private static class SoftPkgRefToViewer extends Converter { public SoftPkgRefToViewer() { super(SoftPkgRef.class, EObject.class); } @Override public Object convert(final Object fromObject) { if (fromObject instanceof SoftPkgRef) { final SoftPkgRef ref = ((SoftPkgRef) fromObject); if (ref.getImplRef() != null) { return ref.getImplementation(); } else { return ref.getSoftPkg(); } } return null; } } private class ViewerToSoftPkgRef extends Converter { public ViewerToSoftPkgRef() { super(EObject.class, SoftPkgRef.class); } @Override public Object convert(final Object fromObject) { SoftPkgRef ref = null; if (fromObject instanceof Implementation) { ref = SpdFactory.eINSTANCE.createSoftPkgRef(); DependencyWizardPage.this.dependencyResource.getContents().add(ref); ref.setImplementation((Implementation) fromObject); } else if (fromObject instanceof SoftPkg) { ref = SpdFactory.eINSTANCE.createSoftPkgRef(); DependencyWizardPage.this.dependencyResource.getContents().add(ref); ref.setSoftPkg((SoftPkg) fromObject); } return ref; } } private void initBindings() { if (this.context == null) { return; } for (final Object obj : this.context.getBindings().toArray()) { if (obj instanceof Binding) { final Binding b = (Binding) obj; this.context.removeBinding(b); b.dispose(); } } final IEMFValueProperty propRefIdPath = EMFProperties.value( FeaturePath.fromList(SpdPackage.Literals.DEPENDENCY__PROPERTY_REF, SpdPackage.Literals.PROPERTY_REF__REF_ID)); final IEMFValueProperty propValuePath = EMFProperties.value( FeaturePath.fromList(SpdPackage.Literals.DEPENDENCY__PROPERTY_REF, SpdPackage.Literals.PROPERTY_REF__VALUE)); @SuppressWarnings("unchecked") IObservableValue< ? > dependencyIdObservable = propRefIdPath.observe(this.dependency); this.context.bindValue(WidgetProperties.text(SWT.Modify).observe(this.refIdText), dependencyIdObservable, new EMFEmptyStringToNullUpdateValueStrategy(), null); final EMFEmptyStringToNullUpdateValueStrategy strategy = new EMFEmptyStringToNullUpdateValueStrategy(); strategy.setConverter(new Converter(PropertyRef.class, String.class) { private final ImplementationDetailsSectionPropertyRefItemProvider itemPropertyRefItemProvider = new ImplementationDetailsSectionPropertyRefItemProvider( DependencyWizardPage.this.adapterFactory); @Override public Object convert(final Object fromObject) { final AbstractProperty prop = this.itemPropertyRefItemProvider.getProperty(DependencyWizardPage.this.dependency.getPropertyRef()); if (prop == null) { return ""; } else { return prop.getName(); } } }); @SuppressWarnings("unchecked") IObservableValue< ? > dependencyIdObservable2 = propRefIdPath.observe(this.dependency); this.context.bindValue(WidgetProperties.text(SWT.None).observe(this.propNameText), dependencyIdObservable2, new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER), strategy); @SuppressWarnings("unchecked") IObservableValue< ? > dependencyValueObservable = propValuePath.observe(this.dependency); this.context.bindValue(WidgetProperties.text(SWT.Modify).observe(this.valueText), dependencyValueObservable, new EMFEmptyStringToNullUpdateValueStrategy(), null); final EMFUpdateValueStrategy targetToModel = new EMFUpdateValueStrategy(); targetToModel.setConverter(new ViewerToSoftPkgRef()); final EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy(); modelToTarget.setConverter(new SoftPkgRefToViewer()); final IEMFValueProperty softPkgRef = EMFProperties.value(FeaturePath.fromList(SpdPackage.Literals.DEPENDENCY__SOFT_PKG_REF)); @SuppressWarnings("unchecked") IObservableValue< ? > dependencySoftPkgObservable = softPkgRef.observe(this.dependency); this.context.bindValue(ViewersObservables.observeSingleSelection(this.softPkgRefViewer), dependencySoftPkgObservable, targetToModel, modelToTarget); this.context.bindValue(WidgetProperties.text().observe(this.dependencyTypeComboViewer.getCombo()), EMFObservables.observeValue(this.dependency, SpdPackage.Literals.DEPENDENCY__TYPE), new EMFEmptyStringToNullUpdateValueStrategy(), null); } private void createSoftPkgRefGroup(final Composite parent) { this.softPkgRefGroup = new Group(parent, SWT.BORDER); this.softPkgRefGroup.setText("Shared Library (SoftPkg) Reference"); this.softPkgRefGroup.setLayout(new FillLayout()); this.softPkgRefViewer = new TreeViewer(this.softPkgRefGroup, SWT.FULL_SELECTION | SWT.SINGLE); this.softPkgRefViewer.setUseHashlookup(true); this.softPkgRefViewer.setContentProvider(new SdrNavigatorContentProvider()); this.softPkgRefViewer.setLabelProvider(new SdrNavigatorLabelProvider()); this.softPkgRefViewer.setComparator(new SdrViewerSorter()); this.softPkgRefViewer.setInput(SdrUiPlugin.getDefault().getTargetSdrRoot().getSharedLibrariesContainer()); } private void createPropertyRefGroup(final Composite parent) { final GridDataFactory fieldTextFactory = GridDataFactory.fillDefaults().grab(true, false).span(1, 1); this.propertyRefGroup = new Group(parent, SWT.BORDER); this.propertyRefGroup.setText("Property Reference"); this.propertyRefGroup.setLayout(new GridLayout(DependencyWizardPage.NUM_COLUMNS, false)); Label label = new Label(this.propertyRefGroup, SWT.NULL); label.setText("RefId:"); this.refIdText = new Text(this.propertyRefGroup, SWT.BORDER); this.refIdText.setLayoutData(fieldTextFactory.create()); final Button propertyRefBrowse = new Button(this.propertyRefGroup, SWT.PUSH); propertyRefBrowse.setText("Browse..."); propertyRefBrowse.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { final PropertyElementSelectorDialog dialog = new PropertyElementSelectorDialog(getShell()); final int result = dialog.open(); if (result == Window.OK) { final Simple sel = (Simple) dialog.getFirstResult(); if (sel != null) { DependencyWizardPage.this.refIdText.setText(sel.getId()); } } } }); label = new Label(this.propertyRefGroup, SWT.None); label.setText("Name:"); this.propNameText = new Text(this.propertyRefGroup, SWT.BORDER | SWT.READ_ONLY); this.propNameText.setEnabled(false); this.propNameText.setLayoutData(fieldTextFactory.span(2, 1).create()); label = new Label(this.propertyRefGroup, SWT.NULL); label.setText("Value:"); this.valueText = new Text(this.propertyRefGroup, SWT.BORDER); this.valueText.setLayoutData(fieldTextFactory.span(2, 1).create()); } /** * Sets the os. * * @param os2 the os2 */ public void setDependency(final Dependency dependency) { this.dependencyResource.getContents().clear(); this.dependency = EcoreUtil.copy(dependency); this.setTitle("Edit Dependency"); this.setDescription("Edit Dependency Value"); this.dependencyResource.getContents().add(this.dependency); initBindings(); } }