Skip to content

Commit 7b2b265

Browse files
andrewyuqmanodnyab
andauthored
Moving CW actions to status bar (#4186)
* Moving CW actions to status bar * Make the migration action button clickable to display the status bar; some other fixes * fix test * Add Transform action into the panel * Reapply changes suggested in this PR * Remove QServiceNode files since it got migrated, and the not supported usecases * Add change note, other minor fixes * Update plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties Co-authored-by: manodnyab <[email protected]> --------- Co-authored-by: manodnyab <[email protected]>
1 parent 9e3d934 commit 7b2b265

30 files changed

+259
-489
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Amazon Q + CodeWhisperer: Most Amazon Q + CodeWhisperer actions are now migrated from the AWS Toolkit panel to the Amazon Q status bar menu."
4+
}

plugins/toolkit/jetbrains-core/resources/META-INF/plugin.xml

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,6 @@
230230
<extensionPoint name="tool" interface="software.aws.toolkits.jetbrains.core.tools.ToolType" dynamic="true"/>
231231
<extensionPoint name="devTools.serviceNode" interface="software.aws.toolkits.jetbrains.core.explorer.devToolsTab.nodes.DevToolsServiceNode" dynamic="true"/>
232232
<extensionPoint name="devTools.treeStructure" interface="software.aws.toolkits.jetbrains.core.explorer.devToolsTab.DevToolsTreeStructureProvider" dynamic="true"/>
233-
<extensionPoint name="cwq.serviceNode" interface="software.aws.toolkits.jetbrains.core.explorer.cwqTab.nodes.CwQServiceNode" dynamic="true"/>
234233
<extensionPoint name="cwq.treeStructure" interface="software.aws.toolkits.jetbrains.core.explorer.cwqTab.CwQTreeStructureProvider" dynamic="true"/>
235234
<extensionPoint name="codewhisperer.programmingLanguage" interface="software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage" dynamic="true"/>
236235
<extensionPoint name="codewhisperer.classResolver" interface="software.aws.toolkits.jetbrains.services.codewhisperer.language.classresolver.CodeWhispererClassResolver" dynamic="true"/>
@@ -363,7 +362,6 @@
363362
<projectService serviceInterface="software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor"
364363
serviceImplementation="software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptorImpl"
365364
testServiceImplementation="software.aws.toolkits.jetbrains.services.codewhisperer.credentials.MockCodeWhispererClientAdaptor"/>
366-
<projectService serviceImplementation="software.aws.toolkits.jetbrains.services.codewhisperer.status.CodeWhispererStatusBarManager"/>
367365
<projectService serviceInterface="software.aws.toolkits.jetbrains.services.codewhisperer.util.FileContextProvider"
368366
serviceImplementation="software.aws.toolkits.jetbrains.services.codewhisperer.util.DefaultCodeWhispererFileContextProvider"/>
369367
<projectService serviceImplementation="software.aws.toolkits.jetbrains.services.codewhisperer.learn.LearnCodeWhispererManager"/>
@@ -521,7 +519,6 @@
521519

522520
<!-- Explorer nodes -->
523521
<explorer.treeStructure implementation="software.aws.toolkits.jetbrains.services.dynamic.explorer.DynamicResourceTreeStructureProvider"/>
524-
<devTools.treeStructure implementation="software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerTreeStructureProvider"/>
525522
<explorer.serviceNode implementation="software.aws.toolkits.jetbrains.core.explorer.nodes.AppRunnerExplorerRootNode"/>
526523
<explorer.serviceNode implementation="software.aws.toolkits.jetbrains.core.explorer.nodes.CloudFormationExplorerRootNode"/>
527524
<explorer.serviceNode implementation="software.aws.toolkits.jetbrains.core.explorer.nodes.CloudWatchRootNode"/>
@@ -537,9 +534,6 @@
537534
<!-- DevTools nodes-->
538535
<devTools.serviceNode implementation="software.aws.toolkits.jetbrains.core.explorer.devToolsTab.nodes.CawsServiceNode"/>
539536

540-
<!-- CodeWhisperer +Q nodes-->
541-
<cwq.serviceNode implementation="software.aws.toolkits.jetbrains.core.explorer.cwqTab.nodes.QServiceNode"/>
542-
<cwq.serviceNode implementation="software.aws.toolkits.jetbrains.core.explorer.cwqTab.nodes.CodeWhispererExplorerRootNode"/>
543537
<!-- Experiments -->
544538
<experiment implementation="software.aws.toolkits.jetbrains.services.ecs.EcsExecExperiment"/>
545539
<experiment implementation="software.aws.toolkits.jetbrains.services.dynamic.JsonResourceModificationExperiment"/>
@@ -870,17 +864,17 @@
870864
class="software.aws.toolkits.jetbrains.services.codewhisperer.codescan.actions.CodeWhispererStopCodeScanAction"/>
871865
</group>
872866

873-
<group id="q.not.supported">
874-
<action class="software.aws.toolkits.jetbrains.core.explorer.cwqTab.nodes.QNotSupportedNode"/>
875-
</group>
876867
<group id="aws.toolkit.q.idc.signed.in">
877868
<action
878869
id="q.openchat"
879-
class="software.aws.toolkits.jetbrains.services.amazonq.CwQChatAction"/>
870+
class="software.aws.toolkits.jetbrains.services.amazonq.QOpenPanelAction"/>
871+
<action
872+
id="q.migrate"
873+
class="software.aws.toolkits.jetbrains.services.amazonq.QMigrationNotificationAction"/>
880874
</group>
881875

882876
<group id="aws.toolkit.q.sign.in">
883-
<action class="software.aws.toolkits.jetbrains.services.amazonq.explorerActions.SignInToQAction"/>
877+
<action id="q.sign.in" class="software.aws.toolkits.jetbrains.services.amazonq.explorerActions.SignInToQAction"/>
884878
<action id="q.learn.more" class="software.aws.toolkits.jetbrains.services.amazonq.explorerActions.QLearnMoreAction"/>
885879
</group>
886880

@@ -935,7 +929,7 @@
935929
</group>
936930

937931
<group id="aws.toolkit.jetbrains.core.services.codewhisperer.suggestions"
938-
class="software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererNodeActionGroup" />
932+
class="software.aws.toolkits.jetbrains.services.codewhisperer.explorer.QStatusBarLoggedInActionGroup" />
939933

940934
</actions>
941935

Lines changed: 5 additions & 0 deletions
Loading

plugins/toolkit/jetbrains-core/src/icons/AwsIcons.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ object AwsIcons {
5252
@JvmField val TYPESCRIPT = load("/icons/misc/typeScript.svg") // 16x16
5353

5454
@JvmField val CSHARP = load("/icons/misc/csharp.svg") // 16x16
55+
56+
@JvmField val NEW = load("/icons/misc/new.svg") // 16x16
5557
}
5658

5759
object Resources {

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/core/credentials/actions/SsoLogoutAction.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
package software.aws.toolkits.jetbrains.core.credentials.actions
55

66
import com.intellij.openapi.actionSystem.AnActionEvent
7+
import com.intellij.openapi.application.ApplicationManager
78
import com.intellij.openapi.project.DumbAwareAction
89
import com.intellij.openapi.ui.MessageDialogBuilder
910
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
1011
import software.aws.toolkits.jetbrains.core.credentials.ProfileSsoManagedBearerSsoConnection
12+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener
1113
import software.aws.toolkits.jetbrains.core.credentials.logoutFromSsoConnection
1214
import software.aws.toolkits.jetbrains.core.explorer.refreshDevToolTree
1315
import software.aws.toolkits.jetbrains.core.gettingstarted.deleteSsoConnectionCW
@@ -25,6 +27,9 @@ class SsoLogoutAction(private val value: AwsBearerTokenConnection) : DumbAwareAc
2527
}
2628
}
2729
logoutFromSsoConnection(e.project, value)
30+
ApplicationManager.getApplication().messageBus.syncPublisher(
31+
ToolkitConnectionManagerListener.TOPIC
32+
).activeConnectionChanged(null)
2833
e.project?.refreshDevToolTree()
2934
}
3035
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import com.intellij.openapi.project.Project
1010
import software.aws.toolkits.jetbrains.core.explorer.devToolsTab.nodes.AbstractActionTreeNode
1111
import java.awt.event.MouseEvent
1212

13-
class AnActionTreeNode(
13+
open class AnActionTreeNode(
1414
project: Project,
1515
private val place: String,
1616
private val action: AnAction

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

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,72 @@ package software.aws.toolkits.jetbrains.core.explorer.cwqTab
55

66
import com.intellij.ide.projectView.PresentationData
77
import com.intellij.ide.util.treeView.AbstractTreeNode
8-
import com.intellij.openapi.extensions.ExtensionPointName
8+
import com.intellij.openapi.actionSystem.ActionGroup
9+
import com.intellij.openapi.actionSystem.ActionManager
910
import com.intellij.openapi.project.Project
10-
import software.aws.toolkits.jetbrains.core.explorer.cwqTab.nodes.CwQServiceNode
11+
import com.intellij.ui.SimpleTextAttributes
12+
import software.aws.toolkits.jetbrains.ToolkitPlaces
13+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
14+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitAuthManager
15+
import software.aws.toolkits.jetbrains.core.explorer.actions.AnActionTreeNode
16+
import software.aws.toolkits.jetbrains.core.gettingstarted.editor.ActiveConnection
17+
import software.aws.toolkits.jetbrains.core.gettingstarted.editor.BearerTokenFeatureSet
18+
import software.aws.toolkits.jetbrains.core.gettingstarted.editor.checkBearerConnectionValidity
19+
import software.aws.toolkits.jetbrains.services.amazonq.isQSupportedInThisVersion
20+
import software.aws.toolkits.jetbrains.services.codemodernizer.explorer.nodes.CodeModernizerRunModernizeNode
21+
import software.aws.toolkits.jetbrains.services.codemodernizer.isCodeModernizerAvailable
22+
import software.aws.toolkits.jetbrains.utils.isRunningOnRemoteBackend
23+
import software.aws.toolkits.resources.message
1124

1225
class CwQTreeRootNode(private val nodeProject: Project) : AbstractTreeNode<Any>(nodeProject, Object()) {
26+
private val runCodeModernizerNode by lazy { CodeModernizerRunModernizeNode(nodeProject) }
27+
1328
override fun update(presentation: PresentationData) {}
1429

15-
override fun getChildren(): Collection<AbstractTreeNode<*>> = EP_NAME.extensionList
16-
.filter { it.enabled() }
17-
.map {
18-
it.buildServiceRootNode(nodeProject).also { node ->
19-
node.parent = this
30+
override fun getChildren(): Collection<AbstractTreeNode<*>> {
31+
val connection = checkBearerConnectionValidity(project, BearerTokenFeatureSet.Q)
32+
33+
val groupId = when (connection) {
34+
is ActiveConnection.NotConnected -> if (otherActiveIdentityConnectionsAvailable()) ENABLE_Q_ACTION_GROUP else Q_SIGNED_OUT_ACTION_GROUP
35+
is ActiveConnection.ValidBearer -> Q_SIGNED_IN_ACTION_GROUP
36+
else -> Q_EXPIRED_TOKEN_ACTION_GROUP
37+
}
38+
39+
val actions = ActionManager.getInstance().getAction(groupId) as ActionGroup
40+
val childNodes = actions.getChildren(null).mapNotNull {
41+
object : AnActionTreeNode(project, ToolkitPlaces.CWQ_TOOL_WINDOW, it) {
42+
override fun update(presentation: PresentationData) {
43+
super.update(presentation)
44+
45+
// We only want to display not supported info in the "Open Chat Panel" node not the migration node
46+
if (presentation.coloredText[0].text != message("action.q.openchat.text")) return
47+
48+
if (groupId == Q_SIGNED_IN_ACTION_GROUP) {
49+
if (isRunningOnRemoteBackend()) {
50+
presentation.addText(message("codewhisperer.explorer.root_node.unavailable"), SimpleTextAttributes.GRAY_ATTRIBUTES)
51+
} else if (!isQSupportedInThisVersion()) {
52+
presentation.addText(message("q.unavailable"), SimpleTextAttributes.GRAY_ATTRIBUTES)
53+
}
54+
}
55+
}
2056
}
2157
}
2258

59+
// Temporarily put the transform node in the panel(as the second node before the migration node), to be removed soon.
60+
if (groupId == Q_SIGNED_IN_ACTION_GROUP && isCodeModernizerAvailable(project)) {
61+
return listOf(childNodes[0], runCodeModernizerNode, childNodes[1])
62+
}
63+
64+
return childNodes
65+
}
66+
67+
private fun otherActiveIdentityConnectionsAvailable() =
68+
ToolkitAuthManager.getInstance().listConnections().filterIsInstance<AwsBearerTokenConnection>().isNotEmpty()
69+
2370
companion object {
24-
val EP_NAME = ExtensionPointName<CwQServiceNode>("aws.toolkit.cwq.serviceNode")
71+
const val Q_SIGNED_IN_ACTION_GROUP = "aws.toolkit.q.idc.signed.in"
72+
const val Q_SIGNED_OUT_ACTION_GROUP = "aws.toolkit.q.sign.in"
73+
const val Q_EXPIRED_TOKEN_ACTION_GROUP = "aws.toolkit.q.expired"
74+
const val ENABLE_Q_ACTION_GROUP = "aws.toolkit.q.enable"
2575
}
2676
}

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/core/explorer/cwqTab/nodes/CodeWhispererExplorerRootNode.kt

Lines changed: 0 additions & 18 deletions
This file was deleted.

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/core/explorer/cwqTab/nodes/QServiceNode.kt

Lines changed: 0 additions & 103 deletions
This file was deleted.

0 commit comments

Comments
 (0)