com.intellij.openapi.actionSystem.EmptyAction.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.openapi.actionSystem.EmptyAction.java

Source

// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.openapi.actionSystem;

import com.intellij.openapi.actionSystem.ex.ActionUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;

/**
 * This class purpose is to reserve action-id in a plugin.xml so the action appears in Keymap.
 * Then Keymap assignments can be used for non-registered actions created on runtime.
 * <p>
 * Another usage is to override (hide) already registered actions by means of plugin.xml, see {@link EmptyActionGroup} as well.
 *
 * @author Gregory.Shrago
 * @author Konstantin Bulenkov
 * @see EmptyActionGroup
 */
public final class EmptyAction extends AnAction {
    private boolean myEnabled;

    public EmptyAction() {
    }

    public EmptyAction(boolean enabled) {
        myEnabled = enabled;
    }

    public EmptyAction(@Nullable @Nls(capitalization = Nls.Capitalization.Title) String text,
            @Nullable @Nls(capitalization = Nls.Capitalization.Sentence) String description, @Nullable Icon icon) {
        super(text, description, icon);
    }

    public static AnAction createEmptyAction(@Nullable @Nls(capitalization = Nls.Capitalization.Title) String name,
            @Nullable Icon icon, boolean alwaysEnabled) {
        final EmptyAction emptyAction = new EmptyAction(name, null, icon);
        emptyAction.myEnabled = alwaysEnabled;
        return emptyAction;
    }

    @Override
    public void actionPerformed(@NotNull AnActionEvent e) {
    }

    @Override
    public void update(@NotNull AnActionEvent e) {
        e.getPresentation().setEnabledAndVisible(myEnabled);
    }

    public static void setupAction(@NotNull AnAction action, @NotNull String id, @Nullable JComponent component) {
        ActionUtil.mergeFrom(action, id).registerCustomShortcutSet(component, null);
    }

    public static void registerActionShortcuts(@NotNull JComponent component, @NotNull JComponent fromComponent) {
        ActionUtil.copyRegisteredShortcuts(component, fromComponent);
    }

    /**
     * Registers global action on a component with a custom shortcut set.
     * <p>
     * ActionManager.getInstance().getAction(id).registerCustomShortcutSet(shortcutSet, component) shouldn't be used directly,
     * because it will erase shortcuts, assigned to this action in keymap.
     */
    @NotNull
    public static AnAction registerWithShortcutSet(@NotNull String id, @NotNull ShortcutSet shortcutSet,
            @NotNull JComponent component) {
        AnAction newAction = wrap(ActionManager.getInstance().getAction(id));
        newAction.registerCustomShortcutSet(shortcutSet, component);
        return newAction;
    }

    /**
     * Creates proxy action
     * <p>
     * It allows to alter template presentation and shortcut set without affecting original action,
     */
    public static AnAction wrap(final AnAction action) {
        return action instanceof ActionGroup ? new MyDelegatingActionGroup(((ActionGroup) action))
                : new MyDelegatingAction(action);
    }

    public static class MyDelegatingAction extends AnAction {
        @NotNull
        private final AnAction myDelegate;

        public MyDelegatingAction(@NotNull AnAction action) {
            myDelegate = action;
            copyFrom(action);
            setEnabledInModalContext(action.isEnabledInModalContext());
        }

        @Override
        public void update(@NotNull final AnActionEvent e) {
            myDelegate.update(e);
        }

        @Override
        public void actionPerformed(@NotNull final AnActionEvent e) {
            myDelegate.actionPerformed(e);
        }

        @Override
        public boolean isDumbAware() {
            return myDelegate.isDumbAware();
        }

        @Override
        public boolean isTransparentUpdate() {
            return myDelegate.isTransparentUpdate();
        }

        @Override
        public boolean isInInjectedContext() {
            return myDelegate.isInInjectedContext();
        }
    }

    public static class MyDelegatingActionGroup extends ActionGroup {
        @NotNull
        private final ActionGroup myDelegate;

        public MyDelegatingActionGroup(@NotNull ActionGroup action) {
            myDelegate = action;
            copyFrom(action);
            setEnabledInModalContext(action.isEnabledInModalContext());
        }

        @NotNull
        public ActionGroup getDelegate() {
            return myDelegate;
        }

        @Override
        public boolean isPopup() {
            return myDelegate.isPopup();
        }

        @Override
        public AnAction @NotNull [] getChildren(@Nullable final AnActionEvent e) {
            return myDelegate.getChildren(e);
        }

        @Override
        public void update(@NotNull final AnActionEvent e) {
            myDelegate.update(e);
        }

        @Override
        public boolean canBePerformed(@NotNull DataContext context) {
            return myDelegate.canBePerformed(context);
        }

        @Override
        public void actionPerformed(@NotNull final AnActionEvent e) {
            myDelegate.actionPerformed(e);
        }

        @Override
        public boolean isDumbAware() {
            return myDelegate.isDumbAware();
        }

        @Override
        public boolean isTransparentUpdate() {
            return myDelegate.isTransparentUpdate();
        }

        @Override
        public boolean isInInjectedContext() {
            return myDelegate.isInInjectedContext();
        }

        @Override
        public boolean hideIfNoVisibleChildren() {
            return myDelegate.hideIfNoVisibleChildren();
        }

        @Override
        public boolean disableIfNoVisibleChildren() {
            return myDelegate.disableIfNoVisibleChildren();
        }
    }

    public static class DelegatingCompactActionGroup extends MyDelegatingActionGroup implements CompactActionGroup {
        public DelegatingCompactActionGroup(@NotNull ActionGroup action) {
            super(action);
        }
    }
}