org.jetbrains.idea.svn.actions.MarkLocallyDeletedTreeConflictResolvedAction.java Source code

Java tutorial

Introduction

Here is the source code for org.jetbrains.idea.svn.actions.MarkLocallyDeletedTreeConflictResolvedAction.java

Source

/*
 * 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.tmatesoft.svn.core.SVNDepth;

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(), SVNDepth.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;
        }
    }
}