From 2d5f72c83c2e23b6b17becc5b8cc29c77b9283b2 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Tue, 8 Nov 2022 18:11:40 -0500 Subject: [PATCH] GP-2810 - Fixed tooltip text for running tool buttons to include the tool's title --- .../ghidra/framework/main/ToolButton.java | 68 ++++++++----------- 1 file changed, 27 insertions(+), 41 deletions(-) diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolButton.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolButton.java index ac9279f688..7561d04a23 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolButton.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolButton.java @@ -41,20 +41,19 @@ import ghidra.util.bean.GGlassPane; import ghidra.util.exception.AssertException; import help.Help; import help.HelpService; +import utility.function.Dummy; /** * Component that is a drop target for a DataTreeTransferable object. * If the object contains a domain file that is supported by a tool of * this tool template, then a tool is launched with the data in it. *

- * This button can be used in one of two ways: to launch new instances of an associated tool + * This button can be used in one of two ways: to launch new instances of an associated tool * template, or to represent a running tool. */ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { - private static final Runnable DUMMY_CALLBACK_RUNNABLE = () -> { - // dummy - }; + private static final Runnable DUMMY_RUNNABLE = Dummy.runnable(); private DropTarget dropTarget; private DropTgtAdapter dropTargetAdapter; @@ -74,6 +73,8 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { /** * Construct a tool button that does not represent a running tool, using * the default tool icon. + * @param plugin the plugin + * @param template the template */ ToolButton(FrontEndPlugin plugin, ToolTemplate template) { this(plugin, null, template, template.getIconURL()); @@ -83,6 +84,9 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { /** * Construct a tool label that represents a running tool, using the * default RUNNING_TOOL icon. + * @param plugin the plugin + * @param tool the running tool + * @param template the template */ ToolButton(FrontEndPlugin plugin, PluginTool tool, ToolTemplate template) { this(plugin, tool, template, tool.getIconURL()); @@ -99,7 +103,6 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { associatedRunningTool = tool; this.template = template; setUpDragDrop(); - setToolTipText(generateToolTipText()); // configure the look and feel of the button setVerticalTextPosition(SwingConstants.BOTTOM); @@ -135,14 +138,11 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { } } - private String generateToolTipText() { + @Override + public String getToolTipText() { if (associatedRunningTool != null) { - if (associatedRunningTool instanceof PluginTool) { - return "" + - HTMLUtilities.escapeHTML(associatedRunningTool.getToolFrame().getTitle()); - } - - return "" + HTMLUtilities.escapeHTML(associatedRunningTool.getName()); + return "" + + HTMLUtilities.escapeHTML(associatedRunningTool.getToolFrame().getTitle()); } return "" + HTMLUtilities.escapeHTML(template.getName()); } @@ -151,9 +151,9 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { doLaunchTool(new DomainFile[] { domainFile }); } -//================================================================================================== +//================================================================================================== // Droppable interface -//================================================================================================== +//================================================================================================== /** * Set drag feedback according to the OK parameter. @@ -211,7 +211,7 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { /** * The given list must contain only valid domain files (i.e., no folders or null items) - * @param nodeList The list of DataTreeNode objects to validate + * @param fileList The list of file objects to validate * @return true if all items in the list are supported */ private boolean containsSupportedDataTypes(List fileList) { @@ -239,7 +239,7 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { * calls this method from its drop() method. * * @param obj Transferable object that is to be dropped. - * @param e has current state of drop operation + * @param event has current state of drop operation * @param f represents the opaque concept of a data format as * would appear on a clipboard, during drag and drop. */ @@ -375,8 +375,8 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { return task.getVersionedObject(); } -//================================================================================================== -// Draggable interface +//================================================================================================== +// Draggable interface //================================================================================================== /** Fix the button state after dragging/dropping, since this is broken in Java */ @@ -402,7 +402,7 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { // Unusual Code Alert! // When dragging, we do not get mouseReleased() events, which we use to launch tools. - // In this case, the drag was cancelled; if we are over ourselves, then simulate + // In this case, the drag was cancelled; if we are over ourselves, then simulate // the Java-eaten mouseReleased() call Container parent = getParent(); if (parent == null) { @@ -457,11 +457,6 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { return plugin.getToolButtonTransferable(); } - /** - * Do the move operation; called when the drag and drop operation - * completes. - * @see ghidra.util.bean.dnd.DragSourceAdapter#dragDropEnd - */ @Override public void move() { resetButtonAfterDrag(this); @@ -484,11 +479,8 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { //================================================================================================== // Package methods -//================================================================================================== +//================================================================================================== - /** - * Set the tool template for this button. - */ void setToolTemplate(ToolTemplate template, Icon icon) { this.template = template; setIcon(icon); @@ -498,16 +490,10 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { return template; } - /** - * Return whether this tool button represents a running tool. - */ boolean isRunningTool() { return associatedRunningTool != null; } - /** - * Close the running tool. - */ void closeTool() { associatedRunningTool.close(); } @@ -548,7 +534,7 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { } private void openFilesAndOpenToolAsNecessary(final DomainFile[] domainFiles) { - openFilesAndOpenToolAsNecessary(domainFiles, DUMMY_CALLBACK_RUNNABLE); + openFilesAndOpenToolAsNecessary(domainFiles, DUMMY_RUNNABLE); } private void openFilesAndOpenToolAsNecessary(final DomainFile[] domainFiles, @@ -565,7 +551,7 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { Component glassPane = toolFrame.getGlassPane(); if (!(glassPane instanceof GGlassPane)) { // We cannot perform the tool launching animation, so just do the old fashion way - Msg.debug(this, "Found root frame without a GhidraGlassPane registered!"); + Msg.debug(this, "Found root frame without a GGlassPane registered!"); // try to recover without animation PluginTool newTool = plugin.getActiveWorkspace().runTool(template); @@ -600,9 +586,9 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { // the final point over which the image will be painted Rectangle endBounds = new Rectangle(new Point(0, 0), frameSize); - // Create our animation code: a zooming effect and an effect to move where the image is - // painted. These effects are independent code-wise, but work together in that the - // mover will set the location and size, and the zoomer will will paint the image with + // Create our animation code: a zooming effect and an effect to move where the image is + // painted. These effects are independent code-wise, but work together in that the + // mover will set the location and size, and the zoomer will will paint the image with // a transparency and a zoom level, which is affected by the movers bounds changing. Image image = ZoomedImagePainter.createIconImage(icon); final ZoomedImagePainter painter = new ZoomedImagePainter(startBounds, image); @@ -690,8 +676,8 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { } //================================================================================================== -// Inner Classes -//================================================================================================== +// Inner Classes +//================================================================================================== private class ToolChangeListener implements DefaultToolChangeListener { private final ToolTemplate toolTemplate;