PageRenderTime 28ms CodeModel.GetById 8ms RepoModel.GetById 12ms app.codeStats 0ms

/projects/eclipse_SDK-3.7.1/plugins/org.eclipse.jdt.ui.source_3.7.1.r371_v20110824-0800/org/eclipse/jdt/internal/ui/wizards/buildpaths/SourceContainerWorkbookPage.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 655 lines | 518 code | 96 blank | 41 comment | 145 complexity | de641a1901b3befc9dc70c9c3bd3b8b4 MD5 | raw file
  1. /*******************************************************************************
  2. * Copyright (c) 2000, 2011 IBM Corporation and others.
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * http://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors:
  9. * IBM Corporation - initial API and implementation
  10. *******************************************************************************/
  11. package org.eclipse.jdt.internal.ui.wizards.buildpaths;
  12. import java.util.ArrayList;
  13. import java.util.Iterator;
  14. import java.util.List;
  15. import org.eclipse.swt.SWT;
  16. import org.eclipse.swt.events.KeyEvent;
  17. import org.eclipse.swt.widgets.Composite;
  18. import org.eclipse.swt.widgets.Control;
  19. import org.eclipse.swt.widgets.Display;
  20. import org.eclipse.swt.widgets.Shell;
  21. import org.eclipse.core.runtime.CoreException;
  22. import org.eclipse.core.runtime.IPath;
  23. import org.eclipse.core.runtime.Path;
  24. import org.eclipse.core.resources.IContainer;
  25. import org.eclipse.core.resources.IProject;
  26. import org.eclipse.core.resources.IResource;
  27. import org.eclipse.jface.action.IAction;
  28. import org.eclipse.jface.layout.PixelConverter;
  29. import org.eclipse.jface.util.IPropertyChangeListener;
  30. import org.eclipse.jface.util.PropertyChangeEvent;
  31. import org.eclipse.jface.viewers.StructuredSelection;
  32. import org.eclipse.jface.window.Window;
  33. import org.eclipse.ui.INewWizard;
  34. import org.eclipse.jdt.core.IClasspathEntry;
  35. import org.eclipse.jdt.core.IJavaProject;
  36. import org.eclipse.jdt.internal.corext.buildpath.ClasspathModifier;
  37. import org.eclipse.jdt.ui.actions.AbstractOpenWizardAction;
  38. import org.eclipse.jdt.internal.ui.JavaPlugin;
  39. import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
  40. import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
  41. import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
  42. import org.eclipse.jdt.internal.ui.wizards.dialogfields.ITreeListAdapter;
  43. import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
  44. import org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField;
  45. import org.eclipse.jdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
  46. import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringDialogField;
  47. import org.eclipse.jdt.internal.ui.wizards.dialogfields.TreeListDialogField;
  48. public class SourceContainerWorkbookPage extends BuildPathBasePage {
  49. private class OpenBuildPathWizardAction extends AbstractOpenWizardAction implements IPropertyChangeListener {
  50. private final BuildPathWizard fWizard;
  51. private final List<Object> fSelectedElements;
  52. public OpenBuildPathWizardAction(BuildPathWizard wizard) {
  53. fWizard= wizard;
  54. addPropertyChangeListener(this);
  55. fSelectedElements= fFoldersList.getSelectedElements();
  56. }
  57. /**
  58. * {@inheritDoc}
  59. */
  60. @Override
  61. protected INewWizard createWizard() throws CoreException {
  62. return fWizard;
  63. }
  64. /**
  65. * {@inheritDoc}
  66. * @since 3.7
  67. */
  68. @Override
  69. protected Shell getShell() {
  70. return SourceContainerWorkbookPage.this.getShell();
  71. }
  72. /**
  73. * {@inheritDoc}
  74. */
  75. public void propertyChange(PropertyChangeEvent event) {
  76. if (event.getProperty().equals(IAction.RESULT)) {
  77. if (event.getNewValue().equals(Boolean.TRUE)) {
  78. finishWizard();
  79. } else {
  80. fWizard.cancel();
  81. }
  82. }
  83. }
  84. protected void finishWizard() {
  85. List<CPListElement> insertedElements= fWizard.getInsertedElements();
  86. refresh(insertedElements, fWizard.getRemovedElements(), fWizard.getModifiedElements(), fWizard.getOutputLocation());
  87. if (insertedElements.isEmpty()) {
  88. fFoldersList.postSetSelection(new StructuredSelection(fSelectedElements));
  89. }
  90. }
  91. }
  92. private static AddSourceFolderWizard newSourceFolderWizard(CPListElement element, List<CPListElement> existingElements, String outputLocation, boolean newFolder) {
  93. CPListElement[] existing= existingElements.toArray(new CPListElement[existingElements.size()]);
  94. AddSourceFolderWizard wizard= new AddSourceFolderWizard(existing, element, new Path(outputLocation).makeAbsolute(), false, newFolder, newFolder, newFolder?CPListElement.isProjectSourceFolder(existing, element.getJavaProject()):false, newFolder);
  95. wizard.setDoFlushChange(false);
  96. return wizard;
  97. }
  98. private static AddSourceFolderWizard newLinkedSourceFolderWizard(CPListElement element, List<CPListElement> existingElements, String outputLocation, boolean newFolder) {
  99. CPListElement[] existing= existingElements.toArray(new CPListElement[existingElements.size()]);
  100. AddSourceFolderWizard wizard= new AddSourceFolderWizard(existing, element, new Path(outputLocation).makeAbsolute(), true, newFolder, newFolder, newFolder?CPListElement.isProjectSourceFolder(existing, element.getJavaProject()):false, newFolder);
  101. wizard.setDoFlushChange(false);
  102. return wizard;
  103. }
  104. private static EditFilterWizard newEditFilterWizard(CPListElement element, List<CPListElement> existingElements, String outputLocation) {
  105. CPListElement[] existing= existingElements.toArray(new CPListElement[existingElements.size()]);
  106. EditFilterWizard result = new EditFilterWizard(existing, element, new Path(outputLocation).makeAbsolute());
  107. result.setDoFlushChange(false);
  108. return result;
  109. }
  110. private final ListDialogField<CPListElement> fClassPathList;
  111. private IJavaProject fCurrJProject;
  112. private Control fSWTControl;
  113. private final TreeListDialogField<CPListElement> fFoldersList;
  114. private final StringDialogField fOutputLocationField;
  115. private final SelectionButtonDialogField fUseFolderOutputs;
  116. private final int IDX_ADD= 0;
  117. private final int IDX_ADD_LINK= 1;
  118. private final int IDX_EDIT= 3;
  119. private final int IDX_REMOVE= 4;
  120. public SourceContainerWorkbookPage(ListDialogField<CPListElement> classPathList, StringDialogField outputLocationField) {
  121. fClassPathList= classPathList;
  122. fOutputLocationField= outputLocationField;
  123. fSWTControl= null;
  124. SourceContainerAdapter adapter= new SourceContainerAdapter();
  125. String[] buttonLabels;
  126. buttonLabels= new String[] {
  127. NewWizardMessages.SourceContainerWorkbookPage_folders_add_button,
  128. NewWizardMessages.SourceContainerWorkbookPage_folders_link_source_button,
  129. /* 1 */ null,
  130. NewWizardMessages.SourceContainerWorkbookPage_folders_edit_button,
  131. NewWizardMessages.SourceContainerWorkbookPage_folders_remove_button
  132. };
  133. fFoldersList= new TreeListDialogField<CPListElement>(adapter, buttonLabels, new CPListLabelProvider());
  134. fFoldersList.setDialogFieldListener(adapter);
  135. fFoldersList.setLabelText(NewWizardMessages.SourceContainerWorkbookPage_folders_label);
  136. fFoldersList.setViewerComparator(new CPListElementSorter());
  137. fFoldersList.enableButton(IDX_EDIT, false);
  138. fUseFolderOutputs= new SelectionButtonDialogField(SWT.CHECK);
  139. fUseFolderOutputs.setSelection(false);
  140. fUseFolderOutputs.setLabelText(NewWizardMessages.SourceContainerWorkbookPage_folders_check);
  141. fUseFolderOutputs.setDialogFieldListener(adapter);
  142. }
  143. @Override
  144. public void init(IJavaProject jproject) {
  145. fCurrJProject= jproject;
  146. if (Display.getCurrent() != null) {
  147. updateFoldersList();
  148. } else {
  149. Display.getDefault().asyncExec(new Runnable() {
  150. public void run() {
  151. updateFoldersList();
  152. }
  153. });
  154. }
  155. }
  156. private void updateFoldersList() {
  157. if (fSWTControl == null || fSWTControl.isDisposed()) {
  158. return;
  159. }
  160. ArrayList<CPListElement> folders= new ArrayList<CPListElement>();
  161. boolean useFolderOutputs= false;
  162. List<CPListElement> cpelements= fClassPathList.getElements();
  163. for (int i= 0; i < cpelements.size(); i++) {
  164. CPListElement cpe= cpelements.get(i);
  165. if (cpe.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
  166. folders.add(cpe);
  167. boolean hasOutputFolder= (cpe.getAttribute(CPListElement.OUTPUT) != null);
  168. if (hasOutputFolder) {
  169. useFolderOutputs= true;
  170. }
  171. }
  172. }
  173. fFoldersList.setElements(folders);
  174. fUseFolderOutputs.setSelection(useFolderOutputs);
  175. for (int i= 0; i < folders.size(); i++) {
  176. CPListElement cpe= folders.get(i);
  177. IPath[] ePatterns= (IPath[]) cpe.getAttribute(CPListElement.EXCLUSION);
  178. IPath[] iPatterns= (IPath[])cpe.getAttribute(CPListElement.INCLUSION);
  179. boolean hasOutputFolder= (cpe.getAttribute(CPListElement.OUTPUT) != null);
  180. if (ePatterns.length > 0 || iPatterns.length > 0 || hasOutputFolder) {
  181. fFoldersList.expandElement(cpe, 3);
  182. }
  183. }
  184. }
  185. @Override
  186. public Control getControl(Composite parent) {
  187. PixelConverter converter= new PixelConverter(parent);
  188. Composite composite= new Composite(parent, SWT.NONE);
  189. LayoutUtil.doDefaultLayout(composite, new DialogField[] { fFoldersList, fUseFolderOutputs , fOutputLocationField}, true, SWT.DEFAULT, SWT.DEFAULT);
  190. LayoutUtil.setHorizontalGrabbing(fFoldersList.getTreeControl(null));
  191. int buttonBarWidth= converter.convertWidthInCharsToPixels(24);
  192. fFoldersList.setButtonsMinWidth(buttonBarWidth);
  193. fSWTControl= composite;
  194. // expand
  195. List<CPListElement> elements= fFoldersList.getElements();
  196. for (int i= 0; i < elements.size(); i++) {
  197. CPListElement elem= elements.get(i);
  198. IPath[] exclusionPatterns= (IPath[]) elem.getAttribute(CPListElement.EXCLUSION);
  199. IPath[] inclusionPatterns= (IPath[]) elem.getAttribute(CPListElement.INCLUSION);
  200. IPath output= (IPath) elem.getAttribute(CPListElement.OUTPUT);
  201. if (exclusionPatterns.length > 0 || inclusionPatterns.length > 0 || output != null) {
  202. fFoldersList.expandElement(elem, 3);
  203. }
  204. }
  205. return composite;
  206. }
  207. private Shell getShell() {
  208. if (fSWTControl != null) {
  209. return fSWTControl.getShell();
  210. }
  211. return JavaPlugin.getActiveWorkbenchShell();
  212. }
  213. private class SourceContainerAdapter implements ITreeListAdapter<CPListElement>, IDialogFieldListener {
  214. private final Object[] EMPTY_ARR= new Object[0];
  215. // -------- IListAdapter --------
  216. public void customButtonPressed(TreeListDialogField<CPListElement> field, int index) {
  217. sourcePageCustomButtonPressed(field, index);
  218. }
  219. public void selectionChanged(TreeListDialogField<CPListElement> field) {
  220. sourcePageSelectionChanged(field);
  221. }
  222. public void doubleClicked(TreeListDialogField<CPListElement> field) {
  223. sourcePageDoubleClicked(field);
  224. }
  225. public void keyPressed(TreeListDialogField<CPListElement> field, KeyEvent event) {
  226. sourcePageKeyPressed(field, event);
  227. }
  228. public Object[] getChildren(TreeListDialogField<CPListElement> field, Object element) {
  229. if (element instanceof CPListElement) {
  230. return ((CPListElement) element).getChildren(!fUseFolderOutputs.isSelected());
  231. }
  232. return EMPTY_ARR;
  233. }
  234. public Object getParent(TreeListDialogField<CPListElement> field, Object element) {
  235. if (element instanceof CPListElementAttribute) {
  236. return ((CPListElementAttribute) element).getParent();
  237. }
  238. return null;
  239. }
  240. public boolean hasChildren(TreeListDialogField<CPListElement> field, Object element) {
  241. return (element instanceof CPListElement);
  242. }
  243. // ---------- IDialogFieldListener --------
  244. public void dialogFieldChanged(DialogField field) {
  245. sourcePageDialogFieldChanged(field);
  246. }
  247. }
  248. protected void sourcePageKeyPressed(TreeListDialogField<CPListElement> field, KeyEvent event) {
  249. if (field == fFoldersList) {
  250. if (event.character == SWT.DEL && event.stateMask == 0) {
  251. List<Object> selection= field.getSelectedElements();
  252. if (canRemove(selection)) {
  253. removeEntry();
  254. }
  255. }
  256. }
  257. }
  258. protected void sourcePageDoubleClicked(TreeListDialogField<CPListElement> field) {
  259. if (field == fFoldersList) {
  260. List<Object> selection= field.getSelectedElements();
  261. if (canEdit(selection)) {
  262. editEntry();
  263. }
  264. }
  265. }
  266. protected void sourcePageCustomButtonPressed(DialogField field, int index) {
  267. if (field == fFoldersList) {
  268. if (index == IDX_ADD) {
  269. IProject project= fCurrJProject.getProject();
  270. if (project.isAccessible() && hasFolders(project)) {
  271. List<CPListElement> existingElements= fFoldersList.getElements();
  272. CPListElement[] existing= existingElements.toArray(new CPListElement[existingElements.size()]);
  273. CreateMultipleSourceFoldersDialog dialog= new CreateMultipleSourceFoldersDialog(fCurrJProject, existing, fOutputLocationField.getText(), getShell());
  274. if (dialog.open() == Window.OK) {
  275. refresh(dialog.getInsertedElements(), dialog.getRemovedElements(), dialog.getModifiedElements(), dialog.getOutputLocation());
  276. }
  277. } else {
  278. CPListElement newElement= new CPListElement(fCurrJProject, IClasspathEntry.CPE_SOURCE);
  279. AddSourceFolderWizard wizard= newSourceFolderWizard(newElement, fFoldersList.getElements(), fOutputLocationField.getText(), true);
  280. OpenBuildPathWizardAction action= new OpenBuildPathWizardAction(wizard);
  281. action.run();
  282. }
  283. } else if (index == IDX_ADD_LINK) {
  284. CPListElement newElement= new CPListElement(fCurrJProject, IClasspathEntry.CPE_SOURCE);
  285. AddSourceFolderWizard wizard= newLinkedSourceFolderWizard(newElement, fFoldersList.getElements(), fOutputLocationField.getText(), true);
  286. OpenBuildPathWizardAction action= new OpenBuildPathWizardAction(wizard);
  287. action.run();
  288. } else if (index == IDX_EDIT) {
  289. editEntry();
  290. } else if (index == IDX_REMOVE) {
  291. removeEntry();
  292. }
  293. }
  294. }
  295. private boolean hasFolders(IContainer container) {
  296. try {
  297. IResource[] members= container.members();
  298. for (int i= 0; i < members.length; i++) {
  299. if (members[i] instanceof IContainer) {
  300. return true;
  301. }
  302. }
  303. } catch (CoreException e) {
  304. // ignore
  305. }
  306. List<CPListElement> elements= fFoldersList.getElements();
  307. if (elements.size() > 1)
  308. return true;
  309. if (elements.size() == 0)
  310. return false;
  311. CPListElement single= elements.get(0);
  312. if (single.getPath().equals(fCurrJProject.getPath()))
  313. return false;
  314. return true;
  315. }
  316. private void editEntry() {
  317. List<Object> selElements= fFoldersList.getSelectedElements();
  318. if (selElements.size() != 1) {
  319. return;
  320. }
  321. Object elem= selElements.get(0);
  322. if (fFoldersList.getIndexOfElement(elem) != -1) {
  323. editElementEntry((CPListElement) elem);
  324. } else if (elem instanceof CPListElementAttribute) {
  325. editAttributeEntry((CPListElementAttribute) elem);
  326. }
  327. }
  328. private void editElementEntry(CPListElement elem) {
  329. if (elem.getLinkTarget() != null) {
  330. AddSourceFolderWizard wizard= newLinkedSourceFolderWizard(elem, fFoldersList.getElements(), fOutputLocationField.getText(), false);
  331. OpenBuildPathWizardAction action= new OpenBuildPathWizardAction(wizard);
  332. action.run();
  333. } else {
  334. AddSourceFolderWizard wizard= newSourceFolderWizard(elem, fFoldersList.getElements(), fOutputLocationField.getText(), false);
  335. OpenBuildPathWizardAction action= new OpenBuildPathWizardAction(wizard);
  336. action.run();
  337. }
  338. }
  339. private void editAttributeEntry(CPListElementAttribute elem) {
  340. String key= elem.getKey();
  341. if (key.equals(CPListElement.OUTPUT)) {
  342. CPListElement selElement= elem.getParent();
  343. OutputLocationDialog dialog= new OutputLocationDialog(getShell(), selElement, fClassPathList.getElements(), new Path(fOutputLocationField.getText()).makeAbsolute(), true);
  344. if (dialog.open() == Window.OK) {
  345. selElement.setAttribute(CPListElement.OUTPUT, dialog.getOutputLocation());
  346. fFoldersList.refresh();
  347. fClassPathList.dialogFieldChanged(); // validate
  348. }
  349. } else if (key.equals(CPListElement.EXCLUSION) || key.equals(CPListElement.INCLUSION)) {
  350. EditFilterWizard wizard= newEditFilterWizard(elem.getParent(), fFoldersList.getElements(), fOutputLocationField.getText());
  351. OpenBuildPathWizardAction action= new OpenBuildPathWizardAction(wizard);
  352. action.run();
  353. } else {
  354. if (editCustomAttribute(getShell(), elem)) {
  355. fFoldersList.refresh();
  356. fClassPathList.dialogFieldChanged(); // validate
  357. }
  358. }
  359. }
  360. /**
  361. * @param field the dialog field
  362. */
  363. protected void sourcePageSelectionChanged(DialogField field) {
  364. List<Object> selected= fFoldersList.getSelectedElements();
  365. fFoldersList.enableButton(IDX_EDIT, canEdit(selected));
  366. fFoldersList.enableButton(IDX_REMOVE, canRemove(selected));
  367. boolean noAttributes= containsOnlyTopLevelEntries(selected);
  368. fFoldersList.enableButton(IDX_ADD, noAttributes);
  369. }
  370. private void removeEntry() {
  371. List<Object> selElements= fFoldersList.getSelectedElements();
  372. for (int i= selElements.size() - 1; i >= 0 ; i--) {
  373. Object elem= selElements.get(i);
  374. if (elem instanceof CPListElementAttribute) {
  375. CPListElementAttribute attrib= (CPListElementAttribute) elem;
  376. String key= attrib.getKey();
  377. if (attrib.isBuiltIn()) {
  378. Object value= null;
  379. if (key.equals(CPListElement.EXCLUSION) || key.equals(CPListElement.INCLUSION)) {
  380. value= new Path[0];
  381. }
  382. attrib.getParent().setAttribute(key, value);
  383. } else {
  384. removeCustomAttribute(attrib);
  385. }
  386. selElements.remove(i);
  387. }
  388. }
  389. if (selElements.isEmpty()) {
  390. fFoldersList.refresh();
  391. fClassPathList.dialogFieldChanged(); // validate
  392. } else {
  393. for (Iterator<Object> iter= selElements.iterator(); iter.hasNext();) {
  394. CPListElement element= (CPListElement)iter.next();
  395. if (element.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
  396. List<CPListElement> list= ClasspathModifier.removeFilters(element.getPath(), fCurrJProject, fFoldersList.getElements());
  397. for (Iterator<CPListElement> iterator= list.iterator(); iterator.hasNext();) {
  398. CPListElement modified= iterator.next();
  399. fFoldersList.refresh(modified);
  400. fFoldersList.expandElement(modified, 3);
  401. }
  402. }
  403. }
  404. fFoldersList.removeElements(selElements);
  405. }
  406. }
  407. private boolean canRemove(List<Object> selElements) {
  408. if (selElements.size() == 0) {
  409. return false;
  410. }
  411. for (int i= 0; i < selElements.size(); i++) {
  412. Object elem= selElements.get(i);
  413. if (elem instanceof CPListElementAttribute) {
  414. CPListElementAttribute attrib= (CPListElementAttribute) elem;
  415. String key= attrib.getKey();
  416. if (attrib.isBuiltIn()) {
  417. if (CPListElement.INCLUSION.equals(key)) {
  418. if (((IPath[]) attrib.getValue()).length == 0) {
  419. return false;
  420. }
  421. } else if (CPListElement.EXCLUSION.equals(key)) {
  422. if (((IPath[]) attrib.getValue()).length == 0) {
  423. return false;
  424. }
  425. } else if (attrib.getValue() == null) {
  426. return false;
  427. }
  428. } else {
  429. if (!canRemoveCustomAttribute(attrib)) {
  430. return false;
  431. }
  432. }
  433. } else if (elem instanceof CPListElement) {
  434. CPListElement curr= (CPListElement) elem;
  435. if (curr.getParentContainer() != null) {
  436. return false;
  437. }
  438. }
  439. }
  440. return true;
  441. }
  442. private boolean canEdit(List<Object> selElements) {
  443. if (selElements.size() != 1) {
  444. return false;
  445. }
  446. Object elem= selElements.get(0);
  447. if (elem instanceof CPListElement) {
  448. CPListElement cp= ((CPListElement)elem);
  449. if (cp.getPath().equals(cp.getJavaProject().getPath()))
  450. return false;
  451. return true;
  452. }
  453. if (elem instanceof CPListElementAttribute) {
  454. CPListElementAttribute attrib= (CPListElementAttribute) elem;
  455. if (attrib.isBuiltIn()) {
  456. return true;
  457. } else {
  458. return canEditCustomAttribute(attrib);
  459. }
  460. }
  461. return false;
  462. }
  463. private void sourcePageDialogFieldChanged(DialogField field) {
  464. if (fCurrJProject == null) {
  465. // not initialized
  466. return;
  467. }
  468. if (field == fUseFolderOutputs) {
  469. if (!fUseFolderOutputs.isSelected()) {
  470. int nFolders= fFoldersList.getSize();
  471. for (int i= 0; i < nFolders; i++) {
  472. CPListElement cpe= fFoldersList.getElement(i);
  473. cpe.setAttribute(CPListElement.OUTPUT, null);
  474. }
  475. }
  476. fFoldersList.refresh();
  477. } else if (field == fFoldersList) {
  478. updateClasspathList();
  479. }
  480. }
  481. private void updateClasspathList() {
  482. List<CPListElement> srcelements= fFoldersList.getElements();
  483. List<CPListElement> cpelements= fClassPathList.getElements();
  484. int nEntries= cpelements.size();
  485. // backwards, as entries will be deleted
  486. int lastRemovePos= nEntries;
  487. int afterLastSourcePos= 0;
  488. for (int i= nEntries - 1; i >= 0; i--) {
  489. CPListElement cpe= cpelements.get(i);
  490. int kind= cpe.getEntryKind();
  491. if (isEntryKind(kind)) {
  492. if (!srcelements.remove(cpe)) {
  493. cpelements.remove(i);
  494. lastRemovePos= i;
  495. } else if (lastRemovePos == nEntries) {
  496. afterLastSourcePos= i + 1;
  497. }
  498. }
  499. }
  500. if (!srcelements.isEmpty()) {
  501. int insertPos= Math.min(afterLastSourcePos, lastRemovePos);
  502. cpelements.addAll(insertPos, srcelements);
  503. }
  504. if (lastRemovePos != nEntries || !srcelements.isEmpty()) {
  505. fClassPathList.setElements(cpelements);
  506. }
  507. }
  508. /*
  509. * @see BuildPathBasePage#getSelection
  510. */
  511. @Override
  512. public List<Object> getSelection() {
  513. return fFoldersList.getSelectedElements();
  514. }
  515. /*
  516. * @see BuildPathBasePage#setSelection
  517. */
  518. @Override
  519. public void setSelection(List<?> selElements, boolean expand) {
  520. fFoldersList.selectElements(new StructuredSelection(selElements));
  521. if (expand) {
  522. for (int i= 0; i < selElements.size(); i++) {
  523. fFoldersList.expandElement(selElements.get(i), 1);
  524. }
  525. }
  526. }
  527. /* (non-Javadoc)
  528. * @see org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathBasePage#isEntryKind(int)
  529. */
  530. @Override
  531. public boolean isEntryKind(int kind) {
  532. return kind == IClasspathEntry.CPE_SOURCE;
  533. }
  534. private void refresh(List<CPListElement> insertedElements, List<?> removedElements, List<CPListElement> modifiedElements, IPath outputLocation) {
  535. fFoldersList.addElements(insertedElements);
  536. for (Iterator<CPListElement> iter= insertedElements.iterator(); iter.hasNext();) {
  537. CPListElement element= iter.next();
  538. fFoldersList.expandElement(element, 3);
  539. }
  540. fFoldersList.removeElements(removedElements);
  541. for (Iterator<CPListElement> iter= modifiedElements.iterator(); iter.hasNext();) {
  542. CPListElement element= iter.next();
  543. fFoldersList.refresh(element);
  544. fFoldersList.expandElement(element, 3);
  545. }
  546. fFoldersList.refresh(); //does enforce the order of the entries.
  547. if (!insertedElements.isEmpty()) {
  548. fFoldersList.postSetSelection(new StructuredSelection(insertedElements));
  549. }
  550. fOutputLocationField.setText(outputLocation.makeRelative().toOSString());
  551. }
  552. /**
  553. * {@inheritDoc}
  554. */
  555. @Override
  556. public void setFocus() {
  557. fFoldersList.setFocus();
  558. }
  559. }