/******************************************************************************* * Copyright (c) 2003, 2016 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation * Simon Scholz <simon.scholz@vogella.com> - Bug 460405 *******************************************************************************/ package org.eclipse.ui.tests.navigator.extension; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Properties; 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.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; 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 TestContentProvider implements ITreeContentProvider, IResourceChangeListener, IResourceDeltaVisitor { private static final String MODEL_ROOT = "root"; private static final Object[] NO_CHILDREN = new Object[0]; public static final IPath MODEL_FILE_PATH = new Path("model.properties"); private final Map rootElements = new HashMap(); private StructuredViewer viewer; public static TestExtensionTreeData _modelRoot; public static boolean _dieOnSetInput; public static boolean _diedOnSetInput; public TestContentProvider() { ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); _dieOnSetInput = false; _diedOnSetInput = false; } @Override public Object[] getElements(Object inputElement) { return getChildren(inputElement); } @Override public Object[] getChildren(Object parentElement) { if (parentElement instanceof TestExtensionTreeData) { TestExtensionTreeData data = (TestExtensionTreeData) parentElement; return data.getChildren(); } else { IProject project = adaptToProject(parentElement); if (project != null && project.isAccessible()) { IFile modelFile = project.getFile(MODEL_FILE_PATH); if (rootElements.containsKey(modelFile)) { TestExtensionTreeData model = (TestExtensionTreeData) rootElements.get(modelFile); return model != null ? model.getChildren() : NO_CHILDREN; } else { TestExtensionTreeData model = updateModel(modelFile); return model != null ? model.getChildren() : NO_CHILDREN; } } } return NO_CHILDREN; } /** * @param parentElement * @param class1 * @return */ private IProject adaptToProject(Object parentElement) { if(parentElement instanceof IProject) return (IProject) parentElement; else if(parentElement instanceof IAdaptable) return ((IAdaptable) parentElement).getAdapter(IProject.class); else return Platform.getAdapterManager().getAdapter(parentElement, IProject.class); } /** * @param modelFile */ private TestExtensionTreeData updateModel(IFile modelFile) { Properties model = new Properties(); if (modelFile.exists()) { try (InputStream is = modelFile.getContents()) { model.load(is); is.close(); TestExtensionTreeData root = new TestExtensionTreeData(null, MODEL_ROOT, model, modelFile); _modelRoot = root; rootElements.put(modelFile, root); return root; } catch (IOException | CoreException e) { } } else { rootElements.remove(modelFile); } return null; } @Override public Object getParent(Object element) { if (element instanceof TestExtensionTreeData) { TestExtensionTreeData data = (TestExtensionTreeData) element; return data.getParent(); } return null; } @Override public boolean hasChildren(Object element) { if (element instanceof TestExtensionTreeData) { TestExtensionTreeData data = (TestExtensionTreeData) element; return data.getChildren().length > 0; } return false; } @Override public void dispose() { rootElements.clear(); ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); } @Override public void inputChanged(Viewer aViewer, Object oldInput, Object newInput) { if (_dieOnSetInput) _diedOnSetInput = true; if (oldInput != null && !oldInput.equals(newInput)) rootElements.clear(); viewer = (StructuredViewer)aViewer; } @Override public void resourceChanged(IResourceChangeEvent event) { IResourceDelta delta = event.getDelta(); try { delta.accept(this); } catch (CoreException e) { e.printStackTrace(); } } @Override public boolean visit(IResourceDelta delta) throws CoreException { IResource source = delta.getResource(); switch (source.getType()) { case IResource.ROOT: case IResource.PROJECT: case IResource.FOLDER: return true; case IResource.FILE: final IFile file = (IFile) source; if ("model.properties".equals(file.getName())) { updateModel(file); new UIJob("Update Test Model in CommonViewer") { @Override public IStatus runInUIThread(IProgressMonitor monitor) { if (viewer != null && !viewer.getControl().isDisposed()) viewer.refresh(file.getParent()); return Status.OK_STATUS; } }.schedule(); } return false; } return false; } }