diff --git a/com.minres.scviewer.database.sqlite/pom.xml b/com.minres.scviewer.database.sqlite/pom.xml index b75eaa1..7c1250c 100644 --- a/com.minres.scviewer.database.sqlite/pom.xml +++ b/com.minres.scviewer.database.sqlite/pom.xml @@ -15,6 +15,4 @@ 3.8.7 - com.minres.scviewer - 1.0.0-SNAPSHOT - \ No newline at end of file + \ No newline at end of file diff --git a/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF b/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF index ac7633b..c273f02 100644 --- a/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF +++ b/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF @@ -12,5 +12,4 @@ Require-Bundle: org.eclipse.swt;bundle-version="3.103.1", org.eclipse.equinox.registry, com.minres.scviewer.database.ui Export-Package: com.minres.scviewer.database.swt -Bundle-ClassPath: ., - swing2swt.jar +Bundle-ClassPath: . diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/WaveformViewerFactory.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/WaveformViewerFactory.java new file mode 100644 index 0000000..4dce3e2 --- /dev/null +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/WaveformViewerFactory.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2015 MINRES Technologies GmbH and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * MINRES Technologies GmbH - initial API and implementation + *******************************************************************************/ +package com.minres.scviewer.database.swt; + +import org.eclipse.swt.widgets.Composite; + +import com.minres.scviewer.database.swt.internal.WaveformViewer; +import com.minres.scviewer.database.ui.IWaveformViewer; +import com.minres.scviewer.database.ui.IWaveformViewerFactory; + +public class WaveformViewerFactory implements IWaveformViewerFactory { + + @Override + public IWaveformViewer createPanel(Composite parent) { + return new WaveformViewer(parent); + } + +} diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/ArrowPainter.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/ArrowPainter.java new file mode 100644 index 0000000..d9fe510 --- /dev/null +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/ArrowPainter.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2015 MINRES Technologies GmbH and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * MINRES Technologies GmbH - initial API and implementation + *******************************************************************************/ +package com.minres.scviewer.database.swt.internal; + +import java.util.Collection; + +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Rectangle; + +import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.ITxRelation; + +public class ArrowPainter implements IPainter { + + private WaveformCanvas waveCanvas; + + private ITx tx; + + private Collection incoming; + + private Collection outgoing; + + public ArrowPainter(WaveformCanvas waveCanvas, ITx tx) { + this.waveCanvas = waveCanvas; + this.tx=tx; + this.incoming = tx.getIncomingRelations(); + this.outgoing = tx.getOutgoingRelations(); + + } + + @Override + public void paintArea(GC gc, Rectangle area) { + Rectangle txRectangle = getBounds(tx); + } + + private Rectangle getBounds(ITx tx) { + return null; + } + +} diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/CursorPainter.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/CursorPainter.java index 0ecc169..a2b8f7f 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/CursorPainter.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/CursorPainter.java @@ -54,7 +54,7 @@ public class CursorPainter implements IPainter { } public void paintArea(GC gc, Rectangle area) { - if(this.waveCanvas.streams.size()>0){ + if(this.waveCanvas.painterList.size()>0){ long scaleFactor=waveCanvas.getScaleFactor(); int x = (int) (time/scaleFactor); int top = id<0?area.y:area.y+15; diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/IWaveformPainter.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/IWaveformPainter.java index 8d45151..16ec992 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/IWaveformPainter.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/IWaveformPainter.java @@ -10,9 +10,14 @@ *******************************************************************************/ package com.minres.scviewer.database.swt.internal; +import com.minres.scviewer.database.ui.TrackEntry; public interface IWaveformPainter extends IPainter { - public int getMinHeight(); - + public int getHeight(); + + public int getVerticalOffset(); + + public TrackEntry getTrackEntry(); + } \ No newline at end of file diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/SignalPainter.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/SignalPainter.java index a5ffb91..4672e84 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/SignalPainter.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/SignalPainter.java @@ -20,29 +20,28 @@ import org.eclipse.swt.graphics.Rectangle; import com.minres.scviewer.database.ISignal; import com.minres.scviewer.database.ISignalChange; -import com.minres.scviewer.database.IWaveformEvent; +import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ISignalChangeMulti; import com.minres.scviewer.database.ISignalChangeSingle; +import com.minres.scviewer.database.IWaveform; -public class SignalPainter implements IWaveformPainter { +public class SignalPainter extends TrackPainter { /** * */ private final WaveformCanvas waveCanvas; private ISignal signal; - private int height; - private boolean even; - public SignalPainter(WaveformCanvas txDisplay, boolean even, int height, ISignal signal) { + @SuppressWarnings("unchecked") + public SignalPainter(WaveformCanvas txDisplay, boolean even, TrackEntry trackEntry) { + super(trackEntry, even); this.waveCanvas = txDisplay; - this.signal=signal; - this.height=height; - this.even=even; + this.signal=trackEntry.getSignal(); } public void paintArea(GC gc, Rectangle area) { - if(waveCanvas.currentWaveformSelection!=null && waveCanvas.currentWaveformSelection.equals(signal)) + if(trackEntry.selected) gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TRACK_BG_HIGHLITE.ordinal()]); else gc.setBackground(this.waveCanvas.colors[even?WaveformCanvas.Colors.TRACK_BG_EVEN.ordinal():WaveformCanvas.Colors.TRACK_BG_ODD.ordinal()]); @@ -139,10 +138,6 @@ public class SignalPainter implements IWaveformPainter { } } - @Override - public int getMinHeight() { - return height; - } public ISignal getSignal() { return signal; diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java index 537a944..3a81422 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java @@ -24,34 +24,36 @@ import org.eclipse.swt.graphics.Rectangle; import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.ITxEvent; import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.ui.TrackEntry; -public class StreamPainter implements IWaveformPainter{ +public class StreamPainter extends TrackPainter{ /** * */ private final WaveformCanvas waveCanvas; private ITxStream stream; - private int height, upper, txHeight; + private int txBase, txHeight; private int totalHeight; private boolean even; private TreeSet seenTx; - public StreamPainter(WaveformCanvas txDisplay, boolean even, int height, ITxStream stream) { - this.waveCanvas = txDisplay; - this.stream=stream; - this.height=height; - this.upper=this.waveCanvas.getTrackHeight()/5; - this.txHeight=3*this.waveCanvas.getTrackHeight()/5; - this.totalHeight=stream.getMaxConcurrency()*this.waveCanvas.getTrackHeight(); - this.even=even; + @SuppressWarnings("unchecked") + public StreamPainter(WaveformCanvas waveCanvas, boolean even, TrackEntry trackEntry) { + super(trackEntry, even); + this.waveCanvas = waveCanvas; + this.stream=trackEntry.getStream(); this.seenTx=new TreeSet(); } @SuppressWarnings("unchecked") public void paintArea(GC gc, Rectangle area) { if(stream.getEvents().size()==0) return; - if(waveCanvas.currentWaveformSelection!=null && waveCanvas.currentWaveformSelection.equals(stream)) + int trackHeight=trackEntry.height/stream.getMaxConcurrency(); + txBase=trackHeight/5; + txHeight=trackHeight*3/5; + if(trackEntry.selected) gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TRACK_BG_HIGHLITE.ordinal()]); else gc.setBackground(this.waveCanvas.colors[even?WaveformCanvas.Colors.TRACK_BG_EVEN.ordinal():WaveformCanvas.Colors.TRACK_BG_ODD.ordinal()]); @@ -65,7 +67,7 @@ public class StreamPainter implements IWaveformPainter{ gc.setLineStyle(SWT.LINE_SOLID); gc.setLineWidth(1); gc.setForeground(this.waveCanvas.colors[WaveformCanvas.Colors.LINE.ordinal()]); - for(int y1=area.y+this.waveCanvas.getTrackHeight()/2; y1)firstTx.getValue()) @@ -101,7 +103,7 @@ public class StreamPainter implements IWaveformPainter{ protected void drawTx(GC gc, Rectangle area, ITx tx) { int offset = tx.getConcurrencyIndex()*this.waveCanvas.getTrackHeight(); Rectangle bb = new Rectangle( - (int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+upper, + (int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+txBase, (int)((tx.getEndTime()-tx.getBeginTime())/this.waveCanvas.getScaleFactor()), txHeight); if(bb.x+bb.widtharea.x+area.width) return; if(bb.width==0){ @@ -115,12 +117,7 @@ public class StreamPainter implements IWaveformPainter{ } } - @Override - public int getMinHeight() { - return height; - } - - public Object getClicked(Point point) { + public ITx getClicked(Point point) { int lane=point.y/waveCanvas.getTrackHeight(); Entry> firstTx=stream.getEvents().floorEntry(point.x*waveCanvas.getScaleFactor()); if(firstTx!=null){ @@ -130,7 +127,7 @@ public class StreamPainter implements IWaveformPainter{ firstTx=stream.getEvents().lowerEntry(firstTx.getKey()); }while(firstTx!=null); } - return stream; + return null; } public ITxStream getStream() { diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/TrackAreaPainter.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/TrackAreaPainter.java new file mode 100644 index 0000000..5a9887c --- /dev/null +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/TrackAreaPainter.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright (c) 2015 MINRES Technologies GmbH and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * MINRES Technologies GmbH - initial API and implementation + *******************************************************************************/ +package com.minres.scviewer.database.swt.internal; + +import java.util.Map.Entry; +import java.util.TreeMap; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Rectangle; + +public class TrackAreaPainter implements IPainter { + + /** + * + */ + private final WaveformCanvas waveCanvas; + + TreeMap trackVerticalOffset; + /** + * @param txDisplay + */ + public TrackAreaPainter(WaveformCanvas waveCanvas) { + this.waveCanvas = waveCanvas; + this.trackVerticalOffset= new TreeMap<>(); + } + + public void paintArea(GC gc, Rectangle a) { + Rectangle area = new Rectangle(a.x, a.y+waveCanvas.rulerHeight, a.width, a.height-waveCanvas.rulerHeight); + gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TRACK_BG_EVEN.ordinal()]); + gc.setFillRule(SWT.FILL_EVEN_ODD); + gc.fillRectangle(area); + if(trackVerticalOffset.size()>0){ + Integer firstKey=trackVerticalOffset.floorKey(area.y); + if(firstKey==null) firstKey=trackVerticalOffset.firstKey(); + Integer lastKey = trackVerticalOffset.floorKey(area.y+area.height); + Rectangle subArea = new Rectangle(area.x, 0, area.width, 0); + if(lastKey==firstKey){ + subArea.y=firstKey; + IWaveformPainter p = trackVerticalOffset.get(firstKey); + subArea.height=p.getHeight(); + p.paintArea(gc, subArea); + }else{ + for(Entry entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()){ + subArea.y=entry.getKey(); + subArea.height=entry.getValue().getHeight(); + entry.getValue().paintArea(gc, subArea); + } + } + } + } + + public TreeMap getTrackVerticalOffset() { + return trackVerticalOffset; + } + + public void addTrackPainter(IWaveformPainter trackPainter){ + trackVerticalOffset.put(trackPainter.getVerticalOffset()+waveCanvas.rulerHeight, trackPainter); + + } + + public int getHeight(){ + if(trackVerticalOffset.size()==0) return 1; + return trackVerticalOffset.lastKey() + trackVerticalOffset.lastEntry().getValue().getHeight(); + } +} \ No newline at end of file diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/TrackPainter.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/TrackPainter.java index 728549c..9fa285c 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/TrackPainter.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/TrackPainter.java @@ -10,50 +10,33 @@ *******************************************************************************/ package com.minres.scviewer.database.swt.internal; -import java.util.Map.Entry; -import java.util.TreeMap; +import com.minres.scviewer.database.ui.TrackEntry; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Rectangle; +public abstract class TrackPainter implements IWaveformPainter { -public class TrackPainter implements IPainter { - - /** - * - */ - private final WaveformCanvas waveCanvas; + protected boolean even; - /** - * @param txDisplay - */ - public TrackPainter(WaveformCanvas waveCanvas) { - this.waveCanvas = waveCanvas; + protected TrackEntry trackEntry; + + public TrackPainter(TrackEntry trackEntry, boolean even) { + this.trackEntry = trackEntry; + this.even=even; } - public void paintArea(GC gc, Rectangle a) { - Rectangle area = new Rectangle(a.x, a.y+waveCanvas.rulerHeight, a.width, a.height-waveCanvas.rulerHeight); - gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TRACK_BG_EVEN.ordinal()]); - gc.setFillRule(SWT.FILL_EVEN_ODD); - gc.fillRectangle(area); - TreeMap offsets = this.waveCanvas.trackVerticalOffset; - if(this.waveCanvas.streams.size()>0){ - Integer firstKey=offsets.floorKey(area.y); - if(firstKey==null) firstKey=offsets.firstKey(); - Integer lastKey = offsets.floorKey(area.y+area.height); - Rectangle subArea = new Rectangle(area.x, 0, area.width, 0); - if(lastKey==firstKey){ - subArea.y=firstKey; - IWaveformPainter p = offsets.get(firstKey); - subArea.height=p.getMinHeight(); - p.paintArea(gc, subArea); - }else{ - for(Entry entry : offsets.subMap(firstKey, true, lastKey, true).entrySet()){ - subArea.y=entry.getKey(); - subArea.height=entry.getValue().getMinHeight(); - entry.getValue().paintArea(gc, subArea); - } - } - } + public int getHeight() { + return trackEntry.height; } -} \ No newline at end of file + + public int getVerticalOffset() { + return trackEntry.vOffset; + } + + public boolean isEven() { + return even; + } + + public TrackEntry getTrackEntry() { + return trackEntry; + } + +} diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java index 04ddebd..7fcb094 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java @@ -10,11 +10,11 @@ *******************************************************************************/ package com.minres.scviewer.database.swt.internal; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; -import java.util.TreeMap; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlAdapter; @@ -54,25 +54,38 @@ public class WaveformCanvas extends Canvas { Color[] colors = new Color[Colors.values().length]; private int trackHeight = 50; + private long scaleFactor = 1000000L; // 1ns + String unit="ns"; + private int level = 12; + public final static String[] unitString={"fs", "ps", "ns", "µs", "ms"};//, "s"}; + public final static int[] unitMultiplier={1, 3, 10, 30, 100, 300}; + private long maxTime; + protected Point origin; /* original size */ + protected Transform transform; + protected int rulerHeight=40; + protected List painterList; - TreeMap trackVerticalOffset; - - protected List> streams; - + ITx currentSelection; - IWaveform currentWaveformSelection; - + private List selectionListeners; + private RulerPainter rulerPainter; + + private TrackAreaPainter trackAreaPainter; + + private List cursorPainters; + + private HashMap, IWaveformPainter> wave2painterMap; /** * Constructor for ScrollableCanvas. * @@ -96,12 +109,31 @@ public class WaveformCanvas extends Canvas { painterList = new LinkedList(); origin = new Point(0, 0); transform = new Transform(getDisplay()); - trackVerticalOffset = new TreeMap(); selectionListeners = new LinkedList<>(); + cursorPainters= new ArrayList<>(); + wave2painterMap=new HashMap<>(); + initScrollBars(); initColors(null); + // order is important: it is bottom to top + trackAreaPainter=new TrackAreaPainter(this); + painterList.add(trackAreaPainter); + rulerPainter=new RulerPainter(this, getDisplay().getSystemColor(SWT.COLOR_BLACK), getDisplay().getSystemColor(SWT.COLOR_WHITE)); + painterList.add(rulerPainter); + CursorPainter cp = new CursorPainter(this, scaleFactor * 10, cursorPainters.size()-1); + painterList.add(cp); + cursorPainters.add(cp); + CursorPainter marker = new CursorPainter(this, scaleFactor * 100, cursorPainters.size()-1); + painterList.add(marker); + cursorPainters.add(marker); + wave2painterMap=new HashMap<>(); } + public void addCursoPainter(CursorPainter cursorPainter){ + painterList.add(cursorPainter); + cursorPainters.add(cursorPainter); + } + private void initColors(HashMap colourMap) { Display d = getDisplay(); if (colourMap != null) { @@ -133,14 +165,6 @@ public class WaveformCanvas extends Canvas { } } - public List> getStreams() { - return streams; - } - - public void setStreams(List> streams) { - this.streams = streams; - } - public Point getOrigin() { return origin; } @@ -229,17 +253,23 @@ public class WaveformCanvas extends Canvas { redraw(); } - public void clearAllWavefromPainter() { - trackVerticalOffset.clear(); + public void clearAllWaveformPainter() { + trackAreaPainter.getTrackVerticalOffset().clear(); + wave2painterMap.clear(); syncScrollBars(); } - public void addWavefromPainter(int yoffs, IWaveformPainter painter) { - trackVerticalOffset.put(yoffs+rulerHeight, painter); + public void addWaveformPainter(IWaveformPainter painter) { + trackAreaPainter.addTrackPainter(painter); + wave2painterMap.put(painter.getTrackEntry().waveform, painter); syncScrollBars(); } - /** + public List getCursorPainters() { + return cursorPainters; + } + + /** * Dispose the garbage here */ public void dispose() { @@ -278,15 +308,12 @@ public class WaveformCanvas extends Canvas { * range, it will correct it. This function considers only following factors * : transform, image size, client area. */ - private void syncScrollBars() { + public void syncScrollBars() { if (painterList.size() == 0) { redraw(); return; } - int height = 1; - if (trackVerticalOffset.size() > 0) - height = trackVerticalOffset.lastKey() + trackVerticalOffset.lastEntry().getValue().getMinHeight(); - + int height = trackAreaPainter.getHeight(); int width = (int) (maxTime / scaleFactor); ScrollBar horizontal = getHorizontalBar(); horizontal.setIncrement((int) (getClientArea().width / 100)); @@ -334,7 +361,7 @@ public class WaveformCanvas extends Canvas { transform.translate(origin.x, origin.y); gc.setTransform(transform); gc.setClipping(clientRect); - if (painterList.size() > 0 && trackVerticalOffset.size() > 0) { + if (painterList.size() > 0 ) { for (IPainter painter : painterList) painter.paintArea(gc, clientRect); } else { @@ -346,15 +373,17 @@ public class WaveformCanvas extends Canvas { public List getClicked(Point point) { LinkedList result=new LinkedList<>(); for (IPainter p : Lists.reverse(painterList)) { - if (p instanceof TrackPainter) { + if (p instanceof TrackAreaPainter) { int y = point.y - origin.y; int x = point.x - origin.x; - Entry entry = trackVerticalOffset.floorEntry(y); + Entry entry = trackAreaPainter.getTrackVerticalOffset().floorEntry(y); if (entry != null) { if (entry.getValue() instanceof StreamPainter) { - result.add(((StreamPainter) entry.getValue()).getClicked(new Point(x, y - entry.getKey()))); - } else if (entry.getValue() instanceof SignalPainter) - result.add(((SignalPainter) entry.getValue()).getSignal()); + ITx tx = ((StreamPainter) entry.getValue()).getClicked(new Point(x, y - entry.getKey())); + if(tx!=null) + result.add(tx); + } + result.add(entry.getValue().getTrackEntry()); } } else if (p instanceof CursorPainter) { if (Math.abs(point.x - origin.x - ((CursorPainter) p).getTime()/scaleFactor) < 2) { @@ -368,7 +397,7 @@ public class WaveformCanvas extends Canvas { public List getEntriesAtPosition(IWaveform iWaveform, int i) { LinkedList result=new LinkedList<>(); int x = i - origin.x; - for(IPainter p: trackVerticalOffset.values()){ + for(IPainter p: wave2painterMap.values()){ if (p instanceof StreamPainter && ((StreamPainter)p).getStream()==iWaveform) { result.add(((StreamPainter) p).getClicked(new Point(x, trackHeight/2))); } @@ -376,9 +405,8 @@ public class WaveformCanvas extends Canvas { return result; } - public void setSelected(ITx currentSelection, IWaveform currentWaveformSelection) { + public void setSelected(ITx currentSelection) { this.currentSelection = currentSelection; - this.currentWaveformSelection = currentWaveformSelection; if (currentSelection != null) reveal(currentSelection); redraw(); @@ -395,9 +423,9 @@ public class WaveformCanvas extends Canvas { } else if (higher > (size.x - origin.x)) { setOrigin(size.x - higher, origin.y); } - for (Entry entry : trackVerticalOffset.entrySet()) { - if (entry.getValue() instanceof StreamPainter && ((StreamPainter) entry.getValue()).getStream() == tx.getStream()) { - int top = entry.getKey() + trackHeight * tx.getConcurrencyIndex(); + for (IWaveformPainter painter : wave2painterMap.values()) { + if (painter instanceof StreamPainter && ((StreamPainter) painter).getStream() == tx.getStream()) { + int top = painter.getVerticalOffset() + trackHeight * tx.getConcurrencyIndex(); int bottom = top + trackHeight; if (top < -origin.y) { setOrigin(origin.x, -(top-trackHeight)); diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/TxDisplay.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformViewer.java similarity index 83% rename from com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/TxDisplay.java rename to com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformViewer.java index 5e85e4e..c6d2f15 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/TxDisplay.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformViewer.java @@ -8,7 +8,7 @@ * Contributors: * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ -package com.minres.scviewer.database.swt; +package com.minres.scviewer.database.swt.internal; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -19,7 +19,6 @@ import java.util.List; import java.util.Map.Entry; import java.util.NavigableMap; import java.util.TreeMap; -import java.util.Vector; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.util.LocalSelectionTransfer; @@ -75,20 +74,13 @@ import com.minres.scviewer.database.ITxEvent; import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformEvent; -import com.minres.scviewer.database.swt.internal.CursorPainter; -import com.minres.scviewer.database.swt.internal.IWaveformPainter; -import com.minres.scviewer.database.swt.internal.ObservableList; -import com.minres.scviewer.database.swt.internal.RulerPainter; -import com.minres.scviewer.database.swt.internal.SignalPainter; -import com.minres.scviewer.database.swt.internal.StreamPainter; -import com.minres.scviewer.database.swt.internal.TrackPainter; -import com.minres.scviewer.database.swt.internal.WaveformCanvas; import com.minres.scviewer.database.ui.GotoDirection; -import com.minres.scviewer.database.ui.IWaveformPanel; +import com.minres.scviewer.database.ui.IWaveformViewer; +import com.minres.scviewer.database.ui.TrackEntry; -public class TxDisplay implements IWaveformPanel { +public class WaveformViewer implements IWaveformViewer { - private ListenerList selectionChangedListeners = new ListenerList(); + private ListenerList selectionChangedListeners = new ListenerList(); private PropertyChangeSupport pcs; @@ -96,7 +88,7 @@ public class TxDisplay implements IWaveformPanel { private ITx currentTxSelection; - private IWaveform currentWaveformSelection; + private TrackEntry currentWaveformSelection; private ScrolledComposite nameListScrolled; @@ -110,15 +102,13 @@ public class TxDisplay implements IWaveformPanel { private Composite top; - protected ObservableList> streams; + protected ObservableList streams; - Vector cursorPainters; - int selectedMarker = 0; private int trackVerticalHeight; - private TreeMap> trackVerticalOffset; + private TreeMap trackVerticalOffset; private HashMap, String> actualValues; @@ -128,9 +118,9 @@ public class TxDisplay implements IWaveformPanel { @Override public void mouseDown(MouseEvent e) { if ((e.button == 1 || e.button == 3)) { - Entry> entry = trackVerticalOffset.floorEntry(e.y); + Entry entry = trackVerticalOffset.floorEntry(e.y); if (entry != null) - setSelection(new StructuredSelection(entry.getValue())); + setSelection(new StructuredSelection(entry.getValue().waveform)); } if (e.button == 3) { Menu topMenu= top.getMenu(); @@ -150,15 +140,8 @@ public class TxDisplay implements IWaveformPanel { initialSelected = waveformCanvas.getClicked(start); } else if (e.button == 3) { List hitted = waveformCanvas.getClicked(start); - for(Object entry:hitted){ - if(entry instanceof IWaveform){ - setSelection(new StructuredSelection(entry)); - break; - }else if(entry instanceof ITx){ - setSelection(new StructuredSelection(((ITx)entry).getStream())); - break; - } - } + if(hitted!=null && hitted.size()>0) + setSelection(new StructuredSelection(hitted)); Menu topMenu= top.getMenu(); if(topMenu!=null) topMenu.setVisible(true); } @@ -197,14 +180,17 @@ public class TxDisplay implements IWaveformPanel { long scaling=5*waveformCanvas.getScaleFactor(); for(Object o:waveformCanvas.getClicked(start)){ Entry floorEntry=null, ceilEntry=null; - if(o instanceof ISignal){ - NavigableMap map = ((ISignal)o).getEvents(); - floorEntry = map.floorEntry(time); - ceilEntry = map.ceilingEntry(time); - } else if (o instanceof ITxStream){ - NavigableMap map = ((ITxStream)o).getEvents(); - floorEntry = map.floorEntry(time); - ceilEntry = map.ceilingEntry(time); + if(o instanceof TrackEntry){ + TrackEntry entry = (TrackEntry) o; + if(entry.waveform instanceof ISignal){ + NavigableMap map = ((ISignal)entry.waveform).getEvents(); + floorEntry = map.floorEntry(time); + ceilEntry = map.ceilingEntry(time); + } else if (entry.waveform instanceof ITxStream){ + NavigableMap map = ((ITxStream)entry.waveform).getEvents(); + floorEntry = map.floorEntry(time); + ceilEntry = map.ceilingEntry(time); + } } else if(o instanceof ITx){ NavigableMap map = ((ITx)o).getStream().getEvents(); floorEntry = map.floorEntry(time); @@ -226,18 +212,17 @@ public class TxDisplay implements IWaveformPanel { } }; - public TxDisplay(Composite parent) { + public WaveformViewer(Composite parent) { pcs=new PropertyChangeSupport(this); - trackVerticalOffset = new TreeMap>(); + trackVerticalOffset = new TreeMap(); trackVerticalHeight=0; actualValues = new HashMap, String>(); - cursorPainters = new Vector(); nameFont = parent.getDisplay().getSystemFont(); nameFontB = SWTResourceManager.getBoldFont(nameFont); - streams = new ObservableList>(); + streams = new ObservableList<>(); streams.addPropertyChangeListener(this); top = new Composite(parent, SWT.NONE); @@ -319,17 +304,6 @@ public class TxDisplay implements IWaveformPanel { valueList.addMouseListener(nameValueMouseListener); valueListScrolled.setContent(valueList); - waveformCanvas.setStreams(streams); - // order is important: it is bottom to top - waveformCanvas.addPainter(new TrackPainter(waveformCanvas)); - waveformCanvas.addPainter(new RulerPainter( - waveformCanvas, waveformCanvas.getDisplay().getSystemColor(SWT.COLOR_BLACK), waveformCanvas.getDisplay().getSystemColor(SWT.COLOR_WHITE))); - CursorPainter cp = new CursorPainter(waveformCanvas, waveformCanvas.getScaleFactor() * 10, cursorPainters.size()-1); - waveformCanvas.addPainter(cp); - cursorPainters.add(cp); - CursorPainter marker = new CursorPainter(waveformCanvas, waveformCanvas.getScaleFactor() * 100, cursorPainters.size()-1); - waveformCanvas.addPainter(marker); - cursorPainters.add(marker); waveformCanvas.setMaxTime(1); waveformCanvas.addMouseListener(waveformMouseListener); @@ -406,28 +380,28 @@ public class TxDisplay implements IWaveformPanel { IWaveformPainter painter = null; trackVerticalOffset.clear(); actualValues.clear(); - waveformCanvas.clearAllWavefromPainter(); + waveformCanvas.clearAllWaveformPainter(); boolean even = true; boolean clearSelection = true; TextLayout tl = new TextLayout(waveformCanvas.getDisplay()); tl.setFont(nameFontB); - for (IWaveform waveform : streams) { - int height = waveformCanvas.getTrackHeight(); - clearSelection &= (waveform != currentWaveformSelection); - if (waveform instanceof ITxStream) { - ITxStream stream = (ITxStream) waveform; - height *= stream.getMaxConcurrency(); - painter = new StreamPainter(waveformCanvas, even, height, (ITxStream) waveform); - actualValues.put(stream, ""); - } else if (waveform instanceof ISignal) { - painter = new SignalPainter(waveformCanvas, even, height, (ISignal) waveform); - actualValues.put(waveform, "---"); + for (TrackEntry streamEntry : streams) { + streamEntry.height = waveformCanvas.getTrackHeight(); + streamEntry.vOffset=trackVerticalHeight; + clearSelection &= currentWaveformSelection!=null && (streamEntry.waveform != currentWaveformSelection.waveform); + if (streamEntry.isStream()) { + streamEntry.height *= streamEntry.getStream().getMaxConcurrency(); + painter = new StreamPainter(waveformCanvas, even, streamEntry); + actualValues.put(streamEntry.waveform, ""); + } else if (streamEntry.isSignal()) { + painter = new SignalPainter(waveformCanvas, even, streamEntry); + actualValues.put(streamEntry.waveform, "---"); } - waveformCanvas.addWavefromPainter(trackVerticalHeight, painter); - trackVerticalOffset.put(trackVerticalHeight, waveform); - tl.setText(waveform.getFullName()); + waveformCanvas.addWaveformPainter(painter); + trackVerticalOffset.put(trackVerticalHeight, streamEntry); + tl.setText(streamEntry.waveform.getFullName()); nameMaxWidth = Math.max(nameMaxWidth, tl.getBounds().width); - trackVerticalHeight += height; + trackVerticalHeight += streamEntry.height; even = !even; } nameList.setSize(nameMaxWidth + 15, trackVerticalHeight); @@ -438,7 +412,9 @@ public class TxDisplay implements IWaveformPanel { updateValueList(); waveformCanvas.redraw(); top.layout(new Control[] { valueList, nameList, waveformCanvas }); - if (trackVerticalOffset.isEmpty() || previousHeight > trackVerticalOffset.lastKey()) { + if (trackVerticalOffset.isEmpty()){ + waveformCanvas.setOrigin(0, 0); + }else if(previousHeight > trackVerticalOffset.lastKey()){ Point o = waveformCanvas.getOrigin(); waveformCanvas.setOrigin(o.x, o.y - (previousHeight - trackVerticalOffset.lastKey())); } @@ -563,7 +539,7 @@ public class TxDisplay implements IWaveformPanel { if (currentTxSelection != null) return new StructuredSelection(currentTxSelection); else if (currentWaveformSelection != null) - return new StructuredSelection(currentWaveformSelection); + return new StructuredSelection(currentWaveformSelection.waveform); else return new StructuredSelection(); } @@ -583,28 +559,28 @@ public class TxDisplay implements IWaveformPanel { @SuppressWarnings("unchecked") public void setSelection(ISelection selection, boolean addIfNeeded) { boolean selectionChanged = false; + if(currentWaveformSelection!=null) currentWaveformSelection.selected=false; if (selection instanceof IStructuredSelection) { if(((IStructuredSelection) selection).size()==0){ - selectionChanged = currentTxSelection!=null||currentWaveformSelection!=null; + selectionChanged = currentTxSelection!=null||currentWaveformSelection!=null; currentTxSelection = null; currentWaveformSelection = null; } else { for(Object sel:((IStructuredSelection) selection).toArray()){ if (sel instanceof ITx && currentTxSelection != sel){ ITx txSel = (ITx) sel; - if (streams.contains(((ITx)sel).getStream())) { - currentTxSelection = txSel; - currentWaveformSelection = txSel.getStream(); - selectionChanged = true; - } else if(addIfNeeded){ - streams.add(txSel.getStream()); - currentTxSelection = txSel; - currentWaveformSelection = txSel.getStream(); - selectionChanged = true; + TrackEntry trackEntry = getEntryForStream(txSel.getStream()); + if(trackEntry==null && addIfNeeded){ + trackEntry=new TrackEntry(txSel.getStream()); + streams.add(trackEntry); + currentWaveformSelection = trackEntry; } - } else if (sel instanceof IWaveform && currentWaveformSelection != sel&& streams.contains(sel)) { - currentTxSelection = null; - currentWaveformSelection = (IWaveform) sel; + currentTxSelection = txSel; + selectionChanged = true; + } else if (sel instanceof TrackEntry && currentWaveformSelection != sel) { + currentWaveformSelection = (TrackEntry) sel; + if(currentTxSelection!=null && currentTxSelection.getStream()!=currentWaveformSelection) + currentTxSelection=null; selectionChanged = true; } } @@ -615,15 +591,23 @@ public class TxDisplay implements IWaveformPanel { currentTxSelection = null; currentWaveformSelection = null; } + if(currentWaveformSelection!=null) currentWaveformSelection.selected=true; if (selectionChanged) { - waveformCanvas.setSelected(currentTxSelection, currentWaveformSelection); - nameList.setData(SELECTION, currentWaveformSelection); + waveformCanvas.setSelected(currentTxSelection); valueList.redraw(); nameList.redraw(); - Object[] list = selectionChangedListeners.getListeners(); - for (int i = 0; i < list.length; i++) { - ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); - } + fireSelectionChanged(); + } + } + + protected void fireSelectionChanged() { + if(currentWaveformSelection==null) return; + IStructuredSelection selection=currentTxSelection!=null? + new StructuredSelection(new Object[]{currentTxSelection, currentWaveformSelection.waveform}): + new StructuredSelection(currentWaveformSelection.waveform); + Object[] list = selectionChangedListeners.getListeners(); + for (int i = 0; i < list.length; i++) { + ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); } } @@ -633,8 +617,8 @@ public class TxDisplay implements IWaveformPanel { @Override @SuppressWarnings("unchecked") public void moveSelection(GotoDirection direction) { - if (currentWaveformSelection instanceof ITxStream) { - ITxStream stream = (ITxStream) currentWaveformSelection; + if (currentWaveformSelection.isStream()) { + ITxStream stream = currentWaveformSelection.getStream(); ITx transaction = null; if (direction == GotoDirection.NEXT) { List thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime()); @@ -701,10 +685,10 @@ public class TxDisplay implements IWaveformPanel { public void moveCursor(GotoDirection direction) { long time = getCursorTime(); NavigableMap map=null; - if(currentWaveformSelection instanceof ITxStream){ - map=((ITxStream) currentWaveformSelection).getEvents(); - } else if(currentWaveformSelection instanceof ISignal){ - map=((ISignal) currentWaveformSelection).getEvents(); + if(currentWaveformSelection.isStream()){ + map=currentWaveformSelection.getStream().getEvents(); + } else if(currentWaveformSelection.isSignal()){ + map=currentWaveformSelection.getSignal().getEvents(); } if(map!=null){ Entry entry=direction==GotoDirection.PREV?map.lowerEntry(time):map.higherEntry(time); @@ -722,7 +706,7 @@ public class TxDisplay implements IWaveformPanel { * @see com.minres.scviewer.database.swt.IWaveformPanel#getStreamList() */ @Override - public List> getStreamList() { + public List getStreamList() { return streams; } @@ -733,16 +717,16 @@ public class TxDisplay implements IWaveformPanel { public void moveSelected(int i) { if(currentWaveformSelection!=null){ ITx selectedTx=currentTxSelection; - IWaveform selectedWaveform=currentWaveformSelection; + TrackEntry selectedWaveform=currentWaveformSelection; int idx = streams.indexOf(currentWaveformSelection); int newIdx=idx+i; if(newIdx>=0 && newIdx 0) { - @SuppressWarnings("unchecked") - IWaveform wave = (IWaveform) nameList.getData(SELECTION); Integer firstKey = trackVerticalOffset.floorKey(rect.y); if (firstKey == null) firstKey = trackVerticalOffset.firstKey(); Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); Rectangle subArea = new Rectangle(rect.x, 0, rect.width, waveformCanvas.getTrackHeight()); if (lastKey == firstKey) { - IWaveform w = trackVerticalOffset.get(firstKey); + TrackEntry trackEntry=trackVerticalOffset.get(firstKey); + IWaveform w = trackEntry.waveform; if (w instanceof ITxStream) subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawTextFormat(gc, subArea, firstKey, w.getFullName(), w.equals(wave)); + drawTextFormat(gc, subArea, firstKey, w.getFullName(), trackEntry.selected); } else { - for (Entry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) - .entrySet()) { - IWaveform w = entry.getValue(); + for (Entry entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()) { + IWaveform w = entry.getValue().waveform; subArea.height = waveformCanvas.getTrackHeight(); if (w instanceof ITxStream) subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), w.equals(wave)); + drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), entry.getValue().selected); } } } } - @SuppressWarnings("unchecked") protected void paintValues(GC gc, Rectangle rect) { if (streams.size() > 0) { - IWaveform wave = (IWaveform) nameList.getData(SELECTION); Integer firstKey = trackVerticalOffset.floorKey(rect.y); if (firstKey == null) firstKey = trackVerticalOffset.firstKey(); Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); Rectangle subArea = new Rectangle(rect.x, 0, rect.width, waveformCanvas.getTrackHeight()); if (lastKey == firstKey) { - IWaveform w = trackVerticalOffset.get(firstKey); + TrackEntry trackEntry=trackVerticalOffset.get(firstKey); + IWaveform w = trackEntry.waveform; if (w instanceof ITxStream) subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawValue(gc, subArea, firstKey, actualValues.get(w), w.equals(wave)); + drawValue(gc, subArea, firstKey, actualValues.get(w), trackEntry.selected); } else { - for (Entry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) + for (Entry entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) .entrySet()) { - IWaveform w = entry.getValue(); + IWaveform w = entry.getValue().waveform; subArea.height = waveformCanvas.getTrackHeight(); if (w instanceof ITxStream) subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawValue(gc, subArea, entry.getKey(), actualValues.get(w), w.equals(wave)); + drawValue(gc, subArea, entry.getKey(), actualValues.get(w), entry.getValue().selected); } } } @@ -865,8 +846,8 @@ public class TxDisplay implements IWaveformPanel { */ @Override public void setCursorTime(long time){ - final Long oldVal= cursorPainters.get(0).getTime(); - cursorPainters.get(0).setTime(time); + final Long oldVal= waveformCanvas.getCursorPainters().get(0).getTime(); + waveformCanvas.getCursorPainters().get(0).setTime(time); pcs.firePropertyChange(CURSOR_PROPERTY, oldVal, time); } @@ -875,9 +856,9 @@ public class TxDisplay implements IWaveformPanel { */ @Override public void setMarkerTime(long time, int index){ - if(cursorPainters.size()>index+1){ - final Long oldVal= cursorPainters.get(1+index).getTime(); - cursorPainters.get(1+index).setTime(time); + if(waveformCanvas.getCursorPainters().size()>index+1){ + final Long oldVal= waveformCanvas.getCursorPainters().get(1+index).getTime(); + waveformCanvas.getCursorPainters().get(1+index).setTime(time); pcs.firePropertyChange(MARKER_PROPERTY, oldVal, time); } } @@ -887,7 +868,7 @@ public class TxDisplay implements IWaveformPanel { */ @Override public long getCursorTime(){ - return cursorPainters.get(0).getTime(); + return waveformCanvas.getCursorPainters().get(0).getTime(); } /* (non-Javadoc) @@ -903,7 +884,7 @@ public class TxDisplay implements IWaveformPanel { */ @Override public long getMarkerTime(int index){ - return cursorPainters.get(index+1).getTime(); + return waveformCanvas.getCursorPainters().get(index+1).getTime(); } private void createStreamDragSource(final Canvas canvas) { @@ -948,14 +929,15 @@ public class TxDisplay implements IWaveformPanel { if(source instanceof IWaveform && target instanceof IWaveform){ IWaveform srcWave=(IWaveform) source; int srcIdx=streams.indexOf(srcWave); - streams.remove(source); + streams.remove(getEntryForStream((IWaveform)source)); int tgtIdx=streams.indexOf(target); if(srcIdx<=tgtIdx) tgtIdx++; + TrackEntry entry = new TrackEntry(srcWave); if(tgtIdx>=streams.size()) - streams.add(srcWave); + streams.add(entry); else - streams.add(tgtIdx, srcWave); - currentWaveformSelection=srcWave; + streams.add(tgtIdx, entry); + currentWaveformSelection=entry; updateTracklist(); } else if(source instanceof CursorPainter){ ((CursorPainter)source).setTime(0); @@ -975,6 +957,12 @@ public class TxDisplay implements IWaveformPanel { }); } + public TrackEntry getEntryForStream(IWaveform source) { + for(TrackEntry trackEntry:streams) + if(trackEntry.waveform.equals(source)) return trackEntry; + return null; + } + private void createWaveformDragSource(final Canvas canvas) { Transfer[] types = new Transfer[] { LocalSelectionTransfer.getTransfer() }; DragSource dragSource = new DragSource(canvas, DND.DROP_MOVE); diff --git a/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/SWTResourceManager.java b/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/SWTResourceManager.java index 8b6d4cc..20a9264 100644 --- a/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/SWTResourceManager.java +++ b/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/SWTResourceManager.java @@ -1,12 +1,12 @@ /******************************************************************************* - * Copyright (c) 2011 Google, Inc. + * Copyright (c) 2015 MINRES Technologies GmbH and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Google, Inc. - initial API and implementation + * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ package org.eclipse.wb.swt; diff --git a/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/GotoDirection.java b/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/GotoDirection.java index 4d3cd0b..4809532 100644 --- a/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/GotoDirection.java +++ b/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/GotoDirection.java @@ -10,4 +10,4 @@ *******************************************************************************/ package com.minres.scviewer.database.ui; -public enum GotoDirection {PREV, NEXT} \ No newline at end of file +public enum GotoDirection {PREV, NEXT, UP, DOWN} \ No newline at end of file diff --git a/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformPanel.java b/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformViewer.java similarity index 68% rename from com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformPanel.java rename to com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformViewer.java index 83e5417..e3f7f00 100644 --- a/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformPanel.java +++ b/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformViewer.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * Copyright (c) 2015 MINRES Technologies GmbH and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * MINRES Technologies GmbH - initial API and implementation + *******************************************************************************/ package com.minres.scviewer.database.ui; import java.beans.PropertyChangeListener; @@ -9,9 +19,8 @@ import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.swt.widgets.Control; import com.minres.scviewer.database.IWaveform; -import com.minres.scviewer.database.IWaveformEvent; -public interface IWaveformPanel extends PropertyChangeListener, ISelectionProvider{ +public interface IWaveformViewer extends PropertyChangeListener, ISelectionProvider{ String CURSOR_PROPERTY = "cursor_time"; String MARKER_PROPERTY = "marker_time"; @@ -38,8 +47,10 @@ public interface IWaveformPanel extends PropertyChangeListener, ISelectionProvid void moveCursor(GotoDirection direction); - List> getStreamList(); + List getStreamList(); + public TrackEntry getEntryForStream(IWaveform source); + void moveSelected(int i); long getMaxTime(); diff --git a/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformViewerFactory.java b/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformViewerFactory.java new file mode 100644 index 0000000..9db3a8b --- /dev/null +++ b/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformViewerFactory.java @@ -0,0 +1,17 @@ +/******************************************************************************* + * Copyright (c) 2015 MINRES Technologies GmbH and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * MINRES Technologies GmbH - initial API and implementation + *******************************************************************************/ +package com.minres.scviewer.database.ui; + +import org.eclipse.swt.widgets.Composite; + +public interface IWaveformViewerFactory { + public IWaveformViewer createPanel(Composite parent); +} diff --git a/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/TrackEntry.java b/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/TrackEntry.java new file mode 100644 index 0000000..b40748a --- /dev/null +++ b/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/TrackEntry.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2015 MINRES Technologies GmbH and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * MINRES Technologies GmbH - initial API and implementation + *******************************************************************************/ +package com.minres.scviewer.database.ui; + +import com.minres.scviewer.database.ISignal; +import com.minres.scviewer.database.ISignalChange; +import com.minres.scviewer.database.ITxEvent; +import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.IWaveformEvent; + +public class TrackEntry { + final public IWaveform waveform; + + public int vOffset; + + public int height; + + public boolean selected; + + public TrackEntry(IWaveform waveform) { + this.waveform = waveform; + vOffset=0; + height=0; + selected=false; + } + + public boolean isStream(){ + return waveform instanceof ITxStream; + } + + public ITxStream getStream(){ + return (ITxStream) waveform; + } + + public boolean isSignal(){ + return waveform instanceof ISignal; + } + + public ISignal getSignal(){ + return (ISignal) waveform; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof TrackEntry){ + TrackEntry o = (TrackEntry) obj; + return waveform==o.waveform && vOffset==o.vOffset; + } + return false; + } +} \ No newline at end of file diff --git a/com.minres.scviewer.database.vcd/pom.xml b/com.minres.scviewer.database.vcd/pom.xml index bdee87e..f938751 100644 --- a/com.minres.scviewer.database.vcd/pom.xml +++ b/com.minres.scviewer.database.vcd/pom.xml @@ -8,6 +8,4 @@ ../com.minres.scviewer.parent eclipse-plugin - 1.0.0-SNAPSHOT - com.minres.scviewer - \ No newline at end of file + \ No newline at end of file diff --git a/com.minres.scviewer.database/pom.xml b/com.minres.scviewer.database/pom.xml index e1d0179..48149fe 100644 --- a/com.minres.scviewer.database/pom.xml +++ b/com.minres.scviewer.database/pom.xml @@ -8,6 +8,4 @@ ../com.minres.scviewer.parent eclipse-plugin - com.minres.scviewer - 1.0.0-SNAPSHOT - \ No newline at end of file + \ No newline at end of file diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewerPart.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewerPart.java index 54c9d2b..10af6be 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewerPart.java +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewerPart.java @@ -48,21 +48,26 @@ import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.widgets.Composite; import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.ITxEvent; +import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbFactory; import com.minres.scviewer.database.IWaveformEvent; -import com.minres.scviewer.database.swt.TxDisplay; +import com.minres.scviewer.database.swt.WaveformViewerFactory; import com.minres.scviewer.database.ui.GotoDirection; -import com.minres.scviewer.database.ui.IWaveformPanel; +import com.minres.scviewer.database.ui.IWaveformViewer; +import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.e4.application.internal.WaveStatusBarControl; public class WaveformViewerPart { public static final String ACTIVE_WAVEFORMVIEW="Active_Waveform_View"; + public static final String ADD_WAVEFORM="AddWaveform"; protected static final String DATABASE_FILE = "DATABASE_FILE"; + protected static final String SHOWN_WAVEFORM = "SHOWN_WAVEFORM"; private String[] zoomLevel; @@ -71,7 +76,9 @@ public class WaveformViewerPart { public static final String WAVE_ACTION_ID = "com.minres.scviewer.ui.action.AddToWave"; - private IWaveformPanel waveformPane; + WaveformViewerFactory factory = new WaveformViewerFactory(); + + private IWaveformViewer waveformPane; @Inject private IEventBroker eventBroker; @@ -105,9 +112,9 @@ public class WaveformViewerPart { } } }); - waveformPane = new TxDisplay(parent); + waveformPane = factory.createPanel(parent); waveformPane.setMaxTime(0); - waveformPane.addPropertyChangeListener(IWaveformPanel.CURSOR_PROPERTY, new PropertyChangeListener() { + waveformPane.addPropertyChangeListener(IWaveformViewer.CURSOR_PROPERTY, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { Long time = (Long) evt.getNewValue(); @@ -117,7 +124,7 @@ public class WaveformViewerPart { } }); - waveformPane.addPropertyChangeListener(IWaveformPanel.MARKER_PROPERTY, new PropertyChangeListener() { + waveformPane.addPropertyChangeListener(IWaveformViewer.MARKER_PROPERTY, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { Long time = (Long) evt.getNewValue(); @@ -237,8 +244,8 @@ public class WaveformViewerPart { } persistedState.put(SHOWN_WAVEFORM+"S", Integer.toString(waveformPane.getStreamList().size())); index=0; - for(IWaveform waveform:waveformPane.getStreamList()){ - persistedState.put(SHOWN_WAVEFORM+index, waveform.getFullName()); + for(TrackEntry trackEntry:waveformPane.getStreamList()){ + persistedState.put(SHOWN_WAVEFORM+index, trackEntry.waveform.getFullName()); index++; } } @@ -246,10 +253,10 @@ public class WaveformViewerPart { protected void restoreState() { updateAll(); Integer waves = persistedState.containsKey(SHOWN_WAVEFORM+"S")?Integer.parseInt(persistedState.get(SHOWN_WAVEFORM+"S")):0; - List> res = new LinkedList<>(); + List res = new LinkedList<>(); for(int i=0; i waveform = database.getStreamByName(persistedState.get(SHOWN_WAVEFORM+i)); - if(waveform!=null) res.add(waveform); + if(waveform!=null) res.add(new TrackEntry(waveform)); } if(res.size()>0) waveformPane.getStreamList().addAll(res); } @@ -325,23 +332,25 @@ public class WaveformViewerPart { } public void addStreamsToList(IWaveform[] iWaveforms, boolean insert){ - List> streams= new LinkedList<>(); + List streams= new LinkedList<>(); for(IWaveform stream:iWaveforms) - streams.add(stream); + streams.add(new TrackEntry(stream)); IStructuredSelection selection = (IStructuredSelection) waveformPane.getSelection(); - if(selection.size()==0) + if(selection.size()==0){ waveformPane.getStreamList().addAll(streams); - else { - IWaveform selectedStream = (selection.getFirstElement() instanceof ITx)? - ((ITx)selection.getFirstElement()).getStream():(IWaveform)selection.getFirstElement(); - int index = waveformPane.getStreamList().indexOf(selectedStream); + }else { + Object first=selection.getFirstElement(); + IWaveform stream = (first instanceof ITx)?((ITx)first).getStream():(IWaveform)first; + TrackEntry trackEntry=waveformPane.getEntryForStream(stream); + int index = waveformPane.getStreamList().indexOf(trackEntry); if(!insert) index++; waveformPane.getStreamList().addAll(index, streams); } } - public void removeStreamFromList(IWaveform obj){ - waveformPane.getStreamList().remove(obj); + public void removeStreamFromList(IWaveform stream){ + TrackEntry trackEntry=waveformPane.getEntryForStream(stream); + waveformPane.getStreamList().remove(trackEntry); } public void removeStreamsFromList(IWaveform[] iWaveforms){ @@ -349,10 +358,6 @@ public class WaveformViewerPart { removeStreamFromList(stream); } - public List> getStreamList(){ - return waveformPane.getStreamList(); - } - public void moveSelected(int i) { waveformPane.moveSelected(i); } diff --git a/com.minres.scviewer.e4.product/SCViewer (restart).launch b/com.minres.scviewer.e4.product/SCViewer (restart).launch index 5faee8e..cc2c08f 100644 --- a/com.minres.scviewer.e4.product/SCViewer (restart).launch +++ b/com.minres.scviewer.e4.product/SCViewer (restart).launch @@ -22,8 +22,8 @@ - - + + diff --git a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPart.java b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPart.java index 5c39c8c..3663aab 100644 --- a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPart.java +++ b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPart.java @@ -16,6 +16,7 @@ import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -48,9 +49,10 @@ import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbFactory; import com.minres.scviewer.database.IWaveformEvent; -import com.minres.scviewer.database.swt.TxDisplay; +import com.minres.scviewer.database.swt.WaveformViewerFactory; import com.minres.scviewer.database.ui.GotoDirection; -import com.minres.scviewer.database.ui.IWaveformPanel; +import com.minres.scviewer.database.ui.IWaveformViewer; +import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.ui.views.TxOutlinePage; public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPageContributor { @@ -77,7 +79,7 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage public static final String WAVE_ACTION_ID = "com.minres.scviewer.ui.action.AddToWave"; - private TxDisplay txDisplay; + private IWaveformViewer txDisplay; /** This is the root of the editor's model. */ private IWaveformDb database; @@ -111,9 +113,10 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage } } }); - txDisplay = new TxDisplay(parent); + WaveformViewerFactory factory = new WaveformViewerFactory(); + txDisplay = factory.createPanel(parent); txDisplay.setMaxTime(0); - txDisplay.addPropertyChangeListener(IWaveformPanel.CURSOR_PROPERTY, new PropertyChangeListener() { + txDisplay.addPropertyChangeListener(IWaveformViewer.CURSOR_PROPERTY, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { Long time = (Long) evt.getNewValue(); @@ -237,11 +240,13 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage txDisplay.setMaxTime(database.getMaxTime()); if(TxEditorPart.this.getEditorInput() instanceof TxEditorInput && ((TxEditorInput) TxEditorPart.this.getEditorInput()).getStreamNames().size()>0){ + LinkedList entries= new LinkedList<>(); for(String streamName:((TxEditorInput) TxEditorPart.this.getEditorInput()).getStreamNames()){ IWaveform stream = database.getStreamByName(streamName); if(stream!=null) - txDisplay.getStreamList().add(stream); + entries.add(new TrackEntry(stream)); } + txDisplay.getStreamList().addAll(entries); } } @@ -331,9 +336,9 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage public void addStreamToList(IWaveform obj){ if(getEditorInput() instanceof TxEditorInput && !((TxEditorInput) getEditorInput()).getStreamNames().contains(obj.getFullName())){ ((TxEditorInput) getEditorInput()).getStreamNames().add(obj.getFullName()); - txDisplay.getStreamList().add(obj); + txDisplay.getStreamList().add(new TrackEntry(obj)); } else - txDisplay.getStreamList().add(obj); + txDisplay.getStreamList().add(new TrackEntry(obj)); } @@ -355,7 +360,7 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage removeStreamFromList(stream); } - public List> getStreamList(){ + public List getStreamList(){ return txDisplay.getStreamList(); }