blob: c5c5e955e8558d656db673d93da6e8b33c170fe9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2018 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;
}
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;
}
}