Can't activate tool window right now

following is my code:

ToolWindow dbg = ToolWindowManager.getInstance(e.getProject()).getToolWindow("Debug");
dbg.activate(null, true, true);

int n = 0;
while (true) {

    if (dbg.isActive()) {
        break;
    }
    try {
        Thread.sleep((long) 1000);
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    }
    if (n > 5) {
        throw new RuntimeException("Timeout");
    }
    n++;
}

ContentManager cm = (ContentManager) PlatformDataKeys.NONEMPTY_CONTENT_MANAGER.getData(e.getDataContext());
Content sc = cm.getSelectedContent();
if (sc.getTabName().equals("Console")) {
    new NextTabAction().actionPerformed(e);
} else {
    new PreviousTabAction().actionPerformed(e);
}


see my screencast, why i need wait 5s to Debug actived, i hope i can activate it right now and do below steps

this code is aimed to fix my old question  https://devnet.jetbrains.com/thread/458848?tstart=0

i hope to know following:
- how to get "cm" directly whenever Debug is active or not
- or how to activate tool window right now and do "next tab"

9 comments
Comment actions Permalink

The first parameter of the activate() method is a Runnable. If you need to perform some activity after the toolwindow is activated, you need to perform it from that runnable.

Your current code simply blocks the event dispatch thread and does not allow the Swing events involved in the toolwindow activation to be processed.

0
Comment actions Permalink

I change my code and it raise new error "ellij.ide.impl.DataManagerImpl - cannot share data context between Swing events; initial event count = 7115; current event count = 7165

java.lang.Throwable"

following is my code:

 
public void actionPerformed(AnActionEvent e) {
    ToolWindow dbg = ToolWindowManager.getInstance(e.getProject()).getToolWindow("Debug");
    dbg.show(null);
    dbg.activate(new Runnable() {
        public void selectContent(String name) {
            for (Content c : cm.getContents()) {
                if (c.getTabName().equals(name)) {
                    cm.setSelectedContent(c);
                    return;
                }
            }
        }

        public String curTabName() {
            return cm.getSelectedContent().getTabName();
        }

        ContentManager cm;

        @Override
        public void
run() {
            this.cm = PlatformDataKeys.NONEMPTY_CONTENT_MANAGER.getData(e.getDataContext());
            if (cm != null) {
                if (curTabName() == "Console") {
                    selectContent("Watches");
                } else {
                    selectContent("Console");
                }
            }
        }
    });
}


following is my err output:

[ 107331]  ERROR - ellij.ide.impl.DataManagerImpl - cannot share data context between Swing events; initial event count = 7115; current event count = 7165
java.lang.Throwable
 at com.intellij.openapi.diagnostic.Logger.error(Logger.java:115)
 at com.intellij.ide.impl.DataManagerImpl$MyDataContext.getData(DataManagerImpl.java:329)
 at com.intellij.openapi.actionSystem.DataKey.getData(DataKey.java:75)
 at ro.idea.TryAct2$1.run(TryAct2.java:50)
 at com.intellij.openapi.wm.impl.ToolWindowImpl$3$1.run(ToolWindowImpl.java:150)
 at com.intellij.openapi.wm.impl.commands.InvokeLaterCmd.run(InvokeLaterCmd.java:33)
 at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:318)
 at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
 at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
 at java.awt.EventQueue.access$400(EventQueue.java:97)
 at java.awt.EventQueue$3.run(EventQueue.java:697)
 at java.awt.EventQueue$3.run(EventQueue.java:691)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
 at com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:748)
 at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:577)
 at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:384)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
[ 107332]  ERROR - ellij.ide.impl.DataManagerImpl - IntelliJ IDEA 14.0.1  Build #IU-139.225.3
[ 107333]  ERROR - ellij.ide.impl.DataManagerImpl - JDK: 1.8.0_05
[ 107333]  ERROR - ellij.ide.impl.DataManagerImpl - VM: Java HotSpot(TM) 64-Bit Server VM
[ 107333]  ERROR - ellij.ide.impl.DataManagerImpl - Vendor: Oracle Corporation
[ 107334]  ERROR - ellij.ide.impl.DataManagerImpl - OS: Linux
[ 107334]  ERROR - ellij.ide.impl.DataManagerImpl - Last Action: TryAct2
[ 112349]   WARN - ateSettings.impl.UpdateChecker - Connection failed. Please check your network connection and try again.
[ 234515]   WARN - ewvfs.persistent.RefreshWorker - [+] fs=LocalFileSystem dir=file:///home/roroco name=ruby -e Time.now\n}

0
Comment actions Permalink

Use DataManager.getDataContextFromFocus() instead of e.getDataContext() in your runnable.

0
Comment actions Permalink

see my screencast, it's not meaningful, when i first invoke this action this "cm"  in "this.cm = PlatformDataKeys.NONEMPTY_CONTENT_MANAGER.getData(dc);" is always null, following is my code:

 
public void actionPerformed(AnActionEvent e) {
    ToolWindow dbg = ToolWindowManager.getInstance(e.getProject()).getToolWindow("Debug");
    dbg.show(null);
    DataContext dc = e.getDataContext();
    dbg.activate(new Runnable() {
        public void selectContent(String name) {
            for (Content c : cm.getContents()) {
                if (c.getTabName().equals(name)) {
                    cm.setSelectedContent(c);
                    return;
                }
            }
        }

        public String curTabName() {
            return cm.getSelectedContent().getTabName();
        }

        ContentManager cm;

        @Override
        public void
run() {
            this.cm = PlatformDataKeys.NONEMPTY_CONTENT_MANAGER.getData(dc);
            if (cm != null) {
                if (curTabName().equals("Console")) {
                    selectContent("Watches");
                } else {
                    selectContent("Console");
                }
            }
        }
    });
}


Attachment(s):
cannot-toggle-tab-at-first-invocation.ogv.zip
0
Comment actions Permalink

I've added a new API in 14.1 that will allow to solve this cleanly (RunContentDescriptor.getRunnerLayoutUi()).

0
Comment actions Permalink

Is there youtrack that i can follow?

0
Comment actions Permalink

For what? I have already added the API.


0
Comment actions Permalink

How should i use with "RunnerDescriptor.getRunnerLayoutui"

0
Comment actions Permalink

I try getRunnerLayoutUi(), but It return null, how to get not null value, here is my code and i use groovy 2.4.3, selectedDescriptor.getRunnerUi() is null
.

ArrayList<RunContentDescriptor> getDescriptors(String toolWinName) {
    ExecutionManager.getInstance(pj).contentManager.allDescriptors
}

 
public RunContentDescriptor getSelectedDescriptor(String twn) {
    Content ctn = dbg.contentManager.selectedContent
    
RunContentDescriptor selectedDescriptor

    for (d in getDescriptors(twn)) {
        if (d.executionId == ctn.executionId) {
            selectedDescriptor = d
            break
        
}
    }
    selectedDescriptor
}

 
void actionPerformed(AnActionEvent e) {
    super.actionPerformed(e);
    RunContentDescriptor selectedDescriptor = getSelectedDescriptor("Debug")
    forceRst(selectedDescriptor)
}
0

Please sign in to leave a comment.