/*******************************************************************************
* 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.graphiti.sad.ui.properties;
import gov.redhawk.eclipsecorba.idl.Identifiable;
import gov.redhawk.eclipsecorba.idl.expressions.util.ExpressionsAdapterFactory;
import gov.redhawk.eclipsecorba.idl.operations.provider.OperationsItemProviderAdapterFactory;
import gov.redhawk.eclipsecorba.idl.provider.IdlItemProviderAdapterFactory;
import gov.redhawk.eclipsecorba.idl.types.provider.TypesItemProviderAdapterFactory;
import gov.redhawk.ide.sdr.ui.SdrUiPlugin;
import gov.redhawk.sca.ui.ScaComponentFactory;
import java.util.ArrayList;
import java.util.List;
import mil.jpeojtrs.sca.partitioning.ProvidesPortStub;
import mil.jpeojtrs.sca.partitioning.UsesPortStub;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.ui.platform.GFPropertySection;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
/**
*
*/
public class PortInterfacePropertiesSection extends GFPropertySection implements ITabbedPropertyConstants, IEditingDomainProvider {
private AdapterFactory adapterFactory;
private TreeViewer viewer;
private Label label;
private TreePath[] expandedPaths;
/**
*
*/
public PortInterfacePropertiesSection() {
}
@Override
public TransactionalEditingDomain getEditingDomain() {
return super.getDiagramContainer().getDiagramBehavior().getEditingDomain();
}
protected AdapterFactory createAdapterFactory() {
if (this.adapterFactory == null) {
ComposedAdapterFactory newFactory = new ComposedAdapterFactory();
this.adapterFactory = newFactory;
// newFactory.addAdapterFactory(new LibraryItemProviderAdapterFactory());
newFactory.addAdapterFactory(new IdlItemProviderAdapterFactory());
newFactory.addAdapterFactory(new OperationsItemProviderAdapterFactory());
newFactory.addAdapterFactory(new ExpressionsAdapterFactory());
newFactory.addAdapterFactory(new TypesItemProviderAdapterFactory());
}
return this.adapterFactory;
}
@Override
public final void createControls(final Composite parent, final TabbedPropertySheetPage tabbedPropertySheetPage) {
super.createControls(parent, tabbedPropertySheetPage);
final Composite root = getWidgetFactory().createFlatFormComposite(parent);
root.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).margins(ITabbedPropertyConstants.HMARGIN, ITabbedPropertyConstants.VMARGIN).create());
this.label = getWidgetFactory().createLabel(root, "");
this.label.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
final Tree tree = this.getWidgetFactory().createTree(root, SWT.BORDER);
tree.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
this.adapterFactory = createAdapterFactory();
this.viewer = new TreeViewer(tree);
this.viewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory) {
@Override
public Object[] getElements(final Object object) {
if (object instanceof List< ? >) {
return ((List< ? >) object).toArray();
}
return super.getChildren(object);
}
});
this.viewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
}
protected TreeViewer createTreeViewer(final Composite parent) {
return ScaComponentFactory.createPropertyTable(getWidgetFactory(), parent, SWT.SINGLE, this.adapterFactory);
}
@Override
public void setInput(IWorkbenchPart part, ISelection selection) {
super.setInput(part, selection);
Object newInput = null;
if (selection instanceof IStructuredSelection) {
final IStructuredSelection ss = (IStructuredSelection) selection;
final Object obj = ss.getFirstElement();
String repId = null;
EditPart ep = (EditPart) obj;
PictogramElement pe = (PictogramElement) ep.getModel();
Object bo = pe.getLink().getBusinessObjects().get(0);
if (bo instanceof ProvidesPortStub && ((ProvidesPortStub) bo).getProvides() != null) {
repId = ((ProvidesPortStub) bo).getProvides().getRepID();
}
if (bo instanceof UsesPortStub && ((UsesPortStub) bo).getUses() != null) {
repId = ((UsesPortStub) bo).getUses().getRepID();
}
if (repId != null) {
this.label.setText(repId);
Identifiable item = SdrUiPlugin.getDefault().getTargetSdrRoot().getIdlLibrary().find(repId);
ArrayList<Identifiable> list = new ArrayList<Identifiable>();
list.add(item);
newInput = list;
}
}
this.viewer.setInput(newInput);
}
@Override
public boolean shouldUseExtraSpace() {
return true;
}
@Override
public void aboutToBeHidden() {
if (!this.viewer.getControl().isDisposed()) {
expandedPaths = this.viewer.getExpandedTreePaths();
}
super.aboutToBeHidden();
}
@Override
public void aboutToBeShown() {
if (expandedPaths != null && !this.viewer.getControl().isDisposed()) {
this.viewer.setExpandedTreePaths(expandedPaths);
}
super.aboutToBeShown();
}
}