mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-29 01:16:01 +08:00
GP-1969: Add 'Model' provider for inspecting object-based traces.
This commit is contained in:
+26
-6
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+84
@@ -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;
|
||||
}
|
||||
}
|
||||
+17
-39
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user