diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/ProgramMultiUserMergeManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/ProgramMultiUserMergeManager.java
index 6d3f657969..fa20b07dd8 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/ProgramMultiUserMergeManager.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/ProgramMultiUserMergeManager.java
@@ -418,6 +418,12 @@ class MergeNavigatable implements Navigatable {
@Override
public void addNavigatableListener(NavigatableRemovalListener listener) {
+ // stub
+ }
+
+ @Override
+ public ProgramSelection getSelection() {
+ return mergePanel.getFocusedListingPanel().getProgramSelection();
}
@Override
@@ -425,6 +431,11 @@ class MergeNavigatable implements Navigatable {
return mergePanel.getFocusedListingPanel().getProgramHighlight();
}
+ @Override
+ public String getTextSelection() {
+ return mergePanel.getFocusedListingPanel().getTextSelection();
+ }
+
@Override
public long getInstanceID() {
return 0;
@@ -450,11 +461,6 @@ class MergeNavigatable implements Navigatable {
return mergePanel.getFocusedProgram();
}
- @Override
- public ProgramSelection getSelection() {
- return mergePanel.getFocusedListingPanel().getProgramSelection();
- }
-
@Override
public boolean goTo(Program program, ProgramLocation location) {
mergePanel.goTo(location, true);
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/nav/Navigatable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/nav/Navigatable.java
index a2fa898406..977cd89fce 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/nav/Navigatable.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/nav/Navigatable.java
@@ -123,6 +123,12 @@ public interface Navigatable {
*/
public ProgramSelection getHighlight();
+ /**
+ * Returns the current text selection or null
+ * @return the text selection
+ */
+ public String getTextSelection();
+
/**
* Adds a listener to be notified if this Navigatable is terminated
* @param listener the listener to be notified when this Navigatable is closed
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/CodeViewerProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/CodeViewerProvider.java
index f5f49f52ba..305063eb2f 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/CodeViewerProvider.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/CodeViewerProvider.java
@@ -109,6 +109,7 @@ public class CodeViewerProvider extends NavigatableComponentProviderAdapter
private ProgramSelection currentSelection;
private ProgramSelection currentHighlight;
+ private String currentStringSelection;
private FieldNavigator fieldNavigator;
@@ -625,6 +626,7 @@ public class CodeViewerProvider extends NavigatableComponentProviderAdapter
@Override
public void setStringSelection(String string) {
+ this.currentStringSelection = string;
codeViewerClipboardProvider.setStringContent(string);
contextChanged();
}
@@ -808,6 +810,11 @@ public class CodeViewerProvider extends NavigatableComponentProviderAdapter
return currentHighlight;
}
+ @Override
+ public String getTextSelection() {
+ return currentStringSelection;
+ }
+
@Override
public Icon getIcon() {
if (isConnected()) {
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/gotoquery/GoToServicePlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/gotoquery/GoToServicePlugin.java
index 691f890f36..c8349428b4 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/gotoquery/GoToServicePlugin.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/gotoquery/GoToServicePlugin.java
@@ -58,6 +58,7 @@ public final class GoToServicePlugin extends ProgramPlugin {
/**
* Creates a new instance of the GoToServicePlugin
+ * @param plugintool the tool
*/
public GoToServicePlugin(PluginTool plugintool) {
super(plugintool, true, true);
@@ -82,7 +83,7 @@ public final class GoToServicePlugin extends ProgramPlugin {
int getMaxHits() {
Options opt = tool.getOptions(PluginConstants.SEARCH_OPTION_NAME);
int maxSearchHits =
- opt.getInt(GhidraOptions.OPTION_SEARCH_LIMIT, PluginConstants.DEFAULT_SEARCH_LIMIT);
+ opt.getInt(GhidraOptions.OPTION_SEARCH_LIMIT, PluginConstants.DEFAULT_SEARCH_LIMIT);
return maxSearchHits;
}
@@ -125,7 +126,7 @@ public final class GoToServicePlugin extends ProgramPlugin {
@Override
public void setMemento(LocationMemento memento) {
DefaultNavigatableLocationMemento defaultMemento =
- (DefaultNavigatableLocationMemento) memento;
+ (DefaultNavigatableLocationMemento) memento;
defaultMemento.setMementos();
focusedNavigatable = defaultMemento.getFocusedNavigatable();
}
@@ -176,11 +177,13 @@ public final class GoToServicePlugin extends ProgramPlugin {
@Override
public void addNavigatableListener(NavigatableRemovalListener listener) {
- } // do nothing, default Navigatable never goes away
+ // do nothing, default Navigatable never goes away
+ }
@Override
public void removeNavigatableListener(NavigatableRemovalListener listener) {
- }// do nothing, default Navigatable never goes away
+ // do nothing, default Navigatable never goes away
+ }
@Override
public void setHighlight(ProgramSelection highlight) {
@@ -209,6 +212,11 @@ public final class GoToServicePlugin extends ProgramPlugin {
return currentHighlight;
}
+ @Override
+ public String getTextSelection() {
+ return null;
+ }
+
@Override
public void removeHighlightProvider(HighlightProvider highlightProvider, Program program) {
CodeViewerService service = tool.getService(CodeViewerService.class);
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchtext/SearchTextPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchtext/SearchTextPlugin.java
index 6de8e44b8b..b650e35c97 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchtext/SearchTextPlugin.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchtext/SearchTextPlugin.java
@@ -476,9 +476,9 @@ public class SearchTextPlugin extends ProgramPlugin implements OptionsChangeList
}
CodeViewerService codeViewerService = tool.getService(CodeViewerService.class);
- String textSelection = codeViewerService.getCurrentFieldTextSelection();
- ProgramLocation textField = codeViewerService.getCurrentLocation();
- Address address = textField.getAddress();
+ String textSelection = navigatable.getTextSelection();
+ ProgramLocation location = codeViewerService.getCurrentLocation();
+ Address address = location.getAddress();
Listing listing = context.getProgram().getListing();
CodeUnit codeUnit = listing.getCodeUnitAt(address);
boolean isInstruction = false;
@@ -490,9 +490,9 @@ public class SearchTextPlugin extends ProgramPlugin implements OptionsChangeList
else {
isInstruction = false;
}
- searchDialog.setValueFieldText(textSelection);
- searchDialog.setCurrentField(textField, isInstruction);
+ searchDialog.setCurrentField(location, isInstruction);
}
+ searchDialog.setValueFieldText(textSelection);
}
searchDialog.show(context.getComponentProvider());
}
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/DualListingNavigator.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/DualListingNavigator.java
index cb1c524070..c801e9697d 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/DualListingNavigator.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/DualListingNavigator.java
@@ -15,6 +15,11 @@
*/
package ghidra.app.util.viewer.listingpanel;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.Icon;
+
import ghidra.app.nav.*;
import ghidra.app.services.GoToService;
import ghidra.app.util.HighlightProvider;
@@ -23,11 +28,6 @@ import ghidra.program.util.ProgramLocation;
import ghidra.program.util.ProgramSelection;
import ghidra.util.UniversalIdGenerator;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.Icon;
-
/**
* Navigator for the listings contained in a ListingCodeComparisonPanel.
*/
@@ -35,7 +35,7 @@ class DualListingNavigator implements Navigatable {
private final ListingPanel listingPanel;
private List listeners =
- new ArrayList();
+ new ArrayList<>();
private long id;
private GoToService goToService;
@@ -58,11 +58,21 @@ class DualListingNavigator implements Navigatable {
listeners.add(listener);
}
+ @Override
+ public ProgramSelection getSelection() {
+ return listingPanel.getProgramSelection();
+ }
+
@Override
public ProgramSelection getHighlight() {
return listingPanel.getProgramHighlight();
}
+ @Override
+ public String getTextSelection() {
+ return listingPanel.getTextSelection();
+ }
+
@Override
public long getInstanceID() {
return id;
@@ -88,11 +98,6 @@ class DualListingNavigator implements Navigatable {
return listingPanel.getProgram();
}
- @Override
- public ProgramSelection getSelection() {
- return listingPanel.getProgramSelection();
- }
-
@Override
public boolean goTo(Program program, ProgramLocation location) {
if (program != listingPanel.getProgram()) {
diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/ListingPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/ListingPanel.java
index 2f5eadfc99..470a3d792a 100644
--- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/ListingPanel.java
+++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/ListingPanel.java
@@ -91,6 +91,8 @@ public class ListingPanel extends JPanel implements FieldMouseListener, FieldLoc
};
private List displayListeners = new ArrayList<>();
+ private String currentTextSelection;
+
/**
* Constructs a new ListingPanel using the given FormatManager and ServiceProvider.
*
@@ -1098,9 +1100,12 @@ public class ListingPanel extends JPanel implements FieldMouseListener, FieldLoc
if (stringSelectionListener != null) {
stringSelectionListener.setStringSelection(text);
}
+
+ currentTextSelection = text;
if (text != null) {
return;
}
+
if (trigger != EventTrigger.API_CALL) {
if (listingModel.getProgram() == null || programSelectionListener == null) {
return;
@@ -1112,6 +1117,15 @@ public class ListingPanel extends JPanel implements FieldMouseListener, FieldLoc
}
}
+ /**
+ * Returns the currently selected text. The value will only be non-null for selections within
+ * a single field.
+ * @return the selected text or null
+ */
+ public String getTextSelection() {
+ return currentTextSelection;
+ }
+
public void enablePropertyBasedColorModel(boolean b) {
propertyBasedColorModel.setEnabled(b);
}
diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/nav/TestDummyNavigatable.java b/Ghidra/Features/Base/src/test/java/ghidra/app/nav/TestDummyNavigatable.java
index b6c5c0c8bc..23475349fa 100644
--- a/Ghidra/Features/Base/src/test/java/ghidra/app/nav/TestDummyNavigatable.java
+++ b/Ghidra/Features/Base/src/test/java/ghidra/app/nav/TestDummyNavigatable.java
@@ -114,6 +114,12 @@ public class TestDummyNavigatable implements Navigatable {
return null;
}
+ @Override
+ public String getTextSelection() {
+ // stub
+ return null;
+ }
+
@Override
public void addNavigatableListener(NavigatableRemovalListener listener) {
// stub
diff --git a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ProgramByteViewerComponentProvider.java b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ProgramByteViewerComponentProvider.java
index 7391c8629f..b7dc9b7f76 100644
--- a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ProgramByteViewerComponentProvider.java
+++ b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ProgramByteViewerComponentProvider.java
@@ -160,6 +160,11 @@ public class ProgramByteViewerComponentProvider extends ByteViewerComponentProvi
return currentHighlight;
}
+ @Override
+ public String getTextSelection() {
+ return getTextSelection();
+ }
+
private void setSelection(ProgramSelection selection, boolean notify) {
currentSelection = selection;
if (selection == 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 f817902c89..9dffe4f771 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
@@ -889,6 +889,15 @@ public class DecompilerPanel extends JPanel implements FieldMouseListener, Field
return null;
}
+ public String getTextSelection() {
+ FieldSelection selection = fieldPanel.getSelection();
+ if (selection.isEmpty()) {
+ return null;
+ }
+
+ return FieldSelectionHelper.getFieldSelectionText(selection, fieldPanel);
+ }
+
public ClangToken getTokenAtCursor() {
FieldLocation cursorPosition = fieldPanel.getCursorLocation();
Field field = fieldPanel.getCurrentField();
diff --git a/Ghidra/Features/Decompiler/src/main/java/ghidra/app/plugin/core/decompile/DecompilerProvider.java b/Ghidra/Features/Decompiler/src/main/java/ghidra/app/plugin/core/decompile/DecompilerProvider.java
index 60adbfba23..765ed0543a 100644
--- a/Ghidra/Features/Decompiler/src/main/java/ghidra/app/plugin/core/decompile/DecompilerProvider.java
+++ b/Ghidra/Features/Decompiler/src/main/java/ghidra/app/plugin/core/decompile/DecompilerProvider.java
@@ -480,6 +480,12 @@ public class DecompilerProvider extends NavigatableComponentProviderAdapter
return null;
}
+ @Override
+ public String getTextSelection() {
+ DecompilerPanel decompilerPanel = controller.getDecompilerPanel();
+ return decompilerPanel.getTextSelection();
+ }
+
boolean isBusy() {
return redecompileUpdater.isBusy() || controller.isDecompiling();
}
diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FGProvider.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FGProvider.java
index 509ca88a7e..354127d588 100644
--- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FGProvider.java
+++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FGProvider.java
@@ -1193,6 +1193,22 @@ public class FGProvider extends VisualGraphComponentProvider vertices = groupVertex.getVertices();
diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/ListingGraphComponentPanel.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/ListingGraphComponentPanel.java
index 7ef201fd55..4674e15147 100644
--- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/ListingGraphComponentPanel.java
+++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/ListingGraphComponentPanel.java
@@ -404,6 +404,11 @@ public class ListingGraphComponentPanel extends AbstractGraphComponentPanel {
return listingPanel.getProgramSelection();
}
+ @Override
+ String getTextSelection() {
+ return listingPanel.getTextSelection();
+ }
+
@Override
ProgramLocation getProgramLocation() {
return listingPanel.getProgramLocation();
diff --git a/Ghidra/Features/ProgramDiff/src/main/java/ghidra/app/plugin/core/diff/DiffNavigatable.java b/Ghidra/Features/ProgramDiff/src/main/java/ghidra/app/plugin/core/diff/DiffNavigatable.java
index 21a8485fae..29617a3050 100644
--- a/Ghidra/Features/ProgramDiff/src/main/java/ghidra/app/plugin/core/diff/DiffNavigatable.java
+++ b/Ghidra/Features/ProgramDiff/src/main/java/ghidra/app/plugin/core/diff/DiffNavigatable.java
@@ -15,6 +15,8 @@
*/
package ghidra.app.plugin.core.diff;
+import javax.swing.Icon;
+
import ghidra.app.nav.*;
import ghidra.app.plugin.core.codebrowser.CodeViewerLocationMemento;
import ghidra.app.util.HighlightProvider;
@@ -24,8 +26,6 @@ import ghidra.program.util.ProgramSelection;
import ghidra.util.datastruct.WeakDataStructureFactory;
import ghidra.util.datastruct.WeakSet;
-import javax.swing.Icon;
-
/**
* This is a navigatable for use by the right-hand listing of the Diff.
* It should navigate within the Diff's listing, which would then reposition
@@ -140,6 +140,11 @@ class DiffNavigatable implements Navigatable {
return navigatable.getHighlight();
}
+ @Override
+ public String getTextSelection() {
+ return navigatable.getTextSelection();
+ }
+
@Override
public void addNavigatableListener(NavigatableRemovalListener listener) {
navigationListeners.add(listener);
diff --git a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/duallisting/VTListingNavigator.java b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/duallisting/VTListingNavigator.java
index ab6a63473e..df7311b0e7 100644
--- a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/duallisting/VTListingNavigator.java
+++ b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/duallisting/VTListingNavigator.java
@@ -1,6 +1,5 @@
/* ###
* IP: GHIDRA
- * REVIEWED: YES
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,6 +15,11 @@
*/
package ghidra.feature.vt.gui.duallisting;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.Icon;
+
import ghidra.app.nav.*;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.listingpanel.ListingCodeComparisonPanel;
@@ -25,20 +29,16 @@ import ghidra.program.util.ProgramLocation;
import ghidra.program.util.ProgramSelection;
import ghidra.util.UniversalIdGenerator;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.Icon;
-
public class VTListingNavigator implements Navigatable {
private final ListingCodeComparisonPanel dualListingPanel;
private final ListingPanel listingPanel;
private List listeners =
- new ArrayList();
+ new ArrayList<>();
private long id;
- public VTListingNavigator(ListingCodeComparisonPanel dualListingPanel, ListingPanel listingPanel) {
+ public VTListingNavigator(ListingCodeComparisonPanel dualListingPanel,
+ ListingPanel listingPanel) {
this.dualListingPanel = dualListingPanel;
this.listingPanel = listingPanel;
@@ -50,11 +50,21 @@ public class VTListingNavigator implements Navigatable {
listeners.add(listener);
}
+ @Override
+ public ProgramSelection getSelection() {
+ return listingPanel.getProgramSelection();
+ }
+
@Override
public ProgramSelection getHighlight() {
return listingPanel.getProgramHighlight();
}
+ @Override
+ public String getTextSelection() {
+ return listingPanel.getTextSelection();
+ }
+
@Override
public long getInstanceID() {
return id;
@@ -80,11 +90,6 @@ public class VTListingNavigator implements Navigatable {
return listingPanel.getProgram();
}
- @Override
- public ProgramSelection getSelection() {
- return listingPanel.getProgramSelection();
- }
-
@Override
public boolean goTo(Program program, ProgramLocation location) {
boolean went = listingPanel.goTo(location);
@@ -133,6 +138,7 @@ public class VTListingNavigator implements Navigatable {
@Override
public void setMemento(LocationMemento memento) {
+ // unsupported
}
@Override