2015-01-21 21:58:35 +01:00
|
|
|
/*******************************************************************************
|
2015-10-22 00:25:12 +02:00
|
|
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
2015-01-21 21:58:35 +01:00
|
|
|
* 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
|
|
|
|
*******************************************************************************/
|
2015-01-25 14:23:34 +01:00
|
|
|
package com.minres.scviewer.database.swt.internal;
|
2015-01-20 18:50:15 +01:00
|
|
|
|
|
|
|
import java.util.Map.Entry;
|
|
|
|
import java.util.NavigableMap;
|
|
|
|
|
|
|
|
import org.eclipse.swt.SWT;
|
|
|
|
import org.eclipse.swt.graphics.Color;
|
|
|
|
import org.eclipse.swt.graphics.GC;
|
|
|
|
import org.eclipse.swt.graphics.Rectangle;
|
|
|
|
|
|
|
|
import com.minres.scviewer.database.ISignal;
|
|
|
|
import com.minres.scviewer.database.ISignalChange;
|
|
|
|
import com.minres.scviewer.database.ISignalChangeMulti;
|
|
|
|
import com.minres.scviewer.database.ISignalChangeSingle;
|
2015-11-12 23:35:13 +01:00
|
|
|
import com.minres.scviewer.database.ui.TrackEntry;
|
|
|
|
import com.minres.scviewer.database.ui.WaveformColors;
|
2015-01-20 18:50:15 +01:00
|
|
|
|
2015-11-06 19:29:36 +01:00
|
|
|
public class SignalPainter extends TrackPainter {
|
2015-01-20 18:50:15 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
private final WaveformCanvas waveCanvas;
|
|
|
|
private ISignal<? extends ISignalChange> signal;
|
|
|
|
|
2015-11-06 19:29:36 +01:00
|
|
|
public SignalPainter(WaveformCanvas txDisplay, boolean even, TrackEntry trackEntry) {
|
|
|
|
super(trackEntry, even);
|
2015-01-20 18:50:15 +01:00
|
|
|
this.waveCanvas = txDisplay;
|
2015-11-06 19:29:36 +01:00
|
|
|
this.signal=trackEntry.getSignal();
|
2015-01-20 18:50:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public void paintArea(GC gc, Rectangle area) {
|
2015-11-06 19:29:36 +01:00
|
|
|
if(trackEntry.selected)
|
2015-11-12 23:35:13 +01:00
|
|
|
gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]);
|
2015-01-21 21:58:35 +01:00
|
|
|
else
|
2015-11-12 23:35:13 +01:00
|
|
|
gc.setBackground(this.waveCanvas.colors[even?WaveformColors.TRACK_BG_EVEN.ordinal():WaveformColors.TRACK_BG_ODD.ordinal()]);
|
2015-01-20 18:50:15 +01:00
|
|
|
gc.setFillRule(SWT.FILL_EVEN_ODD);
|
|
|
|
gc.fillRectangle(area);
|
|
|
|
Entry<Long, ? extends ISignalChange> firstChange=signal.getEvents().floorEntry(area.x*this.waveCanvas.getScaleFactor());
|
|
|
|
Entry<Long, ? extends ISignalChange> lastTx=signal.getEvents().ceilingEntry((area.x+area.width)*this.waveCanvas.getScaleFactor());
|
|
|
|
if(firstChange==null){
|
|
|
|
if(lastTx==null) return;
|
|
|
|
firstChange = signal.getEvents().firstEntry();
|
|
|
|
} else if(lastTx==null){
|
|
|
|
lastTx=signal.getEvents().lastEntry();
|
|
|
|
}
|
2015-11-12 23:35:13 +01:00
|
|
|
gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
|
2015-01-20 18:50:15 +01:00
|
|
|
gc.setLineStyle(SWT.LINE_SOLID);
|
|
|
|
gc.setLineWidth(1);
|
|
|
|
Entry<Long, ? extends ISignalChange> left=firstChange;
|
|
|
|
if(left.getValue() instanceof ISignalChangeSingle){
|
|
|
|
NavigableMap<Long, ? extends ISignalChange> entries=signal.getEvents().subMap(firstChange.getKey(), false, lastTx.getKey(), true);
|
|
|
|
for(Entry<Long, ? extends ISignalChange> right:entries.entrySet()){
|
2015-02-11 09:32:46 +01:00
|
|
|
int xEnd= (int)(right.getKey()/this.waveCanvas.getScaleFactor());
|
|
|
|
int xBegin= (int)(left.getKey()/this.waveCanvas.getScaleFactor());
|
|
|
|
if(xEnd>xBegin){
|
|
|
|
int yOffset = this.waveCanvas.getTrackHeight()/2;
|
2015-11-12 23:35:13 +01:00
|
|
|
Color color = this.waveCanvas.colors[WaveformColors.SIGNALX.ordinal()];
|
2015-02-11 09:32:46 +01:00
|
|
|
switch(((ISignalChangeSingle) left.getValue()).getValue()){
|
|
|
|
case '1':
|
2015-11-12 23:35:13 +01:00
|
|
|
color=this.waveCanvas.colors[WaveformColors.SIGNAL1.ordinal()];
|
2015-02-11 09:32:46 +01:00
|
|
|
yOffset = this.waveCanvas.getTrackHeight()/5;
|
|
|
|
break;
|
|
|
|
case '0':
|
2015-11-12 23:35:13 +01:00
|
|
|
color=this.waveCanvas.colors[WaveformColors.SIGNAL0.ordinal()];
|
2015-02-11 09:32:46 +01:00
|
|
|
yOffset = 4*this.waveCanvas.getTrackHeight()/5;
|
|
|
|
break;
|
|
|
|
case 'Z':
|
2015-11-12 23:35:13 +01:00
|
|
|
color=this.waveCanvas.colors[WaveformColors.SIGNALZ.ordinal()];
|
2015-02-11 09:32:46 +01:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
yOffset+=area.y;
|
|
|
|
gc.setForeground(color);
|
|
|
|
gc.drawLine(xBegin, yOffset, xEnd, yOffset);
|
|
|
|
int yNext = this.waveCanvas.getTrackHeight()/2;
|
|
|
|
switch(((ISignalChangeSingle) right.getValue()).getValue()){
|
|
|
|
case '1':
|
|
|
|
yNext = this.waveCanvas.getTrackHeight()/5+area.y;
|
|
|
|
break;
|
|
|
|
case '0':
|
|
|
|
yNext = 4*this.waveCanvas.getTrackHeight()/5+area.y;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
gc.drawLine(xEnd, yOffset, xEnd, yNext);
|
|
|
|
}
|
|
|
|
left=right;
|
2015-01-20 18:50:15 +01:00
|
|
|
}
|
|
|
|
} else if(left.getValue() instanceof ISignalChangeMulti){
|
|
|
|
NavigableMap<Long,? extends ISignalChange> entries=signal.getEvents().subMap(firstChange.getKey(), false, lastTx.getKey(), true);
|
|
|
|
for(Entry<Long, ? extends ISignalChange> right:entries.entrySet()){
|
|
|
|
int yOffsetT = this.waveCanvas.getTrackHeight()/5+area.y;
|
|
|
|
int yOffsetM = this.waveCanvas.getTrackHeight()/2+area.y;
|
|
|
|
int yOffsetB = 4*this.waveCanvas.getTrackHeight()/5+area.y;
|
2015-11-12 23:35:13 +01:00
|
|
|
Color colorBorder = this.waveCanvas.colors[WaveformColors.SIGNAL0.ordinal()];
|
2015-01-20 18:50:15 +01:00
|
|
|
ISignalChangeMulti last = (ISignalChangeMulti) left.getValue();
|
|
|
|
if(last.getValue().toString().contains("X")){
|
2015-11-12 23:35:13 +01:00
|
|
|
colorBorder=this.waveCanvas.colors[WaveformColors.SIGNALX.ordinal()];
|
2015-01-20 18:50:15 +01:00
|
|
|
}else if(last.getValue().toString().contains("Z")){
|
2015-11-12 23:35:13 +01:00
|
|
|
colorBorder=this.waveCanvas.colors[WaveformColors.SIGNALZ.ordinal()];
|
2015-01-20 18:50:15 +01:00
|
|
|
}
|
|
|
|
int beginTime= (int)(left.getKey()/this.waveCanvas.getScaleFactor());
|
|
|
|
int endTime= (int)(right.getKey()/this.waveCanvas.getScaleFactor());
|
|
|
|
int[] points = {
|
|
|
|
beginTime,yOffsetM,
|
|
|
|
beginTime+1,yOffsetT,
|
|
|
|
endTime-1,yOffsetT,
|
|
|
|
endTime,yOffsetM,
|
|
|
|
endTime-1,yOffsetB,
|
|
|
|
beginTime+1,yOffsetB
|
|
|
|
};
|
|
|
|
gc.setForeground(colorBorder);
|
|
|
|
gc.drawPolygon(points);
|
2015-11-12 23:35:13 +01:00
|
|
|
gc.setForeground(this.waveCanvas.colors[WaveformColors.SIGNAL_TEXT.ordinal()]);
|
2015-01-20 18:50:15 +01:00
|
|
|
int size = gc.getDevice().getDPI().y * gc.getFont().getFontData()[0].getHeight()/72;
|
|
|
|
if(beginTime<area.x) beginTime=area.x;
|
|
|
|
int width=endTime-beginTime;
|
|
|
|
if(width>6) {
|
|
|
|
Rectangle old = gc.getClipping();
|
|
|
|
gc.setClipping(beginTime+3, yOffsetT, endTime-beginTime-5, yOffsetB-yOffsetT);
|
|
|
|
gc.drawText("h'"+last.getValue().toHexString(), beginTime+3, yOffsetM-size/2-1);
|
|
|
|
gc.setClipping(old);
|
|
|
|
}
|
|
|
|
left=right;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-01-21 21:58:35 +01:00
|
|
|
public ISignal<? extends ISignalChange> getSignal() {
|
|
|
|
return signal;
|
|
|
|
}
|
|
|
|
|
2015-01-20 18:50:15 +01:00
|
|
|
}
|