mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Scratches: 10 minute scratch (with Shift)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user