- fixed scrolling sync issue

- fixed duplicate db entries
This commit is contained in:
ejentzsx 2015-02-04 16:20:59 +01:00
parent 310c9bbb8f
commit ac942481e3
11 changed files with 849 additions and 844 deletions

View File

@ -179,7 +179,11 @@ public class Tx implements ITx {
@Override
public int compareTo(ITx o) {
return this.getBeginTime().compareTo(o.getBeginTime());
int res = this.getBeginTime().compareTo(o.getBeginTime());
if(res!=0)
return res;
else
return this.getId().compareTo(o.getId());
}
@Override

View File

@ -68,35 +68,37 @@ public class StreamPainter implements IWaveformPainter{
for(int y1=area.y+this.waveCanvas.getTrackHeight()/2; y1<area.y+totalHeight; y1+=this.waveCanvas.getTrackHeight())
gc.drawLine(area.x, y1, area.x+area.width, y1);
if(firstTx==lastTx)
for(ITxEvent x:(Collection<? extends ITxEvent>)firstTx.getValue())
drawTx(gc, area, x.getTransaction());
for(ITxEvent txEvent:(Collection<? extends ITxEvent>)firstTx.getValue())
drawTx(gc, area, txEvent.getTransaction());
else{
seenTx.clear();
NavigableMap<Long,?> entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true);
for(Entry<Long, ?> tx: entries.entrySet())
for(ITxEvent x:(Collection<? extends ITxEvent>)tx.getValue()){
if(x.getType()==ITxEvent.Type.BEGIN)
seenTx.add(x.getTransaction());
if(x.getType()==ITxEvent.Type.END){
drawTx(gc, area, x.getTransaction());
seenTx.remove(x.getTransaction());
boolean highlighed=false;
gc.setForeground(this.waveCanvas.colors[WaveformCanvas.Colors.LINE.ordinal()]);
gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TX_BG.ordinal()]);
for(Entry<Long, ?> entry: entries.entrySet())
for(ITxEvent txEvent:(Collection<? extends ITxEvent>)entry.getValue()){
if(txEvent.getType()==ITxEvent.Type.BEGIN)
seenTx.add(txEvent.getTransaction());
if(txEvent.getType()==ITxEvent.Type.END){
ITx tx = txEvent.getTransaction();
highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.getId()==tx.getId();
drawTx(gc, area, tx);
seenTx.remove(tx);
}
}
for(ITx tx:seenTx){
drawTx(gc, area, tx);
}
if(highlighed){
gc.setForeground(this.waveCanvas.colors[WaveformCanvas.Colors.LINE_HIGHLITE.ordinal()]);
gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TX_BG_HIGHLITE.ordinal()]);
drawTx(gc, area, waveCanvas.currentSelection);
}
}
}
protected void drawTx(GC gc, Rectangle area, ITx tx) {
if(waveCanvas.currentSelection!=null && waveCanvas.currentSelection.getId()==tx.getId()){
gc.setForeground(this.waveCanvas.colors[WaveformCanvas.Colors.LINE_HIGHLITE.ordinal()]);
gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TX_BG_HIGHLITE.ordinal()]);
}else {
gc.setForeground(this.waveCanvas.colors[WaveformCanvas.Colors.LINE.ordinal()]);
gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TX_BG.ordinal()]);
}
int offset = tx.getConcurrencyIndex()*this.waveCanvas.getTrackHeight();
Rectangle bb = new Rectangle(
(int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+upper,

View File

@ -32,6 +32,7 @@ import org.eclipse.swt.graphics.Transform;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.wb.swt.SWTResourceManager;
@ -41,340 +42,348 @@ import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformEvent;
public class WaveformCanvas extends Canvas {
public enum Colors {
LINE,
LINE_HIGHLITE,
TRACK_BG_EVEN,
TRACK_BG_HIGHLITE,
TRACK_BG_ODD,
TX_BG,
TX_BG_HIGHLITE,
TX_BORDER,
SIGNAL0,
SIGNAL1,
SIGNALZ,
SIGNALX,
SIGNAL_TEXT,
CURSOR
}
public enum Colors {
LINE, LINE_HIGHLITE, TRACK_BG_EVEN, TRACK_BG_HIGHLITE, TRACK_BG_ODD, TX_BG, TX_BG_HIGHLITE, TX_BORDER, SIGNAL0, SIGNAL1, SIGNALZ, SIGNALX, SIGNAL_TEXT, CURSOR
}
Color[] colors=new Color[Colors.values().length];
private int trackHeight = 50;
private long scaleFactor = 1000000L;
private int level=6;
private long maxTime;
protected Point origin; /* original size */
protected Transform transform;
protected Ruler ruler;
protected List<IPainter> painterList;
TreeMap<Integer, IWaveformPainter> trackVerticalOffset;
protected List<IWaveform<? extends IWaveformEvent>> streams;
Color[] colors = new Color[Colors.values().length];
ITx currentSelection;
IWaveform<? extends IWaveformEvent> currentWaveformSelection;
private int trackHeight = 50;
private long scaleFactor = 1000000L;
private int level = 6;
private long maxTime;
protected Point origin; /* original size */
protected Transform transform;
protected Ruler ruler;
protected List<IPainter> painterList;
TreeMap<Integer, IWaveformPainter> trackVerticalOffset;
protected List<IWaveform<? extends IWaveformEvent>> streams;
/**
* Constructor for ScrollableCanvas.
* @param parent the parent of this control.
* @param style the style of this control.
*/
public WaveformCanvas(final Composite parent, int style) {
super( parent, style |SWT.DOUBLE_BUFFERED| SWT.NO_BACKGROUND|SWT.NO_REDRAW_RESIZE|SWT.V_SCROLL|SWT.H_SCROLL);
addControlListener(new ControlAdapter() { /* resize listener. */
public void controlResized(ControlEvent event) {
syncScrollBars();
}
});
addPaintListener(new PaintListener() { /* paint listener. */
public void paintControl(final PaintEvent event) {
paint(event.gc);
}
});
painterList=new LinkedList<IPainter>();
origin=new Point(0,0);
transform = new Transform(getDisplay());
trackVerticalOffset=new TreeMap<Integer, IWaveformPainter>();
initScrollBars();
initColors(null);
}
ITx currentSelection;
IWaveform<? extends IWaveformEvent> currentWaveformSelection;
private void initColors(HashMap<Colors, RGB> colourMap){
Display d = getDisplay();
if(colourMap!=null){
for(Colors c:Colors.values()){
if(colourMap.containsKey(c)){
colors[c.ordinal()].dispose();
colors[c.ordinal()]=new Color(d, colourMap.get(c));
}
}
} else {
colors[Colors.LINE.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_RED);
colors[Colors.LINE_HIGHLITE.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_CYAN);
colors[Colors.TRACK_BG_EVEN.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_BLACK);
colors[Colors.TRACK_BG_ODD.ordinal()]=SWTResourceManager.getColor(40,40,40);
colors[Colors.TRACK_BG_HIGHLITE.ordinal()]=SWTResourceManager.getColor(40,40,80);
colors[Colors.TX_BG.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_GREEN);
colors[Colors.TX_BG_HIGHLITE.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN);
colors[Colors.TX_BORDER.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_RED);
colors[Colors.SIGNAL0.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN);
colors[Colors.SIGNAL1.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN);
colors[Colors.SIGNALZ.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_GRAY);
colors[Colors.SIGNALX.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_RED);
colors[Colors.SIGNAL_TEXT.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_WHITE);
colors[Colors.CURSOR.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_YELLOW);
}
}
private List<SelectionAdapter> selectionListeners;
public List<IWaveform<? extends IWaveformEvent>> getStreams() {
return streams;
}
/**
* Constructor for ScrollableCanvas.
*
* @param parent
* the parent of this control.
* @param style
* the style of this control.
*/
public WaveformCanvas(final Composite parent, int style) {
super(parent, style | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE | SWT.V_SCROLL | SWT.H_SCROLL);
addControlListener(new ControlAdapter() { /* resize listener. */
public void controlResized(ControlEvent event) {
syncScrollBars();
}
});
addPaintListener(new PaintListener() { /* paint listener. */
public void paintControl(final PaintEvent event) {
paint(event.gc);
}
});
painterList = new LinkedList<IPainter>();
origin = new Point(0, 0);
transform = new Transform(getDisplay());
trackVerticalOffset = new TreeMap<Integer, IWaveformPainter>();
selectionListeners = new LinkedList<>();
initScrollBars();
initColors(null);
}
public void setStreams(List<IWaveform<? extends IWaveformEvent>> streams) {
this.streams = streams;
}
private void initColors(HashMap<Colors, RGB> colourMap) {
Display d = getDisplay();
if (colourMap != null) {
for (Colors c : Colors.values()) {
if (colourMap.containsKey(c)) {
colors[c.ordinal()].dispose();
colors[c.ordinal()] = new Color(d, colourMap.get(c));
}
}
} else {
colors[Colors.LINE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED);
colors[Colors.LINE_HIGHLITE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_CYAN);
colors[Colors.TRACK_BG_EVEN.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_BLACK);
colors[Colors.TRACK_BG_ODD.ordinal()] = SWTResourceManager.getColor(40, 40, 40);
colors[Colors.TRACK_BG_HIGHLITE.ordinal()] = SWTResourceManager.getColor(40, 40, 80);
colors[Colors.TX_BG.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN);
colors[Colors.TX_BG_HIGHLITE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN);
colors[Colors.TX_BORDER.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED);
colors[Colors.SIGNAL0.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN);
colors[Colors.SIGNAL1.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN);
colors[Colors.SIGNALZ.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GRAY);
colors[Colors.SIGNALX.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED);
colors[Colors.SIGNAL_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE);
colors[Colors.CURSOR.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_YELLOW);
}
}
public Ruler getRuler(){
return ruler;
}
public void setRuler(Ruler ruler) {
this.ruler=ruler;
}
public List<IWaveform<? extends IWaveformEvent>> getStreams() {
return streams;
}
public Point getOrigin() {
return origin;
}
public void setStreams(List<IWaveform<? extends IWaveformEvent>> streams) {
this.streams = streams;
}
public long getMaxTime() {
return maxTime;
}
public Ruler getRuler() {
return ruler;
}
public void setMaxTime(long maxTime){
this.maxTime=maxTime;
syncScrollBars();
}
public void setRuler(Ruler ruler) {
this.ruler = ruler;
}
public int getTrackHeight() {
return trackHeight;
}
public Point getOrigin() {
return origin;
}
public void setTrackHeight(int trackHeight) {
this.trackHeight = trackHeight;
syncScrollBars();
}
public void setOrigin(Point origin) {
setOrigin(origin.x, origin.y);
}
public void setZoomLevel(int level) {
this.level=level;
this.scaleFactor = (long) Math.pow(10, level);
if(ruler!=null) ruler.setStartPoint(-origin.x*scaleFactor);
syncScrollBars();
}
public void setOrigin(int x, int y) {
checkWidget();
ScrollBar hBar = getHorizontalBar();
hBar.setSelection(-x);
x = -hBar.getSelection();
ScrollBar vBar = getVerticalBar();
vBar.setSelection(-y);
y = -vBar.getSelection();
origin.x = x;
origin.y = y;
syncScrollBars();
}
public int getZoomLevel() {
return level;
}
public long getScaleFactor() {
return scaleFactor;
}
public long getMaxTime() {
return maxTime;
}
public void addPainter(IPainter painter) {
painterList.add(painter);
redraw();
}
public void setMaxTime(long maxTime) {
this.maxTime = maxTime;
syncScrollBars();
}
public void removePainter(IPainter painter){
painterList.remove(painter);
redraw();
}
public int getTrackHeight() {
return trackHeight;
}
public void clearAllWavefromPainter() {
trackVerticalOffset.clear();
syncScrollBars();
}
public void setTrackHeight(int trackHeight) {
this.trackHeight = trackHeight;
syncScrollBars();
}
public void addWavefromPainter(int yoffs, IWaveformPainter painter) {
trackVerticalOffset.put(yoffs, painter);
syncScrollBars();
}
public void setZoomLevel(int level) {
this.level = level;
this.scaleFactor = (long) Math.pow(10, level);
if (ruler != null)
ruler.setStartPoint(-origin.x * scaleFactor);
syncScrollBars();
}
/**
* Dispose the garbage here
*/
public void dispose() {
transform.dispose();
for(Colors c:Colors.values()) colors[c.ordinal()].dispose();
super.dispose();
}
public int getZoomLevel() {
return level;
}
public void scrollToY(int y){
ScrollBar vBar = getVerticalBar();
vBar.setSelection(y);
scrollVertically(vBar);
}
public long getScaleFactor() {
return scaleFactor;
}
public void scrollToX(int x){
ScrollBar hBar = getHorizontalBar();
hBar.setSelection(x);
scrollHorizontally(hBar);
}
/* Scroll horizontally */
private void scrollHorizontally(ScrollBar scrollBar) {
if (painterList.size()==0) return;
origin.x= -scrollBar.getSelection();
if(ruler!=null) ruler.setStartPoint(-origin.x*scaleFactor);
syncScrollBars();
}
public void addPainter(IPainter painter) {
painterList.add(painter);
redraw();
}
/* Scroll vertically */
private void scrollVertically(ScrollBar scrollBar) {
if (painterList.size()==0) return;
origin.y = -scrollBar.getSelection();
syncScrollBars();
}
public void removePainter(IPainter painter) {
painterList.remove(painter);
redraw();
}
/* Initalize the scrollbar and register listeners. */
private void initScrollBars() {
ScrollBar horizontal = getHorizontalBar();
horizontal.setEnabled(false);
horizontal.setVisible(true);
horizontal.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
scrollHorizontally((ScrollBar) event.widget);
}
});
ScrollBar vertical = getVerticalBar();
vertical.setEnabled(false);
vertical.setVisible(true);
vertical.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
scrollVertically((ScrollBar) event.widget);
}
});
}
public void clearAllWavefromPainter() {
trackVerticalOffset.clear();
syncScrollBars();
}
/**
* Synchronize the scrollbar with the image. If the transform is out
* of range, it will correct it. This function considers only following
* factors :<b> transform, image size, client area</b>.
*/
private void syncScrollBars() {
if (painterList.size()==0) {
redraw();
return;
}
int height=1;
if(trackVerticalOffset.size()>0)
height=trackVerticalOffset.lastKey()+trackVerticalOffset.lastEntry().getValue().getMinHeight();
int width = (int) (maxTime/scaleFactor);
ScrollBar horizontal = getHorizontalBar();
horizontal.setIncrement((int) (getClientArea().width / 100));
horizontal.setPageIncrement(getClientArea().width);
int cw = getClientArea().width;
if (width > cw) { /* image is wider than client area */
horizontal.setMaximum(width);
horizontal.setEnabled(true);
if (((int) - origin.x) > horizontal.getMaximum() - cw)
origin.x = -horizontal.getMaximum() + cw;
} else { /* image is narrower than client area */
horizontal.setEnabled(false);
}
horizontal.setSelection(-origin.x);
horizontal.setThumb(cw);
public void addWavefromPainter(int yoffs, IWaveformPainter painter) {
trackVerticalOffset.put(yoffs, painter);
syncScrollBars();
}
ScrollBar vertical = getVerticalBar();
vertical.setIncrement((int) (getClientArea().height / 100));
vertical.setPageIncrement((int) (getClientArea().height));
int ch = getClientArea().height;
if (height> ch) { /* image is higher than client area */
vertical.setMaximum(height);
vertical.setEnabled(true);
if (((int) - origin.y) > vertical.getMaximum() - ch)
origin.y = -vertical.getMaximum() + ch;
} else { /* image is less higher than client area */
vertical.setMaximum((int) (ch));
vertical.setEnabled(false);
}
vertical.setSelection(-origin.y);
vertical.setThumb(ch);
ruler.setScaleFactor(scaleFactor);
redraw();
}
/**
* Dispose the garbage here
*/
public void dispose() {
transform.dispose();
for (Colors c : Colors.values())
colors[c.ordinal()].dispose();
super.dispose();
}
/* Paint function */
private void paint(GC gc) {
Rectangle clientRect = getClientArea(); /* Canvas' painting area */
clientRect.x=-origin.x;
clientRect.y=-origin.y;
// reset the transform
transform.identity();
// shift the content
transform.translate(origin.x, origin.y);
gc.setTransform(transform);
/* Initalize the scrollbar and register listeners. */
private void initScrollBars() {
ScrollBar horizontal = getHorizontalBar();
horizontal.setEnabled(false);
horizontal.setVisible(true);
horizontal.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
if (painterList.size() == 0)
return;
setOrigin(-((ScrollBar) event.widget).getSelection(), origin.y);
if (ruler != null)
ruler.setStartPoint(-origin.x * scaleFactor);
}
});
ScrollBar vertical = getVerticalBar();
vertical.setEnabled(false);
vertical.setVisible(true);
vertical.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
if (painterList.size() == 0)
return;
setOrigin(origin.x, -((ScrollBar) event.widget).getSelection());
}
});
}
/**
* Synchronize the scrollbar with the image. If the transform is out of
* range, it will correct it. This function considers only following factors
* :<b> transform, image size, client area</b>.
*/
private void syncScrollBars() {
if (painterList.size() == 0) {
redraw();
return;
}
int height = 1;
if (trackVerticalOffset.size() > 0)
height = trackVerticalOffset.lastKey() + trackVerticalOffset.lastEntry().getValue().getMinHeight();
int width = (int) (maxTime / scaleFactor);
ScrollBar horizontal = getHorizontalBar();
horizontal.setIncrement((int) (getClientArea().width / 100));
horizontal.setPageIncrement(getClientArea().width);
int cw = getClientArea().width;
if (width > cw) { /* image is wider than client area */
horizontal.setMaximum(width);
horizontal.setEnabled(true);
if (((int) -origin.x) > horizontal.getMaximum() - cw)
origin.x = -horizontal.getMaximum() + cw;
} else { /* image is narrower than client area */
horizontal.setEnabled(false);
}
horizontal.setSelection(-origin.x);
horizontal.setThumb(cw);
ScrollBar vertical = getVerticalBar();
vertical.setIncrement((int) (getClientArea().height / 100));
vertical.setPageIncrement((int) (getClientArea().height));
int ch = getClientArea().height;
if (height > ch) { /* image is higher than client area */
vertical.setMaximum(height);
vertical.setEnabled(true);
if (((int) -origin.y) > vertical.getMaximum() - ch)
origin.y = -vertical.getMaximum() + ch;
} else { /* image is less higher than client area */
vertical.setMaximum((int) (ch));
vertical.setEnabled(false);
}
vertical.setSelection(-origin.y);
vertical.setThumb(ch);
ruler.setScaleFactor(scaleFactor);
redraw();
Event e = new Event();
e.widget = this;
SelectionEvent ev = new SelectionEvent(e);
ev.x = origin.x;
ev.y = origin.y;
for (SelectionAdapter a : selectionListeners) {
a.widgetSelected(ev);
}
}
/* Paint function */
private void paint(GC gc) {
Rectangle clientRect = getClientArea(); /* Canvas' painting area */
clientRect.x = -origin.x;
clientRect.y = -origin.y;
// reset the transform
transform.identity();
// shift the content
transform.translate(origin.x, origin.y);
gc.setTransform(transform);
gc.setClipping(clientRect);
if (painterList.size()>0 && trackVerticalOffset.size()>0) {
for(IPainter painter: painterList)
painter.paintArea(gc, clientRect);
} else {
gc.fillRectangle(clientRect);
initScrollBars();
}
}
if (painterList.size() > 0 && trackVerticalOffset.size() > 0) {
for (IPainter painter : painterList)
painter.paintArea(gc, clientRect);
} else {
gc.fillRectangle(clientRect);
initScrollBars();
}
}
public Object getClicked(Point point) {
for(IPainter p:Lists.reverse(painterList)){
if(p instanceof TrackPainter){
int y= point.y-origin.y;
int x=point.x-origin.x;
Entry<Integer, IWaveformPainter> entry = trackVerticalOffset.floorEntry(y);
if(entry!=null){
if(entry.getValue() instanceof StreamPainter){
return ((StreamPainter)entry.getValue()).getClicked(new Point(x,y-entry.getKey()));
}else if(entry.getValue() instanceof SignalPainter)
return ((SignalPainter)entry.getValue()).getSignal();
}
}else if(p instanceof CursorPainter){
if(Math.abs(point.x*scaleFactor-((CursorPainter)p).getTime())<2){
return p;
}
}
}
return null;
}
public Object getClicked(Point point) {
for (IPainter p : Lists.reverse(painterList)) {
if (p instanceof TrackPainter) {
int y = point.y - origin.y;
int x = point.x - origin.x;
Entry<Integer, IWaveformPainter> entry = trackVerticalOffset.floorEntry(y);
if (entry != null) {
if (entry.getValue() instanceof StreamPainter) {
return ((StreamPainter) entry.getValue()).getClicked(new Point(x, y - entry.getKey()));
} else if (entry.getValue() instanceof SignalPainter)
return ((SignalPainter) entry.getValue()).getSignal();
}
} else if (p instanceof CursorPainter) {
if (Math.abs(point.x * scaleFactor - ((CursorPainter) p).getTime()) < 2) {
return p;
}
}
}
return null;
}
public void setSelected(ITx currentSelection, IWaveform<? extends IWaveformEvent> currentWaveformSelection) {
this.currentSelection=currentSelection;
this.currentWaveformSelection=currentWaveformSelection;
if(currentSelection!=null) reveal(currentSelection);
redraw();
}
public void setSelected(ITx currentSelection, IWaveform<? extends IWaveformEvent> currentWaveformSelection) {
this.currentSelection = currentSelection;
this.currentWaveformSelection = currentWaveformSelection;
if (currentSelection != null)
reveal(currentSelection);
redraw();
}
public void reveal(ITx tx){
int lower = (int) (tx.getBeginTime()/scaleFactor);
int higher=(int) (tx.getEndTime()/scaleFactor);
Point size = getSize();
if(lower<-origin.x){
scrollToX(lower);
} else if(higher>(size.x-origin.x)){
scrollToX(higher-size.x);
}
for(Entry<Integer, IWaveformPainter> entry:trackVerticalOffset.entrySet()){
if(entry.getValue() instanceof StreamPainter && ((StreamPainter)entry.getValue()).getStream()==tx.getStream()){
int top = entry.getKey()+trackHeight*tx.getConcurrencyIndex();
int bottom = top+trackHeight*(tx.getConcurrencyIndex()+1);
if(top<-origin.y){
scrollToY(bottom);
} else if(bottom>(size.y-origin.y)){
scrollToY(bottom-size.y);
}
}
}
}
public void reveal(ITx tx) {
int lower = (int) (tx.getBeginTime() / scaleFactor);
int higher = (int) (tx.getEndTime() / scaleFactor);
Point size = getSize();
size.x -= getVerticalBar().getSize().x + 2;
size.y -= getHorizontalBar().getSize().y;
if (lower < -origin.x) {
setOrigin(-lower, origin.y);
} else if (higher > (size.x - origin.x)) {
setOrigin(size.x - higher, origin.y);
}
for (Entry<Integer, IWaveformPainter> entry : trackVerticalOffset.entrySet()) {
if (entry.getValue() instanceof StreamPainter && ((StreamPainter) entry.getValue()).getStream() == tx.getStream()) {
int top = entry.getKey() + trackHeight * tx.getConcurrencyIndex();
int bottom = top + trackHeight;
if (top < -origin.y) {
setOrigin(origin.x, -top);
} else if (bottom > (size.y - origin.y)) {
setOrigin(origin.x, size.y - bottom);
}
}
}
}
public void addSelectionListener(SelectionAdapter selectionAdapter) {
selectionListeners.add(selectionAdapter);
}
public void removeSelectionListener(SelectionAdapter selectionAdapter) {
selectionListeners.remove(selectionAdapter);
}
}

View File

@ -53,6 +53,7 @@ public class TextDbLoader implements IWaveformDbLoader{
@Override
boolean load(IWaveformDb db, File file) throws Exception {
this.db=db
this.streams=[]
FileInputStream fis = new FileInputStream(file)
byte[] buffer = new byte[x.size()]
def readCnt = fis.read(buffer, 0, x.size())

View File

@ -51,7 +51,11 @@ class Tx implements ITx {
@Override
public int compareTo(ITx o) {
return beginTime.compareTo(o.beginTime)
def res =beginTime.compareTo(o.beginTime)
if(res!=0)
return res
else
return id.compareTo(o.id)
}
}

View File

@ -8,12 +8,15 @@ class TxEvent implements ITxEvent {
final ITxEvent.Type type;
Tx transaction;
final Tx transaction;
final Long time
TxEvent(ITxEvent.Type type, ITx transaction) {
super();
this.type = type;
this.transaction = transaction;
this.time = type==ITxEvent.Type.BEGIN?transaction.beginTime:transaction.endTime
}
@Override
@ -23,15 +26,11 @@ class TxEvent implements ITxEvent {
@Override
int compareTo(IWaveformEvent o) {
time.compareTo(o.getTime())
time.compareTo(o.time)
}
Long getTime(){
type==ITxEvent.Type.BEGIN?transaction.beginTime:transaction.endTime
}
@Override
@Override
String toString() {
type.toString()+"@"+getTime()+" of tx #"+transaction.id;
type.toString()+"@"+time+" of tx #"+transaction.id;
}
}

View File

@ -92,8 +92,10 @@ class TxStream extends HierNode implements ITxStream {
}
private putEvent(ITxEvent event){
if(!events.containsKey(event.time)) events.put(event.time, [])
events[event.time]<<event
if(!events.containsKey(event.time))
events.put(event.time, [event])
else
events[event.time]<<event
}
@Override

View File

@ -8,3 +8,6 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Export-Package: com.minres.scviewer.database
Bundle-ActivationPolicy: lazy
Service-Component: OSGI-INF/component.xml
Require-Bundle: org.eclipse.equinox.ds;bundle-version="1.4.200",
org.eclipse.equinox.util;bundle-version="1.0.500",
org.eclipse.osgi.services;bundle-version="3.4.0"

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="com.minres.scviewer.database">
<implementation class="com.minres.scviewer.database.WaveformDb"/>
<reference bind="bind" cardinality="0..n" interface="com.minres.scviewer.database.IWaveformDbLoader" name="IWaveformDbLoader" policy="dynamic" unbind="unbind"/>
</scr:component>
<reference bind="bind" cardinality="1..n" interface="com.minres.scviewer.database.IWaveformDbLoader" name="IWaveformDbLoader" policy="dynamic" unbind="unbind"/>
</scr:component>

View File

@ -29,11 +29,11 @@ http://www.eclipse.org/legal/epl-v10.html
</url>
<requires>
<import plugin="org.eclipse.equinox.ds" version="1.4.200" match="greaterOrEqual"/>
<import plugin="org.eclipse.equinox.util" version="1.0.500" match="greaterOrEqual"/>
<import plugin="org.eclipse.osgi.services" version="3.4.0" match="greaterOrEqual"/>
<import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/>
<import plugin="org.codehaus.groovy" version="1.8.6" match="greaterOrEqual"/>
<import plugin="org.eclipse.equinox.util" version="1.0.500" match="greaterOrEqual"/>
<import plugin="org.eclipse.equinox.ds" version="1.4.200" match="greaterOrEqual"/>
<import plugin="org.eclipse.osgi.services" version="3.4.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.osgi"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.core.resources"/>
@ -43,9 +43,14 @@ http://www.eclipse.org/legal/epl-v10.html
<import plugin="org.eclipse.ui.ide"/>
<import plugin="org.eclipse.ui.views.properties.tabbed"/>
<import plugin="org.eclipse.swt"/>
<import plugin="org.eclipse.ui.views"/>
<import plugin="org.apache.ant"/>
<import plugin="com.google.guava" version="15.0.0" match="greaterOrEqual"/>
<import plugin="com.minres.scviewer.database.swt" version="1.0.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.core.expressions" version="3.4.600" match="greaterOrEqual"/>
<import plugin="org.eclipse.jface"/>
<import plugin="org.junit"/>
<import plugin="org.eclipse.swt" version="3.103.1" match="greaterOrEqual"/>
<import plugin="org.eclipse.equinox.registry"/>
</requires>
<plugin
@ -96,4 +101,17 @@ http://www.eclipse.org/legal/epl-v10.html
version="0.0.0"
unpack="false"/>
<plugin
id="org.junit"
download-size="0"
install-size="0"
version="0.0.0"/>
<plugin
id="org.hamcrest.core"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>