fix(gui): resolve ignored mouse actions (#2360)

This commit is contained in:
Skylot
2024-12-09 17:44:32 +00:00
parent fdad829c49
commit 47f2e516e5
3 changed files with 28 additions and 30 deletions
@@ -9,12 +9,13 @@ import javax.swing.KeyStroke;
import org.jetbrains.annotations.Nullable;
import jadx.gui.ui.menu.JadxMenu;
import jadx.gui.utils.UiUtils;
import jadx.gui.utils.shortcut.Shortcut;
import jadx.gui.utils.ui.ActionHandler;
public class JadxGuiAction extends ActionHandler implements IShortcutAction {
private static final String COMMAND = "JadxGuiAction.Command.%s";
private static final String COMMAND_PREFIX = "JadxGuiAction.Command.";
private final ActionModel actionModel;
private final String id;
@@ -102,21 +103,20 @@ public class JadxGuiAction extends ActionHandler implements IShortcutAction {
@Override
public void performAction() {
if (shortcutComponent != null && !shortcutComponent.isShowing()) {
return;
if (shortcutComponent != null) {
if (shortcutComponent == JadxMenu.JADX_MENU_COMPONENT) {
// always enabled
} else if (!shortcutComponent.isShowing()) {
return;
}
}
String shortcutType = "null";
if (shortcut != null) {
shortcutType = shortcut.getTypeString();
}
actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
String.format(COMMAND, shortcutType)));
String shortcutType = shortcut != null ? shortcut.getTypeString() : "null";
actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, COMMAND_PREFIX + shortcutType));
}
public static boolean isSource(ActionEvent event) {
return event.getActionCommand() != null
&& event.getActionCommand().startsWith(String.format(COMMAND, ""));
String command = event.getActionCommand();
return command != null && command.startsWith(COMMAND_PREFIX);
}
@Override
@@ -12,7 +12,7 @@ import jadx.gui.utils.shortcut.ShortcutsController;
public class JadxMenu extends JMenu {
// fake component to fill action shortcut component property
private static final JComponent JADX_MENU_COMPONENT = new JComponent() {
public static final JComponent JADX_MENU_COMPONENT = new JComponent() {
@Override
public String toString() {
return "JADX_MENU_COMPONENT";
@@ -3,10 +3,11 @@ package jadx.gui.utils.shortcut;
import java.awt.AWTEvent;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -31,7 +32,7 @@ public class ShortcutsController {
private final JadxSettings settings;
private final Map<ActionModel, Set<IShortcutAction>> boundActions = new EnumMap<>(ActionModel.class);
private final Set<ActionModel> mouseActions = EnumSet.noneOf(ActionModel.class);
private final Map<Integer, List<IShortcutAction>> mouseActions = new HashMap<>();
private ShortcutsWrapper shortcuts;
@@ -73,8 +74,7 @@ public class ShortcutsController {
LOG.warn("No shortcut component in action: {}", action, new JadxRuntimeException());
return;
}
boundActions.computeIfAbsent(action.getActionModel(), k -> new HashSet<>());
boundActions.get(action.getActionModel()).add(action);
boundActions.computeIfAbsent(action.getActionModel(), k -> new HashSet<>()).add(action);
}
/*
@@ -106,18 +106,12 @@ public class ShortcutsController {
if (mouseEvent.getID() != MouseEvent.MOUSE_PRESSED) {
return;
}
int mouseButton = mouseEvent.getButton();
for (ActionModel actionModel : mouseActions) {
Shortcut shortcut = shortcuts.get(actionModel);
if (shortcut != null && shortcut.getMouseButton() == mouseButton) {
Set<IShortcutAction> actions = boundActions.get(actionModel);
if (actions != null) {
for (IShortcutAction action : actions) {
if (action != null) {
mouseEvent.consume();
UiUtils.uiRun(action::performAction);
}
}
List<IShortcutAction> actions = mouseActions.get(mouseEvent.getButton());
if (actions != null) {
for (IShortcutAction action : actions) {
if (action != null) {
mouseEvent.consume();
UiUtils.uiRun(action::performAction);
}
}
}
@@ -129,7 +123,11 @@ public class ShortcutsController {
for (ActionModel actionModel : ActionModel.values()) {
Shortcut shortcut = shortcuts.get(actionModel);
if (shortcut != null && shortcut.isMouse()) {
mouseActions.add(actionModel);
Set<IShortcutAction> actions = boundActions.get(actionModel);
if (actions != null && !actions.isEmpty()) {
mouseActions.computeIfAbsent(shortcut.getMouseButton(), i -> new ArrayList<>())
.addAll(actions);
}
}
}
}