}
/**
- * A package-level method. Subclasses should not call this.
- *
+ * Subclasses should not call this. Loading for subclasses is done inside their implementation
+ * of {@link #doLoad(Accumulator, TaskMonitor)}.
+ *
* This exists to handle whether this model should load incrementally.
*
* @param monitor the monitor
@@ -182,11 +183,15 @@ public abstract class ThreadedTableModel
}
// do the load now
- ListAccumulator accumulator = new ListAccumulator<>();
+ ListAccumulator accumulator = createAccumulator();
doLoad(accumulator, monitor);
return accumulator.asList();
}
+ protected ListAccumulator createAccumulator() {
+ return new ListAccumulator();
+ }
+
private void initializeWorker() {
if (worker == null) {
worker = new Worker("GTable Worker: " + getName(), incrementalMonitor);
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/ThreadedTableModelListenerAdapter.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/ThreadedTableModelListenerAdapter.java
new file mode 100644
index 0000000000..fcfabb2a80
--- /dev/null
+++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/ThreadedTableModelListenerAdapter.java
@@ -0,0 +1,34 @@
+/* ###
+ * IP: GHIDRA
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package docking.widgets.table.threaded;
+
+public abstract class ThreadedTableModelListenerAdapter implements ThreadedTableModelListener {
+
+ @Override
+ public void loadPending() {
+ // stub
+ }
+
+ @Override
+ public void loadingStarted() {
+ // stub
+ }
+
+ @Override
+ public void loadingFinished(boolean wasCancelled) {
+ // stub
+ }
+}
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/internal/GTreeDragNDropAdapter.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/internal/GTreeDragNDropAdapter.java
index c62a786aee..cbabf3aa9f 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/internal/GTreeDragNDropAdapter.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/internal/GTreeDragNDropAdapter.java
@@ -39,8 +39,8 @@ import ghidra.framework.Platform;
import ghidra.util.ColorUtils;
import ghidra.util.Msg;
-public class GTreeDragNDropAdapter implements DragSourceListener, DragGestureListener,
- DropTargetListener {
+public class GTreeDragNDropAdapter
+ implements DragSourceListener, DragGestureListener, DropTargetListener {
private JTree tree;
private GTreeDragNDropHandler dragNDropHandler;
@@ -159,9 +159,8 @@ public class GTreeDragNDropAdapter implements DragSourceListener, DragGestureLis
GradientPaint mask;
Color treeBg = tree.getBackground();
Color transparentTreeBackground = ColorUtils.withAlpha(treeBg, 100);
- mask =
- new GradientPaint(0, 0, transparentTreeBackground, 0, size.height >> 1,
- Palette.NO_COLOR);
+ mask = new GradientPaint(0, 0, transparentTreeBackground, 0, size.height >> 1,
+ Palette.NO_COLOR);
g2.setPaint(mask);
// Sets the alpha composite
@@ -195,9 +194,8 @@ public class GTreeDragNDropAdapter implements DragSourceListener, DragGestureLis
return;
}
- Component renderer =
- cellRenderer.getTreeCellRendererComponent(tree, node, true, true,
- node.isLeaf(), row, false);
+ Component renderer = cellRenderer.getTreeCellRendererComponent(tree, node, true,
+ true, node.isLeaf(), row, false);
renderer.setSize(renderer.getPreferredSize());
// move down the point in our graphics space into which we will paint
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeDragNDropHandler.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeDragNDropHandler.java
index d3c5e1b805..1de2ae82c8 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeDragNDropHandler.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeDragNDropHandler.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.
@@ -25,33 +24,34 @@ import docking.widgets.tree.GTreeNode;
public interface GTreeDragNDropHandler extends GTreeTransferHandler {
/**
- * Return true if the dragUserData can be dragged.
- * @param dragUserData data where user is initiating the drag operation
- * @param dragAction user action for the drag operation
- */
- public boolean isStartDragOk(List dragUserData, int dragAction);
- /**
+ * Return true if the dragUserData can be dragged.
+ * @param dragUserData data where user is initiating the drag operation
+ * @param dragAction user action for the drag operation
+ * @return true if the dragUserData can be dragged
+ */
+ public boolean isStartDragOk(List dragUserData, int dragAction);
+
+ /**
* Returns the supported Drag actions for this tree. For available actions see
* {@link DnDConstants}.
* @return the supported Drag actions.
*/
public int getSupportedDragActions();
+ /**
+ * Return true if the drop site is valid for the given target.
+ * @param destUserData destination for node being dragged
+ * @param flavors flavor(s) being dragged
+ * @param dropAction user action for drop operation
+ * @return true if the drop site is valid for the given target
+ */
+ public boolean isDropSiteOk(GTreeNode destUserData, DataFlavor[] flavors, int dropAction);
- /**
- * Return true if the drop site is valid for the given target.
- * @param destUserData destination for node being dragged
- * @param flavors flavor(s) being dragged
- * @param dropAction user action for drop operation
- */
- boolean isDropSiteOk(GTreeNode destUserData, DataFlavor[] flavors, int dropAction);
-
- /**
- * Add the given transferable's data to the destination user data.
- * @param destUserData destination node for the data.
- * @param transferable the transferable being dragged whose data will be dropped.
- * @param dropAction user action for drop operation
- */
- void drop(GTreeNode destUserData, Transferable transferable, int dropAction);
-
+ /**
+ * Add the given transferable's data to the destination user data.
+ * @param destUserData destination node for the data.
+ * @param transferable the transferable being dragged whose data will be dropped.
+ * @param dropAction user action for drop operation
+ */
+ public void drop(GTreeNode destUserData, Transferable transferable, int dropAction);
}
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeTransferHandler.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeTransferHandler.java
index 6949f6ce1a..6f8510f3c8 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeTransferHandler.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeTransferHandler.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.
@@ -23,7 +22,7 @@ import java.util.List;
import docking.widgets.tree.GTreeNode;
/**
- * A generic transfer handler used by GTrees to handle transfering drag/drop data and clipboard
+ * A generic transfer handler used by GTrees to handle transferring drag/drop data and clipboard
* data.
*/
public interface GTreeTransferHandler {
@@ -35,16 +34,16 @@ public interface GTreeTransferHandler {
* @return the DataFlavors for the types of data that this transferable supports, based upon
* the given selection.
*/
- public DataFlavor[] getSupportedDataFlavors(List transferNodes);
+ public DataFlavor[] getSupportedDataFlavors(List transferNodes);
- /**
- * Gets the transfer data from the selection based upon the given flavor.
- * @param transferNodes The nodes from which to get the data.
- * @param flavor The flavor of data to retrieve from the given selection.
- * @return the transfer data from the selection based upon the given flavor.
- * @throws UnsupportedFlavorException if the given flavor is not one of the supported flavors
- * returned by {@link #getSupportedDataFlavors(List)}.
- */
- public Object getTransferData(List transferNodes,
- DataFlavor flavor) throws UnsupportedFlavorException;
+ /**
+ * Gets the transfer data from the selection based upon the given flavor.
+ * @param transferNodes The nodes from which to get the data.
+ * @param flavor The flavor of data to retrieve from the given selection.
+ * @return the transfer data from the selection based upon the given flavor.
+ * @throws UnsupportedFlavorException if the given flavor is not one of the supported flavors
+ * returned by {@link #getSupportedDataFlavors(List)}.
+ */
+ public Object getTransferData(List transferNodes, DataFlavor flavor)
+ throws UnsupportedFlavorException;
}
diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTableDnDHandler.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTableDnDHandler.java
deleted file mode 100644
index 66d5bde123..0000000000
--- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTableDnDHandler.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/* ###
- * IP: GHIDRA
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package ghidra.framework.main.datatable;
-
-import java.awt.*;
-import java.awt.datatransfer.*;
-import java.awt.dnd.*;
-import java.awt.event.*;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.CellRendererPane;
-import javax.swing.table.*;
-
-import docking.widgets.table.GTable;
-import generic.theme.GThemeDefaults.Colors.Palette;
-import ghidra.framework.main.datatree.DataTreeDragNDropHandler;
-import ghidra.framework.model.DomainFile;
-import ghidra.util.ColorUtils;
-
-public class ProjectDataTableDnDHandler implements DragSourceListener, DragGestureListener {
-
- private static final DataFlavor DOMAIN_FILE_LIST_FLAVOR =
- DataTreeDragNDropHandler.localDomainFileFlavor;
- static final DataFlavor[] ROW_DATA_FLAVORS = { DOMAIN_FILE_LIST_FLAVOR };
- public static List selectedData;
-
- private GTable table;
- private ProjectDataTableModel model;
-
- ProjectDataTableDnDHandler(GTable table, ProjectDataTableModel model) {
- this.table = table;
- this.model = model;
-
- performMultiSelectionMouseFix();
-
- DragSource dragSource = DragSource.getDefaultDragSource();
- dragSource.createDefaultDragGestureRecognizer(table, DnDConstants.ACTION_COPY_OR_MOVE,
- this);
- }
-
- private void performMultiSelectionMouseFix() {
-
- //
- // Insert our listener into the front of the listeners so that we get a chance to
- // handle events first.
- //
-
- MouseListener[] oldMouseListeners = table.getMouseListeners();
- MouseMotionListener[] oldMouseMotionListeners = table.getMouseMotionListeners();
- for (MouseListener l : oldMouseListeners) {
- table.removeMouseListener(l);
- }
- for (MouseMotionListener l : oldMouseMotionListeners) {
- table.removeMouseMotionListener(l);
- }
-
- DnDMouseListener newListener = new DnDMouseListener();
- table.addMouseListener(newListener);
- table.addMouseMotionListener(newListener);
-
- for (MouseListener l : oldMouseListeners) {
- table.addMouseListener(l);
- }
- for (MouseMotionListener l : oldMouseMotionListeners) {
- table.addMouseMotionListener(l);
- }
- }
-
-//======================================================
-// DragSourceListener method
-//======================================================
- @Override
- public void dragDropEnd(DragSourceDropEvent dsde) {
-// renderer.setDropRow(-1);
-// oldRow = -1;
- table.repaint();
-// provider.setIgnoreSelectionChange(false);
- }
-
- @Override
- public void dragEnter(DragSourceDragEvent dsde) {
- // don't care
- }
-
- @Override
- public void dragExit(DragSourceEvent dse) {
- setCursor(DnDConstants.ACTION_NONE, dse.getDragSourceContext());
- }
-
- private void setCursor(int action, DragSourceContext dragSourceContext) {
- Cursor cursor = DragSource.DefaultCopyNoDrop;
- switch (action) {
- case DnDConstants.ACTION_COPY:
- cursor = DragSource.DefaultCopyDrop;
- break;
- case DnDConstants.ACTION_MOVE:
- cursor = DragSource.DefaultMoveDrop;
- break;
- case DnDConstants.ACTION_LINK:
- cursor = DragSource.DefaultLinkDrop;
- }
- dragSourceContext.setCursor(cursor);
- }
-
- @Override
- public void dragOver(DragSourceDragEvent dsde) {
- setCursor(dsde.getDropAction(), dsde.getDragSourceContext());
- }
-
- @Override
- public void dropActionChanged(DragSourceDragEvent dsde) {
- // don't care
- }
-
-//======================================================
-// DragGestureListener method
-//======================================================
- @Override
- public void dragGestureRecognized(DragGestureEvent dragEvent) {
-
- // check input event: if any button other than MB1 is pressed,
- // don't attempt to process the drag and drop event.
- InputEvent ie = dragEvent.getTriggerEvent();
- int modifiers = ie.getModifiersEx();
- if ((modifiers & InputEvent.BUTTON2_DOWN_MASK) != 0 ||
- (modifiers & InputEvent.BUTTON3_DOWN_MASK) != 0) {
- return;
- }
-
- selectedData = createSelectionList(table);
-
- Transferable transferable = new DomainFileTransferable(selectedData);
- Image image = getDragImage(selectedData);
-
- try {
-
- dragEvent.startDrag(DragSource.DefaultMoveDrop, image, new Point(0, 0), transferable,
- this);
- }
- catch (InvalidDnDOperationException exc) {
- // not sure why, but apparently we don't care
- }
- }
-
- private Image getDragImage(List files) {
-
- Container parent = table.getParent();
- Dimension size = parent.getSize(); // assuming this is JViewport
- BufferedImage bufferedImage =
- new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB);
-
- Graphics graphics = bufferedImage.getGraphics();
- graphics.setClip(0, 0, size.width, size.height);
-
- paintRecords(files, graphics);
-
- // now we will create a fade effect using an alpha composite and a gradient
- Graphics2D g2 = (Graphics2D) graphics;
- GradientPaint mask;
- Color treeBackground = table.getBackground();
- Color transparentTreeBackground = ColorUtils.withAlpha(treeBackground, 200);
- mask = new GradientPaint(0, 0, transparentTreeBackground, 0, size.height >> 1,
- Palette.NO_COLOR);
- g2.setPaint(mask);
-
- // Sets the alpha composite
- g2.setComposite(AlphaComposite.DstIn);
-
- // Paints the mask
- g2.fillRect(0, 0, size.width, size.height);
-
- return bufferedImage;
- }
-
- /** Paint each of the given records that is inside of the clips */
- private void paintRecords(List records, Graphics g) {
- CellRendererPane rendererPane = new CellRendererPane();
- paintCells(records, rendererPane, g);
- }
-
- private void paintCells(List domainFileInfos, CellRendererPane rendererPane,
- Graphics g) {
- TableColumnModel cm = table.getColumnModel();
- int columnMargin = cm.getColumnMargin();
-
- Rectangle clip = g.getClipBounds();
- int yOffset = clip.y;
-
- int rowCount = domainFileInfos.size();
- int columnCount = table.getColumnCount();
-
- int modelRow = model.getRowIndex(domainFileInfos.get(0));
- Rectangle cellRect = table.getCellRect(modelRow, 0, false);
- int startYOffset = cellRect.y;
-
- TableColumn aColumn;
- int columnWidth;
- for (int row = 0; row < rowCount; row++) {
- if (clip.y + clip.height < yOffset - startYOffset) {
- return; // no need to paint past the end of our visible area
- }
-
- modelRow = model.getRowIndex(domainFileInfos.get(row));
- cellRect = table.getCellRect(modelRow, 0, false);
- cellRect.y -= startYOffset; // paint the row at the top of the graphics, not where it really lives
- yOffset += cellRect.height;
- for (int column = 0; column < columnCount; column++) {
- aColumn = cm.getColumn(column);
- columnWidth = aColumn.getWidth();
- cellRect.width = columnWidth - columnMargin;
- paintCell(rendererPane, g, cellRect, modelRow, column);
- cellRect.x += columnWidth;
- }
- }
- }
-
- private void paintCell(CellRendererPane rendererPane, Graphics g, Rectangle cellRect, int row,
- int column) {
- TableCellRenderer tableRenderer = table.getCellRenderer(row, column);
- Component component = table.prepareRenderer(tableRenderer, row, column);
- rendererPane.paintComponent(g, component, table, cellRect.x, cellRect.y, cellRect.width,
- cellRect.height, true);
- }
-
- private List createSelectionList(GTable tableToSelect) {
- ArrayList list = new ArrayList<>();
-
- int[] rows = table.getSelectedRows();
-
- if (rows == null) {
- return list;
- }
- for (int row : rows) {
- list.add(model.getRowObject(row));
- }
- return list;
- }
-
- class DomainFileTransferable implements Transferable {
- private List list;
-
- DomainFileTransferable(List list) {
- this.list = list;
- }
-
- @Override
- public Object getTransferData(DataFlavor flavor)
- throws UnsupportedFlavorException, IOException {
- if (DOMAIN_FILE_LIST_FLAVOR.equals(flavor)) {
- return getDomainFileList();
- }
- throw new UnsupportedFlavorException(flavor);
- }
-
- private Object getDomainFileList() {
- List domainFileList = new ArrayList<>();
- for (DomainFileInfo domainFileInfo : list) {
- domainFileList.add(domainFileInfo.getDomainFile());
- }
- return domainFileList;
- }
-
- @Override
- public DataFlavor[] getTransferDataFlavors() {
- return ROW_DATA_FLAVORS;
- }
-
- @Override
- public boolean isDataFlavorSupported(DataFlavor flavor) {
- return DOMAIN_FILE_LIST_FLAVOR.equals(flavor);
- }
- }
-
- private class DnDMouseListener extends MouseAdapter {
-
- private boolean consuming = false;
- private boolean didDrag = false;
-
- @Override
- public void mousePressed(MouseEvent e) {
- consuming = maybeConsumeEvent(e);
- didDrag = false;
- }
-
- @Override
- public void mouseReleased(MouseEvent e) {
- if (!consuming) {
- return;
- }
-
- // continue to consume the event that was started during the pressed event, for symmetry
- maybeConsumeEvent(e);
- consuming = false;
-
- if (!didDrag) {
- //
- // If we dragged, leave the initial selection, which does not disrupt the user's
- // workflow; otherwise, select the clicked row. This allows users to change the
- // selection by clicking in the table, which is the default table behavior.
- //
- table.clearSelection();
- int row = table.rowAtPoint(e.getPoint());
- table.selectRow(row);
- }
- }
-
- @Override
- public void mouseDragged(MouseEvent e) {
- // always consume the drag so that Java does not change the selection
- e.consume();
- didDrag = true;
- }
-
- private boolean maybeConsumeEvent(MouseEvent e) {
-
- if (!isBasicLeftClick(e)) {
- return false;
- }
-
- // don't let other listeners process the event if we are 'pressing' the mouse
- // button on an already selected row (to prevent de-selecting a multi-selection for
- // a drag operation)
- int row = table.rowAtPoint(e.getPoint());
- if (table.isRowSelected(row)) {
- e.consume();
- return true;
- }
-
- return false;
- }
-
- private boolean isBasicLeftClick(MouseEvent e) {
-
- if (e.getButton() != MouseEvent.BUTTON1) {
- return false;
- }
-
- if (e.getClickCount() > 1) {
- return false;
- }
-
- if (e.isControlDown() || e.isAltDown() || e.isShiftDown() || e.isMetaDown()) {
- return false;
- }
-
- return true;
- }
- }
-
-}
diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java
index 3ee85c9ffa..aa12a134e6 100644
--- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java
+++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java
@@ -16,8 +16,10 @@
package ghidra.framework.main.datatable;
import java.awt.*;
+import java.awt.datatransfer.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
+import java.io.IOException;
import java.util.*;
import java.util.List;
@@ -25,10 +27,12 @@ import javax.swing.*;
import docking.ActionContext;
import docking.ComponentProvider;
+import docking.dnd.GTableDragProvider;
import docking.widgets.label.GHtmlLabel;
import docking.widgets.table.*;
import docking.widgets.table.threaded.*;
import ghidra.framework.main.FrontEndPlugin;
+import ghidra.framework.main.datatree.DataTreeDragNDropHandler;
import ghidra.framework.model.*;
import ghidra.framework.plugintool.PluginTool;
import ghidra.util.*;
@@ -100,7 +104,8 @@ public class ProjectDataTablePanel extends JPanel {
gTable.setDefaultRenderer(Date.class, new DateCellRenderer());
gTable.setDefaultRenderer(DomainFileType.class, new TypeCellRenderer());
- new ProjectDataTableDnDHandler(gTable, model);
+ // self-registering drag provider
+ new ProjectDataTableDragProvider();
}
/**
@@ -285,6 +290,58 @@ public class ProjectDataTablePanel extends JPanel {
// Inner Classes
//==================================================================================================
+ private class ProjectDataTableDragProvider extends GTableDragProvider {
+
+ private static final DataFlavor DOMAIN_FILE_LIST_FLAVOR =
+ DataTreeDragNDropHandler.localDomainFileFlavor;
+ private static final DataFlavor[] ROW_DATA_FLAVORS = { DOMAIN_FILE_LIST_FLAVOR };
+
+ ProjectDataTableDragProvider() {
+ super(gTable, model);
+ }
+
+ @Override
+ protected Transferable createDragTransferable(List items) {
+ return new DomainFileTransferable(items);
+ }
+
+ private class DomainFileTransferable implements Transferable {
+ private List list;
+
+ DomainFileTransferable(List list) {
+ this.list = list;
+ }
+
+ @Override
+ public Object getTransferData(DataFlavor flavor)
+ throws UnsupportedFlavorException, IOException {
+ if (DOMAIN_FILE_LIST_FLAVOR.equals(flavor)) {
+ return getDomainFileList();
+ }
+ throw new UnsupportedFlavorException(flavor);
+ }
+
+ private Object getDomainFileList() {
+ List domainFileList = new ArrayList<>();
+ for (DomainFileInfo domainFileInfo : list) {
+ domainFileList.add(domainFileInfo.getDomainFile());
+ }
+ return domainFileList;
+ }
+
+ @Override
+ public DataFlavor[] getTransferDataFlavors() {
+ return ROW_DATA_FLAVORS;
+ }
+
+ @Override
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ return DOMAIN_FILE_LIST_FLAVOR.equals(flavor);
+ }
+ }
+
+ }
+
private class ProjectDataTableDomainFolderChangeListener implements DomainFolderChangeListener {
// TODO: file and subfolder events are only triggered if the parent folder has been
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/GhidraScriptMgrPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/GhidraScriptMgrPluginScreenShots.java
index 9d5c199055..78f20580b1 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/GhidraScriptMgrPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/GhidraScriptMgrPluginScreenShots.java
@@ -24,8 +24,9 @@ import javax.swing.*;
import org.junit.Test;
-import docking.ComponentProvider;
+import docking.DialogComponentProvider;
import docking.action.DockingActionIf;
+import docking.widgets.table.GTable;
import docking.widgets.tree.GTree;
import docking.widgets.tree.GTreeNode;
import generic.jar.ResourceFile;
@@ -60,6 +61,11 @@ public class GhidraScriptMgrPluginScreenShots extends GhidraScreenShotGenerator
d = waitForJDialog("New Script");
pressButtonByText(d, "OK");
+ waitForSwing();
+
+ DialogComponentProvider dialog = waitForDialogComponent("Script Path Added/Enabled");
+ close(dialog);
+
captureIsolatedProvider(GhidraScriptEditorComponentProvider.class, 597, 600);
}
@@ -88,10 +94,8 @@ public class GhidraScriptMgrPluginScreenShots extends GhidraScreenShotGenerator
@Test
public void testAssign_Key_Binding() throws Exception {
- ComponentProvider componentProvider = showProvider(GhidraScriptComponentProvider.class);
- JComponent component = componentProvider.getComponent();
- DraggableScriptTable scriptTable =
- (DraggableScriptTable) findComponentByName(component, "SCRIPT_TABLE");
+ GhidraScriptComponentProvider provider = showProvider(GhidraScriptComponentProvider.class);
+ GTable scriptTable = provider.getTable();
selectRow(scriptTable, "HelloWorldScript.java");
performAction("Key Binding", "GhidraScriptMgrPlugin", false);
@@ -101,10 +105,8 @@ public class GhidraScriptMgrPluginScreenShots extends GhidraScreenShotGenerator
@Test
public void testSelect_Font() throws Exception {
- ComponentProvider componentProvider = showProvider(GhidraScriptComponentProvider.class);
- JComponent component = componentProvider.getComponent();
- DraggableScriptTable scriptTable =
- (DraggableScriptTable) findComponentByName(component, "SCRIPT_TABLE");
+ GhidraScriptComponentProvider provider = showProvider(GhidraScriptComponentProvider.class);
+ GTable scriptTable = provider.getTable();
selectRow(scriptTable, "HelloWorldScript.java");
performAction("Edit", "GhidraScriptMgrPlugin", false);
@@ -132,37 +134,26 @@ public class GhidraScriptMgrPluginScreenShots extends GhidraScreenShotGenerator
@Test
public void testEdit_Script() throws Exception {
- ResourceFile newScript = createHelloWorldScript("MyHelloWorldScript");
- ComponentProvider componentProvider = showProvider(GhidraScriptComponentProvider.class);
+ createHelloWorldScript("MyHelloWorldScript");
+ GhidraScriptComponentProvider provider = showProvider(GhidraScriptComponentProvider.class);
- JComponent component = componentProvider.getComponent();
- DraggableScriptTable scriptTable =
- (DraggableScriptTable) findComponentByName(component, "SCRIPT_TABLE");
- selectRow(scriptTable, newScript.getName());
performAction("Edit", "GhidraScriptMgrPlugin", false);
-
waitForSwing();
- GhidraScriptEditorComponentProvider provider =
- getProvider(GhidraScriptEditorComponentProvider.class);
-
moveProviderToFront(provider, 557, 378);
captureProvider(provider);
}
@Test
public void testScript_Manager() {
- ComponentProvider scriptManager = showProvider(GhidraScriptComponentProvider.class);
- JComponent component = scriptManager.getComponent();
+ GhidraScriptComponentProvider provider = showProvider(GhidraScriptComponentProvider.class);
+ JComponent component = provider.getComponent();
final JSplitPane splitPane =
(JSplitPane) findComponentByName(component, "dataDescriptionSplit");
runSwing(() -> splitPane.setDividerLocation(0.63));
- DraggableScriptTable scriptTable =
- (DraggableScriptTable) findComponentByName(component, "SCRIPT_TABLE");
-
- GTree scriptCategoryTree = (GTree) findComponentByName(component, "CATEGORY_TREE");
- removeSuspectNodes(scriptCategoryTree);
+ GTable scriptTable = provider.getTable();
+ GTree scriptCategoryTree = provider.getTree();
selectPath(scriptCategoryTree, "Scripts", "Examples");
collapse(scriptCategoryTree, "Examples");// don't open examples (silly JTree)
@@ -170,8 +161,8 @@ public class GhidraScriptMgrPluginScreenShots extends GhidraScreenShotGenerator
selectRow(scriptTable, "HelloWorldScript.java");
scriptTable.scrollToSelectedRow();
- moveProviderToFront(scriptManager, 1333, 570);
- captureProvider(scriptManager);
+ moveProviderToFront(provider, 1333, 570);
+ captureProvider(provider);
}
@Test
@@ -196,10 +187,8 @@ public class GhidraScriptMgrPluginScreenShots extends GhidraScreenShotGenerator
public void testDelete_Script_Confirm() throws Exception {
createHelloWorldScript("FooScript");
- ComponentProvider componentProvider = showProvider(GhidraScriptComponentProvider.class);
- JComponent component = componentProvider.getComponent();
- DraggableScriptTable scriptTable =
- (DraggableScriptTable) findComponentByName(component, "SCRIPT_TABLE");
+ GhidraScriptComponentProvider provider = showProvider(GhidraScriptComponentProvider.class);
+ GTable scriptTable = provider.getTable();
selectRow(scriptTable, "FooScript.java");
performAction("Delete", "GhidraScriptMgrPlugin", false);
captureDialog();
@@ -278,27 +267,6 @@ public class GhidraScriptMgrPluginScreenShots extends GhidraScreenShotGenerator
});
}
- private void removeSuspectNodes(final GTree scriptCategoryTree) {
- List accepted = new ArrayList<>(
- Arrays.asList("Examples", "Data Types", "Binary", "Functions", "Import", "Analysis"));
-
- List toRemove = new ArrayList<>();
- final GTreeNode rootNode = scriptCategoryTree.getViewRoot();
- List children = rootNode.getChildren();
- for (GTreeNode child : children) {
- String name = child.getName();
- if (!accepted.contains(name)) {
- toRemove.add(child);
- }
- }
-
- for (GTreeNode node : toRemove) {
- rootNode.removeNode(node);
- }
-
- waitForTree(scriptCategoryTree);
- }
-
private ResourceFile createTempScriptFile(String name) {
File userScriptsDir = new File(GhidraScriptUtil.USER_SCRIPTS_DIR);