@@ -10,8 +10,8 @@ import com.intellij.openapi.project.Project
1010import com.intellij.openapi.wm.ToolWindow
1111import com.intellij.openapi.wm.ToolWindowFactory
1212import com.intellij.openapi.wm.ex.ToolWindowEx
13- import com.intellij.ui.content.Content
14- import com.intellij.ui.content.ContentManager
13+ import com.intellij.ui.components.panels.Wrapper
14+ import com.intellij.util. ui.components.BorderLayoutPanel
1515import software.aws.toolkits.core.utils.debug
1616import software.aws.toolkits.core.utils.getLogger
1717import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
@@ -22,6 +22,8 @@ import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
2222import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES
2323import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
2424import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
25+ import software.aws.toolkits.jetbrains.core.notifications.NotificationPanel
26+ import software.aws.toolkits.jetbrains.core.notifications.ProcessNotificationsBase
2527import software.aws.toolkits.jetbrains.core.webview.BrowserState
2628import software.aws.toolkits.jetbrains.services.amazonq.QWebviewPanel
2729import software.aws.toolkits.jetbrains.services.amazonq.RefreshQChatPanelButtonPressedListener
@@ -35,7 +37,21 @@ import java.awt.event.ComponentAdapter
3537import java.awt.event.ComponentEvent
3638
3739class AmazonQToolWindowFactory : ToolWindowFactory , DumbAware {
40+
3841 override fun createToolWindowContent (project : Project , toolWindow : ToolWindow ) {
42+ val mainPanel = BorderLayoutPanel ()
43+ val qPanel = Wrapper ()
44+ val notificationPanel = NotificationPanel ()
45+
46+ mainPanel.addToTop(notificationPanel)
47+ mainPanel.add(qPanel)
48+ val notifListener = ProcessNotificationsBase .getInstance(project)
49+ notifListener.addListenerForNotification { bannerContent ->
50+ runInEdt {
51+ notificationPanel.updateNotificationPanel(bannerContent)
52+ }
53+ }
54+
3955 if (toolWindow is ToolWindowEx ) {
4056 val actionManager = ActionManager .getInstance()
4157 toolWindow.setTitleActions(listOf (actionManager.getAction(" aws.q.toolwindow.titleBar" )))
@@ -46,7 +62,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
4662 ToolkitConnectionManagerListener .TOPIC ,
4763 object : ToolkitConnectionManagerListener {
4864 override fun activeConnectionChanged (newConnection : ToolkitConnection ? ) {
49- onConnectionChanged(project, newConnection, toolWindow )
65+ onConnectionChanged(project, newConnection, qPanel )
5066 }
5167 }
5268 )
@@ -56,8 +72,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
5672 object : RefreshQChatPanelButtonPressedListener {
5773 override fun onRefresh () {
5874 runInEdt {
59- contentManager.removeAllContents(true )
60- prepareChatContent(project, contentManager)
75+ prepareChatContent(project, qPanel)
6176 }
6277 }
6378 }
@@ -68,43 +83,37 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
6883 object : BearerTokenProviderListener {
6984 override fun onChange (providerId : String , newScopes : List <String >? ) {
7085 if (ToolkitConnectionManager .getInstance(project).connectionStateForFeature(QConnection .getInstance()) == BearerTokenAuthState .AUTHORIZED ) {
71- val content = contentManager.factory.createContent(AmazonQToolWindow .getInstance(project).component, null , false ).also {
72- it.isCloseable = true
73- it.isPinnable = true
74- }
86+ val qComponent = AmazonQToolWindow .getInstance(project).component
7587
7688 runInEdt {
77- contentManager.removeAllContents(true )
78- contentManager.addContent(content)
89+ qPanel.setContent(qComponent)
7990 }
8091 }
8192 }
8293 }
8394 )
8495
85- val content = prepareChatContent(project, contentManager )
96+ prepareChatContent(project, qPanel )
8697
98+ val content = contentManager.factory.createContent(mainPanel, null , false ).also {
99+ it.isCloseable = true
100+ it.isPinnable = true
101+ }
87102 toolWindow.activate(null )
88- contentManager.setSelectedContent (content)
103+ contentManager.addContent (content)
89104 }
90105
91106 private fun prepareChatContent (
92107 project : Project ,
93- contentManager : ContentManager ,
94- ): Content {
108+ qPanel : Wrapper ,
109+ ) {
95110 val component = if (isQConnected(project) && ! isQExpired(project)) {
96111 AmazonQToolWindow .getInstance(project).component
97112 } else {
98113 QWebviewPanel .getInstance(project).browser?.prepareBrowser(BrowserState (FeatureId .AmazonQ ))
99114 QWebviewPanel .getInstance(project).component
100115 }
101-
102- val content = contentManager.factory.createContent(component, null , false ).also {
103- it.isCloseable = true
104- it.isPinnable = true
105- }
106- contentManager.addContent(content)
107- return content
116+ qPanel.setContent(component)
108117 }
109118
110119 override fun init (toolWindow : ToolWindow ) {
@@ -125,8 +134,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
125134
126135 override fun shouldBeAvailable (project : Project ): Boolean = isQWebviewsAvailable()
127136
128- private fun onConnectionChanged (project : Project , newConnection : ToolkitConnection ? , toolWindow : ToolWindow ) {
129- val contentManager = toolWindow.contentManager
137+ private fun onConnectionChanged (project : Project , newConnection : ToolkitConnection ? , qPanel : Wrapper ) {
130138 val isNewConnectionForQ = newConnection?.let {
131139 (it as ? AwsBearerTokenConnection )?.let { conn ->
132140 val scopeShouldHave = Q_SCOPES
@@ -151,15 +159,8 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
151159 LOG .debug { " returning login window; no Q connection found" }
152160 QWebviewPanel .getInstance(project).component
153161 }
154-
155- val content = contentManager.factory.createContent(component, null , false ).also {
156- it.isCloseable = true
157- it.isPinnable = true
158- }
159-
160162 runInEdt {
161- contentManager.removeAllContents(true )
162- contentManager.addContent(content)
163+ qPanel.setContent(component)
163164 }
164165 }
165166
0 commit comments