/******************************************************************************* * Copyright © 2000, 2013 IBM Corporation 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 * * Contributors: * IBM Corporation - initial API and implementation * *******************************************************************************/ package org.eclipse.edt.ide.ui.internal.wizards.buildpaths; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.edt.ide.core.model.EGLModelException; import org.eclipse.edt.ide.core.model.IEGLModel; import org.eclipse.edt.ide.core.model.IEGLPathEntry; import org.eclipse.edt.ide.core.model.IEGLProject; import org.eclipse.edt.ide.core.model.PPListElement; import org.eclipse.edt.ide.ui.internal.util.PixelConverter; import org.eclipse.edt.ide.ui.internal.wizards.NewWizardMessages; import org.eclipse.edt.ide.ui.internal.wizards.dialogfields.CheckedListDialogField; import org.eclipse.edt.ide.ui.internal.wizards.dialogfields.DialogField; import org.eclipse.edt.ide.ui.internal.wizards.dialogfields.IDialogFieldListener; import org.eclipse.edt.ide.ui.internal.wizards.dialogfields.LayoutUtil; import org.eclipse.edt.ide.ui.internal.wizards.dialogfields.ListDialogField; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; public class ProjectsWorkbookPage extends BuildPathBasePage { private ListDialogField fClassPathList; private IEGLProject fCurrJProject; private List<String> ImportProjectList; private List<String> fSelectedImportProjectList; private List<PPListElement> projects; public void setfSelectedImportProjectList(List<String> fSelectedImportProjectList) { this.fSelectedImportProjectList = fSelectedImportProjectList; if(null == ImportProjectList){ ImportProjectList = fSelectedImportProjectList; } } public void updateSelectedImportProjectList(List<String> newSelectedImportProjectList){ final List<PPListElement> newCheckedList = new ArrayList<PPListElement>(); final List<PPListElement> currentCheckedList = fProjectsList.getCheckedElements(); if(null != fProjectsList && null !=projects){ for (Iterator iterator = projects.iterator(); iterator.hasNext();) { PPListElement prjElement = (PPListElement) iterator.next(); String prjName = prjElement.getPath().lastSegment(); if(newSelectedImportProjectList.contains(prjName) && !fSelectedImportProjectList.contains(prjName)){ newCheckedList.add(prjElement); } } for (Iterator iterator = currentCheckedList.iterator(); iterator.hasNext();) { PPListElement prjElement = (PPListElement) iterator.next(); String prjName = prjElement.getPath().lastSegment(); if(!(!newSelectedImportProjectList.contains(prjName) && fSelectedImportProjectList.contains(prjName))){ newCheckedList.add(prjElement); } } fProjectsList.setCheckedElements(newCheckedList); } } private CheckedListDialogField fProjectsList; public ProjectsWorkbookPage(ListDialogField classPathList) { fClassPathList= classPathList; ProjectsListListener listener= new ProjectsListListener(); String[] buttonLabels= new String[] { /* 0 */ NewWizardMessages.ProjectsWorkbookPageProjectsCheckallButton, /* 1 */ NewWizardMessages.ProjectsWorkbookPageProjectsUncheckallButton }; fProjectsList= new CheckedListDialogField(null, buttonLabels, new PPListLabelProvider()); fProjectsList.setDialogFieldListener(listener); fProjectsList.setLabelText(NewWizardMessages.ProjectsWorkbookPageProjectsLabel); fProjectsList.setCheckAllButtonIndex(0); fProjectsList.setUncheckAllButtonIndex(1); fProjectsList.setViewerSorter(new PPListElementSorter()); } public void init(IEGLProject jproject) { updateProjectsList(jproject); } private void updateProjectsList(IEGLProject currJProject) { try { IEGLModel jmodel= currJProject.getEGLModel(); IEGLProject[] jprojects= jmodel.getEGLProjects(); projects = new ArrayList<PPListElement>(jprojects.length); final List<PPListElement> checkedProjects= new ArrayList<PPListElement>(jprojects.length); // add the projects-cpentries that are already on the class path List cpelements= fClassPathList.getElements(); for (int i= cpelements.size() - 1 ; i >= 0; i--) { PPListElement cpelem= (PPListElement)cpelements.get(i); if (isEntryKind(cpelem.getEntryKind())) { checkedProjects.add(cpelem); projects.add(cpelem); } } for (int i= 0; i < jprojects.length; i++) { IProject proj= jprojects[i].getProject(); if(currJProject.getProject().getName().equals(proj.getProject().getName())) { continue; } boolean found = false; for(PPListElement cpelem : projects) { if(proj.getName().equals(cpelem.getPath().lastSegment())) { found = true; break; } } if(!found) { projects.add(new PPListElement(fCurrJProject, IEGLPathEntry.CPE_PROJECT, proj.getFullPath(), proj)); } } for (Iterator iterator = projects.iterator(); iterator.hasNext();) { PPListElement prjElement = (PPListElement) iterator.next(); if(fSelectedImportProjectList != null && fSelectedImportProjectList.contains(prjElement.getPath().lastSegment())){ checkedProjects.add(prjElement); } } fProjectsList.setElements(projects); fProjectsList.setCheckedElements(checkedProjects); } catch (EGLModelException e) { // no solution exists or other problems: create an empty list fProjectsList.setElements(new ArrayList(5)); } fCurrJProject= currJProject; } private boolean checkIfBinaryProjExisting(List<PPListElement> existingProjects, PPListElement toCompare) { Iterator<PPListElement> it = existingProjects.iterator(); while(it.hasNext()) { PPListElement current = it.next(); if(current.getPath().lastSegment().equals(toCompare.getPath().lastSegment())) { return true; } } return false; } // -------- UI creation --------- public Control getControl(Composite parent) { PixelConverter converter= new PixelConverter(parent); Composite composite= new Composite(parent, SWT.NONE); LayoutUtil.doDefaultLayout(composite, new DialogField[] { fProjectsList }, true, 0, 0, 5, 5); LayoutUtil.setHorizontalGrabbing(fProjectsList.getListControl(null)); int buttonBarWidth= converter.convertWidthInCharsToPixels(24); fProjectsList.setButtonsMinWidth(buttonBarWidth); return composite; } private class ProjectsListListener implements IDialogFieldListener { // ---------- IDialogFieldListener -------- public void dialogFieldChanged(DialogField field) { if (fCurrJProject != null) { // already initialized updateEGLPathList(); } } } private void updateEGLPathList() { List projelements= fProjectsList.getCheckedElements(); boolean remove= false; List cpelements= fClassPathList.getElements(); // backwards, as entries will be deleted for (int i= cpelements.size() -1; i >= 0 ; i--) { PPListElement cpe= (PPListElement)cpelements.get(i); if (isEntryKind(cpe.getEntryKind())) { if (!projelements.remove(cpe)) { cpelements.remove(i); remove= true; } } } for (int i= 0; i < projelements.size(); i++) { cpelements.add(projelements.get(i)); } if (remove || (projelements.size() > 0)) { fClassPathList.setElements(cpelements); } } /* * @see BuildPathBasePage#getSelection */ public List getSelection() { return fProjectsList.getSelectedElements(); } /* * @see BuildPathBasePage#setSelection */ public void setSelection(List selElements) { fProjectsList.selectElements(new StructuredSelection(selElements)); } /* (non-Javadoc) * @see org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathBasePage#isEntryKind(int) */ public boolean isEntryKind(int kind) { return kind == IEGLPathEntry.CPE_PROJECT; } }