public static void perform(DockingActionIf action, ActionEvent event,
			DockingWindowManager windowManager) {

		if (windowManager == null) {
			// not sure if this can happen
			Msg.error(DockingActionPerformer.class,
				"No window manager found; unable to execute action: " + action.getFullName());
		}

		DockingWindowManager.clearMouseOverHelp();
		ActionContext context = windowManager.createActionContext(action);

		context.setSourceObject(event.getSource());
		context.setEventClickModifiers(event.getModifiers());

		// this gives the UI some time to repaint before executing the action
		Swing.runLater(() -> {
			windowManager.setStatusText("");
			if (action.isValidContext(context) && action.isEnabledForContext(context)) {
				if (action instanceof ToggleDockingActionIf) {
					ToggleDockingActionIf toggleAction = ((ToggleDockingActionIf) action);
					toggleAction.setSelected(!toggleAction.isSelected());
				}
				action.actionPerformed(context);
			}
		});
	}
Executes the given action later on the Swing thread.
@param action the action.
@param event the event that triggered the action.
@param windowManager the window manager containing the action being processed.
Ghidra/Framework/Docking/src/main/java/docking/DockingActionPerformer.java