From 97a806f9d98a2601064db48f6cd21af8da6a97a2 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 15 Oct 2018 21:55:35 +0200 Subject: [PATCH] Changed selection handling and fixed keycode handling --- .../database/swt/internal/WaveformCanvas.java | 33 ++++++---- .../database/swt/internal/WaveformViewer.java | 27 +++----- .../e4/application/parts/WaveformViewer.java | 64 +++++++++++-------- 3 files changed, 68 insertions(+), 56 deletions(-) diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java index 2845258..3e4bfc5 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java @@ -287,9 +287,13 @@ public class WaveformCanvas extends Canvas { } public void clearAllWaveformPainter() { + clearAllWaveformPainter(true); + } + + void clearAllWaveformPainter(boolean update) { trackAreaPainter.getTrackVerticalOffset().clear(); wave2painterMap.clear(); - syncScrollBars(); + if(update) syncScrollBars(); } public void addWaveformPainter(IWaveformPainter painter) { @@ -350,38 +354,41 @@ public class WaveformCanvas extends Canvas { redraw(); return; } - int height = trackAreaPainter.getHeight(); + int height = trackAreaPainter.getHeight(); // incl. Ruler int width = (int) (maxTime / scaleFactor); + Rectangle clientArea=getClientArea(); ScrollBar horizontal = getHorizontalBar(); horizontal.setIncrement((int) (getClientArea().width / 100)); horizontal.setPageIncrement(getClientArea().width); - int cw = getClientArea().width; - if (width > cw) { /* image is wider than client area */ + int clientWidthw = clientArea.width; + if (width > clientWidthw) { /* image is wider than client area */ + horizontal.setMinimum(0); horizontal.setMaximum(width); horizontal.setEnabled(true); - if (((int) -origin.x) > horizontal.getMaximum() - cw) - origin.x = -horizontal.getMaximum() + cw; + if (((int) -origin.x) > horizontal.getMaximum() - clientWidthw) + origin.x = -horizontal.getMaximum() + clientWidthw; } else { /* image is narrower than client area */ horizontal.setEnabled(false); } + horizontal.setThumb(clientWidthw); horizontal.setSelection(-origin.x); - horizontal.setThumb(cw); ScrollBar vertical = getVerticalBar(); vertical.setIncrement((int) (getClientArea().height / 100)); vertical.setPageIncrement((int) (getClientArea().height)); - int ch = getClientArea().height; - if (height > ch) { /* image is higher than client area */ + int clientHeighth = clientArea.height; + if (height > clientHeighth) { /* image is higher than client area */ + vertical.setMinimum(0); vertical.setMaximum(height); vertical.setEnabled(true); - if (((int) -origin.y) > vertical.getMaximum() - ch) - origin.y = -vertical.getMaximum() + ch; + if (((int) -origin.y) > vertical.getMaximum() - clientHeighth) + origin.y = -vertical.getMaximum() + clientHeighth; } else { /* image is less higher than client area */ - vertical.setMaximum((int) (ch)); + vertical.setMaximum((int) (clientHeighth)); vertical.setEnabled(false); } + vertical.setThumb(clientHeighth); vertical.setSelection(-origin.y); - vertical.setThumb(ch); redraw(); fireSelectionEvent(); 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 6444558..a6ccb23 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 @@ -219,7 +219,7 @@ public class WaveformViewer implements IWaveformViewer { nameFontB = SWTResourceManager.getBoldFont(nameFont); streams = new ObservableList<>(); - streams.addPropertyChangeListener(this); + streams.addPropertyChangeListener("content", this); top = new Composite(parent, SWT.NONE); top.setLayout(new FillLayout(SWT.HORIZONTAL)); @@ -381,22 +381,21 @@ public class WaveformViewer implements IWaveformViewer { }); revealSelected=false; } else - waveformCanvas.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - update(); - } - }); + waveformCanvas.getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + update(); + } + }); } } public void update() { trackVerticalHeight = 0; int nameMaxWidth = 0; - int previousHeight = trackVerticalOffset.size() == 0 ? 0 : trackVerticalOffset.lastKey(); IWaveformPainter painter = null; trackVerticalOffset.clear(); - waveformCanvas.clearAllWaveformPainter(); + waveformCanvas.clearAllWaveformPainter(false); boolean even = true; boolean clearSelection = true; TextLayout tl = new TextLayout(waveformCanvas.getDisplay()); @@ -431,16 +430,8 @@ public class WaveformViewer implements IWaveformViewer { top.layout(new Control[] { valueList, nameList, waveformCanvas }); 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())); } if(clearSelection) setSelection(new StructuredSelection()); - /* System.out.println("updateTracklist() state:"); - for(Entry> entry: trackVerticalOffset.entrySet()){ - System.out.println(" "+entry.getKey()+": " +entry.getValue().getFullName()); - } - */ } private int calculateValueWidth() { @@ -629,7 +620,7 @@ public class WaveformViewer implements IWaveformViewer { } if(currentWaveformSelection!=null) currentWaveformSelection.selected=true; if (selectionChanged) { - waveformCanvas.reveal(currentWaveformSelection.waveform); + if(currentWaveformSelection!=null) waveformCanvas.reveal(currentWaveformSelection.waveform); waveformCanvas.setSelected(currentTxSelection); valueList.redraw(); nameList.redraw(); 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 06cb2d3..5674cba 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 @@ -19,6 +19,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -57,6 +58,7 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseTrackListener; @@ -282,30 +284,18 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis @Override public void handleEvent(Event e) { - int state = e.stateMask & SWT.MODIFIER_MASK; - if(Platform.OS_MACOSX.equals(Platform.getOS())) { //swap cammnd and control for MacOSX - if((state&SWT.COMMAND)!=0) { - state&=~SWT.COMMAND; - state|=SWT.CONTROL; - } else if((state&SWT.CONTROL)!=0) { - state&=~SWT.CONTROL; - state|=SWT.COMMAND; + if(e==null) { // dummy to take out logging + String string = e.type == SWT.KeyDown ? "DOWN:" : "UP :"; + string += " stateMask=0x" + Integer.toHexString (e.stateMask) + ","; // SWT.CTRL, SWT.ALT, SWT.SHIFT, SWT.COMMAND + string += " keyCode=0x" + Integer.toHexString (e.keyCode) + ","; + string += " character=0x" + Integer.toHexString (e.character) ; + if (e.keyLocation != 0) { + string += " location="+e.keyLocation; } + System.out.println (string); } - if(state==SWT.ALT) { - switch(e.keyCode) { - case SWT.ARROW_LEFT: - waveformPane.scrollHorizontal(-100); - return; - case SWT.ARROW_RIGHT: - waveformPane.scrollHorizontal(100); - return; - case SWT.KEYPAD_ADD: - return; - case SWT.KEYPAD_SUBTRACT: - return; - } - } else if(state==SWT.CTRL) { + if((e.stateMask&SWT.MOD3)!=0) { // Alt key + } else if((e.stateMask&SWT.MOD1)!=0) { //Ctrl/Cmd int zoomlevel = waveformPane.getZoomLevel(); switch(e.keyCode) { case '+': @@ -325,7 +315,15 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis waveformPane.moveSelectedTrack(1); return; } - } else if(state==SWT.SHIFT) { + } else if((e.stateMask&SWT.MOD2)!=0) { //Shift + switch(e.keyCode) { + case SWT.ARROW_LEFT: + waveformPane.scrollHorizontal(-100); + return; + case SWT.ARROW_RIGHT: + waveformPane.scrollHorizontal(100); + return; + } } else { switch(e.keyCode) { case SWT.ARROW_LEFT: @@ -344,7 +342,6 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis case SWT.END: return; //TODO: should be handled } } - } }); @@ -800,7 +797,24 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis */ public void removeStreamFromList(IWaveform stream) { TrackEntry trackEntry = waveformPane.getEntryForStream(stream); - waveformPane.getStreamList().remove(trackEntry); + List 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) + newSelection=streams.get(idx-1); + else + newSelection=streams.get(idx+1); + } + waveformPane.setSelection(new StructuredSelection()); + streams.remove(trackEntry); + if(newSelection!=null) { + Object[] o = {newSelection}; + waveformPane.setSelection(new StructuredSelection(o)); + } } /**