package org.rubypeople.rdt.internal.ui; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.ide.IDE.SharedImages; import org.rubypeople.rdt.core.IRubyProject; import org.rubypeople.rdt.core.RubyCore; import org.rubypeople.rdt.core.RubyModelException; import org.rubypeople.rdt.internal.core.RubyProject; public class RubyProjectLibraryPage { protected RubyProject workingProject; protected RubyProjectLibraryPage(RubyProject theWorkingProject) { super(); workingProject = theWorkingProject; } protected Control getControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new FillLayout()); Table projectsTable = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION); projectsTable.setHeaderVisible(false); projectsTable.setLinesVisible(false); projectsTable.computeSize(SWT.DEFAULT, SWT.DEFAULT); TableColumn tableColumn = new TableColumn(projectsTable, SWT.NONE); tableColumn.setWidth(200); tableColumn.setText(RubyUIMessages.RubyProjectLibraryPage_project); CheckboxTableViewer projectsTableViewer = new CheckboxTableViewer(projectsTable); projectsTableViewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { projectCheckedUnchecked(event); } }); projectsTableViewer.setContentProvider(getContentProvider()); projectsTableViewer.setLabelProvider(getLabelProvider()); projectsTableViewer.setInput(getWorkspaceProjects()); List<IProject> referencedProjects = new ArrayList(); try { String[] names = workingProject.getRequiredProjectNames(); for (int i = 0; i < names.length; i++) { List<IProject> workspaceProjects = getWorkspaceProjects(); for (IProject workspaceProject : workspaceProjects) { if (workspaceProject.getName().equals(names[i])) referencedProjects.add(workspaceProject); } } } catch (RubyModelException e) { // ignore } projectsTableViewer.setCheckedElements(referencedProjects.toArray()); return composite; } protected void projectCheckedUnchecked(CheckStateChangedEvent event) { IProject checkEventProject = (IProject) event.getElement(); IRubyProject working = getWorkingProject(); // ILoadpathEntry[] entries = working.getRawLoadpath(); // XXX Set the new loadpath properly!!! // if (event.getChecked()) // .addLoadPathEntry(checkEventProject); // else // getWorkingProject().removeLoadPathEntry(checkEventProject); } protected RubyProject getWorkingProject() { return workingProject; } protected List<IProject> getWorkspaceProjects() { IWorkspaceRoot root = RubyPlugin.getWorkspace().getRoot(); return Arrays.asList(root.getProjects()); } protected ITableLabelProvider getLabelProvider() { ITableLabelProvider labelProvider = new ITableLabelProvider() { public Image getColumnImage(Object element, int columnIndex) { IWorkbench workbench= RubyPlugin.getDefault().getWorkbench(); return workbench.getSharedImages().getImage(SharedImages.IMG_OBJ_PROJECT); } public String getColumnText(Object element, int columnIndex) { if (element instanceof IProject) return ((IProject) element).getName(); return RubyUIMessages.RubyProjectLibraryPage_elementNotIProject; } public void addListener(ILabelProviderListener listener) {} public void dispose() {} public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) {} }; return labelProvider; } protected IContentProvider getContentProvider() { IStructuredContentProvider contentProvider = new IStructuredContentProvider() { protected List rubyProjects; public Object[] getElements(Object inputElement) { return rubyProjects.toArray(); } public void dispose() {} public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { rubyProjects = new ArrayList(); if (!(newInput instanceof List)) return; Iterator workspaceProjectsIterator = ((List) newInput).iterator(); while (workspaceProjectsIterator.hasNext()) { Object anObject = workspaceProjectsIterator.next(); if (anObject instanceof IProject) { IProject project = (IProject) anObject; if (project.getName() != workingProject.getProject().getName()) { try { if (project.hasNature(RubyCore.NATURE_ID)) rubyProjects.add(project); } catch (CoreException e) {} } } } } }; return contentProvider; } }