package info.limpet.stackedcharts.ui.editor; import info.limpet.stackedcharts.model.ChartSet; import info.limpet.stackedcharts.ui.editor.drop.DatasetToAxisDropTargetListener; import info.limpet.stackedcharts.ui.editor.drop.DatasetToAxisLandingDropTargetListener; import info.limpet.stackedcharts.ui.editor.drop.DatasetToChartDropTargetListener; import info.limpet.stackedcharts.ui.editor.drop.ProxyDropTargetListener; import info.limpet.stackedcharts.ui.editor.drop.ScatterSetToScatterSetContainerTargetListener; import info.limpet.stackedcharts.ui.editor.parts.IPropertySourceProvider; import info.limpet.stackedcharts.ui.editor.parts.StackedChartsEditPartFactory; import java.util.ArrayList; import java.util.Collection; import java.util.EventObject; import java.util.List; import org.eclipse.draw2d.ColorConstants; import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; 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.emf.edit.ui.provider.AdapterFactoryContentProvider; import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage; import org.eclipse.gef.EditDomain; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.commands.CommandStackListener; import org.eclipse.gef.editparts.AbstractEditPart; import org.eclipse.gef.ui.actions.RedoAction; import org.eclipse.gef.ui.actions.UndoAction; import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IViewPart; import org.eclipse.ui.views.properties.IPropertySheetPage; import org.eclipse.ui.views.properties.IPropertySource; public class StackedchartsEditControl extends Composite { private final EditDomain editDomain; private final GraphicalViewer viewer; protected AdapterFactoryEditingDomain emfEditingDomain; private ComposedAdapterFactory adapterFactory; private ExtendedPropertySheetPage propertySheetPage; public StackedchartsEditControl(Composite parent) { super(parent, SWT.NONE); setLayout(new FillLayout()); editDomain = new EditDomain(); viewer = new ScrollingGraphicalViewer(); // connect external Drop support // add Dataset to Axis viewer.addDropTargetListener(new ProxyDropTargetListener( new DatasetToAxisDropTargetListener(viewer), new DatasetToAxisLandingDropTargetListener(viewer), new ScatterSetToScatterSetContainerTargetListener(viewer), new DatasetToChartDropTargetListener(viewer) )); viewer.createControl(this); editDomain.addViewer(viewer); viewer.getControl().setBackground(ColorConstants.listBackground); viewer.setEditPartFactory(new StackedChartsEditPartFactory()); // emf edit domain adapterFactory = new ComposedAdapterFactory( ComposedAdapterFactory.Descriptor.Registry.INSTANCE); BasicCommandStack commandStack = new BasicCommandStack(); adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory()); adapterFactory.addAdapterFactory(new EcoreItemProviderAdapterFactory()); adapterFactory .addAdapterFactory(new ReflectiveItemProviderAdapterFactory()); emfEditingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack); } /** * This accesses a cached version of the property sheet. */ public IPropertySheetPage getPropertySheetPage() { if (propertySheetPage == null) { propertySheetPage = new ExtendedPropertySheetPage(emfEditingDomain) { @Override public void setSelectionToViewer(List<?> selection) { StackedchartsEditControl.this.setSelectionToViewer(selection); } }; propertySheetPage .setPropertySourceProvider(new AdapterFactoryContentProvider( adapterFactory)); } return propertySheetPage; } /** * This method should return a {@link org.eclipse.jface.viewers.StructuredSelection} containing * one or more of the viewer's EditParts underline EMF objects . If no editparts are selected, * root EMF object will return * */ public ISelection getSelection() { StructuredSelection selection = (StructuredSelection) viewer.getSelection(); if (!selection.isEmpty()) { List<Object> emfObj = new ArrayList<Object>(); Object[] array = selection.toArray(); for (Object object : array) { if (object instanceof AbstractEditPart) { AbstractEditPart abstractEditPart = (AbstractEditPart) object; if(abstractEditPart instanceof IPropertySourceProvider) { IPropertySourceProvider mergeModelProvider = (IPropertySourceProvider) abstractEditPart; IPropertySource merged = mergeModelProvider.getPropertySource(); if(merged==null) { emfObj.add(abstractEditPart.getModel()); } else { emfObj.add(merged); } } else emfObj.add(abstractEditPart.getModel()); } } return new StructuredSelection(emfObj); } return viewer.getSelection(); } private void setSelectionToViewer(Collection<?> collection) { final Collection<?> theSelection = collection; if (theSelection != null && !theSelection.isEmpty()) { Runnable runnable = new Runnable() { public void run() { if (viewer != null) { viewer .setSelection(new StructuredSelection(theSelection.toArray())); } } }; Display.getCurrent().asyncExec(runnable); } } public GraphicalViewer getViewer() { return viewer; } public void setModel(ChartSet model) { viewer.setContents(model); } public void init(IViewPart view) { IActionBars actionBars = view.getViewSite().getActionBars(); IToolBarManager toolBarManager = actionBars.getToolBarManager(); final UndoAction undoAction = new UndoAction(view); toolBarManager.add(undoAction); undoAction.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/undo.png")); final RedoAction redoAction = new RedoAction(view); redoAction.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/redo.png")); toolBarManager.add(redoAction); viewer.getEditDomain().getCommandStack().addCommandStackListener( new CommandStackListener() { @Override public void commandStackChanged(EventObject event) { undoAction.setEnabled(undoAction.isEnabled()); redoAction.setEnabled(redoAction.isEnabled()); } }); } }