blob: 2e400adfd8fa8cb8c28c1cbf17c99f263ffd50f5 [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.idea.svn.actions;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vcs.AbstractVcsHelper;
import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.changes.BackgroundFromStartOption;
import com.intellij.openapi.vcs.changes.LocallyDeletedChange;
import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
import com.intellij.openapi.vcs.changes.ui.ChangesListView;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.svn.SvnBundle;
import org.jetbrains.idea.svn.SvnLocallyDeletedChange;
import org.jetbrains.idea.svn.SvnVcs;
import org.jetbrains.idea.svn.api.Depth;
import java.util.Collections;
import java.util.List;
/**
* @author irengrig
* Date: 6/8/11
* Time: 4:58 PM
*/
public class MarkLocallyDeletedTreeConflictResolvedAction extends AnAction {
public MarkLocallyDeletedTreeConflictResolvedAction() {
super(SvnBundle.message("action.mark.tree.conflict.resolved.text"));
}
@Override
public void actionPerformed(AnActionEvent e) {
final MyLocallyDeletedChecker locallyDeletedChecker = new MyLocallyDeletedChecker(e);
if (! locallyDeletedChecker.isEnabled()) return;
final String markText = SvnBundle.message("action.mark.tree.conflict.resolved.confirmation.title");
final Project project = locallyDeletedChecker.getProject();
final int result = Messages.showYesNoDialog(project,
SvnBundle.message("action.mark.tree.conflict.resolved.confirmation.text"), markText,
Messages.getQuestionIcon());
if (result == Messages.YES) {
final Ref<VcsException> exception = new Ref<VcsException>();
ProgressManager
.getInstance().run(new Task.Backgroundable(project, markText, true, BackgroundFromStartOption.getInstance()) {
public void run(@NotNull ProgressIndicator indicator) {
resolveLocallyDeletedTextConflict(locallyDeletedChecker, exception);
}
});
if (! exception.isNull()) {
AbstractVcsHelper.getInstance(project).showError(exception.get(), markText);
}
}
}
@Override
public void update(AnActionEvent e) {
final MyLocallyDeletedChecker locallyDeletedChecker = new MyLocallyDeletedChecker(e);
e.getPresentation().setVisible(locallyDeletedChecker.isEnabled());
e.getPresentation().setEnabled(locallyDeletedChecker.isEnabled());
//e.getPresentation().setText(SvnBundle.message("action.mark.tree.conflict.resolved.text"));
}
private void resolveLocallyDeletedTextConflict(MyLocallyDeletedChecker checker, Ref<VcsException> exception) {
final FilePath path = checker.getPath();
resolve(checker.getProject(), exception, path);
VcsDirtyScopeManager.getInstance(checker.getProject()).filePathsDirty(Collections.singletonList(path), null);
}
private void resolve(Project project, Ref<VcsException> exception, FilePath path) {
SvnVcs vcs = SvnVcs.getInstance(project);
try {
vcs.getFactory(path.getIOFile()).createConflictClient().resolve(path.getIOFile(), Depth.EMPTY, false, false, true);
}
catch (VcsException e) {
exception.set(e);
}
}
private static class MyLocallyDeletedChecker {
private final boolean myEnabled;
private final FilePath myPath;
private final Project myProject;
public MyLocallyDeletedChecker(final AnActionEvent e) {
final DataContext dc = e.getDataContext();
myProject = CommonDataKeys.PROJECT.getData(dc);
if (myProject == null) {
myPath = null;
myEnabled = false;
return;
}
final List<LocallyDeletedChange> missingFiles = e.getData(ChangesListView.LOCALLY_DELETED_CHANGES);
if (missingFiles == null || missingFiles.isEmpty()) {
myPath = null;
myEnabled = false;
return;
}
/*if (missingFiles == null || missingFiles.size() != 1) {
final Change[] changes = e.getData(VcsDataKeys.CHANGES);
if (changes == null || changes.length != 1 || changes[0].getAfterRevision() != null) {
myPath = null;
myEnabled = false;
return;
}
myEnabled = changes[0] instanceof ConflictedSvnChange && ((ConflictedSvnChange) changes[0]).getConflictState().isTree();
if (myEnabled) {
myPath = changes[0].getBeforeRevision().getFile();
} else {
myPath = null;
}
return;
} */
final LocallyDeletedChange change = missingFiles.get(0);
myEnabled = change instanceof SvnLocallyDeletedChange && ((SvnLocallyDeletedChange) change).getConflictState().isTree();
if (myEnabled) {
myPath = change.getPath();
}
else {
myPath = null;
}
}
public boolean isEnabled() {
return myEnabled;
}
public FilePath getPath() {
return myPath;
}
public Project getProject() {
return myProject;
}
}
}