blob: e1d26627a0d2961dfff4ede2ad9bfc00849dff8f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2014 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Francois Chouinard - Initial API and implementation
* Bernd Hufmann - Implement getParent()
* Patrick Tasse - Add support for folder elements
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ui.project.model;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.tracecompass.internal.tmf.ui.project.model.TmfProjectModelHelper;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.IPipelinedTreeContentProvider;
import org.eclipse.ui.navigator.PipelinedShapeModification;
import org.eclipse.ui.navigator.PipelinedViewerUpdate;
/**
* The TMF project content provider for the tree viewer in the project explorer view.
* <p>
* @version 1.0
* @author Francois Chouinard
*/
public class TmfNavigatorContentProvider implements IPipelinedTreeContentProvider {
// ------------------------------------------------------------------------
// ICommonContentProvider
// ------------------------------------------------------------------------
@Override
public Object[] getElements(Object inputElement) {
return null;
}
@Override
public Object getParent(Object element) {
if (element instanceof IProject) {
IProject project = (IProject) element;
return project.getParent();
}
if (element instanceof TmfProjectElement) {
IProject p = TmfProjectModelHelper.getProjectFromShadowProject(((TmfProjectElement) element).getResource());
if ((p != null) && (p.isAccessible())) {
return p;
}
return ((TmfProjectElement) element).getResource();
}
if (element instanceof TmfTracesFolder) {
TmfTracesFolder folder = (TmfTracesFolder) element;
// Return TmfProjectElement if shadow project case
if (folder.getParent() instanceof TmfProjectElement) {
IProject p = TmfProjectModelHelper.getProjectFromShadowProject(((TmfProjectElement) folder.getParent()).getResource());
if ((p != null) && (p.isAccessible())) {
return folder.getParent();
}
}
// Return the corresponding IProject as parent because from CNF point of view the IProject is the parent.
// The IProject is needed e.g. for link with Editor to work correctly.
return folder.getParent().getResource();
}
if (element instanceof TmfExperimentFolder) {
TmfExperimentFolder folder = (TmfExperimentFolder) element;
// Return TmfProjectElement if shadow project case
if (folder.getParent() instanceof TmfProjectElement) {
IProject p = TmfProjectModelHelper.getProjectFromShadowProject(((TmfProjectElement) folder.getParent()).getResource());
if ((p != null) && (p.isAccessible())) {
return folder.getParent();
}
}
// Return the corresponding IProject as parent because from CNF point of view the IProject is the parent.
// The IProject is needed e.g. for link with Editor to work correctly.
return folder.getParent().getResource();
}
if (element instanceof ITmfProjectModelElement) {
ITmfProjectModelElement modelElement = (ITmfProjectModelElement) element;
return modelElement.getParent();
}
return null;
}
@Override
public boolean hasChildren(Object element) {
if (element instanceof IProject) {
IProject project = (IProject) element;
return project.isAccessible();
}
if (element instanceof ITmfProjectModelElement) {
ITmfProjectModelElement modelElement = (ITmfProjectModelElement) element;
return modelElement.hasChildren();
}
return false;
}
@Override
public void dispose() {
// Do nothing
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// Do nothing
}
@Override
public void restoreState(IMemento aMemento) {
// Do nothing
}
@Override
public void saveState(IMemento aMemento) {
// Do nothing
}
@Override
public void init(ICommonContentExtensionSite aConfig) {
// Do nothing
}
// ------------------------------------------------------------------------
// ICommonContentProvider - getChildren()
// ------------------------------------------------------------------------
@Override
public synchronized Object[] getChildren(Object parentElement) {
// Tracing project level
if (parentElement instanceof IProject) {
IProject parentProject = (IProject) parentElement;
if (TmfProjectElement.showProjectRoot(parentProject)) {
if (TmfProjectModelHelper.shadowProjectAccessible(parentProject)) {
TmfProjectElement[] elements = new TmfProjectElement[1];
elements[0] = TmfProjectRegistry.getProject(parentProject, true);
return elements;
}
return new Object[0];
}
TmfProjectElement element = TmfProjectRegistry.getProject(parentProject, true);
return element.getChildren().toArray();
}
// Other project model elements
if (parentElement instanceof ITmfProjectModelElement) {
return ((ITmfProjectModelElement) parentElement).getChildren().toArray();
}
return new Object[0];
}
// ------------------------------------------------------------------------
// IPipelinedTreeContentProvider
// ------------------------------------------------------------------------
@Override
public void getPipelinedChildren(Object parent, Set currentChildren) {
customizeTmfElements(getChildren(parent), currentChildren);
}
@Override
public void getPipelinedElements(Object input, Set currentElements) {
customizeTmfElements(getElements(input), currentElements);
}
/**
* Add/replace the ITmfProjectElement to the list of children
*
* @param elements
* the list returned by getChildren()
* @param children
* the current children
*/
private static void customizeTmfElements(Object[] elements,
Set<Object> children) {
if (elements != null && children != null) {
for (Object element : elements) {
if (element instanceof ITmfProjectModelElement) {
ITmfProjectModelElement tmfElement = (ITmfProjectModelElement) element;
IResource resource = tmfElement.getResource();
if (resource != null) {
children.remove(resource);
}
children.add(element);
}
else if (element != null) {
children.add(element);
}
}
}
}
@Override
public Object getPipelinedParent(Object anObject, Object aSuggestedParent) {
return aSuggestedParent;
}
@Override
public PipelinedShapeModification interceptAdd(PipelinedShapeModification anAddModification) {
return anAddModification;
}
@Override
public PipelinedShapeModification interceptRemove(PipelinedShapeModification aRemoveModification) {
return null;
}
@Override
public boolean interceptRefresh(PipelinedViewerUpdate aRefreshSynchronization) {
return false;
}
@Override
public boolean interceptUpdate(PipelinedViewerUpdate anUpdateSynchronization) {
return false;
}
}