/******************************************************************************* * Copyright (c) 2006-2011 Gluster, Inc. <http://www.gluster.com> * This file is part of Gluster Management Console. * * Gluster Management Console is free software; you can redistribute * it and/or modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * Gluster Management Console is distributed in the hope that it * will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * <http://www.gnu.org/licenses/>. *******************************************************************************/ package org.gluster.storage.management.console.views; import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.model.BaseWorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.part.ViewPart; import org.gluster.storage.management.console.GlusterDataModelManager; import org.gluster.storage.management.console.toolbar.GlusterToolbarManager; import org.gluster.storage.management.core.model.DefaultClusterListener; import org.gluster.storage.management.core.model.Entity; import org.gluster.storage.management.core.model.Event; import org.gluster.storage.management.core.model.GlusterDataModel; import org.gluster.storage.management.core.model.GlusterServer; import org.gluster.storage.management.core.model.Volume; public class NavigationView extends ViewPart implements ISelectionListener { public static final String ID = NavigationView.class.getName(); private TreeViewer treeViewer; private IAdapterFactory adapterFactory = new ClusterAdapterFactory(); private GlusterToolbarManager toolbarManager; private Entity entity; private GlusterViewsManager viewsManager; private DefaultClusterListener clusterListener; @Override public void createPartControl(Composite parent) { createNavigationTree(parent); // Create the views and toolbar managers toolbarManager = new GlusterToolbarManager(getSite().getWorkbenchWindow()); viewsManager = new GlusterViewsManager(getSite().getPage()); // listen to selection events to update views/toolbar accordingly getSite().getPage().addSelectionListener(this); } private void createNavigationTree(Composite parent) { GlusterDataModel model = GlusterDataModelManager.getInstance().getModel(); Platform.getAdapterManager().registerAdapters(adapterFactory, Entity.class); treeViewer = new TreeViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); treeViewer.setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider()); treeViewer.setContentProvider(new BaseWorkbenchContentProvider()); treeViewer.setInput(model); treeViewer.expandAll(); // select the first element by default treeViewer.setSelection(new StructuredSelection(model.getChildren().get(0))); setupContextMenu(); // register as selection provider so that other views can listen to any selection events on the tree getSite().setSelectionProvider(treeViewer); clusterListener = new DefaultClusterListener() { public void modelChanged() { treeViewer.refresh(true); } @Override public void volumeChanged(Volume volume, Event event) { super.volumeChanged(volume, event); treeViewer.update(volume, null); if (volume == entity) { // this makes sure that the toolbar buttons get updated according to new status selectEntity(volume); } } @Override public void volumeDeleted(Volume volume) { super.volumeDeleted(volume); if(volume == entity) { // volume selected was deleted. select the root element in the tree. selectEntity(GlusterDataModelManager.getInstance().getModel().getCluster()); } } @Override public void serverRemoved(GlusterServer server) { super.serverRemoved(server); if(server == entity) { // server selected was removed. select the root element in the tree. selectEntity(GlusterDataModelManager.getInstance().getModel().getCluster()); } }; }; GlusterDataModelManager.getInstance().addClusterListener(clusterListener); } private void setupContextMenu() { MenuManager menuManager = new MenuManager("&Gluster", "gluster.context.menu"); Menu contextMenu = menuManager.createContextMenu(treeViewer.getControl()); treeViewer.getTree().setMenu(contextMenu); getSite().registerContextMenu(menuManager, treeViewer); } public void selectEntity(Entity entity) { treeViewer.setSelection(new StructuredSelection(entity)); treeViewer.reveal(entity); setFocus(); // this ensures that the "selection changed" event gets fired } @Override public void setFocus() { treeViewer.getControl().setFocus(); } @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { if (part instanceof NavigationView && selection instanceof TreeSelection) { Entity selectedEntity = (Entity) ((TreeSelection) selection).getFirstElement(); if (selectedEntity != null && selectedEntity != entity) { entity = selectedEntity; // update views and toolbar buttons visibility based on selected entity viewsManager.updateViews(entity); toolbarManager.updateToolbar(entity); // Opening of other views may cause navigation tree to lose focus; get it back. setFocus(); } } } @Override public void dispose() { super.dispose(); GlusterDataModelManager.getInstance().removeClusterListener(clusterListener); } }