From ac942481e34f50a76768053aee8a620aadf0c198 Mon Sep 17 00:00:00 2001 From: ejentzsx Date: Wed, 4 Feb 2015 16:20:59 +0100 Subject: [PATCH] - fixed scrolling sync issue - fixed duplicate db entries --- .../minres/scviewer/database/sqlite/Tx.java | 6 +- .../scviewer/database/swt/TxDisplay.java | 973 +++++++++--------- .../database/swt/internal/StreamPainter.java | 36 +- .../database/swt/internal/WaveformCanvas.java | 617 +++++------ .../database/text/TextDbLoader.groovy | 1 + .../minres/scviewer/database/text/Tx.groovy | 6 +- .../scviewer/database/text/TxEvent.groovy | 15 +- .../scviewer/database/text/TxStream.groovy | 6 +- .../META-INF/MANIFEST.MF | 3 + .../OSGI-INF/component.xml | 4 +- com.minres.scviewer.feature/feature.xml | 26 +- 11 files changed, 849 insertions(+), 844 deletions(-) diff --git a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java index 0082c1c..a9956d0 100644 --- a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java +++ b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java @@ -179,7 +179,11 @@ public class Tx implements ITx { @Override public int compareTo(ITx o) { - return this.getBeginTime().compareTo(o.getBeginTime()); + int res = this.getBeginTime().compareTo(o.getBeginTime()); + if(res!=0) + return res; + else + return this.getId().compareTo(o.getId()); } @Override diff --git a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/TxDisplay.java b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/TxDisplay.java index 7a6cc10..24c52f6 100644 --- a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/TxDisplay.java +++ b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/TxDisplay.java @@ -81,566 +81,529 @@ import com.minres.scviewer.database.swt.internal.TrackPainter; import com.minres.scviewer.database.swt.internal.WaveformCanvas; public class TxDisplay implements PropertyChangeListener, ISelectionProvider, MouseListener { - private ListenerList listeners = new ListenerList(); + private ListenerList listeners = new ListenerList(); - private static final String SELECTION = "selection"; - private ITx currentSelection; - private IWaveform currentWaveformSelection; + private static final String SELECTION = "selection"; + private ITx currentSelection; + private IWaveform currentWaveformSelection; - private ScrolledComposite nameListScrolled; - private ScrolledComposite valueListScrolled; + private ScrolledComposite nameListScrolled; + private ScrolledComposite valueListScrolled; - private Canvas nameList; - private Canvas valueList; - WaveformCanvas trackList; + private Canvas nameList; + private Canvas valueList; + WaveformCanvas trackList; - private Composite top; + private Composite top; - protected ObservableList> streams; - Vector cursorPainters; + protected ObservableList> streams; + Vector cursorPainters; - private Composite trackPane; - private Ruler ruler; - TreeMap> trackVerticalOffset; - HashMap, String> actualValues; - // private long maxTime=0; - private Font nameFont, nameFontB; + private Composite trackPane; + private Ruler ruler; + TreeMap> trackVerticalOffset; + HashMap, String> actualValues; + // private long maxTime=0; + private Font nameFont, nameFontB; - public TxDisplay(Composite parent) { - trackVerticalOffset = new TreeMap>(); - actualValues = new HashMap, String>(); - cursorPainters = new Vector(); + public TxDisplay(Composite parent) { + trackVerticalOffset = new TreeMap>(); + actualValues = new HashMap, String>(); + cursorPainters = new Vector(); - nameFont = parent.getDisplay().getSystemFont(); - nameFontB = SWTResourceManager.getBoldFont(nameFont); + nameFont = parent.getDisplay().getSystemFont(); + nameFontB = SWTResourceManager.getBoldFont(nameFont); - streams = new ObservableList>(); - streams.addPropertyChangeListener(this); + streams = new ObservableList>(); + streams.addPropertyChangeListener(this); - top = new Composite(parent, SWT.NONE); - top.setLayout(new FillLayout(SWT.HORIZONTAL)); + top = new Composite(parent, SWT.NONE); + top.setLayout(new FillLayout(SWT.HORIZONTAL)); - SashForm topSash = new SashForm(top, SWT.SMOOTH); - topSash.setBackground(topSash.getDisplay().getSystemColor( - SWT.COLOR_GRAY)); + SashForm topSash = new SashForm(top, SWT.SMOOTH); + topSash.setBackground(topSash.getDisplay().getSystemColor(SWT.COLOR_GRAY)); - Composite composite = new Composite(topSash, SWT.NONE); - composite.setLayout(new FillLayout(SWT.HORIZONTAL)); + Composite composite = new Composite(topSash, SWT.NONE); + composite.setLayout(new FillLayout(SWT.HORIZONTAL)); - SashForm leftSash = new SashForm(composite, SWT.SMOOTH); - leftSash.setBackground(leftSash.getDisplay().getSystemColor( - SWT.COLOR_GRAY)); + SashForm leftSash = new SashForm(composite, SWT.SMOOTH); + leftSash.setBackground(leftSash.getDisplay().getSystemColor(SWT.COLOR_GRAY)); - Composite namePane = createTextPane(leftSash, "Name"); - namePane.setBackground(namePane.getDisplay().getSystemColor( - SWT.COLOR_WIDGET_BACKGROUND)); + Composite namePane = createTextPane(leftSash, "Name"); + namePane.setBackground(namePane.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); - nameListScrolled = new ScrolledComposite(namePane, SWT.H_SCROLL - | SWT.V_SCROLL); - nameListScrolled.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, - true, 1, 1)); - nameListScrolled.setExpandHorizontal(true); - nameListScrolled.setExpandVertical(true); - nameListScrolled.setAlwaysShowScrollBars(true); - nameListScrolled.addControlListener(new ControlAdapter() { - @Override - public void controlResized(ControlEvent e) { - nameListScrolled.getVerticalBar().setVisible(false); + nameListScrolled = new ScrolledComposite(namePane, SWT.H_SCROLL | SWT.V_SCROLL); + nameListScrolled.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + nameListScrolled.setExpandHorizontal(true); + nameListScrolled.setExpandVertical(true); + nameListScrolled.setAlwaysShowScrollBars(true); + nameListScrolled.addControlListener(new ControlAdapter() { + @Override + public void controlResized(ControlEvent e) { + nameListScrolled.getVerticalBar().setVisible(false); - } - }); - nameList = new Canvas(nameListScrolled, SWT.NONE) { - @Override - public Point computeSize(int wHint, int hHint, boolean changed) { - Rectangle bounds = super.getClientArea(); - return new Point(bounds.width, bounds.height); - } - }; - nameList.addListener(SWT.Paint, new Listener() { - @Override - public void handleEvent(Event event) { - GC gc = event.gc; - Rectangle rect = ((Canvas) event.widget).getClientArea(); - paintNames(gc, rect); - } - }); - nameList.addMouseListener(this); - nameListScrolled.setContent(nameList); + } + }); + nameList = new Canvas(nameListScrolled, SWT.NONE) { + @Override + public Point computeSize(int wHint, int hHint, boolean changed) { + Rectangle bounds = super.getClientArea(); + return new Point(bounds.width, bounds.height); + } + }; + nameList.addListener(SWT.Paint, new Listener() { + @Override + public void handleEvent(Event event) { + GC gc = event.gc; + Rectangle rect = ((Canvas) event.widget).getClientArea(); + paintNames(gc, rect); + } + }); + nameList.addMouseListener(this); + nameListScrolled.setContent(nameList); - Composite valuePane = createTextPane(leftSash, "Value"); - valuePane.setBackground(valuePane.getDisplay().getSystemColor( - SWT.COLOR_WIDGET_BACKGROUND)); - valueListScrolled = new ScrolledComposite(valuePane, SWT.H_SCROLL - | SWT.V_SCROLL); - valueListScrolled.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, - true, 1, 1)); - valueListScrolled.setExpandHorizontal(true); - valueListScrolled.setExpandVertical(true); - valueListScrolled.setAlwaysShowScrollBars(true); - valueListScrolled.addControlListener(new ControlAdapter() { - @Override - public void controlResized(ControlEvent e) { - valueListScrolled.getVerticalBar().setVisible(false); + Composite valuePane = createTextPane(leftSash, "Value"); + valuePane.setBackground(valuePane.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); + valueListScrolled = new ScrolledComposite(valuePane, SWT.H_SCROLL | SWT.V_SCROLL); + valueListScrolled.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + valueListScrolled.setExpandHorizontal(true); + valueListScrolled.setExpandVertical(true); + valueListScrolled.setAlwaysShowScrollBars(true); + valueListScrolled.addControlListener(new ControlAdapter() { + @Override + public void controlResized(ControlEvent e) { + valueListScrolled.getVerticalBar().setVisible(false); - } - }); - valueList = new Canvas(valueListScrolled, SWT.NONE) { - @Override - public Point computeSize(int wHint, int hHint, boolean changed) { - Rectangle bounds = super.getClientArea(); - return new Point(bounds.width, bounds.height); - } - }; - valueList.addListener(SWT.Paint, new Listener() { - @Override - public void handleEvent(Event event) { - GC gc = event.gc; - Rectangle rect = ((Canvas) event.widget).getClientArea(); - paintValues(gc, rect); - } - }); - valueList.addMouseListener(this); - valueListScrolled.setContent(valueList); + } + }); + valueList = new Canvas(valueListScrolled, SWT.NONE) { + @Override + public Point computeSize(int wHint, int hHint, boolean changed) { + Rectangle bounds = super.getClientArea(); + return new Point(bounds.width, bounds.height); + } + }; + valueList.addListener(SWT.Paint, new Listener() { + @Override + public void handleEvent(Event event) { + GC gc = event.gc; + Rectangle rect = ((Canvas) event.widget).getClientArea(); + paintValues(gc, rect); + } + }); + valueList.addMouseListener(this); + valueListScrolled.setContent(valueList); - trackPane = new Composite(topSash, SWT.NONE); - trackPane.setLayout(new BorderLayout(0, 0)); - ruler = new Ruler(trackPane, SWT.NONE); - ruler.setLayoutData(BorderLayout.NORTH); + trackPane = new Composite(topSash, SWT.NONE); + trackPane.setLayout(new BorderLayout(0, 0)); + ruler = new Ruler(trackPane, SWT.NONE); + ruler.setLayoutData(BorderLayout.NORTH); - trackList = new WaveformCanvas(trackPane, SWT.NONE); - trackList.setLayoutData(BorderLayout.CENTER); - trackList.setStreams(streams); - trackList.setRuler(ruler); - trackList.addPainter(new TrackPainter(trackList)); - CursorPainter cp = new CursorPainter(trackList, - trackList.getScaleFactor() * 10); - trackList.addPainter(cp); - cursorPainters.add(cp); - trackList.setMaxTime(1); - trackList.addMouseListener(this); + trackList = new WaveformCanvas(trackPane, SWT.NONE); + trackList.setLayoutData(BorderLayout.CENTER); + trackList.setStreams(streams); + trackList.setRuler(ruler); + trackList.addPainter(new TrackPainter(trackList)); + CursorPainter cp = new CursorPainter(trackList, trackList.getScaleFactor() * 10); + trackList.addPainter(cp); + cursorPainters.add(cp); + trackList.setMaxTime(1); + trackList.addMouseListener(this); - nameListScrolled.getVerticalBar().addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - int y = ((ScrollBar) e.widget).getSelection(); - valueListScrolled.setOrigin( - valueListScrolled.getOrigin().x, y); - trackList.scrollToY(y); - } - }); - valueListScrolled.getVerticalBar().addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - int y = ((ScrollBar) e.widget).getSelection(); - nameListScrolled.setOrigin( - nameListScrolled.getOrigin().x, y); - trackList.scrollToY(y); - } - }); - trackList.getVerticalBar().addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - int y = trackList.getVerticalBar().getSelection(); - nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); - valueListScrolled.setOrigin(valueListScrolled.getOrigin().x, y); - } - }); - topSash.setWeights(new int[] { 30, 70 }); - leftSash.setWeights(new int[] { 75, 25 }); + nameListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + int y = ((ScrollBar) e.widget).getSelection(); + valueListScrolled.setOrigin(valueListScrolled.getOrigin().x, y); + trackList.setOrigin(trackList.getOrigin().x, y); + } + }); + valueListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + int y = ((ScrollBar) e.widget).getSelection(); + nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); + trackList.setOrigin(trackList.getOrigin().x, y); + } + }); + trackList.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + int y = trackList.getVerticalBar().getSelection(); + nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); + valueListScrolled.setOrigin(valueListScrolled.getOrigin().x, y); + } + }); + topSash.setWeights(new int[] { 30, 70 }); + leftSash.setWeights(new int[] { 75, 25 }); - createDragSource(nameList); - createDragSource(valueList); - createDropTarget(nameList); - createDropTarget(valueList); - } + createDragSource(nameList); + createDragSource(valueList); + createDropTarget(nameList); + createDropTarget(valueList); + } - private Composite createTextPane(SashForm leftSash, String text) { - Composite namePane = new Composite(leftSash, SWT.NONE); - GridLayout gl_namePane = new GridLayout(1, false); - gl_namePane.verticalSpacing = 0; - gl_namePane.marginWidth = 0; - gl_namePane.horizontalSpacing = 0; - gl_namePane.marginHeight = 0; - namePane.setLayout(gl_namePane); + private Composite createTextPane(SashForm leftSash, String text) { + Composite namePane = new Composite(leftSash, SWT.NONE); + GridLayout gl_namePane = new GridLayout(1, false); + gl_namePane.verticalSpacing = 0; + gl_namePane.marginWidth = 0; + gl_namePane.horizontalSpacing = 0; + gl_namePane.marginHeight = 0; + namePane.setLayout(gl_namePane); - CLabel nameLabel = new CLabel(namePane, SWT.NONE); - GridData gd_nameLabel = new GridData(SWT.CENTER, SWT.CENTER, true, - false, 1, 1); - gd_nameLabel.heightHint = Ruler.height - 2; - nameLabel.setLayoutData(gd_nameLabel); - nameLabel.setText(text); + CLabel nameLabel = new CLabel(namePane, SWT.NONE); + GridData gd_nameLabel = new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1); + gd_nameLabel.heightHint = Ruler.height - 2; + nameLabel.setLayoutData(gd_nameLabel); + nameLabel.setText(text); - Label nameSep = new Label(namePane, SWT.SEPARATOR | SWT.HORIZONTAL); - nameSep.setBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY)); - nameSep.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK)); - GridData gd_nameSep = new GridData(SWT.FILL, SWT.CENTER, true, false, - 1, 1); - gd_nameSep.heightHint = 2; - nameSep.setLayoutData(gd_nameSep); - return namePane; - } + Label nameSep = new Label(namePane, SWT.SEPARATOR | SWT.HORIZONTAL); + nameSep.setBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY)); + nameSep.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK)); + GridData gd_nameSep = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + gd_nameSep.heightHint = 2; + nameSep.setLayoutData(gd_nameSep); + return namePane; + } - @Override - public void propertyChange(PropertyChangeEvent pce) { - if ("size".equals(pce.getPropertyName())) { - updateTracklist(); - } - } + @Override + public void propertyChange(PropertyChangeEvent pce) { + if ("size".equals(pce.getPropertyName())) { + updateTracklist(); + } + } - @SuppressWarnings("unchecked") - protected void updateTracklist() { - int yoffs = 0; - int nameMaxWidth = 0; - int previousHeight=trackVerticalOffset.size()==0?0: trackVerticalOffset.lastKey(); - IWaveformPainter painter = null; - trackVerticalOffset.clear(); - actualValues.clear(); - trackList.clearAllWavefromPainter(); - boolean even = true; - TextLayout tl = new TextLayout(trackList.getDisplay()); - tl.setFont(nameFontB); - for (IWaveform waveform : streams) { - int height = trackList.getTrackHeight(); - if (waveform instanceof ITxStream) { - height *= ((ITxStream) waveform).getMaxConcurrency(); - painter = new StreamPainter(trackList, even, height, (ITxStream) waveform); - actualValues.put(waveform, ""); - } else if (waveform instanceof ISignal) { - painter = new SignalPainter(trackList, even, height, - (ISignal) waveform); - actualValues.put(waveform, "---"); - } - trackList.addWavefromPainter(yoffs, painter); - trackVerticalOffset.put(yoffs, waveform); - tl.setText(waveform.getFullName()); - nameMaxWidth = Math.max(nameMaxWidth, tl.getBounds().width); - yoffs += height; - even = !even; - } - nameList.setSize(nameMaxWidth + 15, yoffs); - nameListScrolled.setMinSize(nameMaxWidth + 15, yoffs); - valueList.setSize(calculateValueWidth(), yoffs); - valueListScrolled.setMinSize(calculateValueWidth(), yoffs); - nameList.redraw(); - valueList.redraw(); - trackList.redraw(); - top.layout(new Control[] { valueList, nameList, trackList }); - if(previousHeight>trackVerticalOffset.lastKey()){ - trackList.scrollToY(trackList.getOrigin().y-(previousHeight-trackVerticalOffset.lastKey())); - } - setSelection(new StructuredSelection()); - } + @SuppressWarnings("unchecked") + protected void updateTracklist() { + int yoffs = 0; + int nameMaxWidth = 0; + int previousHeight = trackVerticalOffset.size() == 0 ? 0 : trackVerticalOffset.lastKey(); + IWaveformPainter painter = null; + trackVerticalOffset.clear(); + actualValues.clear(); + trackList.clearAllWavefromPainter(); + boolean even = true; + TextLayout tl = new TextLayout(trackList.getDisplay()); + tl.setFont(nameFontB); + for (IWaveform waveform : streams) { + int height = trackList.getTrackHeight(); + if (waveform instanceof ITxStream) { + height *= ((ITxStream) waveform).getMaxConcurrency(); + painter = new StreamPainter(trackList, even, height, (ITxStream) waveform); + actualValues.put(waveform, ""); + } else if (waveform instanceof ISignal) { + painter = new SignalPainter(trackList, even, height, (ISignal) waveform); + actualValues.put(waveform, "---"); + } + trackList.addWavefromPainter(yoffs, painter); + trackVerticalOffset.put(yoffs, waveform); + tl.setText(waveform.getFullName()); + nameMaxWidth = Math.max(nameMaxWidth, tl.getBounds().width); + yoffs += height; + even = !even; + } + nameList.setSize(nameMaxWidth + 15, yoffs); + nameListScrolled.setMinSize(nameMaxWidth + 15, yoffs); + valueList.setSize(calculateValueWidth(), yoffs); + valueListScrolled.setMinSize(calculateValueWidth(), yoffs); + nameList.redraw(); + valueList.redraw(); + trackList.redraw(); + top.layout(new Control[] { valueList, nameList, trackList }); + if (previousHeight > trackVerticalOffset.lastKey()) { + Point o = trackList.getOrigin(); + trackList.setOrigin(o.x, o.y - (previousHeight - trackVerticalOffset.lastKey())); + } + setSelection(new StructuredSelection()); + } - private int calculateValueWidth() { - TextLayout tl = new TextLayout(trackList.getDisplay()); - tl.setFont(nameFontB); - int valueMaxWidth = 0; - for (String v : actualValues.values()) { - tl.setText(v); - valueMaxWidth = Math.max(valueMaxWidth, tl.getBounds().width); - } - return valueMaxWidth + 15; - } + private int calculateValueWidth() { + TextLayout tl = new TextLayout(trackList.getDisplay()); + tl.setFont(nameFontB); + int valueMaxWidth = 0; + for (String v : actualValues.values()) { + tl.setText(v); + valueMaxWidth = Math.max(valueMaxWidth, tl.getBounds().width); + } + return valueMaxWidth + 15; + } - @Override - public void addSelectionChangedListener(ISelectionChangedListener listener) { - listeners.add(listener); - } + @Override + public void addSelectionChangedListener(ISelectionChangedListener listener) { + listeners.add(listener); + } - @Override - public void removeSelectionChangedListener( - ISelectionChangedListener listener) { - listeners.remove(listener); - } + @Override + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + listeners.remove(listener); + } - public Control getControl(){ - return top; - } - - @Override - public ISelection getSelection() { - if (currentSelection != null) - return new StructuredSelection(currentSelection); - else if (currentWaveformSelection != null) - return new StructuredSelection(currentWaveformSelection); - else - return null; - } + public Control getControl() { + return top; + } - @SuppressWarnings("unchecked") - @Override - public void setSelection(ISelection selection) { - boolean selectionChanged = false; - if (selection instanceof IStructuredSelection) { - Object sel = ((IStructuredSelection) selection).getFirstElement(); - if (sel instanceof ITx && currentSelection != sel) { - currentSelection = (ITx) sel; - currentWaveformSelection = currentSelection.getStream(); - selectionChanged = true; - } else if (sel instanceof IWaveform - && currentWaveformSelection != sel) { - currentSelection = null; - currentWaveformSelection = (IWaveform) sel; - selectionChanged = true; - } - } else { - if (currentSelection != null || currentWaveformSelection != null) - selectionChanged = true; - currentSelection = null; - currentWaveformSelection = null; - } - if(currentWaveformSelection!=null && !streams.contains(currentWaveformSelection)){ - streams.add(currentWaveformSelection); - } - if (selectionChanged) { - trackList.setSelected(currentSelection, currentWaveformSelection); - nameList.setData(SELECTION, currentWaveformSelection); - valueList.redraw(); - nameList.redraw(); - Object[] list = listeners.getListeners(); - for (int i = 0; i < list.length; i++) { - ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); - } - } - } + @Override + public ISelection getSelection() { + if (currentSelection != null) + return new StructuredSelection(currentSelection); + else if (currentWaveformSelection != null) + return new StructuredSelection(currentWaveformSelection); + else + return null; + } - @SuppressWarnings("unchecked") - public void moveSelection(GotoDirection direction) { - if (currentWaveformSelection instanceof ITxStream) { - ITxStream stream = (ITxStream) currentWaveformSelection; - ITx transaction = null; - if (direction == GotoDirection.NEXT) { - Entry> entry = stream.getEvents().higherEntry(currentSelection.getBeginTime()); - if (entry != null) - do { - for (ITxEvent evt : entry.getValue()) { - if (evt.getType() == ITxEvent.Type.BEGIN) { - transaction = evt.getTransaction(); - break; - } - } - if (transaction == null) - entry = stream.getEvents().higherEntry(entry.getKey()); - } while (entry != null && transaction == null); - } else if (direction == GotoDirection.PREV) { - Entry> entry = stream.getEvents().lowerEntry(currentSelection.getBeginTime()); - if (entry != null) - do { - for (ITxEvent evt : entry.getValue()) { - if (evt.getType() == ITxEvent.Type.BEGIN) - transaction = evt.getTransaction(); - break; - } - if (transaction == null) - entry = stream.getEvents().lowerEntry(entry.getKey()); - } while (entry != null && transaction == null); - } - if (transaction != null) { - setSelection(new StructuredSelection(transaction)); - } - } - } + @SuppressWarnings("unchecked") + @Override + public void setSelection(ISelection selection) { + boolean selectionChanged = false; + if (selection instanceof IStructuredSelection) { + Object sel = ((IStructuredSelection) selection).getFirstElement(); + if (sel instanceof ITx && currentSelection != sel) { + currentSelection = (ITx) sel; + currentWaveformSelection = currentSelection.getStream(); + selectionChanged = true; + } else if (sel instanceof IWaveform && currentWaveformSelection != sel) { + currentSelection = null; + currentWaveformSelection = (IWaveform) sel; + selectionChanged = true; + } + } else { + if (currentSelection != null || currentWaveformSelection != null) + selectionChanged = true; + currentSelection = null; + currentWaveformSelection = null; + } + if (currentWaveformSelection != null && !streams.contains(currentWaveformSelection)) { + streams.add(currentWaveformSelection); + } + if (selectionChanged) { + trackList.setSelected(currentSelection, currentWaveformSelection); + nameList.setData(SELECTION, currentWaveformSelection); + valueList.redraw(); + nameList.redraw(); + Object[] list = listeners.getListeners(); + for (int i = 0; i < list.length; i++) { + ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); + } + } + } - @Override - public void mouseDoubleClick(MouseEvent e) { - } + @SuppressWarnings("unchecked") + public void moveSelection(GotoDirection direction) { + if (currentWaveformSelection instanceof ITxStream) { + ITxStream stream = (ITxStream) currentWaveformSelection; + ITx transaction = null; + if (direction == GotoDirection.NEXT) { + Entry> entry = stream.getEvents().higherEntry(currentSelection.getBeginTime()); + if (entry != null) + do { + for (ITxEvent evt : entry.getValue()) { + if (evt.getType() == ITxEvent.Type.BEGIN) { + transaction = evt.getTransaction(); + break; + } + } + if (transaction == null) + entry = stream.getEvents().higherEntry(entry.getKey()); + } while (entry != null && transaction == null); + } else if (direction == GotoDirection.PREV) { + Entry> entry = stream.getEvents().lowerEntry(currentSelection.getBeginTime()); + if (entry != null) + do { + System.out.println(currentSelection.getBeginTime() + " -> " + entry.getKey()); + for (ITxEvent evt : entry.getValue()) { + System.out.println("\t-> " + evt.toString()); + if (evt.getType() == ITxEvent.Type.BEGIN) { + transaction = evt.getTransaction(); + break; + } + } + if (transaction == null) + entry = stream.getEvents().lowerEntry(entry.getKey()); + } while (entry != null && transaction == null); + } + if (transaction != null) { + setSelection(new StructuredSelection(transaction)); + } + } + } - @Override - public void mouseDown(MouseEvent e) { - if(e.button==1 || e.button==3){ - if (e.widget == trackList) { - Object o = trackList.getClicked(new Point(e.x, e.y)); - if (o != null) - setSelection(new StructuredSelection(o)); - } else if (e.widget == valueList || e.widget == nameList) { - Entry> entry = trackVerticalOffset - .floorEntry(e.y); - if (entry != null) - setSelection(new StructuredSelection(entry.getValue())); - } - } - if(e.button==3){ - top.getMenu().setVisible(true); - } - } + @Override + public void mouseDoubleClick(MouseEvent e) { + } - @Override - public void mouseUp(MouseEvent e) { - } + @Override + public void mouseDown(MouseEvent e) { + if (e.button == 1 || e.button == 3) { + if (e.widget == trackList) { + Object o = trackList.getClicked(new Point(e.x, e.y)); + if (o != null) + setSelection(new StructuredSelection(o)); + } else if (e.widget == valueList || e.widget == nameList) { + Entry> entry = trackVerticalOffset.floorEntry(e.y); + if (entry != null) + setSelection(new StructuredSelection(entry.getValue())); + } + } + if (e.button == 3) { + top.getMenu().setVisible(true); + } + } - public List> getStreamList() { - return streams; - } + @Override + public void mouseUp(MouseEvent e) { + } - protected void paintNames(GC gc, Rectangle rect) { - if (streams.size() > 0) { - @SuppressWarnings("unchecked") - IWaveform wave = (IWaveform) nameList - .getData(SELECTION); - Integer firstKey = trackVerticalOffset.floorKey(rect.y); - if (firstKey == null) - firstKey = trackVerticalOffset.firstKey(); - Integer lastKey = trackVerticalOffset - .floorKey(rect.y + rect.height); - Rectangle subArea = new Rectangle(rect.x, 0, rect.width, - trackList.getTrackHeight()); - if (lastKey == firstKey) { - IWaveform w = trackVerticalOffset - .get(firstKey); - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawTextFormat(gc, subArea, firstKey, w.getFullName(), - wave != null && w.getId() == wave.getId()); - } else { - for (Entry> entry : trackVerticalOffset - .subMap(firstKey, true, lastKey, true).entrySet()) { - IWaveform w = entry.getValue(); - subArea.height = trackList.getTrackHeight(); - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w) - .getMaxConcurrency(); - drawTextFormat(gc, subArea, entry.getKey(), - w.getFullName(), - wave != null && w.getId() == wave.getId()); - } - } - } - } + public List> getStreamList() { + return streams; + } - @SuppressWarnings("unchecked") - protected void paintValues(GC gc, Rectangle rect) { - if (streams.size() > 0) { - IWaveform wave = (IWaveform) nameList - .getData(SELECTION); - Integer firstKey = trackVerticalOffset.floorKey(rect.y); - if (firstKey == null) - firstKey = trackVerticalOffset.firstKey(); - Integer lastKey = trackVerticalOffset - .floorKey(rect.y + rect.height); - Rectangle subArea = new Rectangle(rect.x, 0, rect.width, - trackList.getTrackHeight()); - if (lastKey == firstKey) { - IWaveform w = trackVerticalOffset - .get(firstKey); - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawTextFormat(gc, subArea, firstKey, actualValues.get(w), - wave != null && w.getId() == wave.getId()); - } else { - for (Entry> entry : trackVerticalOffset - .subMap(firstKey, true, lastKey, true).entrySet()) { - IWaveform w = entry.getValue(); - subArea.height = trackList.getTrackHeight(); - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w) - .getMaxConcurrency(); - drawTextFormat(gc, subArea, entry.getKey(), - actualValues.get(w), wave != null - && w.getId() == wave.getId()); - } - } - } - } + protected void paintNames(GC gc, Rectangle rect) { + if (streams.size() > 0) { + @SuppressWarnings("unchecked") + IWaveform wave = (IWaveform) nameList.getData(SELECTION); + Integer firstKey = trackVerticalOffset.floorKey(rect.y); + if (firstKey == null) + firstKey = trackVerticalOffset.firstKey(); + Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); + Rectangle subArea = new Rectangle(rect.x, 0, rect.width, trackList.getTrackHeight()); + if (lastKey == firstKey) { + IWaveform w = trackVerticalOffset.get(firstKey); + if (w instanceof ITxStream) + subArea.height *= ((ITxStream) w).getMaxConcurrency(); + drawTextFormat(gc, subArea, firstKey, w.getFullName(), wave != null && w.getId() == wave.getId()); + } else { + for (Entry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) + .entrySet()) { + IWaveform w = entry.getValue(); + subArea.height = trackList.getTrackHeight(); + if (w instanceof ITxStream) + subArea.height *= ((ITxStream) w).getMaxConcurrency(); + drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), wave != null && w.getId() == wave.getId()); + } + } + } + } - protected void drawTextFormat(GC gc, Rectangle subArea, int yOffset, - String value, boolean highlite) { - Point size = gc.textExtent(value); - if (highlite) { - gc.setBackground(SWTResourceManager - .getColor(SWT.COLOR_LIST_SELECTION)); - gc.setForeground(SWTResourceManager - .getColor(SWT.COLOR_LIST_SELECTION_TEXT)); - gc.fillRectangle(subArea.x, subArea.y + yOffset, subArea.width, - subArea.height); - gc.setFont(nameFontB); - } else { - gc.setBackground(SWTResourceManager - .getColor(SWT.COLOR_LIST_BACKGROUND)); - gc.setForeground(SWTResourceManager - .getColor(SWT.COLOR_LIST_FOREGROUND)); - gc.setFont(nameFont); - } - gc.drawText( - value, - subArea.x + 5, - subArea.y + yOffset + (trackList.getTrackHeight() - size.y) / 2, - true); - } + @SuppressWarnings("unchecked") + protected void paintValues(GC gc, Rectangle rect) { + if (streams.size() > 0) { + IWaveform wave = (IWaveform) nameList.getData(SELECTION); + Integer firstKey = trackVerticalOffset.floorKey(rect.y); + if (firstKey == null) + firstKey = trackVerticalOffset.firstKey(); + Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); + Rectangle subArea = new Rectangle(rect.x, 0, rect.width, trackList.getTrackHeight()); + if (lastKey == firstKey) { + IWaveform w = trackVerticalOffset.get(firstKey); + if (w instanceof ITxStream) + subArea.height *= ((ITxStream) w).getMaxConcurrency(); + drawTextFormat(gc, subArea, firstKey, actualValues.get(w), wave != null && w.getId() == wave.getId()); + } else { + for (Entry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) + .entrySet()) { + IWaveform w = entry.getValue(); + subArea.height = trackList.getTrackHeight(); + if (w instanceof ITxStream) + subArea.height *= ((ITxStream) w).getMaxConcurrency(); + drawTextFormat(gc, subArea, entry.getKey(), actualValues.get(w), wave != null && w.getId() == wave.getId()); + } + } + } + } - public long getMaxTime() { - return trackList.getMaxTime(); - } + protected void drawTextFormat(GC gc, Rectangle subArea, int yOffset, String value, boolean highlite) { + Point size = gc.textExtent(value); + if (highlite) { + gc.setBackground(SWTResourceManager.getColor(SWT.COLOR_LIST_SELECTION)); + gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_LIST_SELECTION_TEXT)); + gc.fillRectangle(subArea.x, subArea.y + yOffset, subArea.width, subArea.height); + gc.setFont(nameFontB); + } else { + gc.setBackground(SWTResourceManager.getColor(SWT.COLOR_LIST_BACKGROUND)); + gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_LIST_FOREGROUND)); + gc.setFont(nameFont); + } + gc.drawText(value, subArea.x + 5, subArea.y + yOffset + (trackList.getTrackHeight() - size.y) / 2, true); + } - public void setMaxTime(long maxTime) { - this.trackList.setMaxTime(maxTime); - } + public long getMaxTime() { + return trackList.getMaxTime(); + } - public void setZoomLevel(int scale) { - trackList.setZoomLevel(scale); - } + public void setMaxTime(long maxTime) { + this.trackList.setMaxTime(maxTime); + } - public int getZoomLevel() { - return trackList.getZoomLevel(); - } + public void setZoomLevel(int scale) { + trackList.setZoomLevel(scale); + } - private void createDragSource(final Canvas sourceText) { - Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; - DragSource dragSource = new DragSource(sourceText, DND.DROP_MOVE); - dragSource.setTransfer(types); - dragSource.addDragListener(new DragSourceListener() { + public int getZoomLevel() { + return trackList.getZoomLevel(); + } - public void dragStart(DragSourceEvent event) { - if (event.y < trackVerticalOffset.lastKey() + trackList.getTrackHeight()) { -// event.data = trackVerticalOffset.floorEntry(event.y).getValue().getFullName(); - event.doit = true; -// System.out.println("dragStart at location "+new Point(event.x, event.y)); - } - } + private void createDragSource(final Canvas sourceText) { + Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; + DragSource dragSource = new DragSource(sourceText, DND.DROP_MOVE); + dragSource.setTransfer(types); + dragSource.addDragListener(new DragSourceListener() { - public void dragSetData(DragSourceEvent event) { - event.data = trackVerticalOffset.floorEntry(event.y).getValue().getFullName(); -// System.out.println("dragSetData with data " + event.data); - } + public void dragStart(DragSourceEvent event) { + if (event.y < trackVerticalOffset.lastKey() + trackList.getTrackHeight()) { + // event.data = + // trackVerticalOffset.floorEntry(event.y).getValue().getFullName(); + event.doit = true; + // System.out.println("dragStart at location "+new + // Point(event.x, event.y)); + } + } - public void dragFinished(DragSourceEvent event) { - // do nothing - } - }); - } + public void dragSetData(DragSourceEvent event) { + event.data = trackVerticalOffset.floorEntry(event.y).getValue().getFullName(); + // System.out.println("dragSetData with data " + event.data); + } - private void createDropTarget(final Canvas targetText) { - Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; - DropTarget dropTarget = new DropTarget(targetText, DND.DROP_MOVE); - dropTarget.setTransfer(types); + public void dragFinished(DragSourceEvent event) { + // do nothing + } + }); + } - dropTarget.addDropListener(new DropTargetListener() { + private void createDropTarget(final Canvas targetText) { + Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; + DropTarget dropTarget = new DropTarget(targetText, DND.DROP_MOVE); + dropTarget.setTransfer(types); - public void dragEnter(DropTargetEvent event) { - } + dropTarget.addDropListener(new DropTargetListener() { - public void dragLeave(DropTargetEvent event) { - } + public void dragEnter(DropTargetEvent event) { + } - public void dragOperationChanged(DropTargetEvent event) { - } + public void dragLeave(DropTargetEvent event) { + } - public void dragOver(DropTargetEvent event) { - } + public void dragOperationChanged(DropTargetEvent event) { + } - public void drop(DropTargetEvent event) { - Object data = event.data; - DropTarget tgt = (DropTarget) event.widget; - Point dropPoint = ((Canvas)tgt.getControl()).toControl(event.x, event.y); - String fullname1 = trackVerticalOffset.floorEntry(dropPoint.y).getValue().getFullName(); -// System.out.println("drop with data '" + event.data +"' at location "+dropPoint + " and origin " + nameListScrolled.getOrigin()); -// System.out.println("drop on " + fullname1); - } + public void dragOver(DropTargetEvent event) { + } - public void dropAccept(DropTargetEvent event) { - if (event.detail != DND.DROP_MOVE || event.y > trackVerticalOffset.lastKey() + trackList.getTrackHeight()) { - event.detail = DND.DROP_NONE; - } - } - }); - } + public void drop(DropTargetEvent event) { + Object data = event.data; + DropTarget tgt = (DropTarget) event.widget; + Point dropPoint = ((Canvas) tgt.getControl()).toControl(event.x, event.y); + String fullname1 = trackVerticalOffset.floorEntry(dropPoint.y).getValue().getFullName(); + // System.out.println("drop with data '" + event.data + // +"' at location "+dropPoint + " and origin " + + // nameListScrolled.getOrigin()); + // System.out.println("drop on " + fullname1); + } + + public void dropAccept(DropTargetEvent event) { + if (event.detail != DND.DROP_MOVE || event.y > trackVerticalOffset.lastKey() + trackList.getTrackHeight()) { + event.detail = DND.DROP_NONE; + } + } + }); + } } diff --git a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java index 005b12f..9026ee4 100644 --- a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java +++ b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java @@ -68,35 +68,37 @@ public class StreamPainter implements IWaveformPainter{ for(int y1=area.y+this.waveCanvas.getTrackHeight()/2; y1)firstTx.getValue()) - drawTx(gc, area, x.getTransaction()); + for(ITxEvent txEvent:(Collection)firstTx.getValue()) + drawTx(gc, area, txEvent.getTransaction()); else{ seenTx.clear(); NavigableMap entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true); - for(Entry tx: entries.entrySet()) - for(ITxEvent x:(Collection)tx.getValue()){ - if(x.getType()==ITxEvent.Type.BEGIN) - seenTx.add(x.getTransaction()); - if(x.getType()==ITxEvent.Type.END){ - drawTx(gc, area, x.getTransaction()); - seenTx.remove(x.getTransaction()); + boolean highlighed=false; + gc.setForeground(this.waveCanvas.colors[WaveformCanvas.Colors.LINE.ordinal()]); + gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TX_BG.ordinal()]); + for(Entry entry: entries.entrySet()) + for(ITxEvent txEvent:(Collection)entry.getValue()){ + if(txEvent.getType()==ITxEvent.Type.BEGIN) + seenTx.add(txEvent.getTransaction()); + if(txEvent.getType()==ITxEvent.Type.END){ + ITx tx = txEvent.getTransaction(); + highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.getId()==tx.getId(); + drawTx(gc, area, tx); + seenTx.remove(tx); } - } for(ITx tx:seenTx){ drawTx(gc, area, tx); } + if(highlighed){ + gc.setForeground(this.waveCanvas.colors[WaveformCanvas.Colors.LINE_HIGHLITE.ordinal()]); + gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TX_BG_HIGHLITE.ordinal()]); + drawTx(gc, area, waveCanvas.currentSelection); + } } } protected void drawTx(GC gc, Rectangle area, ITx tx) { - if(waveCanvas.currentSelection!=null && waveCanvas.currentSelection.getId()==tx.getId()){ - gc.setForeground(this.waveCanvas.colors[WaveformCanvas.Colors.LINE_HIGHLITE.ordinal()]); - gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TX_BG_HIGHLITE.ordinal()]); - }else { - gc.setForeground(this.waveCanvas.colors[WaveformCanvas.Colors.LINE.ordinal()]); - gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TX_BG.ordinal()]); - } int offset = tx.getConcurrencyIndex()*this.waveCanvas.getTrackHeight(); Rectangle bb = new Rectangle( (int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+upper, diff --git a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java index 22f73af..83496fc 100644 --- a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java +++ b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java @@ -32,6 +32,7 @@ import org.eclipse.swt.graphics.Transform; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.wb.swt.SWTResourceManager; @@ -41,340 +42,348 @@ import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformEvent; public class WaveformCanvas extends Canvas { - public enum Colors { - LINE, - LINE_HIGHLITE, - TRACK_BG_EVEN, - TRACK_BG_HIGHLITE, - TRACK_BG_ODD, - TX_BG, - TX_BG_HIGHLITE, - TX_BORDER, - SIGNAL0, - SIGNAL1, - SIGNALZ, - SIGNALX, - SIGNAL_TEXT, - CURSOR - } + public enum Colors { + LINE, LINE_HIGHLITE, TRACK_BG_EVEN, TRACK_BG_HIGHLITE, TRACK_BG_ODD, TX_BG, TX_BG_HIGHLITE, TX_BORDER, SIGNAL0, SIGNAL1, SIGNALZ, SIGNALX, SIGNAL_TEXT, CURSOR + } - Color[] colors=new Color[Colors.values().length]; - - private int trackHeight = 50; - private long scaleFactor = 1000000L; - private int level=6; - private long maxTime; - protected Point origin; /* original size */ - protected Transform transform; - protected Ruler ruler; - protected List painterList; - TreeMap trackVerticalOffset; - - protected List> streams; + Color[] colors = new Color[Colors.values().length]; - ITx currentSelection; - IWaveform currentWaveformSelection; + private int trackHeight = 50; + private long scaleFactor = 1000000L; + private int level = 6; + private long maxTime; + protected Point origin; /* original size */ + protected Transform transform; + protected Ruler ruler; + protected List painterList; + TreeMap trackVerticalOffset; + protected List> streams; - /** - * Constructor for ScrollableCanvas. - * @param parent the parent of this control. - * @param style the style of this control. - */ - public WaveformCanvas(final Composite parent, int style) { - super( parent, style |SWT.DOUBLE_BUFFERED| SWT.NO_BACKGROUND|SWT.NO_REDRAW_RESIZE|SWT.V_SCROLL|SWT.H_SCROLL); - addControlListener(new ControlAdapter() { /* resize listener. */ - public void controlResized(ControlEvent event) { - syncScrollBars(); - } - }); - addPaintListener(new PaintListener() { /* paint listener. */ - public void paintControl(final PaintEvent event) { - paint(event.gc); - } - }); - painterList=new LinkedList(); - origin=new Point(0,0); - transform = new Transform(getDisplay()); - trackVerticalOffset=new TreeMap(); - initScrollBars(); - initColors(null); - } + ITx currentSelection; + IWaveform currentWaveformSelection; - private void initColors(HashMap colourMap){ - Display d = getDisplay(); - if(colourMap!=null){ - for(Colors c:Colors.values()){ - if(colourMap.containsKey(c)){ - colors[c.ordinal()].dispose(); - colors[c.ordinal()]=new Color(d, colourMap.get(c)); - } - } - } else { - colors[Colors.LINE.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_RED); - colors[Colors.LINE_HIGHLITE.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_CYAN); - colors[Colors.TRACK_BG_EVEN.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_BLACK); - colors[Colors.TRACK_BG_ODD.ordinal()]=SWTResourceManager.getColor(40,40,40); - colors[Colors.TRACK_BG_HIGHLITE.ordinal()]=SWTResourceManager.getColor(40,40,80); - colors[Colors.TX_BG.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_GREEN); - colors[Colors.TX_BG_HIGHLITE.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN); - colors[Colors.TX_BORDER.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_RED); - colors[Colors.SIGNAL0.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN); - colors[Colors.SIGNAL1.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN); - colors[Colors.SIGNALZ.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_GRAY); - colors[Colors.SIGNALX.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_RED); - colors[Colors.SIGNAL_TEXT.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_WHITE); - colors[Colors.CURSOR.ordinal()]=SWTResourceManager.getColor(SWT.COLOR_YELLOW); - } - } + private List selectionListeners; - public List> getStreams() { - return streams; - } + /** + * Constructor for ScrollableCanvas. + * + * @param parent + * the parent of this control. + * @param style + * the style of this control. + */ + public WaveformCanvas(final Composite parent, int style) { + super(parent, style | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE | SWT.V_SCROLL | SWT.H_SCROLL); + addControlListener(new ControlAdapter() { /* resize listener. */ + public void controlResized(ControlEvent event) { + syncScrollBars(); + } + }); + addPaintListener(new PaintListener() { /* paint listener. */ + public void paintControl(final PaintEvent event) { + paint(event.gc); + } + }); + painterList = new LinkedList(); + origin = new Point(0, 0); + transform = new Transform(getDisplay()); + trackVerticalOffset = new TreeMap(); + selectionListeners = new LinkedList<>(); + initScrollBars(); + initColors(null); + } - public void setStreams(List> streams) { - this.streams = streams; - } + private void initColors(HashMap colourMap) { + Display d = getDisplay(); + if (colourMap != null) { + for (Colors c : Colors.values()) { + if (colourMap.containsKey(c)) { + colors[c.ordinal()].dispose(); + colors[c.ordinal()] = new Color(d, colourMap.get(c)); + } + } + } else { + colors[Colors.LINE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[Colors.LINE_HIGHLITE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_CYAN); + colors[Colors.TRACK_BG_EVEN.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_BLACK); + colors[Colors.TRACK_BG_ODD.ordinal()] = SWTResourceManager.getColor(40, 40, 40); + colors[Colors.TRACK_BG_HIGHLITE.ordinal()] = SWTResourceManager.getColor(40, 40, 80); + colors[Colors.TX_BG.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN); + colors[Colors.TX_BG_HIGHLITE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN); + colors[Colors.TX_BORDER.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[Colors.SIGNAL0.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN); + colors[Colors.SIGNAL1.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN); + colors[Colors.SIGNALZ.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GRAY); + colors[Colors.SIGNALX.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[Colors.SIGNAL_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE); + colors[Colors.CURSOR.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_YELLOW); + } + } - public Ruler getRuler(){ - return ruler; - } - - public void setRuler(Ruler ruler) { - this.ruler=ruler; - } + public List> getStreams() { + return streams; + } - public Point getOrigin() { - return origin; - } + public void setStreams(List> streams) { + this.streams = streams; + } - public long getMaxTime() { - return maxTime; - } + public Ruler getRuler() { + return ruler; + } - public void setMaxTime(long maxTime){ - this.maxTime=maxTime; - syncScrollBars(); - } + public void setRuler(Ruler ruler) { + this.ruler = ruler; + } - public int getTrackHeight() { - return trackHeight; - } + public Point getOrigin() { + return origin; + } - public void setTrackHeight(int trackHeight) { - this.trackHeight = trackHeight; - syncScrollBars(); - } + public void setOrigin(Point origin) { + setOrigin(origin.x, origin.y); + } - public void setZoomLevel(int level) { - this.level=level; - this.scaleFactor = (long) Math.pow(10, level); - if(ruler!=null) ruler.setStartPoint(-origin.x*scaleFactor); - syncScrollBars(); - } + public void setOrigin(int x, int y) { + checkWidget(); + ScrollBar hBar = getHorizontalBar(); + hBar.setSelection(-x); + x = -hBar.getSelection(); + ScrollBar vBar = getVerticalBar(); + vBar.setSelection(-y); + y = -vBar.getSelection(); + origin.x = x; + origin.y = y; + syncScrollBars(); + } - public int getZoomLevel() { - return level; - } - - public long getScaleFactor() { - return scaleFactor; - } + public long getMaxTime() { + return maxTime; + } - public void addPainter(IPainter painter) { - painterList.add(painter); - redraw(); - } + public void setMaxTime(long maxTime) { + this.maxTime = maxTime; + syncScrollBars(); + } - public void removePainter(IPainter painter){ - painterList.remove(painter); - redraw(); - } + public int getTrackHeight() { + return trackHeight; + } - public void clearAllWavefromPainter() { - trackVerticalOffset.clear(); - syncScrollBars(); - } + public void setTrackHeight(int trackHeight) { + this.trackHeight = trackHeight; + syncScrollBars(); + } - public void addWavefromPainter(int yoffs, IWaveformPainter painter) { - trackVerticalOffset.put(yoffs, painter); - syncScrollBars(); - } + public void setZoomLevel(int level) { + this.level = level; + this.scaleFactor = (long) Math.pow(10, level); + if (ruler != null) + ruler.setStartPoint(-origin.x * scaleFactor); + syncScrollBars(); + } - /** - * Dispose the garbage here - */ - public void dispose() { - transform.dispose(); - for(Colors c:Colors.values()) colors[c.ordinal()].dispose(); - super.dispose(); - } + public int getZoomLevel() { + return level; + } - public void scrollToY(int y){ - ScrollBar vBar = getVerticalBar(); - vBar.setSelection(y); - scrollVertically(vBar); - } + public long getScaleFactor() { + return scaleFactor; + } - public void scrollToX(int x){ - ScrollBar hBar = getHorizontalBar(); - hBar.setSelection(x); - scrollHorizontally(hBar); - } - - /* Scroll horizontally */ - private void scrollHorizontally(ScrollBar scrollBar) { - if (painterList.size()==0) return; - origin.x= -scrollBar.getSelection(); - if(ruler!=null) ruler.setStartPoint(-origin.x*scaleFactor); - syncScrollBars(); - } + public void addPainter(IPainter painter) { + painterList.add(painter); + redraw(); + } - /* Scroll vertically */ - private void scrollVertically(ScrollBar scrollBar) { - if (painterList.size()==0) return; - origin.y = -scrollBar.getSelection(); - syncScrollBars(); - } + public void removePainter(IPainter painter) { + painterList.remove(painter); + redraw(); + } - /* Initalize the scrollbar and register listeners. */ - private void initScrollBars() { - ScrollBar horizontal = getHorizontalBar(); - horizontal.setEnabled(false); - horizontal.setVisible(true); - horizontal.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent event) { - scrollHorizontally((ScrollBar) event.widget); - } - }); - ScrollBar vertical = getVerticalBar(); - vertical.setEnabled(false); - vertical.setVisible(true); - vertical.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent event) { - scrollVertically((ScrollBar) event.widget); - } - }); - } + public void clearAllWavefromPainter() { + trackVerticalOffset.clear(); + syncScrollBars(); + } - /** - * Synchronize the scrollbar with the image. If the transform is out - * of range, it will correct it. This function considers only following - * factors : transform, image size, client area. - */ - private void syncScrollBars() { - if (painterList.size()==0) { - redraw(); - return; - } - int height=1; - if(trackVerticalOffset.size()>0) - height=trackVerticalOffset.lastKey()+trackVerticalOffset.lastEntry().getValue().getMinHeight(); - - int width = (int) (maxTime/scaleFactor); - 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 */ - horizontal.setMaximum(width); - horizontal.setEnabled(true); - if (((int) - origin.x) > horizontal.getMaximum() - cw) - origin.x = -horizontal.getMaximum() + cw; - } else { /* image is narrower than client area */ - horizontal.setEnabled(false); - } - horizontal.setSelection(-origin.x); - horizontal.setThumb(cw); + public void addWavefromPainter(int yoffs, IWaveformPainter painter) { + trackVerticalOffset.put(yoffs, painter); + syncScrollBars(); + } - 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 */ - vertical.setMaximum(height); - vertical.setEnabled(true); - if (((int) - origin.y) > vertical.getMaximum() - ch) - origin.y = -vertical.getMaximum() + ch; - } else { /* image is less higher than client area */ - vertical.setMaximum((int) (ch)); - vertical.setEnabled(false); - } - vertical.setSelection(-origin.y); - vertical.setThumb(ch); - ruler.setScaleFactor(scaleFactor); - redraw(); - } + /** + * Dispose the garbage here + */ + public void dispose() { + transform.dispose(); + for (Colors c : Colors.values()) + colors[c.ordinal()].dispose(); + super.dispose(); + } - /* Paint function */ - private void paint(GC gc) { - Rectangle clientRect = getClientArea(); /* Canvas' painting area */ - clientRect.x=-origin.x; - clientRect.y=-origin.y; - // reset the transform - transform.identity(); - // shift the content - transform.translate(origin.x, origin.y); - gc.setTransform(transform); + /* Initalize the scrollbar and register listeners. */ + private void initScrollBars() { + ScrollBar horizontal = getHorizontalBar(); + horizontal.setEnabled(false); + horizontal.setVisible(true); + horizontal.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + if (painterList.size() == 0) + return; + setOrigin(-((ScrollBar) event.widget).getSelection(), origin.y); + if (ruler != null) + ruler.setStartPoint(-origin.x * scaleFactor); + } + }); + ScrollBar vertical = getVerticalBar(); + vertical.setEnabled(false); + vertical.setVisible(true); + vertical.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + if (painterList.size() == 0) + return; + setOrigin(origin.x, -((ScrollBar) event.widget).getSelection()); + } + }); + } + + /** + * Synchronize the scrollbar with the image. If the transform is out of + * range, it will correct it. This function considers only following factors + * : transform, image size, client area. + */ + private void syncScrollBars() { + if (painterList.size() == 0) { + redraw(); + return; + } + int height = 1; + if (trackVerticalOffset.size() > 0) + height = trackVerticalOffset.lastKey() + trackVerticalOffset.lastEntry().getValue().getMinHeight(); + + int width = (int) (maxTime / scaleFactor); + 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 */ + horizontal.setMaximum(width); + horizontal.setEnabled(true); + if (((int) -origin.x) > horizontal.getMaximum() - cw) + origin.x = -horizontal.getMaximum() + cw; + } else { /* image is narrower than client area */ + horizontal.setEnabled(false); + } + 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 */ + vertical.setMaximum(height); + vertical.setEnabled(true); + if (((int) -origin.y) > vertical.getMaximum() - ch) + origin.y = -vertical.getMaximum() + ch; + } else { /* image is less higher than client area */ + vertical.setMaximum((int) (ch)); + vertical.setEnabled(false); + } + vertical.setSelection(-origin.y); + vertical.setThumb(ch); + ruler.setScaleFactor(scaleFactor); + redraw(); + Event e = new Event(); + e.widget = this; + SelectionEvent ev = new SelectionEvent(e); + ev.x = origin.x; + ev.y = origin.y; + for (SelectionAdapter a : selectionListeners) { + a.widgetSelected(ev); + } + + } + + /* Paint function */ + private void paint(GC gc) { + Rectangle clientRect = getClientArea(); /* Canvas' painting area */ + clientRect.x = -origin.x; + clientRect.y = -origin.y; + // reset the transform + transform.identity(); + // shift the content + transform.translate(origin.x, origin.y); + gc.setTransform(transform); gc.setClipping(clientRect); - if (painterList.size()>0 && trackVerticalOffset.size()>0) { - for(IPainter painter: painterList) - painter.paintArea(gc, clientRect); - } else { - gc.fillRectangle(clientRect); - initScrollBars(); - } - } + if (painterList.size() > 0 && trackVerticalOffset.size() > 0) { + for (IPainter painter : painterList) + painter.paintArea(gc, clientRect); + } else { + gc.fillRectangle(clientRect); + initScrollBars(); + } + } - public Object getClicked(Point point) { - for(IPainter p:Lists.reverse(painterList)){ - if(p instanceof TrackPainter){ - int y= point.y-origin.y; - int x=point.x-origin.x; - Entry entry = trackVerticalOffset.floorEntry(y); - if(entry!=null){ - if(entry.getValue() instanceof StreamPainter){ - return ((StreamPainter)entry.getValue()).getClicked(new Point(x,y-entry.getKey())); - }else if(entry.getValue() instanceof SignalPainter) - return ((SignalPainter)entry.getValue()).getSignal(); - } - }else if(p instanceof CursorPainter){ - if(Math.abs(point.x*scaleFactor-((CursorPainter)p).getTime())<2){ - return p; - } - } - } - return null; - } + public Object getClicked(Point point) { + for (IPainter p : Lists.reverse(painterList)) { + if (p instanceof TrackPainter) { + int y = point.y - origin.y; + int x = point.x - origin.x; + Entry entry = trackVerticalOffset.floorEntry(y); + if (entry != null) { + if (entry.getValue() instanceof StreamPainter) { + return ((StreamPainter) entry.getValue()).getClicked(new Point(x, y - entry.getKey())); + } else if (entry.getValue() instanceof SignalPainter) + return ((SignalPainter) entry.getValue()).getSignal(); + } + } else if (p instanceof CursorPainter) { + if (Math.abs(point.x * scaleFactor - ((CursorPainter) p).getTime()) < 2) { + return p; + } + } + } + return null; + } - public void setSelected(ITx currentSelection, IWaveform currentWaveformSelection) { - this.currentSelection=currentSelection; - this.currentWaveformSelection=currentWaveformSelection; - if(currentSelection!=null) reveal(currentSelection); - redraw(); - } + public void setSelected(ITx currentSelection, IWaveform currentWaveformSelection) { + this.currentSelection = currentSelection; + this.currentWaveformSelection = currentWaveformSelection; + if (currentSelection != null) + reveal(currentSelection); + redraw(); + } - public void reveal(ITx tx){ - int lower = (int) (tx.getBeginTime()/scaleFactor); - int higher=(int) (tx.getEndTime()/scaleFactor); - Point size = getSize(); - if(lower<-origin.x){ - scrollToX(lower); - } else if(higher>(size.x-origin.x)){ - scrollToX(higher-size.x); - } - for(Entry entry:trackVerticalOffset.entrySet()){ - if(entry.getValue() instanceof StreamPainter && ((StreamPainter)entry.getValue()).getStream()==tx.getStream()){ - int top = entry.getKey()+trackHeight*tx.getConcurrencyIndex(); - int bottom = top+trackHeight*(tx.getConcurrencyIndex()+1); - if(top<-origin.y){ - scrollToY(bottom); - } else if(bottom>(size.y-origin.y)){ - scrollToY(bottom-size.y); - } - - } - } - } + public void reveal(ITx tx) { + int lower = (int) (tx.getBeginTime() / scaleFactor); + int higher = (int) (tx.getEndTime() / scaleFactor); + Point size = getSize(); + size.x -= getVerticalBar().getSize().x + 2; + size.y -= getHorizontalBar().getSize().y; + if (lower < -origin.x) { + setOrigin(-lower, origin.y); + } else if (higher > (size.x - origin.x)) { + setOrigin(size.x - higher, origin.y); + } + for (Entry entry : trackVerticalOffset.entrySet()) { + if (entry.getValue() instanceof StreamPainter && ((StreamPainter) entry.getValue()).getStream() == tx.getStream()) { + int top = entry.getKey() + trackHeight * tx.getConcurrencyIndex(); + int bottom = top + trackHeight; + if (top < -origin.y) { + setOrigin(origin.x, -top); + } else if (bottom > (size.y - origin.y)) { + setOrigin(origin.x, size.y - bottom); + } + } + } + } + public void addSelectionListener(SelectionAdapter selectionAdapter) { + selectionListeners.add(selectionAdapter); + } + + public void removeSelectionListener(SelectionAdapter selectionAdapter) { + selectionListeners.remove(selectionAdapter); + } } diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy index 6700173..7e60535 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy @@ -53,6 +53,7 @@ public class TextDbLoader implements IWaveformDbLoader{ @Override boolean load(IWaveformDb db, File file) throws Exception { this.db=db + this.streams=[] FileInputStream fis = new FileInputStream(file) byte[] buffer = new byte[x.size()] def readCnt = fis.read(buffer, 0, x.size()) diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.groovy index e33ac09..ef3e029 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.groovy @@ -51,7 +51,11 @@ class Tx implements ITx { @Override public int compareTo(ITx o) { - return beginTime.compareTo(o.beginTime) + def res =beginTime.compareTo(o.beginTime) + if(res!=0) + return res + else + return id.compareTo(o.id) } } diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxEvent.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxEvent.groovy index 203d841..ae8158b 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxEvent.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxEvent.groovy @@ -8,12 +8,15 @@ class TxEvent implements ITxEvent { final ITxEvent.Type type; - Tx transaction; + final Tx transaction; + + final Long time TxEvent(ITxEvent.Type type, ITx transaction) { super(); this.type = type; this.transaction = transaction; + this.time = type==ITxEvent.Type.BEGIN?transaction.beginTime:transaction.endTime } @Override @@ -23,15 +26,11 @@ class TxEvent implements ITxEvent { @Override int compareTo(IWaveformEvent o) { - time.compareTo(o.getTime()) + time.compareTo(o.time) } - Long getTime(){ - type==ITxEvent.Type.BEGIN?transaction.beginTime:transaction.endTime - } - - @Override + @Override String toString() { - type.toString()+"@"+getTime()+" of tx #"+transaction.id; + type.toString()+"@"+time+" of tx #"+transaction.id; } } diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy index 2791cac..072f46e 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy @@ -92,8 +92,10 @@ class TxStream extends HierNode implements ITxStream { } private putEvent(ITxEvent event){ - if(!events.containsKey(event.time)) events.put(event.time, []) - events[event.time]< - - \ No newline at end of file + + diff --git a/com.minres.scviewer.feature/feature.xml b/com.minres.scviewer.feature/feature.xml index 30da863..dc97d88 100644 --- a/com.minres.scviewer.feature/feature.xml +++ b/com.minres.scviewer.feature/feature.xml @@ -29,11 +29,11 @@ http://www.eclipse.org/legal/epl-v10.html + + + - - - @@ -43,9 +43,14 @@ http://www.eclipse.org/legal/epl-v10.html - + + + + + + + + + +