blob: 2d2400afcd9792547cb21fee0734ea5ed19fe519 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2017 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ui.mapping;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.team.core.mapping.IMergeContext;
import org.eclipse.team.core.mapping.ISynchronizationContext;
import org.eclipse.team.core.mapping.provider.SynchronizationContext;
import org.eclipse.team.internal.ui.Policy;
import org.eclipse.team.internal.ui.TeamUIMessages;
import org.eclipse.team.ui.mapping.SynchronizationOperation;
import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration;
import org.eclipse.team.ui.synchronize.ModelMergeOperation;
public final class MergeAllOperation extends SynchronizationOperation {
private final IMergeContext context;
private final String jobName;
public MergeAllOperation(String jobName, ISynchronizePageConfiguration configuration, Object[] elements, IMergeContext context) {
super(configuration, elements);
this.jobName = jobName;
this.context = context;
}
@Override
public void execute(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
new ModelMergeOperation(getPart(), ((SynchronizationContext)context).getScopeManager()) {
@Override
public boolean isPreviewRequested() {
return false;
}
@Override
protected void initializeContext(IProgressMonitor monitor) throws CoreException {
monitor.beginTask(null, 10);
monitor.done();
}
@Override
protected ISynchronizationContext getContext() {
return context;
}
@Override
protected void executeMerge(IProgressMonitor monitor) throws CoreException {
monitor.beginTask(null, 100);
if (!hasChangesOfInterest()) {
handleNoChanges();
} else if (isPreviewRequested()) {
handlePreviewRequest();
} else {
IStatus status = ModelMergeOperation.validateMerge(getMergeContext(), Policy.subMonitorFor(monitor, 10));
if (!status.isOK()) {
if (!promptToContinue(status))
return;
}
status = performMerge(Policy.subMonitorFor(monitor, 90));
if (!status.isOK()) {
handleMergeFailure(status);
}
}
monitor.done();
}
private IMergeContext getMergeContext() {
return (IMergeContext)getContext();
}
private boolean promptToContinue(final IStatus status) {
final boolean[] result = new boolean[] { false };
Runnable runnable = () -> {
ErrorDialog dialog = new ErrorDialog(getShell(), TeamUIMessages.ModelMergeOperation_0, TeamUIMessages.ModelMergeOperation_1, status, IStatus.ERROR | IStatus.WARNING | IStatus.INFO) {
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL,
false);
createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL,
true);
createDetailsButton(parent);
}
@Override
protected void buttonPressed(int id) {
if (id == IDialogConstants.YES_ID)
super.buttonPressed(IDialogConstants.OK_ID);
else if (id == IDialogConstants.NO_ID)
super.buttonPressed(IDialogConstants.CANCEL_ID);
super.buttonPressed(id);
}
};
int code = dialog.open();
result[0] = code == 0;
};
getShell().getDisplay().syncExec(runnable);
return (result[0]);
}
}.run(monitor);
}
@Override
protected boolean canRunAsJob() {
return true;
}
@Override
protected String getJobName() {;
return jobName;
}
}