package org.bundlemaker.core.ui.projecteditor.jdt.wizard; import java.util.Collection; import java.util.LinkedList; import java.util.List; import org.bundlemaker.core.jdt.content.JdtProjectContentProvider; import org.bundlemaker.core.project.IModifiableProjectDescription; import org.bundlemaker.core.project.IProjectContentProvider; import org.bundlemaker.core.project.IProjectDescription; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.Text; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; /** * @author Nils Hartmann (nils@nilshartmann.net) * */ public class EditJdtContentProviderPage extends WizardPage { private IProjectDescription _projectDescription; private Text _nameText; private CheckboxTableViewer _projectNames; /** * @param pageName */ protected EditJdtContentProviderPage(IModifiableProjectDescription projectDescription) { super("EditJdtContentProviderPage"); _projectDescription = projectDescription; } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { setMessage("Select Java projects from your workspace"); setTitle("Add Java projects"); setPageComplete(false); Composite comp = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, true); GridData gridData = new GridData(GridData.FILL_BOTH); comp.setLayout(layout); comp.setLayoutData(gridData); createProjectSelectionTable(comp); Composite c = new Composite(comp, SWT.NONE); GridLayout l = new GridLayout(2, false); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = SWT.FILL; c.setLayout(l); c.setLayoutData(gridData); Label label = new Label(c, SWT.NONE); label.setText("Logical Name:"); _nameText = new Text(c, SWT.BORDER); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; _nameText.setLayoutData(gd); _nameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { _textModifiedByUser = true; checkConsistency(); } }); label = new Label(c, SWT.NONE); label .setText("The logical name is used to group all selected JDT projects (comparable with a Maven parent project)"); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = SWT.FILL; gridData.horizontalSpan = 2; label.setLayoutData(gridData); setControl(comp); } private boolean _textModifiedByUser = false; private void createProjectSelectionTable(Composite radioGroup) { _projectNames = CheckboxTableViewer.newCheckList(radioGroup, SWT.BORDER); _projectNames.setContentProvider(new WorkbenchContentProvider()); _projectNames.setLabelProvider(new WorkbenchLabelProvider()); final List<IProject> projectsAlreadyAdded = getProjectsAlreadyAdded(); // projectNames.setComparator(new ResourceComparator(ResourceComparator.NAME)); _projectNames.addFilter(new ViewerFilter() { private final IProject[] projectHolder = new IProject[1]; @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (!(element instanceof IProject)) { return false; } IProject project = (IProject) element; // don't show projects that are already part of the bundlemaker project if (projectsAlreadyAdded.contains(project)) { return false; } if (!project.isAccessible()) { return false; } projectHolder[0] = project; return isJavaProject(project); } }); _projectNames.setInput(ResourcesPlugin.getWorkspace().getRoot()); GridData data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 2; data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH; data.heightHint = IDialogConstants.ENTRY_FIELD_WIDTH; _projectNames.getTable().setLayoutData(data); // table is disabled to start because all button is selected // projectNames.getTable().setEnabled(selectedButton.getSelection()); _projectNames.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { Object[] checkedElements = _projectNames.getCheckedElements(); // override name only if not entered by the user if (!_textModifiedByUser) { IProject project = null; if ((checkedElements.length == 1) || (checkedElements.length>1 && _nameText.getText().isEmpty())) { project = (IProject) checkedElements[0]; _nameText.setText(project.getName()); } _textModifiedByUser = false; } checkConsistency(); } }); } protected void checkConsistency() { Object[] checkedElements = _projectNames.getCheckedElements(); if (checkedElements.length < 1) { setErrorMessage("Please select at least one JDT project"); } else if (_nameText.getText().isEmpty()) { setErrorMessage("Please enter a logical name"); } else { setErrorMessage(null); } setPageComplete(checkedElements.length > 0 && _nameText.getText().length() > 0); } /** * @return */ private List<IProject> getProjectsAlreadyAdded() { List<IProject> projects = new LinkedList<IProject>(); List<? extends IProjectContentProvider> contentProviders = _projectDescription.getContentProviders(); // Iterate over all Project content provider for (IProjectContentProvider iProjectContentProvider : contentProviders) { if (iProjectContentProvider instanceof JdtProjectContentProvider) { JdtProjectContentProvider jdtProjectContentProvider = (JdtProjectContentProvider) iProjectContentProvider; Collection<IJavaProject> javaProjects = jdtProjectContentProvider.getJavaProjects(); for (IJavaProject iJavaProject : javaProjects) { if (!projects.contains(iJavaProject.getProject())) { projects.add(iJavaProject.getProject()); } } } } return projects; } protected boolean isJavaProject(IProject project) { try { return project.hasNature("org.eclipse.jdt.core.javanature"); } catch (Exception ex) { ex.printStackTrace(); } return false; } public IProject[] getSelectedProjects() { Object[] checkedElements = _projectNames.getCheckedElements(); List<IProject> result = new LinkedList<IProject>(); for (Object element : checkedElements) { result.add((IProject) element); } return result.toArray(new IProject[0]); } @Override public String getName() { return _nameText.getText(); } }