blob: a4fbe60b1c42bd51d8e08a4dc4ab9b751d9c7466 [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
*/
/* -- ST-Origin --
* Source folder: org.eclipse.cdt.ui/src
* Class: org.eclipse.cdt.internal.ui.includebrowser.IncludeBrowserUI
* Version: 1.1
*/
package org.eclipse.ptp.internal.rdt.core.includebrowser;
import java.util.ArrayList;
import java.util.HashSet;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IIndexInclude;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IInclude;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ptp.internal.rdt.core.index.IndexQueries;
import org.eclipse.ptp.rdt.core.RDTLog;
public class LocalIncludeBrowserService extends AbstractIncludeBrowserService {
private static final IIndexIncludeValue[] EMPTY = new IIndexIncludeValue[0];
private IIndexInclude[] findIncludedBy(IIndex index, IIndexFileLocation ifl, IProgressMonitor pm) {
try {
if (ifl != null) {
IIndexFile[] files= index.getFiles(ifl);
if (files.length == 1) {
return index.findIncludedBy(files[0]);
}
if (files.length > 0) {
ArrayList<IIndexInclude> list= new ArrayList<IIndexInclude>();
HashSet<IIndexFileLocation> handled= new HashSet<IIndexFileLocation>();
for (int i = 0; i < files.length; i++) {
final IIndexInclude[] includes = index.findIncludedBy(files[i]);
for (int j = 0; j < includes.length; j++) {
IIndexInclude indexInclude = includes[j];
if (handled.add(indexInclude.getIncludedByLocation())) {
list.add(indexInclude);
}
}
}
return list.toArray(new IIndexInclude[list.size()]);
}
}
}
catch (CoreException e) {
CCorePlugin.log(e);
}
return new IIndexInclude[0];
}
private IIndexInclude[] findIncludesTo(IIndex index, IIndexFileLocation ifl, IProgressMonitor pm) {
try {
if (ifl != null) {
IIndexFile[] files= index.getFiles(ifl);
if (files.length == 1) {
return index.findIncludes(files[0]);
}
if (files.length > 0) {
ArrayList<IIndexInclude> list= new ArrayList<IIndexInclude>();
HashSet<IIndexFileLocation> handled= new HashSet<IIndexFileLocation>();
for (int i = 0; i < files.length; i++) {
final IIndexInclude[] includes = index.findIncludes(files[i]);
for (int j = 0; j < includes.length; j++) {
IIndexInclude indexInclude = includes[j];
if (handled.add(indexInclude.getIncludesLocation())) {
list.add(indexInclude);
}
}
}
return list.toArray(new IIndexInclude[list.size()]);
}
}
}
catch (CoreException e) {
CCorePlugin.log(e);
}
return new IIndexInclude[0];
}
public IIndexIncludeValue[] findIncludedBy(IIndexFileLocation ifl, ICProject project, IProgressMonitor progress) {
IIndex index = null;
try {
ICProject[] scope= CoreModel.getDefault().getCModel().getCProjects();
index= CCorePlugin.getIndexManager().getIndex(scope);
index.acquireReadLock();
IIndexInclude[] includes = findIncludedBy(index, ifl, progress);
IIndexIncludeValue[] includeValues = new IIndexIncludeValue[includes.length];
for (int i = 0; i < includes.length; i ++)
{
includeValues[i] = new IndexIncludeValue(includes[i]);
}
return includeValues;
} catch (CoreException e) {
CCorePlugin.log(e);
return EMPTY;
} catch (InterruptedException e) {
return EMPTY;
} finally {
if (index != null)
index.releaseReadLock();
}
}
public IIndexIncludeValue[] findIncludesTo(IIndexFileLocation ifl, ICProject project, IProgressMonitor progress) {
IIndex index = null;
try {
ICProject[] scope= CoreModel.getDefault().getCModel().getCProjects();
index= CCorePlugin.getIndexManager().getIndex(scope);
index.acquireReadLock();
IIndexInclude[] includes = findIncludesTo(index, ifl, progress);
IIndexIncludeValue[] includeValues = new IIndexIncludeValue[includes.length];
for (int i = 0; i < includes.length; i ++)
{
includeValues[i] = new IndexIncludeValue(includes[i]);
}
return includeValues;
} catch (CoreException e) {
CCorePlugin.log(e);
return EMPTY;
} catch (InterruptedException e) {
return EMPTY;
} finally {
if (index != null)
index.releaseReadLock();
}
}
public IIndexIncludeValue findInclude(IInclude input, IProgressMonitor monitor) throws CoreException {
ICProject project= input.getCProject();
if (project != null) {
IIndex index= CCorePlugin.getIndexManager().getIndex(project);
try {
index.acquireReadLock();
try {
IIndexInclude include = IndexQueries.elementToInclude(index, input);
return new IndexIncludeValue(include);
} finally {
index.releaseReadLock();
}
} catch (InterruptedException e) {
return null;
}
}
return null;
}
public boolean isIndexed(IIndexFileLocation location, ICProject project, IProgressMonitor monitor)
{
try
{
final ICProject[] projects= CoreModel.getDefault().getCModel().getCProjects();
IIndex index= CCorePlugin.getIndexManager().getIndex(projects);
index.acquireReadLock();
try
{
IIndexFile[] files= index.getFiles(location);
return files.length > 0;
}
finally
{
index.releaseReadLock();
}
}
catch (CoreException e) {
RDTLog.logError(e);
} catch (InterruptedException e) {
RDTLog.logError(e);
}
return false;
}
}