From 524ffb189c4871f33788ca3e163a53c2cc238fbe Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 16 Nov 2021 14:11:30 +0100 Subject: [PATCH 1/2] fix MT race condition --- .../com/minres/scviewer/database/internal/WaveformDb.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java index 093f9c2..df1f049 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java @@ -19,6 +19,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.IHierNode; @@ -80,7 +81,7 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL */ public WaveformDb() { super(); - waveforms = new HashMap<>(); + waveforms = new ConcurrentHashMap<>(); relationTypes = new ArrayList<>(); maxTime = 0L; } @@ -193,7 +194,7 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL /** * Builds the hierarchy nodes. */ - private void buildHierarchyNodes() { + private synchronized void buildHierarchyNodes() { boolean needsSorting = false; for (IWaveform stream : getAllWaves()) { if (stream.getParent() == null) { From 3572f683e3d8947ff1e26a253c6e38b2ee58aa06 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 16 Nov 2021 14:12:10 +0100 Subject: [PATCH 2/2] add zoom levels --- .../scviewer/database/ui/swt/Constants.java | 24 ++++++++++------ .../ui/swt/internal/ArrowPainter.java | 1 - .../ui/swt/internal/CursorPainter.java | 2 +- .../ui/swt/internal/RulerPainter.java | 8 ++---- .../ui/swt/internal/WaveformCanvas.java | 28 +++++++++---------- .../ui/swt/internal/WaveformView.java | 9 +++--- .../application/parts/help/HelpBrowser.java | 6 ---- .../provider/TxDbContentProvider.java | 1 - 8 files changed, 37 insertions(+), 42 deletions(-) diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/Constants.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/Constants.java index 38cd838..73f2ae6 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/Constants.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/Constants.java @@ -5,8 +5,10 @@ import java.text.DecimalFormat; public class Constants { public static final String[] UNIT_STRING={"fs", "ps", "ns", "us", "ms"};//, "s"}; - - public static final int[] UNIT_MULTIPLIER={1, 3, 10, 30, 100, 300}; + public static final long[] UNIT_MULTIPLIER={1, 1000, 1000*1000, 1000*1000*1000, 1000*1000*1000*1000, 1000*1000*1000*1000*1000 }; + + //public static final int[] UNIT_MULTIPLIER={1, 3, 10, 30, 100, 300}; + public static final long[] SCALE_MULTIPLIER={1, 2, 5, 10, 20, 50, 100, 200, 500}; public static final String CONTENT_PROVIDER_TAG = "TOOLTIP_CONTENT_PROVIDER"; public static final String HELP_PROVIDER_TAG = "TOOLTIP_HELP_PROVIDER"; @@ -17,14 +19,18 @@ public class Constants { public static final DecimalFormat TIME_FORMAT_US = new DecimalFormat("#.0#####"); public static final DecimalFormat TIME_FORMAT_MS = new DecimalFormat("#.0#####"); - public static final DecimalFormat[] TIME_FORMAT = { - TIME_FORMAT_FS, TIME_FORMAT_FS, TIME_FORMAT_FS, TIME_FORMAT_FS, TIME_FORMAT_FS, TIME_FORMAT_FS, - TIME_FORMAT_PS, TIME_FORMAT_PS, TIME_FORMAT_PS, TIME_FORMAT_PS, TIME_FORMAT_PS, TIME_FORMAT_PS, - TIME_FORMAT_NS, TIME_FORMAT_NS, TIME_FORMAT_NS, TIME_FORMAT_NS, TIME_FORMAT_NS, TIME_FORMAT_NS, - TIME_FORMAT_US, TIME_FORMAT_US, TIME_FORMAT_US, TIME_FORMAT_US, TIME_FORMAT_US, TIME_FORMAT_US, - TIME_FORMAT_MS, TIME_FORMAT_MS, TIME_FORMAT_MS, TIME_FORMAT_MS, TIME_FORMAT_MS, TIME_FORMAT_MS, - }; + public static DecimalFormat getTimeFormatForLevel(int level) { + switch(level/SCALE_MULTIPLIER.length) { + case 0: return TIME_FORMAT_FS; + case 1: return TIME_FORMAT_PS; + case 2: return TIME_FORMAT_NS; + case 3: return TIME_FORMAT_US; + case 4: return TIME_FORMAT_MS; + default: + return TIME_FORMAT_FS; + } + } private Constants() {} } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java index 7243110..e3426df 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java @@ -24,7 +24,6 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; import com.minres.scviewer.database.IEvent; -import com.minres.scviewer.database.IHierNode; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.tx.ITx; diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/CursorPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/CursorPainter.java index 9ae501a..25ff338 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/CursorPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/CursorPainter.java @@ -85,7 +85,7 @@ public class CursorPainter implements IPainter, ICursor { proj.setBackground(drawColor); proj.setForeground(textColor); double dTime=time; - proj.drawText(Constants.TIME_FORMAT[waveCanvas.getZoomLevel()].format(dTime/waveCanvas.getScaleFactorPow10())+waveCanvas.getUnitStr(), x+1, top); + proj.drawText(Constants.getTimeFormatForLevel(waveCanvas.getZoomLevel()).format(dTime/waveCanvas.getScaleFactorPow10())+waveCanvas.getUnitStr(), x+1, top); } } } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RulerPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RulerPainter.java index 98a11b6..16d6289 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RulerPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RulerPainter.java @@ -10,8 +10,6 @@ *******************************************************************************/ package com.minres.scviewer.database.ui.swt.internal; -import java.text.DecimalFormat; - import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; @@ -40,7 +38,7 @@ public class RulerPainter implements IPainter { if(headerBgColor.isDisposed()) headerBgColor=SWTResourceManager.getColor(255,255,255); String unit=waveCanvas.getUnitStr(); - int unitMultiplier=waveCanvas.getUnitMultiplier(); + long unitMultiplier=waveCanvas.getUnitMultiplier(); long scaleFactor=waveCanvas.getScaleFactor(); long startPos=area.x*scaleFactor; @@ -69,7 +67,7 @@ public class RulerPainter implements IPainter { boolean allMarker=true; for (long pos = startMinorIncrPos, tick = startMinorIncrVal; pos < endPos; pos+= rulerTickMinor, tick += rulerTickMinor) { if ((tick % rulerTickMajor) == 0) { - String text = Constants.TIME_FORMAT[waveCanvas.getZoomLevel()].format(tick/scaleFactor*unitMultiplier); + String text = Constants.getTimeFormatForLevel(waveCanvas.getZoomLevel()).format(tick/scaleFactor*unitMultiplier); if(text.length()>8) allMarker=false; } } @@ -79,7 +77,7 @@ public class RulerPainter implements IPainter { long x0Val = tick/scaleFactor; if ((tick % rulerTickMajor) == 0) { if(allMarker || drawText) - gc.drawText(Constants.TIME_FORMAT[waveCanvas.getZoomLevel()].format(x0Val*unitMultiplier)+unit, x0Pos, area.y+textY); + gc.drawText(Constants.getTimeFormatForLevel(waveCanvas.getZoomLevel()).format(x0Val*unitMultiplier)+unit, x0Pos, area.y+textY); gc.drawLine(x0Pos, area.y+majorTickY, x0Pos,area.y+ bottom); drawText=!drawText; } else { diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java index 1149019..b55e1b9 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java @@ -170,7 +170,7 @@ public class WaveformCanvas extends Canvas { } public int getMaxZoomLevel(){ - return Constants.UNIT_MULTIPLIER.length*Constants.UNIT_STRING.length-1; + return Constants.SCALE_MULTIPLIER.length*Constants.UNIT_STRING.length-1; } public void setZoomLevel(int level) { @@ -190,9 +190,10 @@ public class WaveformCanvas extends Canvas { if(level<0) level = 0; } //FIXME: keep center if zoom-out and cursor is not in view - if(level>1); - if(level%2==1) this.scaleFactor*=3; + if(level= maxTime, if one is found set it as new zoomlevel - final long[] UNIT_STRING_MULT={1, 1000, 1000*1000, 1000*1000*1000, 1000*1000*1000*1000, 1000*1000*1000*1000*1000 }; - for(int magnitude=0; magnitude= duration) - return magnitude*Constants.UNIT_MULTIPLIER.length+multiplier; + return unitIdx*Constants.SCALE_MULTIPLIER.length+scaleIdx; } } return -1; @@ -241,17 +241,17 @@ public class WaveformCanvas extends Canvas { } public long getScaleFactorPow10() { - int scale = level/Constants.UNIT_MULTIPLIER.length; + int scale = level/Constants.SCALE_MULTIPLIER.length; double res = Math.pow(1000, scale); return (long) res; } public String getUnitStr(){ - return Constants.UNIT_STRING[level/Constants.UNIT_MULTIPLIER.length]; + return Constants.UNIT_STRING[level/Constants.SCALE_MULTIPLIER.length]; } - public int getUnitMultiplier(){ - return Constants.UNIT_MULTIPLIER[level%Constants.UNIT_MULTIPLIER.length]; + public long getUnitMultiplier(){ + return Constants.SCALE_MULTIPLIER[level%Constants.SCALE_MULTIPLIER.length]; } public long getTimeForOffset(int xOffset){ diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index e9d563f..616e301 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -13,7 +13,6 @@ package com.minres.scviewer.database.ui.swt.internal; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; -import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -1475,7 +1474,7 @@ public class WaveformView implements IWaveformView { StringBuilder sb = new StringBuilder(); double dTime = time; double scaledTime = dTime / waveformCanvas.getScaleFactorPow10(); - return sb.append(Constants.TIME_FORMAT[waveformCanvas.getZoomLevel()].format(scaledTime)).append(waveformCanvas.getUnitStr()).toString(); + return sb.append(Constants.getTimeFormatForLevel(waveformCanvas.getZoomLevel()).format(scaledTime)).append(waveformCanvas.getUnitStr()).toString(); } /* @@ -1485,11 +1484,11 @@ public class WaveformView implements IWaveformView { */ @Override public String[] getZoomLevels() { - String[] res = new String[Constants.UNIT_MULTIPLIER.length * Constants.UNIT_STRING.length]; + String[] res = new String[Constants.SCALE_MULTIPLIER.length * Constants.UNIT_STRING.length]; int index = 0; for (String unit : Constants.UNIT_STRING) { - for (int factor : Constants.UNIT_MULTIPLIER) { - res[index++] = Integer.toString(factor) + unit; + for (long factor : Constants.SCALE_MULTIPLIER) { + res[index++] = Long.toString(factor) + unit; } } return res; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java index 1ed125f..e965a43 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java @@ -5,9 +5,6 @@ import java.io.File; import javax.annotation.PostConstruct; import javax.inject.Inject; -import org.eclipse.e4.ui.model.application.ui.basic.MPart; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ResourceLocator; @@ -17,8 +14,6 @@ import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.LocationListener; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.browser.ProgressListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; @@ -26,7 +21,6 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.ProgressBar; -import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbContentProvider.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbContentProvider.java index 668cf08..7a23d13 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbContentProvider.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbContentProvider.java @@ -19,7 +19,6 @@ import org.eclipse.jface.viewers.ITreeContentProvider; import com.minres.scviewer.database.IHierNode; import com.minres.scviewer.database.IWaveform; -import com.minres.scviewer.database.IWaveformDb; /** * The Class TxDbContentProvider providing the tree content of a database for the respective viewer.