private void launchToolWithAnimationAndOpenFiles(List<DomainFile> domainFiles, JFrame toolFrame,
			GGlassPane toolGlassPane, Runnable finishedCallback) {

		Icon icon = getIcon();
		Point buttonLocation = getLocation();
		Insets insets = getInsets();
		buttonLocation.x += insets.left;
		buttonLocation.y += insets.top;
		buttonLocation =
			SwingUtilities.convertPoint(getParent(), buttonLocation, toolFrame.getRootPane());

		// start the animation over top of this button, so it appears as though the tool is
		// launching from that button
		Rectangle startBounds =
			new Rectangle(buttonLocation, new Dimension(icon.getIconWidth(), icon.getIconHeight()));

		Dimension frameSize = toolFrame.getSize();

		// 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 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);
		final ZoomImageRunner zoomRunner = new ZoomImageRunner(toolGlassPane, painter, icon);
		MoveImageRunner moveRunner =
			new MoveImageRunner(toolGlassPane, startBounds, endBounds, painter);

		TimingTarget finishedTarget = new TimingTargetAdapter() {
			@Override
			public void end() {
				toolGlassPane.removePainter(painter);
				try {
					// cleanup any residual painting effects
					toolGlassPane.paintImmediately(toolGlassPane.getBounds());
					openDomainFiles(domainFiles);
				}
				finally {
					// always restore the cursor
					GGlassPane.setAllGlassPanesBusy(false);
					finishedCallback.run();
				}
			}
		};
		zoomRunner.addTimingTargetListener(finishedTarget);

		// change to a busy cursor and block input
		GGlassPane.setAllGlassPanesBusy(true);

		moveRunner.run();
		zoomRunner.run();
	}
Fix the button state after dragging/dropping, since this is broken in Java
Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolButton.java