add multi-selection in waveform viewer

This commit is contained in:
Eyck Jentzsch 2020-07-15 21:43:07 +02:00
parent 611cfc7b46
commit 26968b8521
8 changed files with 209 additions and 207 deletions

View File

@ -8,13 +8,13 @@
* Contributors: * Contributors:
* MINRES Technologies GmbH - initial API and implementation * MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.database.swt; package com.minres.scviewer.database.ui.swt;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import com.minres.scviewer.database.swt.internal.WaveformView;
import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.IWaveformViewFactory; import com.minres.scviewer.database.ui.IWaveformViewFactory;
import com.minres.scviewer.database.ui.swt.internal.WaveformView;
public class WaveformViewFactory implements IWaveformViewFactory { public class WaveformViewFactory implements IWaveformViewFactory {

View File

@ -8,7 +8,7 @@
* Contributors: * Contributors:
* MINRES Technologies GmbH - initial API and implementation * MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.database.swt.internal; package com.minres.scviewer.database.ui.swt.internal;
import java.awt.Color; import java.awt.Color;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
@ -86,12 +86,12 @@ import com.minres.scviewer.database.ITxRelation;
import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.ITxStream;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.swt.Constants;
import com.minres.scviewer.database.ui.GotoDirection; import com.minres.scviewer.database.ui.GotoDirection;
import com.minres.scviewer.database.ui.ICursor; import com.minres.scviewer.database.ui.ICursor;
import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.WaveformColors; import com.minres.scviewer.database.ui.WaveformColors;
import com.minres.scviewer.database.ui.swt.Constants;
public class WaveformView implements IWaveformView { public class WaveformView implements IWaveformView {
@ -103,7 +103,7 @@ public class WaveformView implements IWaveformView {
private ITx currentTxSelection; private ITx currentTxSelection;
private TrackEntry currentWaveformSelection; private ArrayList<TrackEntry> currentWaveformSelection = new ArrayList<>();
private ScrolledComposite nameListScrolled; private ScrolledComposite nameListScrolled;
@ -133,18 +133,41 @@ public class WaveformView implements IWaveformView {
private Font nameFont, nameFontB; private Font nameFont, nameFontB;
protected TrackEntry lastClickedEntry;
protected MouseListener nameValueMouseListener = new MouseAdapter() { protected MouseListener nameValueMouseListener = new MouseAdapter() {
@Override @Override
public void mouseDown(MouseEvent e) { public void mouseDown(MouseEvent e) {
if (e.button == 1) { if (e.button == 1) {
Entry<Integer, TrackEntry> entry = trackVerticalOffset.floorEntry(e.y); Entry<Integer, TrackEntry> entry = trackVerticalOffset.floorEntry(e.y);
if (entry != null) entry.getValue().selected=true;
setSelection(new StructuredSelection(entry.getValue()));
} else if (e.button == 3) { } else if (e.button == 3) {
Menu topMenu= top.getMenu(); Menu topMenu= top.getMenu();
if(topMenu!=null) topMenu.setVisible(true); if(topMenu!=null) topMenu.setVisible(true);
} }
} }
@Override
public void mouseUp(MouseEvent e) {
if (e.button == 1) {
Entry<Integer, TrackEntry> entry = trackVerticalOffset.floorEntry(e.y);
if (entry != null) {
if((e.stateMask & SWT.SHIFT) != 0) {
if(lastClickedEntry.selected) {
int firstIdx=streams.indexOf(lastClickedEntry);
int lastIdx = streams.indexOf(entry.getValue());
List<TrackEntry> res = firstIdx>lastIdx?streams.subList(lastIdx, firstIdx+1):streams.subList(firstIdx, lastIdx+1);
setSelection(new StructuredSelection(res), (e.stateMask & SWT.CTRL) !=0 , false);
} else
setSelection(new StructuredSelection(entry.getValue()), (e.stateMask & SWT.CTRL) !=0 , false);
} else {
setSelection(new StructuredSelection(entry.getValue()), (e.stateMask & SWT.CTRL) !=0 , false);
}
}
lastClickedEntry = entry.getValue();
}
}
}; };
class WaveformMouseListener implements MouseMoveListener, MouseListener, PaintListener { class WaveformMouseListener implements MouseMoveListener, MouseListener, PaintListener {
@ -457,7 +480,7 @@ public class WaveformView implements IWaveformView {
@Override @Override
public void run() { public void run() {
update(); update();
waveformCanvas.reveal(currentWaveformSelection.waveform); currentWaveformSelection.stream().forEach(e -> waveformCanvas.reveal(e.waveform));
valueList.redraw(); valueList.redraw();
nameList.redraw(); nameList.redraw();
} }
@ -480,13 +503,11 @@ public class WaveformView implements IWaveformView {
trackVerticalOffset.clear(); trackVerticalOffset.clear();
waveformCanvas.clearAllWaveformPainter(false); waveformCanvas.clearAllWaveformPainter(false);
boolean even = true; boolean even = true;
boolean clearSelection = true;
TextLayout tl = new TextLayout(waveformCanvas.getDisplay()); TextLayout tl = new TextLayout(waveformCanvas.getDisplay());
tl.setFont(nameFontB); tl.setFont(nameFontB);
for (TrackEntry streamEntry : streams) { for (TrackEntry streamEntry : streams) {
streamEntry.height = waveformCanvas.getTrackHeight(); streamEntry.height = waveformCanvas.getTrackHeight();
streamEntry.vOffset=trackVerticalHeight; streamEntry.vOffset=trackVerticalHeight;
clearSelection &= currentWaveformSelection!=null && (streamEntry.waveform != currentWaveformSelection.waveform);
if (streamEntry.isStream()) { if (streamEntry.isStream()) {
streamEntry.currentValue=""; streamEntry.currentValue="";
streamEntry.height *= streamEntry.getStream().getMaxConcurrency(); streamEntry.height *= streamEntry.getStream().getMaxConcurrency();
@ -512,7 +533,6 @@ public class WaveformView implements IWaveformView {
if (trackVerticalOffset.isEmpty()){ if (trackVerticalOffset.isEmpty()){
waveformCanvas.setOrigin(0, 0); waveformCanvas.setOrigin(0, 0);
} }
if(clearSelection) setSelection(new StructuredSelection());
} }
private int calculateValueWidth() { private int calculateValueWidth() {
@ -651,11 +671,12 @@ public class WaveformView implements IWaveformView {
@Override @Override
public ISelection getSelection() { public ISelection getSelection() {
if (currentTxSelection != null) { if (currentTxSelection != null) {
Object[] elem = {currentTxSelection, currentWaveformSelection}; ArrayList<Object> sel = new ArrayList<>();
return new StructuredSelection(elem); sel.add(currentTxSelection);
} else if (currentWaveformSelection != null) { sel.addAll(currentWaveformSelection.stream().map(e -> e.waveform).collect(Collectors.toList()));
Object[] elem = {currentWaveformSelection.waveform, currentWaveformSelection}; return new StructuredSelection(sel.toArray());
return new StructuredSelection(elem); } else if (currentWaveformSelection.size()>0) {
return new StructuredSelection(currentWaveformSelection.toArray());
} else } else
return new StructuredSelection(); return new StructuredSelection();
} }
@ -665,22 +686,33 @@ public class WaveformView implements IWaveformView {
*/ */
@Override @Override
public void setSelection(ISelection selection) { public void setSelection(ISelection selection) {
setSelection(selection, false); setSelection(selection, false, false);
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see com.minres.scviewer.database.swt.IWaveformPanel#setSelection(org.eclipse.jface.viewers.ISelection, boolean) * @see com.minres.scviewer.database.swt.IWaveformPanel#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
*/ */
@Override @Override
public void setSelection(ISelection selection, boolean addIfNeeded) { public void setSelection(ISelection selection, boolean showIfNeeded) {
setSelection(selection, false, showIfNeeded);
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.swt.IWaveformPanel#addToSelection(org.eclipse.jface.viewers.ISelection, boolean)
*/
@Override
public void addToSelection(ISelection selection, boolean showIfNeeded) {
setSelection(selection, true, showIfNeeded);
}
public void setSelection(ISelection selection, boolean add, boolean addIfNeeded) {
boolean selectionChanged = false; boolean selectionChanged = false;
if(currentWaveformSelection!=null) currentWaveformSelection.selected=false; currentWaveformSelection.forEach(e->e.selected=false);
if (selection instanceof IStructuredSelection) { if (selection instanceof IStructuredSelection) {
if(((IStructuredSelection) selection).size()==0){ if(((IStructuredSelection) selection).size()==0){
selectionChanged = currentTxSelection!=null||currentWaveformSelection!=null; selectionChanged = currentTxSelection!=null||currentWaveformSelection!=null;
currentTxSelection = null; currentTxSelection = null;
currentWaveformSelection = null; currentWaveformSelection .clear();
} else { } else {
if(!add) currentWaveformSelection.clear();
for(Object sel:((IStructuredSelection) selection).toArray()){ for(Object sel:((IStructuredSelection) selection).toArray()){
if (sel instanceof ITx && currentTxSelection != sel){ if (sel instanceof ITx && currentTxSelection != sel){
ITx txSel = (ITx) sel; ITx txSel = (ITx) sel;
@ -693,26 +725,27 @@ public class WaveformView implements IWaveformView {
streams.add(trackEntry); streams.add(trackEntry);
} }
currentTxSelection = txSel; currentTxSelection = txSel;
if(trackEntry!=null) currentWaveformSelection = trackEntry; if(trackEntry!=null) {
currentWaveformSelection.add((TrackEntry)sel);
}
selectionChanged = true; selectionChanged = true;
} else if (sel instanceof TrackEntry && currentWaveformSelection != sel) { } else if (sel instanceof TrackEntry && !currentWaveformSelection.contains(sel)) {
currentWaveformSelection = (TrackEntry) sel; currentWaveformSelection.add((TrackEntry)sel);
if(currentTxSelection!=null && currentTxSelection.getStream()!=currentWaveformSelection) if(currentTxSelection!=null)
currentTxSelection=null; currentTxSelection=null;
selectionChanged = true; selectionChanged = true;
} }
} }
} }
} else { } else {
if (currentTxSelection != null || currentWaveformSelection != null) if (currentTxSelection != null || currentWaveformSelection.size() > 0)
selectionChanged = true; selectionChanged = true;
currentTxSelection = null; currentTxSelection = null;
currentWaveformSelection = null; currentWaveformSelection.clear();
} }
if(currentWaveformSelection!=null) currentWaveformSelection.selected=true; currentWaveformSelection.forEach(e -> e.selected = true);
if (selectionChanged) { if (selectionChanged) {
if(currentWaveformSelection!=null) waveformCanvas.reveal(currentWaveformSelection.waveform); currentWaveformSelection.forEach(e -> waveformCanvas.reveal(e.waveform));
waveformCanvas.setSelected(currentTxSelection); waveformCanvas.setSelected(currentTxSelection);
valueList.redraw(); valueList.redraw();
nameList.redraw(); nameList.redraw();
@ -722,13 +755,11 @@ public class WaveformView implements IWaveformView {
protected void fireSelectionChanged() { protected void fireSelectionChanged() {
if(currentWaveformSelection==null) return; if(currentWaveformSelection==null) return;
IStructuredSelection selection=currentTxSelection!=null? ISelection selection=getSelection();
new StructuredSelection(new Object[]{currentTxSelection, currentWaveformSelection.waveform}): Object[] list = selectionChangedListeners.getListeners();
new StructuredSelection(currentWaveformSelection.waveform); for (int i = 0; i < list.length; i++) {
Object[] list = selectionChangedListeners.getListeners(); ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection));
for (int i = 0; i < list.length; i++) { }
((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection));
}
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -739,12 +770,14 @@ public class WaveformView implements IWaveformView {
if(direction==GotoDirection.NEXT || direction==GotoDirection.PREV) if(direction==GotoDirection.NEXT || direction==GotoDirection.PREV)
moveSelection(direction, NEXT_PREV_IN_STREAM) ; moveSelection(direction, NEXT_PREV_IN_STREAM) ;
else { else {
int idx = streams.indexOf(currentWaveformSelection); if(currentWaveformSelection.size()==1) {
int idx = streams.indexOf(currentWaveformSelection.get(0));
if(direction==GotoDirection.UP && idx>0) { if(direction==GotoDirection.UP && idx>0) {
setSelection(new StructuredSelection(streams.get(idx-1))); setSelection(new StructuredSelection(streams.get(idx-1)));
} else if(direction==GotoDirection.DOWN && idx<(streams.size()-1)) { } else if(direction==GotoDirection.DOWN && idx<(streams.size()-1)) {
setSelection(new StructuredSelection(streams.get(idx+1))); setSelection(new StructuredSelection(streams.get(idx+1)));
} }
}
} }
} }
@ -753,9 +786,15 @@ public class WaveformView implements IWaveformView {
*/ */
@Override @Override
public void moveSelection(GotoDirection direction, RelationType relationType) { public void moveSelection(GotoDirection direction, RelationType relationType) {
if (currentWaveformSelection!=null && currentWaveformSelection.isStream() && currentTxSelection!=null) { TrackEntry selectedWaveform=null;
if(currentTxSelection!=null)
selectedWaveform = getEntryForStream(currentTxSelection.getStream());
else if(currentWaveformSelection.size()!=1) return;
if(selectedWaveform==null)
selectedWaveform = currentWaveformSelection.get(1);
if (selectedWaveform!=null && selectedWaveform.isStream() && currentTxSelection!=null) {
if(relationType.equals(IWaveformView.NEXT_PREV_IN_STREAM)){ if(relationType.equals(IWaveformView.NEXT_PREV_IN_STREAM)){
ITxStream<? extends ITxEvent> stream = currentWaveformSelection.getStream(); ITxStream<? extends ITxEvent> stream = selectedWaveform.getStream();
ITx transaction = null; ITx transaction = null;
if (direction == GotoDirection.NEXT) { if (direction == GotoDirection.NEXT) {
List<ITxEvent> thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime()); List<ITxEvent> thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime());
@ -855,14 +894,14 @@ public class WaveformView implements IWaveformView {
*/ */
@Override @Override
public void moveCursor(GotoDirection direction) { public void moveCursor(GotoDirection direction) {
if(currentWaveformSelection.size()!=1) return;
TrackEntry sel = currentWaveformSelection.get(1);
long time = getCursorTime(); long time = getCursorTime();
NavigableMap<Long, ?> map=null; NavigableMap<Long, ?> map=null;
if(currentWaveformSelection!=null) { if(sel.isStream()){
if(currentWaveformSelection.isStream()){ map=sel.getStream().getEvents();
map=currentWaveformSelection.getStream().getEvents(); } else if(sel.isSignal()){
} else if(currentWaveformSelection.isSignal()){ map=sel.getSignal().getEvents();
map=currentWaveformSelection.getSignal().getEvents();
}
} }
if(map!=null){ if(map!=null){
Entry<Long, ?> entry=direction==GotoDirection.PREV?map.lowerEntry(time):map.higherEntry(time); Entry<Long, ?> entry=direction==GotoDirection.PREV?map.lowerEntry(time):map.higherEntry(time);
@ -884,29 +923,37 @@ public class WaveformView implements IWaveformView {
public List<TrackEntry> getStreamList() { public List<TrackEntry> getStreamList() {
return streams; return streams;
} }
/* (non-Javadoc)
* @see com.minres.scviewer.database.swt.IWaveformPanel#deleteSelectedTracks()
*/
@Override
public void deleteSelectedTracks() {
List<TrackEntry> streams = getStreamList();
for (Object o : (IStructuredSelection)getSelection()) {
if(o instanceof TrackEntry) {
TrackEntry e = (TrackEntry) o;
e.selected=false;
streams.remove(e);
}
}
setSelection(new StructuredSelection());
update();
}
/* (non-Javadoc) /* (non-Javadoc)
* @see com.minres.scviewer.database.swt.IWaveformPanel#moveSelected(int) * @see com.minres.scviewer.database.swt.IWaveformPanel#moveSelected(int)
*/ */
@Override @Override
public void moveSelectedTrack(int i) { public void moveSelectedTrack(int i) {
if(currentWaveformSelection!=null){ if(currentWaveformSelection.size()>0){
int idx = streams.indexOf(currentWaveformSelection); int idx = streams.indexOf(currentWaveformSelection.get(0));
int newIdx=idx+i; for(Object o: currentWaveformSelection)
if(newIdx>=0 && newIdx<streams.size()){ streams.remove(o);
Collections.swap(streams,idx,newIdx); int tgtIdx=idx+i;
revealSelected=true; if(tgtIdx<0) tgtIdx=0;
// update(); if(tgtIdx>=streams.size())
// ITx selectedTx=currentTxSelection; streams.addAll(currentWaveformSelection);
// if(selectedTx!=null){ else
// setSelection(new StructuredSelection(new Object[]{selectedTx, currentWaveformSelection.waveform})); streams.addAll(tgtIdx, currentWaveformSelection);
// } else {
// setSelection(new StructuredSelection(currentWaveformSelection.waveform));
// }
// waveformCanvas.reveal(currentWaveformSelection.waveform);
// valueList.redraw();
// nameList.redraw();
}
} }
} }
@ -1108,38 +1155,30 @@ public class WaveformView implements IWaveformView {
dropTarget.setTransfer(types); dropTarget.setTransfer(types);
dropTarget.addDropListener(new DropTargetAdapter() { dropTarget.addDropListener(new DropTargetAdapter() {
@SuppressWarnings("unchecked")
public void drop(DropTargetEvent event) { public void drop(DropTargetEvent event) {
if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)){ if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)){
ISelection sel = LocalSelectionTransfer.getTransfer().getSelection(); ISelection s = LocalSelectionTransfer.getTransfer().getSelection();
if(sel!=null && sel instanceof IStructuredSelection){ if(s!=null && s instanceof IStructuredSelection){
Object source = ((IStructuredSelection)sel).getFirstElement(); IStructuredSelection sel = (IStructuredSelection) s;
for(Object o: sel.toList())
streams.remove(o);
DropTarget tgt = (DropTarget) event.widget; DropTarget tgt = (DropTarget) event.widget;
Point dropPoint = ((Canvas) tgt.getControl()).toControl(event.x, event.y); Point dropPoint = ((Canvas) tgt.getControl()).toControl(event.x, event.y);
Object target = trackVerticalOffset.floorEntry(dropPoint.y).getValue(); // extract all elements being selected
if(source instanceof TrackEntry && target instanceof TrackEntry){ if( dropPoint.y > trackVerticalOffset.lastKey()) {
TrackEntry srcWave=(TrackEntry) source; streams.addAll(sel.toList());
int srcIdx=streams.indexOf(srcWave); } else {
streams.remove(srcWave); TrackEntry target = trackVerticalOffset.floorEntry(dropPoint.y).getValue();
int tgtIdx=streams.indexOf(target); int tgtIdx=streams.indexOf(target);
if(srcIdx<=tgtIdx) tgtIdx++; streams.addAll(tgtIdx, sel.toList());
if(tgtIdx>=streams.size())
streams.add(srcWave);
else
streams.add(tgtIdx, srcWave);
currentWaveformSelection=srcWave;
update();
} else if(source instanceof CursorPainter){
((CursorPainter)source).setTime(0);
updateValueList();
} }
} }
} }
} }
public void dropAccept(DropTargetEvent event) { public void dropAccept(DropTargetEvent event) {
Point offset = canvas.toControl(event.x, event.y); if (event.detail != DND.DROP_MOVE) {
if (event.detail != DND.DROP_MOVE || offset.y > trackVerticalOffset.lastKey() + waveformCanvas.getTrackHeight()) {
event.detail = DND.DROP_NONE; event.detail = DND.DROP_NONE;
} }
} }
@ -1350,4 +1389,5 @@ public class WaveformView implements IWaveformView {
public void addDisposeListener( DisposeListener listener ) { public void addDisposeListener( DisposeListener listener ) {
waveformCanvas.addDisposeListener(listener); waveformCanvas.addDisposeListener(listener);
} }
} }

View File

@ -1,7 +1,6 @@
package com.minres.scviewer.e4.application.elements; package com.minres.scviewer.e4.application.elements;
import java.util.Iterator;
import java.util.List; import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
@ -34,22 +33,46 @@ public class WaveformPopupMenuContribution {
final TrackEntry nullEntry = new TrackEntry(null); final TrackEntry nullEntry = new TrackEntry(null);
private boolean selHasBitVector(ISelection sel, boolean checkForDouble) {
if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
for(Object elem:(IStructuredSelection)sel) {
if(elem instanceof TrackEntry) {
TrackEntry e = (TrackEntry) elem;
if(e.waveform instanceof ISignal<?>) {
Object o = ((ISignal<?>) e.waveform).getEvents().firstEntry().getValue();
if(checkForDouble && o instanceof Double)
return true;
else if(o instanceof BitVector && ((BitVector)o).getWidth()>1)
return true;
else
return false;
}
}
}
}
return false;
}
private TrackEntry getSingleTrackEntry(ISelection sel) {
TrackEntry entry=null;
if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
for(Object elem:(IStructuredSelection)sel) {
if(elem instanceof TrackEntry) {
if(entry != null)
return null;
entry = (TrackEntry) elem;
}
}
}
return entry;
}
@Evaluate @Evaluate
public boolean evaluate() { public boolean evaluate() {
Object obj = activePart.getObject(); Object obj = activePart.getObject();
if(obj instanceof WaveformViewer){ if(obj instanceof WaveformViewer){
WaveformViewer wfv = (WaveformViewer)obj; WaveformViewer wfv = (WaveformViewer)obj;
ISelection sel = wfv.getSelection(); return selHasBitVector(wfv.getSelection(), true);
if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
Object selected = ((IStructuredSelection)sel).getFirstElement();
if(selected instanceof ISignal<?>) {
Object x = ((ISignal<?>) selected).getEvents().firstEntry().getValue();
if((x instanceof BitVector) && ((BitVector)x).getWidth()==1) {
return false;
} else
return true;
}
}
} }
return false; return false;
} }
@ -60,39 +83,24 @@ public class WaveformPopupMenuContribution {
if(obj instanceof WaveformViewer){ if(obj instanceof WaveformViewer){
WaveformViewer wfv = (WaveformViewer)obj; WaveformViewer wfv = (WaveformViewer)obj;
ISelection sel = wfv.getSelection(); ISelection sel = wfv.getSelection();
if(!sel.isEmpty() && sel instanceof IStructuredSelection) { TrackEntry elem = getSingleTrackEntry(sel);
Iterator<?> it = ((IStructuredSelection)sel).iterator(); if(selHasBitVector(sel, false)) {
Object first = it.next(); addValueMenuItem(items, application, modelService, "hex", TrackEntry.ValueDisplay.DEFAULT, elem);
Object second=null; addValueMenuItem(items, application, modelService, "unsigned", TrackEntry.ValueDisplay.UNSIGNED, elem);
if(it.hasNext()) second=it.next(); addValueMenuItem(items, application, modelService, "signed", TrackEntry.ValueDisplay.SIGNED, elem);
if(first instanceof ISignal<?>) { items.add(MMenuFactory.INSTANCE.createMenuSeparator());
Object o = ((ISignal<?>) first).getEvents().firstEntry().getValue(); addWaveMenuItem(items, application, modelService, "bit vector", TrackEntry.WaveDisplay.DEFAULT, elem);
//com.minres.scviewer.e4.application.menu.mulitvaluesettings
if((o instanceof Double) || (o instanceof BitVector)) {
TrackEntry entry=nullEntry;
if(second instanceof TrackEntry)
entry=(TrackEntry)second;
if(o instanceof BitVector) {
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);
}
}
} }
addWaveMenuItem(items, application, modelService, "analog step-wise", TrackEntry.WaveDisplay.STEP_WISE, elem);
addWaveMenuItem(items, application, modelService, "analog continous", TrackEntry.WaveDisplay.CONTINOUS, elem);
} }
} }
private void addValueMenuItem(List<MMenuElement> items, MApplication application, EModelService modelService, private void addValueMenuItem(List<MMenuElement> items, MApplication application, EModelService modelService,
String label, TrackEntry.ValueDisplay value, TrackEntry.ValueDisplay actual) { String label, TrackEntry.ValueDisplay value, TrackEntry elem) {
MHandledMenuItem item = MMenuFactory.INSTANCE.createHandledMenuItem(); MHandledMenuItem item = MMenuFactory.INSTANCE.createHandledMenuItem();
item.setType(ItemType.RADIO); item.setType(ItemType.RADIO);
item.setSelected(value==actual); item.setSelected(elem != null && elem.valueDisplay == value);
item.setLabel("Show as "+label); item.setLabel("Show as "+label);
item.setContributorURI("platform:/plugin/com.minres.scviewer.e4.application"); item.setContributorURI("platform:/plugin/com.minres.scviewer.e4.application");
List<MCommand> cmds = modelService.findElements(application, "com.minres.scviewer.e4.application.command.changevaluedisplay", MCommand.class, null); List<MCommand> cmds = modelService.findElements(application, "com.minres.scviewer.e4.application.command.changevaluedisplay", MCommand.class, null);
@ -106,10 +114,10 @@ public class WaveformPopupMenuContribution {
} }
private void addWaveMenuItem(List<MMenuElement> items, MApplication application, EModelService modelService, private void addWaveMenuItem(List<MMenuElement> items, MApplication application, EModelService modelService,
String label, TrackEntry.WaveDisplay value, TrackEntry.WaveDisplay actual) { String label, TrackEntry.WaveDisplay value, TrackEntry elem) {
MHandledMenuItem item = MMenuFactory.INSTANCE.createHandledMenuItem(); MHandledMenuItem item = MMenuFactory.INSTANCE.createHandledMenuItem();
item.setType(ItemType.RADIO); item.setType(ItemType.RADIO);
item.setSelected(value==actual); item.setSelected(elem != null && elem.waveDisplay==value);
item.setLabel("Render "+label); item.setLabel("Render "+label);
item.setContributorURI("platform:/plugin/com.minres.scviewer.e4.application"); item.setContributorURI("platform:/plugin/com.minres.scviewer.e4.application");
List<MCommand> cmds = modelService.findElements(application, "com.minres.scviewer.e4.application.command.changewavedisplay", MCommand.class, null); List<MCommand> cmds = modelService.findElements(application, "com.minres.scviewer.e4.application.command.changewavedisplay", MCommand.class, null);

View File

@ -1,8 +1,6 @@
package com.minres.scviewer.e4.application.handlers; package com.minres.scviewer.e4.application.handlers;
import java.util.Iterator;
import javax.inject.Named; import javax.inject.Named;
import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.CanExecute;
@ -34,18 +32,14 @@ public class ChangeValueDisplay {
WaveformViewer wfv = (WaveformViewer)obj; WaveformViewer wfv = (WaveformViewer)obj;
ISelection sel = wfv.getSelection(); ISelection sel = wfv.getSelection();
if(!sel.isEmpty() && sel instanceof IStructuredSelection) { if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
Iterator<?> it = ((IStructuredSelection)sel).iterator(); for(Object elem:(IStructuredSelection)sel) {
it.next(); if(elem instanceof TrackEntry) {
if(it.hasNext()) { TrackEntry.ValueDisplay val= TrackEntry.ValueDisplay.valueOf(param);
Object second = it.next(); ((TrackEntry)elem).valueDisplay=val;
if(second instanceof TrackEntry) { }
TrackEntry.ValueDisplay val = TrackEntry.ValueDisplay.valueOf(param);
((TrackEntry)second).valueDisplay=val;
wfv.update();
}
} }
wfv.update();
} }
} }
} }
} }

View File

@ -1,8 +1,6 @@
package com.minres.scviewer.e4.application.handlers; package com.minres.scviewer.e4.application.handlers;
import java.util.Iterator;
import javax.inject.Named; import javax.inject.Named;
import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.CanExecute;
@ -34,16 +32,13 @@ public class ChangeWaveformDisplay {
WaveformViewer wfv = (WaveformViewer)obj; WaveformViewer wfv = (WaveformViewer)obj;
ISelection sel = wfv.getSelection(); ISelection sel = wfv.getSelection();
if(!sel.isEmpty() && sel instanceof IStructuredSelection) { if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
Iterator<?> it = ((IStructuredSelection)sel).iterator(); for(Object elem:(IStructuredSelection)sel) {
it.next(); if(elem instanceof TrackEntry) {
if(it.hasNext()) { TrackEntry.WaveDisplay val= TrackEntry.WaveDisplay.valueOf(param);
Object second = it.next(); ((TrackEntry)elem).waveDisplay=val;
if(second instanceof TrackEntry) { }
TrackEntry.WaveDisplay val= TrackEntry.WaveDisplay.valueOf(param);
((TrackEntry)second).waveDisplay=val;
wfv.update();
}
} }
wfv.update();
} }
} }
} }

View File

@ -17,23 +17,30 @@ import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService; import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.IStructuredSelection;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.e4.application.parts.WaveformViewer; import com.minres.scviewer.e4.application.parts.WaveformViewer;
public class DeleteWaveformHandler { public class DeleteWaveformHandler {
@SuppressWarnings("unchecked")
@CanExecute @CanExecute
public Boolean canExecute(ESelectionService selectionService){ public Boolean canExecute(ESelectionService selectionService){
Object o = selectionService.getSelection(); Object o = selectionService.getSelection();
return o instanceof IStructuredSelection && ((IStructuredSelection)o).getFirstElement() instanceof IWaveform; if(o instanceof IStructuredSelection) {
IStructuredSelection sel = (IStructuredSelection) o;
if(sel.size()>0)
return sel.toList().stream().allMatch(e-> e instanceof TrackEntry);
else
return false;
} else
return false;
} }
@Execute @Execute
public void execute(ESelectionService selectionService, MPart activePart) { public void execute(ESelectionService selectionService, MPart activePart) {
Object o = activePart.getObject(); Object o = activePart.getObject();
Object sel = selectionService.getSelection(); if(o instanceof WaveformViewer){
if(o instanceof WaveformViewer && ((IStructuredSelection)sel).getFirstElement() instanceof IWaveform){ ((WaveformViewer)o).removeSelectedStreamsFromList();
((WaveformViewer)o).removeStreamFromList((IWaveform) ((IStructuredSelection)sel).getFirstElement());
} }
} }
} }

View File

@ -90,16 +90,16 @@ import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.IWaveformDbFactory; import com.minres.scviewer.database.IWaveformDbFactory;
import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.swt.Constants;
import com.minres.scviewer.database.swt.ToolTipContentProvider;
import com.minres.scviewer.database.swt.ToolTipHelpTextProvider;
import com.minres.scviewer.database.swt.WaveformViewFactory;
import com.minres.scviewer.database.ui.GotoDirection; import com.minres.scviewer.database.ui.GotoDirection;
import com.minres.scviewer.database.ui.ICursor; import com.minres.scviewer.database.ui.ICursor;
import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.TrackEntry.ValueDisplay; import com.minres.scviewer.database.ui.TrackEntry.ValueDisplay;
import com.minres.scviewer.database.ui.TrackEntry.WaveDisplay; import com.minres.scviewer.database.ui.TrackEntry.WaveDisplay;
import com.minres.scviewer.database.ui.swt.Constants;
import com.minres.scviewer.database.ui.swt.ToolTipContentProvider;
import com.minres.scviewer.database.ui.swt.ToolTipHelpTextProvider;
import com.minres.scviewer.database.ui.swt.WaveformViewFactory;
import com.minres.scviewer.database.ui.WaveformColors; import com.minres.scviewer.database.ui.WaveformColors;
import com.minres.scviewer.e4.application.Messages; import com.minres.scviewer.e4.application.Messages;
import com.minres.scviewer.e4.application.internal.status.WaveStatusBarControl; import com.minres.scviewer.e4.application.internal.status.WaveStatusBarControl;
@ -1005,55 +1005,13 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
setFocus(); setFocus();
} }
/** public void removeSelectedStreamsFromList() {
* Removes the stream from list. waveformPane.deleteSelectedTracks();
*
* @param stream the stream
*/
public void removeStreamFromList(IWaveform stream) {
TrackEntry trackEntry = waveformPane.getEntryForStream(stream);
List<TrackEntry> streams = waveformPane.getStreamList();
ISelection sel = waveformPane.getSelection();
TrackEntry newSelection=null;
if(sel instanceof IStructuredSelection && ((IStructuredSelection) sel).size()==2) {
Iterator<?> it = ((IStructuredSelection)sel).iterator();
it.next();
int idx = streams.indexOf(it.next());
if(idx==streams.size()-1) {
//last stream gets deleted, no more selection
if(idx==0) {
newSelection=null;
}
//more than 1 stream left, last gets deleted, selection jumps to new last stream
else {
newSelection=streams.get(idx-1);
}
}
//more than 1 stream left, any stream but the last gets deleted, selection jumps to the next stream
else {
newSelection=streams.get(idx+1);
}
}
waveformPane.setSelection(new StructuredSelection());
streams.remove(trackEntry);
if(newSelection!=null) {
Object[] o = {newSelection};
waveformPane.setSelection(new StructuredSelection(o));
}
} }
/** public void removeStreamFromList(ISelection sel) {
* Removes the streams from list. waveformPane.deleteSelectedTracks();
*
* @param iWaveforms the i waveforms
*/
public void removeStreamsFromList(IWaveform[] iWaveforms) {
for (IWaveform stream : iWaveforms)
removeStreamFromList(stream);
} }
/** /**
* Move selected. * Move selected.
* *

View File

@ -48,10 +48,10 @@ import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.IWaveformDbFactory; import com.minres.scviewer.database.IWaveformDbFactory;
import com.minres.scviewer.database.swt.WaveformViewFactory;
import com.minres.scviewer.database.ui.GotoDirection; import com.minres.scviewer.database.ui.GotoDirection;
import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.swt.WaveformViewFactory;
import com.minres.scviewer.ui.views.TxOutlinePage; import com.minres.scviewer.ui.views.TxOutlinePage;
public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPageContributor { public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPageContributor {