diff --git a/Ghidra/Features/Base/src/main/help/help/topics/CodeBrowserPlugin/images/SelectionTable.png b/Ghidra/Features/Base/src/main/help/help/topics/CodeBrowserPlugin/images/SelectionTable.png index 7a2296ba0e..a002a3827e 100644 Binary files a/Ghidra/Features/Base/src/main/help/help/topics/CodeBrowserPlugin/images/SelectionTable.png and b/Ghidra/Features/Base/src/main/help/help/topics/CodeBrowserPlugin/images/SelectionTable.png differ diff --git a/Ghidra/Features/Base/src/main/java/help/screenshot/AbstractScreenShotGenerator.java b/Ghidra/Features/Base/src/main/java/help/screenshot/AbstractScreenShotGenerator.java index 49f7aea503..6eb33a3fd2 100644 --- a/Ghidra/Features/Base/src/main/java/help/screenshot/AbstractScreenShotGenerator.java +++ b/Ghidra/Features/Base/src/main/java/help/screenshot/AbstractScreenShotGenerator.java @@ -15,7 +15,7 @@ */ package help.screenshot; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.*; import java.awt.*; import java.awt.geom.GeneralPath; @@ -286,8 +286,8 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn /** * The same as {@link GhidraScreenShotGenerator#captureIsolatedProvider(Class, int, int)} * except this method will also capture the containing window. - * - * @param clazz the provider class + * + * @param clazz the provider class * @param width the width of the capture * @param height the height of the capture */ @@ -464,10 +464,10 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn } /** - * Captures the provider by using a screen shot and not by painting the provider directly + * Captures the provider by using a screen shot and not by painting the provider directly * (as does {@link #captureProvider(ComponentProvider)}). Use this method if you need to * capture the provider along with any popup windows. - * + * * @param provider the provider */ public void captureProviderWithScreenShot(ComponentProvider provider) { @@ -487,14 +487,14 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn } /** - * Captures the window, including decorations. This will use a {@link Robot} to create a + * Captures the window, including decorations. This will use a {@link Robot} to create a * screen capture, which has the effect of getting all items within the window bounds. This * method is needed if you wish to capture child windows, like popups/hovers. - * - *

Other capture methods will not use the screen capture mechanism, but rather will - * directly render the given component. In this case, subordinate windows will not be + * + *

Other capture methods will not use the screen capture mechanism, but rather will + * directly render the given component. In this case, subordinate windows will not be * captured. For example, see {@link #captureProvider(Class)}. - * + * * @param name the provider's name */ public void captureProviderWindow(String name) { @@ -504,14 +504,14 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn } /** - * Captures the window, including decorations. This will use a {@link Robot} to create a + * Captures the window, including decorations. This will use a {@link Robot} to create a * screen capture, which has the effect of getting all items within the window bounds. This * method is needed if you wish to capture child windows, like popups/hovers. - * - *

Other capture methods will not use the screen capture mechanism, but rather will - * directly render the given component. In this case, subordinate windows will not be + * + *

Other capture methods will not use the screen capture mechanism, but rather will + * directly render the given component. In this case, subordinate windows will not be * captured. For example, see {@link #captureProvider(Class)}. - * + * * @param clazz the provider's class */ public void captureProviderWindow(Class clazz) { @@ -520,14 +520,14 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn } /** - * Captures the window, including decorations. This will use a {@link Robot} to create a + * Captures the window, including decorations. This will use a {@link Robot} to create a * screen capture, which has the effect of getting all items within the window bounds. This * method is needed if you wish to capture child windows, like popups/hovers. - * - *

Other capture methods will not use the screen capture mechanism, but rather will - * directly render the given component. In this case, subordinate windows will not be + * + *

Other capture methods will not use the screen capture mechanism, but rather will + * directly render the given component. In this case, subordinate windows will not be * captured. For example, see {@link #captureProvider(Class)}. - * + * * @param provider the provider */ public void captureProviderWindow(ComponentProvider provider) { @@ -536,14 +536,14 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn } /** - * Captures the window, including decorations. This will use a {@link Robot} to create a + * Captures the window, including decorations. This will use a {@link Robot} to create a * screen capture, which has the effect of getting all items within the window bounds. This * method is needed if you wish to capture child windows, like popups/hovers. - * - *

Other capture methods will not use the screen capture mechanism, but rather will - * directly render the given component. In this case, subordinate windows will not be + * + *

Other capture methods will not use the screen capture mechanism, but rather will + * directly render the given component. In this case, subordinate windows will not be * captured. For example, see {@link #captureProvider(Class)}. - * + * * @param name the provider's name * @param width the desired width * @param height the desired height @@ -557,14 +557,14 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn } /** - * Captures the window, including decorations. This will use a {@link Robot} to create a + * Captures the window, including decorations. This will use a {@link Robot} to create a * screen capture, which has the effect of getting all items within the window bounds. This * method is needed if you wish to capture child windows, like popups/hovers. - * - *

Other capture methods will not use the screen capture mechanism, but rather will - * directly render the given component. In this case, subordinate windows will not be + * + *

Other capture methods will not use the screen capture mechanism, but rather will + * directly render the given component. In this case, subordinate windows will not be * captured. For example, see {@link #captureProvider(Class)}. - * + * * @param provider the provider's name * @param width the desired width * @param height the desired height @@ -607,7 +607,7 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn // The image returned here must be a BufferedImage, so create one // if not. It may be a ToolkitImage (eg: if the icon in question - // is retrieved from Icons.java), which would fail on a cast to + // is retrieved from Icons.java), which would fail on a cast to // BufferedImage during the save operation. image = ImageUtils.getBufferedImage(image); }); @@ -763,7 +763,7 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn public void generateImage(Component c) { - // Note: using the screen image has the downside of capturing non-Ghidra windows when + // Note: using the screen image has the downside of capturing non-Ghidra windows when // focus is lost. Prefer the component painting itself. This will not work // for native constructs like window decorations. if (!(c instanceof Window)) { @@ -1275,13 +1275,16 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn } - public void positionListingTop(final long address) { - runSwing(() -> { + public void positionListingTop(long address) { + boolean didGoTo = runSwing(() -> { CodeBrowserPlugin plugin = getPlugin(tool, CodeBrowserPlugin.class); FieldPanel fieldPanel = plugin.getFieldPanel(); - plugin.goToField(addr(address), AddressFieldFactory.FIELD_NAME, 0, 0); + boolean result = plugin.goToField(addr(address), AddressFieldFactory.FIELD_NAME, 0, 0); fieldPanel.positionCursor(0); + return result; }); + + assertTrue("Go To failed for address: " + address, didGoTo); } public void positionListingCenter(final long address) { @@ -1386,16 +1389,16 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn * Draws a rectangle around the given component. The root parameter is used to calculate * screen coordinates. This allows you to capture a sub-component of a UI, drawing * rectangles around children of said sub-component. - * - *

If you are unsure of what to pass for root, the call + * + *

If you are unsure of what to pass for root, the call * {@link #drawRectangleAround(JComponent, Color, int)} instead. - * + * * @param component the component to be en-rectangled - * @param root the outermost container widget being displayed; null implies a + * @param root the outermost container widget being displayed; null implies a * top-level parent * @param color the rectangle color * @param padding the space between the rectangle and the component; more space makes - * the component more visible + * the component more visible * @return the bounds of the drawn rectangle */ public Rectangle drawRectangleAround(JComponent component, JComponent root, Color color, @@ -1583,9 +1586,9 @@ public abstract class AbstractScreenShotGenerator extends AbstractGhidraHeadedIn /** * Crops a part of the current image, keeping what is inside the given bounds. This method - * creates a shape such that the top and bottom of the cropped image have a jagged line, + * creates a shape such that the top and bottom of the cropped image have a jagged line, * looking somewhat like a sideways lightening bolt. - * + * * @param bounds the bounds to keep * @return the snippet */ diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java index e97d9de615..758592eec5 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java @@ -144,15 +144,16 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator { @Test public void testCaptureSelectionTable() { setToolSize(1100, 700); - positionListingTop(0x0406bd7); - makeSelection(0x0406be1, 0x0406bf1); + positionListingTop(0x0406bd5); + makeSelection(0x0406be1, 0x0406bf6); performAction("Create Table From Selection", "CodeBrowserSelectionPlugin", true); Window window = waitForWindowByTitleContaining("Selection Table"); Point loc = plugin.getListingPanel().getLocationOnScreen(); Dimension size = window.getSize(); window.setBounds(loc.x + 300, loc.y + 150, size.width, 300); - captureProvider(CodeViewerProvider.class); + CodeViewerProvider provider = getProvider(CodeViewerProvider.class); + captureProviderWithScreenShot(provider); } @Test