package fr.opensagres.nosql.ide.ui.internal.views; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IContributionManager; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.part.ViewPart; import fr.opensagres.nosql.ide.core.Platform; import fr.opensagres.nosql.ide.core.extensions.IServerRunnerType; import fr.opensagres.nosql.ide.core.extensions.IServerType; import fr.opensagres.nosql.ide.core.model.ITreeSimpleNode; import fr.opensagres.nosql.ide.core.model.NodeTypeConstants; import fr.opensagres.nosql.ide.ui.internal.Trace; import fr.opensagres.nosql.ide.ui.internal.actions.DeleteAction; import fr.opensagres.nosql.ide.ui.internal.actions.OpenAction; import fr.opensagres.nosql.ide.ui.internal.actions.RefreshAction; import fr.opensagres.nosql.ide.ui.internal.actions.database.NewCollectionAction; import fr.opensagres.nosql.ide.ui.internal.actions.database.NewDatabaseAction; import fr.opensagres.nosql.ide.ui.internal.actions.database.NewDocumentAction; import fr.opensagres.nosql.ide.ui.internal.actions.servers.NewServerAction; import fr.opensagres.nosql.ide.ui.internal.actions.servers.RunServerAction; import fr.opensagres.nosql.ide.ui.internal.actions.servers.ServerRunnerAction; import fr.opensagres.nosql.ide.ui.viewers.server.ServerLabelProvider; import fr.opensagres.nosql.ide.ui.viewers.server.ServerTreeContentProvider; public class ServersExplorer extends ViewPart { public static final String ID = "fr.opensagres.nosql.ide.ui.views.ServersExplorer"; private ServerTreeViewer viewer; // Server type actions Action newServerAction; // Generic actions private OpenAction openAction; private DeleteAction deleteAction; private RefreshAction refreshAction; // Server actions private Action startServerAction; private Action stopServerAction; // Database actions private Action newDatabaseAction; // Collection actions private Action newCollectionAction; // Document actions private Action newDocumentAction; @Override public void createPartControl(Composite parent) { viewer = new ServerTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(ServerTreeContentProvider.getInstance()); viewer.setLabelProvider(ServerLabelProvider.getInstance()); viewer.setInput(Platform.getServerTypeRegistry().getTypes()); deferInitialization(); } private void deferInitialization() { initializeActions(viewer); viewer.initialize(); // Open Server, Database, Collection editor when user double click on // the node viewer.addOpenListener(new IOpenListener() { public void open(OpenEvent event) { try { openAction.run(); } catch (Exception e) { if (Trace.SEVERE) { Trace.trace(Trace.STRING_SEVERE, "Could not open server", e); } } } }); MenuManager menuManager = new MenuManager("#PopupMenu"); menuManager.setRemoveAllWhenShown(true); final Shell shell = getSite().getShell(); menuManager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager mgr) { fillContextMenu(shell, mgr); } }); Menu menu = menuManager.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); getSite().registerContextMenu(menuManager, viewer); getSite().setSelectionProvider(viewer); } /** * Initialize actions * * @param provider * a selection provider */ private void initializeActions(ISelectionProvider provider) { Shell shell = getSite().getShell(); IActionBars actionBars = getViewSite().getActionBars(); // Server Actions // serverStartActions = new ArrayList<Action>(); // serverStopActions = new ArrayList<Action>(); // java.util.Collection<IServerRunnerType> serverRunners = Platform // .getServerRunnerRegistry().getRunners(); // for (IServerRunnerType serverRunner : serverRunners) { // serverStartActions.add(new ServerRunnerAction(serverRunner, true, // provider)); // serverStopActions.add(new ServerRunnerAction(serverRunner, false, // provider)); // } createServerTypeActions(provider, actionBars); createServerActions(provider, actionBars); createGenericActions(provider, actionBars); createDatabaseActions(provider, actionBars); createCollectionActions(provider, actionBars); createDocumentActions(provider, actionBars); // add toolbar buttons IContributionManager toolbarOfActionBars = actionBars .getToolBarManager(); toolbarOfActionBars.add(startServerAction); toolbarOfActionBars.add(stopServerAction); // toolbarOfActionBars.add(startShellAction); // toolbarOfActionBars.add(stopShellAction); // toolbarOfActionBars.add(refreshAction); toolbarOfActionBars.add(new Separator( IWorkbenchActionConstants.MB_ADDITIONS)); } private void createServerTypeActions(ISelectionProvider provider, IActionBars actionBars) { newServerAction = new NewServerAction(provider, getSite(), getSite() .getShell()); } private void createServerActions(ISelectionProvider provider, IActionBars actionBars) { Map<IServerType, Collection<Action>> startRunnerActionsMap = new HashMap<IServerType, Collection<Action>>(); Map<IServerType, Collection<Action>> stopRunnerActionsMap = new HashMap<IServerType, Collection<Action>>(); java.util.Collection<IServerRunnerType> serverRunners = Platform .getServerRunnerRegistry().getRunners(); IServerType serverType = null; Collection<Action> runnerActions = null; for (IServerRunnerType serverRunner : serverRunners) { serverType = serverRunner.getServerType(); // Add start runner action runnerActions = startRunnerActionsMap.get(serverType); if (runnerActions == null) { runnerActions = new ArrayList<Action>(); startRunnerActionsMap.put(serverType, runnerActions); } runnerActions.add(new ServerRunnerAction(serverRunner, true, provider)); // Add stop runner action runnerActions = stopRunnerActionsMap.get(serverType); if (runnerActions == null) { runnerActions = new ArrayList<Action>(); stopRunnerActionsMap.put(serverType, runnerActions); } runnerActions.add(new ServerRunnerAction(serverRunner, false, provider)); } // create the start server actions startServerAction = new RunServerAction(true, provider, startRunnerActionsMap); actionBars.setGlobalActionHandler( "fr.opensagres.nosql.ide.server.start", startServerAction); // create the stop server action stopServerAction = new RunServerAction(false, provider, stopRunnerActionsMap); actionBars.setGlobalActionHandler( "fr.opensagres.nosql.ide.server.stop", stopServerAction); } private void createGenericActions(ISelectionProvider provider, IActionBars actionBars) { // create the open action openAction = new OpenAction(provider, getSite(), getSite().getShell()); actionBars.setGlobalActionHandler("org.eclipse.ui.navigator.Open", openAction); deleteAction = new DeleteAction(viewer); actionBars.setGlobalActionHandler("org.eclipse.ui.navigator.Delete", deleteAction); refreshAction = new RefreshAction(viewer); } private void createDatabaseActions(ISelectionProvider provider, IActionBars actionBars) { newDatabaseAction = new NewDatabaseAction(provider, getSite(), getSite().getShell()); } private void createCollectionActions(ISelectionProvider provider, IActionBars actionBars) { newCollectionAction = new NewCollectionAction(provider, getSite(), getSite().getShell()); } private void createDocumentActions(ISelectionProvider provider, IActionBars actionBars) { newDocumentAction = new NewDocumentAction(provider, getSite(), getSite().getShell()); } protected void fillContextMenu(Shell shell, IMenuManager menu) { Object selectedElement = getFirstSelectedElement(viewer); if (selectedElement != null) { if (selectedElement instanceof IServerType) { menu.add(newServerAction); } else if (selectedElement instanceof ITreeSimpleNode) { menu.add(openAction); menu.add(refreshAction); menu.add(deleteAction); menu.add(new Separator()); switch (((ITreeSimpleNode) selectedElement).getType()) { case NodeTypeConstants.Server: menu.add(newDatabaseAction); break; case NodeTypeConstants.CollectionsCategory: case NodeTypeConstants.Database: menu.add(newCollectionAction); break; case NodeTypeConstants.Collection: menu.add(newDocumentAction); break; } } } } private Object getFirstSelectedElement(ISelectionProvider provider) { IStructuredSelection selection = (IStructuredSelection) provider .getSelection(); if (selection.isEmpty()) { return null; } return selection.getFirstElement(); } @Override public void setFocus() { viewer.getControl().setFocus(); } }