package jetbrains.mps.vcs.platform.actions;
/*Generated by MPS */
import jetbrains.mps.workbench.action.BaseAction;
import javax.swing.Icon;
import com.intellij.openapi.actionSystem.AnActionEvent;
import java.util.Map;
import java.util.List;
import com.intellij.openapi.vfs.VirtualFile;
import jetbrains.mps.vcs.platform.integration.ConflictingModelsUtil;
import jetbrains.mps.ide.actions.MPSCommonDataKeys;
import com.intellij.openapi.vcs.merge.MergeProvider;
import git4idea.GitVcs;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.project.MPSProject;
import com.intellij.openapi.vcs.merge.MergeSession;
import com.intellij.openapi.vcs.merge.MergeProvider2;
import com.intellij.openapi.progress.ProgressManager;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import com.intellij.openapi.ui.Messages;
public class ResolveNonconflictingChanges_Action extends BaseAction {
private static final Icon ICON = null;
public ResolveNonconflictingChanges_Action() {
super("Resolve non-conflicting changes in MPS models", "", ICON);
this.setIsAlwaysVisible(false);
this.setExecuteOutsideCommand(true);
}
@Override
public boolean isDumbAware() {
return true;
}
@Override
public boolean isApplicable(AnActionEvent event, final Map<String, Object> _params) {
List<VirtualFile> conflictedModelFiles = ConflictingModelsUtil.getConflictingModelFiles(event.getData(MPSCommonDataKeys.MPS_PROJECT).getProject());
MergeProvider provider = GitVcs.getInstance(event.getData(MPSCommonDataKeys.MPS_PROJECT).getProject()).getMergeProvider();
return ConflictingModelsUtil.hasResolvableConflicts(event.getData(MPSCommonDataKeys.MPS_PROJECT).getProject(), provider, conflictedModelFiles);
}
@Override
public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) {
this.setEnabledState(event.getPresentation(), this.isApplicable(event, _params));
}
@Override
protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) {
if (!(super.collectActionData(event, _params))) {
return false;
}
{
MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT);
if (p == null) {
return false;
}
}
return true;
}
@Override
public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) {
List<VirtualFile> conflictedModelFiles = ConflictingModelsUtil.getConflictingModelFiles(event.getData(MPSCommonDataKeys.MPS_PROJECT).getProject());
// merge with git provider
MergeProvider provider = GitVcs.getInstance(event.getData(MPSCommonDataKeys.MPS_PROJECT).getProject()).getMergeProvider();
MergeSession session = (provider instanceof MergeProvider2 ? ((MergeProvider2) provider).createMergeSession(conflictedModelFiles) : null);
ConflictingModelsUtil.ModelConflictResolver resolver = ConflictingModelsUtil.getModelConflictResolverTask(event.getData(MPSCommonDataKeys.MPS_PROJECT).getProject(), provider, session, conflictedModelFiles);
ProgressManager.getInstance().run(resolver);
if (ListSequence.fromList(resolver.getUnresolvedFiles()).isNotEmpty()) {
String message = "Conflicts in the following model files were not autoresolved:\n";
for (VirtualFile file : ListSequence.fromList(resolver.getUnresolvedFiles())) {
message += " " + file.getPath() + "\n";
}
message += "This happens when you merge in models in an old persistence format and have not merged and re-generated all of their used languages." + " It is recommended to first merge and re-generate the used languages, and then try to auto resolve the conflicts again.";
Messages.showWarningDialog(event.getData(MPSCommonDataKeys.MPS_PROJECT).getProject(), message, "Conflict Resolver");
}
}
}