private void createActions() {

		String expandMenu = Integer.toString(1);
		String selectionMenuGroup = Integer.toString(2);
		String goToMenu = Integer.toString(3);

		String homeToolbarGroup = Integer.toString(1);
		String filterOptionsToolbarGroup = Integer.toString(2);
		String navigationOptionsToolbarGroup = Integer.toString(3);
		String ownerName = plugin.getName();

		//@formatter:off
		
		//
		// fully expand
		//
		new ActionBuilder(EXPAND_ACTION_NAME, ownerName)
			//.description("Make program selection of function starts from selected rows")
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Context_Action_Expand_Nodes"))
			//.toolBarIcon(SELECT_FUNCTIONS_ICON)
			.popupMenuIcon(EXPAND_ICON)
			.popupMenuPath("Expand Nodes to Depth Limit")
			.popupMenuGroup(expandMenu) 
			.popupWhen(c -> isValidContext(c, Condition.EITHER))
			.enabledWhen(c -> isValidContext(c, Condition.EITHER))
			.onAction(c -> expandToDepth(c))
			.buildAndInstallLocal(this)
			;

		//
		// collapse all
		//
		new ActionBuilder("Collapse All", ownerName)
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Context_Action_Collapse_Nodes"))
			.popupMenuIcon(COLLAPSE_ICON)
			.popupMenuPath("Collapse All Nodes")
			.popupMenuGroup(expandMenu) 
			.popupWhen(c -> getSelectedPaths(c) != null)
			.enabledWhen(c -> isValidContextSel(c, Condition.EITHER))
			.onAction(c -> collapseAll(c))
			.buildAndInstallLocal(this)
			;
		
		//
		// goto
		//
		new ActionBuilder("Go To Destination", ownerName)
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Context_Action_Goto_Destination"))
			.popupMenuPath("Go To Call Destination")
			.popupMenuGroup(goToMenu) 
			.popupWhen(c -> addToPopupNotRoot(c))
			.enabledWhen(c -> isValidContextSel(c, Condition.OUT))
			.onAction(c -> gotToDest(c))
			.buildAndInstallLocal(this)
			;
		
		new ActionBuilder("Go To Source", ownerName)
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Context_Action_Goto_Source"))
			.popupMenuPath("Go To Call Source")
			.popupMenuGroup(goToMenu) 
			.popupWhen(c -> addToPopupNotRoot(c))
			.enabledWhen(c -> isValidContextSel(c, Condition.EITHER))
			.onAction(c -> gotToSrc(c))
			.buildAndInstallLocal(this)
			;
		
		//
		// recurse depth		
		//
		new ActionBuilder("Recurse Depth", ownerName)
			.description("<html>Recurse Depth<br><br>Limits the depth to " + "which recursing tree operations" +
					"<br> will go.  Example operations include <b>Expand All</b> and filtering")
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Action_Recurse_Depth"))
			.toolBarGroup(filterOptionsToolbarGroup, "2")
			.toolBarIcon(new NumberIcon(recurseDepth.get()))
			.onAction(c -> recurseDepth(c))
			.buildAndInstallLocal(this)
			;
	
		//
		// selection actions
		//
		new ActionBuilder("Select Call Source", ownerName)
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Context_Action_Select_Source"))
			.popupMenuIcon(new GIcon("icon.plugin.calltree.filter.select.source"))
			.popupMenuPath("Select Call Source")
			.popupMenuGroup(selectionMenuGroup) 
			.popupWhen(c -> addToPopupMult(c))
			.enabledWhen(c -> isValidContextMult(c, Condition.EITHER))
			.onAction(c -> makeSelectionFromPaths(c, true))
			.buildAndInstallLocal(this)
			;
	
		new ActionBuilder("Select Call Destination", ownerName)
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Context_Action_Select_Destination"))
			.popupMenuIcon(new GIcon("icon.plugin.calltree.filter.select.source"))
			.popupMenuPath("Select Call Destination")
			.popupMenuGroup(selectionMenuGroup) 
			.popupWhen(c -> addToPopupMult(c))
			.enabledWhen(c -> isValidContextMult(c, Condition.OUT))
			.onAction(c -> makeSelectionFromPaths(c, false))
			.buildAndInstallLocal(this)
			;

		//
		// home button
		//
		new ActionBuilder("Home", ownerName)
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Action_Home"))
			.toolBarGroup(homeToolbarGroup)
			.toolBarIcon(Icons.HOME_ICON)
			.enabledWhen(c -> currentFunction != null)
			.onAction(c -> home(c))
			.buildAndInstallLocal(this)
			;

		refreshAction = new ActionBuilder("Refresh", ownerName)
			.description("<html>Push at any time to refresh the current trees.<br> This is highlighted when the data <i>may</i> be stale.<br>")
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Action_Refresh"))
			.toolBarGroup(homeToolbarGroup)
			.toolBarIcon(REFRESH_NOT_NEEDED_ICON)
			.enabledWhen(c -> true)
			.onAction(c -> reloadUpdateManager.updateNow())
			.buildAndInstallLocal(this)
			;

		//
		// filter duplicates action
		//
		filterDuplicates = new ToggleActionBuilder("Filter Duplicates", ownerName)
			.description("<html>Push at any time to refresh the current trees.<br> This is highlighted when the data <i>may</i> be stale.<br>")
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Action_Filter"))
			.toolBarGroup(filterOptionsToolbarGroup, "1")
			.toolBarIcon(new GIcon("icon.plugin.calltree.filter.duplicates"))
			.selected(true)
			.onAction(c -> doUpdate())
			.buildAndInstallLocal(this)
			;

		//
		// navigate outgoing nodes on selection
		//
		navigationOutgoingAction = new ToggleActionBuilder("Navigate Outgoing Nodes", ownerName)
			.description("<html>Outgoing Navigation<br><br> Toggled <b>on</b> triggers node selections<br>in the tree to navigate the Listing to<br>the <b>source</b> location of the call")
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Action_Navigation"))
			.toolBarGroup(navigationOptionsToolbarGroup, "1")
			.toolBarIcon(Icons.NAVIGATE_ON_OUTGOING_EVENT_ICON)
			.selected(true)
			.onAction(c -> {
					//IGNORE
				})
			.buildAndInstallLocal(this)
			;

		//
		// navigate incoming nodes on selection
		//
		navigationIncomingAction = new ToggleActionBuilder("Navigate Incoming Location Changes", ownerName)
			.description(HTMLUtilities.toHTML("Incoming Navigation" +
					"<br><br>Toggle <b>On</b>  - change the displayed " +
					"function on Listing navigation events" +
					"<br>Toggled <b>Off</b> - don't change the displayed function on Listing navigation events"))
			.helpLocation(new HelpLocation(ownerName, "Call_Tree_Action_Incoming_Navigation"))
			.toolBarGroup(navigationOptionsToolbarGroup, "2")
			.toolBarIcon(Icons.NAVIGATE_ON_INCOMING_EVENT_ICON)
			.selected(isPrimary)
			.onAction(c -> {
				if (navigationIncomingAction.isSelected()) {
					setLocation(plugin.getCurrentLocation());
				}})
			.buildAndInstallLocal(this)
			;
		
		//@formatter:on
	}
A variable used to restrict open-ended operations, like expanding all nodes or filtering.
Ghidra/Features/DecompilerDependent/src/main/java/ghidra/app/plugin/core/decompiler/taint/TaintSliceTreeProvider.java