/******************************************************************************* * 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()); } } }