IDEA-81134 'Untracked Files Preventing Checkout': add action to delete files
[idea/community.git] / platform / vcs-impl / src / com / intellij / openapi / vcs / changes / ui / SelectFilesDialog.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
17 package com.intellij.openapi.vcs.changes.ui;
18
19 import com.google.common.base.Predicate;
20 import com.google.common.collect.Collections2;
21 import com.intellij.ide.DeleteProvider;
22 import com.intellij.openapi.actionSystem.*;
23 import com.intellij.openapi.fileChooser.actions.VirtualFileDeleteProvider;
24 import com.intellij.openapi.project.Project;
25 import com.intellij.openapi.vcs.VcsShowConfirmationOption;
26 import com.intellij.openapi.vcs.changes.actions.DeleteUnversionedFilesAction;
27 import com.intellij.openapi.vfs.VirtualFile;
28 import com.intellij.util.ArrayUtil;
29 import org.jetbrains.annotations.NotNull;
30 import org.jetbrains.annotations.Nullable;
31
32 import javax.swing.tree.DefaultTreeModel;
33 import java.util.ArrayList;
34 import java.util.Collection;
35 import java.util.List;
36
37 /**
38  * @author yole
39  */
40 public class SelectFilesDialog extends AbstractSelectFilesDialog<VirtualFile> {
41
42   @NotNull private final VirtualFileList myFileList;
43   private final boolean myDeletableFiles;
44
45   public SelectFilesDialog(Project project, List<VirtualFile> originalFiles, String prompt, VcsShowConfirmationOption confirmationOption,
46                            boolean selectableFiles, boolean showDoNotAskOption, boolean deletableFiles) {
47     super(project, false, confirmationOption, prompt, showDoNotAskOption);
48     myDeletableFiles = deletableFiles;
49     myFileList = new VirtualFileList(project, originalFiles, selectableFiles, deletableFiles);
50     myFileList.setChangesToDisplay(originalFiles);
51     init();
52   }
53
54   public Collection<VirtualFile> getSelectedFiles() {
55     return myFileList.getIncludedChanges();
56   }
57
58   @NotNull
59   @Override
60   protected ChangesTreeList getFileList() {
61     return myFileList;
62   }
63
64   @NotNull
65   @Override
66   protected DefaultActionGroup createToolbarActions() {
67     DefaultActionGroup defaultGroup = super.createToolbarActions();
68     if (myDeletableFiles) {
69       AnAction deleteAction = new DeleteUnversionedFilesAction() {
70         @Override
71         public void actionPerformed(AnActionEvent e) {
72           super.actionPerformed(e);
73           myFileList.refresh();
74         }
75       };
76       defaultGroup.add(deleteAction);
77       deleteAction.registerCustomShortcutSet(CommonShortcuts.DELETE, this.getFileList());
78     }
79     return defaultGroup;
80   }
81
82   private static class VirtualFileList extends ChangesTreeList<VirtualFile> {
83     private final Project myProject;
84     @Nullable private final DeleteProvider myDeleteProvider;
85
86     public VirtualFileList(Project project, List<VirtualFile> originalFiles, boolean selectableFiles, boolean deletableFiles) {
87       super(project, originalFiles, selectableFiles, true, null, null);
88       myProject = project;
89       myDeleteProvider = (deletableFiles ?  new VirtualFileDeleteProvider() : null);
90     }
91
92     protected DefaultTreeModel buildTreeModel(final List<VirtualFile> changes, ChangeNodeDecorator changeNodeDecorator) {
93       return new TreeModelBuilder(myProject, false).buildModelFromFiles(changes);
94     }
95
96     protected List<VirtualFile> getSelectedObjects(final ChangesBrowserNode node) {
97       return node.getAllFilesUnder();
98     }
99
100     protected VirtualFile getLeadSelectedObject(final ChangesBrowserNode node) {
101       final Object o = node.getUserObject();
102       if (o instanceof VirtualFile) {
103         return (VirtualFile) o;
104       }
105       return null;
106     }
107
108     @Override
109     public void calcData(DataKey key, DataSink sink) {
110       super.calcData(key, sink);
111       if (key.equals(PlatformDataKeys.DELETE_ELEMENT_PROVIDER) && myDeleteProvider != null) {
112         sink.put(key, myDeleteProvider);
113       }
114       else if (key.equals(PlatformDataKeys.VIRTUAL_FILE_ARRAY)) {
115         sink.put(key, ArrayUtil.toObjectArray(getSelectedChanges(), VirtualFile.class));
116       }
117     }
118
119     public void refresh() {
120       setChangesToDisplay(new ArrayList<VirtualFile>(Collections2.filter(getIncludedChanges(), new Predicate<VirtualFile>() {
121         @Override
122         public boolean apply(@Nullable VirtualFile input) {
123           return input != null && input.isValid();
124         }
125       })));
126     }
127
128   }
129 }