GP-1969: Add 'Model' provider for inspecting object-based traces.

This commit is contained in:
Dan
2022-06-15 15:41:38 -04:00
parent eb0a23aecc
commit 2a4b4f9bcf
59 changed files with 6131 additions and 269 deletions
@@ -26,21 +26,24 @@ import javax.swing.table.*;
import com.google.common.collect.Range;
public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
extends GTableHeaderRenderer {
extends GTableHeaderRenderer implements RangedRenderer<N> {
protected final static int ARROW_SIZE = 10;
protected final static Polygon ARROW = new Polygon(
new int[] { 0, -ARROW_SIZE, -ARROW_SIZE },
new int[] { 0, ARROW_SIZE, -ARROW_SIZE }, 3);
protected Range<Double> fullRange = Range.closed(0d, 1d);
protected Range<Double> fullRangeDouble = Range.closed(0d, 1d);
protected double span = 1;
protected Range<N> fullRange;
protected N pos;
protected double doublePos;
@Override
public void setFullRange(Range<N> fullRange) {
this.fullRange = RangeTableCellRenderer.validateViewRange(fullRange);
this.span = this.fullRange.upperEndpoint() - this.fullRange.lowerEndpoint();
this.fullRangeDouble = RangedRenderer.validateViewRange(fullRange);
this.span = this.fullRangeDouble.upperEndpoint() - this.fullRangeDouble.lowerEndpoint();
}
public void setCursorPosition(N pos) {
@@ -51,6 +54,7 @@ public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
@Override
protected void paintChildren(Graphics g) {
super.paintChildren(g);
// The cursor should occlude the children
paintCursor(g);
}
@@ -58,7 +62,7 @@ public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
Graphics2D g = (Graphics2D) parentG.create();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
double x = (doublePos - fullRange.lowerEndpoint()) / span * getWidth();
double x = (doublePos - fullRangeDouble.lowerEndpoint()) / span * getWidth();
g.translate(x, getHeight());
g.rotate(Math.PI / 2);
g.setColor(getForeground());
@@ -117,7 +121,8 @@ public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
}
TableColumn col = colModel.getColumn(viewColIdx);
double pos = span * (e.getX() - colX) / col.getWidth() + fullRange.lowerEndpoint();
double pos =
span * (e.getX() - colX) / col.getWidth() + fullRangeDouble.lowerEndpoint();
listener.accept(pos);
}
};
@@ -128,4 +133,19 @@ public class RangeCursorTableHeaderRenderer<N extends Number & Comparable<N>>
public N getCursorPosition() {
return pos;
}
@Override
public Range<N> getFullRange() {
return fullRange;
}
@Override
public Range<Double> getFullRangeDouble() {
return fullRangeDouble;
}
@Override
public double getSpan() {
return span;
}
}
@@ -0,0 +1,84 @@
/* ###
* 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;
import java.awt.Component;
import java.awt.Graphics;
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;
import ghidra.docking.settings.Settings;
import ghidra.util.table.column.AbstractGColumnRenderer;
public class RangeSetTableCellRenderer<N extends Number & Comparable<N>>
extends AbstractGColumnRenderer<RangeSet<N>> implements RangedRenderer<N> {
protected Range<Double> fullRangeDouble = Range.closed(0d, 1d);
protected double span = 1;
protected Range<N> fullRange;
protected RangeSet<N> dataRangeSet;
@Override
public void setFullRange(Range<N> fullRange) {
this.fullRange = fullRange;
this.fullRangeDouble = RangedRenderer.validateViewRange(fullRange);
this.span = this.fullRangeDouble.upperEndpoint() - this.fullRangeDouble.lowerEndpoint();
}
@Override
public String getFilterString(RangeSet<N> t, Settings settings) {
return "";
}
@Override
@SuppressWarnings("unchecked")
public Component getTableCellRendererComponent(GTableCellRenderingData data) {
this.dataRangeSet = (RangeSet<N>) data.getValue();
super.getTableCellRendererComponent(data);
setText("");
return this;
}
@Override
protected void paintComponent(Graphics parentG) {
super.paintComponent(parentG);
if (dataRangeSet == null || dataRangeSet.isEmpty()) {
return;
}
Graphics g = parentG.create();
g.setColor(getForeground());
for (Range<N> range : dataRangeSet.asRanges()) {
paintRange(g, range);
}
}
@Override
public Range<N> getFullRange() {
return fullRange;
}
@Override
public Range<Double> getFullRangeDouble() {
return fullRangeDouble;
}
@Override
public double getSpan() {
return span;
}
}
@@ -24,27 +24,19 @@ import ghidra.docking.settings.Settings;
import ghidra.util.table.column.AbstractGColumnRenderer;
public class RangeTableCellRenderer<N extends Number & Comparable<N>>
extends AbstractGColumnRenderer<Range<N>> {
extends AbstractGColumnRenderer<Range<N>> implements RangedRenderer<N> {
protected Range<Double> doubleFullRange = Range.closed(0d, 1d);
protected Range<Double> fullRangeDouble = Range.closed(0d, 1d);
protected double span = 1;
protected Range<N> fullRange;
protected Range<N> dataRange;
public static Range<Double> validateViewRange(Range<? extends Number> fullRange) {
if (!fullRange.hasLowerBound() || !fullRange.hasUpperBound()) {
throw new IllegalArgumentException("Cannot have unbounded full range");
}
// I don't care to preserve open/closed, since it just specifies the view bounds
return Range.closed(fullRange.lowerEndpoint().doubleValue(),
fullRange.upperEndpoint().doubleValue());
}
@Override
public void setFullRange(Range<N> fullRange) {
this.fullRange = fullRange;
this.doubleFullRange = validateViewRange(fullRange);
this.span = this.doubleFullRange.upperEndpoint() - this.doubleFullRange.lowerEndpoint();
this.fullRangeDouble = RangedRenderer.validateViewRange(fullRange);
this.span = this.fullRangeDouble.upperEndpoint() - this.fullRangeDouble.lowerEndpoint();
}
@Override
@@ -67,38 +59,24 @@ public class RangeTableCellRenderer<N extends Number & Comparable<N>>
if (dataRange == null) {
return;
}
int width = getWidth();
int height = getHeight();
int x1 = dataRange.hasLowerBound()
? interpolate(width, dataRange.lowerEndpoint().doubleValue())
: 0;
int x2 = dataRange.hasUpperBound()
? interpolate(width, dataRange.upperEndpoint().doubleValue())
: width;
int y1 = height > 2 ? 1 : 0;
int y2 = height > 2 ? height - 1 : height;
Graphics g = parentG.create();
g.setColor(getForeground());
g.fillRect(x1, y1, x2 - x1, y2 - y1);
}
protected int interpolate(int w, double val) {
double lower = doubleFullRange.lowerEndpoint();
if (val <= lower) {
return 0;
}
if (val >= doubleFullRange.upperEndpoint()) {
return w;
}
double dif = val - lower;
return (int) (dif / span * w);
paintRange(g, dataRange);
}
@Override
public Range<N> getFullRange() {
return fullRange;
}
@Override
public Range<Double> getFullRangeDouble() {
return fullRangeDouble;
}
@Override
public double getSpan() {
return span;
}
}
@@ -0,0 +1,75 @@
/* ###
* 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;
import java.awt.Graphics;
import com.google.common.collect.Range;
public interface RangedRenderer<N extends Number & Comparable<N>> {
public static Range<Double> validateViewRange(Range<? extends Number> fullRange) {
if (!fullRange.hasLowerBound() || !fullRange.hasUpperBound()) {
throw new IllegalArgumentException("Cannot have unbounded full range");
}
// I don't care to preserve open/closed, since it just specifies the view bounds
return Range.closed(fullRange.lowerEndpoint().doubleValue(),
fullRange.upperEndpoint().doubleValue());
}
void setFullRange(Range<N> fullRange);
Range<N> getFullRange();
Range<Double> getFullRangeDouble();
double getSpan();
default int interpolate(int w, double val) {
Range<Double> fullRangeDouble = getFullRangeDouble();
double span = getSpan();
double lower = fullRangeDouble.lowerEndpoint();
if (val <= lower) {
return 0;
}
if (val >= fullRangeDouble.upperEndpoint()) {
return w;
}
double dif = val - lower;
return (int) (dif / span * w);
}
int getWidth();
int getHeight();
default void paintRange(Graphics g, Range<N> range) {
int width = getWidth();
int height = getHeight();
int x1 = range.hasLowerBound()
? interpolate(width, range.lowerEndpoint().doubleValue())
: 0;
int x2 = range.hasUpperBound()
? interpolate(width, range.upperEndpoint().doubleValue())
: width;
int y1 = height > 2 ? 1 : 0;
int y2 = height > 2 ? height - 1 : height;
g.fillRect(x1, y1, x2 - x1, y2 - y1);
}
}