blob: 5c31c4151ae94fa5b3d7b8430246fbea19f59503 [file] [log] [blame]
package org.eclipse.jdt.internal.ui.launcher;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.ui.dialogs.ListSelectionDialog;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
import org.eclipse.jdt.internal.ui.viewsupport.ListContentProvider;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField;
import org.eclipse.jdt.internal.ui.wizards.swt.MGridData;
import org.eclipse.jdt.internal.ui.wizards.swt.MGridLayout;
import org.eclipse.jdt.launching.ProjectSourceLocator;
public class SourceLookupPropertyPage extends JavaProjectPropertyPage {
private ListDialogField fListField;
private Button fUseBuildClasspath;
private Button fUseCustomLookup;
private boolean fFirst= true;
private static final String PREFIX= "SourceLookupPropertyPage.";
private static final String ADD_PROJECT= PREFIX+"add_project.label";
private static final String UP= PREFIX+"up.label";
private static final String DOWN= PREFIX+"down.label";
private static final String REMOVE= PREFIX+"remove.label";
private static final String USE_BUILDPATH= PREFIX+"use_buildpath.label";
private static final String USE_CUSTOM= PREFIX+"use_custom.label";
private static final String ADD_PROJECT_MESSAGE= PREFIX+"add_project.message";
private static final String JM_EXCEPTION= PREFIX+"javamodel.error.";
class ListAdapter implements IListAdapter {
public void customButtonPressed(DialogField field, int index) {
addProject();
}
public void selectionChanged(DialogField field) {
}
}
public SourceLookupPropertyPage() {
}
public Control createJavaContents(Composite ancestor) {
fListField= new ListDialogField(new ListAdapter(),
new String[] { JavaLaunchUtils.getResourceString(ADD_PROJECT) },
new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_BASICS),
ListDialogField.UPDOWN);
fListField.setUpButtonLabel(JavaLaunchUtils.getResourceString(UP));
fListField.setDownButtonLabel(JavaLaunchUtils.getResourceString(DOWN));
fListField.setRemoveButtonLabel(JavaLaunchUtils.getResourceString(REMOVE) );
Group parent= new Group(ancestor, SWT.NONE);
parent.setLayoutData(new GridData());
MGridLayout gl= new MGridLayout();
gl.numColumns= 3;
parent.setLayout(gl);
fUseBuildClasspath= new Button(parent, SWT.RADIO);
fUseBuildClasspath.setText(JavaLaunchUtils.getResourceString(USE_BUILDPATH));
MGridData gd= new MGridData();
gd.horizontalSpan= 3;
fUseBuildClasspath.setLayoutData(gd);
fUseCustomLookup= new Button(parent, SWT.RADIO);
fUseCustomLookup.setText(JavaLaunchUtils.getResourceString(USE_CUSTOM));
gd= new MGridData();
gd.horizontalSpan= 3;
fUseCustomLookup.setLayoutData(gd);
fUseCustomLookup.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
enableCustomLookup(fUseCustomLookup.getSelection());
}
});
fListField.doFillIntoGrid(parent, 3);
return parent;
}
public void setVisible(boolean visible) {
IJavaProject p= getJavaProject();
if (p != null && fFirst && visible) {
fFirst= false;
initialSetup(p);
}
super.setVisible(visible);
}
private void initialSetup(IJavaProject project) {
List lookup= null;
IJavaProject[] customLookup= null;
try {
customLookup= ProjectSourceLocator.getSourceLookupPath(project);
} catch (JavaModelException e) {
}
if (customLookup != null) {
lookup= new ArrayList();
for (int i= 0; i < customLookup.length; i++) {
lookup.add(customLookup[i]);
}
enableCustomLookup(true);
} else {
lookup= computeDefaultLookup(project);
enableCustomLookup(false);
}
fListField.setElements(lookup);
}
protected void performDefaults() {
fListField.setElements(computeDefaultLookup(getJavaProject()));
enableCustomLookup(false);
super.performDefaults();
}
public boolean performOk() {
IJavaProject p= getJavaProject();
if (p == null)
return true;
try {
if (fUseBuildClasspath.getSelection()) {
ProjectSourceLocator.setSourceLookupPath(p, null);
} else {
List lookup= fListField.getElements();
IJavaProject[] projects= new IJavaProject[lookup.size()];
ProjectSourceLocator.setSourceLookupPath(p, (IJavaProject[])lookup.toArray(projects));
}
} catch (JavaModelException e) {
ExceptionHandler.handle(e, getShell(), JavaLaunchUtils.getResourceBundle(), JM_EXCEPTION);
}
return true;
}
private void enableCustomLookup(boolean enable) {
fListField.setEnabled(enable);
if (enable) {
fUseBuildClasspath.setSelection(false);
fUseCustomLookup.setSelection(true);
} else {
fUseBuildClasspath.setSelection(true);
fUseCustomLookup.setSelection(false);
}
}
private List computeDefaultLookup(IJavaProject project) {
ArrayList lookup= new ArrayList();
lookup.add(project);
try {
List referenced= getProjectsOnClassPath(project);
lookup.addAll(referenced);
} catch (JavaModelException e) {
}
return lookup;
}
private List getProjectsOnClassPath(IJavaProject project) throws JavaModelException {
IJavaModel jm= project.getJavaModel();
IClasspathEntry[] cp= project.getResolvedClasspath(true);
ArrayList l= new ArrayList();
for (int i= 0; i < cp.length; i++) {
if (cp[i].getEntryKind() == IClasspathEntry.CPE_PROJECT) {
IJavaProject p= jm.getJavaProject(cp[i].getPath().lastSegment());
l.add(p);
}
}
return l;
}
private void addProject() {
List unusedProjects= getUnusedProjects();
ListSelectionDialog dialog= new ListSelectionDialog(getShell(), unusedProjects,
new ListContentProvider(),
new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_BASICS),
JavaLaunchUtils.getResourceString(ADD_PROJECT_MESSAGE));
if (dialog.open() == dialog.OK) {
Object[] result= dialog.getResult();
for (int i= 0; i < result.length; i++) {
fListField.addElement(result[i]);
}
}
}
private List getUnusedProjects() {
ArrayList unused= new ArrayList();
try {
IJavaProject[] allProjects= getJavaProject().getJavaModel().getJavaProjects();
List used= fListField.getElements();
for (int i= 0; i < allProjects.length; i++) {
if (!used.contains(allProjects[i]))
unused.add(allProjects[i]);
}
} catch (JavaModelException e) {
ExceptionHandler.handle(e, getShell(), JavaLaunchUtils.getResourceBundle(), JM_EXCEPTION);
}
return unused;
}
}