blob: 1bd368ebf1756fc101820443b76c48e076894ec1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Wind River Systems, Inc. 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:
* Markus Schorn - initial API and implementation
* IBM Corporation
*******************************************************************************/
/* -- ST-Origin --
* Source folder: org.eclipse.cdt.ui/src
* Class: org.eclipse.cdt.internal.ui.includebrowser.IBContentProvider
* Version: 1.16
*/
package org.eclipse.ptp.internal.rdt.ui.includebrowser;
import java.util.ArrayList;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.ui.includebrowser.IBFile;
import org.eclipse.cdt.internal.ui.includebrowser.IBNode;
import org.eclipse.cdt.internal.ui.viewsupport.AsyncTreeContentProvider;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ptp.internal.rdt.core.includebrowser.IIncludeBrowserService;
import org.eclipse.ptp.internal.rdt.core.includebrowser.IIndexIncludeValue;
import org.eclipse.ptp.internal.rdt.core.includebrowser.IncludeBrowserServiceFactory;
import org.eclipse.swt.widgets.Display;
/**
* This is the content provider for the include browser.
*/
public class IBContentProvider extends AsyncTreeContentProvider {
private boolean fComputeIncludedBy = true;
private IncludeBrowserServiceFactory fServiceFactory;
/**
* Constructs the content provider.
*/
public IBContentProvider(Display disp) {
super(disp);
}
@Override
public Object getParent(Object element) {
if (element instanceof IBNode) {
IBNode node = (IBNode) element;
return node.getParent();
}
return super.getParent(element);
}
@Override
protected Object[] syncronouslyComputeChildren(Object parentElement) {
if (parentElement instanceof ITranslationUnit) {
ITranslationUnit tu = (ITranslationUnit) parentElement;
return new Object[] { new IBNode(null, new IBFile(tu), null, 0, 0, 0) };
}
if (parentElement instanceof IBNode) {
IBNode node = (IBNode) parentElement;
if (node.isRecursive() || node.getRepresentedIFL() == null) {
return NO_CHILDREN;
}
}
// allow for async computation
return null;
}
@Override
protected Object[] asyncronouslyComputeChildren(Object parentElement, IProgressMonitor monitor) {
if (parentElement instanceof IBNode)
{
IBNode node = (IBNode) parentElement;
IIndexFileLocation ifl= node.getRepresentedIFL();
ICProject project= node.getCProject();
if (ifl == null) {
return NO_CHILDREN;
}
IBFile directiveFile= null;
IBFile targetFile= null;
IIndexIncludeValue[] includes;
if (fServiceFactory == null)
fServiceFactory = new IncludeBrowserServiceFactory();
IIncludeBrowserService service = fServiceFactory.getIncludeBrowserService(project);
if (service == null)
return NO_CHILDREN;
if (fComputeIncludedBy) {
includes = service.findIncludedBy(ifl, project, monitor);
}
else {
includes= service.findIncludesTo(ifl, project, monitor);
directiveFile= node.getRepresentedFile();
}
if (includes.length > 0) {
ArrayList<IBNode> result= new ArrayList<IBNode>(includes.length);
for (int i = 0; i < includes.length; i++) {
IIndexIncludeValue include = includes[i];
try {
if (fComputeIncludedBy) {
directiveFile= targetFile= new IBFile(project, include.getIncludedByLocation());
}
else {
IIndexFileLocation includesPath= include.getIncludesLocation();
if (includesPath == null) {
targetFile= new IBFile(include.getFullName());
}
else {
targetFile= new IBFile(project, includesPath);
}
}
IBNode newnode= new IBNode(node, targetFile, directiveFile,
include.getNameOffset(),
include.getNameLength(),
include.getIncludedByTimestamp());
newnode.setIsActiveCode(include.isActive());
newnode.setIsSystemInclude(include.isSystemInclude());
result.add(newnode);
}
catch (CoreException e) {
CUIPlugin.log(e);
}
}
return result.toArray();
}
}
return NO_CHILDREN;
}
public void setComputeIncludedBy(boolean value) {
fComputeIncludedBy = value;
}
public boolean getComputeIncludedBy() {
return fComputeIncludedBy;
}
public IncludeBrowserServiceFactory getServiceFactory()
{
return this.fServiceFactory;
}
}