/* * #%~ * org.overture.ide.ui * %% * Copyright (C) 2008 - 2014 Overture * %% * This program 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. * * This program 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/gpl-3.0.html>. * #~% */ package org.overture.ide.ui.navigator; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Adapters; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.model.IWorkbenchAdapter; import org.overture.ast.node.INode; import org.overture.ide.core.ElementChangedEvent; import org.overture.ide.core.ElementChangedEvent.DeltaType; import org.overture.ide.core.IElementChangedListener; import org.overture.ide.core.IVdmElement; import org.overture.ide.core.IVdmElementDelta; import org.overture.ide.core.VdmCore; import org.overture.ide.core.resources.IVdmSourceUnit; /** * Please notice that the events send to this class is based on the navigatorContent: * <ul> * <li>triggerPoints</li> * <li>possibleChildren</li> * </ul> * * @author kela */ @SuppressWarnings("restriction") public class VdmNavigatorCustomContentProvider extends org.eclipse.ui.internal.navigator.resources.workbench.ResourceExtensionContentProvider { private Viewer viewer; private static final Object[] NO_CHILDREN = new Object[0]; private IElementChangedListener vdmlistner = new IElementChangedListener() { @Override public void elementChanged(ElementChangedEvent event) { if (event.getType() == DeltaType.POST_BUILD) // happens when the project is build { if (event.getDelta().getKind() == IVdmElementDelta.CHANGED) { IVdmElement source = event.getDelta().getElement(); if (source instanceof IVdmSourceUnit) { refreshView(); } } } else if (event.getType() == DeltaType.POST_RECONCILE) // happens when a source unit is parsed for the // first time { if (event.getDelta().getKind() == IVdmElementDelta.ADDED) { IVdmElement source = event.getDelta().getElement(); if (source instanceof IVdmSourceUnit) { refreshView(); } } } } private void refreshView() { if (viewer != null && viewer.getControl() != null && viewer.getControl().getDisplay() != null) viewer.getControl().getDisplay().asyncExec(new Runnable() { /* * (non-Javadoc) * @see java.lang.Runnable#run() */ public void run() { if (!viewer.getControl().isDisposed()) { viewer.refresh(); } } }); } }; public VdmNavigatorCustomContentProvider() { VdmCore.addElementChangedListener(vdmlistner); } @Override public void dispose() { super.dispose(); VdmCore.removeElementChangedListener(vdmlistner); } /* * (non-Javadoc) * @see org.eclipse.ui.model.WorkbenchContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, * java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { super.inputChanged(viewer, oldInput, newInput); this.viewer = viewer; } @Override protected IWorkbenchAdapter getAdapter(Object element) { if (element instanceof IFile) { IVdmSourceUnit source = (IVdmSourceUnit) Adapters.adapt(((IFile) element), IVdmSourceUnit.class); IWorkbenchAdapter adapter = getAdapter(source); return adapter; } return super.getAdapter(element); } /* * (non-Javadoc) * @see org.eclipse.ui.model.BaseWorkbenchContentProvider#getChildren(java.lang.Object) */ public Object[] getChildren(Object element) { if (element instanceof IResource || element instanceof INode) { IWorkbenchAdapter adapter = getAdapter(element); if (adapter != null) { return adapter.getChildren(element); } return NO_CHILDREN; } return NO_CHILDREN; } }