Changed track entry from Waveform to TrackEntry allowing multiple use of

the same waveform
This commit is contained in:
Eyck Jentzsch 2015-11-06 19:29:36 +01:00
parent 7d3c37e989
commit c1d84ceb01
22 changed files with 526 additions and 291 deletions

View File

@ -15,6 +15,4 @@
<version>3.8.7</version>
</dependency>
</dependencies>
<groupId>com.minres.scviewer</groupId>
<version>1.0.0-SNAPSHOT</version>
</project>
</project>

View File

@ -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: .

View File

@ -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);
}
}

View File

@ -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<ITxRelation> incoming;
private Collection<ITxRelation> 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;
}
}

View File

@ -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;

View File

@ -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();
}

View File

@ -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<? extends ISignalChange> signal;
private int height;
private boolean even;
public SignalPainter(WaveformCanvas txDisplay, boolean even, int height, ISignal<? extends IWaveformEvent> 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<? extends ISignalChange> getSignal() {
return signal;

View File

@ -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<? extends ITxEvent> stream;
private int height, upper, txHeight;
private int txBase, txHeight;
private int totalHeight;
private boolean even;
private TreeSet<ITx> seenTx;
public StreamPainter(WaveformCanvas txDisplay, boolean even, int height, ITxStream<? extends ITxEvent> 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<ITx>();
}
@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<area.y+totalHeight; y1+=this.waveCanvas.getTrackHeight())
for(int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight)
gc.drawLine(area.x, y1, area.x+area.width, y1);
if(firstTx==lastTx)
for(ITxEvent txEvent:(Collection<? extends ITxEvent>)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.width<area.x || bb.x>area.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<Long, List<ITxEvent>> 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<? extends ITxEvent> getStream() {

View File

@ -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<Integer, IWaveformPainter> 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<Integer, IWaveformPainter> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()){
subArea.y=entry.getKey();
subArea.height=entry.getValue().getHeight();
entry.getValue().paintArea(gc, subArea);
}
}
}
}
public TreeMap<Integer, IWaveformPainter> 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();
}
}

View File

@ -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<Integer, IWaveformPainter> 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<Integer, IWaveformPainter> 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;
}
}
public int getVerticalOffset() {
return trackEntry.vOffset;
}
public boolean isEven() {
return even;
}
public TrackEntry getTrackEntry() {
return trackEntry;
}
}

View File

@ -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<IPainter> painterList;
TreeMap<Integer, IWaveformPainter> trackVerticalOffset;
protected List<IWaveform<? extends IWaveformEvent>> streams;
ITx currentSelection;
IWaveform<? extends IWaveformEvent> currentWaveformSelection;
private List<SelectionAdapter> selectionListeners;
private RulerPainter rulerPainter;
private TrackAreaPainter trackAreaPainter;
private List<CursorPainter> cursorPainters;
private HashMap<IWaveform<?>, IWaveformPainter> wave2painterMap;
/**
* Constructor for ScrollableCanvas.
*
@ -96,12 +109,31 @@ public class WaveformCanvas extends Canvas {
painterList = new LinkedList<IPainter>();
origin = new Point(0, 0);
transform = new Transform(getDisplay());
trackVerticalOffset = new TreeMap<Integer, IWaveformPainter>();
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<Colors, RGB> colourMap) {
Display d = getDisplay();
if (colourMap != null) {
@ -133,14 +165,6 @@ public class WaveformCanvas extends Canvas {
}
}
public List<IWaveform<? extends IWaveformEvent>> getStreams() {
return streams;
}
public void setStreams(List<IWaveform<? extends IWaveformEvent>> 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<CursorPainter> 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
* :<b> transform, image size, client area</b>.
*/
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<Object> getClicked(Point point) {
LinkedList<Object> 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<Integer, IWaveformPainter> entry = trackVerticalOffset.floorEntry(y);
Entry<Integer, IWaveformPainter> 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<Object> getEntriesAtPosition(IWaveform<? extends IWaveformEvent> iWaveform, int i) {
LinkedList<Object> 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<? extends IWaveformEvent> 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<Integer, IWaveformPainter> 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));

View File

@ -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<? extends IWaveformEvent> currentWaveformSelection;
private TrackEntry currentWaveformSelection;
private ScrolledComposite nameListScrolled;
@ -110,15 +102,13 @@ public class TxDisplay implements IWaveformPanel {
private Composite top;
protected ObservableList<IWaveform<? extends IWaveformEvent>> streams;
protected ObservableList<TrackEntry> streams;
Vector<CursorPainter> cursorPainters;
int selectedMarker = 0;
private int trackVerticalHeight;
private TreeMap<Integer, IWaveform<? extends IWaveformEvent>> trackVerticalOffset;
private TreeMap<Integer, TrackEntry> trackVerticalOffset;
private HashMap<IWaveform<? extends IWaveformEvent>, 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<Integer, IWaveform<? extends IWaveformEvent>> entry = trackVerticalOffset.floorEntry(e.y);
Entry<Integer, TrackEntry> 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<Object> 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<Long, ?> floorEntry=null, ceilEntry=null;
if(o instanceof ISignal<?>){
NavigableMap<Long, ?> map = ((ISignal<?>)o).getEvents();
floorEntry = map.floorEntry(time);
ceilEntry = map.ceilingEntry(time);
} else if (o instanceof ITxStream<?>){
NavigableMap<Long, ?> 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<Long, ?> map = ((ISignal<?>)entry.waveform).getEvents();
floorEntry = map.floorEntry(time);
ceilEntry = map.ceilingEntry(time);
} else if (entry.waveform instanceof ITxStream<?>){
NavigableMap<Long, ?> map = ((ITxStream<?>)entry.waveform).getEvents();
floorEntry = map.floorEntry(time);
ceilEntry = map.ceilingEntry(time);
}
} else if(o instanceof ITx){
NavigableMap<Long, ?> 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<Integer, IWaveform<? extends IWaveformEvent>>();
trackVerticalOffset = new TreeMap<Integer, TrackEntry>();
trackVerticalHeight=0;
actualValues = new HashMap<IWaveform<? extends IWaveformEvent>, String>();
cursorPainters = new Vector<CursorPainter>();
nameFont = parent.getDisplay().getSystemFont();
nameFontB = SWTResourceManager.getBoldFont(nameFont);
streams = new ObservableList<IWaveform<? extends IWaveformEvent>>();
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<? extends IWaveformEvent> waveform : streams) {
int height = waveformCanvas.getTrackHeight();
clearSelection &= (waveform != currentWaveformSelection);
if (waveform instanceof ITxStream<?>) {
ITxStream<? extends ITxEvent> stream = (ITxStream<? extends ITxEvent>) waveform;
height *= stream.getMaxConcurrency();
painter = new StreamPainter(waveformCanvas, even, height, (ITxStream<? extends ITxEvent>) 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<? extends IWaveformEvent>) 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<ITxEvent> stream = (ITxStream<ITxEvent>) currentWaveformSelection;
if (currentWaveformSelection.isStream()) {
ITxStream<? extends ITxEvent> stream = currentWaveformSelection.getStream();
ITx transaction = null;
if (direction == GotoDirection.NEXT) {
List<ITxEvent> thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime());
@ -701,10 +685,10 @@ public class TxDisplay implements IWaveformPanel {
public void moveCursor(GotoDirection direction) {
long time = getCursorTime();
NavigableMap<Long, ?> 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<Long, ?> 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<IWaveform<? extends IWaveformEvent>> getStreamList() {
public List<TrackEntry> getStreamList() {
return streams;
}
@ -733,16 +717,16 @@ public class TxDisplay implements IWaveformPanel {
public void moveSelected(int i) {
if(currentWaveformSelection!=null){
ITx selectedTx=currentTxSelection;
IWaveform<? extends IWaveformEvent> selectedWaveform=currentWaveformSelection;
TrackEntry selectedWaveform=currentWaveformSelection;
int idx = streams.indexOf(currentWaveformSelection);
int newIdx=idx+i;
if(newIdx>=0 && newIdx<streams.size()){
Collections.swap(streams,idx,newIdx);
updateTracklist();
if(selectedTx!=null){
setSelection(new StructuredSelection(new Object[]{selectedTx, selectedWaveform}));
setSelection(new StructuredSelection(new Object[]{selectedTx, selectedWaveform.waveform}));
} else
setSelection(new StructuredSelection(selectedWaveform));
setSelection(new StructuredSelection(selectedWaveform.waveform));
}
}
}
@ -750,53 +734,50 @@ public class TxDisplay implements IWaveformPanel {
protected void paintNames(GC gc, Rectangle rect) {
if (streams.size() > 0) {
@SuppressWarnings("unchecked")
IWaveform<? extends IWaveformEvent> wave = (IWaveform<? extends IWaveformEvent>) 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<? extends IWaveformEvent> w = trackVerticalOffset.get(firstKey);
TrackEntry trackEntry=trackVerticalOffset.get(firstKey);
IWaveform<? extends IWaveformEvent> 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<Integer, IWaveform<? extends IWaveformEvent>> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
.entrySet()) {
IWaveform<? extends IWaveformEvent> w = entry.getValue();
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()) {
IWaveform<? extends IWaveformEvent> 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<? extends IWaveformEvent> wave = (IWaveform<? extends IWaveformEvent>) 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<? extends IWaveformEvent> w = trackVerticalOffset.get(firstKey);
TrackEntry trackEntry=trackVerticalOffset.get(firstKey);
IWaveform<? extends IWaveformEvent> 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<Integer, IWaveform<? extends IWaveformEvent>> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
.entrySet()) {
IWaveform<? extends IWaveformEvent> w = entry.getValue();
IWaveform<? extends IWaveformEvent> 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<? extends IWaveformEvent> srcWave=(IWaveform<? extends IWaveformEvent>) 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);

View File

@ -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;

View File

@ -10,4 +10,4 @@
*******************************************************************************/
package com.minres.scviewer.database.ui;
public enum GotoDirection {PREV, NEXT}
public enum GotoDirection {PREV, NEXT, UP, DOWN}

View File

@ -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<IWaveform<? extends IWaveformEvent>> getStreamList();
List<TrackEntry> getStreamList();
public TrackEntry getEntryForStream(IWaveform<?> source);
void moveSelected(int i);
long getMaxTime();

View File

@ -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);
}

View File

@ -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<? extends IWaveformEvent> waveform;
public int vOffset;
public int height;
public boolean selected;
public TrackEntry(IWaveform<? extends IWaveformEvent> waveform) {
this.waveform = waveform;
vOffset=0;
height=0;
selected=false;
}
public boolean isStream(){
return waveform instanceof ITxStream<?>;
}
public ITxStream<? extends ITxEvent> getStream(){
return (ITxStream<?>) waveform;
}
public boolean isSignal(){
return waveform instanceof ISignal<?>;
}
public ISignal<? extends ISignalChange> 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;
}
}

View File

@ -8,6 +8,4 @@
<relativePath>../com.minres.scviewer.parent</relativePath>
</parent>
<packaging>eclipse-plugin</packaging>
<version>1.0.0-SNAPSHOT</version>
<groupId>com.minres.scviewer</groupId>
</project>
</project>

View File

@ -8,6 +8,4 @@
<relativePath>../com.minres.scviewer.parent</relativePath>
</parent>
<packaging>eclipse-plugin</packaging>
<groupId>com.minres.scviewer</groupId>
<version>1.0.0-SNAPSHOT</version>
</project>
</project>

View File

@ -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<? extends IWaveformEvent> 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<IWaveform<? extends IWaveformEvent>> res = new LinkedList<>();
List<TrackEntry> res = new LinkedList<>();
for(int i=0; i<waves;i++){
IWaveform<? extends IWaveformEvent> 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<? extends IWaveformEvent>[] iWaveforms, boolean insert){
List<IWaveform<? extends IWaveformEvent>> streams= new LinkedList<>();
List<TrackEntry> streams= new LinkedList<>();
for(IWaveform<? extends IWaveformEvent> 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<? extends IWaveformEvent> obj){
waveformPane.getStreamList().remove(obj);
public void removeStreamFromList(IWaveform<? extends IWaveformEvent> stream){
TrackEntry trackEntry=waveformPane.getEntryForStream(stream);
waveformPane.getStreamList().remove(trackEntry);
}
public void removeStreamsFromList(IWaveform<? extends IWaveformEvent>[] iWaveforms){
@ -349,10 +358,6 @@ public class WaveformViewerPart {
removeStreamFromList(stream);
}
public List<IWaveform<? extends IWaveformEvent>> getStreamList(){
return waveformPane.getStreamList();
}
public void moveSelected(int i) {
waveformPane.moveSelected(i);
}

View File

@ -22,8 +22,8 @@
<stringAttribute key="pde.version" value="3.3"/>
<stringAttribute key="product" value="com.minres.scviewer.e4.application.product"/>
<stringAttribute key="productFile" value="/com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.product"/>
<stringAttribute key="selected_target_plugins" value="com.google.guava*15.0.0.v201403281430@default:default,com.ibm.icu@default:default,javax.annotation@default:default,javax.inject@default:default,javax.servlet*3.1.0.v201410161800@default:default,javax.xml@default:default,org.apache.ant@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.commons.jxpath@default:default,org.apache.commons.logging@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.codehaus.groovy*2.4.3.xx-201508121448-e45@default:default,org.eclipse.ant.core@default:default,org.eclipse.compare.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.beans@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filesystem.java7@default:false,org.eclipse.core.filesystem.macosx@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.annotations@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.emf.xpath@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt.cocoa@default:false,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.databinding@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.concurrent@default:default,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.help@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.osgi.compatibility.state@default:false,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.swt.cocoa.macosx.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.text@default:default,org.eclipse.ui.cocoa@default:false,org.eclipse.ui.console@default:default,org.eclipse.ui.trace@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.eclipse.wb.core.lib@default:default,org.hamcrest.core@default:default,org.junit@default:default,org.w3c.css.sac@default:default,org.w3c.dom.events@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
<stringAttribute key="selected_workspace_plugins" value="com.minres.scviewer.database.sqlite@default:default,com.minres.scviewer.database.swt@default:default,com.minres.scviewer.database.text@default:default,com.minres.scviewer.database.vcd@default:default,com.minres.scviewer.database@default:default,com.minres.scviewer.e4.application@default:default"/>
<stringAttribute key="selected_target_plugins" value="com.google.guava@default:default,com.ibm.icu@default:default,javax.annotation@default:default,javax.inject@default:default,javax.servlet@default:default,javax.xml@default:default,org.apache.ant@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.commons.jxpath@default:default,org.apache.commons.logging@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.codehaus.groovy@default:default,org.eclipse.ant.core@default:default,org.eclipse.compare.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.beans@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filesystem.java7@default:false,org.eclipse.core.filesystem.macosx@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.annotations@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.emf.xpath@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt.cocoa@default:false,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.concurrent@default:default,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.help@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.osgi.compatibility.state@default:false,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.swt.cocoa.macosx.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.text@default:default,org.eclipse.ui.cocoa@default:false,org.eclipse.ui.console@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.hamcrest.core@default:default,org.junit@default:default,org.w3c.css.sac@default:default,org.w3c.dom.events@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
<stringAttribute key="selected_workspace_plugins" value="com.minres.scviewer.database.sqlite@default:default,com.minres.scviewer.database.text@default:default,com.minres.scviewer.database.ui.swt@default:default,com.minres.scviewer.database.ui@default:default,com.minres.scviewer.database.vcd@default:default,com.minres.scviewer.database@default:default,com.minres.scviewer.e4.application@default:default"/>
<booleanAttribute key="show_selected_only" value="false"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>

View File

@ -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<TrackEntry> entries= new LinkedList<>();
for(String streamName:((TxEditorInput) TxEditorPart.this.getEditorInput()).getStreamNames()){
IWaveform<? extends IWaveformEvent> 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<? extends IWaveformEvent> 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<IWaveform<? extends IWaveformEvent>> getStreamList(){
public List<TrackEntry> getStreamList(){
return txDisplay.getStreamList();
}