/******************************************************************************* * Copyright (c) 2012 - 2013 VMware, Inc. * 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 * * Contributors: * VMware, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.beans.ui.livegraph.views; import java.util.Set; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IActionBars; import org.eclipse.ui.actions.BaseSelectionListenerAction; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.part.ViewPart; import org.eclipse.zest.core.viewers.GraphViewer; import org.eclipse.zest.core.widgets.ZestStyles; import org.eclipse.zest.layouts.LayoutStyles; import org.springframework.ide.eclipse.beans.ui.livegraph.LiveGraphUiPlugin; import org.springframework.ide.eclipse.beans.ui.livegraph.actions.ConnectToApplicationAction; import org.springframework.ide.eclipse.beans.ui.livegraph.actions.FilterInnerBeansAction; import org.springframework.ide.eclipse.beans.ui.livegraph.actions.LoadModelAction; import org.springframework.ide.eclipse.beans.ui.livegraph.actions.OpenBeanClassAction; import org.springframework.ide.eclipse.beans.ui.livegraph.actions.OpenBeanDefinitionAction; import org.springframework.ide.eclipse.beans.ui.livegraph.actions.RefreshApplicationAction; import org.springframework.ide.eclipse.beans.ui.livegraph.actions.ToggleGroupByAction; import org.springframework.ide.eclipse.beans.ui.livegraph.actions.ToggleViewModeAction; import org.springframework.ide.eclipse.beans.ui.livegraph.model.LiveBeansModel; import org.springframework.ide.eclipse.beans.ui.livegraph.model.LiveBeansModelCollection; /** * A simple view to host our graph * * @author Leo Dos Santos */ public class LiveBeansGraphView extends ViewPart { public static final String VIEW_ID = "org.springframework.ide.eclipse.beans.ui.livegraph.views.LiveBeansGraphView"; public static final String PREF_DISPLAY_MODE = LiveGraphUiPlugin.PLUGIN_ID + ".prefs.displayMode.LiveBeansGraphView"; public static final String PREF_GROUP_MODE = LiveGraphUiPlugin.PLUGIN_ID + ".prefs.groupByMode.LiveBeansGraphView"; public static final String PREF_FILTER_INNER_BEANS = LiveGraphUiPlugin.PLUGIN_ID + ".prefs.filterInnerBeans.LiveBeansGraphView"; public static final int DISPLAY_MODE_GRAPH = 0; public static final int DISPLAY_MODE_TREE = 1; public static final int GROUP_BY_RESOURCE = 0; public static final int GROUP_BY_CONTEXT = 1; private ToggleViewModeAction[] displayModeActions; private ToggleGroupByAction[] groupByActions; private final MultiViewerSelectionProvider selectionProvider; private BaseSelectionListenerAction openBeanClassAction; private BaseSelectionListenerAction openBeanDefAction; private FilterInnerBeansAction filterInnerBeansAction; private final InnerBeansViewerFilter innerBeansFilter; private LiveBeansModel activeInput; private Action connectApplicationAction; private PageBook pagebook; private GraphViewer graphViewer; private TreeViewer treeViewer; private final IPreferenceStore prefStore; private int activeDisplayMode; private int activeGroupByMode; public LiveBeansGraphView() { super(); prefStore = LiveGraphUiPlugin.getDefault().getPreferenceStore(); selectionProvider = new MultiViewerSelectionProvider(); innerBeansFilter = new InnerBeansViewerFilter(); } private void createGraphViewer() { graphViewer = new GraphViewer(pagebook, SWT.NONE); graphViewer.setContentProvider(new LiveBeansGraphContentProvider()); graphViewer.setLabelProvider(new LiveBeansGraphLabelProvider()); graphViewer.setConnectionStyle(ZestStyles.CONNECTIONS_DIRECTED); // viewer.setNodeStyle(ZestStyles.NODES_FISHEYE); ExtendedDirectedGraphLayoutAlgorithm layout = new ExtendedDirectedGraphLayoutAlgorithm( LayoutStyles.NO_LAYOUT_NODE_RESIZING | SWT.HORIZONTAL); graphViewer.setLayoutAlgorithm(layout); graphViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { if (openBeanClassAction != null && openBeanClassAction.isEnabled()) { openBeanClassAction.run(); } } }); } @Override public void createPartControl(Composite parent) { pagebook = new PageBook(parent, SWT.NONE); getViewSite().setSelectionProvider(selectionProvider); makeActions(); createGraphViewer(); createTreeViewer(); hookToolBar(); hookPullDownMenu(); hookContextMenu(); selectionProvider.addSelectionChangedListener(openBeanClassAction); selectionProvider.addSelectionChangedListener(openBeanDefAction); setDisplayMode(prefStore.getInt(PREF_DISPLAY_MODE)); setGroupByMode(prefStore.getInt(PREF_GROUP_MODE)); setFilterInnerBeans(prefStore.getBoolean(PREF_FILTER_INNER_BEANS)); } private void createTreeViewer() { treeViewer = new TreeViewer(pagebook, SWT.NONE); treeViewer.setContentProvider(new LiveBeansTreeContentProvider(this)); treeViewer.setLabelProvider(new LiveBeansTreeLabelProvider()); treeViewer.setSorter(new ViewerSorter()); treeViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { if (openBeanDefAction != null && openBeanDefAction.isEnabled()) { openBeanDefAction.run(); } } }); } @Override public void dispose() { selectionProvider.removeSelectionChangedListener(openBeanClassAction); selectionProvider.removeSelectionChangedListener(openBeanDefAction); super.dispose(); } private void fillContextMenu(IMenuManager menuManager) { menuManager.add(new Separator()); menuManager.add(openBeanClassAction); menuManager.add(openBeanDefAction); } private void fillPullDownMenu(IMenuManager menuManager) { menuManager.add(connectApplicationAction); Set<LiveBeansModel> collection = LiveBeansModelCollection.getInstance().getCollection(); if (collection.size() > 0) { menuManager.add(new Separator()); } for (LiveBeansModel model : collection) { menuManager.add(new LoadModelAction(this, model)); } if (activeDisplayMode == DISPLAY_MODE_TREE) { menuManager.add(new Separator()); for (ToggleGroupByAction action : groupByActions) { menuManager.add(action); } } // if (activeDisplayMode == DISPLAY_MODE_GRAPH) { menuManager.add(new Separator()); menuManager.add(filterInnerBeansAction); // } } public int getGroupByMode() { return activeGroupByMode; } public LiveBeansModel getInput() { return activeInput; } private void hookContextMenu() { MenuManager menuManager = new MenuManager(); menuManager.setRemoveAllWhenShown(true); fillContextMenu(menuManager); menuManager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { ISelection selection = getViewSite().getSelectionProvider().getSelection(); if (!selection.isEmpty()) { fillContextMenu(manager); } } }); graphViewer.getControl().setMenu(menuManager.createContextMenu(graphViewer.getControl())); treeViewer.getControl().setMenu(menuManager.createContextMenu(treeViewer.getControl())); getViewSite().registerContextMenu(menuManager, selectionProvider); } private void hookPullDownMenu() { IActionBars bars = getViewSite().getActionBars(); IMenuManager menuManager = bars.getMenuManager(); menuManager.setRemoveAllWhenShown(true); fillPullDownMenu(menuManager); menuManager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { fillPullDownMenu(manager); } }); } private void hookToolBar() { IActionBars bars = getViewSite().getActionBars(); IToolBarManager toolbar = bars.getToolBarManager(); for (ToggleViewModeAction displayModeAction : displayModeActions) { toolbar.add(displayModeAction); } toolbar.add(new Separator()); toolbar.add(new RefreshApplicationAction(this)); } private boolean isViewerVisible(Viewer viewer) { return viewer != null && !viewer.getControl().isDisposed() && viewer.getControl().isVisible(); } private void makeActions() { openBeanClassAction = new OpenBeanClassAction(); openBeanDefAction = new OpenBeanDefinitionAction(); connectApplicationAction = new ConnectToApplicationAction(this); displayModeActions = new ToggleViewModeAction[] { new ToggleViewModeAction(this, DISPLAY_MODE_GRAPH), new ToggleViewModeAction(this, DISPLAY_MODE_TREE) }; groupByActions = new ToggleGroupByAction[] { new ToggleGroupByAction(this, GROUP_BY_RESOURCE), new ToggleGroupByAction(this, GROUP_BY_CONTEXT) }; filterInnerBeansAction = new FilterInnerBeansAction(this); } public void setDisplayMode(int mode) { if (mode == DISPLAY_MODE_GRAPH) { pagebook.showPage(graphViewer.getControl()); } else if (mode == DISPLAY_MODE_TREE) { pagebook.showPage(treeViewer.getControl()); } for (ToggleViewModeAction action : displayModeActions) { action.setChecked(mode == action.getDisplayMode()); } activeDisplayMode = mode; prefStore.setValue(PREF_DISPLAY_MODE, mode); } @Override public void setFocus() { if (isViewerVisible(graphViewer)) { graphViewer.getControl().setFocus(); } else if (isViewerVisible(treeViewer)) { treeViewer.getControl().setFocus(); } } public void setGroupByMode(int mode) { activeGroupByMode = mode; if (isViewerVisible(treeViewer)) { treeViewer.refresh(); } for (ToggleGroupByAction action : groupByActions) { action.setChecked(mode == action.getGroupByMode()); } prefStore.setValue(PREF_GROUP_MODE, mode); } public void setInput(LiveBeansModel model) { activeInput = model; if (graphViewer != null) { graphViewer.setInput(activeInput); } if (treeViewer != null) { treeViewer.setInput(activeInput); } } public void setFilterInnerBeans(boolean filtered) { if (graphViewer != null) { if (filtered) { graphViewer.addFilter(innerBeansFilter); } else { graphViewer.removeFilter(innerBeansFilter); } graphViewer.applyLayout(); } if (treeViewer != null) { if (filtered) { treeViewer.addFilter(innerBeansFilter); } else { treeViewer.removeFilter(innerBeansFilter); } } filterInnerBeansAction.setChecked(filtered); prefStore.setValue(PREF_FILTER_INNER_BEANS, filtered); } private class MultiViewerSelectionProvider implements ISelectionProvider { public void addSelectionChangedListener(ISelectionChangedListener listener) { if (graphViewer != null) { graphViewer.addSelectionChangedListener(listener); } if (treeViewer != null) { treeViewer.addSelectionChangedListener(listener); } } public ISelection getSelection() { if (isViewerVisible(graphViewer)) { return graphViewer.getSelection(); } if (isViewerVisible(treeViewer)) { return treeViewer.getSelection(); } return null; } public void removeSelectionChangedListener(ISelectionChangedListener listener) { if (graphViewer != null) { graphViewer.removeSelectionChangedListener(listener); } if (treeViewer != null) { treeViewer.removeSelectionChangedListener(listener); } } public void setSelection(ISelection selection) { if (isViewerVisible(graphViewer)) { graphViewer.setSelection(selection); } else if (isViewerVisible(treeViewer)) { treeViewer.setSelection(selection); } } } }