/******************************************************************************* * Copyright (c) 2000, 2011 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.wst.jsdt.internal.ui.wizards.buildpaths; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jface.action.IAction; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.INewWizard; import org.eclipse.ui.PlatformUI; import org.eclipse.wst.jsdt.core.IIncludePathEntry; import org.eclipse.wst.jsdt.core.IJavaScriptProject; import org.eclipse.wst.jsdt.internal.corext.buildpath.ClasspathModifier; import org.eclipse.wst.jsdt.internal.corext.util.Messages; import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin; import org.eclipse.wst.jsdt.internal.ui.actions.WorkbenchRunnableAdapter; import org.eclipse.wst.jsdt.internal.ui.util.ExceptionHandler; import org.eclipse.wst.jsdt.internal.ui.util.PixelConverter; import org.eclipse.wst.jsdt.internal.ui.wizards.NewWizardMessages; import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.DialogField; import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.IDialogFieldListener; import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.ITreeListAdapter; import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.LayoutUtil; import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.ListDialogField; import org.eclipse.wst.jsdt.internal.ui.wizards.dialogfields.TreeListDialogField; import org.eclipse.wst.jsdt.ui.actions.AbstractOpenWizardAction; import org.eclipse.wst.jsdt.ui.wizards.BuildPathDialogAccess; public class SourceContainerWorkbookPage extends BuildPathBasePage { private class OpenBuildPathWizardAction extends AbstractOpenWizardAction implements IPropertyChangeListener { private final BuildPathWizard fWizard; private final List fSelectedElements; public OpenBuildPathWizardAction(BuildPathWizard wizard) { fWizard= wizard; addPropertyChangeListener(this); fSelectedElements= fFoldersList.getSelectedElements(); } /** * {@inheritDoc} */ protected INewWizard createWizard() throws CoreException { return fWizard; } /** * {@inheritDoc} */ public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(IAction.RESULT)) { if (event.getNewValue().equals(Boolean.TRUE)) { finishWizard(); } else { fWizard.cancel(); } } } protected void finishWizard() { List insertedElements= fWizard.getInsertedElements(); refresh(insertedElements, fWizard.getRemovedElements(), fWizard.getModifiedElements()); if (insertedElements.isEmpty()) { fFoldersList.postSetSelection(new StructuredSelection(fSelectedElements)); } } } private static AddSourceFolderWizard newSourceFolderWizard(CPListElement element, List/*<CPListElement>*/ existingElements, String outputLocation, boolean newFolder) { CPListElement[] existing= (CPListElement[])existingElements.toArray(new CPListElement[existingElements.size()]); AddSourceFolderWizard wizard= new AddSourceFolderWizard(existing, element, false, newFolder, newFolder, newFolder?CPListElement.isProjectSourceFolder(existing, element.getJavaProject()):false, newFolder); wizard.setDoFlushChange(false); return wizard; } private static AddSourceFolderWizard newLinkedSourceFolderWizard(CPListElement element, List/*<CPListElement>*/ existingElements, String outputLocation, boolean newFolder) { CPListElement[] existing= (CPListElement[])existingElements.toArray(new CPListElement[existingElements.size()]); AddSourceFolderWizard wizard= new AddSourceFolderWizard(existing, element, true, newFolder, newFolder, newFolder?CPListElement.isProjectSourceFolder(existing, element.getJavaProject()):false, newFolder); wizard.setDoFlushChange(false); return wizard; } private static EditFilterWizard newEditFilterWizard(CPListElement element, List/*<CPListElement>*/ existingElements, String outputLocation) { CPListElement[] existing= (CPListElement[])existingElements.toArray(new CPListElement[existingElements.size()]); EditFilterWizard result = new EditFilterWizard(existing, element); result.setDoFlushChange(false); return result; } private ListDialogField fClassPathList; private IJavaScriptProject fCurrJProject; private Control fSWTControl; private TreeListDialogField fFoldersList; //private StringDialogField fOutputLocationField; //private SelectionButtonDialogField fUseFolderOutputs; private final int IDX_ADD= 0; private final int IDX_ADD_LINK= 1; private final int IDX_ADDEXT= 3; private final int IDX_ADDJAR= 4; private final int IDX_ADDVAR= 5; private final int IDX_EDIT=7; private final int IDX_REMOVE= 8; public SourceContainerWorkbookPage(ListDialogField classPathList) { fClassPathList= classPathList; //fOutputLocationField= outputLocationField; fSWTControl= null; SourceContainerAdapter adapter= new SourceContainerAdapter(); String[] buttonLabels; buttonLabels= new String[] { NewWizardMessages.SourceContainerWorkbookPage_folders_add_button, NewWizardMessages.SourceContainerWorkbookPage_folders_link_source_button, /* 1 */ null, NewWizardMessages.LibrariesWorkbookPage_libraries_addextjar_button, NewWizardMessages.LibrariesWorkbookPage_libraries_addjar_button, NewWizardMessages.LibrariesWorkbookPage_libraries_addvariable_button, null, NewWizardMessages.SourceContainerWorkbookPage_folders_edit_button, NewWizardMessages.SourceContainerWorkbookPage_folders_remove_button }; fFoldersList= new TreeListDialogField(adapter, buttonLabels, new CPListLabelProvider()); fFoldersList.setDialogFieldListener(adapter); fFoldersList.setLabelText(NewWizardMessages.SourceContainerWorkbookPage_folders_label); fFoldersList.setViewerComparator(new CPListElementSorter()); fFoldersList.enableButton(IDX_EDIT, false); fFoldersList.enableButton(IDX_ADDVAR, false); // fUseFolderOutputs= new SelectionButtonDialogField(SWT.CHECK); // fUseFolderOutputs.setSelection(false); // fUseFolderOutputs.setLabelText(NewWizardMessages.SourceContainerWorkbookPage_folders_check); // fUseFolderOutputs.setDialogFieldListener(adapter); } public void init(IJavaScriptProject jproject) { fCurrJProject= jproject; if (Display.getCurrent() != null) { updateFoldersList(); } else { Display.getDefault().asyncExec(new Runnable() { public void run() { updateFoldersList(); } }); } } private void updateFoldersList() { if (fSWTControl == null || fSWTControl.isDisposed()) { return; } ArrayList folders= new ArrayList(); // boolean useFolderOutputs= false; List cpelements= fClassPathList.getElements(); for (int i= 0; i < cpelements.size(); i++) { CPListElement cpe= (CPListElement)cpelements.get(i); if (isEntryKind(cpe.getEntryKind()) ) { folders.add(cpe); } } fFoldersList.setElements(folders); //fUseFolderOutputs.setSelection(useFolderOutputs); for (int i= 0; i < folders.size(); i++) { CPListElement cpe= (CPListElement) folders.get(i); IPath[] ePatterns= (IPath[]) cpe.getAttribute(CPListElement.EXCLUSION); IPath[] iPatterns= (IPath[])cpe.getAttribute(CPListElement.INCLUSION); if (ePatterns!=null && iPatterns!=null && (ePatterns.length > 0 || iPatterns.length > 0)) { fFoldersList.expandElement(cpe, 3); } } } public Control getControl(Composite parent) { PixelConverter converter= new PixelConverter(parent); Composite composite= new Composite(parent, SWT.NONE); //LayoutUtil.doDefaultLayout(composite, new DialogField[] { fFoldersList, fUseFolderOutputs , fOutputLocationField}, true, SWT.DEFAULT, SWT.DEFAULT); LayoutUtil.doDefaultLayout(composite, new DialogField[] { fFoldersList}, true, SWT.DEFAULT, SWT.DEFAULT); LayoutUtil.setHorizontalGrabbing(fFoldersList.getTreeControl(null)); int buttonBarWidth= converter.convertWidthInCharsToPixels(24); fFoldersList.setButtonsMinWidth(buttonBarWidth); fSWTControl= composite; // expand List elements= fFoldersList.getElements(); for (int i= 0; i < elements.size(); i++) { CPListElement elem= (CPListElement) elements.get(i); IPath[] exclusionPatterns= (IPath[]) elem.getAttribute(CPListElement.EXCLUSION); IPath[] inclusionPatterns= (IPath[]) elem.getAttribute(CPListElement.INCLUSION); if (exclusionPatterns.length > 0 || inclusionPatterns.length > 0) { fFoldersList.expandElement(elem, 3); } } return composite; } private Shell getShell() { if (fSWTControl != null) { return fSWTControl.getShell(); } return JavaScriptPlugin.getActiveWorkbenchShell(); } private class SourceContainerAdapter implements ITreeListAdapter, IDialogFieldListener { private final Object[] EMPTY_ARR= new Object[0]; // -------- IListAdapter -------- public void customButtonPressed(TreeListDialogField field, int index) { sourcePageCustomButtonPressed(field, index); } public void selectionChanged(TreeListDialogField field) { sourcePageSelectionChanged(field); } public void doubleClicked(TreeListDialogField field) { sourcePageDoubleClicked(field); } public void keyPressed(TreeListDialogField field, KeyEvent event) { sourcePageKeyPressed(field, event); } public Object[] getChildren(TreeListDialogField field, Object element) { if (element instanceof CPListElement) { return ((CPListElement) element).getChildren(); } return EMPTY_ARR; } public Object getParent(TreeListDialogField field, Object element) { if (element instanceof CPListElementAttribute) { return ((CPListElementAttribute) element).getParent(); } return null; } public boolean hasChildren(TreeListDialogField field, Object element) { return (element instanceof CPListElement); } // ---------- IDialogFieldListener -------- public void dialogFieldChanged(DialogField field) { sourcePageDialogFieldChanged(field); } } protected void sourcePageKeyPressed(TreeListDialogField field, KeyEvent event) { if (field == fFoldersList) { if (event.character == SWT.DEL && event.stateMask == 0) { List selection= field.getSelectedElements(); if (canRemove(selection)) { removeEntry(); } } } } protected void sourcePageDoubleClicked(TreeListDialogField field) { if (field == fFoldersList) { List selection= field.getSelectedElements(); if (canEdit(selection)) { editEntry(); } } } protected void sourcePageCustomButtonPressed(DialogField field, int index) { CPListElement[] libentries= null; if (field == fFoldersList) { if (index == IDX_ADD) { IProject project= fCurrJProject.getProject(); if (project.exists() && hasFolders(project)) { List existingElements= fFoldersList.getElements(); CPListElement[] existing= (CPListElement[])existingElements.toArray(new CPListElement[existingElements.size()]); CreateMultipleSourceFoldersDialog dialog= new CreateMultipleSourceFoldersDialog(fCurrJProject, existing, "", getShell()); //$NON-NLS-1$ if (dialog.open() == Window.OK) { refresh(dialog.getInsertedElements(), dialog.getRemovedElements(), dialog.getModifiedElements()); } } else { CPListElement newElement= new CPListElement(fCurrJProject, IIncludePathEntry.CPE_SOURCE); AddSourceFolderWizard wizard= newSourceFolderWizard(newElement, fFoldersList.getElements(), "", true); //$NON-NLS-1$ OpenBuildPathWizardAction action= new OpenBuildPathWizardAction(wizard); action.run(); } } else if (index == IDX_ADD_LINK) { CPListElement newElement= new CPListElement(fCurrJProject, IIncludePathEntry.CPE_SOURCE); AddSourceFolderWizard wizard= newLinkedSourceFolderWizard(newElement, fFoldersList.getElements(), "", true); //$NON-NLS-1$ OpenBuildPathWizardAction action= new OpenBuildPathWizardAction(wizard); action.run(); } else if (index==IDX_ADDJAR) { libentries= openJarFileDialog(null); }else if (index==IDX_ADDEXT) { libentries= openExtJarFileDialog(null); } else if (index == IDX_EDIT) { editEntry(); } else if (index == IDX_REMOVE) { removeEntry(); } } if (libentries != null) { int nElementsChosen= libentries.length; // remove duplicates List cplist= fClassPathList.getElements(); List elementsToAdd= new ArrayList(nElementsChosen); for (int i= 0; i < nElementsChosen; i++) { CPListElement curr= libentries[i]; if (!cplist.contains(curr) && !elementsToAdd.contains(curr)) { elementsToAdd.add(curr); curr.setAttribute(CPListElement.JAVADOC, BuildPathSupport.guessJavadocLocation(curr)); } } refresh(elementsToAdd,null,null); fClassPathList.addElements(elementsToAdd); // || index == IDX_ADDVAR fClassPathList.postSetSelection(new StructuredSelection(libentries)); // if (index == IDX_ADDJAR || index == IDX_ADDVAR || index==IDX_ADDEXT) { // fClassPathList.refresh(); // } } } private CPListElement[] openJarFileDialog(CPListElement existing) { IWorkspaceRoot root= fCurrJProject.getProject().getWorkspace().getRoot(); if (existing == null) { IPath[] selected= BuildPathDialogAccess.chooseJAREntries(getShell(), fCurrJProject.getPath(), getUsedJARFiles(existing)); if (selected != null) { ArrayList res= new ArrayList(); for (int i= 0; i < selected.length; i++) { IPath curr= selected[i]; IResource resource= root.findMember(curr); if (resource instanceof IFile) { res.add(newCPLibraryElement(resource)); } } return (CPListElement[]) res.toArray(new CPListElement[res.size()]); } } else { IPath configured= BuildPathDialogAccess.configureJAREntry(getShell(), existing.getPath(), getUsedJARFiles(existing)); if (configured != null) { IResource resource= root.findMember(configured); if (resource instanceof IFile) { return new CPListElement[] { newCPLibraryElement(resource) }; } } } return null; } private CPListElement[] openExtJarFileDialog(CPListElement existing) { CPListElement tempElem=null; if (existing == null) { IPath[] selected= BuildPathDialogAccess.chooseExternalJAREntries(getShell()); if (selected != null) { ArrayList res= new ArrayList(); for (int i= 0; i < selected.length; i++) { tempElem = new CPListElement(fCurrJProject, IIncludePathEntry.CPE_LIBRARY, selected[i], null); tempElem.setExported(true); res.add(tempElem); } return (CPListElement[]) res.toArray(new CPListElement[res.size()]); } } else { IPath configured= BuildPathDialogAccess.configureExternalJAREntry(getShell(), existing.getPath()); if (configured != null) { tempElem = new CPListElement(fCurrJProject, IIncludePathEntry.CPE_LIBRARY, configured, null); tempElem.setExported(true); return new CPListElement[] { tempElem }; } } return null; } private IPath[] getUsedJARFiles(CPListElement existing) { List res= new ArrayList(); List cplist= fFoldersList.getElements(); for (int i= 0; i < cplist.size(); i++) { CPListElement elem= (CPListElement)cplist.get(i); // if ( elem.getEntryKind() == IIncludePathEntry.CPE_LIBRARY && (elem != existing)) { IResource resource= elem.getResource(); if (resource instanceof IFile) { res.add(resource.getFullPath()); }else if (resource instanceof IPath) { res.add(resource); } } } return (IPath[]) res.toArray(new IPath[res.size()]); } private CPListElement newCPLibraryElement(IResource res) { CPListElement elem= new CPListElement(fCurrJProject, IIncludePathEntry.CPE_LIBRARY, res.getFullPath(), res); elem.setExported(true); return elem; } private boolean hasFolders(IContainer container) { try { IResource[] members= container.members(); for (int i= 0; i < members.length; i++) { if (members[i] instanceof IContainer) { return true; } } } catch (CoreException e) { // ignore } List elements= fFoldersList.getElements(); if (elements.size() > 1) return true; if (elements.size() == 0) return false; CPListElement single= (CPListElement)elements.get(0); if (single.getPath().equals(fCurrJProject.getPath())) return false; return true; } private void editEntry() { List selElements= fFoldersList.getSelectedElements(); if (selElements.size() != 1) { return; } Object elem= selElements.get(0); if (fFoldersList.getIndexOfElement(elem) != -1) { editElementEntry((CPListElement) elem); } else if (elem instanceof CPListElementAttribute) { editAttributeEntry((CPListElementAttribute) elem); } } private void editElementEntry(CPListElement elem) { CPListElement[] res= null; if(elem.getEntryKind()== IIncludePathEntry.CPE_CONTAINER) { res= openContainerSelectionDialog(elem); }else if(elem.getEntryKind()== IIncludePathEntry.CPE_LIBRARY) { IResource resource= elem.getResource(); if (resource == null) { res= openExtJarFileDialog(elem); } else if (resource.getType() == IResource.FOLDER) { if (resource.exists()) { res= openClassFolderDialog(elem); } else { res= openNewClassFolderDialog(elem); } } else if (resource.getType() == IResource.FILE) { res= openJarFileDialog(elem); } }if (elem.getLinkTarget() != null) { AddSourceFolderWizard wizard= newLinkedSourceFolderWizard(elem, fFoldersList.getElements(), "", false); //$NON-NLS-1$ OpenBuildPathWizardAction action= new OpenBuildPathWizardAction(wizard); action.run(); } else { AddSourceFolderWizard wizard= newSourceFolderWizard(elem, fFoldersList.getElements(), "", false); //$NON-NLS-1$ OpenBuildPathWizardAction action= new OpenBuildPathWizardAction(wizard); action.run(); } if (res != null && res.length > 0) { CPListElement curr= res[0]; curr.setExported(elem.isExported()); curr.setAttributesFromExisting(elem); ArrayList removed = new ArrayList(0); ArrayList added = new ArrayList(0); removed.add(curr); added.add(elem); //fLibrariesList.replaceElement(elem, curr); refresh(added,removed,null); } } private CPListElement[] openNewClassFolderDialog(CPListElement existing) { String title= (existing == null) ? NewWizardMessages.LibrariesWorkbookPage_NewClassFolderDialog_new_title : NewWizardMessages.LibrariesWorkbookPage_NewClassFolderDialog_edit_title; IProject currProject= fCurrJProject.getProject(); NewContainerDialog dialog= new NewContainerDialog(getShell(), title, currProject, getUsedContainers(existing), existing); IPath projpath= currProject.getFullPath(); dialog.setMessage(Messages.format(NewWizardMessages.LibrariesWorkbookPage_NewClassFolderDialog_description, projpath.toString())); if (dialog.open() == Window.OK) { IFolder folder= dialog.getFolder(); return new CPListElement[] { newCPLibraryElement(folder) }; } return null; } private IPath[] getUsedContainers(CPListElement existing) { ArrayList res= new ArrayList(); List cplist= fFoldersList.getElements(); for (int i= 0; i < cplist.size(); i++) { CPListElement elem= (CPListElement)cplist.get(i); if (elem.getEntryKind() == IIncludePathEntry.CPE_LIBRARY && (elem != existing)) { IResource resource= elem.getResource(); if (resource instanceof IContainer && !resource.equals(existing)) { res.add(resource.getFullPath()); } } } return (IPath[]) res.toArray(new IPath[res.size()]); } private CPListElement[] openClassFolderDialog(CPListElement existing) { if (existing == null) { IPath[] selected= BuildPathDialogAccess.chooseClassFolderEntries(getShell(), fCurrJProject.getPath(), getUsedContainers(existing)); if (selected != null) { IWorkspaceRoot root= fCurrJProject.getProject().getWorkspace().getRoot(); ArrayList res= new ArrayList(); for (int i= 0; i < selected.length; i++) { IPath curr= selected[i]; IResource resource= root.findMember(curr); if (resource instanceof IContainer) { res.add(newCPLibraryElement(resource)); } } return (CPListElement[]) res.toArray(new CPListElement[res.size()]); } } else { // disabled } return null; } private CPListElement[] openContainerSelectionDialog(CPListElement existing) { if (existing == null) { IIncludePathEntry[] created= BuildPathDialogAccess.chooseContainerEntries(getShell(), fCurrJProject, getRawClasspath()); if (created != null) { CPListElement[] res= new CPListElement[created.length]; for (int i= 0; i < res.length; i++) { res[i]= new CPListElement(fCurrJProject, IIncludePathEntry.CPE_CONTAINER, created[i].getPath(), null); } return res; } } else { IIncludePathEntry created= BuildPathDialogAccess.configureContainerEntry(getShell(), existing.getClasspathEntry(), fCurrJProject, getRawClasspath()); if (created != null) { CPListElement elem= new CPListElement(fCurrJProject, IIncludePathEntry.CPE_CONTAINER, created.getPath(), null); return new CPListElement[] { elem }; } } return null; } private IIncludePathEntry[] getRawClasspath() { IIncludePathEntry[] currEntries= new IIncludePathEntry[fClassPathList.getSize()]; for (int i= 0; i < currEntries.length; i++) { CPListElement curr= (CPListElement) fClassPathList.getElement(i); currEntries[i]= curr.getClasspathEntry(); } return currEntries; } private void attributeUpdated(CPListElement selElement, String[] changedAttributes) { Object parentContainer= selElement.getParentContainer(); if (parentContainer instanceof CPListElement) { // inside a container: apply changes right away IIncludePathEntry updatedEntry= selElement.getClasspathEntry(); updateContainerEntry(updatedEntry, changedAttributes, fCurrJProject, ((CPListElement) parentContainer).getPath()); } } private void updateContainerEntry(final IIncludePathEntry newEntry, final String[] changedAttributes, final IJavaScriptProject jproject, final IPath containerPath) { try { IWorkspaceRunnable runnable= new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { BuildPathSupport.modifyClasspathEntry(null, newEntry, changedAttributes, jproject, containerPath, monitor); } }; PlatformUI.getWorkbench().getProgressService().run(true, true, new WorkbenchRunnableAdapter(runnable)); } catch (InvocationTargetException e) { String title= NewWizardMessages.LibrariesWorkbookPage_configurecontainer_error_title; String message= NewWizardMessages.LibrariesWorkbookPage_configurecontainer_error_message; ExceptionHandler.handle(e, getShell(), title, message); } catch (InterruptedException e) { // } } private void editAttributeEntry(CPListElementAttribute elem) { String key= elem.getKey(); CPListElement selElement= elem.getParent(); if (key.equals(CPListElement.ACCESSRULES)) { AccessRulesDialog dialog= new AccessRulesDialog(getShell(), selElement, fCurrJProject, false); int res= dialog.open(); if (res == Window.OK || res == AccessRulesDialog.SWITCH_PAGE) { selElement.setAttribute(CPListElement.ACCESSRULES, dialog.getAccessRules()); String[] changedAttributes= { CPListElement.ACCESSRULES }; attributeUpdated(selElement, changedAttributes); fFoldersList.refresh(elem); fClassPathList.dialogFieldChanged(); // validate updateEnabledState(); // if (res == AccessRulesDialog.SWITCH_PAGE) { // switch after updates and validation // dialog.performPageSwitch(fPageContainer); // } } // } else if (key.equals(CPListElement.OUTPUT)) { // //CPListElement selElement= elem.getParent(); // OutputLocationDialog dialog= new OutputLocationDialog(getShell(), selElement, fClassPathList.getElements(), new Path("").makeAbsolute(), true); //$NON-NLS-1$ // if (dialog.open() == Window.OK) { // selElement.setAttribute(CPListElement.OUTPUT, dialog.getOutputLocation()); // fFoldersList.refresh(); // fClassPathList.dialogFieldChanged(); // validate // } } else if (key.equals(CPListElement.EXCLUSION) || key.equals(CPListElement.INCLUSION)) { EditFilterWizard wizard= newEditFilterWizard(elem.getParent(), fFoldersList.getElements(), ""); //$NON-NLS-1$ OpenBuildPathWizardAction action= new OpenBuildPathWizardAction(wizard); action.run(); } else { if (editCustomAttribute(getShell(), elem)) { fFoldersList.refresh(); fClassPathList.dialogFieldChanged(); // validate } } } protected void sourcePageSelectionChanged(DialogField field) { List selected= fFoldersList.getSelectedElements(); fFoldersList.enableButton(IDX_EDIT, canEdit(selected)); fFoldersList.enableButton(IDX_REMOVE, canRemove(selected)); boolean noAttributes= containsOnlyTopLevelEntries(selected); fFoldersList.enableButton(IDX_ADD, noAttributes); } private void removeEntry() { List selElements= fFoldersList.getSelectedElements(); for (int i= selElements.size() - 1; i >= 0 ; i--) { Object elem= selElements.get(i); if (elem instanceof CPListElementAttribute) { CPListElementAttribute attrib= (CPListElementAttribute) elem; String key= attrib.getKey(); if (attrib.isBuiltIn()) { Object value= null; if (key.equals(CPListElement.EXCLUSION) || key.equals(CPListElement.INCLUSION)) { value= new Path[0]; } attrib.getParent().setAttribute(key, value); } else { removeCustomAttribute(attrib); } selElements.remove(i); } } if (selElements.isEmpty()) { fFoldersList.refresh(); fClassPathList.dialogFieldChanged(); // validate } else { for (Iterator iter= selElements.iterator(); iter.hasNext();) { CPListElement element= (CPListElement)iter.next(); if (element.getEntryKind() == IIncludePathEntry.CPE_SOURCE) { List list= ClasspathModifier.removeFilters(element.getPath(), fCurrJProject, fFoldersList.getElements()); for (Iterator iterator= list.iterator(); iterator.hasNext();) { CPListElement modified= (CPListElement)iterator.next(); fFoldersList.refresh(modified); fFoldersList.expandElement(modified, 3); } } } fFoldersList.removeElements(selElements); } } private boolean canRemove(List selElements) { if (selElements.size() == 0) { return false; } for (int i= 0; i < selElements.size(); i++) { Object elem= selElements.get(i); if (elem instanceof CPListElementAttribute) { CPListElementAttribute attrib= (CPListElementAttribute) elem; String key= attrib.getKey(); if (attrib.isBuiltIn()) { if (CPListElement.INCLUSION.equals(key)) { if (((IPath[]) attrib.getValue()).length == 0) { return false; } } else if (CPListElement.EXCLUSION.equals(key)) { if (((IPath[]) attrib.getValue()).length == 0) { return false; } } else if (attrib.getValue() == null) { return false; } } else { if (!canRemoveCustomAttribute(attrib)) { return false; } } } else if (elem instanceof CPListElement) { CPListElement curr= (CPListElement) elem; if (curr.getParentContainer() != null) { return false; } } } return true; } private boolean canEdit(List selElements) { if (selElements.size() != 1) { return false; } Object elem= selElements.get(0); if (elem instanceof CPListElement) { CPListElement cp= ((CPListElement)elem); if (cp.getPath().equals(cp.getJavaProject().getPath())) return false; return true; } if (elem instanceof CPListElementAttribute) { CPListElementAttribute attrib= (CPListElementAttribute) elem; if (attrib.isBuiltIn()) { return true; } else { return canEditCustomAttribute(attrib); } } return false; } private void sourcePageDialogFieldChanged(DialogField field) { if (fCurrJProject == null) { // not initialized return; } // if (field == fUseFolderOutputs) { // if (!fUseFolderOutputs.isSelected()) { // int nFolders= fFoldersList.getSize(); // for (int i= 0; i < nFolders; i++) { // CPListElement cpe= (CPListElement) fFoldersList.getElement(i); // cpe.setAttribute(CPListElement.OUTPUT, null); // } // } // fFoldersList.refresh(); // } else if (field == fFoldersList) { updateClasspathList(); } } private void updateClasspathList() { List srcelements= fFoldersList.getElements(); List cpelements= fClassPathList.getElements(); int nEntries= cpelements.size(); // backwards, as entries will be deleted int lastRemovePos= nEntries; int afterLastSourcePos= 0; for (int i= nEntries - 1; i >= 0; i--) { CPListElement cpe= (CPListElement)cpelements.get(i); int kind= cpe.getEntryKind(); if (isEntryKind(kind)) { if (!srcelements.remove(cpe)) { cpelements.remove(i); lastRemovePos= i; } else if (lastRemovePos == nEntries) { afterLastSourcePos= i + 1; } } } if (!srcelements.isEmpty()) { int insertPos= Math.min(afterLastSourcePos, lastRemovePos); cpelements.addAll(insertPos, srcelements); } //if (lastRemovePos != nEntries || !srcelements.isEmpty()) { fClassPathList.setElements(cpelements); //} } /* * @see BuildPathBasePage#getSelection */ public List getSelection() { return fFoldersList.getSelectedElements(); } /* * @see BuildPathBasePage#setSelection */ public void setSelection(List selElements, boolean expand) { fFoldersList.selectElements(new StructuredSelection(selElements)); if (expand) { for (int i= 0; i < selElements.size(); i++) { fFoldersList.expandElement(selElements.get(i), 1); } } } /* (non-Javadoc) * @see org.eclipse.wst.jsdt.internal.ui.wizards.buildpaths.BuildPathBasePage#isEntryKind(int) */ public boolean isEntryKind(int kind) { return (kind == IIncludePathEntry.CPE_SOURCE || kind==IIncludePathEntry.CPE_LIBRARY || kind==IIncludePathEntry.CPE_VARIABLE); } private void refresh(List insertedElements, List removedElements, List modifiedElements) { if (removedElements==null) removedElements=new ArrayList(); if (modifiedElements==null) modifiedElements=new ArrayList(); fFoldersList.addElements(insertedElements); for (Iterator iter= insertedElements.iterator(); iter.hasNext();) { CPListElement element= (CPListElement)iter.next(); fFoldersList.expandElement(element, 3); } fFoldersList.removeElements(removedElements); for (Iterator iter= modifiedElements.iterator(); iter.hasNext();) { CPListElement element= (CPListElement)iter.next(); fFoldersList.refresh(element); fFoldersList.expandElement(element, 3); fFoldersList.dialogFieldChanged(); } fFoldersList.refresh(); //does enforce the order of the entries. if (!insertedElements.isEmpty()) { fFoldersList.postSetSelection(new StructuredSelection(insertedElements)); } //fOutputLocationField.setText(outputLocation.makeRelative().toOSString()); } private void updateEnabledState() { List selElements= fFoldersList.getSelectedElements(); fFoldersList.enableButton(IDX_EDIT, canEdit(selElements)); fFoldersList.enableButton(IDX_REMOVE, canRemove(selElements)); //fFoldersList.enableButton(IDX_REPLACE, getSelectedPackageFragmentRoot() != null); // boolean noAttributes= containsOnlyTopLevelEntries(selElements); //fLibrariesList.enableButton(IDX_ADDEXT, noAttributes); //fLibrariesList.enableButton(IDX_ADDFOL, noAttributes); //fLibrariesList.enableButton(IDX_ADDJAR, noAttributes); //fFoldersList.enableButton(IDX_ADDLIB, noAttributes); //fLibrariesList.enableButton(IDX_ADDVAR, noAttributes); } /** * {@inheritDoc} */ public void setFocus() { fFoldersList.setFocus(); } }