Merge remote-tracking branch 'origin/GT-2894-dragonmacher-structure-editor-keys'

This commit is contained in:
Ryan Kurtz 2019-06-06 11:23:36 -04:00
commit 5e2748837b
21 changed files with 236 additions and 251 deletions

View file

@ -25,16 +25,12 @@ import resources.ResourceManager;
/**
* ApplyAction is an action for applying editor changes.
*/
public class ApplyAction extends CompositeEditorAction {
public class ApplyAction extends CompositeEditorTableAction {
private final static String GROUP_NAME = BASIC_ACTION_GROUP;
private final static ImageIcon APPLY_ICON = ResourceManager.loadImage("images/disk.png");
private final static String[] popupPath = new String[] { "Apply Edits" };
/**
* Constructor
* @param owner the plugin that owns this action
*/
public ApplyAction(CompositeEditorProvider provider) {
super(provider, EDIT_ACTION_PREFIX + "Apply Editor Changes", GROUP_NAME, popupPath, null,
APPLY_ICON);
@ -43,9 +39,6 @@ public class ApplyAction extends CompositeEditorAction {
adjustEnablement();
}
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionContext context) {
if (!model.isValidName()) {

View file

@ -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();
}
}

View file

@ -32,9 +32,9 @@ import docking.action.KeyBindingData;
*/
public class CompositeEditorActionManager {
private CompositeEditorProvider provider;
private ArrayList<CompositeEditorAction> editorActions = new ArrayList<CompositeEditorAction>();
private ArrayList<CompositeEditorAction> favoritesActions =
new ArrayList<CompositeEditorAction>();
private ArrayList<CompositeEditorTableAction> editorActions = new ArrayList<CompositeEditorTableAction>();
private ArrayList<CompositeEditorTableAction> favoritesActions =
new ArrayList<CompositeEditorTableAction>();
private ArrayList<CycleGroupAction> cycleGroupActions = new ArrayList<CycleGroupAction>();
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.
* @return the composite editor actions
*/
public CompositeEditorAction[] getEditorActions() {
return editorActions.toArray(new CompositeEditorAction[editorActions.size()]);
public CompositeEditorTableAction[] getEditorActions() {
return editorActions.toArray(new CompositeEditorTableAction[editorActions.size()]);
}
/**
* Gets the cycle group actions that the manager created by default.
* @return the cycle group actions
*/
public CompositeEditorAction[] getFavoritesActions() {
return favoritesActions.toArray(new CompositeEditorAction[favoritesActions.size()]);
public CompositeEditorTableAction[] getFavoritesActions() {
return favoritesActions.toArray(new CompositeEditorTableAction[favoritesActions.size()]);
}
/**
* Gets the favorites actions that the manager created by default.
* @return the favorites actions
*/
public CompositeEditorAction[] getCycleGroupActions() {
return cycleGroupActions.toArray(new CompositeEditorAction[cycleGroupActions.size()]);
public CompositeEditorTableAction[] getCycleGroupActions() {
return cycleGroupActions.toArray(new CompositeEditorTableAction[cycleGroupActions.size()]);
}
/**
@ -128,9 +128,9 @@ public class CompositeEditorActionManager {
* action manager. This includes the favorites and cycle groups actions.
* @return all composite editor actions
*/
public CompositeEditorAction[] getAllActions() {
public CompositeEditorTableAction[] getAllActions() {
int numActions = getActionCount();
CompositeEditorAction[] allActions = new CompositeEditorAction[numActions];
CompositeEditorTableAction[] allActions = new CompositeEditorTableAction[numActions];
int index = 0;
int length;
length = editorActions.size();
@ -153,8 +153,8 @@ public class CompositeEditorActionManager {
* @param actionName the name of the action to find.
* @return the action or null
*/
public CompositeEditorAction getNamedAction(String actionName) {
CompositeEditorAction action;
public CompositeEditorTableAction getNamedAction(String actionName) {
CompositeEditorTableAction action;
int length = editorActions.size();
for (int i = 0; i < length; i++) {
action = editorActions.get(i);
@ -190,7 +190,7 @@ public class CompositeEditorActionManager {
* setting the new actions.
* @param actions the composite editor actions.
*/
public void setEditorActions(CompositeEditorAction[] actions) {
public void setEditorActions(CompositeEditorTableAction[] actions) {
editorActions.clear();
for (int i = 0; i < actions.length; i++) {
editorActions.add(actions[i]);
@ -225,21 +225,21 @@ public class CompositeEditorActionManager {
cycleGroupActions.clear();
}
private void notifyActionsAdded(ArrayList<? extends CompositeEditorAction> actions) {
private void notifyActionsAdded(ArrayList<? extends CompositeEditorTableAction> actions) {
if (actions.size() <= 0)
return;
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++) {
listeners.get(i).actionsAdded(cea);
}
}
private void notifyActionsRemoved(ArrayList<? extends CompositeEditorAction> actions) {
private void notifyActionsRemoved(ArrayList<? extends CompositeEditorTableAction> actions) {
if (actions.size() <= 0)
return;
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++) {
listeners.get(i).actionsRemoved(cea);
}
@ -251,7 +251,7 @@ public class CompositeEditorActionManager {
public void optionsChanged(Options options, String name, Object oldValue, Object newValue) {
// Update the editor actions here.
// 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++) {
String actionName = actions[i].getFullName();
if (actionName.equals(name)) {

View file

@ -535,8 +535,8 @@ public abstract class CompositeEditorPanel extends JPanel
table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
table.addMouseListener(new CompositeTableMouseListener());
CompositeEditorAction action = provider.actionMgr.getNamedAction(
CompositeEditorAction.EDIT_ACTION_PREFIX + EditFieldAction.ACTION_NAME);
CompositeEditorTableAction action = provider.actionMgr.getNamedAction(
CompositeEditorTableAction.EDIT_ACTION_PREFIX + EditFieldAction.ACTION_NAME);
Action swingAction = KeyBindingUtils.adaptDockingActionToNonContextAction(action);
InputMap map = table.getInputMap();
map.put(action.getKeyBinding(), "StartEditing");

View file

@ -104,26 +104,26 @@ public abstract class CompositeEditorProvider extends ComponentProviderAdapter
}
protected void addActionsToTool() {
CompositeEditorAction[] allActions = actionMgr.getAllActions();
for (CompositeEditorAction allAction : allActions) {
CompositeEditorTableAction[] allActions = actionMgr.getAllActions();
for (CompositeEditorTableAction allAction : allActions) {
tool.addLocalAction(this, allAction);
}
}
protected CompositeEditorAction[] getActions() {
protected CompositeEditorTableAction[] getActions() {
return actionMgr.getAllActions();
}
@Override
public void actionsAdded(CompositeEditorAction[] actions) {
for (CompositeEditorAction action : actions) {
public void actionsAdded(CompositeEditorTableAction[] actions) {
for (CompositeEditorTableAction action : actions) {
tool.addLocalAction(this, action);
}
}
@Override
public void actionsRemoved(CompositeEditorAction[] actions) {
for (CompositeEditorAction action : actions) {
public void actionsRemoved(CompositeEditorTableAction[] actions) {
for (CompositeEditorTableAction action : actions) {
tool.removeLocalAction(this, action);
}
}
@ -206,8 +206,8 @@ public abstract class CompositeEditorProvider extends ComponentProviderAdapter
@Override
public void dispose() {
CompositeEditorAction[] allActions = actionMgr.getAllActions();
for (CompositeEditorAction allAction : allActions) {
CompositeEditorTableAction[] allActions = actionMgr.getAllActions();
for (CompositeEditorTableAction allAction : allActions) {
tool.removeLocalAction(this, allAction);
}
tool.showComponentProvider(this, false);
@ -254,8 +254,8 @@ public abstract class CompositeEditorProvider extends ComponentProviderAdapter
tool.setStatusInfo(msg);
}
protected CompositeEditorAction[] createActions() {
return new CompositeEditorAction[0];
protected CompositeEditorTableAction[] createActions() {
return new CompositeEditorTableAction[0];
}
protected boolean applyChanges() {

View file

@ -1,6 +1,5 @@
/* ###
* 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.
@ -16,14 +15,144 @@
*/
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);
}
}

View file

@ -1,6 +1,5 @@
/* ###
* 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.
@ -22,11 +21,11 @@ public interface EditorActionListener {
* Notification that the indicated actions were added.
* @param actions the composite editor actions.
*/
public void actionsAdded(CompositeEditorAction[] actions);
public void actionsAdded(CompositeEditorTableAction[] actions);
/**
* Notification that the indicated actions were removed.
* @param actions the composite editor actions.
*/
public void actionsRemoved(CompositeEditorAction[] actions);
public void actionsRemoved(CompositeEditorTableAction[] actions);
}

View file

@ -1,6 +1,5 @@
/* ###
* 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.
@ -27,7 +26,7 @@ import docking.menu.DockingCheckboxMenuItemUI;
* Action for use in the composite data type editor.
* 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 GROUP_NAME = BASIC_ACTION_GROUP;
@ -69,10 +68,12 @@ public class HexNumbersAction extends CompositeEditorAction implements ToggleDoc
// Always enabled.
}
@Override
public boolean isSelected() {
return isSelected;
}
@Override
public void setSelected(boolean newValue) {
isSelected = newValue;
firePropertyChanged(SELECTED_STATE_PROPERTY, !isSelected, isSelected);

View file

@ -57,8 +57,8 @@ public class StructureEditorProvider extends CompositeEditorProvider {
* @see ghidra.app.plugin.compositeeditor.CompositeEditorProvider#createActions()
*/
@Override
protected CompositeEditorAction[] createActions() {
return new CompositeEditorAction[] {
protected CompositeEditorTableAction[] createActions() {
return new CompositeEditorTableAction[] {
new ApplyAction(this),
// new ToggleLockAction(this),
new InsertUndefinedAction(this), new MoveUpAction(this), new MoveDownAction(this),

View file

@ -53,8 +53,8 @@ public class UnionEditorProvider extends CompositeEditorProvider {
* @see ghidra.app.plugin.compositeeditor.CompositeEditorProvider#createActions()
*/
@Override
protected CompositeEditorAction[] createActions() {
return new CompositeEditorAction[] { new ApplyAction(this), new MoveUpAction(this),
protected CompositeEditorTableAction[] createActions() {
return new CompositeEditorTableAction[] { new ApplyAction(this), new MoveUpAction(this),
new MoveDownAction(this), new DuplicateAction(this), new DuplicateMultipleAction(this),
new DeleteAction(this), new PointerAction(this), new ArrayAction(this),
new ShowComponentPathAction(this), new EditComponentAction(this),

View file

@ -88,8 +88,8 @@ public class StackEditorProvider extends CompositeEditorProvider implements Doma
}
@Override
protected CompositeEditorAction[] createActions() {
return new CompositeEditorAction[] { new ApplyAction(this), new ClearAction(this),
protected CompositeEditorTableAction[] createActions() {
return new CompositeEditorTableAction[] { new ApplyAction(this), new ClearAction(this),
new DeleteAction(this), new PointerAction(this), new ArrayAction(this),
new ShowComponentPathAction(this), new EditComponentAction(this),
new EditFieldAction(this), new HexNumbersAction(this) };
@ -133,7 +133,7 @@ public class StackEditorProvider extends CompositeEditorProvider implements Doma
}
@Override
protected CompositeEditorAction[] getActions() {
protected CompositeEditorTableAction[] getActions() {
return actionMgr.getAllActions();
}

View file

@ -79,7 +79,7 @@ public abstract class AbstractEditorTest extends AbstractGhidraHeadedIntegration
protected int txId;
protected StatusListener listener;
protected CompositeEditorAction[] actions;
protected CompositeEditorTableAction[] actions;
protected ArrayList<FavoritesAction> favorites = 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();
runSwing(() -> result.set(action.isEnabledForContext(provider.getActionContext(null))));
boolean actionEnablement = result.get();

View file

@ -111,7 +111,7 @@ public abstract class AbstractStructureEditorTest extends AbstractEditorTest {
void getActions() {
actions = provider.getActions();
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) {
favorites.add((FavoritesAction) action);
}

View file

@ -107,7 +107,7 @@ public abstract class AbstractUnionEditorTest extends AbstractEditorTest {
void getActions() {
actions = provider.getActions();
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) {
favorites.add((FavoritesAction) action);
}

View file

@ -122,7 +122,7 @@ public class StructureEditorAlignmentTest extends AbstractStructureEditorTest {
addDataType(arrayDt);
// Check enablement.
CompositeEditorAction[] pActions = provider.getActions();
CompositeEditorTableAction[] pActions = provider.getActions();
for (int i = 0; i < pActions.length; i++) {
if ((pActions[i] instanceof FavoritesAction) ||
(pActions[i] instanceof CycleGroupAction) ||

View file

@ -101,7 +101,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
getModel().getOriginalCategoryPath().getPath());
assertEquals(getModel().getTypeName(), "Structure");
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) ||
(action instanceof PointerAction) || (action instanceof HexNumbersAction) ||
(action instanceof ApplyAction)) {
@ -151,7 +151,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
assertEquals(pgmBbCat.getCategoryPathName(),
getModel().getOriginalCategoryPath().getPath());
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) ||
(action instanceof PointerAction) || (action instanceof HexNumbersAction)) {
checkEnablement(action, true);
@ -187,7 +187,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
// Check enablement on first component selected.
setSelection(new int[] { 0 });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) {
FavoritesAction fav = (FavoritesAction) action;
int len = fav.getDataType().getLength();
@ -216,7 +216,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
// Check enablement on central component selected.
setSelection(new int[] { 3 });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) {
FavoritesAction fav = (FavoritesAction) action;
int len = fav.getDataType().getLength();
@ -246,7 +246,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
// Check enablement on last component selected.
setSelection(new int[] { last });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) {
checkEnablement(action, true);
}
@ -272,7 +272,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
// Check enablement on a contiguous multi-component selection.
setSelection(new int[] { 2, 3, 4 });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) {
FavoritesAction fav = (FavoritesAction) action;
int len = fav.getDataType().getLength();
@ -300,7 +300,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
// Check enablement on a non-contiguous multi-component selection.
setSelection(new int[] { 2, 3, 6, 7 });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if (action instanceof FavoritesAction) {
FavoritesAction fav = (FavoritesAction) action;
int len = fav.getDataType().getLength();

View file

@ -80,7 +80,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
assertEquals(model.getTypeName(), "Structure");
// Check enablement.
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) ||
(action instanceof PointerAction) || (action instanceof HexNumbersAction) ||
@ -114,7 +114,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
assertEquals(pgmBbCat.getCategoryPathName(), model.getOriginalCategoryPath().getPath());
// Check enablement on blank line selected.
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) ||
(action instanceof PointerAction) || (action instanceof HexNumbersAction)) {
@ -141,7 +141,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
// Check enablement on first component selected.
setSelection(new int[] { 0 });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) ||
(action instanceof InsertUndefinedAction) || (action instanceof MoveDownAction) ||
@ -180,7 +180,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
// Check enablement on central component selected.
runSwing(() -> setSelection(new int[] { 1 }));
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) ||
(action instanceof InsertUndefinedAction) || (action instanceof MoveDownAction) ||
@ -218,7 +218,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
// Check enablement on last component selected.
setSelection(new int[] { model.getNumComponents() - 1 });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) ||
(action instanceof InsertUndefinedAction) || (action instanceof MoveUpAction) ||
@ -261,7 +261,7 @@ public class StructureEditorUnlockedEnablementTest extends AbstractStructureEdit
// Check enablement on last component selected.
setSelection(new int[] { model.getNumComponents() });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof InsertUndefinedAction) ||
(action instanceof PointerAction) || (action instanceof HexNumbersAction)) {

View file

@ -54,7 +54,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
assertEquals(model.getTypeName(), "Union");
// Check enablement.
CompositeEditorAction[] pActions = provider.getActions();
CompositeEditorTableAction[] pActions = provider.getActions();
for (int i = 0; i < pActions.length; i++) {
if ((pActions[i] instanceof FavoritesAction) ||
(pActions[i] instanceof CycleGroupAction) ||
@ -92,7 +92,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
assertEquals(pgmBbCat.getCategoryPathName(), model.getOriginalCategoryPath().getPath());
// Check enablement on blank line selected.
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) || (action instanceof PointerAction) ||
(action instanceof HexNumbersAction)) {
@ -111,7 +111,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
// Check enablement on first component selected.
setSelection(new int[] { 0 });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) || (action instanceof MoveDownAction) ||
@ -134,7 +134,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
// Check enablement on central component selected.
setSelection(new int[] { 1 });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) || (action instanceof MoveUpAction) ||
@ -157,7 +157,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
// Check enablement on last component selected.
setSelection(new int[] { model.getNumComponents() - 1 });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof EditFieldAction) ||
(action instanceof ShowComponentPathAction) || (action instanceof MoveUpAction) ||
@ -180,7 +180,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
// Check enablement on a contiguous multi-component selection.
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
|| (action instanceof MoveDownAction) || (action instanceof MoveUpAction) ||
(action instanceof DeleteAction) || (action instanceof PointerAction) ||
@ -201,7 +201,7 @@ public class UnionEditorActions1Test extends AbstractUnionEditorTest {
// Check enablement on a non-contiguous multi-component selection.
setSelection(new int[] { 2, 3, 6, 7 });
for (CompositeEditorAction action : actions) {
for (CompositeEditorTableAction action : actions) {
if ((action instanceof FavoritesAction) || (action instanceof CycleGroupAction) ||
(action instanceof DeleteAction) || (action instanceof HexNumbersAction)) {
checkEnablement(action, true);

View file

@ -111,7 +111,7 @@ public class UnionEditorAlignmentTest extends AbstractUnionEditorTest {
addDataType(arrayDt);
// Check enablement.
CompositeEditorAction[] pActions = provider.getActions();
CompositeEditorTableAction[] pActions = provider.getActions();
for (int i = 0; i < pActions.length; i++) {
if ((pActions[i] instanceof FavoritesAction) ||
(pActions[i] instanceof CycleGroupAction) ||

View file

@ -279,7 +279,7 @@ public abstract class AbstractStackEditorTest extends AbstractEditorTest {
void getActions() {
actions = ((StackEditorProvider) provider).getActions();
for (CompositeEditorAction element : actions) {
for (CompositeEditorTableAction element : actions) {
if (element instanceof FavoritesAction) {
favorites.add((FavoritesAction) element);
}

View file

@ -202,7 +202,7 @@ class KeyBindingOverrideKeyEventDispatcher implements KeyEventDispatcher {
// note: this call has no effect if 'action' is null
SwingUtilities.notifyAction(action, keyStroke, event, event.getSource(),
event.getModifiers());
event.getModifiersEx());
}
return wasInProgress;
@ -254,8 +254,30 @@ class KeyBindingOverrideKeyEventDispatcher implements KeyEventDispatcher {
// }
// We've made the executive decision to allow all keys to go through to the text component
// unless they are modified with the 'Alt' key
return !event.isAltDown();
// unless they are modified with the 'Alt'/'Ctrl'/etc keys, unless they directly used
// by the text component
if (!isModified(event)) {
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
return hasRegisteredKeyBinding((JTextComponent) destination, event);
}
/**
* A test to see if the given event is modified in such a way as a text component would not
* handle the event
* @param e the event
* @return true if modified
*/
private boolean isModified(KeyEvent e) {
return e.isAltDown() || e.isAltGraphDown() || e.isMetaDown() || e.isControlDown();
}
private boolean hasRegisteredKeyBinding(JComponent c, KeyEvent event) {
KeyStroke keyStroke = KeyStroke.getKeyStrokeForEvent(event);
Action action = getJavaActionForComponent(c, keyStroke);
return action != null;
}
/**
@ -371,7 +393,7 @@ class KeyBindingOverrideKeyEventDispatcher implements KeyEventDispatcher {
Action action = getJavaActionForComponent(jComponent, keyStroke);
if (action != null) {
return SwingUtilities.notifyAction(action, keyStroke, keyEvent, keyEvent.getSource(),
keyEvent.getModifiers());
keyEvent.getModifiersEx());
}
return false;
}