GT-2894 - Key Bindings - review fixes

This commit is contained in:
dragonmacher
2019-06-03 17:44:44 -04:00
parent 28c5218f18
commit 9737653be6
20 changed files with 213 additions and 243 deletions
@@ -1,159 +0,0 @@
/* ###
* IP: GHIDRA
* REVIEWED: YES
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ghidra.app.plugin.core.compositeeditor;
import ghidra.framework.plugintool.Plugin;
import ghidra.framework.plugintool.PluginTool;
import ghidra.util.HelpLocation;
import java.awt.event.ActionListener;
import javax.swing.*;
import docking.action.*;
/**
* CompositeEditorAction is an abstract class that should be extended for any
* action that is to be associated with a composite editor.
*/
abstract public class CompositeEditorAction extends DockingAction implements EditorAction {
protected CompositeEditorProvider provider;
protected CompositeEditorModel model;
protected String tooltip;
protected ImageIcon icon;
protected ActionListener listener;
protected String displayString;
protected String actionCommand;
protected JButton button; // corresponding JButton for this action
protected KeyStroke keystroke;
protected Plugin plugin;
protected PluginTool tool;
public static final String EDIT_ACTION_PREFIX = "Editor: ";
/**
* Defines an <code>Action</code> object with the specified
* description string and a the specified icon.
*/
public CompositeEditorAction(CompositeEditorProvider provider, String name, String group,
String[] popupPath, String[] menuPath, ImageIcon icon) {
super(name, provider.plugin.getName());
this.provider = provider;
model = provider.getModel();
if (menuPath != null) {
setMenuBarData(new MenuData(menuPath, icon, group));
}
if (popupPath != null) {
setPopupMenuData(new MenuData(popupPath, icon, group));
}
if (icon != null) {
setToolBarData(new ToolBarData(icon, group));
}
this.plugin = provider.plugin;
this.tool = plugin.getTool();
model.addCompositeEditorModelListener(this);
String helpAnchor = provider.getHelpName() + "_" + getHelpName();
setHelpLocation(new HelpLocation(provider.getHelpTopic(), helpAnchor));
}
/* (non-Javadoc)
* @see ghidra.framework.plugintool.PluginAction#dispose()
*/
@Override
public void dispose() {
model.removeCompositeEditorModelListener(this);
super.dispose();
provider = null;
model = null;
plugin = null;
tool = null;
}
protected void requestTableFocus() {
JTable table = ((CompositeEditorPanel) provider.getComponent()).getTable();
if (table.isEditing()) {
table.getEditorComponent().requestFocus();
}
else {
table.requestFocus();
}
}
abstract public void adjustEnablement();
public String getHelpName() {
String actionName = getName();
if (actionName.startsWith(CompositeEditorAction.EDIT_ACTION_PREFIX)) {
actionName = actionName.substring(CompositeEditorAction.EDIT_ACTION_PREFIX.length());
}
return actionName;
}
/* (non-Javadoc)
* @see ghidra.app.plugin.stackeditor.EditorModelListener#selectionChanged()
*/
public void selectionChanged() {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.stackeditor.EditorModelListener#editStateChanged(int)
*/
public void editStateChanged(int i) {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.compositeeditor.CompositeEditorModelListener#compositeEditStateChanged(int)
*/
public void compositeEditStateChanged(int type) {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.compositeeditor.CompositeEditorModelListener#endFieldEditing()
*/
public void endFieldEditing() {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.compositeeditor.CompositeEditorModelListener#componentDataChanged()
*/
public void componentDataChanged() {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.compositeeditor.CompositeEditorModelListener#compositeInfoChanged()
*/
public void compositeInfoChanged() {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.compositeeditor.CompositeEditorModelListener#statusChanged(java.lang.String, boolean)
*/
public void statusChanged(String message, boolean beep) {
}
public void showUndefinedStateChanged(boolean showUndefinedBytes) {
adjustEnablement();
}
}
@@ -32,9 +32,9 @@ import docking.action.KeyBindingData;
*/ */
public class CompositeEditorActionManager { public class CompositeEditorActionManager {
private CompositeEditorProvider provider; private CompositeEditorProvider provider;
private ArrayList<CompositeEditorAction> editorActions = new ArrayList<CompositeEditorAction>(); private ArrayList<CompositeEditorTableAction> editorActions = new ArrayList<CompositeEditorTableAction>();
private ArrayList<CompositeEditorAction> favoritesActions = private ArrayList<CompositeEditorTableAction> favoritesActions =
new ArrayList<CompositeEditorAction>(); new ArrayList<CompositeEditorTableAction>();
private ArrayList<CycleGroupAction> cycleGroupActions = new ArrayList<CycleGroupAction>(); private ArrayList<CycleGroupAction> cycleGroupActions = new ArrayList<CycleGroupAction>();
private ArrayList<EditorActionListener> listeners = new ArrayList<EditorActionListener>(); private ArrayList<EditorActionListener> listeners = new ArrayList<EditorActionListener>();
@@ -103,24 +103,24 @@ public class CompositeEditorActionManager {
* manager created by default are not part of the actions returned. * manager created by default are not part of the actions returned.
* @return the composite editor actions * @return the composite editor actions
*/ */
public CompositeEditorAction[] getEditorActions() { public CompositeEditorTableAction[] getEditorActions() {
return editorActions.toArray(new CompositeEditorAction[editorActions.size()]); return editorActions.toArray(new CompositeEditorTableAction[editorActions.size()]);
} }
/** /**
* Gets the cycle group actions that the manager created by default. * Gets the cycle group actions that the manager created by default.
* @return the cycle group actions * @return the cycle group actions
*/ */
public CompositeEditorAction[] getFavoritesActions() { public CompositeEditorTableAction[] getFavoritesActions() {
return favoritesActions.toArray(new CompositeEditorAction[favoritesActions.size()]); return favoritesActions.toArray(new CompositeEditorTableAction[favoritesActions.size()]);
} }
/** /**
* Gets the favorites actions that the manager created by default. * Gets the favorites actions that the manager created by default.
* @return the favorites actions * @return the favorites actions
*/ */
public CompositeEditorAction[] getCycleGroupActions() { public CompositeEditorTableAction[] getCycleGroupActions() {
return cycleGroupActions.toArray(new CompositeEditorAction[cycleGroupActions.size()]); return cycleGroupActions.toArray(new CompositeEditorTableAction[cycleGroupActions.size()]);
} }
/** /**
@@ -128,9 +128,9 @@ public class CompositeEditorActionManager {
* action manager. This includes the favorites and cycle groups actions. * action manager. This includes the favorites and cycle groups actions.
* @return all composite editor actions * @return all composite editor actions
*/ */
public CompositeEditorAction[] getAllActions() { public CompositeEditorTableAction[] getAllActions() {
int numActions = getActionCount(); int numActions = getActionCount();
CompositeEditorAction[] allActions = new CompositeEditorAction[numActions]; CompositeEditorTableAction[] allActions = new CompositeEditorTableAction[numActions];
int index = 0; int index = 0;
int length; int length;
length = editorActions.size(); length = editorActions.size();
@@ -153,8 +153,8 @@ public class CompositeEditorActionManager {
* @param actionName the name of the action to find. * @param actionName the name of the action to find.
* @return the action or null * @return the action or null
*/ */
public CompositeEditorAction getNamedAction(String actionName) { public CompositeEditorTableAction getNamedAction(String actionName) {
CompositeEditorAction action; CompositeEditorTableAction action;
int length = editorActions.size(); int length = editorActions.size();
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
action = editorActions.get(i); action = editorActions.get(i);
@@ -190,7 +190,7 @@ public class CompositeEditorActionManager {
* setting the new actions. * setting the new actions.
* @param actions the composite editor actions. * @param actions the composite editor actions.
*/ */
public void setEditorActions(CompositeEditorAction[] actions) { public void setEditorActions(CompositeEditorTableAction[] actions) {
editorActions.clear(); editorActions.clear();
for (int i = 0; i < actions.length; i++) { for (int i = 0; i < actions.length; i++) {
editorActions.add(actions[i]); editorActions.add(actions[i]);
@@ -225,21 +225,21 @@ public class CompositeEditorActionManager {
cycleGroupActions.clear(); cycleGroupActions.clear();
} }
private void notifyActionsAdded(ArrayList<? extends CompositeEditorAction> actions) { private void notifyActionsAdded(ArrayList<? extends CompositeEditorTableAction> actions) {
if (actions.size() <= 0) if (actions.size() <= 0)
return; return;
int length = listeners.size(); int length = listeners.size();
CompositeEditorAction[] cea = actions.toArray(new CompositeEditorAction[actions.size()]); CompositeEditorTableAction[] cea = actions.toArray(new CompositeEditorTableAction[actions.size()]);
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
listeners.get(i).actionsAdded(cea); listeners.get(i).actionsAdded(cea);
} }
} }
private void notifyActionsRemoved(ArrayList<? extends CompositeEditorAction> actions) { private void notifyActionsRemoved(ArrayList<? extends CompositeEditorTableAction> actions) {
if (actions.size() <= 0) if (actions.size() <= 0)
return; return;
int length = listeners.size(); int length = listeners.size();
CompositeEditorAction[] cea = actions.toArray(new CompositeEditorAction[actions.size()]); CompositeEditorTableAction[] cea = actions.toArray(new CompositeEditorTableAction[actions.size()]);
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
listeners.get(i).actionsRemoved(cea); listeners.get(i).actionsRemoved(cea);
} }
@@ -251,7 +251,7 @@ public class CompositeEditorActionManager {
public void optionsChanged(Options options, String name, Object oldValue, Object newValue) { public void optionsChanged(Options options, String name, Object oldValue, Object newValue) {
// Update the editor actions here. // Update the editor actions here.
// The favorites and cycle groups get handled by stateChanged() and cyclegroupChanged(). // The favorites and cycle groups get handled by stateChanged() and cyclegroupChanged().
CompositeEditorAction[] actions = getEditorActions(); CompositeEditorTableAction[] actions = getEditorActions();
for (int i = 0; i < actions.length; i++) { for (int i = 0; i < actions.length; i++) {
String actionName = actions[i].getFullName(); String actionName = actions[i].getFullName();
if (actionName.equals(name)) { if (actionName.equals(name)) {
@@ -535,8 +535,8 @@ public abstract class CompositeEditorPanel extends JPanel
table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE); table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
table.addMouseListener(new CompositeTableMouseListener()); table.addMouseListener(new CompositeTableMouseListener());
CompositeEditorAction action = provider.actionMgr.getNamedAction( CompositeEditorTableAction action = provider.actionMgr.getNamedAction(
CompositeEditorAction.EDIT_ACTION_PREFIX + EditFieldAction.ACTION_NAME); CompositeEditorTableAction.EDIT_ACTION_PREFIX + EditFieldAction.ACTION_NAME);
Action swingAction = KeyBindingUtils.adaptDockingActionToNonContextAction(action); Action swingAction = KeyBindingUtils.adaptDockingActionToNonContextAction(action);
InputMap map = table.getInputMap(); InputMap map = table.getInputMap();
map.put(action.getKeyBinding(), "StartEditing"); map.put(action.getKeyBinding(), "StartEditing");
@@ -104,26 +104,26 @@ public abstract class CompositeEditorProvider extends ComponentProviderAdapter
} }
protected void addActionsToTool() { protected void addActionsToTool() {
CompositeEditorAction[] allActions = actionMgr.getAllActions(); CompositeEditorTableAction[] allActions = actionMgr.getAllActions();
for (CompositeEditorAction allAction : allActions) { for (CompositeEditorTableAction allAction : allActions) {
tool.addLocalAction(this, allAction); tool.addLocalAction(this, allAction);
} }
} }
protected CompositeEditorAction[] getActions() { protected CompositeEditorTableAction[] getActions() {
return actionMgr.getAllActions(); return actionMgr.getAllActions();
} }
@Override @Override
public void actionsAdded(CompositeEditorAction[] actions) { public void actionsAdded(CompositeEditorTableAction[] actions) {
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
tool.addLocalAction(this, action); tool.addLocalAction(this, action);
} }
} }
@Override @Override
public void actionsRemoved(CompositeEditorAction[] actions) { public void actionsRemoved(CompositeEditorTableAction[] actions) {
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
tool.removeLocalAction(this, action); tool.removeLocalAction(this, action);
} }
} }
@@ -206,8 +206,8 @@ public abstract class CompositeEditorProvider extends ComponentProviderAdapter
@Override @Override
public void dispose() { public void dispose() {
CompositeEditorAction[] allActions = actionMgr.getAllActions(); CompositeEditorTableAction[] allActions = actionMgr.getAllActions();
for (CompositeEditorAction allAction : allActions) { for (CompositeEditorTableAction allAction : allActions) {
tool.removeLocalAction(this, allAction); tool.removeLocalAction(this, allAction);
} }
tool.showComponentProvider(this, false); tool.showComponentProvider(this, false);
@@ -254,8 +254,8 @@ public abstract class CompositeEditorProvider extends ComponentProviderAdapter
tool.setStatusInfo(msg); tool.setStatusInfo(msg);
} }
protected CompositeEditorAction[] createActions() { protected CompositeEditorTableAction[] createActions() {
return new CompositeEditorAction[0]; return new CompositeEditorTableAction[0];
} }
protected boolean applyChanges() { protected boolean applyChanges() {
@@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -16,14 +15,144 @@
*/ */
package ghidra.app.plugin.core.compositeeditor; package ghidra.app.plugin.core.compositeeditor;
import javax.swing.ImageIcon; import ghidra.framework.plugintool.Plugin;
import ghidra.framework.plugintool.PluginTool;
import ghidra.util.HelpLocation;
abstract public class CompositeEditorTableAction extends CompositeEditorAction { import java.awt.event.ActionListener;
import javax.swing.*;
import docking.action.*;
/**
* CompositeEditorAction is an abstract class that should be extended for any
* action that is to be associated with a composite editor.
*/
abstract public class CompositeEditorTableAction extends DockingAction implements EditorAction {
protected CompositeEditorProvider provider;
protected CompositeEditorModel model;
protected String tooltip;
protected ImageIcon icon;
protected ActionListener listener;
protected String displayString;
protected String actionCommand;
protected JButton button; // corresponding JButton for this action
protected KeyStroke keystroke;
protected Plugin plugin;
protected PluginTool tool;
public static final String EDIT_ACTION_PREFIX = "Editor: ";
/**
* Defines an <code>Action</code> object with the specified
* description string and a the specified icon.
*/
public CompositeEditorTableAction(CompositeEditorProvider provider, String name, String group,
String[] popupPath, String[] menuPath, ImageIcon icon) {
super(name, provider.plugin.getName());
this.provider = provider;
model = provider.getModel();
if (menuPath != null) {
setMenuBarData(new MenuData(menuPath, icon, group));
}
if (popupPath != null) {
setPopupMenuData(new MenuData(popupPath, icon, group));
}
if (icon != null) {
setToolBarData(new ToolBarData(icon, group));
}
this.plugin = provider.plugin;
this.tool = plugin.getTool();
model.addCompositeEditorModelListener(this);
String helpAnchor = provider.getHelpName() + "_" + getHelpName();
setHelpLocation(new HelpLocation(provider.getHelpTopic(), helpAnchor));
}
/* (non-Javadoc)
* @see ghidra.framework.plugintool.PluginAction#dispose()
*/
@Override
public void dispose() {
model.removeCompositeEditorModelListener(this);
super.dispose();
provider = null;
model = null;
plugin = null;
tool = null;
}
protected void requestTableFocus() {
JTable table = ((CompositeEditorPanel) provider.getComponent()).getTable();
if (table.isEditing()) {
table.getEditorComponent().requestFocus();
}
else {
table.requestFocus();
}
}
abstract public void adjustEnablement();
public String getHelpName() {
String actionName = getName();
if (actionName.startsWith(CompositeEditorTableAction.EDIT_ACTION_PREFIX)) {
actionName = actionName.substring(CompositeEditorTableAction.EDIT_ACTION_PREFIX.length());
}
return actionName;
}
/* (non-Javadoc)
* @see ghidra.app.plugin.stackeditor.EditorModelListener#selectionChanged()
*/
public void selectionChanged() {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.stackeditor.EditorModelListener#editStateChanged(int)
*/
public void editStateChanged(int i) {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.compositeeditor.CompositeEditorModelListener#compositeEditStateChanged(int)
*/
public void compositeEditStateChanged(int type) {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.compositeeditor.CompositeEditorModelListener#endFieldEditing()
*/
public void endFieldEditing() {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.compositeeditor.CompositeEditorModelListener#componentDataChanged()
*/
public void componentDataChanged() {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.compositeeditor.CompositeEditorModelListener#compositeInfoChanged()
*/
public void compositeInfoChanged() {
adjustEnablement();
}
/* (non-Javadoc)
* @see ghidra.app.plugin.compositeeditor.CompositeEditorModelListener#statusChanged(java.lang.String, boolean)
*/
public void statusChanged(String message, boolean beep) {
}
public void showUndefinedStateChanged(boolean showUndefinedBytes) {
adjustEnablement();
}
public CompositeEditorTableAction(CompositeEditorProvider provider,
String name, String group,
String[] popupPath, String[] menuPath,
ImageIcon icon) {
super(provider, name, group, popupPath, menuPath, icon);
}
} }
@@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -22,11 +21,11 @@ public interface EditorActionListener {
* Notification that the indicated actions were added. * Notification that the indicated actions were added.
* @param actions the composite editor actions. * @param actions the composite editor actions.
*/ */
public void actionsAdded(CompositeEditorAction[] actions); public void actionsAdded(CompositeEditorTableAction[] actions);
/** /**
* Notification that the indicated actions were removed. * Notification that the indicated actions were removed.
* @param actions the composite editor actions. * @param actions the composite editor actions.
*/ */
public void actionsRemoved(CompositeEditorAction[] actions); public void actionsRemoved(CompositeEditorTableAction[] actions);
} }
@@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -27,7 +26,7 @@ import docking.menu.DockingCheckboxMenuItemUI;
* Action for use in the composite data type editor. * Action for use in the composite data type editor.
* This action has help associated with it. * This action has help associated with it.
*/ */
public class HexNumbersAction extends CompositeEditorAction implements ToggleDockingActionIf { public class HexNumbersAction extends CompositeEditorTableAction implements ToggleDockingActionIf {
private final static String ACTION_NAME = "Show Numbers In Hex"; private final static String ACTION_NAME = "Show Numbers In Hex";
private final static String GROUP_NAME = BASIC_ACTION_GROUP; private final static String GROUP_NAME = BASIC_ACTION_GROUP;
@@ -69,10 +68,12 @@ public class HexNumbersAction extends CompositeEditorAction implements ToggleDoc
// Always enabled. // Always enabled.
} }
@Override
public boolean isSelected() { public boolean isSelected() {
return isSelected; return isSelected;
} }
@Override
public void setSelected(boolean newValue) { public void setSelected(boolean newValue) {
isSelected = newValue; isSelected = newValue;
firePropertyChanged(SELECTED_STATE_PROPERTY, !isSelected, isSelected); firePropertyChanged(SELECTED_STATE_PROPERTY, !isSelected, isSelected);
@@ -57,8 +57,8 @@ public class StructureEditorProvider extends CompositeEditorProvider {
* @see ghidra.app.plugin.compositeeditor.CompositeEditorProvider#createActions() * @see ghidra.app.plugin.compositeeditor.CompositeEditorProvider#createActions()
*/ */
@Override @Override
protected CompositeEditorAction[] createActions() { protected CompositeEditorTableAction[] createActions() {
return new CompositeEditorAction[] { return new CompositeEditorTableAction[] {
new ApplyAction(this), new ApplyAction(this),
// new ToggleLockAction(this), // new ToggleLockAction(this),
new InsertUndefinedAction(this), new MoveUpAction(this), new MoveDownAction(this), new InsertUndefinedAction(this), new MoveUpAction(this), new MoveDownAction(this),
@@ -53,8 +53,8 @@ public class UnionEditorProvider extends CompositeEditorProvider {
* @see ghidra.app.plugin.compositeeditor.CompositeEditorProvider#createActions() * @see ghidra.app.plugin.compositeeditor.CompositeEditorProvider#createActions()
*/ */
@Override @Override
protected CompositeEditorAction[] createActions() { protected CompositeEditorTableAction[] createActions() {
return new CompositeEditorAction[] { new ApplyAction(this), new MoveUpAction(this), return new CompositeEditorTableAction[] { new ApplyAction(this), new MoveUpAction(this),
new MoveDownAction(this), new DuplicateAction(this), new DuplicateMultipleAction(this), new MoveDownAction(this), new DuplicateAction(this), new DuplicateMultipleAction(this),
new DeleteAction(this), new PointerAction(this), new ArrayAction(this), new DeleteAction(this), new PointerAction(this), new ArrayAction(this),
new ShowComponentPathAction(this), new EditComponentAction(this), new ShowComponentPathAction(this), new EditComponentAction(this),
@@ -88,8 +88,8 @@ public class StackEditorProvider extends CompositeEditorProvider implements Doma
} }
@Override @Override
protected CompositeEditorAction[] createActions() { protected CompositeEditorTableAction[] createActions() {
return new CompositeEditorAction[] { new ApplyAction(this), new ClearAction(this), return new CompositeEditorTableAction[] { new ApplyAction(this), new ClearAction(this),
new DeleteAction(this), new PointerAction(this), new ArrayAction(this), new DeleteAction(this), new PointerAction(this), new ArrayAction(this),
new ShowComponentPathAction(this), new EditComponentAction(this), new ShowComponentPathAction(this), new EditComponentAction(this),
new EditFieldAction(this), new HexNumbersAction(this) }; new EditFieldAction(this), new HexNumbersAction(this) };
@@ -133,7 +133,7 @@ public class StackEditorProvider extends CompositeEditorProvider implements Doma
} }
@Override @Override
protected CompositeEditorAction[] getActions() { protected CompositeEditorTableAction[] getActions() {
return actionMgr.getAllActions(); return actionMgr.getAllActions();
} }
@@ -79,7 +79,7 @@ public abstract class AbstractEditorTest extends AbstractGhidraHeadedIntegration
protected int txId; protected int txId;
protected StatusListener listener; protected StatusListener listener;
protected CompositeEditorAction[] actions; protected CompositeEditorTableAction[] actions;
protected ArrayList<FavoritesAction> favorites = new ArrayList<>(); protected ArrayList<FavoritesAction> favorites = new ArrayList<>();
protected ArrayList<CycleGroupAction> cycles = new ArrayList<>(); protected ArrayList<CycleGroupAction> cycles = new ArrayList<>();
@@ -799,7 +799,7 @@ public abstract class AbstractEditorTest extends AbstractGhidraHeadedIntegration
} }
} }
protected void checkEnablement(CompositeEditorAction action, boolean expectedEnablement) { protected void checkEnablement(CompositeEditorTableAction action, boolean expectedEnablement) {
AtomicBoolean result = new AtomicBoolean(); AtomicBoolean result = new AtomicBoolean();
runSwing(() -> result.set(action.isEnabledForContext(provider.getActionContext(null)))); runSwing(() -> result.set(action.isEnabledForContext(provider.getActionContext(null))));
boolean actionEnablement = result.get(); boolean actionEnablement = result.get();
@@ -111,7 +111,7 @@ public abstract class AbstractStructureEditorTest extends AbstractEditorTest {
void getActions() { void getActions() {
actions = provider.getActions(); actions = provider.getActions();
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) { if (action instanceof FavoritesAction) {
favorites.add((FavoritesAction) action); favorites.add((FavoritesAction) action);
} }
@@ -107,7 +107,7 @@ public abstract class AbstractUnionEditorTest extends AbstractEditorTest {
void getActions() { void getActions() {
actions = provider.getActions(); actions = provider.getActions();
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) { if (action instanceof FavoritesAction) {
favorites.add((FavoritesAction) action); favorites.add((FavoritesAction) action);
} }
@@ -122,7 +122,7 @@ public class StructureEditorAlignmentTest extends AbstractStructureEditorTest {
addDataType(arrayDt); addDataType(arrayDt);
// Check enablement. // Check enablement.
CompositeEditorAction[] pActions = provider.getActions(); CompositeEditorTableAction[] pActions = provider.getActions();
for (int i = 0; i < pActions.length; i++) { for (int i = 0; i < pActions.length; i++) {
if ((pActions[i] instanceof FavoritesAction) || if ((pActions[i] instanceof FavoritesAction) ||
(pActions[i] instanceof CycleGroupAction) || (pActions[i] instanceof CycleGroupAction) ||
@@ -101,7 +101,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
getModel().getOriginalCategoryPath().getPath()); getModel().getOriginalCategoryPath().getPath());
assertEquals(getModel().getTypeName(), "Structure"); assertEquals(getModel().getTypeName(), "Structure");
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) || if ((action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) ||
(action instanceof PointerAction) || (action instanceof HexNumbersAction) || (action instanceof PointerAction) || (action instanceof HexNumbersAction) ||
(action instanceof ApplyAction)) { (action instanceof ApplyAction)) {
@@ -151,7 +151,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
assertEquals(pgmBbCat.getCategoryPathName(), assertEquals(pgmBbCat.getCategoryPathName(),
getModel().getOriginalCategoryPath().getPath()); getModel().getOriginalCategoryPath().getPath());
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) || if ((action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) ||
(action instanceof PointerAction) || (action instanceof HexNumbersAction)) { (action instanceof PointerAction) || (action instanceof HexNumbersAction)) {
checkEnablement(action, true); checkEnablement(action, true);
@@ -187,7 +187,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
// Check enablement on first component selected. // Check enablement on first component selected.
setSelection(new int[] { 0 }); setSelection(new int[] { 0 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) { if (action instanceof FavoritesAction) {
FavoritesAction fav = (FavoritesAction) action; FavoritesAction fav = (FavoritesAction) action;
int len = fav.getDataType().getLength(); int len = fav.getDataType().getLength();
@@ -216,7 +216,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
// Check enablement on central component selected. // Check enablement on central component selected.
setSelection(new int[] { 3 }); setSelection(new int[] { 3 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) { if (action instanceof FavoritesAction) {
FavoritesAction fav = (FavoritesAction) action; FavoritesAction fav = (FavoritesAction) action;
int len = fav.getDataType().getLength(); int len = fav.getDataType().getLength();
@@ -246,7 +246,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
// Check enablement on last component selected. // Check enablement on last component selected.
setSelection(new int[] { last }); setSelection(new int[] { last });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) { if (action instanceof FavoritesAction) {
checkEnablement(action, true); checkEnablement(action, true);
} }
@@ -272,7 +272,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
// Check enablement on a contiguous multi-component selection. // Check enablement on a contiguous multi-component selection.
setSelection(new int[] { 2, 3, 4 }); setSelection(new int[] { 2, 3, 4 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) { if (action instanceof FavoritesAction) {
FavoritesAction fav = (FavoritesAction) action; FavoritesAction fav = (FavoritesAction) action;
int len = fav.getDataType().getLength(); int len = fav.getDataType().getLength();
@@ -300,7 +300,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
// Check enablement on a non-contiguous multi-component selection. // Check enablement on a non-contiguous multi-component selection.
setSelection(new int[] { 2, 3, 6, 7 }); setSelection(new int[] { 2, 3, 6, 7 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) { if (action instanceof FavoritesAction) {
FavoritesAction fav = (FavoritesAction) action; FavoritesAction fav = (FavoritesAction) action;
int len = fav.getDataType().getLength(); int len = fav.getDataType().getLength();
@@ -80,7 +80,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
assertEquals(model.getTypeName(), "Structure"); assertEquals(model.getTypeName(), "Structure");
// Check enablement. // Check enablement.
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) || if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) || (action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) ||
(action instanceof PointerAction) || (action instanceof HexNumbersAction) || (action instanceof PointerAction) || (action instanceof HexNumbersAction) ||
@@ -114,7 +114,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
assertEquals(pgmBbCat.getCategoryPathName(), model.getOriginalCategoryPath().getPath()); assertEquals(pgmBbCat.getCategoryPathName(), model.getOriginalCategoryPath().getPath());
// Check enablement on blank line selected. // Check enablement on blank line selected.
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) || if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) || (action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) ||
(action instanceof PointerAction) || (action instanceof HexNumbersAction)) { (action instanceof PointerAction) || (action instanceof HexNumbersAction)) {
@@ -141,7 +141,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
// Check enablement on first component selected. // Check enablement on first component selected.
setSelection(new int[] { 0 }); setSelection(new int[] { 0 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof EditFieldAction) || if ((action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) || (action instanceof ShowComponentPathAction) ||
(action instanceof InsertUndefinedAction) || (action instanceof MoveDownAction) || (action instanceof InsertUndefinedAction) || (action instanceof MoveDownAction) ||
@@ -180,7 +180,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
// Check enablement on central component selected. // Check enablement on central component selected.
runSwing(() -> setSelection(new int[] { 1 })); runSwing(() -> setSelection(new int[] { 1 }));
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof EditFieldAction) || if ((action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) || (action instanceof ShowComponentPathAction) ||
(action instanceof InsertUndefinedAction) || (action instanceof MoveDownAction) || (action instanceof InsertUndefinedAction) || (action instanceof MoveDownAction) ||
@@ -218,7 +218,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
// Check enablement on last component selected. // Check enablement on last component selected.
setSelection(new int[] { model.getNumComponents() - 1 }); setSelection(new int[] { model.getNumComponents() - 1 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof EditFieldAction) || if ((action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) || (action instanceof ShowComponentPathAction) ||
(action instanceof InsertUndefinedAction) || (action instanceof MoveUpAction) || (action instanceof InsertUndefinedAction) || (action instanceof MoveUpAction) ||
@@ -261,7 +261,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
// Check enablement on last component selected. // Check enablement on last component selected.
setSelection(new int[] { model.getNumComponents() }); setSelection(new int[] { model.getNumComponents() });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) || if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) || (action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) ||
(action instanceof PointerAction) || (action instanceof HexNumbersAction)) { (action instanceof PointerAction) || (action instanceof HexNumbersAction)) {
@@ -54,7 +54,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
assertEquals(model.getTypeName(), "Union"); assertEquals(model.getTypeName(), "Union");
// Check enablement. // Check enablement.
CompositeEditorAction[] pActions = provider.getActions(); CompositeEditorTableAction[] pActions = provider.getActions();
for (int i = 0; i < pActions.length; i++) { for (int i = 0; i < pActions.length; i++) {
if ((pActions[i] instanceof FavoritesAction) || if ((pActions[i] instanceof FavoritesAction) ||
(pActions[i] instanceof CycleGroupAction) || (pActions[i] instanceof CycleGroupAction) ||
@@ -92,7 +92,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
assertEquals(pgmBbCat.getCategoryPathName(), model.getOriginalCategoryPath().getPath()); assertEquals(pgmBbCat.getCategoryPathName(), model.getOriginalCategoryPath().getPath());
// Check enablement on blank line selected. // Check enablement on blank line selected.
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) || if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof PointerAction) || (action instanceof EditFieldAction) || (action instanceof PointerAction) ||
(action instanceof HexNumbersAction)) { (action instanceof HexNumbersAction)) {
@@ -111,7 +111,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
// Check enablement on first component selected. // Check enablement on first component selected.
setSelection(new int[] { 0 }); setSelection(new int[] { 0 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) || if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) || (action instanceof MoveDownAction) || (action instanceof ShowComponentPathAction) || (action instanceof MoveDownAction) ||
@@ -134,7 +134,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
// Check enablement on central component selected. // Check enablement on central component selected.
setSelection(new int[] { 1 }); setSelection(new int[] { 1 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) || if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) || (action instanceof MoveUpAction) || (action instanceof ShowComponentPathAction) || (action instanceof MoveUpAction) ||
@@ -157,7 +157,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
// Check enablement on last component selected. // Check enablement on last component selected.
setSelection(new int[] { model.getNumComponents() - 1 }); setSelection(new int[] { model.getNumComponents() - 1 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) || if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) || (action instanceof MoveUpAction) || (action instanceof ShowComponentPathAction) || (action instanceof MoveUpAction) ||
@@ -180,7 +180,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
// Check enablement on a contiguous multi-component selection. // Check enablement on a contiguous multi-component selection.
setSelection(new int[] { 2, 3, 4 }); setSelection(new int[] { 2, 3, 4 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction)// enabled to show message if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction)// enabled to show message
|| (action instanceof MoveDownAction) || (action instanceof MoveUpAction) || || (action instanceof MoveDownAction) || (action instanceof MoveUpAction) ||
(action instanceof DeleteAction) || (action instanceof PointerAction) || (action instanceof DeleteAction) || (action instanceof PointerAction) ||
@@ -201,7 +201,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
// Check enablement on a non-contiguous multi-component selection. // Check enablement on a non-contiguous multi-component selection.
setSelection(new int[] { 2, 3, 6, 7 }); setSelection(new int[] { 2, 3, 6, 7 });
for (CompositeEditorAction action : actions) { for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) || if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof DeleteAction) || (action instanceof HexNumbersAction)) { (action instanceof DeleteAction) || (action instanceof HexNumbersAction)) {
checkEnablement(action, true); checkEnablement(action, true);
@@ -111,7 +111,7 @@ public class UnionEditorAlignmentTest extends AbstractUnionEditorTest {
addDataType(arrayDt); addDataType(arrayDt);
// Check enablement. // Check enablement.
CompositeEditorAction[] pActions = provider.getActions(); CompositeEditorTableAction[] pActions = provider.getActions();
for (int i = 0; i < pActions.length; i++) { for (int i = 0; i < pActions.length; i++) {
if ((pActions[i] instanceof FavoritesAction) || if ((pActions[i] instanceof FavoritesAction) ||
(pActions[i] instanceof CycleGroupAction) || (pActions[i] instanceof CycleGroupAction) ||
@@ -279,7 +279,7 @@ public abstract class AbstractStackEditorTest extends AbstractEditorTest {
void getActions() { void getActions() {
actions = ((StackEditorProvider) provider).getActions(); actions = ((StackEditorProvider) provider).getActions();
for (CompositeEditorAction element : actions) { for (CompositeEditorTableAction element : actions) {
if (element instanceof FavoritesAction) { if (element instanceof FavoritesAction) {
favorites.add((FavoritesAction) element); favorites.add((FavoritesAction) element);
} }
@@ -256,12 +256,12 @@ class KeyBindingOverrideKeyEventDispatcher implements KeyEventDispatcher {
// We've made the executive decision to allow all keys to go through to the text component // We've made the executive decision to allow all keys to go through to the text component
// unless they are modified with the 'Alt'/'Ctrl'/etc keys, unless they directly used // unless they are modified with the 'Alt'/'Ctrl'/etc keys, unless they directly used
// by the text component // by the text component
if (!isNonTextModifierOn(event)) { if (!isModified(event)) {
return true; // unmodified keys will be given to the text component return true; // unmodified keys will be given to the text component
} }
// the key is modified; let it through if the component has a mapping for the key // the key is modified; let it through if the component has a mapping for the key
return hasComponentKeyToActionMapping((JTextComponent) destination, event); return hasRegisteredKeyBinding((JTextComponent) destination, event);
} }
/** /**
@@ -270,11 +270,11 @@ class KeyBindingOverrideKeyEventDispatcher implements KeyEventDispatcher {
* @param e the event * @param e the event
* @return true if modified * @return true if modified
*/ */
private boolean isNonTextModifierOn(KeyEvent e) { private boolean isModified(KeyEvent e) {
return e.isAltDown() || e.isAltGraphDown() || e.isMetaDown() || e.isControlDown(); return e.isAltDown() || e.isAltGraphDown() || e.isMetaDown() || e.isControlDown();
} }
private boolean hasComponentKeyToActionMapping(JComponent c, KeyEvent event) { private boolean hasRegisteredKeyBinding(JComponent c, KeyEvent event) {
KeyStroke keyStroke = KeyStroke.getKeyStrokeForEvent(event); KeyStroke keyStroke = KeyStroke.getKeyStrokeForEvent(event);
Action action = getJavaActionForComponent(c, keyStroke); Action action = getJavaActionForComponent(c, keyStroke);
return action != null; return action != null;