234 lines
7.7 KiB
Java
234 lines
7.7 KiB
Java
/*******************************************************************************
|
|
* Copyright (c) 2011 LWJGL Project 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, and under the terms of the
|
|
* BSD license, see http://lwjgl.org/license.php for details.
|
|
*
|
|
* Contributors:
|
|
* Jens von Pilgrim - initial implementation
|
|
******************************************************************************/
|
|
package org.lwjgl.tools;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import org.eclipse.core.runtime.CoreException;
|
|
import org.eclipse.core.runtime.IPath;
|
|
import org.eclipse.core.runtime.IStatus;
|
|
import org.eclipse.core.runtime.Path;
|
|
import org.eclipse.core.runtime.Status;
|
|
import org.eclipse.jdt.core.ClasspathContainerInitializer;
|
|
import org.eclipse.jdt.core.IClasspathAttribute;
|
|
import org.eclipse.jdt.core.IClasspathContainer;
|
|
import org.eclipse.jdt.core.IClasspathEntry;
|
|
import org.eclipse.jdt.core.IJavaModel;
|
|
import org.eclipse.jdt.core.IJavaProject;
|
|
import org.eclipse.jdt.core.JavaCore;
|
|
import org.eclipse.jdt.core.JavaModelException;
|
|
import org.eclipse.jdt.launching.JavaRuntime;
|
|
|
|
/**
|
|
* LWJGLClasspathContainerInitializer sets up LWJGL library path.
|
|
*
|
|
* Parts of this code were copied and modified from
|
|
* {@link org.eclipse.jdt.internal.junit.buildpath.JUnitContainerInitializer},
|
|
* which is licensed under the EPL as well.
|
|
*
|
|
* @author Jens von Pilgrim
|
|
* @version $Revision$
|
|
* @since Dec 5, 2008
|
|
*/
|
|
public class LWJGLClasspathContainerInitializer extends
|
|
ClasspathContainerInitializer {
|
|
|
|
public static String LWJGL_LIBRARY_ID = "org.lwjgl.LWJGL_CONTAINER";
|
|
|
|
public static IPath LWJGL_LIBRARY_PATH = new Path(LWJGL_LIBRARY_ID);
|
|
|
|
private static final IStatus NOT_SUPPORTED = new Status(IStatus.ERROR,
|
|
Activator.PLUGIN_ID,
|
|
ClasspathContainerInitializer.ATTRIBUTE_NOT_SUPPORTED,
|
|
new String(), null);
|
|
|
|
private static class LWJGLClasspathContainer implements IClasspathContainer {
|
|
|
|
private final IClasspathEntry[] fEntries;
|
|
|
|
private final IPath fPath;
|
|
|
|
public LWJGLClasspathContainer(IPath path, IClasspathEntry[] entries) {
|
|
fPath = path;
|
|
fEntries = entries;
|
|
}
|
|
|
|
public IClasspathEntry[] getClasspathEntries() {
|
|
return fEntries;
|
|
}
|
|
|
|
public String getDescription() {
|
|
return "LWJGL Libraries";
|
|
}
|
|
|
|
public int getKind() {
|
|
return IClasspathContainer.K_APPLICATION;
|
|
}
|
|
|
|
public IPath getPath() {
|
|
return fPath;
|
|
}
|
|
|
|
}
|
|
|
|
public LWJGLClasspathContainerInitializer() {
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
* @see org.eclipse.jdt.core.ClasspathContainerInitializer#initialize(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
|
|
*/
|
|
public void initialize(IPath containerPath, IJavaProject project)
|
|
throws CoreException {
|
|
if (isValidLWJGLContainerPath(containerPath)) {
|
|
LWJGLClasspathContainer container = getNewContainer(containerPath);
|
|
|
|
JavaCore.setClasspathContainer(containerPath,
|
|
new IJavaProject[] { project },
|
|
new IClasspathContainer[] { container }, null);
|
|
}
|
|
|
|
}
|
|
|
|
private static boolean isValidLWJGLContainerPath(IPath path) {
|
|
return path != null && path.segmentCount() > 0
|
|
&& LWJGL_LIBRARY_ID.equals(path.segment(0));
|
|
}
|
|
|
|
private static LWJGLClasspathContainer getNewContainer(IPath containerPath) {
|
|
IClasspathEntry[] entries = null;
|
|
// String version = containerPath.segment(1);
|
|
entries = BuildPathSupport.getLWJGLLibraryEntries();
|
|
|
|
if (entries == null)
|
|
entries = new IClasspathEntry[] {};
|
|
|
|
return new LWJGLClasspathContainer(containerPath, entries);
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
* @see org.eclipse.jdt.core.ClasspathContainerInitializer#canUpdateClasspathContainer(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
|
|
*/
|
|
public boolean canUpdateClasspathContainer(IPath containerPath,
|
|
IJavaProject project) {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
* @see org.eclipse.jdt.core.ClasspathContainerInitializer#getAccessRulesStatus(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
|
|
*/
|
|
public IStatus getAccessRulesStatus(IPath containerPath,
|
|
IJavaProject project) {
|
|
return NOT_SUPPORTED;
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
* @see org.eclipse.jdt.core.ClasspathContainerInitializer#getSourceAttachmentStatus(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
|
|
*/
|
|
public IStatus getSourceAttachmentStatus(IPath containerPath,
|
|
IJavaProject project) {
|
|
return Status.OK_STATUS;
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
* @see org.eclipse.jdt.core.ClasspathContainerInitializer#getAttributeStatus(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject, java.lang.String)
|
|
*/
|
|
public IStatus getAttributeStatus(IPath containerPath,
|
|
IJavaProject project, String attributeKey) {
|
|
if (attributeKey
|
|
.equals(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME)) {
|
|
return Status.OK_STATUS;
|
|
}
|
|
if (attributeKey.equals(JavaRuntime.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY)) {
|
|
return Status.OK_STATUS;
|
|
}
|
|
|
|
return NOT_SUPPORTED;
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
* @see org.eclipse.jdt.core.ClasspathContainerInitializer#requestClasspathContainerUpdate(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject, org.eclipse.jdt.core.IClasspathContainer)
|
|
*/
|
|
public void requestClasspathContainerUpdate(IPath containerPath,
|
|
IJavaProject project, IClasspathContainer containerSuggestion)
|
|
throws CoreException {
|
|
IClasspathEntry[] entries = containerSuggestion.getClasspathEntries();
|
|
if (entries.length == 1 && isValidLWJGLContainerPath(containerPath)) {
|
|
// String version = containerPath.segment(1);
|
|
|
|
// only modifiable entry in Javadoc location
|
|
IClasspathAttribute[] extraAttributes = entries[0]
|
|
.getExtraAttributes();
|
|
for (int i = 0; i < extraAttributes.length; i++) {
|
|
IClasspathAttribute attrib = extraAttributes[i];
|
|
if (attrib.getName().equals(
|
|
IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME)) {
|
|
break;
|
|
}
|
|
}
|
|
rebindClasspathEntries(project.getJavaModel(), containerPath);
|
|
}
|
|
}
|
|
|
|
private static void rebindClasspathEntries(IJavaModel model,
|
|
IPath containerPath) throws JavaModelException {
|
|
List<IJavaProject> affectedProjects = new ArrayList<IJavaProject>();
|
|
|
|
IJavaProject[] projects = model.getJavaProjects();
|
|
for (int i = 0; i < projects.length; i++) {
|
|
IJavaProject project = projects[i];
|
|
IClasspathEntry[] entries = project.getRawClasspath();
|
|
for (int k = 0; k < entries.length; k++) {
|
|
IClasspathEntry curr = entries[k];
|
|
if (curr.getEntryKind() == IClasspathEntry.CPE_CONTAINER
|
|
&& containerPath.equals(curr.getPath())) {
|
|
affectedProjects.add(project);
|
|
}
|
|
}
|
|
}
|
|
if (!affectedProjects.isEmpty()) {
|
|
IJavaProject[] affected = (IJavaProject[]) affectedProjects
|
|
.toArray(new IJavaProject[affectedProjects.size()]);
|
|
IClasspathContainer[] containers = new IClasspathContainer[affected.length];
|
|
for (int i = 0; i < containers.length; i++) {
|
|
containers[i] = getNewContainer(containerPath);
|
|
}
|
|
JavaCore.setClasspathContainer(containerPath, affected, containers,
|
|
null);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
* @see org.eclipse.jdt.core.ClasspathContainerInitializer#getDescription(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
|
|
*/
|
|
public String getDescription(IPath containerPath, IJavaProject project) {
|
|
return "LWJGL library settings, including required java libraries "
|
|
+ "(jars) and native libraries.";
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
* @see org.eclipse.jdt.core.ClasspathContainerInitializer#getComparisonID(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
|
|
*/
|
|
public Object getComparisonID(IPath containerPath, IJavaProject project) {
|
|
return containerPath;
|
|
}
|
|
|
|
}
|