|
import static com.intellij.openapi.actionSystem.LangDataKeys.* |
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////// |
|
metaClass.propertyMissing = {name -> |
|
switch (name) { |
|
case "application": return com.intellij.openapi.application.ApplicationManager.getApplication() |
|
case "project": return com.intellij.openapi.project.ProjectManager.getInstance().getOpenProjects()[0] |
|
case "INDEX": return com.intellij.psi.search.FilenameIndex |
|
case "GSS": return com.intellij.psi.search.GlobalSearchScope |
|
case "EXT": return com.intellij.openapi.extensions.Extensions |
|
default: |
|
def variants = [] |
|
for (t in [IDE.project, IDE.application]) { |
|
for (obj in t.picoContainer.componentKeyToAdapterCache.keySet()) { |
|
def key = obj instanceof String ? obj : obj instanceof Class ? obj.getName() : null |
|
if (key == null) continue |
|
def match = key =~ /[\.]([^\.]+?)(Service|Manager|Helper|Factory)?$/ |
|
def groups = match.size()? match[0][1..-1] : [key, null] |
|
def singular = groups[1..-1][0] == null |
|
def words = com.intellij.psi.codeStyle.NameUtil.nameToWords(groups[0]) |
|
def short0 = [words[0].toLowerCase(), words.length==1? "" : words[1..-1]].flatten().join() |
|
def shortName = singular? short0 : com.intellij.openapi.util.text.StringUtil.pluralize(short0) |
|
if (shortName.equals(name)) return t.picoContainer.getComponentInstance(obj); |
|
if (com.intellij.openapi.util.text.StringUtil.containsIgnoreCase(groups[0], name)) variants.add(shortName) |
|
} |
|
} |
|
throw new MissingPropertyException("Service or Component '$name' not found. Variants: $variants") |
|
} |
|
} |
|
|
|
String.class.metaClass.file = {-> virtualFiles.findFileByUrl(com.intellij.openapi.vfs.VfsUtil.pathToUrl(delegate))} |
|
String.class.metaClass.file2 = {-> def name = delegate; fileEditors.getOpenFiles().find {file -> file.getName().equals(name) }} |
|
String.class.metaClass.findPsi = {-> INDEX.getFilesByName(project, delegate, GSS.allScope(project)) } |
|
String.class.metaClass.findFile = {-> INDEX.getVirtualFilesByName(project, delegate, GSS.allScope(project)) } |
|
String.class.metaClass.firstPsi = {-> delegate.findPsi()[0] } |
|
String.class.metaClass.firstFile = {-> delegate.findFile()[0] } |
|
String.class.metaClass.ep = {-> EXT.getArea(null).getExtensionPoint(delegate) } |
|
com.intellij.openapi.actionSystem.DataKey.class.metaClass.from = {e -> delegate.getData(e.getDataContext()) } |
|
|
|
def virtualFileMetaClass = com.intellij.openapi.vfs.VirtualFile.class.metaClass |
|
virtualFileMetaClass.psi = {-> psiManager.findFile(delegate)} |
|
virtualFileMetaClass.document = {-> fileDocuments.getDocument(delegate)} |
|
virtualFileMetaClass.editor = {-> fileEditors.getSelectedEditor(delegate)?.getEditor()} |
|
|
|
def psiMetaClass = com.intellij.psi.PsiElement.class.metaClass |
|
psiMetaClass.document = {-> psiDocuments.getDocument(delegate)} |
|
psiMetaClass.file = {-> delegate.getContainingFile().getVirtualFile()} |
|
psiMetaClass.editor = {-> fileEditors.getSelectedEditor(delegate.file())?.getEditor()} |
|
|
|
write = { c -> application.runWriteAction(c)} |
|
read = { c -> application.runReadAction(c)} |
|
pool = { c -> application.executeOnPooledThread(c)} |
|
swing = { c -> com.intellij.util.ui.UIUtil.invokeLaterIfNeeded(c)} |
|
|
|
action = { name, shortcut = null, perform = null -> |
|
actions.unregisterAction(name) |
|
keymaps.getActiveKeymap().removeAllActionShortcuts(name) |
|
|
|
if (perform == null) return |
|
actions.registerAction(name, new com.intellij.openapi.actionSystem.AnAction(name, name, null) { |
|
@Override |
|
void actionPerformed(com.intellij.openapi.actionSystem.AnActionEvent e) { |
|
perform(e) |
|
} }) |
|
if (shortcut != null) { |
|
keymaps.getActiveKeymap().addShortcut(name, new com.intellij.openapi.actionSystem.KeyboardShortcut( |
|
javax.swing.KeyStroke.getKeyStroke(shortcut), null)) |
|
} |
|
} |
|
|
|
timer = {name, delay = 1, perform = null -> |
|
dispose(name) |
|
if (perform == null) return |
|
def h = new com.intellij.util.Alarm(project) |
|
def r = new Runnable() { public void run() {perform(); h.addRequest(this, delay); }} |
|
h.addRequest(r, delay) |
|
IDE.put(name, h) |
|
} |
|
dispose = { h -> |
|
t = h instanceof com.intellij.openapi.Disposable ? h : IDE.put(h, null) |
|
if (t != null) com.intellij.openapi.util.Disposer.dispose(t) |
|
} |
|
|
|
editor = { -> try {windows.getFocusedComponent(project).getEditor()} catch(e){}} |
I've discovered part of my problem. If I run this code while focused on the editor:
I get this output:
But for my use case, I need this to work when I'm not focused on the editor. So I'm actually focused on the embedded terminal. So as you might expect from the name of the function
dataContextFromFocusAsync
, I'm getting: