GP-4363: Various fixes and improvements for Elements tables.

This commit is contained in:
Dan
2024-02-27 10:50:07 -05:00
parent 5a4315fb39
commit ab5c800030
17 changed files with 258 additions and 148 deletions
@@ -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);
}
}
}
@@ -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);