adapt ui to database API
This commit is contained in:
parent
6530362b89
commit
16de83616a
|
@ -10,9 +10,11 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ui.swt.internal;
|
package com.minres.scviewer.database.ui.swt.internal;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.graphics.Color;
|
import org.eclipse.swt.graphics.Color;
|
||||||
|
@ -21,8 +23,14 @@ import org.eclipse.swt.graphics.Point;
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
import org.eclipse.swt.graphics.Rectangle;
|
||||||
import org.eclipse.swt.widgets.Display;
|
import org.eclipse.swt.widgets.Display;
|
||||||
|
|
||||||
|
import com.minres.scviewer.database.EventKind;
|
||||||
|
import com.minres.scviewer.database.IEvent;
|
||||||
|
import com.minres.scviewer.database.IHierNode;
|
||||||
|
import com.minres.scviewer.database.IWaveform;
|
||||||
import com.minres.scviewer.database.RelationType;
|
import com.minres.scviewer.database.RelationType;
|
||||||
import com.minres.scviewer.database.tx.ITx;
|
import com.minres.scviewer.database.tx.ITx;
|
||||||
|
import com.minres.scviewer.database.tx.ITxEvent;
|
||||||
|
import com.minres.scviewer.database.tx.ITxGenerator;
|
||||||
import com.minres.scviewer.database.tx.ITxRelation;
|
import com.minres.scviewer.database.tx.ITxRelation;
|
||||||
import com.minres.scviewer.database.ui.WaveformColors;
|
import com.minres.scviewer.database.ui.WaveformColors;
|
||||||
|
|
||||||
|
@ -78,6 +86,12 @@ public class ArrowPainter implements IPainter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getConcurrencyIndex(ITx tx) {
|
||||||
|
IEvent[] eventList = tx.getStream().getEvents().floorEntry(tx.getBeginTime()).getValue();
|
||||||
|
Optional<Integer> res = Arrays.stream(eventList).map(e -> ((ITxEvent)e).getRowIndex()).findFirst();
|
||||||
|
return res.isPresent()? res.get():0;
|
||||||
|
}
|
||||||
|
|
||||||
protected void calculateGeometries() {
|
protected void calculateGeometries() {
|
||||||
deferUpdate = false;
|
deferUpdate = false;
|
||||||
iRect.clear();
|
iRect.clear();
|
||||||
|
@ -88,9 +102,9 @@ public class ArrowPainter implements IPainter {
|
||||||
deferUpdate = true;
|
deferUpdate = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int laneHeight = painter.getHeight() / tx.getStream().getWidth();
|
int laneHeight = painter.getHeight() / tx.getStream().getRowCount();
|
||||||
txRectangle = new Rectangle((int) (tx.getBeginTime() / scaleFactor),
|
txRectangle = new Rectangle((int) (tx.getBeginTime() / scaleFactor),
|
||||||
waveCanvas.rulerHeight + painter.getVerticalOffset() + laneHeight * tx.getConcurrencyIndex(),
|
waveCanvas.rulerHeight + painter.getVerticalOffset() + laneHeight * getConcurrencyIndex(tx),
|
||||||
(int) ((tx.getEndTime() - tx.getBeginTime()) / scaleFactor), laneHeight);
|
(int) ((tx.getEndTime() - tx.getBeginTime()) / scaleFactor), laneHeight);
|
||||||
deriveGeom(tx.getIncomingRelations(), iRect, false);
|
deriveGeom(tx.getIncomingRelations(), iRect, false);
|
||||||
deriveGeom(tx.getOutgoingRelations(), oRect, true);
|
deriveGeom(tx.getOutgoingRelations(), oRect, true);
|
||||||
|
@ -99,17 +113,44 @@ public class ArrowPainter implements IPainter {
|
||||||
protected void deriveGeom(Collection<ITxRelation> relations, List<LinkEntry> res, boolean useTarget) {
|
protected void deriveGeom(Collection<ITxRelation> relations, List<LinkEntry> res, boolean useTarget) {
|
||||||
for (ITxRelation iTxRelation : relations) {
|
for (ITxRelation iTxRelation : relations) {
|
||||||
ITx otherTx = useTarget ? iTxRelation.getTarget() : iTxRelation.getSource();
|
ITx otherTx = useTarget ? iTxRelation.getTarget() : iTxRelation.getSource();
|
||||||
if (waveCanvas.wave2painterMap.containsKey(otherTx.getStream())) {
|
Rectangle bb = createLinkEntry(otherTx, otherTx.getStream());
|
||||||
|
if(bb!=null){
|
||||||
|
res.add(new LinkEntry(bb, iTxRelation.getRelationType()));
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
for(IHierNode gen:otherTx.getStream().getChildNodes()) {
|
||||||
|
if(gen instanceof ITxGenerator) {
|
||||||
|
bb = createLinkEntry(otherTx, (IWaveform) gen);
|
||||||
|
if(bb!=null){
|
||||||
|
res.add(new LinkEntry(bb, iTxRelation.getRelationType()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Rectangle createLinkEntry(ITx otherTx, IWaveform iWaveform) {
|
||||||
|
if (waveCanvas.wave2painterMap.containsKey(iWaveform)) {
|
||||||
IWaveformPainter painter = waveCanvas.wave2painterMap.get(otherTx.getStream());
|
IWaveformPainter painter = waveCanvas.wave2painterMap.get(otherTx.getStream());
|
||||||
|
if(painter==null) {
|
||||||
|
for(IHierNode gen:otherTx.getStream().getChildNodes()) {
|
||||||
|
if(gen instanceof ITxGenerator) {
|
||||||
|
painter = waveCanvas.wave2painterMap.get(gen);
|
||||||
|
if(painter!=null)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
int height = waveCanvas.styleProvider.getTrackHeight();
|
int height = waveCanvas.styleProvider.getTrackHeight();
|
||||||
Rectangle bb = new Rectangle(
|
return new Rectangle(
|
||||||
(int) (otherTx.getBeginTime() / scaleFactor),
|
(int) (otherTx.getBeginTime() / scaleFactor),
|
||||||
waveCanvas.rulerHeight + painter.getVerticalOffset() + height * otherTx.getConcurrencyIndex(),
|
waveCanvas.rulerHeight + painter.getVerticalOffset() + height * getConcurrencyIndex(otherTx),
|
||||||
(int) ((otherTx.getEndTime() - otherTx.getBeginTime()) / scaleFactor),
|
(int) ((otherTx.getEndTime() - otherTx.getBeginTime()) / scaleFactor),
|
||||||
height);
|
height);
|
||||||
res.add(new LinkEntry(bb, iTxRelation.getRelationType()));
|
} else
|
||||||
}
|
return null;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -10,10 +10,9 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ui.swt.internal;
|
package com.minres.scviewer.database.ui.swt.internal;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.NavigableMap;
|
import java.util.NavigableMap;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.graphics.Color;
|
import org.eclipse.swt.graphics.Color;
|
||||||
|
@ -37,19 +36,18 @@ public class StreamPainter extends TrackPainter{
|
||||||
private IWaveform stream;
|
private IWaveform stream;
|
||||||
private int txBase;
|
private int txBase;
|
||||||
private int txHeight;
|
private int txHeight;
|
||||||
private TreeSet<ITx> seenTx;
|
private TreeMap<ITx, ITxEvent> seenTx;
|
||||||
|
|
||||||
public StreamPainter(WaveformCanvas waveCanvas, boolean even, TrackEntry trackEntry) {
|
public StreamPainter(WaveformCanvas waveCanvas, boolean even, TrackEntry trackEntry) {
|
||||||
super(trackEntry, even);
|
super(trackEntry, even);
|
||||||
this.waveCanvas = waveCanvas;
|
this.waveCanvas = waveCanvas;
|
||||||
this.stream=trackEntry.waveform;
|
this.stream=trackEntry.waveform;
|
||||||
this.seenTx=new TreeSet<>();
|
this.seenTx=new TreeMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void paintArea(Projection proj, Rectangle area) {
|
public void paintArea(Projection proj, Rectangle area) {
|
||||||
if(stream.getEvents().size()==0) return;
|
if(stream.getEvents().size()==0) return;
|
||||||
int trackHeight=trackEntry.height/stream.getWidth();
|
int trackHeight=trackEntry.height/stream.getRowCount();
|
||||||
txBase=trackHeight/5;
|
txBase=trackHeight/5;
|
||||||
txHeight=trackHeight*3/5;
|
txHeight=trackHeight*3/5;
|
||||||
if(trackEntry.selected) {
|
if(trackEntry.selected) {
|
||||||
|
@ -65,8 +63,8 @@ public class StreamPainter extends TrackPainter{
|
||||||
long beginTime = beginPos*scaleFactor;
|
long beginTime = beginPos*scaleFactor;
|
||||||
long endTime = beginTime + area.width*scaleFactor;
|
long endTime = beginTime + area.width*scaleFactor;
|
||||||
|
|
||||||
Entry<Long, ?> firstTx=stream.getEvents().floorEntry(beginTime);
|
Entry<Long, IEvent[]> firstTx=stream.getEvents().floorEntry(beginTime);
|
||||||
Entry<Long, ?> lastTx=stream.getEvents().ceilingEntry(endTime);
|
Entry<Long, IEvent[]> lastTx=stream.getEvents().ceilingEntry(endTime);
|
||||||
if(firstTx==null) firstTx = stream.getEvents().firstEntry();
|
if(firstTx==null) firstTx = stream.getEvents().firstEntry();
|
||||||
if(lastTx==null) lastTx=stream.getEvents().lastEntry();
|
if(lastTx==null) lastTx=stream.getEvents().lastEntry();
|
||||||
proj.setFillRule(SWT.FILL_EVEN_ODD);
|
proj.setFillRule(SWT.FILL_EVEN_ODD);
|
||||||
|
@ -77,46 +75,51 @@ public class StreamPainter extends TrackPainter{
|
||||||
for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight)
|
for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight)
|
||||||
proj.drawLine(area.x, y1, area.x+area.width, y1);
|
proj.drawLine(area.x, y1, area.x+area.width, y1);
|
||||||
if(firstTx==lastTx) {
|
if(firstTx==lastTx) {
|
||||||
for(ITxEvent txEvent:(Collection<? extends ITxEvent>)firstTx.getValue())
|
for(IEvent txEvent: firstTx.getValue())
|
||||||
drawTx(proj, area, txEvent.getTransaction(), false);
|
drawTx(proj, area, ((ITxEvent)txEvent).getTransaction(), ((ITxEvent)txEvent).getRowIndex(), false);
|
||||||
}else{
|
}else{
|
||||||
seenTx.clear();
|
seenTx.clear();
|
||||||
NavigableMap<Long, IEvent[]> entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true);
|
NavigableMap<Long, IEvent[]> entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true);
|
||||||
boolean highlighed=false;
|
ITxEvent highlighed=null;
|
||||||
proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE));
|
proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE));
|
||||||
long selectedId=waveCanvas.currentSelection!=null? waveCanvas.currentSelection.getId():-1;
|
long selectedId=waveCanvas.currentSelection!=null? waveCanvas.currentSelection.getId():-1;
|
||||||
for(Entry<Long, IEvent[]> entry: entries.entrySet())
|
for(Entry<Long, IEvent[]> entry: entries.entrySet())
|
||||||
for(IEvent evt:entry.getValue()){
|
for(IEvent e:entry.getValue()){
|
||||||
ITx tx = ((ITxEvent) evt).getTransaction();
|
ITxEvent evt = (ITxEvent) e;
|
||||||
highlighed|=selectedId==tx.getId();
|
ITx tx = evt.getTransaction();
|
||||||
|
if(selectedId==tx.getId())
|
||||||
|
highlighed=evt;
|
||||||
switch(evt.getKind()) {
|
switch(evt.getKind()) {
|
||||||
case BEGIN:
|
case BEGIN:
|
||||||
seenTx.add(tx);
|
seenTx.put(tx, evt);
|
||||||
break;
|
break;
|
||||||
case END:
|
case END:
|
||||||
|
drawTx(proj, area, tx, evt.getRowIndex(), false);
|
||||||
seenTx.remove(tx);
|
seenTx.remove(tx);
|
||||||
|
break;
|
||||||
case SINGLE:
|
case SINGLE:
|
||||||
drawTx(proj, area, tx, false);
|
drawTx(proj, area, tx, evt.getRowIndex(), false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(ITx tx:seenTx){
|
seenTx.entrySet().stream().forEach(e -> {
|
||||||
drawTx(proj, area, tx, false);
|
drawTx(proj, area, e.getKey(), e.getValue().getRowIndex(), false);
|
||||||
}
|
});
|
||||||
if(highlighed){
|
|
||||||
|
if(highlighed!=null){
|
||||||
proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE_HIGHLITE));
|
proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE_HIGHLITE));
|
||||||
drawTx(proj, area, waveCanvas.currentSelection, true);
|
drawTx(proj, area, highlighed.getTransaction(), highlighed.getRowIndex(), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void drawTx(Projection proj, Rectangle area, ITx tx, boolean highlighted ) {
|
protected void drawTx(Projection proj, Rectangle area, ITx tx, int concurrencyIndex, boolean highlighted ) {
|
||||||
// compute colors
|
// compute colors
|
||||||
Color[] transColor = waveCanvas.styleProvider.computeColor( tx.getGenerator().getName());
|
Color[] transColor = waveCanvas.styleProvider.computeColor( tx.getGenerator().getName());
|
||||||
|
|
||||||
proj.setBackground(transColor[highlighted?1:0]);
|
proj.setBackground(transColor[highlighted?1:0]);
|
||||||
|
|
||||||
int offset = tx.getConcurrencyIndex()*this.waveCanvas.styleProvider.getTrackHeight();
|
int offset = concurrencyIndex*this.waveCanvas.styleProvider.getTrackHeight();
|
||||||
Rectangle bb = new Rectangle(
|
Rectangle bb = new Rectangle(
|
||||||
(int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+txBase,
|
(int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+txBase,
|
||||||
(int)((tx.getEndTime()-tx.getBeginTime())/this.waveCanvas.getScaleFactor()), txHeight);
|
(int)((tx.getEndTime()-tx.getBeginTime())/this.waveCanvas.getScaleFactor()), txHeight);
|
||||||
|
@ -164,24 +167,18 @@ public class StreamPainter extends TrackPainter{
|
||||||
|
|
||||||
protected ITx getTxFromEntry(int lane, int offset, Entry<Long, IEvent[]> firstTx) {
|
protected ITx getTxFromEntry(int lane, int offset, Entry<Long, IEvent[]> firstTx) {
|
||||||
long timePoint=offset*waveCanvas.getScaleFactor();
|
long timePoint=offset*waveCanvas.getScaleFactor();
|
||||||
for(IEvent evt:firstTx.getValue()){
|
long timePointLow=(offset-5)*waveCanvas.getScaleFactor();
|
||||||
if(evt instanceof ITxEvent) {
|
|
||||||
ITx tx=((ITxEvent)evt).getTransaction();
|
|
||||||
if((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)&&
|
|
||||||
tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePoint && tx.getEndTime()>=timePoint){
|
|
||||||
return ((ITxEvent)evt).getTransaction();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// now with some fuzziness
|
|
||||||
timePoint=(offset-5)*waveCanvas.getScaleFactor();
|
|
||||||
long timePointHigh=(offset+5)*waveCanvas.getScaleFactor();
|
long timePointHigh=(offset+5)*waveCanvas.getScaleFactor();
|
||||||
for(IEvent evt:firstTx.getValue()){
|
for(IEvent e:firstTx.getValue()){
|
||||||
if(evt instanceof ITxEvent) {
|
if(e instanceof ITxEvent) {
|
||||||
ITx tx=((ITxEvent)evt).getTransaction();
|
ITxEvent evt = (ITxEvent) e;
|
||||||
if((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) &&
|
ITx tx=evt.getTransaction();
|
||||||
tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePointHigh && tx.getEndTime()>=timePoint){
|
if(
|
||||||
return ((ITxEvent)evt).getTransaction();
|
(evt.getKind()==EventKind.SINGLE && evt.getTime()==timePoint) ||
|
||||||
|
(evt.getKind()==EventKind.SINGLE && evt.getTime()>timePointLow && evt.getTime()<timePointHigh) ||
|
||||||
|
(evt.getKind()==EventKind.BEGIN && evt.getRowIndex()==lane && evt.getTime()<=timePoint && tx.getEndTime()>=timePoint)
|
||||||
|
){
|
||||||
|
return tx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,10 +11,12 @@
|
||||||
package com.minres.scviewer.database.ui.swt.internal;
|
package com.minres.scviewer.database.ui.swt.internal;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.events.ControlAdapter;
|
import org.eclipse.swt.events.ControlAdapter;
|
||||||
|
@ -32,9 +34,11 @@ import org.eclipse.swt.widgets.Event;
|
||||||
import org.eclipse.swt.widgets.ScrollBar;
|
import org.eclipse.swt.widgets.ScrollBar;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.minres.scviewer.database.IEvent;
|
||||||
import com.minres.scviewer.database.IWaveform;
|
import com.minres.scviewer.database.IWaveform;
|
||||||
import com.minres.scviewer.database.RelationType;
|
import com.minres.scviewer.database.RelationType;
|
||||||
import com.minres.scviewer.database.tx.ITx;
|
import com.minres.scviewer.database.tx.ITx;
|
||||||
|
import com.minres.scviewer.database.tx.ITxEvent;
|
||||||
import com.minres.scviewer.database.ui.IWaveformStyleProvider;
|
import com.minres.scviewer.database.ui.IWaveformStyleProvider;
|
||||||
import com.minres.scviewer.database.ui.IWaveformView;
|
import com.minres.scviewer.database.ui.IWaveformView;
|
||||||
import com.minres.scviewer.database.ui.TrackEntry;
|
import com.minres.scviewer.database.ui.TrackEntry;
|
||||||
|
@ -424,7 +428,10 @@ public class WaveformCanvas extends Canvas {
|
||||||
}
|
}
|
||||||
for (IWaveformPainter painter : wave2painterMap.values()) {
|
for (IWaveformPainter painter : wave2painterMap.values()) {
|
||||||
if (painter instanceof StreamPainter && ((StreamPainter) painter).getStream() == tx.getStream()) {
|
if (painter instanceof StreamPainter && ((StreamPainter) painter).getStream() == tx.getStream()) {
|
||||||
int top = painter.getVerticalOffset() + styleProvider.getTrackHeight() * tx.getConcurrencyIndex();
|
Entry<Long, IEvent[]> entry = tx.getStream().getEvents().floorEntry(tx.getBeginTime());
|
||||||
|
Optional<IEvent> res = Arrays.stream(entry.getValue()).filter(e -> ((ITxEvent)e).getTransaction().equals(tx)).findFirst();
|
||||||
|
if(res.isPresent()) {
|
||||||
|
int top = painter.getVerticalOffset() + styleProvider.getTrackHeight() * ((ITxEvent)res.get()).getRowIndex();
|
||||||
int bottom = top + styleProvider.getTrackHeight();
|
int bottom = top + styleProvider.getTrackHeight();
|
||||||
if (top < -origin.y) {
|
if (top < -origin.y) {
|
||||||
setOrigin(origin.x, -(top-styleProvider.getTrackHeight()));
|
setOrigin(origin.x, -(top-styleProvider.getTrackHeight()));
|
||||||
|
@ -434,6 +441,7 @@ public class WaveformCanvas extends Canvas {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void reveal(IWaveform waveform) {
|
public void reveal(IWaveform waveform) {
|
||||||
for (IWaveformPainter painter : wave2painterMap.values()) {
|
for (IWaveformPainter painter : wave2painterMap.values()) {
|
||||||
|
|
|
@ -514,7 +514,7 @@ public class WaveformView implements IWaveformView {
|
||||||
streamEntry.vOffset = tracksVerticalHeight;
|
streamEntry.vOffset = tracksVerticalHeight;
|
||||||
if (streamEntry.waveform.getType() == WaveformType.TRANSACTION) {
|
if (streamEntry.waveform.getType() == WaveformType.TRANSACTION) {
|
||||||
streamEntry.currentValue = "";
|
streamEntry.currentValue = "";
|
||||||
streamEntry.height *= streamEntry.waveform.getWidth();
|
streamEntry.height *= streamEntry.waveform.getRowCount();
|
||||||
painter = new StreamPainter(waveformCanvas, even, streamEntry);
|
painter = new StreamPainter(waveformCanvas, even, streamEntry);
|
||||||
} else if (streamEntry.waveform.getType() == WaveformType.SIGNAL) {
|
} else if (streamEntry.waveform.getType() == WaveformType.SIGNAL) {
|
||||||
streamEntry.currentValue = "---";
|
streamEntry.currentValue = "---";
|
||||||
|
@ -579,17 +579,18 @@ public class WaveformView implements IWaveformView {
|
||||||
entry.currentValue = Double.toString(val);
|
entry.currentValue = Double.toString(val);
|
||||||
}
|
}
|
||||||
} else if (entry.waveform.getType() == WaveformType.TRANSACTION) {
|
} else if (entry.waveform.getType() == WaveformType.TRANSACTION) {
|
||||||
ITx[] resultsList = new ITx[entry.waveform.getWidth()];
|
ITx[] resultsList = new ITx[entry.waveform.getRowCount()];
|
||||||
Entry<Long, IEvent[]> firstTx = entry.waveform.getEvents().floorEntry(time);
|
Entry<Long, IEvent[]> firstTx = entry.waveform.getEvents().floorEntry(time);
|
||||||
if (firstTx != null) {
|
if (firstTx != null) {
|
||||||
do {
|
do {
|
||||||
for (IEvent evt : firstTx.getValue()) {
|
for (IEvent e : firstTx.getValue()) {
|
||||||
if (evt instanceof ITxEvent) {
|
if (e instanceof ITxEvent) {
|
||||||
ITx tx = ((ITxEvent) evt).getTransaction();
|
ITxEvent evt = ((ITxEvent) e);
|
||||||
|
ITx tx = evt.getTransaction();
|
||||||
if ((evt.getKind() == EventKind.BEGIN || evt.getKind() == EventKind.SINGLE)
|
if ((evt.getKind() == EventKind.BEGIN || evt.getKind() == EventKind.SINGLE)
|
||||||
&& tx.getBeginTime() <= time && tx.getEndTime() >= time
|
&& tx.getBeginTime() <= time && tx.getEndTime() >= time
|
||||||
&& resultsList[tx.getConcurrencyIndex()] == null)
|
&& resultsList[evt.getRowIndex()] == null)
|
||||||
resultsList[tx.getConcurrencyIndex()] = ((ITxEvent) evt).getTransaction();
|
resultsList[evt.getRowIndex()] = evt.getTransaction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
firstTx = entry.waveform.getEvents().lowerEntry(firstTx.getKey());
|
firstTx = entry.waveform.getEvents().lowerEntry(firstTx.getKey());
|
||||||
|
@ -1036,7 +1037,7 @@ public class WaveformView implements IWaveformView {
|
||||||
TrackEntry trackEntry = trackVerticalOffset.get(firstKey);
|
TrackEntry trackEntry = trackVerticalOffset.get(firstKey);
|
||||||
IWaveform w = trackEntry.waveform;
|
IWaveform w = trackEntry.waveform;
|
||||||
if (w.getType() == WaveformType.TRANSACTION)
|
if (w.getType() == WaveformType.TRANSACTION)
|
||||||
subArea.height *= w.getWidth();
|
subArea.height *= w.getRowCount();
|
||||||
drawTextFormat(gc, subArea, firstKey, w.getFullName(), trackEntry.selected);
|
drawTextFormat(gc, subArea, firstKey, w.getFullName(), trackEntry.selected);
|
||||||
} else {
|
} else {
|
||||||
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
|
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
|
||||||
|
@ -1044,7 +1045,7 @@ public class WaveformView implements IWaveformView {
|
||||||
IWaveform w = entry.getValue().waveform;
|
IWaveform w = entry.getValue().waveform;
|
||||||
subArea.height = styleProvider.getTrackHeight();
|
subArea.height = styleProvider.getTrackHeight();
|
||||||
if (w.getType() == WaveformType.TRANSACTION)
|
if (w.getType() == WaveformType.TRANSACTION)
|
||||||
subArea.height *= w.getWidth();
|
subArea.height *= w.getRowCount();
|
||||||
drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), entry.getValue().selected);
|
drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), entry.getValue().selected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1065,7 +1066,7 @@ public class WaveformView implements IWaveformView {
|
||||||
TrackEntry trackEntry = trackVerticalOffset.get(firstKey);
|
TrackEntry trackEntry = trackVerticalOffset.get(firstKey);
|
||||||
IWaveform w = trackEntry.waveform;
|
IWaveform w = trackEntry.waveform;
|
||||||
if (w.getType() == WaveformType.TRANSACTION)
|
if (w.getType() == WaveformType.TRANSACTION)
|
||||||
subArea.height *= w.getWidth();
|
subArea.height *= w.getRowCount();
|
||||||
drawValue(gc, subArea, firstKey, trackEntry.currentValue, trackEntry.selected);
|
drawValue(gc, subArea, firstKey, trackEntry.currentValue, trackEntry.selected);
|
||||||
} else {
|
} else {
|
||||||
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
|
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
|
||||||
|
@ -1073,7 +1074,7 @@ public class WaveformView implements IWaveformView {
|
||||||
IWaveform w = entry.getValue().waveform;
|
IWaveform w = entry.getValue().waveform;
|
||||||
subArea.height = styleProvider.getTrackHeight();
|
subArea.height = styleProvider.getTrackHeight();
|
||||||
if (w.getType() == WaveformType.TRANSACTION)
|
if (w.getType() == WaveformType.TRANSACTION)
|
||||||
subArea.height *= w.getWidth();
|
subArea.height *= w.getRowCount();
|
||||||
drawValue(gc, subArea, entry.getKey(), entry.getValue().currentValue,
|
drawValue(gc, subArea, entry.getKey(), entry.getValue().currentValue,
|
||||||
entry.getValue().selected);
|
entry.getValue().selected);
|
||||||
}
|
}
|
||||||
|
|
|
@ -482,6 +482,7 @@ public class HeapStatus extends Composite {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
t.setDaemon(true);
|
||||||
t.start();
|
t.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -206,7 +206,7 @@ public class DesignBrowser {
|
||||||
updateButtons();
|
updateButtons();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
treeViewer.setLabelProvider(new TxDbLabelProvider());
|
treeViewer.setLabelProvider(new TxDbLabelProvider(true));
|
||||||
treeViewer.addFilter(treeAttributeFilter);
|
treeViewer.addFilter(treeAttributeFilter);
|
||||||
treeViewer.setUseHashlookup(true);
|
treeViewer.setUseHashlookup(true);
|
||||||
treeViewer.setAutoExpandLevel(2);
|
treeViewer.setAutoExpandLevel(2);
|
||||||
|
@ -252,7 +252,7 @@ public class DesignBrowser {
|
||||||
updateButtons();
|
updateButtons();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
txTableViewer.setLabelProvider(new TxDbLabelProvider());
|
txTableViewer.setLabelProvider(new TxDbLabelProvider(false));
|
||||||
txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
|
txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
|
||||||
txTableViewer.addFilter(tableAttributeFilter);
|
txTableViewer.addFilter(tableAttributeFilter);
|
||||||
txTableViewer.addDoubleClickListener(event -> {
|
txTableViewer.addDoubleClickListener(event -> {
|
||||||
|
|
|
@ -37,7 +37,6 @@ import com.minres.scviewer.database.IEvent;
|
||||||
import com.minres.scviewer.database.IWaveform;
|
import com.minres.scviewer.database.IWaveform;
|
||||||
import com.minres.scviewer.database.WaveformType;
|
import com.minres.scviewer.database.WaveformType;
|
||||||
import com.minres.scviewer.database.tx.ITx;
|
import com.minres.scviewer.database.tx.ITx;
|
||||||
import com.minres.scviewer.database.tx.ITxAttribute;
|
|
||||||
import com.minres.scviewer.database.tx.ITxEvent;
|
import com.minres.scviewer.database.tx.ITxEvent;
|
||||||
import com.minres.scviewer.database.ui.TrackEntry;
|
import com.minres.scviewer.database.ui.TrackEntry;
|
||||||
import com.minres.scviewer.e4.application.parts.txTableTree.AbstractTransactionTreeContentProvider;
|
import com.minres.scviewer.e4.application.parts.txTableTree.AbstractTransactionTreeContentProvider;
|
||||||
|
@ -78,6 +77,8 @@ public class TransactionList extends Composite {
|
||||||
|
|
||||||
private TableViewer tableViewer = null;
|
private TableViewer tableViewer = null;
|
||||||
|
|
||||||
|
Thread updateThread = null;
|
||||||
|
|
||||||
private TableColumn valueColumn = null;
|
private TableColumn valueColumn = null;
|
||||||
|
|
||||||
private AttributeLabelProvider valueLabelProvider = null;
|
private AttributeLabelProvider valueLabelProvider = null;
|
||||||
|
@ -86,8 +87,6 @@ public class TransactionList extends Composite {
|
||||||
|
|
||||||
private ObservableList<AttributeNameBean> attrNames = new WritableList<>();
|
private ObservableList<AttributeNameBean> attrNames = new WritableList<>();
|
||||||
|
|
||||||
private List<ITx> eventList = new ArrayList<>();
|
|
||||||
|
|
||||||
private List<ITx> emptyList = new ArrayList<>();
|
private List<ITx> emptyList = new ArrayList<>();
|
||||||
|
|
||||||
TxFilter txFilter;
|
TxFilter txFilter;
|
||||||
|
@ -244,56 +243,48 @@ public class TransactionList extends Composite {
|
||||||
} else if(stream != trackEntry.waveform) {
|
} else if(stream != trackEntry.waveform) {
|
||||||
stream=trackEntry.waveform;
|
stream=trackEntry.waveform;
|
||||||
tableViewer.setInput(emptyList);
|
tableViewer.setInput(emptyList);
|
||||||
new Thread() {
|
try{
|
||||||
private ConcurrentHashMap<String, DataType> propNames=new ConcurrentHashMap<>();
|
if(updateThread!=null)
|
||||||
|
updateThread.interrupt();
|
||||||
private List<AttributeNameBean> getEntries() {
|
}catch(SecurityException e){}
|
||||||
return propNames.entrySet().stream()
|
updateThread = new Thread(()-> {
|
||||||
.sorted((e1,e2)->e1.getKey().compareTo(e2.getKey()))
|
final ConcurrentHashMap<String, DataType> propNames=new ConcurrentHashMap<>();
|
||||||
.map(e -> new AttributeNameBean(e.getKey(), e.getValue()))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Collection<IEvent[]> values = stream.getEvents().values();
|
Collection<IEvent[]> values = stream.getEvents().values();
|
||||||
eventList = values.parallelStream().map(Arrays::asList)
|
final List<ITx> txList = values.parallelStream().map(Arrays::asList)
|
||||||
.flatMap(List::stream)
|
.flatMap(List::stream)
|
||||||
.filter(evt -> evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)
|
.filter(evt -> evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)
|
||||||
.map(evt-> {
|
.map(evt-> {
|
||||||
ITx tx = ((ITxEvent)evt).getTransaction();
|
ITx tx = ((ITxEvent)evt).getTransaction();
|
||||||
for(ITxAttribute attr: tx.getAttributes()) {
|
tx.getAttributes().forEach(attr -> propNames.put(attr.getName(), attr.getDataType()));
|
||||||
propNames.put(attr.getName(), attr.getDataType());
|
|
||||||
}
|
|
||||||
return tx;
|
return tx;
|
||||||
})
|
})
|
||||||
.sorted((t1, t2)-> t1.getBeginTime().compareTo(t2.getBeginTime()))
|
.sorted((t1, t2)-> t1.getBeginTime().compareTo(t2.getBeginTime()))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
getDisplay().asyncExec(new Runnable() {
|
final List<AttributeNameBean> newAttrNames=propNames.entrySet().stream()
|
||||||
@Override
|
.sorted((e1,e2)->e1.getKey().compareTo(e2.getKey()))
|
||||||
public void run() {
|
.map(e -> new AttributeNameBean(e.getKey(), e.getValue()))
|
||||||
tableViewer.setInput(eventList);
|
.collect(Collectors.toList());
|
||||||
|
getDisplay().asyncExec(() -> {
|
||||||
|
tableViewer.setInput(txList);
|
||||||
attrNames.clear();
|
attrNames.clear();
|
||||||
attrNames.addAll(getEntries());
|
attrNames.addAll(newAttrNames);
|
||||||
if(!attrNames.isEmpty())
|
if(!attrNames.isEmpty())
|
||||||
txFilter.setSearchProp(attrNames.get(0).getName(), attrNames.get(0).getType());
|
txFilter.setSearchProp(attrNames.get(0).getName(), attrNames.get(0).getType());
|
||||||
if (searchPropComboViewer!=null) {
|
if (searchPropComboViewer!=null)
|
||||||
searchPropComboViewer.setInput(attrNames);
|
searchPropComboViewer.refresh();
|
||||||
Object sel = searchPropComboViewer.getElementAt(0);
|
if (viewPropComboViewer!=null)
|
||||||
if(sel!=null) searchPropComboViewer.setSelection(new StructuredSelection(sel));
|
viewPropComboViewer.refresh();
|
||||||
}
|
|
||||||
tableViewer.refresh(true);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
updateThread=null;
|
||||||
}.start();
|
});
|
||||||
|
updateThread.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSearchProps(String propName, DataType type, String propValue) {
|
public void setSearchProps(String propName, DataType type, String propValue) {
|
||||||
for(int i=0; i<attrNames.size(); ++i) {
|
for(int i=0; i<searchPropComboViewer.getCombo().getItemCount(); ++i) {
|
||||||
AttributeNameBean e = attrNames.get(i);
|
String itemName = searchPropComboViewer.getCombo().getItem(i);
|
||||||
if(propName.equals(e.getName()) && type.equals(e.getType())) {
|
if(propName.equals(itemName)) {
|
||||||
searchPropComboViewer.getCombo().select(i);
|
searchPropComboViewer.getCombo().select(i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,6 +166,8 @@ public class TxDbLabelProvider implements ILabelProvider {
|
||||||
public String getText(Object element) {
|
public String getText(Object element) {
|
||||||
if(element instanceof IWaveformDb){
|
if(element instanceof IWaveformDb){
|
||||||
IWaveformDb db = (IWaveformDb) element;
|
IWaveformDb db = (IWaveformDb) element;
|
||||||
|
if(db.getName()== null)
|
||||||
|
return "";
|
||||||
return db.getName()+(db.isLoaded()?"":" (loading)");
|
return db.getName()+(db.isLoaded()?"":" (loading)");
|
||||||
} else
|
} else
|
||||||
return ((IHierNode)element).getName();
|
return ((IHierNode)element).getName();
|
||||||
|
|
|
@ -77,7 +77,7 @@ public class TxDbTreeLabelProvider implements ILabelProvider {
|
||||||
case FILTER:
|
case FILTER:
|
||||||
break;
|
break;
|
||||||
case SIGNAL:
|
case SIGNAL:
|
||||||
if(((IWaveform) element).getWidth()==1)
|
if(((IWaveform) element).getRowCount()==1)
|
||||||
return signal;
|
return signal;
|
||||||
else
|
else
|
||||||
return wave;
|
return wave;
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
<!-- Bintray package name -->
|
<!-- Bintray package name -->
|
||||||
<bintrayPackage>SCViewer</bintrayPackage>
|
<bintrayPackage>SCViewer</bintrayPackage>
|
||||||
<!-- Bintray package version number -->
|
<!-- Bintray package version number -->
|
||||||
<bintrayVersion>${parsedVersion.majorVersion}.${parsedVersion.minorVersion}</bintrayVersion>
|
<bintrayVersion>${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}</bintrayVersion>
|
||||||
<!-- remove any preexisting files -->
|
<!-- remove any preexisting files -->
|
||||||
<performDestroy>true</performDestroy>
|
<performDestroy>true</performDestroy>
|
||||||
<!-- information used when creating the package -->
|
<!-- information used when creating the package -->
|
||||||
|
|
Loading…
Reference in New Issue