@@ -10,8 +10,8 @@ import com.intellij.openapi.project.Project
10
10
import com.intellij.openapi.wm.ToolWindow
11
11
import com.intellij.openapi.wm.ToolWindowFactory
12
12
import 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
15
15
import software.aws.toolkits.core.utils.debug
16
16
import software.aws.toolkits.core.utils.getLogger
17
17
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
@@ -22,6 +22,8 @@ import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
22
22
import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES
23
23
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
24
24
import 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
25
27
import software.aws.toolkits.jetbrains.core.webview.BrowserState
26
28
import software.aws.toolkits.jetbrains.services.amazonq.QWebviewPanel
27
29
import software.aws.toolkits.jetbrains.services.amazonq.RefreshQChatPanelButtonPressedListener
@@ -35,7 +37,21 @@ import java.awt.event.ComponentAdapter
35
37
import java.awt.event.ComponentEvent
36
38
37
39
class AmazonQToolWindowFactory : ToolWindowFactory , DumbAware {
40
+
38
41
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
+
39
55
if (toolWindow is ToolWindowEx ) {
40
56
val actionManager = ActionManager .getInstance()
41
57
toolWindow.setTitleActions(listOf (actionManager.getAction(" aws.q.toolwindow.titleBar" )))
@@ -46,7 +62,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
46
62
ToolkitConnectionManagerListener .TOPIC ,
47
63
object : ToolkitConnectionManagerListener {
48
64
override fun activeConnectionChanged (newConnection : ToolkitConnection ? ) {
49
- onConnectionChanged(project, newConnection, toolWindow )
65
+ onConnectionChanged(project, newConnection, qPanel )
50
66
}
51
67
}
52
68
)
@@ -56,8 +72,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
56
72
object : RefreshQChatPanelButtonPressedListener {
57
73
override fun onRefresh () {
58
74
runInEdt {
59
- contentManager.removeAllContents(true )
60
- prepareChatContent(project, contentManager)
75
+ prepareChatContent(project, qPanel)
61
76
}
62
77
}
63
78
}
@@ -68,43 +83,37 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
68
83
object : BearerTokenProviderListener {
69
84
override fun onChange (providerId : String , newScopes : List <String >? ) {
70
85
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
75
87
76
88
runInEdt {
77
- contentManager.removeAllContents(true )
78
- contentManager.addContent(content)
89
+ qPanel.setContent(qComponent)
79
90
}
80
91
}
81
92
}
82
93
}
83
94
)
84
95
85
- val content = prepareChatContent(project, contentManager )
96
+ prepareChatContent(project, qPanel )
86
97
98
+ val content = contentManager.factory.createContent(mainPanel, null , false ).also {
99
+ it.isCloseable = true
100
+ it.isPinnable = true
101
+ }
87
102
toolWindow.activate(null )
88
- contentManager.setSelectedContent (content)
103
+ contentManager.addContent (content)
89
104
}
90
105
91
106
private fun prepareChatContent (
92
107
project : Project ,
93
- contentManager : ContentManager ,
94
- ): Content {
108
+ qPanel : Wrapper ,
109
+ ) {
95
110
val component = if (isQConnected(project) && ! isQExpired(project)) {
96
111
AmazonQToolWindow .getInstance(project).component
97
112
} else {
98
113
QWebviewPanel .getInstance(project).browser?.prepareBrowser(BrowserState (FeatureId .AmazonQ ))
99
114
QWebviewPanel .getInstance(project).component
100
115
}
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)
108
117
}
109
118
110
119
override fun init (toolWindow : ToolWindow ) {
@@ -125,8 +134,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
125
134
126
135
override fun shouldBeAvailable (project : Project ): Boolean = isQWebviewsAvailable()
127
136
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 ) {
130
138
val isNewConnectionForQ = newConnection?.let {
131
139
(it as ? AwsBearerTokenConnection )?.let { conn ->
132
140
val scopeShouldHave = Q_SCOPES
@@ -151,15 +159,8 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
151
159
LOG .debug { " returning login window; no Q connection found" }
152
160
QWebviewPanel .getInstance(project).component
153
161
}
154
-
155
- val content = contentManager.factory.createContent(component, null , false ).also {
156
- it.isCloseable = true
157
- it.isPinnable = true
158
- }
159
-
160
162
runInEdt {
161
- contentManager.removeAllContents(true )
162
- contentManager.addContent(content)
163
+ qPanel.setContent(component)
163
164
}
164
165
}
165
166
0 commit comments