@@ -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.components.panels.Wrapper
14- import com.intellij.util. ui.components.BorderLayoutPanel
13+ import com.intellij.ui.content.Content
14+ import com.intellij.ui.content.ContentManager
1515import software.aws.toolkits.core.utils.debug
1616import software.aws.toolkits.core.utils.getLogger
1717import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
@@ -22,8 +22,6 @@ 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
2725import software.aws.toolkits.jetbrains.core.webview.BrowserState
2826import software.aws.toolkits.jetbrains.services.amazonq.QWebviewPanel
2927import software.aws.toolkits.jetbrains.services.amazonq.RefreshQChatPanelButtonPressedListener
@@ -37,21 +35,7 @@ import java.awt.event.ComponentAdapter
3735import java.awt.event.ComponentEvent
3836
3937class AmazonQToolWindowFactory : ToolWindowFactory , DumbAware {
40-
4138 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-
5539 if (toolWindow is ToolWindowEx ) {
5640 val actionManager = ActionManager .getInstance()
5741 toolWindow.setTitleActions(listOf (actionManager.getAction(" aws.q.toolwindow.titleBar" )))
@@ -62,7 +46,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
6246 ToolkitConnectionManagerListener .TOPIC ,
6347 object : ToolkitConnectionManagerListener {
6448 override fun activeConnectionChanged (newConnection : ToolkitConnection ? ) {
65- onConnectionChanged(project, newConnection, qPanel )
49+ onConnectionChanged(project, newConnection, toolWindow )
6650 }
6751 }
6852 )
@@ -72,7 +56,8 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
7256 object : RefreshQChatPanelButtonPressedListener {
7357 override fun onRefresh () {
7458 runInEdt {
75- prepareChatContent(project, qPanel)
59+ contentManager.removeAllContents(true )
60+ prepareChatContent(project, contentManager)
7661 }
7762 }
7863 }
@@ -83,37 +68,43 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
8368 object : BearerTokenProviderListener {
8469 override fun onChange (providerId : String , newScopes : List <String >? ) {
8570 if (ToolkitConnectionManager .getInstance(project).connectionStateForFeature(QConnection .getInstance()) == BearerTokenAuthState .AUTHORIZED ) {
86- val qComponent = AmazonQToolWindow .getInstance(project).component
71+ val content = contentManager.factory.createContent(AmazonQToolWindow .getInstance(project).component, null , false ).also {
72+ it.isCloseable = true
73+ it.isPinnable = true
74+ }
8775
8876 runInEdt {
89- qPanel.setContent(qComponent)
77+ contentManager.removeAllContents(true )
78+ contentManager.addContent(content)
9079 }
9180 }
9281 }
9382 }
9483 )
9584
96- prepareChatContent(project, qPanel )
85+ val content = prepareChatContent(project, contentManager )
9786
98- val content = contentManager.factory.createContent(mainPanel, null , false ).also {
99- it.isCloseable = true
100- it.isPinnable = true
101- }
10287 toolWindow.activate(null )
103- contentManager.addContent (content)
88+ contentManager.setSelectedContent (content)
10489 }
10590
10691 private fun prepareChatContent (
10792 project : Project ,
108- qPanel : Wrapper ,
109- ) {
93+ contentManager : ContentManager ,
94+ ): Content {
11095 val component = if (isQConnected(project) && ! isQExpired(project)) {
11196 AmazonQToolWindow .getInstance(project).component
11297 } else {
11398 QWebviewPanel .getInstance(project).browser?.prepareBrowser(BrowserState (FeatureId .AmazonQ ))
11499 QWebviewPanel .getInstance(project).component
115100 }
116- qPanel.setContent(component)
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
117108 }
118109
119110 override fun init (toolWindow : ToolWindow ) {
@@ -134,7 +125,8 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
134125
135126 override fun shouldBeAvailable (project : Project ): Boolean = isQWebviewsAvailable()
136127
137- private fun onConnectionChanged (project : Project , newConnection : ToolkitConnection ? , qPanel : Wrapper ) {
128+ private fun onConnectionChanged (project : Project , newConnection : ToolkitConnection ? , toolWindow : ToolWindow ) {
129+ val contentManager = toolWindow.contentManager
138130 val isNewConnectionForQ = newConnection?.let {
139131 (it as ? AwsBearerTokenConnection )?.let { conn ->
140132 val scopeShouldHave = Q_SCOPES
@@ -159,8 +151,15 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
159151 LOG .debug { " returning login window; no Q connection found" }
160152 QWebviewPanel .getInstance(project).component
161153 }
154+
155+ val content = contentManager.factory.createContent(component, null , false ).also {
156+ it.isCloseable = true
157+ it.isPinnable = true
158+ }
159+
162160 runInEdt {
163- qPanel.setContent(component)
161+ contentManager.removeAllContents(true )
162+ contentManager.addContent(content)
164163 }
165164 }
166165
0 commit comments