/******************************************************************************* * Copyright (c) 2000, 2006 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * Dan Rubel - initial API and implementation * IBM Corporation - ongoing maintenance *******************************************************************************/ package org.eclipse.team.internal.ui; import java.io.File; import java.util.Arrays; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Assert; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Shell; import org.eclipse.team.core.ProjectSetSerializationContext; import org.eclipse.team.core.TeamException; import org.eclipse.team.internal.ui.dialogs.IPromptCondition; import org.eclipse.team.internal.ui.dialogs.PromptingDialog; /** * The UI based context in which project serialization occurs. * The class may be subclasses to represent different UI based serialization contexts. * It is recommended that all UI based serialization contexts * use this class directly or indirectly as their superclass. * * @since 3.0 */ public class UIProjectSetSerializationContext extends ProjectSetSerializationContext { /** * The parent shell for this UI context */ private final Shell shell; /** * Constructs a new instance. * * @param shell The parent shell for this UI context * @param filename a filename or {@code null} */ public UIProjectSetSerializationContext(Shell shell, String filename) { super(filename); Assert.isNotNull(shell); this.shell = shell; } /** * Answer the shell associated with this UI context. * * @return the shell (not null) */ @Override public Object getShell() { return shell; } /** * Given an array of projects that currently exist in the workspace * prompt the user to determine which of those projects should be overwritten. *

* This default implementation prompts the user * to determine which projects should be overwritten. * Subclasses may override this as appropriate. * * @param projects * an array of projects currently existing in the workspace * that are desired to be overwritten. * (not null, contains no nulls) * @return * an array of zero or more projects that should be overwritten * or null if the operation is to be canceled * * @see org.eclipse.team.core.ProjectSetSerializationContext#confirmOverwrite(org.eclipse.core.resources.IProject[]) */ @Override public IProject[] confirmOverwrite(final IProject[] projects) throws TeamException { IPromptCondition prompt = new IPromptCondition() { List resources = Arrays.asList(projects); @Override public boolean needsPrompt(IResource resource) { if (resource instanceof IProject) { IProject project = (IProject) resource; return (project.exists() || getTargetFile(project).exists()) && resources.contains(resource); } return false; } @Override public String promptMessage(IResource resource) { if (resource.exists()) return NLS.bind(TeamUIMessages.UIProjectSetSerializationContext_0, new String[] { resource.getName() }); return NLS.bind(TeamUIMessages.UIProjectSetSerializationContext_2, new String[] { resource.getName(), getTargetFile((IProject)resource).getAbsolutePath() }); } public File getTargetFile(IProject project) { return new File(project.getParent().getLocation().toFile(), project.getName()); } }; PromptingDialog dialog = new PromptingDialog( (Shell) getShell(), projects, prompt, TeamUIMessages.UIProjectSetSerializationContext_1); IResource[] resourcesToOverwrite; try { resourcesToOverwrite = dialog.promptForMultiple(); } catch (InterruptedException e) { // Return null indicating that the user canceled the operation return null; } IProject[] projectsToOverwrite = new IProject[resourcesToOverwrite.length]; System.arraycopy(resourcesToOverwrite, 0, projectsToOverwrite, 0, resourcesToOverwrite.length); return projectsToOverwrite; } }