diff --git a/platform/lang-impl/src/com/intellij/ide/scratch/NewScratchFileAction.java b/platform/lang-impl/src/com/intellij/ide/scratch/NewScratchFileAction.java index a3bd3ba44473..05a0a7bf5996 100644 --- a/platform/lang-impl/src/com/intellij/ide/scratch/NewScratchFileAction.java +++ b/platform/lang-impl/src/com/intellij/ide/scratch/NewScratchFileAction.java @@ -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 tenMinuteScratch = Ref.create(false); ListPopup popup = buildLanguagePopup(project, language, new Consumer() { @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 step = - new BaseListPopupStep("Choose Language", languages) { + new BaseListPopupStep("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 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); + } + } \ No newline at end of file