diff --git a/com.minres.scviewer.database.test/inputs/simple_system.vcd b/com.minres.scviewer.database.test/inputs/simple_system.vcd index 539f4a6..20cce8a 100755 --- a/com.minres.scviewer.database.test/inputs/simple_system.vcd +++ b/com.minres.scviewer.database.test/inputs/simple_system.vcd @@ -1622,7 +1622,7 @@ b1110100011010100101001010 aabdd 0aabdv 0aabdw 0aabdx -r1.0 bbbbb +r0.0 bbbbb $end #10000 @@ -1640,6 +1640,28 @@ $end 0aabcq 0aabcy 0aabde +r1.0 bbbbb + +#20000 +r2.0 bbbbb + +#30000 +r2.5 bbbbb + +#40000 +r1.5 bbbbb + +#50000 +r-1.0 bbbbb + +#60000 +r-2.5 bbbbb + +#70000 +r-1.0 bbbbb + +#80000 +r0.0 bbbbb #1287121272 b1000000000100000000000000000100 aabcr 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 b924b83..ce0de77 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 @@ -67,7 +67,6 @@ public class SignalPainter extends TrackPainter { private static final JPanel DUMMY_PANEL = new JPanel(); private final WaveformCanvas waveCanvas; - private ISignal signal; int yOffsetT; int yOffsetM; @@ -77,7 +76,6 @@ public class SignalPainter extends TrackPainter { public SignalPainter(WaveformCanvas txDisplay, boolean even, TrackEntry trackEntry) { super(trackEntry, even); this.waveCanvas = txDisplay; - this.signal = trackEntry.getSignal(); } private int getXEnd(long time) { @@ -86,6 +84,7 @@ public class SignalPainter extends TrackPainter { } public void paintArea(GC gc, Rectangle area) { + ISignal signal = trackEntry.getSignal(); if (trackEntry.selected) gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]); else @@ -156,9 +155,14 @@ public class SignalPainter extends TrackPainter { if(left.value instanceof ISignalChangeBit) return new SingleBitStencil(); else if (left.value instanceof ISignalChangeBitVector) - return new MultiBitStencil(gc); + if(trackEntry.waveDisplay==TrackEntry.WaveDisplay.DEFAULT) + return new MultiBitStencil(gc); + else + return new MultiBitStencilAnalog(entries, left.value, + trackEntry.waveDisplay==TrackEntry.WaveDisplay.CONTINOUS, + trackEntry.valueDisplay==TrackEntry.ValueDisplay.SIGNED); else if (left.value instanceof ISignalChangeReal) - return new RealStencil(entries, left.value); + return new RealStencil(entries, left.value, trackEntry.waveDisplay==TrackEntry.WaveDisplay.CONTINOUS); else return null; } @@ -200,7 +204,18 @@ public class SignalPainter extends TrackPainter { gc.setForeground(colorBorder); gc.drawPolygon(points); gc.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_TEXT.ordinal()]); - String label = "h'" + last.getValue().toHexString(); + //TODO: this code should be provided from a central location + String label = null; + switch(trackEntry.valueDisplay) { + case SIGNED: + label=Long.toString(last.getValue().toSignedValue()); + break; + case UNSIGNED: + label=Long.toString(last.getValue().toUnsignedValue()); + break; + default: + label="h'"+last.getValue().toHexString(); + } Point bb = getBoxWidth(gc, label); if (xBegin < area.x) { xBegin = area.x; @@ -224,6 +239,62 @@ public class SignalPainter extends TrackPainter { } + private class MultiBitStencilAnalog implements SignalStencil { + + final boolean continous; + final boolean signed; + private long minVal; + private long range; + + @SuppressWarnings("unchecked") + public MultiBitStencilAnalog(NavigableMap entries, ISignalChange left, boolean continous, boolean signed) { + this.continous=continous; + this.signed=signed; + Collection values = ((NavigableMap) entries).values(); + minVal=((ISignalChangeBitVector) left).getValue().toUnsignedValue(); + range=2; + if(!values.isEmpty()) { + long maxVal=minVal; + for (ISignalChange e : entries.values()) { + long v = ((ISignalChangeBitVector)e).getValue().toUnsignedValue(); + maxVal=Math.max(maxVal, v); + minVal=Math.min(minVal, v); + } + if(maxVal==minVal) { + maxVal--; + minVal++; + } + range = maxVal-minVal; + } else + minVal--; + + } + + public void draw(GC gc, Rectangle area, ISignalChange left, ISignalChange right, int xBegin, int xEnd, boolean multiple) { + long leftVal = ((ISignalChangeBitVector) left).getValue().toUnsignedValue(); + long rightVal= ((ISignalChangeBitVector) right).getValue().toUnsignedValue(); + gc.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_REAL.ordinal()]); + int yOffsetLeft = (int) ((leftVal-minVal) / range * (yOffsetB-yOffsetT)); + int yOffsetRight = (int) ((rightVal-minVal) / range * (yOffsetB-yOffsetT)); + if(continous) { + if (xEnd > maxX) { + gc.drawLine(xBegin, yOffsetB-yOffsetLeft, maxX, yOffsetB-yOffsetRight); + } else { + gc.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight); + } + } else { + if (xEnd > maxX) { + gc.drawLine(xBegin, yOffsetB-yOffsetLeft, maxX, yOffsetB-yOffsetLeft); + } else { + gc.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetLeft); + if(yOffsetRight!=yOffsetLeft) { + gc.drawLine(xEnd, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight); + } + } + } + } + } + private class SingleBitStencil implements SignalStencil { public void draw(GC gc, Rectangle area, ISignalChange left, ISignalChange right, int xBegin, int xEnd, boolean multiple) { if (multiple) { @@ -269,49 +340,47 @@ public class SignalPainter extends TrackPainter { } } } -/* + private class RealStencil implements SignalStencil { - double min; - double max; - double diff; + + double minVal, range; - public RealStencil(ISignalChange value, NavigableMap entries) { - min=((ISignalChangeReal) value).getValue(); - max=min; - for (ISignalChange e : entries.values()) { - double v = ((ISignalChangeReal)e).getValue(); - max= Double.isNaN(max)? v : Math.max(max, v); - min= Double.isNaN(min)? v : Math.min(min, v); - } - int nans = (Double.isNaN(max)?2:0) + (Double.isNaN(max)?1:0); - switch(nans) { - case 0: - break; - case 1: - max=min; - break; - case 2: - min=max; - case 3: - max=min=0; - } - diff=max-min; - if(diff==0.0) { - if(max>0) - min=0.0; - else if(min<0.0) - max=0.0; - else { - max=1.0; - min=0.0; + final double scaleFactor = 1.05; + + boolean continous=true; + + @SuppressWarnings("unchecked") + public RealStencil(NavigableMap entries, ISignalChange left, boolean continous) { + this.continous=continous; + Collection values = ((NavigableMap) entries).values(); + minVal=((ISignalChangeReal) left).getValue(); + range=2.0; + if(!values.isEmpty()) { + double maxVal=minVal; + for (ISignalChange e : entries.values()) { + double v = ((ISignalChangeReal)e).getValue(); + if(Double.isNaN(maxVal)) + maxVal=v; + else if(!Double.isNaN(v)) + maxVal=Math.max(maxVal, v); + if(Double.isNaN(minVal)) + minVal=v; + else if(!Double.isNaN(v)) + minVal=Math.min(minVal, v); } - diff=max-min; + if(Double.isNaN(maxVal)){ + maxVal=minVal=0.0; + } + range = (maxVal-minVal)*scaleFactor; + double avg = (maxVal+minVal)/2.0; + minVal=avg-(avg-minVal)*scaleFactor; } } public void draw(GC gc, Rectangle area, ISignalChange left, ISignalChange right, int xBegin, int xEnd, boolean multiple) { - double value = ((ISignalChangeReal)left).getValue(); - if(Double.isNaN(value)) { + double leftVal = ((ISignalChangeReal) left).getValue(); + double rightVal= ((ISignalChangeReal) right).getValue(); + if(Double.isNaN(leftVal)) { Color color = waveCanvas.colors[WaveformColors.SIGNAL_NAN.ordinal()]; int width = xEnd - xBegin; if (width > 1) { @@ -329,82 +398,28 @@ public class SignalPainter extends TrackPainter { gc.setForeground(color); gc.drawLine(xEnd, yOffsetT, xEnd, yOffsetB); } - } else { - Color color = waveCanvas.colors[WaveformColors.SIGNAL_ANALOG.ordinal()]; - int height=yOffsetT-yOffsetB; - double offset=value-min; - int yOffset=diff>0?(int)(height*(offset/diff)) + yOffsetB:yOffsetM; - gc.setForeground(color); - if (xEnd > maxX) { - gc.drawLine(xBegin, yOffset, maxX, yOffset); - } else { - gc.drawLine(xBegin, yOffset, xEnd, yOffset); - double nextOffset = ((ISignalChangeReal)right).getValue()-min; - int yNext = diff>0?(int)(height*(nextOffset/diff)) + yOffsetB:height/2; - if (yOffset != yNext) - gc.drawLine(xEnd, yOffset, xEnd, yNext); - } - } - } - } -*/ - private class RealStencil implements SignalStencil { - - double minVal, range; - - final double scaleFactor = 1.05; - - boolean stepWise=true; - - @SuppressWarnings("unchecked") - public RealStencil(NavigableMap entries, ISignalChange left) { - Collection values = ((NavigableMap) entries).values(); - minVal=((ISignalChangeReal) left).getValue(); - range=2.0; - if(!values.isEmpty()) { - double maxVal=minVal; - for(ISignalChangeReal v:values) { - minVal=Math.min(minVal, v.getValue()); - maxVal=Math.max(maxVal, v.getValue()); - } - range = (maxVal-minVal)*scaleFactor; - double avg = (maxVal+minVal)/2.0; - minVal=avg-(avg-minVal)*scaleFactor; - } - } - - public void draw(GC gc, Rectangle area, ISignalChange left, ISignalChange right, int xBegin, int xEnd, boolean multiple) { - double leftVal = ((ISignalChangeReal) left).getValue(); - double rightVal= ((ISignalChangeReal) right).getValue(); -// if (multiple) { -// gc.setForeground(waveCanvas.colors[WaveformColors.SIGNALX.ordinal()]); -// } else { + } else { gc.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_REAL.ordinal()]); -// } - int yOffsetLeft = (int) ((leftVal-minVal) / range * (yOffsetB-yOffsetT)); - int yOffsetRight = (int) ((rightVal-minVal) / range * (yOffsetB-yOffsetT)); - if(stepWise) { - if (xEnd > maxX) { - gc.drawLine(xBegin, yOffsetB-yOffsetLeft, maxX, yOffsetB-yOffsetLeft); + int yOffsetLeft = (int) ((leftVal-minVal) / range * (yOffsetB-yOffsetT)); + int yOffsetRight = Double.isNaN(rightVal)?yOffsetLeft:(int) ((rightVal-minVal) / range * (yOffsetB-yOffsetT)); + if(continous) { + if (xEnd > maxX) { + gc.drawLine(xBegin, yOffsetB-yOffsetLeft, maxX, yOffsetB-yOffsetRight); + } else { + gc.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight); + } } else { - gc.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetLeft); - if(yOffsetRight!=yOffsetLeft) { - gc.drawLine(xEnd, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight); + if (xEnd > maxX) { + gc.drawLine(xBegin, yOffsetB-yOffsetLeft, maxX, yOffsetB-yOffsetLeft); + } else { + gc.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetLeft); + if(yOffsetRight!=yOffsetLeft) { + gc.drawLine(xEnd, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight); + } } } - - } else { - if (xEnd > maxX) { - gc.drawLine(xBegin, yOffsetB-yOffsetLeft, maxX, yOffsetB-yOffsetRight); - } else { - gc.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight); - } } } } - public ISignal getSignal() { - return signal; - } - } diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformViewer.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformViewer.java index ac95951..139e26f 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformViewer.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformViewer.java @@ -119,8 +119,6 @@ public class WaveformViewer implements IWaveformViewer { private TreeMap trackVerticalOffset; - private HashMap, String> actualValues; - private Font nameFont, nameFontB; protected MouseListener nameValueMouseListener = new MouseAdapter() { @@ -225,7 +223,6 @@ public class WaveformViewer implements IWaveformViewer { trackVerticalOffset = new TreeMap(); trackVerticalHeight=0; - actualValues = new HashMap, String>(); nameFont = parent.getDisplay().getSystemFont(); nameFontB = SWTResourceManager.getBoldFont(nameFont); @@ -384,19 +381,18 @@ public class WaveformViewer implements IWaveformViewer { waveformCanvas.getDisplay().asyncExec(new Runnable() { @Override public void run() { - updateTracklist(); + update(); } }); } } - protected void updateTracklist() { + public void update() { trackVerticalHeight = 0; int nameMaxWidth = 0; int previousHeight = trackVerticalOffset.size() == 0 ? 0 : trackVerticalOffset.lastKey(); IWaveformPainter painter = null; trackVerticalOffset.clear(); - actualValues.clear(); waveformCanvas.clearAllWaveformPainter(); boolean even = true; boolean clearSelection = true; @@ -407,12 +403,12 @@ public class WaveformViewer implements IWaveformViewer { streamEntry.vOffset=trackVerticalHeight; clearSelection &= currentWaveformSelection!=null && (streamEntry.waveform != currentWaveformSelection.waveform); if (streamEntry.isStream()) { + streamEntry.currentValue=""; streamEntry.height *= streamEntry.getStream().getMaxConcurrency(); painter = new StreamPainter(waveformCanvas, even, streamEntry); - actualValues.put(streamEntry.waveform, ""); } else if (streamEntry.isSignal()) { + streamEntry.currentValue="---"; painter = new SignalPainter(waveformCanvas, even, streamEntry); - actualValues.put(streamEntry.waveform, "---"); } waveformCanvas.addWaveformPainter(painter); trackVerticalOffset.put(trackVerticalHeight, streamEntry); @@ -440,14 +436,15 @@ public class WaveformViewer implements IWaveformViewer { for(Entry> entry: trackVerticalOffset.entrySet()){ System.out.println(" "+entry.getKey()+": " +entry.getValue().getFullName()); } - */ } + */ + } private int calculateValueWidth() { TextLayout tl = new TextLayout(waveformCanvas.getDisplay()); tl.setFont(nameFontB); int valueMaxWidth = 0; - for (String v : actualValues.values()) { - tl.setText(v); + for (TrackEntry v : streams) { + tl.setText(v.currentValue); valueMaxWidth = Math.max(valueMaxWidth, tl.getBounds().width); } return valueMaxWidth + 15; @@ -455,22 +452,32 @@ public class WaveformViewer implements IWaveformViewer { private void updateValueList(){ final Long time = getCursorTime(); - for(Entry, String> entry:actualValues.entrySet()){ - if(entry.getKey() instanceof ISignal){ - ISignalChange event = ((ISignal)entry.getKey()).getWaveformEventsBeforeTime(time); + for(TrackEntry entry:streams){ + if(entry.isSignal()){ + ISignalChange event = ((ISignal)entry.waveform).getWaveformEventsBeforeTime(time); if(event instanceof ISignalChangeBit){ - entry.setValue("b'"+((ISignalChangeBit)event).getValue()); + entry.currentValue="b'"+((ISignalChangeBit)event).getValue(); } else if(event instanceof ISignalChangeBitVector){ - entry.setValue("h'"+((ISignalChangeBitVector)event).getValue().toHexString()); + // TODO: same code resides in SignalPainter, fix it + switch(entry.valueDisplay) { + case SIGNED: + entry.currentValue=Long.toString(((ISignalChangeBitVector)event).getValue().toSignedValue()); + break; + case UNSIGNED: + entry.currentValue=Long.toString(((ISignalChangeBitVector)event).getValue().toUnsignedValue()); + break; + default: + entry.currentValue="h'"+((ISignalChangeBitVector)event).getValue().toHexString(); + } } else if(event instanceof ISignalChangeReal){ double val = ((ISignalChangeReal)event).getValue(); if(val>0.001) - entry.setValue(String.format("%1$,.3f", val)); + entry.currentValue=String.format("%1$,.3f", val); else - entry.setValue(Double.toString(val)); + entry.currentValue=Double.toString(val); } - } else if(entry.getKey() instanceof ITxStream){ - ITxStream stream = (ITxStream) entry.getKey(); + } else if(entry.isStream()){ + ITxStream stream = (ITxStream) entry.waveform; ITx[] resultsList = new ITx[stream.getMaxConcurrency()]; Entry> firstTx=stream.getEvents().floorEntry(time); if(firstTx!=null){ @@ -492,7 +499,7 @@ public class WaveformViewer implements IWaveformViewer { value+="|"; if(o!=null) value+=((ITx)o).getGenerator().getName(); } - entry.setValue(value); + entry.currentValue=value; } } } @@ -775,7 +782,7 @@ public class WaveformViewer implements IWaveformViewer { int newIdx=idx+i; if(newIdx>=0 && newIdx w = trackEntry.waveform; if (w instanceof ITxStream) subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawValue(gc, subArea, firstKey, actualValues.get(w), trackEntry.selected); + drawValue(gc, subArea, firstKey, trackEntry.currentValue, trackEntry.selected); } else { for (Entry entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) .entrySet()) { @@ -833,7 +840,7 @@ public class WaveformViewer implements IWaveformViewer { subArea.height = waveformCanvas.getTrackHeight(); if (w instanceof ITxStream) subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawValue(gc, subArea, entry.getKey(), actualValues.get(w), entry.getValue().selected); + drawValue(gc, subArea, entry.getKey(), entry.getValue().currentValue, entry.getValue().selected); } } }catch(NoSuchElementException e){} @@ -1001,7 +1008,7 @@ public class WaveformViewer implements IWaveformViewer { else streams.add(tgtIdx, srcWave); currentWaveformSelection=srcWave; - updateTracklist(); + update(); } else if(source instanceof CursorPainter){ ((CursorPainter)source).setTime(0); updateValueList(); diff --git a/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformViewer.java b/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformViewer.java index cac7994..7f4bd6a 100644 --- a/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformViewer.java +++ b/com.minres.scviewer.database.ui/src/com/minres/scviewer/database/ui/IWaveformViewer.java @@ -34,6 +34,8 @@ public interface IWaveformViewer extends PropertyChangeListener, ISelectionProvi public void addSelectionChangedListener(ISelectionChangedListener listener); public void removeSelectionChangedListener(ISelectionChangedListener listener); + + public void update(); public Control getControl(); 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 index b40748a..7a9f6d9 100644 --- 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 @@ -17,7 +17,17 @@ import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformEvent; + public class TrackEntry { + public enum ValueDisplay { + DEFAULT, SIGNED, UNSIGNED + + } + + public enum WaveDisplay { + DEFAULT, STEP_WISE, CONTINOUS + } + final public IWaveform waveform; public int vOffset; @@ -26,6 +36,12 @@ public class TrackEntry { public boolean selected; + public String currentValue=""; + + public ValueDisplay valueDisplay = ValueDisplay.DEFAULT; + + public WaveDisplay waveDisplay = WaveDisplay.DEFAULT; + public TrackEntry(IWaveform waveform) { this.waveform = waveform; vOffset=0; diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/BitVector.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/BitVector.java index 7ceb08d..ff4104a 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/BitVector.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/BitVector.java @@ -63,4 +63,49 @@ public class BitVector { } return new String(res); } + + public long toUnsignedValue() { + long res = 0; + for(char c:value) { + res<<=1; + switch (c) { + case VALUE_1: + res++; + break; + case VALUE_X: + case VALUE_Z: + return 0; + default: + break; + } + } + return res; + } + + public long toSignedValue() { + Boolean negative=null; + long res = 0; + for(char c:value) { + if(negative == null) { + switch (c) { + case VALUE_1: negative=true; break; + case VALUE_0: negative=false; break; + case VALUE_X: + case VALUE_Z: return 0; + default: + } + } else { + res<<=1; + switch (c) { + case VALUE_1: if(!negative) res++; break; + case VALUE_0: if(negative) res++; break; + case VALUE_X: + case VALUE_Z: return 0; + default: + } + } + } + return negative?-1*(res+1):res; + } } + diff --git a/com.minres.scviewer.e4.application/Application.e4xmi b/com.minres.scviewer.e4.application/Application.e4xmi index 6035d3a..c596fb4 100644 --- a/com.minres.scviewer.e4.application/Application.e4xmi +++ b/com.minres.scviewer.e4.application/Application.e4xmi @@ -142,7 +142,7 @@ - + @@ -171,6 +171,8 @@ + + @@ -204,41 +206,51 @@ - + + + + + - - - - - + + + + + - - - + + + - + - + - + - + - + - + + + + + + + diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java index d5d9193..a08f31c 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java @@ -1,34 +1,44 @@ package com.minres.scviewer.e4.application.elements; +import java.util.Iterator; import java.util.List; import javax.inject.Inject; -import org.eclipse.e4.ui.di.AboutToShow; +import org.eclipse.e4.core.di.annotations.Evaluate; import org.eclipse.e4.ui.di.AboutToHide; +import org.eclipse.e4.ui.di.AboutToShow; +import org.eclipse.e4.ui.model.application.MApplication; +import org.eclipse.e4.ui.model.application.commands.MCommand; +import org.eclipse.e4.ui.model.application.commands.MCommandsFactory; +import org.eclipse.e4.ui.model.application.commands.MParameter; import org.eclipse.e4.ui.model.application.ui.basic.MPart; -import org.eclipse.e4.ui.model.application.ui.menu.MDirectMenuItem; +import org.eclipse.e4.ui.model.application.ui.menu.ItemType; +import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem; import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement; import org.eclipse.e4.ui.model.application.ui.menu.MMenuFactory; +import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import com.minres.scviewer.database.ISignal; import com.minres.scviewer.database.ISignalChange; -import com.minres.scviewer.database.ISignalChangeBit; import com.minres.scviewer.database.ISignalChangeBitVector; import com.minres.scviewer.database.ISignalChangeReal; -import com.minres.scviewer.database.ui.GotoDirection; +import com.minres.scviewer.database.ui.TrackEntry; +import com.minres.scviewer.database.ui.TrackEntry.ValueDisplay; import com.minres.scviewer.e4.application.parts.WaveformViewer; public class WaveformPopupMenuContribution { int counter=0; @Inject MPart activePart; + + final TrackEntry nullEntry = new TrackEntry(null); - @AboutToShow - public void aboutToShow(List items) { + @Evaluate + public boolean evaluate() { Object obj = activePart.getObject(); if(obj instanceof WaveformViewer){ WaveformViewer wfv = (WaveformViewer)obj; @@ -37,27 +47,82 @@ public class WaveformPopupMenuContribution { Object selected = ((IStructuredSelection)sel).getFirstElement(); if(selected instanceof ISignal) { ISignalChange s = (ISignalChange) ((ISignal) selected).getEvents().firstEntry().getValue(); - if(s instanceof ISignalChangeReal) { - MDirectMenuItem mdi = MMenuFactory.INSTANCE.createDirectMenuItem(); - mdi.setLabel("Analog linear"); - items.add(mdi); - mdi = MMenuFactory.INSTANCE.createDirectMenuItem(); - mdi.setLabel("Analog step"); - items.add(mdi); - } else if(s instanceof ISignalChangeBitVector) { - MDirectMenuItem mdi = MMenuFactory.INSTANCE.createDirectMenuItem(); - mdi.setLabel("Analog linear"); - items.add(mdi); - mdi = MMenuFactory.INSTANCE.createDirectMenuItem(); - mdi.setLabel("Analog step"); - items.add(mdi); + if((s instanceof ISignalChangeReal) || (s instanceof ISignalChangeBitVector)) { + return true; + } + } + } + } + return false; + } + + @AboutToShow + public void aboutToShow(List items, MApplication application, EModelService modelService) { + Object obj = activePart.getObject(); + if(obj instanceof WaveformViewer){ + WaveformViewer wfv = (WaveformViewer)obj; + ISelection sel = wfv.getSelection(); + if(!sel.isEmpty() && sel instanceof IStructuredSelection) { + Iterator it = ((IStructuredSelection)sel).iterator(); + Object first = it.next(); + Object second=null; + if(it.hasNext()) second=it.next(); + if(first instanceof ISignal) { + ISignalChange s = (ISignalChange) ((ISignal) first).getEvents().firstEntry().getValue(); + //com.minres.scviewer.e4.application.menu.mulitvaluesettings + if((s instanceof ISignalChangeReal) || (s instanceof ISignalChangeBitVector)) { + TrackEntry entry=nullEntry; + if(second instanceof TrackEntry) + entry=(TrackEntry)second; + if(s instanceof ISignalChangeBitVector) { + addValueMenuItem(items, application, modelService, "hex", TrackEntry.ValueDisplay.DEFAULT, entry.valueDisplay); + addValueMenuItem(items, application, modelService, "unsigned", TrackEntry.ValueDisplay.UNSIGNED, entry.valueDisplay); + addValueMenuItem(items, application, modelService, "signed", TrackEntry.ValueDisplay.SIGNED, entry.valueDisplay); + items.add(MMenuFactory.INSTANCE.createMenuSeparator()); + addWaveMenuItem(items, application, modelService, "bit vector", TrackEntry.WaveDisplay.DEFAULT, entry.waveDisplay); + } + addWaveMenuItem(items, application, modelService, "analog step-wise", TrackEntry.WaveDisplay.STEP_WISE, entry.waveDisplay); + addWaveMenuItem(items, application, modelService, "analog continous", TrackEntry.WaveDisplay.CONTINOUS, entry.waveDisplay); } } } } } + + private void addValueMenuItem(List items, MApplication application, EModelService modelService, + String label, TrackEntry.ValueDisplay value, TrackEntry.ValueDisplay actual) { + MHandledMenuItem item = MMenuFactory.INSTANCE.createHandledMenuItem(); + item.setType(ItemType.RADIO); + item.setSelected(value==actual); + item.setLabel("Show as "+label); + item.setContributorURI("platform:/plugin/com.minres.scviewer.e4.application"); + List cmds = modelService.findElements(application, "com.minres.scviewer.e4.application.command.changevaluedisplay", MCommand.class, null); + if(cmds.size()!=1) System.err.println("No command found!"); + else item.setCommand(cmds.get(0)); + MParameter param = MCommandsFactory.INSTANCE.createParameter(); + param.setName("com.minres.scviewer.e4.application.commandparameter.changevaluedisplay"); + param.setValue(value.toString()); + item.getParameters().add(param); + items.add(item); + } + private void addWaveMenuItem(List items, MApplication application, EModelService modelService, + String label, TrackEntry.WaveDisplay value, TrackEntry.WaveDisplay actual) { + MHandledMenuItem item = MMenuFactory.INSTANCE.createHandledMenuItem(); + item.setType(ItemType.RADIO); + item.setSelected(value==actual); + item.setLabel("Render "+label); + item.setContributorURI("platform:/plugin/com.minres.scviewer.e4.application"); + List cmds = modelService.findElements(application, "com.minres.scviewer.e4.application.command.changewavedisplay", MCommand.class, null); + if(cmds.size()!=1) System.err.println("No command found!"); + else item.setCommand(cmds.get(0)); + MParameter param = MCommandsFactory.INSTANCE.createParameter(); + param.setName("com.minres.scviewer.e4.application.commandparameter.changewavedisplay"); + param.setValue(value.toString()); + item.getParameters().add(param); + items.add(item); + } @AboutToHide public void aboutToHide(List items) { diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AboutHandler.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AboutHandler.java index 440b272..f7f4d7e 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AboutHandler.java +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AboutHandler.java @@ -10,6 +10,8 @@ *******************************************************************************/ package com.minres.scviewer.e4.application.handlers; +import javax.inject.Named; + import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.e4.ui.model.application.ui.basic.MDialog; @@ -19,9 +21,11 @@ import org.eclipse.swt.widgets.Shell; public class AboutHandler { + static final String DIALOG_ID="com.minres.scviewer.e4.application.dialog.aboutscviewer"; + @Execute public void execute(Shell shell, MApplication app, MWindow window, EModelService ms /*@Named("mdialog01.dialog.0") MDialog dialog*/) { - MDialog dialog = (MDialog) ms.find("com.minres.scviewer.e4.application.dialog.aboutscviewer", app); //$NON-NLS-1$ + MDialog dialog = (MDialog) ms.find(DIALOG_ID, app); //$NON-NLS-1$ dialog.setToBeRendered(true); dialog.setToBeRendered(false); } diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/ChangeValueDisplay.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/ChangeValueDisplay.java new file mode 100644 index 0000000..caaf007 --- /dev/null +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/ChangeValueDisplay.java @@ -0,0 +1,51 @@ + +package com.minres.scviewer.e4.application.handlers; + +import java.util.Iterator; + +import javax.inject.Named; + +import org.eclipse.e4.core.di.annotations.CanExecute; +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.workbench.modeling.EPartService; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; + +import com.minres.scviewer.database.ui.TrackEntry; +import com.minres.scviewer.e4.application.parts.WaveformViewer; + +public class ChangeValueDisplay { + + static final String PARAMETER_ID="com.minres.scviewer.e4.application.commandparameter.changevaluedisplay"; //$NON-NLS-1$ + + @CanExecute + public boolean canExecute(EPartService partService) { + MPart part = partService.getActivePart(); + if(part==null) return false; + return (part.getObject() instanceof WaveformViewer); + } + + @Execute + public void execute(@Named(PARAMETER_ID) String param, EPartService partService) { + MPart part = partService.getActivePart(); + Object obj = part.getObject(); + if(obj instanceof WaveformViewer){ + WaveformViewer wfv = (WaveformViewer)obj; + ISelection sel = wfv.getSelection(); + if(!sel.isEmpty() && sel instanceof IStructuredSelection) { + Iterator it = ((IStructuredSelection)sel).iterator(); + it.next(); + if(it.hasNext()) { + Object second = it.next(); + if(second instanceof TrackEntry) { + TrackEntry.ValueDisplay val = TrackEntry.ValueDisplay.valueOf(param); + ((TrackEntry)second).valueDisplay=val; + wfv.update(); + } + } + } + } + } + +} \ No newline at end of file diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/ChangeWaveformDisplay.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/ChangeWaveformDisplay.java new file mode 100644 index 0000000..c4af6c0 --- /dev/null +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/ChangeWaveformDisplay.java @@ -0,0 +1,51 @@ + +package com.minres.scviewer.e4.application.handlers; + +import java.util.Iterator; + +import javax.inject.Named; + +import org.eclipse.e4.core.di.annotations.CanExecute; +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.workbench.modeling.EPartService; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; + +import com.minres.scviewer.database.ui.TrackEntry; +import com.minres.scviewer.e4.application.parts.WaveformViewer; + +public class ChangeWaveformDisplay { + + static final String PARAMETER_ID="com.minres.scviewer.e4.application.commandparameter.changewavedisplay"; //$NON-NLS-1$ + + @CanExecute + public boolean canExecute(EPartService partService) { + MPart part = partService.getActivePart(); + if(part==null) return false; + return (part.getObject() instanceof WaveformViewer); + } + + @Execute + public void execute(@Named(PARAMETER_ID) String param, EPartService partService) { + MPart part = partService.getActivePart(); + Object obj = part.getObject(); + if(obj instanceof WaveformViewer){ + WaveformViewer wfv = (WaveformViewer)obj; + ISelection sel = wfv.getSelection(); + if(!sel.isEmpty() && sel instanceof IStructuredSelection) { + Iterator it = ((IStructuredSelection)sel).iterator(); + it.next(); + if(it.hasNext()) { + Object second = it.next(); + if(second instanceof TrackEntry) { + TrackEntry.WaveDisplay val= TrackEntry.WaveDisplay.valueOf(param); + ((TrackEntry)second).waveDisplay=val; + wfv.update(); + } + } + } + } + } + +} \ No newline at end of file diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java index 928de0f..9b76489 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java @@ -744,7 +744,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis //FIXME: need to use unitString and unitMultiplier from class WaveformCanvas which is located in >com.minres.scviewer.database.swt.internal. //Trying to import com.minres.scviewer.database.swt.internal.WaveformCanvas results in the error: //'Access restriction: The type 'WaveformCanvas' is not API (restriction on required project 'com.minres.scviewer.database.ui.swt')'. - public final static String[] unitString={"fs", "ps", "ns", "µs", "ms"};//, "s"}; + public final static String[] unitString={"fs", "ps", "ns", "�s", "ms"};//, "s"}; public final static int[] unitMultiplier={1, 3, 10, 30, 100, 300}; /** @@ -919,5 +919,9 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis if(navigationRelationType!=relationType) waveformPane.setHighliteRelation(relationType); navigationRelationType=relationType; } + + public void update() { + waveformPane.update(); + } } \ No newline at end of file