Skip to content

Commit e65ccd9

Browse files
committed
Merge remote-tracking branch 'origin/GT-3338-dragonmacher-key-binding-warning'
2 parents bbacb43 + b883c67 commit e65ccd9

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

Ghidra/Framework/Docking/src/main/java/docking/action/DockingAction.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,6 @@ public DockingAction(String name, String owner, boolean supportsKeyBindings) {
9292
supportsKeyBindings ? KeyBindingType.INDIVIDUAL : KeyBindingType.UNSUPPORTED;
9393
}
9494

95-
protected KeyBindingType getPreferredKeyBindingType() {
96-
return KeyBindingType.INDIVIDUAL;
97-
}
98-
9995
@Override
10096
public abstract void actionPerformed(ActionContext context);
10197

@@ -286,6 +282,11 @@ public KeyBindingData getDefaultKeyBindingData() {
286282

287283
@Override
288284
public void setKeyBindingData(KeyBindingData newKeyBindingData) {
285+
286+
if (!supportsKeyBinding(newKeyBindingData)) {
287+
return;
288+
}
289+
289290
KeyBindingData oldData = keyBindingData;
290291
keyBindingData = KeyBindingData.validateKeyBindingData(newKeyBindingData);
291292

@@ -296,6 +297,22 @@ public void setKeyBindingData(KeyBindingData newKeyBindingData) {
296297
firePropertyChanged(KEYBINDING_DATA_PROPERTY, oldData, keyBindingData);
297298
}
298299

300+
private boolean supportsKeyBinding(KeyBindingData kbData) {
301+
302+
KeyBindingType type = getKeyBindingType();
303+
if (type.supportsKeyBindings()) {
304+
return true;
305+
}
306+
307+
if (kbData.getKeyBindingPrecedence() == KeyBindingPrecedence.ReservedActionsLevel) {
308+
return true; // reserved actions are special
309+
}
310+
311+
// log a trace message instead of throwing an exception, as to not break any legacy code
312+
Msg.error(this, "Action does not support key bindings: " + getFullName(), new Throwable());
313+
return false;
314+
}
315+
299316
@Override
300317
public void setUnvalidatedKeyBindingData(KeyBindingData newKeyBindingData) {
301318
KeyBindingData oldData = keyBindingData;

Ghidra/Framework/Docking/src/main/java/docking/action/KeyBindingType.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ public enum KeyBindingType {
4545
* <p>Most actions will not be shared. If you are unsure if your action
4646
* should use a shared keybinding, then do not do so.
4747
*/
48-
4948
SHARED;
5049
//@formatter:on
5150

Ghidra/Framework/Docking/src/test.slow/java/docking/actions/SharedKeyBindingDockingActionTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,21 @@ public void testNonSharedKeyBinding_DifferentActionsWithSameFullName() {
390390
assertActionNotInTool(action1Copy);
391391
}
392392

393+
@Test
394+
public void testNonKeyBindingAction_CannotSetKeyBinding() {
395+
396+
DockingAction action = new DockingAction("Test Action", "Test Action Owner", false) {
397+
@Override
398+
public void actionPerformed(ActionContext context) {
399+
// stub
400+
}
401+
};
402+
403+
action.setKeyBindingData(new KeyBindingData(DEFAULT_KS_1));
404+
assertNull(action.getKeyBindingData());
405+
spyLogger.assertLogMessage("does", "not", "support", "bindings");
406+
}
407+
393408
//==================================================================================================
394409
// Private Methods
395410
//==================================================================================================

0 commit comments

Comments
 (0)