Scratches: 10 minute scratch (with Shift)

This commit is contained in:
Gregory.Shrago
2015-01-26 22:06:46 +03:00
parent aa75a2c9e5
commit 807428f993
@@ -15,6 +15,7 @@
*/
package com.intellij.ide.scratch;
import com.intellij.concurrency.JobScheduler;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.lang.Language;
@@ -23,6 +24,8 @@ import com.intellij.lang.StdLanguages;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditorManager;
@@ -34,13 +37,16 @@ import com.intellij.openapi.ui.popup.ListPopup;
import com.intellij.openapi.ui.popup.ListPopupStep;
import com.intellij.openapi.ui.popup.PopupStep;
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.LanguageSubstitutors;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.ui.popup.list.ListPopupImpl;
import com.intellij.util.Consumer;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.EmptyIcon;
@@ -49,8 +55,10 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @author ignatov
@@ -88,16 +96,18 @@ public class NewScratchFileAction extends DumbAwareAction {
Language language = getLanguageFromCaret(project, editor, file);
String text = getSelectionText(editor);
if (language != null && text != null) {
openNewFile(project, language, text);
openNewFile(project, language, text, false);
return;
}
final Ref<Boolean> tenMinuteScratch = Ref.create(false);
ListPopup popup = buildLanguagePopup(project, language, new Consumer<Language>() {
@Override
public void consume(@NotNull Language language) {
openNewFile(project, language, "");
openNewFile(project, language, "", tenMinuteScratch.get());
}
});
setupShiftActions((ListPopupImpl)popup, tenMinuteScratch);
popup.showCenteredInCurrentWindow(project);
}
@@ -119,11 +129,14 @@ public class NewScratchFileAction extends DumbAwareAction {
return file.getLanguage();
}
public static void openNewFile(@NotNull Project project, @NotNull Language language, @NotNull final String text) {
public static VirtualFile openNewFile(@NotNull Project project, @NotNull Language language, @NotNull String text, boolean altMode) {
FeatureUsageTracker.getInstance().triggerFeatureUsed("scratch");
VirtualFile file = ScratchFileService.getInstance().createScratchFile(project, language, text);
if (file == null) return;
FileEditorManager.getInstance(project).openFile(file, true);
if (file != null) {
FileEditorManager.getInstance(project).openFile(file, true);
if (altMode) scheduleSelfDestruct(file);
}
return file;
}
@NotNull
@@ -153,7 +166,7 @@ public class NewScratchFileAction extends DumbAwareAction {
}
});
BaseListPopupStep<Language> step =
new BaseListPopupStep<Language>("Choose Language", languages) {
new BaseListPopupStep<Language>("New Scratch", languages) {
@NotNull
@Override
public String getTextFor(@NotNull Language value) {
@@ -199,4 +212,53 @@ public class NewScratchFileAction extends DumbAwareAction {
}
return popup;
}
private static void setupShiftActions(final ListPopupImpl popup, final Ref<Boolean> tenMinuteScratch) {
popup.registerAction("alternateMode", KeyStroke.getKeyStroke("shift pressed SHIFT"), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
tenMinuteScratch.set(true);
popup.setCaption("New 10 Minute Scratch");
}
});
popup.registerAction("regularMode", KeyStroke.getKeyStroke("released SHIFT"), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
tenMinuteScratch.set(false);
popup.setCaption("New Scratch");
}
});
popup.registerAction("invokeAlternate", KeyStroke.getKeyStroke("shift ENTER"), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
popup.handleSelect(true);
}
});
}
private static void scheduleSelfDestruct(final VirtualFile virtualFile) {
VfsUtilCore.virtualToIoFile(virtualFile).deleteOnExit();
JobScheduler.getScheduler().schedule(new Runnable() {
@Override
public void run() {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
AccessToken token = ApplicationManager.getApplication().acquireWriteActionLock(NewScratchFileAction.class);
try {
virtualFile.delete(NewScratchFileAction.class);
}
catch (Exception ignored) {
}
finally {
token.finish();
}
}
});
}
}, 10, TimeUnit.MINUTES);
}
}