/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package org.absmodels.abs.plugin.navigator; import static org.absmodels.abs.plugin.util.Constants.MODULE_DECORATOR_ID; import org.absmodels.abs.plugin.Activator; import org.absmodels.abs.plugin.decorators.ModuleDecorator; import org.absmodels.abs.plugin.util.CoreControlUnit; import org.absmodels.abs.plugin.util.UtilityFunctions; import org.absmodels.abs.plugin.util.CoreControlUnit.ResourceBuildListener; import org.absmodels.abs.plugin.util.CoreControlUnit.ResourceBuiltEvent; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.navigator.CommonNavigator; import org.eclipse.ui.navigator.IMementoAware; import org.eclipse.ui.views.framelist.TreeFrame; /** * Uses the Common Navigator Framework to provide an ABS navigator view * * @author cseise * */ public class ABSNavigator extends CommonNavigator implements IMementoAware{ /** * Resource Change Listener for updating the ABSNavigator */ ABSNavigatorResourceChangeListener resourceChangeListener = new ABSNavigatorResourceChangeListener(); private IMemento memento; /** * {@inheritDoc} */ @Override public void init(IViewSite site, IMemento memento) { try { super.init(site); } catch (PartInitException e) { UtilityFunctions.showErrorMessage("Fatal error during initialization of the ABS Navigator View:" + e.getLocalizedMessage()); } this.memento = memento; } /** * {@inheritDoc} */ @Override public void createPartControl(Composite aParent) { super.createPartControl(aParent); this.getCommonViewer().addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { if (event.getSelection() instanceof TreeSelection) { TreeSelection ts = (TreeSelection) event.getSelection(); try { NavigatorUtils.openEditor(ts); } catch (PartInitException e) { UtilityFunctions.showErrorMessage("Fatal error in ABS Navigator View:\n Could not open the editor connected to the selected tree element."); } } } }); ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener,IResourceChangeEvent.POST_CHANGE); CoreControlUnit.addResourceBuildListener(resourceChangeListener); //Restore expanded projects if (memento != null){ TreeFrame tf = new TreeFrame(this.getCommonViewer()); tf.restoreState(memento); Object[] expandedElements = tf.getExpandedElements(); if (expandedElements != null) this.getCommonViewer().setExpandedElements(expandedElements); } } @Override public void dispose() { CoreControlUnit.removeResourceBuildListener(resourceChangeListener); ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener); super.dispose(); } /** * Class responsible for updating the contents of the ABSNavigator * * @author cseise * */ private class ABSNavigatorResourceChangeListener implements IResourceChangeListener, ResourceBuildListener { @Override public void resourceChanged(IResourceChangeEvent event) { if (event.getType() == IResourceChangeEvent.POST_CHANGE) { IResourceDelta[] delta = event.getDelta().getAffectedChildren(); for (IResourceDelta d : delta) { if (d.getResource() instanceof IProject) { refreshLabelProvider(); } } } } @Override public void resourceBuilt(ResourceBuiltEvent builtevent) { refreshLabelProvider(); } } /** * Updates the Common Viewer in an asynchronous execution. */ private void refreshLabelProvider() { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if (!getCommonViewer().getControl().isDisposed()) { getCommonViewer().refresh(); } final IBaseLabelProvider baseLabelProvider = Activator. getDefault(). getWorkbench(). getDecoratorManager(). getBaseLabelProvider(MODULE_DECORATOR_ID); if (baseLabelProvider instanceof ModuleDecorator) { ((ModuleDecorator) baseLabelProvider).refresh(); } } }); } @Override public void saveState(IMemento aMemento){ super.saveState(aMemento); TreeFrame tf = new TreeFrame(this.getCommonViewer()); tf.setExpandedElements(this.getCommonViewer().getExpandedElements()); tf.setSelection(this.getCommonViewer().getSelection()); tf.saveState(aMemento); } @Override public void restoreState(IMemento aMemento) { // no-op } }