New UI toolWindow Anchor "top" no more compatible

Answered

How to set toolWindow's anchor "Left Top" in plugin.xml only if "new ui" is enabled else give "top"

0
3 comments

Please use `ToolWindowFactory.getAnchor` to return a custom anchor and `ExperimentalUI.isNewUI()` to check is New UI is enabled.

Please note — API is internal. Such customization is not recommended.

0

Hi thanks for your response.

The question is, how can I cover both cases? new ui and old ui compatibility for my toolwindow ?

 

If I use "new ui" then anchor="top" crashes

com.intellij.diagnostic.PluginException: Cannot init toolwindow window.MyToolWindow[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=] [Plugin: com.mycompany.myplugin]
    at com.intellij.toolWindow.ToolWindowSetInitializer.createAndLayoutToolWindows$registerToolWindows(ToolWindowSetInitializer.kt:141)
    at com.intellij.toolWindow.ToolWindowSetInitializer.createAndLayoutToolWindows(ToolWindowSetInitializer.kt:160)
    at com.intellij.toolWindow.ToolWindowSetInitializer.access$createAndLayoutToolWindows(ToolWindowSetInitializer.kt:46)
    at com.intellij.toolWindow.ToolWindowSetInitializer$initUi$3.invokeSuspend(ToolWindowSetInitializer.kt:106)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
    at com.intellij.openapi.application.TransactionGuardImpl$1.run(TransactionGuardImpl.java:194)
    at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:813)
    at com.intellij.openapi.application.impl.ApplicationImpl$3.run(ApplicationImpl.java:429)
    at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:74)
    at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:114)
    at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:36)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:779)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:730)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:724)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:749)
    at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:909)
    at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:756)
    at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$5(IdeEventQueue.java:437)
    at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:774)
    at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:436)
    at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:105)
    at com.intellij.ide.IdeEventQueue.performActivity(IdeEventQueue.java:615)
    at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:434)
    at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:813)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:480)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

 

 


Caused by: java.lang.IllegalArgumentException: Anchor=top
    at com.intellij.toolWindow.ToolWindowPaneNewButtonManager.findToolbar(ToolWindowPaneNewButtonManager.kt:127)
    at com.intellij.toolWindow.ToolWindowPaneNewButtonManager.createStripeButton(ToolWindowPaneNewButtonManager.kt:161)
    at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.registerToolWindow$intellij_platform_ide_impl(ToolWindowManagerImpl.kt:1098)
    at com.intellij.toolWindow.ToolWindowSetInitializer.createAndLayoutToolWindows$registerToolWindows(ToolWindowSetInitializer.kt:134)
    ... 34 more

 

 

If I dont use "new ui" and I put anchor="Top Left" to plugin.xml attribute then it will crash

java.lang.IllegalArgumentException: Unknown anchor constant: Top Left
    at com.intellij.openapi.wm.ToolWindowAnchor.fromText(ToolWindowAnchor.java:81)
    at com.intellij.toolWindow.ToolWindowSetInitializerKt.getToolWindowAnchor(ToolWindowSetInitializer.kt:244)
    at com.intellij.toolWindow.ToolWindowSetInitializerKt.beanToTask(ToolWindowSetInitializer.kt:259)
    at com.intellij.toolWindow.ToolWindowSetInitializerKt.beanToTask(ToolWindowSetInitializer.kt:249)
    at com.intellij.toolWindow.ToolWindowSetInitializerKt.access$beanToTask(ToolWindowSetInitializer.kt:1)
    at com.intellij.toolWindow.ToolWindowSetInitializerKt$computeToolWindowBeans$1.accept(ToolWindowSetInitializer.kt:279)
    at com.intellij.toolWindow.ToolWindowSetInitializerKt$computeToolWindowBeans$1.accept(ToolWindowSetInitializer.kt)
    at com.intellij.openapi.extensions.impl.ExtensionPointImpl.processWithPluginDescriptor(ExtensionPointImpl.java:301)
    at com.intellij.toolWindow.ToolWindowSetInitializerKt.computeToolWindowBeans(ToolWindowSetInitializer.kt:275)
    at com.intellij.toolWindow.ToolWindowSetInitializer$1.get(ToolWindowSetInitializer.kt:100)
    at com.intellij.toolWindow.ToolWindowSetInitializer$1.get(ToolWindowSetInitializer.kt:82)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
    at java.base/java.util.concurrent.ForkJoinPool.externalHelpQuiesce(ForkJoinPool.java:2257)
    at java.base/java.util.concurrent.ForkJoinPool.helpQuiescePool(ForkJoinPool.java:2294)
    at java.base/java.util.concurrent.ForkJoinPool.awaitQuiescence(ForkJoinPool.java:3529)
    at com.intellij.idea.StartupUtil.start(StartupUtil.java:272)
    at com.intellij.idea.Main.bootstrap(Main.java:119)
    at com.intellij.idea.Main.main(Main.java:81)

 

 

 

0

Of course I don't want to touch the internal api. Shouldn't there be a proper way to do it?

0

Please sign in to leave a comment.