Skip to content

Commit 31b8149

Browse files
authored
Adding @ActionImpl annotations to Hierarchy actions. Refactoring and localizing. (#226)
1 parent cd5471b commit 31b8149

12 files changed

Lines changed: 202 additions & 86 deletions

plugin/src/main/java/com/intellij/java/impl/ide/hierarchy/call/CallHierarchyBrowser.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ public CallHierarchyBrowser(@Nonnull Project project, @Nonnull PsiMethod method)
4444

4545
@Override
4646
protected void createTrees(@Nonnull Map<String, JTree> type2TreeMap) {
47-
ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(IdeActions.GROUP_CALL_HIERARCHY_POPUP);
47+
ActionGroup group = (ActionGroup) ActionManager.getInstance().getAction(IdeActions.GROUP_CALL_HIERARCHY_POPUP);
4848
JTree tree1 = createTree(false);
4949
PopupHandler.installPopupHandler(tree1, group, ActionPlaces.CALL_HIERARCHY_VIEW_POPUP, ActionManager.getInstance());
50-
BaseOnThisMethodAction baseOnThisMethodAction = new BaseOnThisMethodAction();
50+
BaseOnThisMethodAction baseOnThisMethodAction = new JavaBaseOnThisMethodAction();
5151
baseOnThisMethodAction
5252
.registerCustomShortcutSet(ActionManager.getInstance().getAction(IdeActions.ACTION_CALL_HIERARCHY).getShortcutSet(), tree1);
5353
type2TreeMap.put(CALLEE_TYPE, tree1);
@@ -98,7 +98,4 @@ else if (CALLEE_TYPE.equals(typeName)) {
9898
protected Comparator<NodeDescriptor> getComparator() {
9999
return JavaHierarchyUtil.getComparator(myProject);
100100
}
101-
102-
public static final class BaseOnThisMethodAction extends CallHierarchyBrowserBase.BaseOnThisMethodAction {
103-
}
104101
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright 2000-2009 JetBrains s.r.o.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.intellij.java.impl.ide.hierarchy.call;
17+
18+
import consulo.annotation.component.ActionImpl;
19+
import consulo.annotation.component.ActionParentRef;
20+
import consulo.annotation.component.ActionRef;
21+
import consulo.annotation.component.ActionRefAnchor;
22+
import consulo.ide.impl.idea.ide.hierarchy.CallHierarchyBrowserBase;
23+
24+
@ActionImpl(
25+
id = "CallHierarchy.BaseOnThisType",
26+
parents = @ActionParentRef(value = @ActionRef(id = "CallHierarchyPopupMenu"), anchor = ActionRefAnchor.FIRST)
27+
)
28+
public final class JavaBaseOnThisMethodAction extends CallHierarchyBrowserBase.BaseOnThisMethodAction {
29+
}

plugin/src/main/java/com/intellij/java/impl/ide/hierarchy/method/ImplementMethodAction.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,29 @@
1515
*/
1616
package com.intellij.java.impl.ide.hierarchy.method;
1717

18+
import consulo.annotation.component.ActionImpl;
19+
import consulo.annotation.component.ActionRef;
1820
import consulo.ide.localize.IdeLocalize;
21+
import consulo.platform.base.localize.ActionLocalize;
1922
import consulo.ui.ex.action.Presentation;
2023

24+
@ActionImpl(id = "MethodHierarchy.ImplementMethodAction", shortcutFrom = @ActionRef(id = "ImplementMethods"))
2125
public final class ImplementMethodAction extends OverrideImplementMethodAction {
26+
public ImplementMethodAction() {
27+
super(
28+
ActionLocalize.actionMethodhierarchyImplementmethodactionText(),
29+
ActionLocalize.actionMethodhierarchyImplementmethodactionDescription()
30+
);
31+
}
32+
2233
@Override
2334
protected final void update(Presentation presentation, int toImplement, int toOverride) {
2435
if (toImplement > 0) {
25-
presentation.setEnabled(true);
26-
presentation.setVisible(true);
36+
presentation.setEnabledAndVisible(true);
2737
presentation.setTextValue(toImplement == 1 ? IdeLocalize.actionImplementMethod() : IdeLocalize.actionImplementMethods());
2838
}
2939
else {
30-
presentation.setEnabled(false);
31-
presentation.setVisible(false);
40+
presentation.setEnabledAndVisible(false);
3241
}
3342
}
3443
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright 2000-2009 JetBrains s.r.o.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.intellij.java.impl.ide.hierarchy.method;
17+
18+
import consulo.annotation.component.ActionImpl;
19+
import consulo.annotation.component.ActionParentRef;
20+
import consulo.annotation.component.ActionRef;
21+
import consulo.annotation.component.ActionRefAnchor;
22+
import consulo.ide.impl.idea.ide.hierarchy.MethodHierarchyBrowserBase;
23+
24+
@ActionImpl(
25+
id = "MethodHierarchy.BaseOnThisType",
26+
parents = @ActionParentRef(value = @ActionRef(id = "MethodHierarchyPopupMenu"), anchor = ActionRefAnchor.FIRST)
27+
)
28+
public class JavaBaseOnThisMethodAction extends MethodHierarchyBrowserBase.BaseOnThisMethodAction {
29+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright 2013-2025 consulo.io
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.intellij.java.impl.ide.hierarchy.method;
17+
18+
import consulo.annotation.component.ActionImpl;
19+
import consulo.annotation.component.ActionParentRef;
20+
import consulo.annotation.component.ActionRef;
21+
import consulo.annotation.component.ActionRefAnchor;
22+
import consulo.application.dumb.DumbAware;
23+
import consulo.localize.LocalizeValue;
24+
import consulo.ui.ex.action.AnSeparator;
25+
import consulo.ui.ex.action.DefaultActionGroup;
26+
27+
/**
28+
* @author UNV
29+
* @since 2025-10-30
30+
*/
31+
@ActionImpl(
32+
id = "JavaMethodHierarchyPopupMenu",
33+
children = {
34+
@ActionRef(type = ImplementMethodAction.class),
35+
@ActionRef(type = OverrideMethodAction.class),
36+
@ActionRef(type = AnSeparator.class)
37+
},
38+
parents = @ActionParentRef(value = @ActionRef(id = "MethodHierarchyPopupMenu"), anchor = ActionRefAnchor.FIRST)
39+
)
40+
public class JavaMethodHierarchyPopupMenuGroup extends DefaultActionGroup implements DumbAware {
41+
public JavaMethodHierarchyPopupMenuGroup() {
42+
super(LocalizeValue.empty(), false);
43+
}
44+
}

plugin/src/main/java/com/intellij/java/impl/ide/hierarchy/method/JavaMethodHierarchyProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ public PsiElement getTarget(@Nonnull DataContext dataContext) {
5151
return null;
5252
}
5353

54-
@RequiredReadAction
5554
@Nullable
55+
@RequiredReadAction
5656
private static PsiMethod getMethodImpl(DataContext dataContext) {
5757
Project project = dataContext.getData(Project.KEY);
5858
if (project == null) {

plugin/src/main/java/com/intellij/java/impl/ide/hierarchy/method/MethodHierarchyBrowser.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.intellij.java.impl.ide.hierarchy.JavaHierarchyUtil;
1919
import com.intellij.java.language.psi.PsiMethod;
20+
import consulo.annotation.access.RequiredReadAction;
2021
import consulo.ide.impl.idea.ide.hierarchy.HierarchyNodeDescriptor;
2122
import consulo.ide.impl.idea.ide.hierarchy.HierarchyTreeBuilder;
2223
import consulo.ide.impl.idea.ide.hierarchy.HierarchyTreeStructure;
@@ -47,10 +48,10 @@ public MethodHierarchyBrowser(Project project, PsiMethod method) {
4748
@Override
4849
protected void createTrees(@Nonnull Map<String, JTree> trees) {
4950
JTree tree = createTree(false);
50-
ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(IdeActions.GROUP_METHOD_HIERARCHY_POPUP);
51+
ActionGroup group = (ActionGroup) ActionManager.getInstance().getAction(IdeActions.GROUP_METHOD_HIERARCHY_POPUP);
5152
PopupHandler.installPopupHandler(tree, group, ActionPlaces.METHOD_HIERARCHY_VIEW_POPUP, ActionManager.getInstance());
5253

53-
BaseOnThisMethodAction baseOnThisMethodAction = new BaseOnThisMethodAction();
54+
BaseOnThisMethodAction baseOnThisMethodAction = new JavaBaseOnThisMethodAction();
5455
baseOnThisMethodAction
5556
.registerCustomShortcutSet(ActionManager.getInstance().getAction(IdeActions.ACTION_METHOD_HIERARCHY).getShortcutSet(), tree);
5657

@@ -83,21 +84,18 @@ protected HierarchyTreeStructure createHierarchyTreeStructure(@Nonnull String ty
8384
LOG.error("unexpected type: " + typeName);
8485
return null;
8586
}
86-
return new MethodHierarchyTreeStructure(myProject, (PsiMethod)psiElement);
87+
return new MethodHierarchyTreeStructure(myProject, (PsiMethod) psiElement);
8788
}
8889

8990
@Override
9091
protected Comparator<NodeDescriptor> getComparator() {
9192
return JavaHierarchyUtil.getComparator(myProject);
9293
}
9394

95+
@RequiredReadAction
9496
public PsiMethod getBaseMethod() {
9597
HierarchyTreeBuilder builder = myBuilders.get(myCurrentViewType);
96-
MethodHierarchyTreeStructure treeStructure = (MethodHierarchyTreeStructure)builder.getTreeStructure();
98+
MethodHierarchyTreeStructure treeStructure = (MethodHierarchyTreeStructure) builder.getTreeStructure();
9799
return treeStructure.getBaseMethod();
98100
}
99-
100-
public static final class BaseOnThisMethodAction extends MethodHierarchyBrowserBase.BaseOnThisMethodAction {
101-
}
102-
103101
}

plugin/src/main/java/com/intellij/java/impl/ide/hierarchy/method/OverrideImplementMethodAction.java

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.intellij.java.language.psi.PsiSubstitutor;
2222
import com.intellij.java.language.psi.PsiSyntheticClass;
2323
import com.intellij.java.language.psi.util.MethodSignature;
24-
import consulo.application.Application;
2524
import consulo.dataContext.DataContext;
2625
import consulo.ide.impl.idea.ide.hierarchy.HierarchyNodeDescriptor;
2726
import consulo.ide.impl.idea.ide.hierarchy.MethodHierarchyBrowserBase;
@@ -50,19 +49,19 @@
5049
abstract class OverrideImplementMethodAction extends AnAction {
5150
private static final Logger LOG = Logger.getInstance(OverrideImplementMethodAction.class);
5251

53-
@RequiredUIAccess
52+
protected OverrideImplementMethodAction(@Nonnull LocalizeValue text, @Nonnull LocalizeValue description) {
53+
super(text, description);
54+
}
55+
5456
@Override
57+
@RequiredUIAccess
5558
public final void actionPerformed(@Nonnull AnActionEvent event) {
5659
DataContext dataContext = event.getDataContext();
57-
MethodHierarchyBrowser methodHierarchyBrowser = (MethodHierarchyBrowser)dataContext.getData(MethodHierarchyBrowserBase.DATA_KEY);
60+
MethodHierarchyBrowser methodHierarchyBrowser = (MethodHierarchyBrowser) dataContext.getData(MethodHierarchyBrowserBase.DATA_KEY);
5861
if (methodHierarchyBrowser == null) {
5962
return;
6063
}
61-
Project project = dataContext.getData(Project.KEY);
62-
if (project == null) {
63-
return;
64-
}
65-
64+
Project project = dataContext.getRequiredData(Project.KEY);
6665
LocalizeValue commandName = event.getPresentation().getTextValue();
6766
CommandProcessor.getInstance().newCommand()
6867
.project(project)
@@ -75,7 +74,7 @@ public final void actionPerformed(@Nonnull AnActionEvent event) {
7574
List<VirtualFile> files = new ArrayList<>(selectedDescriptors.length);
7675
for (HierarchyNodeDescriptor selectedDescriptor : selectedDescriptors) {
7776
PsiFile containingFile =
78-
((MethodHierarchyNodeDescriptor)selectedDescriptor).getPsiClass().getContainingFile();
77+
((MethodHierarchyNodeDescriptor) selectedDescriptor).getPsiClass().getContainingFile();
7978
if (containingFile != null) {
8079
VirtualFile vFile = containingFile.getVirtualFile();
8180
if (vFile != null) {
@@ -87,15 +86,15 @@ public final void actionPerformed(@Nonnull AnActionEvent event) {
8786
ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(VirtualFileUtil.toVirtualFileArray(files));
8887
if (!status.hasReadonlyFiles()) {
8988
for (HierarchyNodeDescriptor selectedDescriptor : selectedDescriptors) {
90-
PsiElement aClass = ((MethodHierarchyNodeDescriptor)selectedDescriptor).getPsiClass();
89+
PsiElement aClass = ((MethodHierarchyNodeDescriptor) selectedDescriptor).getPsiClass();
9190
if (aClass instanceof PsiClass psiClass) {
9291
OverrideImplementUtil.overrideOrImplement(psiClass, methodHierarchyBrowser.getBaseMethod());
9392
}
9493
}
9594
ToolWindowManager.getInstance(project).activateEditorComponent();
9695
}
9796
else {
98-
Application.get().invokeLater(
97+
project.getApplication().invokeLater(
9998
() -> Messages.showErrorDialog(project, status.getReadonlyFilesMessage(), commandName.get())
10099
);
101100
}
@@ -107,23 +106,20 @@ public final void actionPerformed(@Nonnull AnActionEvent event) {
107106
});
108107
}
109108

110-
@RequiredUIAccess
111109
@Override
110+
@RequiredUIAccess
112111
public final void update(@Nonnull AnActionEvent e) {
113112
Presentation presentation = e.getPresentation();
114113
DataContext dataContext = e.getDataContext();
115114

116115
MethodHierarchyBrowser methodHierarchyBrowser =
117-
(MethodHierarchyBrowser)dataContext.getData(MethodHierarchyBrowserBase.DATA_KEY);
116+
(MethodHierarchyBrowser) dataContext.getData(MethodHierarchyBrowserBase.DATA_KEY);
118117
if (methodHierarchyBrowser == null) {
119-
presentation.setEnabled(false);
120-
presentation.setVisible(false);
118+
presentation.setEnabledAndVisible(false);
121119
return;
122120
}
123-
Project project = dataContext.getData(Project.KEY);
124-
if (project == null) {
125-
presentation.setEnabled(false);
126-
presentation.setVisible(false);
121+
if (!dataContext.hasData(Project.KEY)) {
122+
presentation.setEnabledAndVisible(false);
127123
return;
128124
}
129125

@@ -132,28 +128,25 @@ public final void update(@Nonnull AnActionEvent e) {
132128
int toOverride = 0;
133129

134130
for (HierarchyNodeDescriptor descriptor : selectedDescriptors) {
135-
if (canImplementOverride((MethodHierarchyNodeDescriptor)descriptor, methodHierarchyBrowser, true)) {
131+
if (canImplementOverride((MethodHierarchyNodeDescriptor) descriptor, methodHierarchyBrowser, true)) {
136132
if (toOverride > 0) {
137133
// no mixed actions allowed
138-
presentation.setEnabled(false);
139-
presentation.setVisible(false);
134+
presentation.setEnabledAndVisible(false);
140135
return;
141136
}
142137
toImplement++;
143138
}
144-
else if (canImplementOverride((MethodHierarchyNodeDescriptor)descriptor, methodHierarchyBrowser, false)) {
139+
else if (canImplementOverride((MethodHierarchyNodeDescriptor) descriptor, methodHierarchyBrowser, false)) {
145140
if (toImplement > 0) {
146141
// no mixed actions allowed
147-
presentation.setEnabled(false);
148-
presentation.setVisible(false);
142+
presentation.setEnabledAndVisible(false);
149143
return;
150144
}
151145
toOverride++;
152146
}
153147
else {
154148
// no action is applicable to this node
155-
presentation.setEnabled(false);
156-
presentation.setVisible(false);
149+
presentation.setEnabledAndVisible(false);
157150
return;
158151
}
159152
}

plugin/src/main/java/com/intellij/java/impl/ide/hierarchy/method/OverrideMethodAction.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,27 @@
1515
*/
1616
package com.intellij.java.impl.ide.hierarchy.method;
1717

18+
import consulo.annotation.component.ActionImpl;
19+
import consulo.annotation.component.ActionRef;
1820
import consulo.ide.localize.IdeLocalize;
21+
import consulo.platform.base.localize.ActionLocalize;
1922
import consulo.ui.ex.action.Presentation;
2023

24+
@ActionImpl(id = "MethodHierarchy.OverrideMethodAction", shortcutFrom = @ActionRef(id = "OverrideMethods"))
2125
public final class OverrideMethodAction extends OverrideImplementMethodAction {
26+
public OverrideMethodAction() {
27+
super(
28+
ActionLocalize.actionMethodhierarchyOverridemethodactionText(),
29+
ActionLocalize.actionMethodhierarchyOverridemethodactionDescription()
30+
);
31+
}
32+
2233
@Override
2334
protected final void update(Presentation presentation, int toImplement, int toOverride) {
24-
if (toOverride > 0) {
25-
presentation.setEnabled(true);
26-
presentation.setVisible(true);
35+
boolean enabled = toOverride > 0;
36+
presentation.setEnabledAndVisible(enabled);
37+
if (enabled) {
2738
presentation.setTextValue(toOverride == 1 ? IdeLocalize.actionOverrideMethod() : IdeLocalize.actionOverrideMethods());
2839
}
29-
else {
30-
presentation.setEnabled(false);
31-
presentation.setVisible(false);
32-
}
3340
}
3441
}

0 commit comments

Comments
 (0)