package com.sysdeo.eclipse.tomcat.editors;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.CheckedListDialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.ide.IDE;
import com.sysdeo.eclipse.tomcat.TomcatLauncherPlugin;
import com.sysdeo.eclipse.tomcat.TomcatPluginResources;
public class ProjectListEditor implements TomcatPluginResources {
private CheckedListDialogField fProjectsList;
private String[] fExcludedNatures;
public ProjectListEditor() {
this(new String[0]);
}
public ProjectListEditor(String[] excludedNatures) {
this.fExcludedNatures = excludedNatures;
String[] buttonLabels= new String[] {
PREF_PAGE_SELECTALL_LABEL,
PREF_PAGE_UNSELECTALL_LABEL
};
fProjectsList= new CheckedListDialogField(null, buttonLabels, new MyLabelProvider());
fProjectsList.setCheckAllButtonIndex(0);
fProjectsList.setUncheckAllButtonIndex(1);
updateProjectsList();
// fProjectsList.setViewerSorter(new CPListElementSorter());
}
public void setEnabled(boolean enabled) {
fProjectsList.setEnabled(enabled);
}
public void init(IJavaProject jproject) {
updateProjectsList();
}
public void setLabel(String label) {
fProjectsList.setLabelText(label);
}
private void updateProjectsList() {
try {
IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
IProject[] projects = root.getProjects();
List projectsList = new ArrayList(projects.length);
for (int i= 0; i < projects.length; i++) {
IProject proj = projects[i];
if(projects[i].isOpen()) {
boolean accept = true;
for (int j = 0; j < fExcludedNatures.length; j++) {
if(proj.hasNature(fExcludedNatures[j])) accept = false;
}
if(accept) {
projectsList.add(new ProjectListElement(proj));
}
}
}
// Remove Tomcat project for preference Store (for compatibility between tomcat plugin versions V2.x and V3)
List oldProjectsInCP = TomcatLauncherPlugin.getDefault().getProjectsInCP();
List newProjectsInCP = new ArrayList();
for (Iterator iter = oldProjectsInCP.iterator(); iter.hasNext();) {
ProjectListElement element = (ProjectListElement) iter.next();
boolean accept = true;
for (int j = 0; j < fExcludedNatures.length; j++) {
if(element.getProject().hasNature(fExcludedNatures[j])) accept = false;
}
if(accept) {
newProjectsInCP.add(element);
}
}
/* Quick hack :
* Using reflection for compatability with Eclipse 2.1 and 3.0 M9
*
* Old code :
* fProjectsList.setElements(projectsList);
* fProjectsList.setCheckedElements(TomcatLauncherPlugin.getDefault().getProjectsInCP());
*/
this.invokeForCompatibility("setElements", projectsList);
this.invokeForCompatibility("setCheckedElements", newProjectsInCP);
} catch (Exception e) {
/* Old code :
* fProjectsList.setElements(new ArrayList(5));
*/
this.invokeForCompatibility("setElements", new ArrayList(5));
}
}
// -------- UI creation ---------
public Control getControl(Composite parent) {
Composite composite= new Composite(parent, SWT.NONE);
// fProjectsList.doFillIntoGrid(composite,3);
LayoutUtil.doDefaultLayout(composite, new DialogField[] { fProjectsList }, true, 0, 0);
return composite;
}
public List getCheckedElements() {
return (List)fProjectsList.getCheckedElements();
}
public void setCheckedElements(List projects) {
/* Old code :
* fProjectsList.setCheckedElements(projects);
*/
this.invokeForCompatibility("setCheckedElements", projects);
}
private class MyLabelProvider extends LabelProvider {
/*
* @see ILabelProvider#getImage(Object)
*/
public Image getImage(Object element) {
IWorkbench workbench= JavaPlugin.getDefault().getWorkbench();
return workbench.getSharedImages().getImage(IDE.SharedImages.IMG_OBJ_PROJECT);
}
/*
* @see ILabelProvider#getText(Object)
*/
public String getText(Object element) {
return super.getText(element);
}
}
/* Quick hack :
* Using reflection for compatability with Eclipse 2.1 and 3.0 M9
*/
private void invokeForCompatibility(String methodName, List projects) {
Class clazz = fProjectsList.getClass();
Class[] collectionParameter = {Collection.class};
try {
Method method = clazz.getMethod(methodName, collectionParameter);
Object[] args = {projects};
method.invoke(fProjectsList, args);
} catch (Exception e) {
Class[] listParameter = {List.class};
try {
Method method = clazz.getMethod(methodName, listParameter);
Object[] args = {projects};
method.invoke(fProjectsList, args);
} catch (Exception ex) {
TomcatLauncherPlugin.log(ex);
}
}
}
}