From 06b33a0d94fc8e606cc9b71cd2333becdc0aba89 Mon Sep 17 00:00:00 2001
From: dragonmacher <48328597+dragonmacher@users.noreply.github.com>
Date: Mon, 5 Feb 2024 13:36:36 -0500
Subject: [PATCH 1/4] GP-4299 - Fixed exception in dialog when pressing Enter
with no text in the field
---
.../widgets/dialogs/AbstractNumberInputDialog.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/AbstractNumberInputDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/AbstractNumberInputDialog.java
index 87ecf40a3c..78b5ea4b00 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/AbstractNumberInputDialog.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/AbstractNumberInputDialog.java
@@ -102,7 +102,11 @@ public abstract class AbstractNumberInputDialog extends DialogComponentProvider
*/
protected JPanel buildMainPanel(String prompt, boolean showAsHex) {
JPanel panel = createPanel(prompt);
- numberInputField.addActionListener(e -> okCallback());
+ numberInputField.addActionListener(e -> {
+ if (okButton.isEnabled()) {
+ okCallback();
+ }
+ });
if (showAsHex) {
numberInputField.setHexMode();
@@ -258,7 +262,7 @@ public abstract class AbstractNumberInputDialog extends DialogComponentProvider
//==================================================================================================
// Private Methods
-//==================================================================================================
+//==================================================================================================
/**
* Create the main panel.
From 359faba77aa1555d3b05518ecf8491c6e9158807 Mon Sep 17 00:00:00 2001
From: dragonmacher <48328597+dragonmacher@users.noreply.github.com>
Date: Tue, 6 Feb 2024 17:01:02 -0500
Subject: [PATCH 2/4] GP-4294 - Fixed exception looking for extensions when
running headlessly in fat jar mode
---
.../ghidra_scripts/BuildGhidraJarScript.java | 5 +-
.../app/util/headless/HeadlessAnalyzer.java | 60 ++++++++++---------
.../ghidra/GhidraJarApplicationLayout.java | 19 ++++--
3 files changed, 49 insertions(+), 35 deletions(-)
diff --git a/Ghidra/Features/Base/ghidra_scripts/BuildGhidraJarScript.java b/Ghidra/Features/Base/ghidra_scripts/BuildGhidraJarScript.java
index 675904cb82..e9bd0ffd2e 100644
--- a/Ghidra/Features/Base/ghidra_scripts/BuildGhidraJarScript.java
+++ b/Ghidra/Features/Base/ghidra_scripts/BuildGhidraJarScript.java
@@ -62,9 +62,12 @@ public class BuildGhidraJarScript extends GhidraScript {
builder.addExcludedFileExtension(".pdf");
File installDir = Application.getInstallationDirectory().getFile(true);
- builder.buildJar(new File(installDir, "ghidra.jar"), null, monitor);
+ File file = new File(installDir, "ghidra.jar");
+ builder.buildJar(file, null, monitor);
// uncomment the following line to create a src zip for debugging.
// builder.buildSrcZip(new File(installDir, "GhidraSrc.zip"), monitor);
+
+ println("Finsished writing jar: " + file);
}
}
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/HeadlessAnalyzer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/HeadlessAnalyzer.java
index f13bab0445..d7c3a1a886 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/HeadlessAnalyzer.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/HeadlessAnalyzer.java
@@ -59,16 +59,16 @@ import ghidra.util.task.TaskMonitor;
import utilities.util.FileUtilities;
/**
- * The class used kick-off and interact with headless processing. All headless options have been
- * broken out into their own class: {@link HeadlessOptions}. This class is intended to be used
+ * The class used kick-off and interact with headless processing. All headless options have been
+ * broken out into their own class: {@link HeadlessOptions}. This class is intended to be used
* one of two ways:
*
- * - Used by {@link AnalyzeHeadless} to perform headless analysis based on arguments specified
+ *
- Used by {@link AnalyzeHeadless} to perform headless analysis based on arguments specified
* on the command line.
* - Used by another tool as a library to perform headless analysis.
*
*
- * Note: This class is not thread safe.
+ * Note: This class is not thread safe.
*/
public class HeadlessAnalyzer {
@@ -84,16 +84,16 @@ public class HeadlessAnalyzer {
private FileSystemService fsService;
/**
- * Gets a headless analyzer, initializing the application if necessary with the specified
- * logging parameters. An {@link IllegalStateException} will be thrown if the application has
+ * Gets a headless analyzer, initializing the application if necessary with the specified
+ * logging parameters. An {@link IllegalStateException} will be thrown if the application has
* already been initialized or a headless analyzer has already been retrieved. In these cases,
* the headless analyzer should be gotten with {@link HeadlessAnalyzer#getInstance()}.
*
- * @param logFile The desired application log file. If null, the default application log file
+ * @param logFile The desired application log file. If null, the default application log file
* will be used (see {@link Application#initializeLogging}).
* @param scriptLogFile The desired scripting log file. If null, the default scripting log file
* will be used (see {@link Application#initializeLogging}).
- * @param useLog4j true if log4j is to be used; otherwise, false. If this class is being used by
+ * @param useLog4j true if log4j is to be used; otherwise, false. If this class is being used by
* another tool as a library, using log4j might interfere with that tool.
* @return An instance of a new headless analyzer.
* @throws IllegalStateException if an application or headless analyzer instance has already been initialized.
@@ -103,7 +103,7 @@ public class HeadlessAnalyzer {
boolean useLog4j) throws IllegalStateException, IOException {
// Prevent more than one headless analyzer from being instantiated. Too much about it
- // messes with global system settings, so under the current design of Ghidra, allowing
+ // messes with global system settings, so under the current design of Ghidra, allowing
// more than one to exist could result in unpredictable behavior.
if (instance != null) {
throw new IllegalStateException(
@@ -141,7 +141,7 @@ public class HeadlessAnalyzer {
/**
* Gets a headless analyzer instance, with the assumption that the application has already been
- * initialized. If this is called before the application has been initialized, it will
+ * initialized. If this is called before the application has been initialized, it will
* initialize the application with no logging.
*
* @return An instance of a new headless analyzer.
@@ -151,7 +151,7 @@ public class HeadlessAnalyzer {
public static HeadlessAnalyzer getInstance() throws IOException {
// Prevent more than one headless analyzer from being instantiated. Too much about it
- // messes with global system settings, so under the current design of Ghidra, allowing
+ // messes with global system settings, so under the current design of Ghidra, allowing
// more than one to exist could result in unpredictable behavior.
if (instance != null) {
return instance;
@@ -185,8 +185,10 @@ public class HeadlessAnalyzer {
layout = new GhidraApplicationLayout();
}
catch (IOException e) {
+ Msg.debug(HeadlessAnalyzer.class,
+ "Unable to load the standard Ghidra application layout. " + e.getMessage() +
+ ". Attempting to load the Ghidra Jar application layout.");
layout = new GhidraJarApplicationLayout();
-
}
return layout;
}
@@ -201,7 +203,7 @@ public class HeadlessAnalyzer {
// Ghidra URL handler registration. There's no harm in doing this more than once.
Handler.registerHandler();
- // Ensure that we are running in "headless mode", preventing Swing-based methods from
+ // Ensure that we are running in "headless mode", preventing Swing-based methods from
// running (causing headless operation to lose focus).
System.setProperty("java.awt.headless", "true");
System.setProperty(SystemUtilities.HEADLESS_PROPERTY, Boolean.TRUE.toString());
@@ -244,12 +246,12 @@ public class HeadlessAnalyzer {
*
perform auto-analysis if not disabled
* execute ordered list of post-scripts
*
- * If no import files or directories have been specified the ordered list
+ * If no import files or directories have been specified the ordered list
* of pre/post scripts will be executed once.
*
* @param ghidraURL ghidra URL for existing server repository and optional
* folder path
- * @param filesToImport directories and files to be imported (null or empty
+ * @param filesToImport directories and files to be imported (null or empty
* is acceptable if we are in -process mode)
* @throws IOException if there was an IO-related problem
* @throws MalformedURLException specified URL is invalid
@@ -370,16 +372,16 @@ public class HeadlessAnalyzer {
* perform auto-analysis if not disabled
* execute ordered list of post-scripts
*
- * If no import files or directories have been specified the ordered list
+ * If no import files or directories have been specified the ordered list
* of pre/post scripts will be executed once.
*
- * @param projectLocation directory path of project
+ * @param projectLocation directory path of project
* If project exists it will be opened, otherwise it will be created.
* @param projectName project name
* @param rootFolderPath root folder for imports
* @param filesToImport directories and files to be imported (null or empty is acceptable if
* we are in -process mode)
- * @throws IOException if there was an IO-related problem. If caused by a failure to obtain a
+ * @throws IOException if there was an IO-related problem. If caused by a failure to obtain a
* write-lock on the project the exception cause will a {@code LockException}.
*/
public void processLocal(String projectLocation, String projectName, String rootFolderPath,
@@ -475,7 +477,7 @@ public class HeadlessAnalyzer {
/**
* Checks to see if the most recent analysis timed out.
*
- * @return true if the most recent analysis timed out; otherwise, false.
+ * @return true if the most recent analysis timed out; otherwise, false.
*/
public boolean checkAnalysisTimedOut() {
return analysisTimedOut;
@@ -766,7 +768,7 @@ public class HeadlessAnalyzer {
Class> c = Class.forName(className, true, classLoaderForDotClassScripts);
if (GhidraScript.class.isAssignableFrom(c)) {
- // No issues, but return null, which signifies we don't actually have a
+ // No issues, but return null, which signifies we don't actually have a
// ResourceFile to associate with the script name
return null;
}
@@ -962,9 +964,9 @@ public class HeadlessAnalyzer {
* @param fileAbsolutePath Path of the file to analyze.
* @param program The program to analyze.
* @return true if the program file should be kept. If analysis or scripts have marked
- * the program as temporary changes should not be saved. Returns false in
+ * the program as temporary changes should not be saved. Returns false in
* these cases:
- * - One of the scripts sets the Headless Continuation Option to "ABORT_AND_DELETE" or
+ * - One of the scripts sets the Headless Continuation Option to "ABORT_AND_DELETE" or
* "CONTINUE_THEN_DELETE".
*/
private boolean analyzeProgram(String fileAbsolutePath, Program program) {
@@ -1154,7 +1156,7 @@ public class HeadlessAnalyzer {
Msg.info(this, "REPORT: Processing project file: " + domFile.getPathname());
- // This method already takes into account whether the user has set the "noanalysis"
+ // This method already takes into account whether the user has set the "noanalysis"
// flag or not
keepFile = analyzeProgram(domFile.getPathname(), program) || readOnlyFile;
@@ -1237,7 +1239,7 @@ public class HeadlessAnalyzer {
if (!readOnlyFile) { // can't change anything if read-only file
- // Undo checkout of it is still checked-out and either the file is to be
+ // Undo checkout of it is still checked-out and either the file is to be
// deleted, or we just checked it out and file changes have been committed
if (domFile.isCheckedOut()) {
if (!keepFile ||
@@ -1521,14 +1523,14 @@ public class HeadlessAnalyzer {
try {
// Perform the load. Note that loading 1 file may result in more than 1 thing getting
- // loaded.
+ // loaded.
loadResults = loadPrograms(fsrl, folderPath);
Msg.info(this, "IMPORTING: Loaded " + (loadResults.size() - 1) + " additional files");
primary = loadResults.getPrimary();
Program primaryProgram = primary.getDomainObject();
- // Make sure we are allowed to save ALL programs to the project. If not, save none and
+ // Make sure we are allowed to save ALL programs to the project. If not, save none and
// fail.
if (!options.readOnly) {
for (Loaded loaded : loadResults) {
@@ -1549,7 +1551,7 @@ public class HeadlessAnalyzer {
// TODO: Analyze non-primary programs (GP-2965).
boolean doSave = analyzeProgram(fsrl.toString(), primaryProgram) && !options.readOnly;
- // The act of marking the program as temporary by a script will signal
+ // The act of marking the program as temporary by a script will signal
// us to discard any changes
if (!doSave) {
loadResults.forEach(e -> e.getDomainObject().setTemporary(true));
@@ -1776,7 +1778,7 @@ public class HeadlessAnalyzer {
return;
default:
- // Just continue
+ // Just continue
}
runScriptsList(options.postScripts, options.postScriptFileMap, scriptState,
@@ -1834,7 +1836,7 @@ public class HeadlessAnalyzer {
}
/**
- * Ghidra project class required to gain access to specialized project constructor
+ * Ghidra project class required to gain access to specialized project constructor
* for URL connection.
*/
private static class HeadlessProject extends DefaultProject {
diff --git a/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraJarApplicationLayout.java b/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraJarApplicationLayout.java
index 21b6922301..3b13e0f43a 100644
--- a/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraJarApplicationLayout.java
+++ b/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraJarApplicationLayout.java
@@ -23,11 +23,11 @@ import java.util.*;
import generic.jar.ResourceFile;
import ghidra.framework.ApplicationProperties;
import ghidra.framework.GModule;
-import utility.application.ApplicationLayout;
+import ghidra.util.Msg;
import utility.module.ModuleUtilities;
/**
- * The Ghidra jar application layout defines the customizable elements of the Ghidra application's
+ * The Ghidra jar application layout defines the customizable elements of the Ghidra application's
* directory structure when running in "single jar mode."
*/
public class GhidraJarApplicationLayout extends GhidraApplicationLayout {
@@ -51,7 +51,11 @@ public class GhidraJarApplicationLayout extends GhidraApplicationLayout {
protected Collection findGhidraApplicationRootDirs() {
List dirs = new ArrayList<>();
String appPropPath = "/_Root/Ghidra/" + ApplicationProperties.PROPERTY_FILE;
- URL appPropUrl = ApplicationLayout.class.getResource(appPropPath);
+ URL appPropUrl = getClass().getResource(appPropPath);
+ if (appPropUrl == null) {
+ throw new IllegalStateException(
+ "The Ghidra Jar must have an application.properties file at " + appPropPath);
+ }
ResourceFile rootDir = fromUrl(appPropUrl).getParentFile();
dirs.add(rootDir);
return dirs;
@@ -79,7 +83,12 @@ public class GhidraJarApplicationLayout extends GhidraApplicationLayout {
@Override
protected List findExtensionInstallationDirectories() {
- URL extensionInstallUrl = ApplicationLayout.class.getResource("/_Root/Ghidra/Extensions");
+ String path = "/_Root/Ghidra/Extensions";
+ URL extensionInstallUrl = getClass().getResource(path);
+ if (extensionInstallUrl == null) {
+ Msg.debug(this, "No Extensions dir found at " + path);
+ return List.of();
+ }
ResourceFile extensionInstallDir = fromUrl(extensionInstallUrl);
return Collections.singletonList(extensionInstallDir);
}
@@ -94,7 +103,7 @@ public class GhidraJarApplicationLayout extends GhidraApplicationLayout {
String urlString = url.toExternalForm();
try {
// Decode the URL to replace things like %20 with real spaces.
- // Note: can't use URLDecoder.decode(String, Charset) because Utility must be
+ // Note: can't use URLDecoder.decode(String, Charset) because Utility must be
// Java 1.8 compatible.
urlString = URLDecoder.decode(urlString, "UTF-8");
}
From 97fdfddecff8f44e5c74aa290482fd60b0ed2a56 Mon Sep 17 00:00:00 2001
From: ghidragon <106987263+ghidragon@users.noreply.github.com>
Date: Tue, 6 Feb 2024 17:09:31 -0500
Subject: [PATCH 3/4] GP-4297 Fixed screen reader decompiler api to prevent
duplicate reading of the line when cursoring up or down a line
---
.../field/ListingFieldDescriptionProvider.java | 6 ++++--
.../core/byteviewer/ByteViewerComponent.java | 15 ++++++++++++---
.../app/decompiler/component/DecompilerPanel.java | 9 +++------
3 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/field/ListingFieldDescriptionProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/field/ListingFieldDescriptionProvider.java
index 0113c256eb..48cd8e4264 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/field/ListingFieldDescriptionProvider.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/field/ListingFieldDescriptionProvider.java
@@ -18,6 +18,7 @@ package ghidra.app.util.viewer.field;
import docking.widgets.fieldpanel.FieldDescriptionProvider;
import docking.widgets.fieldpanel.field.Field;
import docking.widgets.fieldpanel.support.FieldLocation;
+import ghidra.program.model.address.Address;
import ghidra.program.util.ProgramLocation;
public class ListingFieldDescriptionProvider implements FieldDescriptionProvider {
@@ -27,8 +28,9 @@ public class ListingFieldDescriptionProvider implements FieldDescriptionProvider
if (field instanceof ListingField listingField) {
FieldFactory fieldFactory = listingField.getFieldFactory();
ProgramLocation location = fieldFactory.getProgramLocation(0, 0, listingField);
- return fieldFactory.getFieldName() + " Field at Address " + location.getAddress() +
- " text = " + field.getText();
+ Address address = location.getAddress();
+ String addressString = address.toString(address.getAddressSpace().showSpaceName(), 1);
+ return fieldFactory.getFieldName() + " Field at Address " + addressString;
}
return "Unknown Field";
}
diff --git a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponent.java b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponent.java
index 66c48db7e3..fb15a0debc 100644
--- a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponent.java
+++ b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponent.java
@@ -102,13 +102,22 @@ public class ByteViewerComponent extends FieldPanel implements FieldMouseListene
ByteBlockInfo info = indexMap.getBlockInfo(fieldLoc.getIndex(), fieldLoc.getFieldNum());
if (info != null) {
String modelName = model.getName();
- return modelName + " format at " +
- info.getBlock().getLocationRepresentation(info.getOffset()) + ", value = " +
- field.getText();
+ String location = getAccessibleLocationInfo(info.getBlock(), info.getOffset());
+ return modelName + " format at " + location;
}
return null;
}
+ private String getAccessibleLocationInfo(ByteBlock block, BigInteger offset) {
+ if (block instanceof MemoryByteBlock memBlock) {
+ // location represents an address, remove leading zeros to make screen reading concise
+ Address address = memBlock.getAddress(offset);
+ return address.toString(address.getAddressSpace().showSpaceName(), 1);
+ }
+ // otherwise use generic location representation
+ return block.getLocationRepresentation(offset);
+ }
+
@Override
public void buttonPressed(FieldLocation fieldLocation, Field field, MouseEvent mouseEvent) {
if (fieldLocation == null || field == null) {
diff --git a/Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/component/DecompilerPanel.java b/Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/component/DecompilerPanel.java
index 97673d057d..cb9b7ea8ac 100644
--- a/Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/component/DecompilerPanel.java
+++ b/Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/component/DecompilerPanel.java
@@ -16,9 +16,7 @@
package ghidra.app.decompiler.component;
import java.awt.*;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.awt.event.MouseEvent;
+import java.awt.event.*;
import java.math.BigInteger;
import java.util.*;
import java.util.List;
@@ -45,7 +43,6 @@ import ghidra.app.decompiler.component.hover.DecompilerHoverService;
import ghidra.app.decompiler.component.margin.*;
import ghidra.app.plugin.core.decompile.DecompilerClipboardProvider;
import ghidra.app.plugin.core.decompile.actions.FieldBasedSearchLocation;
-import ghidra.app.util.viewer.listingpanel.MarginProvider;
import ghidra.app.util.viewer.util.ScrollpaneAlignedHorizontalLayout;
import ghidra.program.model.address.*;
import ghidra.program.model.listing.Function;
@@ -128,7 +125,7 @@ public class DecompilerPanel extends JPanel implements FieldMouseListener, Field
fieldPanel.addFieldMouseListener(this);
fieldPanel.addFieldLocationListener(this);
fieldPanel.addLayoutListener(this);
-
+
fieldPanel.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
@@ -1317,7 +1314,7 @@ public class DecompilerPanel extends JPanel implements FieldMouseListener, Field
if (f == null) {
return null;
}
- return "line " + (l.getIndex().intValue() + 1) + ", " + f.getText();
+ return "line " + (l.getIndex().intValue() + 1);
});
}
From 0b0356528d0a736bc41dbeae4b92bc464fd00214 Mon Sep 17 00:00:00 2001
From: dragonmacher <48328597+dragonmacher@users.noreply.github.com>
Date: Tue, 6 Feb 2024 17:29:55 -0500
Subject: [PATCH 4/4] GP-4296 - Fixed screen reader support of tooltips using
html
---
.../analysis/rust/RustDemanglerAnalyzer.java | 2 -
.../core/calltree/CallTreeProvider.java | 5 +-
.../app/plugin/core/clear/ClearDialog.java | 2 +-
.../hover/DataTypeListingHover.java | 8 +-
...rogramAddressRelationshipListingHover.java | 4 +-
.../BitFieldPlacementComponent.java | 48 +++++------
.../core/compositeeditor/CompEditorPanel.java | 28 +++----
.../compositeeditor/DataTypeCellRenderer.java | 4 +-
.../core/data/CreateStructureDialog.java | 6 +-
.../core/datamgr/DataTypeSynchronizer.java | 8 +-
.../disassembler/DisassembledViewPlugin.java | 80 +++++++++----------
.../function/editor/FunctionEditorDialog.java | 4 +-
.../plugin/core/help/ProcessorListPlugin.java | 4 +-
.../script/GhidraScriptComponentProvider.java | 36 ++++-----
.../core/script/ScriptSelectionEditor.java | 18 ++---
.../app/util/exporter/ProgramTextWriter.java | 4 +-
.../util/html/HTMLDataTypeRepresentation.java | 11 +--
.../field/EolExtraCommentsPropertyEditor.java | 6 +-
.../ListingCodeComparisonPanel.java | 12 +--
.../java/ghidra/framework/main/InfoPanel.java | 2 +-
.../plugin/core/disassembler/ClearTest.java | 2 +-
.../html/HTMLDataTypeRepresentationTest.java | 4 +-
.../DecompilerCodeComparisonPanel.java | 16 ++--
.../functioncalls/plugin/FcgProvider.java | 13 +--
.../visualization/AttributedToolTipInfo.java | 4 +-
.../core/diff/DiffApplySettingsProvider.java | 6 +-
.../matchtable/ApplyMarkupPropertyEditor.java | 78 +++++++++---------
.../src/main/java/docking/StatusBar.java | 4 +-
.../docking/menu/DockingToolBarUtils.java | 4 +-
.../docking/menu/HorizontalRuleAction.java | 4 +-
.../docking/options/editor/ColorEditor.java | 2 +-
.../main/java/ghidra/util/HTMLUtilities.java | 57 ++++++-------
.../java/ghidra/util/HTMLUtilitiesTest.java | 4 +-
.../HelpMissingScreenShotReportGenerator.java | 62 +++++++-------
.../HelpScreenShotReportGenerator.java | 4 +-
.../src/test/java/help/AbstractHelpTest.java | 42 +++++-----
.../help/validator/model/HelpFileTest.java | 64 +++++++--------
.../main/datatable/ProjectDataTablePanel.java | 11 +--
.../actions/ProjectDataDeleteAction.java | 6 +-
.../plugintool/dialog/PluginDetailsPanel.java | 2 +-
.../extensions/ExtensionDetailsPanel.java | 4 +-
.../program/database/ProgramCompilerSpec.java | 2 +-
.../data/DataTypeArchiveTransformerPanel.java | 4 +-
43 files changed, 349 insertions(+), 342 deletions(-)
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/rust/RustDemanglerAnalyzer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/rust/RustDemanglerAnalyzer.java
index 490ac106ee..3255dd2369 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/rust/RustDemanglerAnalyzer.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/rust/RustDemanglerAnalyzer.java
@@ -27,9 +27,7 @@ import ghidra.app.util.demangler.*;
import ghidra.app.util.importer.MessageLog;
import ghidra.framework.options.*;
import ghidra.program.model.address.Address;
-import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.Program;
-import ghidra.program.model.symbol.SourceType;
import ghidra.util.HelpLocation;
import ghidra.util.SystemUtilities;
import ghidra.util.task.TaskMonitor;
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/calltree/CallTreeProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/calltree/CallTreeProvider.java
index d89f30d1da..b9cee58d72 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/calltree/CallTreeProvider.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/calltree/CallTreeProvider.java
@@ -45,7 +45,6 @@ import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.Program;
import ghidra.program.model.symbol.Symbol;
import ghidra.program.util.*;
-import ghidra.util.HTMLUtilities;
import ghidra.util.HelpLocation;
import ghidra.util.exception.CancelledException;
import ghidra.util.task.SwingUpdateManager;
@@ -443,10 +442,10 @@ public class CallTreeProvider extends ComponentProviderAdapter implements Domain
navigateIncomingToggleAction.setSelected(isPrimary);
navigateIncomingToggleAction.setToolBarData(new ToolBarData(
Icons.NAVIGATE_ON_INCOMING_EVENT_ICON, navigationOptionsToolbarGroup, "2"));
- navigateIncomingToggleAction.setDescription(HTMLUtilities.toHTML("Incoming Navigation" +
+ navigateIncomingToggleAction.setDescription("Incoming Navigation" +
"
Toggle On - change the displayed " +
"function on Listing navigation events" +
- "
Toggled Off - don't change the displayed function on Listing navigation events"));
+ "
Toggled Off - don't change the displayed function on Listing navigation events");
navigateIncomingToggleAction.setHelpLocation(
new HelpLocation(plugin.getName(), "Call_Tree_Action_Incoming_Navigation"));
tool.addLocalAction(this, navigateIncomingToggleAction);
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearDialog.java
index 09c61c7481..62df84aef2 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearDialog.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearDialog.java
@@ -124,7 +124,7 @@ public class ClearDialog extends DialogComponentProvider {
symbolsCb = new GCheckBox("Symbols");
commentsCb = new GHtmlCheckBox(
- "Comments (does not affect automatic comments)");
+ "Comments (does not affect automatic comments)");
commentsCb.setVerticalTextPosition(SwingConstants.TOP);
propertiesCb = new GCheckBox("Properties");
codeCb = new GCheckBox("Code");
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/hover/DataTypeListingHover.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/hover/DataTypeListingHover.java
index de0659147e..22e78635b2 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/hover/DataTypeListingHover.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/hover/DataTypeListingHover.java
@@ -103,17 +103,17 @@ public class DataTypeListingHover extends AbstractConfigurableHover implements L
toolTipText = toolTipText.replace("Unsized", Integer.toString(dataLen));
}
if (dataInstance != null) {
- toolTipText = toolTipText.replace("",
- getLocationSupplimentalToolTipText(dt, dataInstance) + "");
+ toolTipText = toolTipText.replace("",
+ getLocationSupplimentalToolTipText(dt, dataInstance) + "