All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.intellij.cvsSupport2.actions.IgnoreFileAction Maven / Gradle / Ivy

Go to download

A packaging of the IntelliJ Community Edition cvs-plugin library. This is release number 1 of trunk branch 142.

The newest version!
/*
 * Copyright 2000-2014 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 com.intellij.cvsSupport2.actions;

import com.intellij.CvsBundle;
import com.intellij.cvsSupport2.CvsUtil;
import com.intellij.cvsSupport2.actions.actionVisibility.CvsActionVisibility;
import com.intellij.cvsSupport2.actions.cvsContext.CvsContext;
import com.intellij.cvsSupport2.actions.cvsContext.CvsContextAdapter;
import com.intellij.cvsSupport2.actions.cvsContext.CvsContextWrapper;
import com.intellij.cvsSupport2.application.CvsEntriesManager;
import com.intellij.cvsSupport2.cvshandlers.CvsHandler;
import com.intellij.cvsSupport2.ui.CvsTabbedWindow;
import com.intellij.cvsSupport2.ui.Options;
import com.intellij.cvsSupport2.util.CvsVfsUtil;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
import com.intellij.openapi.vcs.ui.Refreshable;
import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;

/**
 * author: lesya
 */
public class IgnoreFileAction extends AnAction implements DumbAware {

  private static final Logger LOG = Logger.getInstance("#com.intellij.cvsSupport2.actions.IgnoreFileAction");

  private final CvsActionVisibility myVisibility = new CvsActionVisibility();

  public IgnoreFileAction() {
    myVisibility.canBePerformedOnSeveralFiles();
    myVisibility.addCondition(ActionOnSelectedElement.FILES_ARENT_UNDER_CVS);
    myVisibility.addCondition(ActionOnSelectedElement.FILES_ARE_NOT_IGNORED);
  }

  public void update(AnActionEvent e) {
    myVisibility.applyToEvent(e);
  }

  public void actionPerformed(AnActionEvent e) {
    final MultiMap parentToSelectedChildren = MultiMap.createSmart();
    final CvsContext context = CvsContextWrapper.createCachedInstance(e);
    final VirtualFile[] selectedFiles = context.getSelectedFiles();
    for (VirtualFile selectedFile : selectedFiles) {
      final VirtualFile parent = selectedFile.getParent();
      parentToSelectedChildren.putValue(parent, selectedFile);
      try {
        CvsUtil.ignoreFile(selectedFile);
      }
      catch (IOException e1) {
        final String message = CvsBundle.message("message.error.ignore.files", selectedFile.getPresentableUrl(), e1.getLocalizedMessage());
        VcsBalloonProblemNotifier.showOverChangesView(context.getProject(), message, MessageType.ERROR);
      }
    }
    refreshFilesAndStatuses(context, parentToSelectedChildren);
  }

  private static void refreshPanel(CvsContext context) {
    final Refreshable refreshablePanel = context.getRefreshableDialog();
    if (refreshablePanel != null) {
      refreshablePanel.restoreState();
      refreshablePanel.refresh();
    }
  }

  private static void refreshFilesAndStatuses(final CvsContext context, final MultiMap parentToSelectedChildren) {
    final Refreshable refreshablePanel = context.getRefreshableDialog();
    if (refreshablePanel != null) refreshablePanel.saveState();
    final int[] refreshedParents = new int[]{0};
    final Collection createdCvsIgnoreFiles = new ArrayList();
    for (final VirtualFile parent : parentToSelectedChildren.keySet()) {
      final Runnable runnable = new Runnable() {
        public void run() {
          try {
            final VirtualFile cvsIgnoreFile =
              CvsVfsUtil.refreshAndfFindChild(parent, CvsUtil.CVS_IGNORE_FILE);
            if (cvsIgnoreFile == null) {
              final String path = parent.getPath() + "/" + CvsUtil.CVS_IGNORE_FILE;
              LOG.error(String.valueOf(CvsVfsUtil.findFileByPath(path)) + " " + parent.getPath() + " " +
                        new File(VfsUtil.virtualToIoFile(parent), CvsUtil.CVS_IGNORE_FILE).isFile());
              return;
            }

            if (!CvsUtil.fileIsUnderCvs(cvsIgnoreFile) &&
                !ChangeListManager.getInstance(context.getProject()).isIgnoredFile(cvsIgnoreFile) &&
                !CvsEntriesManager.getInstance().fileIsIgnored(cvsIgnoreFile)) {
              createdCvsIgnoreFiles.add(cvsIgnoreFile);
            }

            final Collection filesToUpdateStatus = parentToSelectedChildren.get(parent);
            for (final VirtualFile file : filesToUpdateStatus) {
              FileStatusManager.getInstance(context.getProject()).fileStatusChanged(file);
              VcsDirtyScopeManager.getInstance(context.getProject()).fileDirty(file);
            }
          }
          finally {
            refreshedParents[0]++;
            if (refreshedParents[0] == parentToSelectedChildren.size()) {
              // all parents are refreshed
              if (createdCvsIgnoreFiles.isEmpty()) {
                refreshPanel(context);
              }
              else {
                addCvsIgnoreFilesToCvsAndRefreshPanel();
              }
            }
          }
        }

        private void addCvsIgnoreFilesToCvsAndRefreshPanel() {
          createAddFilesAction().actionPerformed(createContext(createdCvsIgnoreFiles, context));
        }

        private AddFileOrDirectoryAction createAddFilesAction() {
          return new AddFileOrDirectoryAction(CvsBundle.message("adding.cvsignore.files.to.cvs.action.name"), Options.ON_FILE_ADDING) {
            protected void onActionPerformed(CvsContext context,
                                             CvsTabbedWindow tabbedWindow,
                                             boolean successfully,
                                             CvsHandler handler) {
              refreshPanel(context);
            }
          };
        }
      };
      parent.refresh(true, true, runnable);
    }
  }

  private static CvsContextAdapter createContext(final Collection createdCvsIgnoreFiles, final CvsContext context) {
    return new CvsContextAdapter() {
      @NotNull
      public VirtualFile[] getSelectedFiles() {
        return VfsUtil.toVirtualFileArray(createdCvsIgnoreFiles);
      }

      public Refreshable getRefreshableDialog() {
        return context.getRefreshableDialog();
      }

      public Project getProject() {
        return context.getProject();
      }
    };
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy