Skip to content

Commit c927edc

Browse files
committed
Add tool action to files context menu in Project View
1 parent 8df1c5a commit c927edc

2 files changed

Lines changed: 48 additions & 34 deletions

File tree

resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
<action id="showCodeTimeMachine" class="com.reveal.codetimemachine.CodeTimeMachineAction"
3232
text="Open CodeTimeMachine" description="Open CodeTimeMachine">
3333
<add-to-group group-id="ToolsMenu" anchor="first"/>
34+
<add-to-group group-id="ProjectViewPopupMenu" relative-to-action="CutCopyPasteGroup" anchor="before"/>
3435
<keyboard-shortcut keymap="$default" first-keystroke="shift meta L"/>
3536
</action>
3637
</actions>

src/com/reveal/codetimemachine/CodeTimeMachineAction.java

Lines changed: 47 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.reveal.codetimemachine;
22

3-
import com.github.mauricioaniche.ck.CK;
4-
import com.github.mauricioaniche.ck.CKNumber;
5-
import com.github.mauricioaniche.ck.CKReport;
6-
import com.google.common.io.Files;
3+
74
import com.intellij.analysis.AnalysisScope;
85
import com.intellij.openapi.actionSystem.*;
96
import com.intellij.openapi.fileChooser.FileChooser;
@@ -21,20 +18,17 @@
2118
import com.intellij.openapi.vcs.history.VcsHistorySession;
2219
import com.intellij.openapi.vfs.LocalFileSystem;
2320
import com.intellij.openapi.vfs.VirtualFile;
24-
import com.intellij.openapi.wm.ToolWindow;
2521
import com.intellij.psi.*;
26-
import com.intellij.ui.content.Content;
27-
import com.reveal.metrics.MaxCKNumber;
2822

29-
import java.io.BufferedWriter;
3023
import java.io.File;
31-
import java.io.FileWriter;
3224
import java.io.IOException;
33-
import java.lang.reflect.Array;
3425
import java.util.*;
3526

27+
28+
3629
/**
3730
* Created by emadpres on 11/23/16.
31+
* Some notes about plugin.xml: https://intellij-support.jetbrains.com/hc/en-us/community/posts/206761495-How-to-add-items-to-a-tab-context-menu-
3832
*/
3933
public class CodeTimeMachineAction extends AnAction
4034
{
@@ -55,24 +49,22 @@ public void actionPerformed(AnActionEvent e)
5549
Project project = e.getProject();
5650

5751

58-
VirtualFile[] chosenVirtualFiles = selectVirtualFiles_auto(e);
59-
if(chosenVirtualFiles[0] == null)
60-
chosenVirtualFiles = selectVirtualFiles_manually(project);
52+
ArrayList<VirtualFile> chosenJavaVirtualFiles = selectJavaVirtualFiles_auto(e);
6153

62-
if(chosenVirtualFiles == null || chosenVirtualFiles.length==0)
63-
return;
6454

6555
VcsHistoryProvider myGitVcsHistoryProvider = getGitHistoryProvider(project);
56+
if(myGitVcsHistoryProvider == null)
57+
return; // It means project doesn't have "Git".
6658

67-
ArrayList<CommitWrapper>[] subjectAndTestClassCommitsList = new ArrayList[chosenVirtualFiles.length];
59+
ArrayList<CommitWrapper>[] javaFilesCommitsList = new ArrayList[chosenJavaVirtualFiles.size()];
6860
CommitWrapper aCommitWrapper = null;
69-
for(int i=0; i< chosenVirtualFiles.length; i++)
61+
for(int i=0; i< chosenJavaVirtualFiles.size(); i++)
7062
{
7163

72-
List<VcsFileRevision> _fileRevisionsLists = getRevisionListForSubjectAndTestClass(myGitVcsHistoryProvider, chosenVirtualFiles[i]);
64+
List<VcsFileRevision> _fileRevisionsLists = getRevisionListForSubjectAndTestClass(myGitVcsHistoryProvider, chosenJavaVirtualFiles.get(i));
7365

7466
int realCommitsSize = _fileRevisionsLists.size();
75-
subjectAndTestClassCommitsList[i] = new ArrayList<>(realCommitsSize + 1);
67+
javaFilesCommitsList[i] = new ArrayList<>(realCommitsSize + 1);
7668

7769

7870
int cIndex = 0;
@@ -81,7 +73,7 @@ public void actionPerformed(AnActionEvent e)
8173
String currentContent = "";
8274
try
8375
{
84-
byte[] currentBytes = chosenVirtualFiles[i].contentsToByteArray();
76+
byte[] currentBytes = chosenJavaVirtualFiles.get(i).contentsToByteArray();
8577
currentContent = new String(currentBytes);
8678
} catch (IOException e1)
8779
{
@@ -96,20 +88,20 @@ public void actionPerformed(AnActionEvent e)
9688
{
9789
final String UNCOMMITED_CHANGE_TEXT = "Uncommitted Changes";
9890
aCommitWrapper = new CommitWrapper(currentContent, UNCOMMITED_CHANGE_TEXT, new Date(), UNCOMMITED_CHANGE_TEXT, -1);
99-
subjectAndTestClassCommitsList[i].add(0, aCommitWrapper);
91+
javaFilesCommitsList[i].add(0, aCommitWrapper);
10092
}
10193

10294
///// Other Real
10395
for (int j = 0; j < realCommitsSize; j++)
10496
{
10597
aCommitWrapper = new CommitWrapper(_fileRevisionsLists.get(j), -1);
106-
subjectAndTestClassCommitsList[i].add(aCommitWrapper);
98+
javaFilesCommitsList[i].add(aCommitWrapper);
10799
}
108100

109101

110102
/// Sort by Date all commits
111103
// index 0 will contain most recent commit
112-
Collections.sort(subjectAndTestClassCommitsList[i], new Comparator<CommitWrapper>()
104+
Collections.sort(javaFilesCommitsList[i], new Comparator<CommitWrapper>()
113105
{
114106
@Override
115107
public int compare(CommitWrapper o1, CommitWrapper o2)
@@ -120,13 +112,13 @@ public int compare(CommitWrapper o1, CommitWrapper o2)
120112

121113

122114
// Assign cIndex
123-
for (int j = 0; j < subjectAndTestClassCommitsList[i].size(); j++)
115+
for (int j = 0; j < javaFilesCommitsList[i].size(); j++)
124116
{
125-
subjectAndTestClassCommitsList[i].get(j).cIndex = j;
117+
javaFilesCommitsList[i].get(j).cIndex = j;
126118
}
127119

128-
String contentName = chosenVirtualFiles[i].getName();
129-
TTMSingleFileView mainWindow = new TTMSingleFileView(project, chosenVirtualFiles[i], subjectAndTestClassCommitsList[i]);
120+
String contentName = chosenJavaVirtualFiles.get(i).getName();
121+
TTMSingleFileView mainWindow = new TTMSingleFileView(project, chosenJavaVirtualFiles.get(i), javaFilesCommitsList[i]);
130122
getCodeTimeMachine(project).addNewContent(mainWindow, contentName);
131123
}
132124
}
@@ -223,15 +215,36 @@ public VirtualFile[] selectVirtualFiles_manually(Project project)
223215
return chosenVirtualFiles;
224216
}
225217

226-
private VirtualFile[] selectVirtualFiles_auto(AnActionEvent e)
218+
private ArrayList<VirtualFile> selectJavaVirtualFiles_auto(AnActionEvent e)
227219
{
228-
VirtualFile[] chosenVirtualFiles = new VirtualFile[1];
220+
// If you run this action from Tools menu, and some file is open in Editor, the file will be retrieved.
221+
// If you run this action from ProjectView by right-clicking on some files, all selected files will be retrieved.
222+
// otherwise (i.e. right clicking on some empty space in Project View, or when there is no open file in Editor) it is null.
223+
VirtualFile[] files = e.getData(LangDataKeys.VIRTUAL_FILE_ARRAY);
229224

230-
if(e.getData(LangDataKeys.PSI_FILE) != null)
231-
chosenVirtualFiles[0] = e.getData(LangDataKeys.PSI_FILE).getVirtualFile();
232-
else
233-
chosenVirtualFiles[0] = null;
225+
ArrayList<VirtualFile> onlyJavaFiles = new ArrayList<>();
234226

235-
return chosenVirtualFiles;
227+
if(files==null)
228+
return onlyJavaFiles;
229+
230+
for(int i=0; i<files.length; i++)
231+
{
232+
if(files[i].getFileType().getDefaultExtension() == "java")
233+
onlyJavaFiles.add(files[i]);
234+
}
235+
236+
return onlyJavaFiles;
237+
}
238+
239+
@Override
240+
public void update(AnActionEvent e)
241+
{
242+
ArrayList<VirtualFile> files = selectJavaVirtualFiles_auto(e);
243+
244+
245+
if(files.size()==0)
246+
e.getPresentation().setEnabled(false);
247+
else
248+
e.getPresentation().setEnabled(true);
236249
}
237250
}

0 commit comments

Comments
 (0)