/*******************************************************************************
* 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.section;
import gov.redhawk.common.ui.editor.FormLayoutFactory;
import gov.redhawk.common.ui.parts.FormEntry;
import gov.redhawk.ide.sad.internal.ui.composite.GeneralInformationComposite;
import gov.redhawk.ide.sad.internal.ui.editor.SadOverviewPage;
import gov.redhawk.ui.editor.FormEntryAdapter;
import gov.redhawk.ui.editor.SCAFormEditor;
import gov.redhawk.ui.editor.ScaSection;
import gov.redhawk.ui.util.EMFEmptyStringToNullUpdateValueStrategy;
import gov.redhawk.ui.util.SCAEditorUtil;
import java.util.ArrayList;
import java.util.Collection;
import mil.jpeojtrs.sca.partitioning.ComponentInstantiation;
import mil.jpeojtrs.sca.partitioning.ComponentInstantiationRef;
import mil.jpeojtrs.sca.partitioning.PartitioningPackage;
import mil.jpeojtrs.sca.sad.AssemblyController;
import mil.jpeojtrs.sca.sad.SadComponentInstantiationRef;
import mil.jpeojtrs.sca.sad.SadFactory;
import mil.jpeojtrs.sca.sad.SadPackage;
import mil.jpeojtrs.sca.sad.SoftwareAssembly;
import mil.jpeojtrs.sca.util.DceUuidUtil;
import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.conversion.Converter;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
import org.eclipse.emf.databinding.edit.EMFEditObservables;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.progress.WorkbenchJob;
/**
* The Class GeneralInfoSection.
*/
public class GeneralInfoSection extends ScaSection {
private class Listener extends EContentAdapter {
private final EObject root;
public Listener(final EObject root) {
this.root = root;
root.eAdapters().add(this);
}
public void dispose() {
this.root.eAdapters().remove(this);
}
@Override
public void notifyChanged(final Notification notification) {
super.notifyChanged(notification);
final Object feature = notification.getFeature();
if (feature == PartitioningPackage.Literals.PARTITIONING__COMPONENT_PLACEMENT
|| feature == SadPackage.Literals.HOST_COLLOCATION__COMPONENT_PLACEMENT
|| feature == PartitioningPackage.Literals.COMPONENT_PLACEMENT__COMPONENT_INSTANTIATION
|| feature == PartitioningPackage.Literals.COMPONENT_INSTANTIATION__USAGE_NAME) {
final WorkbenchJob job = new WorkbenchJob("Refresh Assembly Controller Combo") {
@Override
public IStatus runInUIThread(final IProgressMonitor monitor) {
refreshAssemblyControllerItems();
return Status.OK_STATUS;
}
};
job.setUser(false);
job.setSystem(true);
job.schedule();
}
}
}
private GeneralInformationComposite client;
private Listener listener;
private Resource sadResource;
private Collection<Binding> bindings = new ArrayList<Binding>();
/**
* Instantiates a new general info section.
*
* @param page the page
* @param parent the parent
*/
public GeneralInfoSection(final SadOverviewPage page, final Composite parent) {
super(page, parent, Section.DESCRIPTION);
createClient(getSection(), page.getEditor().getToolkit());
}
/**
* {@inheritDoc}
*/
@Override
protected void createClient(final Section section, final FormToolkit toolkit) {
section.setText("General Information");
section.setLayout(FormLayoutFactory.createClearTableWrapLayout(false, 1));
final TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
section.setLayoutData(data);
section.setDescription("This section describes general information about this waveform.");
final IActionBars actionBars = getPage().getEditor().getEditorSite().getActionBars();
this.client = new GeneralInformationComposite(section, SWT.None, toolkit, actionBars);
section.setClient(this.client);
addListeners(actionBars);
toolkit.adapt(this.client);
toolkit.paintBordersFor(this.client);
}
/**
* Add Listeners to handle Control Events
*
* @param actionBars
*/
private void addListeners(final IActionBars actionBars) {
final FormEntryAdapter fIdEntryAdapter = new FormEntryAdapter(actionBars) {
@Override
public void buttonSelected(final FormEntry entry) {
execute(SetCommand.create(getEditingDomain(), getSoftwareAssembly(), SadPackage.Literals.SOFTWARE_ASSEMBLY__ID, DceUuidUtil.createDceUUID()));
}
};
this.client.getIdEntry().setFormEntryListener(fIdEntryAdapter);
}
/**
* @param create
*/
protected void execute(final Command command) {
getEditingDomain().getCommandStack().execute(command);
}
/**
* Gets the editing domain.
*
* @return the editing domain
*/
private EditingDomain getEditingDomain() {
return getPage().getEditor().getEditingDomain();
}
/**
* @return
*/
private UpdateValueStrategy createAssemblyControllerModelToTarget() {
final EMFUpdateValueStrategy retVal = new EMFUpdateValueStrategy();
retVal.setConverter(new Converter(AssemblyController.class, ComponentInstantiation.class) {
@Override
public Object convert(final Object fromObject) {
if (fromObject instanceof AssemblyController) {
final AssemblyController asm = (AssemblyController) fromObject;
final ComponentInstantiationRef< ? > inst = asm.getComponentInstantiationRef();
if (inst != null) {
return inst.getInstantiation();
}
}
return null;
}
});
return retVal;
}
/**
* @return
*/
private UpdateValueStrategy createAssemblyControllerTargetToModel() {
final EMFEmptyStringToNullUpdateValueStrategy retVal = new EMFEmptyStringToNullUpdateValueStrategy();
retVal.setConverter(new Converter(ComponentInstantiation.class, AssemblyController.class) {
@Override
public Object convert(final Object fromObject) {
if (fromObject instanceof ComponentInstantiation) {
final ComponentInstantiation inst = (ComponentInstantiation) fromObject;
final String id = inst.getId();
final SadComponentInstantiationRef ref = SadFactory.eINSTANCE.createSadComponentInstantiationRef();
ref.setRefid(id);
final AssemblyController asm = SadFactory.eINSTANCE.createAssemblyController();
asm.setComponentInstantiationRef(ref);
return asm;
}
return null;
}
});
return retVal;
}
/**
*
*/
private void refreshAssemblyControllerItems() {
if (this.listener != null) {
this.listener.dispose();
}
final SoftwareAssembly sad = getSoftwareAssembly();
if (sad != null) {
this.listener = new Listener(sad);
this.client.getAssemblyControllerPart().setItems(ItemPropertyDescriptor.getReachableObjectsOfType(sad,
PartitioningPackage.Literals.COMPONENT_INSTANTIATION));
}
}
/**
* {@inheritDoc}
*/
@Override
public void dispose() {
if (this.listener != null) {
this.listener.dispose();
}
super.dispose();
}
/**
* TODO
*
* @param readOnly
*/
private void setEditable(final boolean editable) {
this.client.setEditable(editable);
}
private SoftwareAssembly getSoftwareAssembly() {
if (this.sadResource == null) {
return null;
}
return SoftwareAssembly.Util.getSoftwareAssembly(this.sadResource);
}
/**
* {@inheritDoc}
*/
@Override
public void refresh(final Resource resource) {
this.sadResource = resource;
for (final Binding binding : this.bindings) {
binding.dispose();
}
this.bindings.clear();
refreshAssemblyControllerItems();
final SoftwareAssembly model = getSoftwareAssembly();
if (model == null) {
return;
}
final DataBindingContext context = this.getPage().getEditor().getDataBindingContext();
this.bindings = new ArrayList<Binding>();
this.bindings.add(context.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(),
this.client.getIdEntry().getText()),
EMFEditObservables.observeValue(getEditingDomain(), model, SadPackage.Literals.SOFTWARE_ASSEMBLY__ID),
new EMFEmptyStringToNullUpdateValueStrategy(),
null));
this.bindings.add(context.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(),
this.client.getVersionEntry().getText()),
EMFEditObservables.observeValue(getEditingDomain(), model, SadPackage.Literals.SOFTWARE_ASSEMBLY__VERSION),
new EMFEmptyStringToNullUpdateValueStrategy(),
null));
this.bindings.add(context.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(),
this.client.getNameEntry().getText()),
EMFEditObservables.observeValue(getEditingDomain(), model, SadPackage.Literals.SOFTWARE_ASSEMBLY__NAME),
new EMFEmptyStringToNullUpdateValueStrategy(),
null));
this.bindings.add(context.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(),
this.client.getDescriptionEntry().getText()),
EMFEditObservables.observeValue(getEditingDomain(), model, SadPackage.Literals.SOFTWARE_ASSEMBLY__DESCRIPTION),
new EMFEmptyStringToNullUpdateValueStrategy(),
null));
this.bindings.add(context.bindValue(ViewersObservables.observeSingleSelection(this.client.getAssemblyControllerPart().getViewer()),
EMFEditObservables.observeValue(getEditingDomain(), model, SadPackage.Literals.SOFTWARE_ASSEMBLY__ASSEMBLY_CONTROLLER),
createAssemblyControllerTargetToModel(),
createAssemblyControllerModelToTarget()));
setEditable(SCAEditorUtil.isEditableResource(getPage(), this.sadResource));
}
}