Added keyboard navigation to scroll, move selection, move selected and

zoom
This commit is contained in:
2018-10-14 17:30:37 +02:00
parent 048fa93b53
commit dba8b2731d
4 changed files with 243 additions and 34 deletions

View File

@ -42,6 +42,7 @@ import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformEvent;
import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.ui.IWaveformViewer;
import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.WaveformColors;
public class WaveformCanvas extends Canvas {
@ -181,6 +182,9 @@ public class WaveformCanvas extends Canvas {
return origin;
}
public int getWidth() {
return getClientArea().width;
}
public void setOrigin(Point origin) {
setOrigin(origin.x, origin.y);
}
@ -292,9 +296,13 @@ public class WaveformCanvas extends Canvas {
}
public void addWaveformPainter(IWaveformPainter painter) {
addWaveformPainter(painter, true);
}
void addWaveformPainter(IWaveformPainter painter, boolean update) {
trackAreaPainter.addTrackPainter(painter);
wave2painterMap.put(painter.getTrackEntry().waveform, painter);
syncScrollBars();
if(update) syncScrollBars();
}
public List<CursorPainter> getCursorPainters() {
@ -311,7 +319,7 @@ public class WaveformCanvas extends Canvas {
super.dispose();
}
/* Initalize the scrollbar and register listeners. */
/* Initialize the scrollbar and register listeners. */
private void initScrollBars() {
ScrollBar horizontal = getHorizontalBar();
horizontal.setEnabled(false);
@ -469,6 +477,27 @@ public class WaveformCanvas extends Canvas {
}
}
public void reveal(IWaveform<? extends IWaveformEvent> waveform) {
for (IWaveformPainter painter : wave2painterMap.values()) {
TrackEntry te = painter.getTrackEntry();
if(te.waveform == waveform) {
Point size = getSize();
//size.x -= getVerticalBar().getSize().x + 2;
size.y -=+rulerHeight;
ScrollBar sb = getHorizontalBar();
if((sb.getStyle()&SWT.SCROLLBAR_OVERLAY)!=0 && sb.isVisible()) // TODO: check on other platform than MacOSX
size.y-= getHorizontalBar().getSize().y;
int top = te.vOffset;
int bottom = top + trackHeight;
if (top < -origin.y) {
setOrigin(origin.x, -(top-trackHeight));
} else if (bottom > (size.y - origin.y)) {
setOrigin(origin.x, size.y - bottom);
}
}
}
}
public void reveal(long time) {
int scaledTime = (int) (time / scaleFactor);
Point size = getSize();
@ -513,4 +542,11 @@ public class WaveformCanvas extends Canvas {
}
}
long getMaxVisibleTime() {
return (getClientArea().width+origin.x)*scaleFactor;
}
long getOriginTime() {
return origin.x * scaleFactor;
}
}

View File

@ -66,6 +66,7 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.wb.swt.SWTResourceManager;
import com.google.common.collect.Lists;
@ -109,6 +110,8 @@ public class WaveformViewer implements IWaveformViewer {
final WaveformCanvas waveformCanvas;
private boolean revealSelected=false;
private Composite top;
protected ObservableList<TrackEntry> streams;
@ -142,12 +145,10 @@ public class WaveformViewer implements IWaveformViewer {
@Override
public void mouseDown(MouseEvent e) {
start=new Point(e.x, e.y);
if((e.stateMask&SWT.MODIFIER_MASK)!=0) return; //don't react on modifier
if (e.button == 1) {
initialSelected = waveformCanvas.getClicked(start);
} else if (e.button == 3) {
List<Object> hitted = waveformCanvas.getClicked(start);
if(hitted!=null && hitted.size()>0)
setSelection(new StructuredSelection(hitted));
Menu topMenu= top.getMenu();
if(topMenu!=null) topMenu.setVisible(true);
}
@ -155,29 +156,18 @@ public class WaveformViewer implements IWaveformViewer {
@Override
public void mouseUp(MouseEvent e) {
if (e.button == 1) {
if((e.stateMask&SWT.MODIFIER_MASK&~SWT.SHIFT)!=0) return; //don't react on modifier
if (e.button == 1 && ((e.stateMask&SWT.SHIFT)==0)) {
if(Math.abs(e.x-start.x)<3 && Math.abs(e.y-start.y)<3){
// first set time
// first set cursor time
setCursorTime(snapOffsetToEvent(e));
// then set selection and reveal
setSelection(new StructuredSelection(initialSelected));
e.widget.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
waveformCanvas.redraw();
updateValueList();
}
});
asyncUpdate(e.widget);
}
}else if (e.button == 2) {
}else if (e.button == 2 ||(e.button==1 && (e.stateMask&SWT.SHIFT)!=0)) {
setMarkerTime(snapOffsetToEvent(e), selectedMarker);
e.widget.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
waveformCanvas.redraw();
updateValueList();
}
});
asyncUpdate(e.widget);
}
}
@ -378,6 +368,18 @@ public class WaveformViewer implements IWaveformViewer {
@Override
public void propertyChange(PropertyChangeEvent pce) {
if ("size".equals(pce.getPropertyName()) || "content".equals(pce.getPropertyName())) {
if(revealSelected) {
waveformCanvas.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
update();
waveformCanvas.reveal(currentWaveformSelection.waveform);
valueList.redraw();
nameList.redraw();
}
});
revealSelected=false;
} else
waveformCanvas.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
@ -410,13 +412,14 @@ public class WaveformViewer implements IWaveformViewer {
streamEntry.currentValue="---";
painter = new SignalPainter(waveformCanvas, even, streamEntry);
}
waveformCanvas.addWaveformPainter(painter);
waveformCanvas.addWaveformPainter(painter, false);
trackVerticalOffset.put(trackVerticalHeight, streamEntry);
tl.setText(streamEntry.waveform.getFullName());
nameMaxWidth = Math.max(nameMaxWidth, tl.getBounds().width);
trackVerticalHeight += streamEntry.height;
even = !even;
}
waveformCanvas.syncScrollBars();
nameList.setSize(nameMaxWidth + 15, trackVerticalHeight);
nameListScrolled.setMinSize(nameMaxWidth + 15, trackVerticalHeight);
valueList.setSize(calculateValueWidth(), trackVerticalHeight);
@ -566,9 +569,10 @@ public class WaveformViewer implements IWaveformViewer {
*/
@Override
public ISelection getSelection() {
if (currentTxSelection != null)
return new StructuredSelection(currentTxSelection);
else if (currentWaveformSelection != null) {
if (currentTxSelection != null) {
Object[] elem = {currentTxSelection, currentWaveformSelection};
return new StructuredSelection(elem);
} else if (currentWaveformSelection != null) {
Object[] elem = {currentWaveformSelection.waveform, currentWaveformSelection};
return new StructuredSelection(elem);
} else
@ -611,6 +615,7 @@ public class WaveformViewer implements IWaveformViewer {
currentWaveformSelection = (TrackEntry) sel;
if(currentTxSelection!=null && currentTxSelection.getStream()!=currentWaveformSelection)
currentTxSelection=null;
selectionChanged = true;
}
}
@ -623,6 +628,7 @@ public class WaveformViewer implements IWaveformViewer {
}
if(currentWaveformSelection!=null) currentWaveformSelection.selected=true;
if (selectionChanged) {
waveformCanvas.reveal(currentWaveformSelection.waveform);
waveformCanvas.setSelected(currentTxSelection);
valueList.redraw();
nameList.redraw();
@ -646,7 +652,16 @@ public class WaveformViewer implements IWaveformViewer {
*/
@Override
public void moveSelection(GotoDirection direction) {
moveSelection(direction, NEXT_PREV_IN_STREAM) ;
if(direction==GotoDirection.NEXT || direction==GotoDirection.PREV)
moveSelection(direction, NEXT_PREV_IN_STREAM) ;
else {
int idx = streams.indexOf(currentWaveformSelection);
if(direction==GotoDirection.UP && idx>0) {
setSelection(new StructuredSelection(streams.get(idx-1)));
} else if(direction==GotoDirection.DOWN && idx<(streams.size()-1)) {
setSelection(new StructuredSelection(streams.get(idx+1)));
}
}
}
/* (non-Javadoc)
@ -776,17 +791,21 @@ public class WaveformViewer implements IWaveformViewer {
@Override
public void moveSelectedTrack(int i) {
if(currentWaveformSelection!=null){
ITx selectedTx=currentTxSelection;
TrackEntry selectedWaveform=currentWaveformSelection;
int idx = streams.indexOf(currentWaveformSelection);
int newIdx=idx+i;
if(newIdx>=0 && newIdx<streams.size()){
Collections.swap(streams,idx,newIdx);
update();
if(selectedTx!=null){
setSelection(new StructuredSelection(new Object[]{selectedTx, selectedWaveform.waveform}));
} else
setSelection(new StructuredSelection(selectedWaveform.waveform));
revealSelected=true;
// update();
// ITx selectedTx=currentTxSelection;
// if(selectedTx!=null){
// setSelection(new StructuredSelection(new Object[]{selectedTx, currentWaveformSelection.waveform}));
// } else {
// setSelection(new StructuredSelection(currentWaveformSelection.waveform));
// }
// waveformCanvas.reveal(currentWaveformSelection.waveform);
// valueList.redraw();
// nameList.redraw();
}
}
}
@ -1201,4 +1220,31 @@ public class WaveformViewer implements IWaveformViewer {
origin.x=(int) (-time/waveformCanvas.getScaleFactorPow10());
waveformCanvas.setOrigin(origin);
}
@Override
public void scrollHorizontal(int percent) {
if(percent<-100) percent=-100;
if(percent>100) percent=100;
int diff = (waveformCanvas.getWidth()*percent)/100;
// ScrollBar sb = waveformCanvas.getHorizontalBar();
// int x = sb.getSelection();
// System.out.println("Setting sb to "+ (x+diff));
// if((x+diff)>0)
// sb.setSelection(x+diff);
// else
// sb.setSelection(0);
Point o = waveformCanvas.getOrigin();
waveformCanvas.setOrigin(o.x-diff, o.y);
waveformCanvas.redraw();
}
public void asyncUpdate(Widget widget) {
widget.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
waveformCanvas.redraw();
updateValueList();
}
});
}
}