mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-30 00:44:16 +08:00
GP-4363: Various fixes and improvements for Elements tables.
This commit is contained in:
+48
-5
@@ -16,8 +16,7 @@
|
||||
package docking.widgets.table;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.*;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import javax.swing.JTable;
|
||||
@@ -34,26 +33,49 @@ public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
|
||||
|
||||
protected class ForSeekMouseListener extends MouseAdapter {
|
||||
|
||||
private boolean checkRemove() {
|
||||
if (savedTable == null) {
|
||||
return false;
|
||||
}
|
||||
TableModel unwrapped = RowObjectTableModel.unwrap(savedTable.getModel());
|
||||
if (!(unwrapped instanceof DynamicColumnTableModel<?> model)) {
|
||||
setSavedTable(null);
|
||||
return true;
|
||||
}
|
||||
int count = model.getColumnCount();
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (model.getColumn(i) == col) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
setSavedTable(null);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
if (checkRemove()) {
|
||||
return;
|
||||
}
|
||||
if ((e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0) {
|
||||
return;
|
||||
}
|
||||
if ((e.getButton() != MouseEvent.BUTTON1)) {
|
||||
return;
|
||||
}
|
||||
e.consume();
|
||||
doSeek(e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseDragged(MouseEvent e) {
|
||||
if (checkRemove()) {
|
||||
return;
|
||||
}
|
||||
int onmask = MouseEvent.BUTTON1_DOWN_MASK;
|
||||
int offmask = MouseEvent.SHIFT_DOWN_MASK;
|
||||
if ((e.getModifiersEx() & (onmask | offmask)) != onmask) {
|
||||
return;
|
||||
}
|
||||
e.consume();
|
||||
doSeek(e);
|
||||
}
|
||||
|
||||
@@ -84,6 +106,7 @@ public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
|
||||
|
||||
double pos =
|
||||
span * (e.getX() - colX) / myViewCol.getWidth() + fullRangeDouble.min();
|
||||
e.consume();
|
||||
listeners.invoke().accept(pos);
|
||||
}
|
||||
}
|
||||
@@ -99,6 +122,7 @@ public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
|
||||
protected Span<N, ?> fullRange;
|
||||
|
||||
protected N pos;
|
||||
protected final DynamicTableColumn<?, ?, ?> col;
|
||||
protected double doublePos;
|
||||
|
||||
private JTable savedTable;
|
||||
@@ -107,8 +131,9 @@ public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
|
||||
private final ForSeekMouseListener forSeekMouseListener = new ForSeekMouseListener();
|
||||
private final ListenerSet<SeekListener> listeners = new ListenerSet<>(SeekListener.class, true);
|
||||
|
||||
public RangeCursorTableHeaderRenderer(N pos) {
|
||||
public RangeCursorTableHeaderRenderer(N pos, DynamicTableColumn<?, ?, ?> col) {
|
||||
this.pos = pos;
|
||||
this.col = col;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -123,6 +148,9 @@ public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
|
||||
}
|
||||
|
||||
protected void setSavedTable(JTable table) {
|
||||
if (savedTable == table) {
|
||||
return;
|
||||
}
|
||||
if (savedTable != null) {
|
||||
JTableHeader header = savedTable.getTableHeader();
|
||||
header.removeMouseListener(forSeekMouseListener);
|
||||
@@ -131,8 +159,23 @@ public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
|
||||
savedTable = table;
|
||||
if (savedTable != null) {
|
||||
JTableHeader header = savedTable.getTableHeader();
|
||||
// I need firstsies. SHIFT key will pass event down the chain.
|
||||
MouseListener[] curMouseListeners = header.getMouseListeners();
|
||||
MouseMotionListener[] curMotionListeners = header.getMouseMotionListeners();
|
||||
for (MouseListener l : curMouseListeners) {
|
||||
header.removeMouseListener(l);
|
||||
}
|
||||
for (MouseMotionListener l : curMotionListeners) {
|
||||
header.removeMouseMotionListener(l);
|
||||
}
|
||||
header.addMouseListener(forSeekMouseListener);
|
||||
header.addMouseMotionListener(forSeekMouseListener);
|
||||
for (MouseListener l : curMouseListeners) {
|
||||
header.addMouseListener(l);
|
||||
}
|
||||
for (MouseMotionListener l : curMotionListeners) {
|
||||
header.addMouseMotionListener(l);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -214,8 +214,9 @@ public class DemoSpanCellRendererTest extends AbstractGhidraHeadedIntegrationTes
|
||||
|
||||
TableColumn column = table.getColumnModel().getColumn(MyColumns.LIFESPAN.ordinal());
|
||||
SpanTableCellRenderer<Integer> rangeRenderer = new SpanTableCellRenderer<>();
|
||||
DynamicTableColumn<MyRow, ?, ?> col = model.getColumn(MyColumns.LIFESPAN.ordinal());
|
||||
RangeCursorTableHeaderRenderer<Integer> headerRenderer =
|
||||
new RangeCursorTableHeaderRenderer<>(0);
|
||||
new RangeCursorTableHeaderRenderer<>(0, col);
|
||||
column.setCellRenderer(rangeRenderer);
|
||||
column.setHeaderRenderer(headerRenderer);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user