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