blob: a859d2d8e367f0b64a7cc5e3ed842dd9282c6f78 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 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
*
*******************************************************************************/
package org.eclipse.dltk.internal.ui.wizards.buildpath;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IBuildpathEntry;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.internal.ui.wizards.NewWizardMessages;
import org.eclipse.dltk.internal.ui.wizards.TypedViewerFilter;
import org.eclipse.dltk.ui.actions.AbstractOpenWizardAction;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
public class CreateMultipleSourceFoldersDialog extends TrayDialog {
private final class FakeFolderBaseWorkbenchContentProvider extends BaseWorkbenchContentProvider {
@Override
public Object getParent(Object element) {
Object object= fNonExistingFolders.get(element);
if (object != null)
return object;
return super.getParent(element);
}
@Override
public Object[] getChildren(Object element) {
List result= new ArrayList();
//all keys with value element
Set keys= fNonExistingFolders.keySet();
for (Iterator iter= keys.iterator(); iter.hasNext();) {
Object key= iter.next();
if (fNonExistingFolders.get(key).equals(element)) {
result.add(key);
}
}
if (result.size() == 0)
return super.getChildren(element);
Object[] children= super.getChildren(element);
for (int i= 0; i < children.length; i++) {
result.add(children[i]);
}
return result.toArray();
}
}
private final IScriptProject fScriptProject;
private final BPListElement[] fExistingElements;
private final HashSet fRemovedElements;
private final HashSet fModifiedElements;
private final HashSet fInsertedElements;
private final Hashtable fNonExistingFolders;
public CreateMultipleSourceFoldersDialog(final IScriptProject scriptProject, final BPListElement[] existingElements, Shell shell) {
super(shell);
fScriptProject= scriptProject;
fExistingElements= existingElements;
fRemovedElements= new HashSet();
fModifiedElements= new HashSet();
fInsertedElements= new HashSet();
fNonExistingFolders= new Hashtable();
for (int i= 0; i < existingElements.length; i++) {
BPListElement cur= existingElements[i];
if (cur.getResource() == null || !cur.getResource().exists()) {
addFakeFolder(fScriptProject.getProject(), cur);
}
}
}
@Override
public int open() {
Class[] acceptedClasses= new Class[] { IProject.class, IFolder.class };
List existingContainers= getExistingContainers(fExistingElements);
IProject[] allProjects= ResourcesPlugin.getWorkspace().getRoot().getProjects();
ArrayList rejectedElements= new ArrayList(allProjects.length);
IProject currProject= fScriptProject.getProject();
for (int i= 0; i < allProjects.length; i++) {
if (!allProjects[i].equals(currProject)) {
rejectedElements.add(allProjects[i]);
}
}
ViewerFilter filter= new TypedViewerFilter(acceptedClasses, rejectedElements.toArray());
ILabelProvider lp= new WorkbenchLabelProvider();
ITreeContentProvider cp= new FakeFolderBaseWorkbenchContentProvider();
String title= NewWizardMessages.SourceContainerWorkbookPage_ExistingSourceFolderDialog_new_title;
String message= NewWizardMessages.SourceContainerWorkbookPage_ExistingSourceFolderDialog_edit_description;
MultipleFolderSelectionDialog dialog= new MultipleFolderSelectionDialog(getShell(), lp, cp) {
@Override
protected Control createDialogArea(Composite parent) {
Control result= super.createDialogArea(parent);
if (DLTKCore.DEBUG) {
System.err.println("CreateMultipleSourceFoldersDialog: Add help support"); //$NON-NLS-1$
}
//PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDLTKHelpContextIds.BP_CHOOSE_EXISTING_FOLDER_TO_MAKE_SOURCE_FOLDER);
return result;
}
@Override
protected Object createFolder(final IContainer container) {
final Object[] result= new Object[1];
final BPListElement newElement= new BPListElement(fScriptProject, IBuildpathEntry.BPE_SOURCE, false);
final AddSourceFolderWizard wizard= newSourceFolderWizard(newElement, fExistingElements, container);
AbstractOpenWizardAction action= new AbstractOpenWizardAction() {
@Override
protected INewWizard createWizard() throws CoreException {
return wizard;
}
};
action.addPropertyChangeListener(event -> {
if (event.getProperty().equals(IAction.RESULT)) {
if (event.getNewValue().equals(Boolean.TRUE)) {
result[0]= addFakeFolder(fScriptProject.getProject(), newElement);
} else {
wizard.cancel();
}
}
});
action.run();
return result[0];
}
};
dialog.setExisting(existingContainers.toArray());
dialog.setTitle(title);
dialog.setMessage(message);
dialog.addFilter(filter);
dialog.setInput(fScriptProject.getProject().getParent());
dialog.setInitialFocus(fScriptProject.getProject());
if (dialog.open() == Window.OK) {
Object[] elements= dialog.getResult();
for (int i= 0; i < elements.length; i++) {
IResource res= (IResource)elements[i];
fInsertedElements.add(new BPListElement(fScriptProject, IBuildpathEntry.BPE_SOURCE, res.getFullPath(), res, false));
}
if (fExistingElements.length == 1) {
} else {
ArrayList added= new ArrayList(fInsertedElements);
HashSet updatedEclusionPatterns= new HashSet();
addExlusionPatterns(added, updatedEclusionPatterns);
fModifiedElements.addAll(updatedEclusionPatterns);
}
return Window.OK;
} else {
return Window.CANCEL;
}
}
public List getInsertedElements() {
return new ArrayList(fInsertedElements);
}
public List getRemovedElements() {
return new ArrayList(fRemovedElements);
}
public List getModifiedElements() {
return new ArrayList(fModifiedElements);
}
private void addExlusionPatterns(List<BPListElement> newEntries,
Set modifiedEntries) {
BuildPathBasePage.fixNestingConflicts(
newEntries.toArray(new BPListElement[newEntries.size()]),
fExistingElements, modifiedEntries);
if (!modifiedEntries.isEmpty()) {
String title= NewWizardMessages.SourceContainerWorkbookPage_exclusion_added_title;
String message= NewWizardMessages.SourceContainerWorkbookPage_exclusion_added_message;
MessageDialog.openInformation(getShell(), title, message);
}
}
private AddSourceFolderWizard newSourceFolderWizard(BPListElement element, BPListElement[] existing, IContainer parent) {
AddSourceFolderWizard wizard= new AddSourceFolderWizard(existing, element, false, true, false, false, false, parent);
wizard.setDoFlushChange(false);
return wizard;
}
private List getExistingContainers(BPListElement[] existingElements) {
List res= new ArrayList();
for (int i= 0; i < existingElements.length; i++) {
IResource resource= existingElements[i].getResource();
if (resource instanceof IContainer) {
res.add(resource);
}
}
Set keys= fNonExistingFolders.keySet();
for (Iterator iter= keys.iterator(); iter.hasNext();) {
IFolder folder= (IFolder)iter.next();
res.add(folder);
}
return res;
}
private IFolder addFakeFolder(final IContainer container, final BPListElement element) {
IFolder result;
IPath projectPath= fScriptProject.getPath();
IPath path= element.getPath();
if (projectPath.isPrefixOf(path)) {
path= path.removeFirstSegments(projectPath.segmentCount());
}
result= container.getFolder(path);
IFolder folder= result;
do {
IContainer parent= folder.getParent();
fNonExistingFolders.put(folder, parent);
if (parent instanceof IFolder) {
folder= (IFolder)parent;
} else {
folder= null;
}
} while (folder != null && !folder.exists());
return result;
}
}