GP-3667 Cleaning up weird behavior of GraphDisplayOptions to register options when given a tool

This commit is contained in:
ghidragon 2023-07-25 12:26:07 -04:00
parent 718b228c30
commit 04fa097f58
34 changed files with 176 additions and 161 deletions

View file

@ -24,6 +24,7 @@ import javax.swing.*;
import docking.ActionContext; import docking.ActionContext;
import docking.action.*; import docking.action.*;
import docking.options.OptionsService;
import docking.widgets.checkbox.GCheckBox; import docking.widgets.checkbox.GCheckBox;
import docking.widgets.filechooser.GhidraFileChooserPanel; import docking.widgets.filechooser.GhidraFileChooserPanel;
import docking.widgets.table.GFilterTable; import docking.widgets.table.GFilterTable;
@ -31,7 +32,6 @@ import generic.theme.GIcon;
import ghidra.framework.options.OptionsChangeListener; import ghidra.framework.options.OptionsChangeListener;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.ComponentProviderAdapter; import ghidra.framework.plugintool.ComponentProviderAdapter;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.util.*; import ghidra.util.*;
import ghidra.util.classfinder.ClassSearcher; import ghidra.util.classfinder.ClassSearcher;
import ghidra.util.layout.MiddleLayout; import ghidra.util.layout.MiddleLayout;

View file

@ -20,6 +20,7 @@ import java.util.*;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
import docking.options.OptionsService;
import docking.widgets.OptionDialog; import docking.widgets.OptionDialog;
import generic.jar.ResourceFile; import generic.jar.ResourceFile;
import ghidra.app.CorePluginPackage; import ghidra.app.CorePluginPackage;
@ -31,7 +32,6 @@ import ghidra.framework.main.AppInfo;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.PluginInfo; import ghidra.framework.plugintool.PluginInfo;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.framework.plugintool.util.PluginStatus; import ghidra.framework.plugintool.util.PluginStatus;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.SystemUtilities; import ghidra.util.SystemUtilities;

View file

@ -15,11 +15,11 @@
*/ */
package ghidra.app.plugin.core.navigation; package ghidra.app.plugin.core.navigation;
import docking.options.OptionsService;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.framework.options.OptionsChangeListener; import ghidra.framework.options.OptionsChangeListener;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
public class NavigationOptions implements OptionsChangeListener { public class NavigationOptions implements OptionsChangeListener {

View file

@ -20,6 +20,7 @@ import java.awt.Component;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import docking.options.OptionsService;
import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.app.util.viewer.options.OptionsGui; import ghidra.app.util.viewer.options.OptionsGui;
@ -27,7 +28,6 @@ import ghidra.app.util.viewer.options.ScreenElement;
import ghidra.framework.options.OptionsChangeListener; import ghidra.framework.options.OptionsChangeListener;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.database.symbol.FunctionSymbol; import ghidra.program.database.symbol.FunctionSymbol;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;

View file

@ -17,10 +17,10 @@ package ghidra.app.util.viewer.field;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import docking.options.OptionsService;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.listing.CodeUnitFormat; import ghidra.program.model.listing.CodeUnitFormat;
/** /**

View file

@ -19,6 +19,7 @@ import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import docking.options.OptionsService;
import ghidra.app.nav.Navigatable; import ghidra.app.nav.Navigatable;
import ghidra.app.nav.NavigationUtils; import ghidra.app.nav.NavigationUtils;
import ghidra.app.plugin.core.navigation.NavigationOptions; import ghidra.app.plugin.core.navigation.NavigationOptions;
@ -27,7 +28,6 @@ import ghidra.app.services.GoToService;
import ghidra.app.util.PseudoDisassembler; import ghidra.app.util.PseudoDisassembler;
import ghidra.app.util.query.TableService; import ghidra.app.util.query.TableService;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressSpace; import ghidra.program.model.address.AddressSpace;
import ghidra.program.model.data.Playable; import ghidra.program.model.data.Playable;

View file

@ -28,6 +28,7 @@ import docking.*;
import docking.action.*; import docking.action.*;
import docking.menu.ActionState; import docking.menu.ActionState;
import docking.menu.MultiStateDockingAction; import docking.menu.MultiStateDockingAction;
import docking.options.OptionsService;
import docking.widgets.EventTrigger; import docking.widgets.EventTrigger;
import docking.widgets.fieldpanel.FieldPanel; import docking.widgets.fieldpanel.FieldPanel;
import docking.widgets.fieldpanel.field.Field; import docking.widgets.fieldpanel.field.Field;
@ -50,7 +51,6 @@ import ghidra.app.util.viewer.util.*;
import ghidra.framework.options.*; import ghidra.framework.options.*;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.ServiceProviderDecorator; import ghidra.framework.plugintool.ServiceProviderDecorator;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.correlate.HashedFunctionAddressCorrelation; import ghidra.program.model.correlate.HashedFunctionAddressCorrelation;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;

View file

@ -21,6 +21,7 @@ import static ghidra.service.graph.VertexShape.*;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.service.graph.GraphDisplayOptions; import ghidra.service.graph.GraphDisplayOptions;
import ghidra.service.graph.VertexShape; import ghidra.service.graph.VertexShape;
import ghidra.util.HelpLocation;
/** /**
* {@link GraphDisplayOptions} for {@link ProgramGraphType} * {@link GraphDisplayOptions} for {@link ProgramGraphType}
@ -33,7 +34,8 @@ public class ProgramGraphDisplayOptions extends GraphDisplayOptions {
* @param tool if non-null, will load values from tool options * @param tool if non-null, will load values from tool options
*/ */
public ProgramGraphDisplayOptions(ProgramGraphType graphType, PluginTool tool) { public ProgramGraphDisplayOptions(ProgramGraphType graphType, PluginTool tool) {
super(graphType, tool); super(graphType, tool,
new HelpLocation("ProgramGraphPlugin", "Program Graphs Display Options"));
} }
@Override @Override

View file

@ -20,10 +20,10 @@ import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import docking.options.OptionsService;
import ghidra.framework.options.OptionsChangeListener; import ghidra.framework.options.OptionsChangeListener;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.framework.plugintool.util.OptionsService;
/** /**
* BrowserLoader opens a web browser and displays the given url. * BrowserLoader opens a web browser and displays the given url.

View file

@ -25,10 +25,10 @@
import java.util.Iterator; import java.util.Iterator;
import docking.options.OptionsService;
import ghidra.app.decompiler.*; import ghidra.app.decompiler.*;
import ghidra.app.script.GhidraScript; import ghidra.app.script.GhidraScript;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;
import ghidra.program.model.pcode.HighFunction; import ghidra.program.model.pcode.HighFunction;

View file

@ -25,13 +25,13 @@
import java.util.*; import java.util.*;
import docking.options.OptionsService;
import generic.jar.ResourceFile; import generic.jar.ResourceFile;
import ghidra.app.decompiler.*; import ghidra.app.decompiler.*;
import ghidra.app.decompiler.component.DecompilerUtils; import ghidra.app.decompiler.component.DecompilerUtils;
import ghidra.app.script.*; import ghidra.app.script.*;
import ghidra.app.tablechooser.*; import ghidra.app.tablechooser.*;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressSpace; import ghidra.program.model.address.AddressSpace;
import ghidra.program.model.lang.Register; import ghidra.program.model.lang.Register;

View file

@ -31,7 +31,6 @@ import ghidra.app.decompiler.*;
import ghidra.app.script.GhidraScript; import ghidra.app.script.GhidraScript;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.data.*; import ghidra.program.model.data.*;
import ghidra.program.model.lang.PrototypeModel; import ghidra.program.model.lang.PrototypeModel;
@ -42,6 +41,8 @@ import ghidra.util.exception.*;
import java.util.*; import java.util.*;
import docking.options.OptionsService;
public class StringParameterPropagator extends GhidraScript { public class StringParameterPropagator extends GhidraScript {
// TODO!! Error handling needs a lot of work !! // TODO!! Error handling needs a lot of work !!

View file

@ -31,11 +31,11 @@ import java.util.*;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import docking.options.OptionsService;
import ghidra.app.decompiler.*; import ghidra.app.decompiler.*;
import ghidra.app.script.GhidraScript; import ghidra.app.script.GhidraScript;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;
import ghidra.program.model.pcode.*; import ghidra.program.model.pcode.*;

View file

@ -15,12 +15,12 @@
*/ */
//DO NOT RUN. THIS IS NOT A SCRIPT! THIS IS A CLASS THAT IS USED BY SCRIPTS. //DO NOT RUN. THIS IS NOT A SCRIPT! THIS IS A CLASS THAT IS USED BY SCRIPTS.
package classrecovery; package classrecovery;
import docking.options.OptionsService;
import ghidra.app.decompiler.DecompInterface; import ghidra.app.decompiler.DecompInterface;
import ghidra.app.decompiler.DecompileOptions; import ghidra.app.decompiler.DecompileOptions;
import ghidra.app.decompiler.DecompileResults; import ghidra.app.decompiler.DecompileResults;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.data.DataType; import ghidra.program.model.data.DataType;
import ghidra.program.model.data.ParameterDefinition; import ghidra.program.model.data.ParameterDefinition;

View file

@ -18,9 +18,9 @@ package ghidra.app.plugin.core.decompile.actions;
import docking.ActionContext; import docking.ActionContext;
import docking.action.DockingAction; import docking.action.DockingAction;
import docking.action.MenuData; import docking.action.MenuData;
import docking.options.OptionsService;
import ghidra.app.util.HelpTopics; import ghidra.app.util.HelpTopics;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
public class EditPropertiesAction extends DockingAction { public class EditPropertiesAction extends DockingAction {

View file

@ -18,13 +18,13 @@ package ghidra.app.plugin.core.decompile.actions;
import java.util.*; import java.util.*;
import java.util.Map.Entry; import java.util.Map.Entry;
import docking.options.OptionsService;
import ghidra.app.cmd.label.RenameLabelCmd; import ghidra.app.cmd.label.RenameLabelCmd;
import ghidra.app.decompiler.*; import ghidra.app.decompiler.*;
import ghidra.framework.cmd.BackgroundCommand; import ghidra.framework.cmd.BackgroundCommand;
import ghidra.framework.model.DomainObject; import ghidra.framework.model.DomainObject;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressSet; import ghidra.program.model.address.AddressSet;
import ghidra.program.model.data.*; import ghidra.program.model.data.*;

View file

@ -18,8 +18,10 @@ package ghidra.app.plugin.core.decompile.actions;
import static ghidra.app.plugin.core.decompile.actions.PCodeDfgGraphType.*; import static ghidra.app.plugin.core.decompile.actions.PCodeDfgGraphType.*;
import static ghidra.service.graph.VertexShape.*; import static ghidra.service.graph.VertexShape.*;
import ghidra.app.util.HelpTopics;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.service.graph.*; import ghidra.service.graph.*;
import ghidra.util.HelpLocation;
/** /**
* {@link GraphDisplayOptions} for {@link PCodeDfgGraphType} * {@link GraphDisplayOptions} for {@link PCodeDfgGraphType}
@ -48,7 +50,8 @@ public class PCodeDfgDisplayOptions extends GraphDisplayOptions {
* @param tool if non-null, will load values from tool options * @param tool if non-null, will load values from tool options
*/ */
public PCodeDfgDisplayOptions(PluginTool tool) { public PCodeDfgDisplayOptions(PluginTool tool) {
super(new PCodeDfgGraphType(), tool); super(new PCodeDfgGraphType(), tool,
new HelpLocation(HelpTopics.DECOMPILER, "DataFlowGraph"));
} }
@Override @Override

View file

@ -20,6 +20,7 @@ import java.util.*;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import docking.options.OptionsService;
import generic.cache.CachingPool; import generic.cache.CachingPool;
import generic.cache.CountingBasicFactory; import generic.cache.CountingBasicFactory;
import generic.concurrent.QCallback; import generic.concurrent.QCallback;
@ -31,7 +32,6 @@ import ghidra.app.decompiler.parallel.ParallelDecompiler;
import ghidra.app.util.*; import ghidra.app.util.*;
import ghidra.framework.model.DomainObject; import ghidra.framework.model.DomainObject;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressSetView; import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.data.*; import ghidra.program.model.data.*;

View file

@ -19,11 +19,11 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import docking.options.OptionsService;
import ghidra.app.decompiler.ClangToken; import ghidra.app.decompiler.ClangToken;
import ghidra.app.decompiler.DecompileOptions.NamespaceStrategy; import ghidra.app.decompiler.DecompileOptions.NamespaceStrategy;
import ghidra.app.plugin.core.decompile.AbstractDecompilerTest; import ghidra.app.plugin.core.decompile.AbstractDecompilerTest;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.util.OptionsService;
public class DecompilerClang2Test extends AbstractDecompilerTest { public class DecompilerClang2Test extends AbstractDecompilerTest {

View file

@ -30,6 +30,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import docking.options.OptionsService;
import docking.options.editor.GhidraColorChooser; import docking.options.editor.GhidraColorChooser;
import docking.widgets.dialogs.InputDialog; import docking.widgets.dialogs.InputDialog;
import docking.widgets.fieldpanel.FieldPanel; import docking.widgets.fieldpanel.FieldPanel;
@ -44,7 +45,6 @@ import ghidra.app.plugin.core.decompile.DecompilerProvider;
import ghidra.app.plugin.core.decompile.actions.*; import ghidra.app.plugin.core.decompile.actions.*;
import ghidra.app.util.AddEditDialog; import ghidra.app.util.AddEditDialog;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.listing.CodeUnit; import ghidra.program.model.listing.CodeUnit;
public class DecompilerClangTest extends AbstractDecompilerTest { public class DecompilerClangTest extends AbstractDecompilerTest {

View file

@ -18,9 +18,9 @@ package ghidra.app.plugin.core.decompile;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import docking.options.OptionsService;
import ghidra.app.decompiler.DecompileOptions.NamespaceStrategy; import ghidra.app.decompiler.DecompileOptions.NamespaceStrategy;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.util.OptionsService;
/** /**
* This test is very similar in concept to {@link DecompilerFindReferencesToActionTest}, * This test is very similar in concept to {@link DecompilerFindReferencesToActionTest},

View file

@ -27,6 +27,7 @@ import docking.DockingUtils;
import docking.action.*; import docking.action.*;
import docking.menu.ActionState; import docking.menu.ActionState;
import docking.menu.MultiStateDockingAction; import docking.menu.MultiStateDockingAction;
import docking.options.OptionsService;
import docking.widgets.EventTrigger; import docking.widgets.EventTrigger;
import docking.widgets.OptionDialog; import docking.widgets.OptionDialog;
import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.Graph;
@ -42,7 +43,6 @@ import ghidra.app.plugin.core.functiongraph.mvc.FGController;
import ghidra.app.plugin.core.functiongraph.mvc.FGData; import ghidra.app.plugin.core.functiongraph.mvc.FGData;
import ghidra.framework.options.SaveState; import ghidra.framework.options.SaveState;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.AddressSet; import ghidra.program.model.address.AddressSet;
import ghidra.program.model.address.AddressSetView; import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.listing.Function; import ghidra.program.model.listing.Function;

View file

@ -21,6 +21,7 @@ import javax.swing.Icon;
import org.jdom.Element; import org.jdom.Element;
import docking.options.OptionsService;
import docking.tool.ToolConstants; import docking.tool.ToolConstants;
import generic.theme.GIcon; import generic.theme.GIcon;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
@ -38,7 +39,6 @@ import ghidra.framework.model.DomainFile;
import ghidra.framework.options.*; import ghidra.framework.options.*;
import ghidra.framework.plugintool.PluginInfo; import ghidra.framework.plugintool.PluginInfo;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.framework.plugintool.util.PluginStatus; import ghidra.framework.plugintool.util.PluginStatus;
import ghidra.graph.viewer.options.VisualGraphOptions; import ghidra.graph.viewer.options.VisualGraphOptions;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;

View file

@ -28,6 +28,7 @@ import javax.swing.SwingUtilities;
import com.google.common.cache.*; import com.google.common.cache.*;
import docking.options.OptionsService;
import docking.widgets.EventTrigger; import docking.widgets.EventTrigger;
import docking.widgets.fieldpanel.support.FieldLocation; import docking.widgets.fieldpanel.support.FieldLocation;
import docking.widgets.fieldpanel.support.Highlight; import docking.widgets.fieldpanel.support.Highlight;
@ -50,7 +51,6 @@ import ghidra.app.util.viewer.listingpanel.*;
import ghidra.framework.options.SaveState; import ghidra.framework.options.SaveState;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.graph.viewer.*; import ghidra.graph.viewer.*;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;

View file

@ -49,16 +49,12 @@ import docking.action.ToggleDockingAction;
import docking.action.builder.*; import docking.action.builder.*;
import docking.menu.ActionState; import docking.menu.ActionState;
import docking.menu.MultiStateDockingAction; import docking.menu.MultiStateDockingAction;
import docking.options.editor.OptionsDialog;
import docking.widgets.EventTrigger; import docking.widgets.EventTrigger;
import docking.widgets.OptionDialog; import docking.widgets.OptionDialog;
import generic.theme.GColor; import generic.theme.GColor;
import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.graph.AttributeFilters; import ghidra.graph.AttributeFilters;
import ghidra.graph.job.GraphJobRunner; import ghidra.graph.job.GraphJobRunner;
import ghidra.graph.viewer.popup.*; import ghidra.graph.viewer.popup.*;
@ -166,7 +162,7 @@ public class DefaultGraphDisplay implements GraphDisplay {
private SelectedEdgePaintable<AttributedVertex, AttributedEdge> selectedEdgePaintable; private SelectedEdgePaintable<AttributedVertex, AttributedEdge> selectedEdgePaintable;
private GraphDisplayOptions graphDisplayOptions = GraphDisplayOptions.DEFAULT; private GraphDisplayOptions graphDisplayOptions = new DefaultGraphDisplayOptions();
private ChangeListener graphDisplayOptionsChangeListener; private ChangeListener graphDisplayOptionsChangeListener;
@ -524,30 +520,8 @@ public class DefaultGraphDisplay implements GraphDisplay {
} }
private void editGraphDisplayOptions() { private void editGraphDisplayOptions() {
String rootOptionsName = graphDisplayOptions.getRootOptionsName(); HelpLocation help = new HelpLocation("GraphServices", "Graph Type Display Options");
String relativePath = rootOptionsName + ".Vertex Colors"; graphDisplayOptions.displayEditor(tool, help);
// if the options are registered in the tool options, just show them
// otherwise, create a transient options and create an options dialog. This will
// allow the user to edit the options for the current graph instance.
if (graphDisplayOptions.isRegisteredWithTool()) {
OptionsService service = tool.getService(OptionsService.class);
service.showOptionsDialog("Graph." + relativePath, "");
}
else {
ToolOptions transientOptions = new ToolOptions("Graph");
HelpLocation help = new HelpLocation("GraphServices", "Graph Type Display Options");
graphDisplayOptions.registerOptions(transientOptions, help);
transientOptions.addOptionsChangeListener(graphDisplayOptions);
Options[] optionsArray = new Options[] { transientOptions };
String dialogTitle = "Graph Instance Settings (Not Saved in Tool Options)";
OptionsDialog dialog = new OptionsDialog(dialogTitle, "Graph", optionsArray, null);
// we have one less level for these transient tool options, so no need to prepend "graph."
dialog.displayCategory(relativePath, "");
tool.showDialog(dialog, componentProvider);
dialog.dispose();
}
} }
private void groupSelectedVertices() { private void groupSelectedVertices() {

View file

@ -111,12 +111,9 @@ public class ProgramGraphPlugin extends ProgramPlugin
} }
private void registerProgramFlowGraphDisplayOptionsWithTool() { private void registerProgramFlowGraphDisplayOptionsWithTool() {
ProgramGraphDisplayOptions displayOptions = // We don't need one of this right now, but creating it will make sure it
new ProgramGraphDisplayOptions(new BlockFlowGraphType(), null); // shows up in the tool options
new ProgramGraphDisplayOptions(new BlockFlowGraphType(), tool);
// this will register Program Flow Graph Type options with the tool
HelpLocation help = new HelpLocation(getName(), "Program Graphs Display Options");
displayOptions.registerOptions(tool.getOptions("Graph"), help);
} }
private void intializeOptions() { private void intializeOptions() {
@ -188,79 +185,75 @@ public class ProgramGraphPlugin extends ProgramPlugin
private void createActions() { private void createActions() {
new ActionBuilder("Graph Block Flow", getName()) new ActionBuilder("Graph Block Flow", getName()).menuPath(MENU_GRAPH, "&Block Flow")
.menuPath(MENU_GRAPH, "&Block Flow") .menuGroup(MENU_GRAPH, "A")
.menuGroup(MENU_GRAPH, "A") .onAction(c -> graphBlockFlow())
.onAction(c -> graphBlockFlow()) .enabledWhen(this::canGraph)
.enabledWhen(this::canGraph) .buildAndInstall(tool);
.buildAndInstall(tool);
new ActionBuilder("Graph Code Flow", getName()) new ActionBuilder("Graph Code Flow", getName()).menuPath(MENU_GRAPH, "C&ode Flow")
.menuPath(MENU_GRAPH, "C&ode Flow") .menuGroup(MENU_GRAPH, "B")
.menuGroup(MENU_GRAPH, "B") .onAction(c -> graphCodeFlow())
.onAction(c -> graphCodeFlow()) .enabledWhen(this::canGraph)
.enabledWhen(this::canGraph) .buildAndInstall(tool);
.buildAndInstall(tool);
new ActionBuilder("Graph Calls Using Default Model", getName()) new ActionBuilder("Graph Calls Using Default Model", getName())
.menuPath(MENU_GRAPH, "&Calls") .menuPath(MENU_GRAPH, "&Calls")
.menuGroup(MENU_GRAPH, "C") .menuGroup(MENU_GRAPH, "C")
.onAction(c -> createDefaultCallGraph()) .onAction(c -> createDefaultCallGraph())
.enabledWhen(this::canGraph) .enabledWhen(this::canGraph)
.buildAndInstall(tool); .buildAndInstall(tool);
tool.setMenuGroup(new String[] { MENU_GRAPH, "Data" }, "Graph", "Data"); tool.setMenuGroup(new String[] { MENU_GRAPH, "Data" }, "Graph", "Data");
HelpLocation helpLoc = new HelpLocation(getName(), "Data_Reference_Graph"); HelpLocation helpLoc = new HelpLocation(getName(), "Data_Reference_Graph");
new ActionBuilder("Graph To/From Data References", getName()) new ActionBuilder("Graph To/From Data References", getName())
.menuPath(MENU_GRAPH, "Data", "To/From &References") .menuPath(MENU_GRAPH, "Data", "To/From &References")
.menuGroup(MENU_GRAPH, "Data") .menuGroup(MENU_GRAPH, "Data")
.helpLocation(helpLoc) .helpLocation(helpLoc)
.onAction(c -> graphDataReferences()) .onAction(c -> graphDataReferences())
.enabledWhen(this::canGraph) .enabledWhen(this::canGraph)
.buildAndInstall(tool); .buildAndInstall(tool);
new ActionBuilder("Graph To Data References", getName()) new ActionBuilder("Graph To Data References", getName())
.menuPath(MENU_GRAPH, "Data", "&To References") .menuPath(MENU_GRAPH, "Data", "&To References")
.menuGroup(MENU_GRAPH, "Data") .menuGroup(MENU_GRAPH, "Data")
.helpLocation(helpLoc) .helpLocation(helpLoc)
.onAction(c -> graphToDataReferences()) .onAction(c -> graphToDataReferences())
.enabledWhen(this::canGraph) .enabledWhen(this::canGraph)
.buildAndInstall(tool); .buildAndInstall(tool);
new ActionBuilder("Graph From Data References", getName()) new ActionBuilder("Graph From Data References", getName())
.menuPath(MENU_GRAPH, "Data", "&From References") .menuPath(MENU_GRAPH, "Data", "&From References")
.menuGroup(MENU_GRAPH, "Data") .menuGroup(MENU_GRAPH, "Data")
.helpLocation(helpLoc) .helpLocation(helpLoc)
.onAction(c -> graphFromDataReferences()) .onAction(c -> graphFromDataReferences())
.enabledWhen(this::canGraph) .enabledWhen(this::canGraph)
.buildAndInstall(tool); .buildAndInstall(tool);
reuseGraphAction = reuseGraphAction =
new ToggleActionBuilder("Reuse Graph", getName()) new ToggleActionBuilder("Reuse Graph", getName()).menuPath(MENU_GRAPH, "Reuse Graph")
.menuPath(MENU_GRAPH, "Reuse Graph") .menuGroup("Graph Options")
.menuGroup("Graph Options") .selected(reuseGraph)
.selected(reuseGraph) .onAction(c -> reuseGraph = reuseGraphAction.isSelected())
.onAction(c -> reuseGraph = reuseGraphAction.isSelected()) .enabledWhen(this::canGraph)
.enabledWhen(this::canGraph) .buildAndInstall(tool);
.buildAndInstall(tool);
appendGraphAction = appendGraphAction =
new ToggleActionBuilder("Append Graph", getName()) new ToggleActionBuilder("Append Graph", getName()).menuPath(MENU_GRAPH, "Append Graph")
.menuPath(MENU_GRAPH, "Append Graph") .menuGroup("Graph Options")
.menuGroup("Graph Options") .selected(false)
.selected(false) .onAction(c -> updateAppendAndReuseGraph())
.onAction(c -> updateAppendAndReuseGraph()) .enabledWhen(this::canGraph)
.enabledWhen(this::canGraph) .buildAndInstall(tool);
.buildAndInstall(tool);
forceLocationVisibleAction = new ToggleActionBuilder("Show Location in Graph", getName()) forceLocationVisibleAction = new ToggleActionBuilder("Show Location in Graph", getName())
.menuPath(MENU_GRAPH, "Show Location") .menuPath(MENU_GRAPH, "Show Location")
.description("Tell the graph to pan/scale as need to keep location changes visible") .description("Tell the graph to pan/scale as need to keep location changes visible")
.menuGroup("Graph Options") .menuGroup("Graph Options")
.onAction(c -> toggleForceLocationVisible()) .onAction(c -> toggleForceLocationVisible())
.enabledWhen(this::canGraph) .enabledWhen(this::canGraph)
.buildAndInstall(tool); .buildAndInstall(tool);
updateSubroutineActions(); updateSubroutineActions();
} }
@ -309,12 +302,12 @@ public class ProgramGraphPlugin extends ProgramPlugin
private DockingAction buildGraphActionWithModel(String blockModelName, HelpLocation helpLoc) { private DockingAction buildGraphActionWithModel(String blockModelName, HelpLocation helpLoc) {
return new ActionBuilder("Graph Calls using " + blockModelName, getName()) return new ActionBuilder("Graph Calls using " + blockModelName, getName())
.menuPath(MENU_GRAPH, "Calls Using Model", blockModelName) .menuPath(MENU_GRAPH, "Calls Using Model", blockModelName)
.menuGroup(MENU_GRAPH, "C") .menuGroup(MENU_GRAPH, "C")
.helpLocation(helpLoc) .helpLocation(helpLoc)
.onAction(c -> createCallGraphUsing(blockModelName)) .onAction(c -> createCallGraphUsing(blockModelName))
.enabledWhen(this::canGraph) .enabledWhen(this::canGraph)
.buildAndInstall(tool); .buildAndInstall(tool);
} }
private void graphBlockFlow() { private void graphBlockFlow() {
@ -349,10 +342,8 @@ public class ProgramGraphPlugin extends ProgramPlugin
try { try {
CodeBlockModel model = CodeBlockModel model =
blockModelService.getNewModelByName(modelName, currentProgram, true); blockModelService.getNewModelByName(modelName, currentProgram, true);
BlockGraphTask task = BlockGraphTask task = new BlockGraphTask(graphType, graphEntryPointNexus, reuseGraph,
new BlockGraphTask(graphType, graphEntryPointNexus, appendToGraph, tool, currentSelection, currentLocation, model, defaultGraphService);
reuseGraph, appendToGraph, tool, currentSelection, currentLocation, model,
defaultGraphService);
task.setCodeLimitPerBlock(codeLimitPerBlock); task.setCodeLimitPerBlock(codeLimitPerBlock);
new TaskLauncher(task, tool.getToolFrame()); new TaskLauncher(task, tool.getToolFrame());
} }

View file

@ -19,11 +19,11 @@ import javax.swing.Icon;
import docking.ActionContext; import docking.ActionContext;
import docking.action.*; import docking.action.*;
import docking.options.OptionsService;
import generic.theme.GIcon; import generic.theme.GIcon;
import ghidra.feature.vt.gui.plugin.VTController; import ghidra.feature.vt.gui.plugin.VTController;
import ghidra.feature.vt.gui.plugin.VTPlugin; import ghidra.feature.vt.gui.plugin.VTPlugin;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
public class VTMatchApplySettingsAction extends DockingAction { public class VTMatchApplySettingsAction extends DockingAction {

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package ghidra.framework.plugintool.util; package docking.options;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;

View file

@ -24,6 +24,7 @@ import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import docking.Tool; import docking.Tool;
import docking.options.OptionsService;
import docking.options.editor.*; import docking.options.editor.*;
import generic.theme.GColor; import generic.theme.GColor;
import generic.theme.Gui; import generic.theme.Gui;
@ -38,8 +39,6 @@ import ghidra.util.bean.opteditor.OptionsVetoException;
*/ */
public class GraphDisplayOptions implements OptionsChangeListener { public class GraphDisplayOptions implements OptionsChangeListener {
public static final GraphDisplayOptions DEFAULT = new GraphDisplayOptions(new EmptyGraphType());
private static final String FONT = "Font"; private static final String FONT = "Font";
private static final String LABEL_POSITION = "Label Position"; private static final String LABEL_POSITION = "Label Position";
private static final String USE_ICONS = "Use Icons"; private static final String USE_ICONS = "Use Icons";
@ -96,7 +95,14 @@ public class GraphDisplayOptions implements OptionsChangeListener {
* @param graphType The {@link GraphType} for which to define display options * @param graphType The {@link GraphType} for which to define display options
*/ */
public GraphDisplayOptions(GraphType graphType) { public GraphDisplayOptions(GraphType graphType) {
this(graphType, null); this.graphType = graphType;
rootOptionsName = graphType.getOptionsName();
List<String> edgeTypes = graphType.getEdgeTypes();
if (!edgeTypes.isEmpty()) {
favoredEdgeType = edgeTypes.iterator().next();
}
initializeEdgePriorities();
initializeDefaults();
} }
/** /**
@ -106,15 +112,9 @@ public class GraphDisplayOptions implements OptionsChangeListener {
* @param graphType The {@link GraphType} for which to define display options * @param graphType The {@link GraphType} for which to define display options
* @param tool the tool from which to initialize from {@link ToolOptions} * @param tool the tool from which to initialize from {@link ToolOptions}
*/ */
public GraphDisplayOptions(GraphType graphType, Tool tool) { protected GraphDisplayOptions(GraphType graphType, Tool tool, HelpLocation help) {
this.graphType = graphType; this(graphType);
rootOptionsName = graphType.getOptionsName(); registerOptions(tool, help);
List<String> edgeTypes = graphType.getEdgeTypes();
if (!edgeTypes.isEmpty()) {
favoredEdgeType = edgeTypes.iterator().next();
}
initializeEdgePriorities();
initializeDefaults();
initializeFromOptions(tool); initializeFromOptions(tool);
} }
@ -683,11 +683,16 @@ public class GraphDisplayOptions implements OptionsChangeListener {
* constructed. Otherwise, if the tool exits and this hasn't been called, any saved option * constructed. Otherwise, if the tool exits and this hasn't been called, any saved option
* values will be lost. * values will be lost.
* <P> * <P>
* @param toolOptions the {@link ToolOptions} to register these options with * @param tool The tool to use to register options
* @param help the help location to be used by the {@link OptionsDialog} for display/editing * @param help the help location to be used by the {@link OptionsDialog} for display/editing
* these options * these options
*/ */
public void registerOptions(ToolOptions toolOptions, HelpLocation help) { protected void registerOptions(Tool tool, HelpLocation help) {
ToolOptions toolOptions = tool.getOptions("Graph");
registerOptions(toolOptions, help);
}
protected void registerOptions(ToolOptions toolOptions, HelpLocation help) {
Options rootOptions = toolOptions.getOptions(graphType.getOptionsName()); Options rootOptions = toolOptions.getOptions(graphType.getOptionsName());
registerVertexColorOptions(rootOptions, help); registerVertexColorOptions(rootOptions, help);
registerVertexShapeOptions(rootOptions, help); registerVertexShapeOptions(rootOptions, help);
@ -695,6 +700,45 @@ public class GraphDisplayOptions implements OptionsChangeListener {
registerMiscellaneousOptions(rootOptions, help); registerMiscellaneousOptions(rootOptions, help);
} }
/**
* Pop up a dialog for editing these graph display options. If the options
* are registered with tool options, show the tool options with the appropriate
* graph options selected. Otherwise, show an editor for locally editing these
* options.
* @param tool the tool
* @param help the help location to use if the options are edited locally
*/
public void displayEditor(Tool tool, HelpLocation help) {
String startingPath = rootOptionsName + ".Vertex Colors";
// if the options are registered in the tool, just show the
// corresponding tool options
if (isRegisteredWithTool()) {
OptionsService service = tool.getService(OptionsService.class);
if (service != null) {
service.showOptionsDialog("Graph." + startingPath, "");
return;
}
}
// Otherwise, create a new empty options, register the graph options into the
// those options and use our options editor on those options to allow the
// user to change these graph display options.
ToolOptions transientOptions = new ToolOptions("Graph");
registerOptions(transientOptions, help);
transientOptions.addOptionsChangeListener(this);
Options[] optionsArray = new Options[] { transientOptions };
String dialogTitle = "Graph Instance Settings (Not Saved in Tool Options)";
OptionsDialog dialog = new OptionsDialog(dialogTitle, "Graph", optionsArray, null);
// we have one less level for these transient tool options, so no need to prepend "graph."
dialog.displayCategory(startingPath, "");
tool.showDialog(dialog);
dialog.dispose();
}
/** /**
* Sets default values for vertex types. This method does not allow the vertexType color to * Sets default values for vertex types. This method does not allow the vertexType color to
* be eligible to be registered as a tool option. * be eligible to be registered as a tool option.
@ -830,9 +874,8 @@ public class GraphDisplayOptions implements OptionsChangeListener {
for (String vertexType : graphType.getVertexTypes()) { for (String vertexType : graphType.getVertexTypes()) {
if (vertexRegistrations.containsKey(vertexType)) { if (vertexRegistrations.containsKey(vertexType)) {
options.registerThemeColorBinding(vertexType, options.registerThemeColorBinding(vertexType, vertexRegistrations.get(vertexType),
vertexRegistrations.get(vertexType), help, help, "Choose the color for this vertex type");
"Choose the color for this vertex type");
} }
} }
List<String> list = new ArrayList<>(graphType.getVertexTypes()); List<String> list = new ArrayList<>(graphType.getVertexTypes());
@ -861,9 +904,8 @@ public class GraphDisplayOptions implements OptionsChangeListener {
for (String edgeType : graphType.getEdgeTypes()) { for (String edgeType : graphType.getEdgeTypes()) {
if (edgeRegistrations.containsKey(edgeType)) { if (edgeRegistrations.containsKey(edgeType)) {
options.registerThemeColorBinding(edgeType, options.registerThemeColorBinding(edgeType, edgeRegistrations.get(edgeType), help,
edgeRegistrations.get(edgeType), "Choose the color for this edge type");
help, "Choose the color for this edge type");
} }
} }
List<String> list = new ArrayList<>(graphType.getEdgeTypes()); List<String> list = new ArrayList<>(graphType.getEdgeTypes());
@ -884,29 +926,29 @@ public class GraphDisplayOptions implements OptionsChangeListener {
if (defaultRegistrations.containsKey(VERTEX_SELECTION_COLOR)) { if (defaultRegistrations.containsKey(VERTEX_SELECTION_COLOR)) {
optionNamesInDisplayOrder.add(VERTEX_SELECTION_COLOR); optionNamesInDisplayOrder.add(VERTEX_SELECTION_COLOR);
options.registerThemeColorBinding(VERTEX_SELECTION_COLOR, options.registerThemeColorBinding(VERTEX_SELECTION_COLOR,
defaultRegistrations.get(VERTEX_SELECTION_COLOR), defaultRegistrations.get(VERTEX_SELECTION_COLOR), help,
help, "Color for highlighting selected vertices"); "Color for highlighting selected vertices");
} }
if (defaultRegistrations.containsKey(EDGE_SELECTION_COLOR)) { if (defaultRegistrations.containsKey(EDGE_SELECTION_COLOR)) {
optionNamesInDisplayOrder.add(EDGE_SELECTION_COLOR); optionNamesInDisplayOrder.add(EDGE_SELECTION_COLOR);
options.registerThemeColorBinding(EDGE_SELECTION_COLOR, options.registerThemeColorBinding(EDGE_SELECTION_COLOR,
defaultRegistrations.get(EDGE_SELECTION_COLOR), defaultRegistrations.get(EDGE_SELECTION_COLOR), help,
help, "Color for highlighting selected edge"); "Color for highlighting selected edge");
} }
if (defaultRegistrations.containsKey(DEFAULT_VERTEX_COLOR)) { if (defaultRegistrations.containsKey(DEFAULT_VERTEX_COLOR)) {
optionNamesInDisplayOrder.add(DEFAULT_VERTEX_COLOR); optionNamesInDisplayOrder.add(DEFAULT_VERTEX_COLOR);
options.registerThemeColorBinding(DEFAULT_VERTEX_COLOR, options.registerThemeColorBinding(DEFAULT_VERTEX_COLOR,
defaultRegistrations.get(DEFAULT_VERTEX_COLOR), defaultRegistrations.get(DEFAULT_VERTEX_COLOR), help,
help, "Color for vertices that have no vertex type defined"); "Color for vertices that have no vertex type defined");
} }
if (defaultRegistrations.containsKey(DEFAULT_EDGE_COLOR)) { if (defaultRegistrations.containsKey(DEFAULT_EDGE_COLOR)) {
optionNamesInDisplayOrder.add(DEFAULT_EDGE_COLOR); optionNamesInDisplayOrder.add(DEFAULT_EDGE_COLOR);
options.registerThemeColorBinding(DEFAULT_EDGE_COLOR, options.registerThemeColorBinding(DEFAULT_EDGE_COLOR,
defaultRegistrations.get(DEFAULT_EDGE_COLOR), defaultRegistrations.get(DEFAULT_EDGE_COLOR), help,
help, "Color for edge that have no edge type defined"); "Color for edge that have no edge type defined");
} }
optionNamesInDisplayOrder.add(DEFAULT_VERTEX_SHAPE); optionNamesInDisplayOrder.add(DEFAULT_VERTEX_SHAPE);

View file

@ -271,10 +271,10 @@ public class GraphDisplayOptionsTest {
Options miscellaneousOptions = graphDisplayOptions.getOptions("Miscellaneous"); Options miscellaneousOptions = graphDisplayOptions.getOptions("Miscellaneous");
leafOptionNames = miscellaneousOptions.getLeafOptionNames(); leafOptionNames = miscellaneousOptions.getLeafOptionNames();
assertEquals(Arrays.asList("Use Icons", "Max Graph Size", assertEquals(Arrays.asList("Use Icons", "Max Graph Size", "Selected Vertex Color",
"Selected Vertex Color", "Default Layout Algorithm", "Default Vertex Color", "Default Layout Algorithm", "Default Vertex Color", "Default Vertex Shape",
"Default Vertex Shape", "Selected Edge Color", "Label Position", "Selected Edge Color", "Label Position", "Default Edge Color", "Font",
"Default Edge Color", "Font", "Favored Edge Type"), leafOptionNames); "Favored Edge Type"), leafOptionNames);
} }
@ -318,4 +318,5 @@ public class GraphDisplayOptionsTest {
} }
} }
} }

View file

@ -37,6 +37,7 @@ import docking.actions.PopupActionProvider;
import docking.actions.ToolActions; import docking.actions.ToolActions;
import docking.framework.AboutDialog; import docking.framework.AboutDialog;
import docking.framework.ApplicationInformationDisplayFactory; import docking.framework.ApplicationInformationDisplayFactory;
import docking.options.OptionsService;
import docking.tool.ToolConstants; import docking.tool.ToolConstants;
import docking.tool.util.DockingToolConstants; import docking.tool.util.DockingToolConstants;
import docking.util.image.ToolIconURL; import docking.util.image.ToolIconURL;

View file

@ -23,6 +23,7 @@ import javax.swing.tree.TreePath;
import org.jdom.Element; import org.jdom.Element;
import docking.options.OptionsService;
import docking.options.editor.OptionsDialog; import docking.options.editor.OptionsDialog;
import docking.tool.ToolConstants; import docking.tool.ToolConstants;
import docking.tool.util.DockingToolConstants; import docking.tool.util.DockingToolConstants;
@ -30,7 +31,6 @@ import ghidra.framework.options.*;
import ghidra.framework.plugintool.Plugin; import ghidra.framework.plugintool.Plugin;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.dialog.KeyBindingsPanel; import ghidra.framework.plugintool.dialog.KeyBindingsPanel;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.exception.AssertException; import ghidra.util.exception.AssertException;

View file

@ -21,6 +21,7 @@ import java.util.List;
import org.junit.Test; import org.junit.Test;
import docking.options.OptionsService;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin; import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin;
import ghidra.app.plugin.core.colorizer.ColorizingService; import ghidra.app.plugin.core.colorizer.ColorizingService;
@ -33,7 +34,6 @@ import ghidra.app.util.viewer.listingpanel.ListingPanel;
import ghidra.app.util.viewer.listingpanel.MarginProvider; import ghidra.app.util.viewer.listingpanel.MarginProvider;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressSet; import ghidra.program.model.address.AddressSet;
import ghidra.program.model.block.*; import ghidra.program.model.block.*;

View file

@ -32,6 +32,7 @@ import docking.StatusBar;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import docking.actions.KeyEntryDialog; import docking.actions.KeyEntryDialog;
import docking.actions.ToolActions; import docking.actions.ToolActions;
import docking.options.OptionsService;
import docking.tool.ToolConstants; import docking.tool.ToolConstants;
import docking.widgets.OptionDialog; import docking.widgets.OptionDialog;
import docking.widgets.table.GTable; import docking.widgets.table.GTable;
@ -44,7 +45,6 @@ import ghidra.framework.cmd.BackgroundCommand;
import ghidra.framework.main.PickToolDialog; import ghidra.framework.main.PickToolDialog;
import ghidra.framework.model.DomainObject; import ghidra.framework.model.DomainObject;
import ghidra.framework.plugintool.dialog.PluginInstallerDialog; import ghidra.framework.plugintool.dialog.PluginInstallerDialog;
import ghidra.framework.plugintool.util.OptionsService;
import ghidra.test.TestEnv; import ghidra.test.TestEnv;
import ghidra.util.task.TaskDialog; import ghidra.util.task.TaskDialog;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;