1212import com .intellij .openapi .actionSystem .AnActionEvent ;
1313import com .intellij .openapi .actionSystem .LangDataKeys ;
1414import com .intellij .openapi .actionSystem .PlatformDataKeys ;
15+ import com .intellij .openapi .actionSystem .Presentation ;
1516import com .intellij .openapi .module .Module ;
17+ import com .intellij .openapi .module .ModuleUtil ;
1618import com .intellij .openapi .project .Project ;
19+ import com .microsoft .azure .toolkit .intellij .connector .dotazure .AzureModule ;
1720import com .microsoft .azure .toolkit .lib .common .operation .AzureOperation ;
1821import com .microsoft .azure .toolkit .lib .common .operation .OperationContext ;
22+ import org .apache .commons .lang3 .BooleanUtils ;
1923import org .apache .commons .lang3 .StringUtils ;
20- import org .jetbrains .annotations .NotNull ;
2124
2225import javax .annotation .Nonnull ;
26+ import javax .annotation .Nullable ;
2327import java .util .Objects ;
2428
2529import static com .microsoft .azure .toolkit .lib .common .action .Action .EMPTY_PLACE ;
@@ -30,20 +34,48 @@ public class ToggleAzureFacetNodeAction extends AnAction {
3034 @ AzureOperation (name = "user/connector.show_azure_node" )
3135 public void actionPerformed (@ Nonnull AnActionEvent event ) {
3236 OperationContext .current ().setTelemetryProperty (PLACE , StringUtils .firstNonBlank (event .getPlace (), EMPTY_PLACE ));
33- final Module module = LangDataKeys . MODULE . getData (event . getDataContext () );
37+ final Module module = getModule (event );
3438 if (Objects .nonNull (module ) && !module .getProject ().isDisposed ()) {
3539 final Project project = Objects .requireNonNull (event .getProject ());
3640 final PropertiesComponent properties = PropertiesComponent .getInstance (project );
37- properties .setValue (module .getName () + ".azure" , "show" );
41+ properties .setValue (module .getName () + ".azure" , isAzureNodeShown ( module ) ? "hide" : "show" );
3842 ProjectView .getInstance (module .getProject ()).getCurrentProjectViewPane ().updateFromRoot (true );
3943 }
4044 }
4145
4246 @ Override
43- public void update (@ NotNull AnActionEvent e ) {
44- final Module module = LangDataKeys .MODULE .getData (e .getDataContext ());
47+ public void update (@ Nonnull AnActionEvent e ) {
48+ final Module module = getModule (e );
49+ final Presentation presentation = e .getPresentation ();
50+ if (Objects .isNull (module )) {
51+ presentation .setEnabledAndVisible (false );
52+ return ;
53+ }
54+ presentation .setEnabledAndVisible (true );
55+ if (isAzureNodeShown (module )) {
56+ presentation .setText ("Hide 'Azure' Node" );
57+ } else {
58+ presentation .setText ("Show 'Azure' Node" );
59+ }
60+ }
61+
62+ private static boolean isAzureNodeShown (final Module module ) {
63+ final AzureModule azureModule = AzureModule .from (module );
64+ final Boolean state = azureModule .getAzureFacetState ();
65+ final boolean forceShow = BooleanUtils .isTrue (state );
66+ final boolean forceHide = BooleanUtils .isFalse (state );
67+ final boolean defaultShow = state == null && (azureModule .hasAzureFacet () || azureModule .isInitialized () || azureModule .hasAzureDependencies ());
68+ return forceShow || defaultShow ;
69+ }
70+
71+ @ Nullable
72+ private static Module getModule (final @ Nonnull AnActionEvent e ) {
73+ Module module = LangDataKeys .MODULE .getData (e .getDataContext ());
4574 final Object [] selected = PlatformDataKeys .SELECTED_ITEMS .getData (e .getDataContext ());
4675 final boolean onDotAzure = Objects .nonNull (selected ) && selected .length == 1 && (selected [0 ] instanceof PsiDirectoryNode node ) && ".azure" .equalsIgnoreCase (node .getValue ().getName ());
47- e .getPresentation ().setEnabledAndVisible (Objects .nonNull (module ) || onDotAzure );
76+ if (Objects .isNull (module ) && onDotAzure && Objects .nonNull (e .getProject ())) {
77+ module = ModuleUtil .findModuleForFile (((PsiDirectoryNode ) selected [0 ]).getValue ().getVirtualFile (), e .getProject ());
78+ }
79+ return module ;
4880 }
4981}
0 commit comments