cache ActionGroup#canBePerformed during update and don't run it afterwards

This commit is contained in:
peter
2018-11-21 08:18:18 +01:00
parent 67915c9001
commit d014708610
2 changed files with 11 additions and 2 deletions
@@ -40,6 +40,7 @@ class ActionUpdater {
private final Map<AnAction, Presentation> myUpdatedPresentations = ContainerUtil.newIdentityTroveMap();
private final Map<ActionGroup, List<AnAction>> myGroupChildren = ContainerUtil.newIdentityTroveMap();
private final Map<ActionGroup, Boolean> myCanBePerformedCache = ContainerUtil.newIdentityTroveMap();
private final UpdateStrategy myRealUpdateStrategy;
private final UpdateStrategy myCheapStrategy;
@@ -167,7 +168,7 @@ class ActionUpdater {
if (actionGroup.hideIfNoVisibleChildren() && !visibleChildren) {
return Collections.emptyList();
}
presentation.setEnabled(visibleChildren || strategy.canBePerformed.test(actionGroup));
presentation.setEnabled(visibleChildren || canBePerformed(actionGroup, strategy));
}
return Collections.singletonList(child);
@@ -179,6 +180,14 @@ class ActionUpdater {
return Collections.singletonList(child);
}
boolean canBePerformedCached(ActionGroup group) {
return !Boolean.FALSE.equals(myCanBePerformedCache.get(group));
}
private boolean canBePerformed(ActionGroup group, UpdateStrategy strategy) {
return myCanBePerformedCache.computeIfAbsent(group, __ -> strategy.canBePerformed.test(group));
}
private Presentation orDefault(AnAction action, Presentation presentation) {
return presentation != null ? presentation : myFactory.getPresentation(action);
}
@@ -130,7 +130,7 @@ public class Utils{
}
}
else if (action instanceof ActionGroup &&
!(((ActionGroup)action).canBePerformed(context) &&
!(updater.canBePerformedCached((ActionGroup)action) &&
!updater.hasVisibleChildren((ActionGroup)action))) {
ActionMenu menu = new ActionMenu(context, place, (ActionGroup)action, presentationFactory, enableMnemonics, useDarkIcons);
component.add(menu);