Skip to content

Commit 682897f

Browse files
committed
feedback 1
1 parent f0aca38 commit 682897f

File tree

6 files changed

+186
-107
lines changed

6 files changed

+186
-107
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

Lines changed: 12 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,13 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.toolwindow
55

6-
import com.intellij.icons.AllIcons
76
import com.intellij.openapi.actionSystem.ActionManager
87
import com.intellij.openapi.application.runInEdt
98
import com.intellij.openapi.project.DumbAware
109
import com.intellij.openapi.project.Project
1110
import com.intellij.openapi.wm.ToolWindow
1211
import com.intellij.openapi.wm.ToolWindowFactory
1312
import com.intellij.openapi.wm.ex.ToolWindowEx
14-
import com.intellij.ui.EditorNotificationPanel
15-
import com.intellij.ui.components.panels.Wrapper
1613
import com.intellij.util.ui.components.BorderLayoutPanel
1714
import software.aws.toolkits.core.utils.debug
1815
import software.aws.toolkits.core.utils.getLogger
@@ -25,7 +22,6 @@ import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES
2522
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
2623
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
2724
import software.aws.toolkits.jetbrains.core.notifications.NotificationActionList
28-
import software.aws.toolkits.jetbrains.core.notifications.NotificationManager
2925
import software.aws.toolkits.jetbrains.core.notifications.ShowCriticalNotificationBannerListener
3026
import software.aws.toolkits.jetbrains.core.webview.BrowserState
3127
import software.aws.toolkits.jetbrains.services.amazonq.QWebviewPanel
@@ -34,18 +30,17 @@ import software.aws.toolkits.jetbrains.services.amazonq.gettingstarted.openMeetQ
3430
import software.aws.toolkits.jetbrains.utils.isQConnected
3531
import software.aws.toolkits.jetbrains.utils.isQExpired
3632
import software.aws.toolkits.jetbrains.utils.isQWebviewsAvailable
37-
import software.aws.toolkits.resources.AwsCoreBundle
3833
import software.aws.toolkits.resources.message
3934
import software.aws.toolkits.telemetry.FeatureId
4035
import java.awt.event.ComponentAdapter
4136
import java.awt.event.ComponentEvent
42-
import javax.swing.JComponent
4337

4438
class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
45-
private val notificationPanel = NotificationPanel()
46-
private val qPanel = QPanel()
39+
4740
override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
4841
val mainPanel = BorderLayoutPanel()
42+
val qPanel = OuterAmazonQPanel.getInstance(project)
43+
val notificationPanel = NotificationPanel.getInstance(project)
4944
mainPanel.addToTop(notificationPanel)
5045
mainPanel.add(qPanel)
5146

@@ -79,7 +74,9 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
7974
ShowCriticalNotificationBannerListener.TOPIC,
8075
object : ShowCriticalNotificationBannerListener {
8176
override fun onReceiveEmergencyNotification(title: String, message: String, notificationActionList: List<NotificationActionList>) {
82-
notificationPanel.updateNotificationPanel(title, message, notificationActionList)
77+
runInEdt {
78+
notificationPanel.updateNotificationPanel(title, message, notificationActionList)
79+
}
8380
}
8481
}
8582
)
@@ -118,7 +115,11 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
118115
QWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.Q))
119116
QWebviewPanel.getInstance(project).component
120117
}
121-
qPanel.updateQPanel(component)
118+
119+
runInEdt {
120+
val qPanel = OuterAmazonQPanel.getInstance(project)
121+
qPanel.updateQPanel(component)
122+
}
122123
}
123124

124125
override fun init(toolWindow: ToolWindow) {
@@ -165,6 +166,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
165166
QWebviewPanel.getInstance(project).component
166167
}
167168
runInEdt {
169+
val qPanel = OuterAmazonQPanel.getInstance(project)
168170
qPanel.updateQPanel(component)
169171
}
170172
}
@@ -175,43 +177,3 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
175177
private const val MINIMUM_TOOLWINDOW_WIDTH = 325
176178
}
177179
}
178-
179-
class NotificationPanel : BorderLayoutPanel() {
180-
private val wrapper = Wrapper()
181-
init {
182-
isOpaque = false
183-
addToCenter(wrapper)
184-
}
185-
186-
private fun removeNotificationPanel() = runInEdt {
187-
wrapper.removeAll()
188-
}
189-
190-
fun updateNotificationPanel(title: String, message: String, notificationActionList: List<NotificationActionList>) {
191-
val panel = EditorNotificationPanel()
192-
panel.text = title
193-
panel.icon(AllIcons.General.Error)
194-
val panelWithActions = NotificationManager.buildBannerPanel(panel, notificationActionList)
195-
panelWithActions.createActionLabel(AwsCoreBundle.message("general.dismiss")) {
196-
removeNotificationPanel()
197-
}
198-
199-
wrapper.setContent(panelWithActions)
200-
}
201-
}
202-
203-
class QPanel : BorderLayoutPanel() {
204-
private val wrapper = Wrapper()
205-
init {
206-
isOpaque = false
207-
addToCenter(wrapper)
208-
}
209-
210-
fun updateQPanel(content: JComponent) {
211-
try {
212-
wrapper.setContent(content)
213-
} catch (e: Exception) {
214-
getLogger<QPanel>().error("Error while creating window")
215-
}
216-
}
217-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.toolwindow
5+
6+
import com.intellij.icons.AllIcons
7+
import com.intellij.openapi.application.runInEdt
8+
import com.intellij.openapi.components.Service
9+
import com.intellij.openapi.components.service
10+
import com.intellij.openapi.project.Project
11+
import com.intellij.ui.EditorNotificationPanel
12+
import com.intellij.ui.components.panels.Wrapper
13+
import com.intellij.util.ui.components.BorderLayoutPanel
14+
import software.aws.toolkits.jetbrains.core.notifications.NotificationActionList
15+
import software.aws.toolkits.jetbrains.core.notifications.NotificationManager
16+
import software.aws.toolkits.resources.AwsCoreBundle
17+
18+
@Service(Service.Level.PROJECT)
19+
class NotificationPanel : BorderLayoutPanel() {
20+
private val wrapper = Wrapper()
21+
init {
22+
isOpaque = false
23+
addToCenter(wrapper)
24+
}
25+
26+
private fun removeNotificationPanel() = runInEdt {
27+
wrapper.removeAll()
28+
}
29+
30+
fun updateNotificationPanel(title: String, message: String, notificationActionList: List<NotificationActionList>) {
31+
val panel = EditorNotificationPanel()
32+
panel.text = title
33+
panel.icon(AllIcons.General.Error)
34+
val panelWithActions = NotificationManager.buildBannerPanel(panel, notificationActionList)
35+
panelWithActions.createActionLabel(AwsCoreBundle.message("general.dismiss")) {
36+
removeNotificationPanel()
37+
}
38+
39+
wrapper.setContent(panelWithActions)
40+
}
41+
42+
companion object {
43+
fun getInstance(project: Project): NotificationPanel = project.service()
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.toolwindow
5+
6+
import com.intellij.openapi.components.Service
7+
import com.intellij.openapi.components.service
8+
import com.intellij.openapi.project.Project
9+
import com.intellij.ui.components.panels.Wrapper
10+
import com.intellij.util.ui.components.BorderLayoutPanel
11+
import software.aws.toolkits.core.utils.getLogger
12+
import javax.swing.JComponent
13+
14+
@Service(Service.Level.PROJECT)
15+
class OuterAmazonQPanel : BorderLayoutPanel() {
16+
private val wrapper = Wrapper()
17+
init {
18+
isOpaque = false
19+
addToCenter(wrapper)
20+
}
21+
22+
fun updateQPanel(content: JComponent) {
23+
try {
24+
wrapper.setContent(content)
25+
} catch (e: Exception) {
26+
getLogger<OuterAmazonQPanel>().error("Error while creating window")
27+
}
28+
}
29+
30+
companion object {
31+
fun getInstance(project: Project): OuterAmazonQPanel = project.service()
32+
}
33+
}

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/core/explorer/AwsToolkitExplorerFactory.kt

Lines changed: 18 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import com.intellij.openapi.project.Project
1313
import com.intellij.openapi.wm.ToolWindow
1414
import com.intellij.openapi.wm.ToolWindowFactory
1515
import com.intellij.openapi.wm.ex.ToolWindowEx
16-
import com.intellij.ui.EditorNotificationPanel
17-
import com.intellij.ui.components.panels.Wrapper
1816
import com.intellij.util.messages.Topic
1917
import com.intellij.util.ui.components.BorderLayoutPanel
2018
import software.aws.toolkits.core.utils.debug
@@ -34,25 +32,26 @@ import software.aws.toolkits.jetbrains.core.credentials.sono.IDENTITY_CENTER_ROL
3432
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
3533
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
3634
import software.aws.toolkits.jetbrains.core.experiments.ExperimentsActionGroup
35+
import software.aws.toolkits.jetbrains.core.explorer.webview.NotificationPanel
36+
import software.aws.toolkits.jetbrains.core.explorer.webview.OuterToolkitPanel
3737
import software.aws.toolkits.jetbrains.core.explorer.webview.ToolkitWebviewPanel
3838
import software.aws.toolkits.jetbrains.core.explorer.webview.shouldPromptToolkitReauth
3939
import software.aws.toolkits.jetbrains.core.help.HelpIds
4040
import software.aws.toolkits.jetbrains.core.notifications.NotificationActionList
41-
import software.aws.toolkits.jetbrains.core.notifications.NotificationManager
4241
import software.aws.toolkits.jetbrains.core.notifications.ShowCriticalNotificationBannerListener
4342
import software.aws.toolkits.jetbrains.core.webview.BrowserState
4443
import software.aws.toolkits.jetbrains.utils.actions.OpenBrowserAction
4544
import software.aws.toolkits.jetbrains.utils.isTookitConnected
46-
import software.aws.toolkits.resources.AwsCoreBundle
4745
import software.aws.toolkits.resources.message
4846
import software.aws.toolkits.telemetry.FeatureId
4947
import java.util.EventListener
5048
import javax.swing.JComponent
5149

5250
class AwsToolkitExplorerFactory : ToolWindowFactory, DumbAware {
53-
private val notificationPanel = NotificationPanel()
54-
private val toolkitPanel = ToolkitPanel()
51+
5552
override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
53+
val notificationPanel = NotificationPanel.getInstance(project)
54+
val toolkitPanel = OuterToolkitPanel.getInstance(project)
5655
val mainPanel = BorderLayoutPanel()
5756
mainPanel.addToTop(notificationPanel)
5857
mainPanel.add(toolkitPanel)
@@ -133,7 +132,7 @@ class AwsToolkitExplorerFactory : ToolWindowFactory, DumbAware {
133132
if (ToolkitConnectionManager.getInstance(project)
134133
.connectionStateForFeature(CodeCatalystConnection.getInstance()) == BearerTokenAuthState.AUTHORIZED
135134
) {
136-
loadContent(AwsToolkitExplorerToolWindow.getInstance(project))
135+
loadContent(project, AwsToolkitExplorerToolWindow.getInstance(project))
137136
}
138137
}
139138
}
@@ -143,11 +142,11 @@ class AwsToolkitExplorerFactory : ToolWindowFactory, DumbAware {
143142
ShowToolkitListener.TOPIC,
144143
object : ShowToolkitListener {
145144
override fun showWebview(project: Project) {
146-
loadContent(ToolkitWebviewPanel.getInstance(project).component)
145+
loadContent(project, ToolkitWebviewPanel.getInstance(project).component)
147146
}
148147

149148
override fun showExplorerTree(project: Project) {
150-
loadContent(AwsToolkitExplorerToolWindow.getInstance(project))
149+
loadContent(project, AwsToolkitExplorerToolWindow.getInstance(project))
151150
}
152151
}
153152
)
@@ -187,12 +186,12 @@ class AwsToolkitExplorerFactory : ToolWindowFactory, DumbAware {
187186
}
188187

189188
if (isNewConnToolkitConnection) {
190-
loadContent(AwsToolkitExplorerToolWindow.getInstance(project))
189+
loadContent(project, AwsToolkitExplorerToolWindow.getInstance(project))
191190
} else if (!isTookitConnected(project) || shouldPromptToolkitReauth(project)) {
192191
ToolkitWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.AwsExplorer))
193-
loadContent(ToolkitWebviewPanel.getInstance(project).component)
192+
loadContent(project, ToolkitWebviewPanel.getInstance(project).component)
194193
} else {
195-
loadContent(AwsToolkitExplorerToolWindow.getInstance(project))
194+
loadContent(project, AwsToolkitExplorerToolWindow.getInstance(project))
196195
}
197196
}
198197

@@ -207,14 +206,17 @@ class AwsToolkitExplorerFactory : ToolWindowFactory, DumbAware {
207206

208207
if (!isToolkitConnected || shouldPromptToolkitReauth(project)) {
209208
ToolkitWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.AwsExplorer))
210-
loadContent(ToolkitWebviewPanel.getInstance(project).component)
209+
loadContent(project, ToolkitWebviewPanel.getInstance(project).component)
211210
} else {
212-
loadContent(AwsToolkitExplorerToolWindow.getInstance(project))
211+
loadContent(project, AwsToolkitExplorerToolWindow.getInstance(project))
213212
}
214213
}
215214

216-
private fun loadContent(component: JComponent) {
217-
toolkitPanel.updateToolkitPanel(component)
215+
private fun loadContent(project: Project, component: JComponent) {
216+
runInEdt {
217+
val toolkitPanel = OuterToolkitPanel.getInstance(project)
218+
toolkitPanel.updateToolkitPanel(component)
219+
}
218220
}
219221

220222
companion object {
@@ -223,47 +225,6 @@ class AwsToolkitExplorerFactory : ToolWindowFactory, DumbAware {
223225
}
224226
}
225227

226-
class NotificationPanel : BorderLayoutPanel() {
227-
private val wrapper = Wrapper()
228-
init {
229-
isOpaque = false
230-
addToCenter(wrapper)
231-
}
232-
233-
private fun removeNotificationPanel() = runInEdt {
234-
wrapper.removeAll()
235-
}
236-
237-
fun updateNotificationPanel(title: String, message: String, notificationActionList: List<NotificationActionList>) {
238-
val panel = EditorNotificationPanel()
239-
panel.text = title
240-
panel.icon(AllIcons.General.Error)
241-
val panelWithActions = NotificationManager.buildBannerPanel(panel, notificationActionList)
242-
243-
panelWithActions.createActionLabel(AwsCoreBundle.message("general.dismiss")) {
244-
removeNotificationPanel()
245-
}
246-
247-
wrapper.setContent(panelWithActions)
248-
}
249-
}
250-
251-
class ToolkitPanel : BorderLayoutPanel() {
252-
private val wrapper = Wrapper()
253-
init {
254-
isOpaque = false
255-
addToCenter(wrapper)
256-
}
257-
258-
fun updateToolkitPanel(content: JComponent) {
259-
try {
260-
wrapper.setContent(content)
261-
} catch (e: Exception) {
262-
getLogger<ToolkitPanel>().error("Error while creating window")
263-
}
264-
}
265-
}
266-
267228
interface ShowToolkitListener : EventListener {
268229
fun showExplorerTree(project: Project)
269230
fun showWebview(project: Project)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.core.explorer.webview
5+
6+
import com.intellij.icons.AllIcons
7+
import com.intellij.openapi.application.runInEdt
8+
import com.intellij.openapi.components.Service
9+
import com.intellij.openapi.components.service
10+
import com.intellij.ui.EditorNotificationPanel
11+
import com.intellij.ui.components.panels.Wrapper
12+
import com.intellij.util.ui.components.BorderLayoutPanel
13+
import software.aws.toolkits.jetbrains.core.notifications.NotificationActionList
14+
import software.aws.toolkits.jetbrains.core.notifications.NotificationManager
15+
import software.aws.toolkits.resources.AwsCoreBundle
16+
17+
@Service(Service.Level.PROJECT)
18+
class NotificationPanel : BorderLayoutPanel() {
19+
private val wrapper = Wrapper()
20+
init {
21+
isOpaque = false
22+
addToCenter(wrapper)
23+
}
24+
25+
private fun removeNotificationPanel() = runInEdt {
26+
wrapper.removeAll()
27+
}
28+
29+
fun updateNotificationPanel(title: String, message: String, notificationActionList: List<NotificationActionList>) {
30+
val panel = EditorNotificationPanel()
31+
panel.text = title
32+
panel.icon(AllIcons.General.Error)
33+
val panelWithActions = NotificationManager.buildBannerPanel(panel, notificationActionList)
34+
35+
panelWithActions.createActionLabel(AwsCoreBundle.message("general.dismiss")) {
36+
removeNotificationPanel()
37+
}
38+
39+
wrapper.setContent(panelWithActions)
40+
}
41+
42+
companion object {
43+
fun getInstance(project: com.intellij.openapi.project.Project): NotificationPanel = project.service()
44+
}
45+
}

0 commit comments

Comments
 (0)