| /********************************************************************* |
| * Copyright (c) 2005, 2019 SAP SE |
| * |
| * This program and the accompanying materials are made |
| * available under the terms of the Eclipse Public License 2.0 |
| * which is available at https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * Contributors: |
| * SAP SE - initial API, implementation and documentation |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| **********************************************************************/ |
| package org.eclipse.graphiti.examples.common.navigator; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IResourceChangeEvent; |
| import org.eclipse.core.resources.IResourceChangeListener; |
| import org.eclipse.core.resources.IResourceDelta; |
| import org.eclipse.core.resources.IResourceDeltaVisitor; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.graphiti.examples.common.ExampleProjectNature; |
| import org.eclipse.graphiti.examples.common.navigator.nodes.EClassesNode; |
| import org.eclipse.graphiti.examples.common.navigator.nodes.base.IContainerNode; |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.StructuredViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.ui.progress.UIJob; |
| |
| public class GFEmfTreeContentProvider implements ITreeContentProvider, IResourceChangeListener { |
| |
| private Viewer viewer; |
| private Map<IProject, EClassesNode> projectToEClassesNode = new HashMap<IProject, EClassesNode>(); |
| |
| public GFEmfTreeContentProvider() { |
| super(); |
| ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); |
| |
| } |
| |
| public Object[] getChildren(Object parentElement) { |
| if (parentElement instanceof IContainerNode) { |
| IContainerNode icn = (IContainerNode) parentElement; |
| return icn.getChildren(); |
| } |
| if (parentElement instanceof IProject) { |
| IProject project = (IProject) parentElement; |
| try { |
| if (project.isAccessible() && project.hasNature(ExampleProjectNature.NATURE_ID)) { |
| EClassesNode node = projectToEClassesNode.get(project); |
| if (node == null) { |
| node = new EClassesNode(project, project, viewer); |
| projectToEClassesNode.put(project, node); |
| } |
| return new Object[] { node }; |
| } |
| } catch (CoreException e) { |
| // Ignore. E.g., project was deleted. |
| } |
| } |
| if (parentElement instanceof EObject) { |
| EObject eObject = (EObject) parentElement; |
| return eObject.eContents().toArray(); |
| } |
| return new Object[0]; |
| } |
| |
| public Object getParent(Object element) { |
| return null; |
| } |
| |
| public boolean hasChildren(Object element) { |
| if (element instanceof IContainerNode) { |
| IContainerNode icn = (IContainerNode) element; |
| return icn.hasChildren(); |
| } |
| if (element instanceof EObject) { |
| return !((EObject) element).eContents().isEmpty(); |
| } |
| return true; |
| } |
| |
| public Object[] getElements(Object inputElement) { |
| return null; |
| } |
| |
| public void dispose() { |
| // do nothing |
| } |
| |
| public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
| this.viewer = viewer; |
| } |
| |
| public void resourceChanged(IResourceChangeEvent event) { |
| IResourceDelta delta = event.getDelta(); |
| try { |
| delta.accept(new IResourceDeltaVisitor() { |
| public boolean visit(IResourceDelta delta) throws CoreException { |
| IResource resource = delta.getResource(); |
| if (resource == null) |
| return false; |
| switch (resource.getType()) { |
| case IResource.ROOT: |
| return true; |
| case IResource.PROJECT: |
| IProject p = (IProject) resource; |
| try { |
| boolean hasNature = p.hasNature(ExampleProjectNature.NATURE_ID); |
| return hasNature; |
| } catch (CoreException e) { |
| // Do nothing, e.g. project deleted. |
| } |
| return false; |
| case IResource.FOLDER: |
| return true; |
| case IResource.FILE: |
| final IFile file = (IFile) resource; |
| if (file.getName().endsWith(".diagram") || file.getName().equals("Predefined.data")) { //$NON-NLS-1$ //$NON-NLS-2$ |
| UIJob job = new UIJob("Update Viewer") { //$NON-NLS-1$ |
| @Override |
| public IStatus runInUIThread(IProgressMonitor monitor) { |
| if (viewer != null && !viewer.getControl().isDisposed()) { |
| EClassesNode classesNode = projectToEClassesNode.get(file.getProject()); |
| if (viewer instanceof StructuredViewer && classesNode != null) { |
| ((StructuredViewer) viewer).refresh(classesNode, true); |
| } else { |
| viewer.refresh(); |
| } |
| } |
| return Status.OK_STATUS; |
| } |
| }; |
| job.setSystem(true); |
| job.schedule(); |
| } |
| return false; |
| } |
| return false; |
| |
| } |
| |
| }); |
| } catch (CoreException e1) { |
| return; |
| } |
| } |
| } |