package com.netifera.platform.ui.spaces.editors; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.viewers.ContentViewer; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IMemento; import org.eclipse.ui.IPersistableEditor; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.EditorPart; import com.netifera.platform.api.events.IEvent; import com.netifera.platform.api.events.IEventHandler; import com.netifera.platform.api.model.IEntity; import com.netifera.platform.api.model.ISpace; import com.netifera.platform.api.model.SpaceNameChangeEvent; import com.netifera.platform.ui.internal.spaces.Activator; import com.netifera.platform.ui.spaces.ISpaceEditor; import com.netifera.platform.ui.spaces.SpaceEditorInput; import com.netifera.platform.ui.spaces.actions.ChangeVisualizationAction; import com.netifera.platform.ui.spaces.visualizations.ISpaceVisualization; import com.netifera.platform.ui.util.SelectionProviderProxy; public class SpaceEditor extends EditorPart implements IPersistableEditor, ISpaceEditor { public final static String ID = "com.netifera.platform.editors.spaces"; private ISpace space; private String visualizationName = "Tree"; private ContentViewer viewer; private ToolBar toolBar; private ISpaceVisualization currentVisualization; public SpaceEditor() { super(); } @Override public void doSave(IProgressMonitor monitor) { } @Override public void doSaveAs() { } @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { setSite(site); setInput(input); setPartName(input.getName()); if(!(input instanceof SpaceEditorInput)) { throw new PartInitException("SpaceEditor passed unexpected input type"); } space = ((SpaceEditorInput)input).getSpace(); space.addChangeListener( new IEventHandler() { public void handleEvent(IEvent event) { if(event instanceof SpaceNameChangeEvent) { setPartName(((SpaceNameChangeEvent)event).getName()); } } }); getSite().getWorkbenchWindow().getSelectionService().addPostSelectionListener( new ISelectionListener() { public void selectionChanged(IWorkbenchPart part, org.eclipse.jface.viewers.ISelection sel) { if (part == SpaceEditor.this) return; if(sel instanceof IStructuredSelection && !sel.isEmpty()) { Object o = ((IStructuredSelection)sel).iterator().next(); if(o instanceof IEntity) { focusEntity((IEntity)o); } } } }); } @Override public boolean isDirty() { return false; } @Override public boolean isSaveAsAllowed() { return false; } @Override public void createPartControl(Composite parent) { // IToolBarManager contributions = getEditorSite().getActionBars().getToolBarManager(); // contributions.removeAll(); FormLayout layout = new FormLayout(); parent.setLayout(layout); toolBar = new ToolBar(parent, SWT.BORDER); toolBar.setLayoutData(new FormData()); IToolBarManager contributions = new ToolBarManager(toolBar); contributions.add(new ChangeVisualizationAction(this)); currentVisualization = Activator.getDefault().getVisualizationFactory().create(visualizationName, space); viewer = currentVisualization.createViewer(parent); /* set the visualization provide viewer as selection provider*/ setSelectionProvider(viewer); currentVisualization.addContributions(contributions); FormData formData = new FormData(); formData.top = new FormAttachment(toolBar,0); formData.bottom = new FormAttachment(100,0); formData.left = new FormAttachment(0,0); formData.right = new FormAttachment(100,0); viewer.getControl().setLayoutData(formData); contributions.update(true); } private void setSelectionProvider(ISelectionProvider selectionProvider) { ISelectionProvider currentProvider = getSite().getSelectionProvider(); if(currentProvider == null) { currentProvider = new SelectionProviderProxy(); getSite().setSelectionProvider(currentProvider); } if(currentProvider instanceof SelectionProviderProxy) { ((SelectionProviderProxy) currentProvider).setSelectionProvider(viewer); } } public String getVisualization() { return visualizationName; } public void setVisualization(String name) { Composite parent = viewer.getControl().getParent(); viewer.getControl().dispose(); toolBar.dispose(); visualizationName = name; createPartControl(parent); parent.layout(); } public void dispose() { super.dispose(); space.close(); } @Override public void setFocus() { viewer.getControl().setFocus(); setSelectionProvider(viewer); } public void restoreState(IMemento memento) { visualizationName = memento.getString("visualization"); if (visualizationName == null) visualizationName = "Tree"; } public void saveState(IMemento memento) { memento.putString("visualization", visualizationName); } public void focusEntity(IEntity entity) { if(currentVisualization != null) currentVisualization.focusEntity(entity); } }