@SuppressWarnings("unused")
	private TableChooserExecutor createTableExecutor() {

		TableChooserExecutor executor = new TableChooserExecutor() {

			@Override
			public String getButtonName() {
				return "Create Structure";
			}

			@Override
			public boolean execute(AddressableRowObject rowObject) {
				ConstUseLocation constLoc = (ConstUseLocation) rowObject;
				println("Follow Structure : " + rowObject.getAddress());

				Program cp = constLoc.getProgram();
				Address entry = constLoc.getAddress();

				println("Create Structure at " + entry);

				runScript("CreateStructure.java", cp, entry);
				return false; // don't remove row from display table
			}

			public void runScript(String name, Program prog, Address loc) {
				GhidraState scriptState = new GhidraState(state.getTool(), state.getProject(), prog,
					new ProgramLocation(prog, loc), null, null);
				try {
					ResourceFile scriptSource = GhidraScriptUtil.findScriptByName(name);
					if (scriptSource != null) {
						GhidraScriptProvider provider = GhidraScriptUtil.getProvider(scriptSource);
						GhidraScript script = provider.getScriptInstance(scriptSource, errorWriter);
						script.execute(scriptState, getControls());
						return;
					}
				}
				catch (Exception exc) {
					Msg.error(this, "Exception running script", exc);
				}
				throw new IllegalArgumentException("Script does not exist: " + name);
			}
		};
		return executor;
	}
Sample execution task Execution class called whenever the execute button
in the table is called. NOTE: the execute button is not setup, so this is
just and example

Useful if you are back tracking constants for malloc or calloc Runs
another script that will create a structure on the return variable of
calloc/malloc. It pulls a little trick when calling the CreateStructure
script by creating an artificial ScriptState. This is a useful technique
for other scripts as well.

@return the executor
Ghidra/Features/Decompiler/ghidra_scripts/ShowConstantUse.java