lwjgl/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/LWJGLClasspathContainerPage...

280 lines
8.3 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.io.StringWriter;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.ui.JavaElementLabels;
import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension;
import org.eclipse.jdt.ui.wizards.NewElementWizardPage;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
/**
* LWJGLClasspathContainerPage
* There should really be more documentation here.
*
* @author Jens von Pilgrim
* @since Dec 5, 2008
*/
public class LWJGLClasspathContainerPage extends NewElementWizardPage implements
IClasspathContainerPage, IClasspathContainerPageExtension {
private IClasspathEntry containerEntryResult;
private Label labelResolvedPath;
private Label labelResolvedSourcePath;
private Label labelResolvedDocPath;
private Label labelNativePath;
public LWJGLClasspathContainerPage() {
super("LWJGLContainterPage"); //$NON-NLS-1$
setTitle("LWJGL Library");
setDescription("Adds LWJGL Java Libraries to build path");
setImageDescriptor(JavaPluginImages.DESC_WIZBAN_ADD_LIBRARY);
containerEntryResult = JavaCore
.newContainerEntry(LWJGLClasspathContainerInitializer.LWJGL_LIBRARY_PATH);
}
public static IJavaProject getPlaceholderProject() {
String name = "####internal"; //$NON-NLS-1$
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
while (true) {
IProject project = root.getProject(name);
if (!project.exists()) {
return JavaCore.create(project);
}
name += '1';
}
}
public boolean finish() {
try {
IJavaProject[] javaProjects = new IJavaProject[] { getPlaceholderProject() };
IClasspathContainer[] containers = { null };
JavaCore.setClasspathContainer(containerEntryResult.getPath(),
javaProjects, containers, null);
} catch (JavaModelException e) {
perform(e, getShell(), e.getMessage());
return false;
}
return true;
}
public IClasspathEntry getSelection() {
return containerEntryResult;
}
public void setSelection(IClasspathEntry containerEntry) {
containerEntryResult = containerEntry;
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
composite.setLayout(new GridLayout(2, false));
createLabel(composite, "Path");
labelResolvedPath = createPathLabel(composite);
createLabel(composite, "Source Path");
labelResolvedSourcePath = createPathLabel(composite);
createLabel(composite, "JavaDoc Path");
labelResolvedDocPath = createPathLabel(composite);
createLabel(composite, "Native Path");
labelNativePath = createPathLabel(composite);
update();
setControl(composite);
}
private void createLabel(Composite parent, String strLabel) {
Label label = new Label(parent, SWT.NONE);
label.setFont(parent.getFont());
label.setText(strLabel);
label.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false, 1, 1));
}
private Label createPathLabel(Composite parent) {
Label label = new Label(parent, SWT.WRAP);
label.setFont(parent.getFont());
label.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true,
true, 1, 1));
return label;
}
protected void update() {
IStatus status = null;
IClasspathEntry[] libEntries = BuildPathSupport
.getLWJGLLibraryEntries();
IPath containerPath = LWJGLClasspathContainerInitializer.LWJGL_LIBRARY_PATH;
containerEntryResult = JavaCore.newContainerEntry(containerPath);
if (libEntries == null) {
status = new Status(ERROR, Activator.PLUGIN_ID,
"No LWJGL library found");
} else
if (labelResolvedPath != null && !labelResolvedPath.isDisposed()) {
// implies all other labels to be created and not yet disposed
if (libEntries != null) {
Set<String> setLines = new TreeSet<String>();
IPath path;
for (IClasspathEntry entry : libEntries) {
path = entry.getPath();
if (path != null) {
setLines.add(getPathLabel(path));
}
}
setLabel(labelResolvedPath, setLines);
setLines.clear();
for (IClasspathEntry entry : libEntries) {
path = entry.getSourceAttachmentPath();
if (path != null) {
setLines.add(getPathLabel(path));
}
}
setLabel(labelResolvedSourcePath, setLines);
setLines.clear();
for (IClasspathEntry entry : libEntries) {
if (entry.getExtraAttributes() != null) {
for (IClasspathAttribute attr : entry
.getExtraAttributes()) {
if (IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME
.equals(attr.getName())) {
setLines.add(attr.getValue());
break;
}
if (JavaRuntime.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY.equals(attr.getName())) {
}
}
}
}
setLabel(labelResolvedDocPath, setLines);
setLines.clear();
for (IClasspathEntry entry : libEntries) {
if (entry.getExtraAttributes() != null) {
for (IClasspathAttribute attr : entry
.getExtraAttributes()) {
if (JavaRuntime.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY.equals(attr.getName())) {
setLines.add(attr.getValue());
}
}
}
}
setLabel(labelNativePath, setLines);
} else {
labelResolvedPath.setText("not found");
labelResolvedSourcePath.setText("not found");
labelResolvedDocPath.setText("not found");
}
}
if (status != null)
updateStatus(status);
}
/**
* @param i_labelResolvedDocPath
* @param i_setDocPaths
*/
private void setLabel(Label label, Set<String> lines) {
StringBuffer strb = new StringBuffer();
for (String str : lines) {
if (strb.length() > 0) {
strb.append("\n");
}
strb.append(str);
}
label.setText(strb.toString());
}
private String getPathLabel(IPath path) {
StringBuffer buf = new StringBuffer(BasicElementLabels
.getResourceName(path.lastSegment()));
buf.append(JavaElementLabels.CONCAT_STRING);
buf.append(BasicElementLabels.getPathLabel(path.removeLastSegments(1),
true));
return buf.toString();
}
/* (non-Javadoc)
* @see org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension#initialize(org.eclipse.jdt.core.IJavaProject, org.eclipse.jdt.core.IClasspathEntry[])
*/
public void initialize(IJavaProject project,
IClasspathEntry[] currentEntries) {
}
protected void perform(CoreException e, Shell shell, String message) {
IStatus status = e.getStatus();
if (status != null) {
ErrorDialog.openError(shell, "LWJGL Library", message, status);
} else {
StringWriter msg = new StringWriter();
if (message != null) {
msg.write(message);
msg.write("\n\n"); //$NON-NLS-1$
}
if (message == null || message.length() == 0)
msg.write("Unknown error adding LWJGL library");
else
msg.write(message);
MessageDialog.openError(shell, "LWJGL Library", msg.toString());
}
}
}