From d0ce510437aa5bf89fe6a48460c35e4530d032b8 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Thu, 26 Jan 2023 10:08:30 -0500 Subject: [PATCH] GP-3051 - Updated the Front End Project Table to allow users to change selected rows by clicking any already selected row. --- .../datatable/ProjectDataTableDnDHandler.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) 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 index 3eacbe12e7..698aebab97 100644 --- 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 @@ -243,7 +243,7 @@ public class ProjectDataTableDnDHandler implements DragSourceListener, DragGestu } private List createSelectionList(GTable tableToSelect) { - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList<>(); int[] rows = table.getSelectedRows(); @@ -273,7 +273,7 @@ public class ProjectDataTableDnDHandler implements DragSourceListener, DragGestu } private Object getDomainFileList() { - List domainFileList = new ArrayList(); + List domainFileList = new ArrayList<>(); for (DomainFileInfo domainFileInfo : list) { domainFileList.add(domainFileInfo.getDomainFile()); } @@ -294,10 +294,12 @@ public class ProjectDataTableDnDHandler implements DragSourceListener, DragGestu 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 @@ -309,12 +311,24 @@ public class ProjectDataTableDnDHandler implements DragSourceListener, DragGestu // 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) { @@ -323,7 +337,7 @@ public class ProjectDataTableDnDHandler implements DragSourceListener, DragGestu return false; } - // don't let other listeners process the event if we are 'pressing' the mouse + // 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());