package com.tibco.as.spacebar.ui.navigator; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.navigator.CommonNavigator; import org.eclipse.ui.navigator.CommonViewer; import com.tibco.as.spacebar.ui.ConnectJob; import com.tibco.as.spacebar.ui.SpaceBarPlugin; import com.tibco.as.spacebar.ui.editor.SpaceEditorExport; import com.tibco.as.spacebar.ui.editor.SpaceEditorInput; import com.tibco.as.spacebar.ui.model.IElement; import com.tibco.as.spacebar.ui.model.IModelListener; import com.tibco.as.spacebar.ui.model.Metaspace; import com.tibco.as.spacebar.ui.model.Metaspaces; import com.tibco.as.spacebar.ui.model.Space; import com.tibco.as.spacebar.ui.model.Spaces; import com.tibco.as.spacebar.ui.preferences.Preferences; public class MetaspaceNavigator extends CommonNavigator implements IModelListener { @Override protected Metaspaces getInitialInput() { return SpaceBarPlugin.getDefault().getMetaspaces(); } @Override public void createPartControl(Composite parent) { super.createPartControl(parent); CommonViewer treeViewer = getCommonViewer(); Metaspaces metaspaces = (Metaspaces) treeViewer.getInput(); metaspaces.addListener(this); for (Metaspace metaspace : metaspaces.getChildren()) { Spaces spaces = metaspace.getSpaces(); if (spaces != null) { reveal(spaces); for (IElement space : spaces.getChildren()) { reveal(space); } } } } @Override public void added(IElement element) { reveal(element); } @Override public void removed(final IElement element) { getCommonViewer().getTree().getDisplay().asyncExec(new Runnable() { public void run() { CommonViewer viewer = getCommonViewer(); if (viewer.getTree().isDisposed()) { return; } viewer.remove(element); // viewer.refresh(element.getParent()); } }); } @Override public void changed(final IElement element, final String propertyName, Object oldValue, Object newValue) { getCommonViewer().getTree().getDisplay().asyncExec(new Runnable() { public void run() { CommonViewer viewer = getCommonViewer(); if (viewer.getTree().isDisposed()) { return; } viewer.update(element, new String[] { propertyName }); } }); } private void reveal(final IElement element) { getCommonViewer().getTree().getDisplay().asyncExec(new Runnable() { public void run() { CommonViewer viewer = getCommonViewer(); if (viewer.getTree().isDisposed()) { return; } viewer.reveal(element); viewer.setExpandedState(element, true); viewer.refresh(element.getParent(), false); } }); } @Override protected void handleDoubleClick(DoubleClickEvent event) { Object element = ((IStructuredSelection) event.getSelection()) .getFirstElement(); if (element instanceof Metaspace) { Metaspace metaspace = (Metaspace) element; if (!metaspace.isConnected()) { new ConnectJob(metaspace).schedule(); } } else { if (element instanceof Space) { Space space = (Space) element; SpaceEditorExport export = Preferences.getSpaceEditorExport(Preferences .getString(Preferences.SPACE_EDITOR_BROWSE_TIME_SCOPE)); SpaceEditorInput input = new SpaceEditorInput(space, export); IWorkbenchPartSite site = getSite(); final IWorkbenchPage page = site.getWorkbenchWindow() .getActivePage(); getCommonViewer().addSelectionChangedListener( new ISelectionChangedListener() { @Override public void selectionChanged( SelectionChangedEvent event) { page.activate(MetaspaceNavigator.this); } }); try { page.openEditor(input, input.getEditorId()); } catch (PartInitException e) { SpaceBarPlugin.errorDialog(site.getShell(), "Could not open editor", e); } return; } } super.handleDoubleClick(event); } }