ExcludedFileIndex -> FileIndexFacade; use it in PsiClassImplUtil
[idea/community.git] / platform / vcs-impl / src / com / intellij / openapi / vcs / actions / CommonCheckinFilesAction.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.vcs.actions;
17
18 import com.intellij.lifecycle.PeriodicalTasksCloser;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.roots.ContentIterator;
21 import com.intellij.openapi.roots.FileIndexFacade;
22 import com.intellij.openapi.roots.impl.FileIndexImplUtil;
23 import com.intellij.openapi.util.Ref;
24 import com.intellij.openapi.vcs.*;
25 import com.intellij.openapi.vcs.changes.Change;
26 import com.intellij.openapi.vcs.changes.ChangeListManager;
27 import com.intellij.openapi.vcs.changes.LocalChangeList;
28 import com.intellij.openapi.vcs.checkin.CheckinEnvironment;
29 import com.intellij.openapi.vfs.VirtualFile;
30 import com.intellij.openapi.vfs.VirtualFileFilter;
31
32 public class CommonCheckinFilesAction extends AbstractCommonCheckinAction {
33   protected String getActionName(final VcsContext dataContext) {
34     final String checkinActionName = getCheckinActionName(dataContext);
35     return modifyCheckinActionName(dataContext, checkinActionName);
36   }
37
38   private String modifyCheckinActionName(final VcsContext dataContext, String checkinActionName) {
39     final FilePath[] roots = getRoots(dataContext);
40     if (roots == null || roots.length == 0) return checkinActionName;
41     final FilePath first = roots[0];
42     if (roots.length == 1) {
43       if (first.isDirectory()) {
44         return VcsBundle.message("action.name.checkin.directory", checkinActionName);
45       }
46       else {
47         return VcsBundle.message("action.name.checkin.file", checkinActionName);
48       }
49     }
50     else {
51       if (first.isDirectory()) {
52         return VcsBundle.message("action.name.checkin.directories", checkinActionName);
53       }
54       else {
55         return VcsBundle.message("action.name.checkin.files", checkinActionName);
56       }
57     }
58   }
59
60   @Override
61   protected String getMnemonicsFreeActionName(VcsContext context) {
62     return modifyCheckinActionName(context, VcsBundle.message("vcs.command.name.checkin.no.mnemonics"));
63   }
64
65   @Override
66   protected LocalChangeList getInitiallySelectedChangeList(final VcsContext context, final Project project) {
67     final ChangeListManager changeListManager = ChangeListManager.getInstance(project);
68
69     final FilePath[] roots = getRoots(context);
70     for(final FilePath root: roots) {
71       final VirtualFile file = root.getVirtualFile();
72       if (file == null) continue;
73       final Ref<Change> change = new Ref<Change>();
74       if (!file.isDirectory()) {
75         change.set(changeListManager.getChange(file));
76       }
77       else {
78         final FileIndexFacade index = PeriodicalTasksCloser.getInstance().safeGetService(project, FileIndexFacade.class);
79         final VirtualFileFilter filter = new VirtualFileFilter() {
80           public boolean accept(final VirtualFile file) {
81             return (! index.isExcludedFile(file));
82           }
83         };
84         FileIndexImplUtil.iterateRecursively(file, filter, new ContentIterator() {
85           public boolean processFile(final VirtualFile fileOrDir) {
86             final Change c = changeListManager.getChange(fileOrDir);
87             if (c != null) {
88               change.set(c);
89               return false;
90             }
91             return true;
92           }
93         });
94       }
95       if (!change.isNull()) {
96         return changeListManager.getChangeList(change.get());
97       }
98     }
99
100     return changeListManager.getDefaultChangeList();
101   }
102
103   private String getCheckinActionName(final VcsContext dataContext) {
104     final Project project = dataContext.getProject();
105     if (project == null) return VcsBundle.message("vcs.command.name.checkin");
106
107     final AbstractVcs vcs = getCommonVcsFor(getRoots(dataContext), project);
108     if (vcs == null) {
109       return VcsBundle.message("vcs.command.name.checkin");
110     }
111     else {
112       final CheckinEnvironment checkinEnvironment = vcs.getCheckinEnvironment();
113       if (checkinEnvironment == null) {
114         return VcsBundle.message("vcs.command.name.checkin");
115       }
116       return checkinEnvironment.getCheckinOperationName();
117     }
118   }
119
120   @Override
121   protected boolean approximatelyHasRoots(final VcsContext dataContext) {
122     final FilePath[] paths = dataContext.getSelectedFilePaths();
123     if (paths.length == 0) return false;
124     final FileStatusManager fsm = FileStatusManager.getInstance(dataContext.getProject());
125     boolean somethingToCommit = false;
126     for (final FilePath path : paths) {
127       if (path.getVirtualFile() == null) continue;
128       final FileStatus status = fsm.getStatus(path.getVirtualFile());
129       if (FileStatus.UNKNOWN == status || FileStatus.IGNORED == status) continue;
130       somethingToCommit = true;
131       break;
132     }
133     return somethingToCommit;
134   }
135
136   protected FilePath[] getRoots(final VcsContext context) {
137     return context.getSelectedFilePaths();
138   }
139
140   protected boolean filterRootsBeforeAction() {
141     return true;
142   }
143 }