diff --git a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java index 910ffa6..335e38a 100644 --- a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java +++ b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java @@ -11,9 +11,11 @@ package com.minres.scviewer.database.sqlite; import java.beans.IntrospectionException; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.io.File; import java.io.FileInputStream; -import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.util.ArrayList; @@ -40,6 +42,11 @@ public class SQLiteDbLoader implements IWaveformDbLoader { private ScvSimProps scvSimProps; + private static final byte[] x = "SQLite format 3".getBytes(); + + /** The pcs. */ + protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); + @Override public Long getMaxTime() { SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, @@ -71,21 +78,28 @@ public class SQLiteDbLoader implements IWaveformDbLoader { return streams; } - private byte[] x = "SQLite format 3".getBytes(); + @Override + public boolean canLoad(File inputFile) { + if (!inputFile.isDirectory() && inputFile.exists()) { + try(InputStream stream = new FileInputStream(inputFile)){ + byte[] buffer = new byte[x.length]; + int readCnt = stream.read(buffer, 0, x.length); + if (readCnt == x.length) { + for (int i = 0; i < x.length; i++) + if (buffer[i] != x[i]) + return false; + } + return true; + } catch (Exception e) { + return false; + } + } + return false; + } @Override - public boolean load(IWaveformDb db, File file) throws InputFormatException { + public void load(IWaveformDb db, File file) throws InputFormatException { dispose(); - if(file.isDirectory() || !file.exists()) return false; - try(FileInputStream fis = new FileInputStream(file)) { - byte[] buffer = new byte[x.length]; - int read = fis.read(buffer, 0, x.length); - if (read == x.length) - for (int i = 0; i < x.length; i++) - if (buffer[i] != x[i]) return false; - } catch(IOException e) { - return false; - } database=new SQLiteDatabase(file.getAbsolutePath(), db); database.setData("TIMERESOLUTION", 1L); SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>(ScvSimProps.class, database); @@ -94,12 +108,11 @@ public class SQLiteDbLoader implements IWaveformDbLoader { scvSimProps=simProps; database.setData("TIMERESOLUTION", scvSimProps.getTime_resolution()); } - return true; + pcs.firePropertyChange(IWaveformDbLoader.LOADING_FINISHED, null, null); } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException | SQLException | IntrospectionException e) { - e.printStackTrace(); + throw new InputFormatException(); } - return false; } public void dispose() { @@ -112,4 +125,24 @@ public class SQLiteDbLoader implements IWaveformDbLoader { return usedRelationsList; } + /** + * Adds the property change listener. + * + * @param l the l + */ + @Override + public void addPropertyChangeListener(PropertyChangeListener l) { + pcs.addPropertyChangeListener(l); + } + + /** + * Removes the property change listener. + * + * @param l the l + */ + @Override + public void removePropertyChangeListener(PropertyChangeListener l) { + pcs.removePropertyChangeListener(l); + } + } diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java index df575bc..cdfabb9 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java @@ -11,6 +11,8 @@ *******************************************************************************/ package com.minres.scviewer.database.text; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; @@ -89,6 +91,12 @@ public class TextDbLoader implements IWaveformDbLoader { /** The threads. */ List threads = new ArrayList<>(); + /** The pcs. */ + protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); + + /** The Constant x. */ + static final byte[] x = "scv_tr_stream".getBytes(); + /** * Gets the max time. * @@ -109,8 +117,31 @@ public class TextDbLoader implements IWaveformDbLoader { return new ArrayList<>(txStreams.values()); } - /** The Constant x. */ - static final byte[] x = "scv_tr_stream".getBytes(); + /** + * Can load. + * + * @param inputFile the input file + * @return true, if successful + */ + @Override + public boolean canLoad(File inputFile) { + if (!inputFile.isDirectory() && inputFile.exists()) { + boolean gzipped = isGzipped(inputFile); + try(InputStream stream = gzipped ? new GZIPInputStream(new FileInputStream(inputFile)) : new FileInputStream(inputFile)){ + byte[] buffer = new byte[x.length]; + int readCnt = stream.read(buffer, 0, x.length); + if (readCnt == x.length) { + for (int i = 0; i < x.length; i++) + if (buffer[i] != x[i]) + return false; + } + return true; + } catch (Exception e) { + return false; + } + } + return false; + } /** * Load. @@ -122,19 +153,9 @@ public class TextDbLoader implements IWaveformDbLoader { */ @SuppressWarnings("unchecked") @Override - public boolean load(IWaveformDb db, File file) throws InputFormatException { + public void load(IWaveformDb db, File file) throws InputFormatException { dispose(); - if (file.isDirectory() || !file.exists()) - return false; - TextDbParser parser = new TextDbParser(this); boolean gzipped = isGzipped(file); - try { - if (!isTxfile(gzipped ? new GZIPInputStream(new FileInputStream(file)) : new FileInputStream(file))) - return false; - } catch (Exception e) { - throw new InputFormatException(); - } - if (file.length() < 75000000 * (gzipped ? 1 : 10) || "memory".equals(System.getProperty("ScvBackingDB", "file"))) mapDb = DBMaker.memoryDirectDB().allocateStartSize(512l * 1024l * 1024l) @@ -145,13 +166,14 @@ public class TextDbLoader implements IWaveformDbLoader { mapDbFile = File.createTempFile("." + file.getName(), ".mapdb", null /* file.parentFile */); Files.delete(Paths.get(mapDbFile.getPath())); } catch (IOException e1) { - return false; + throw new InputFormatException(); } mapDb = DBMaker.fileDB(mapDbFile).fileMmapEnable() // Always enable mmap .fileMmapEnableIfSupported().fileMmapPreclearDisable().allocateStartSize(512l * 1024l * 1024l) .allocateIncrement(128l * 1024l * 1024l).cleanerHackEnable().make(); mapDbFile.deleteOnExit(); } + TextDbParser parser = new TextDbParser(this); try { parser.txSink = mapDb.treeMap("transactions", Serializer.LONG, Serializer.JAVA).createFromSink(); parser.parseInput(gzipped ? new GZIPInputStream(new FileInputStream(file)) : new FileInputStream(file)); @@ -160,7 +182,7 @@ public class TextDbLoader implements IWaveformDbLoader { } catch (Exception e) { System.out.println("---->>> Exception " + e.toString() + " caught while loading database"); e.printStackTrace(); - return false; + throw new InputFormatException(); } for (TxStream stream : txStreams.values()) { Thread t = new Thread() { @@ -175,7 +197,6 @@ public class TextDbLoader implements IWaveformDbLoader { threads.add(t); t.start(); } - return true; } /** @@ -197,28 +218,6 @@ public class TextDbLoader implements IWaveformDbLoader { } } - /** - * Checks if is txfile. - * - * @param istream the istream - * @return true, if is txfile - */ - private static boolean isTxfile(InputStream istream) { - byte[] buffer = new byte[x.length]; - try { - int readCnt = istream.read(buffer, 0, x.length); - istream.close(); - if (readCnt == x.length) { - for (int i = 0; i < x.length; i++) - if (buffer[i] != x[i]) - return false; - } - return true; - } catch (IOException e) { - return false; - } - } - /** * Checks if is gzipped. * @@ -416,7 +415,7 @@ public class TextDbLoader implements IWaveformDbLoader { if (matcher.matches()) { Long id = Long.parseLong(matcher.group(1)); TxStream stream = new TxStream(loader, id, matcher.group(2), matcher.group(3)); - loader.txStreams.put(id, stream); + add(id, stream); } } else if ("scv_tr_generator".equals(tokens[0])) { Matcher matcher = scv_tr_generator.matcher(curLine); @@ -424,7 +423,7 @@ public class TextDbLoader implements IWaveformDbLoader { Long id = Long.parseLong(matcher.group(1)); TxStream stream = loader.txStreams.get(Long.parseLong(matcher.group(3))); generator = new TxGenerator(loader, id, matcher.group(2), stream); - loader.txGenerators.put(id, generator); + add(id, generator); } } else if ("begin_attribute".equals(tokens[0])) { Matcher matcher = begin_attribute.matcher(curLine); @@ -497,6 +496,16 @@ public class TextDbLoader implements IWaveformDbLoader { return 1000000000000000L; return 1L; } + private void add(Long id, TxStream stream) { + loader.txStreams.put(id, stream); + loader.pcs.firePropertyChange(IWaveformDbLoader.STREAM_ADDED, null, stream); + } + + private void add(Long id, TxGenerator generator) { + loader.txGenerators.put(id, generator); + loader.pcs.firePropertyChange(IWaveformDbLoader.GENERATOR_ADDED, null, generator); + } + } /** @@ -513,4 +522,24 @@ public class TextDbLoader implements IWaveformDbLoader { return tx; } + /** + * Adds the property change listener. + * + * @param l the l + */ + @Override + public void addPropertyChangeListener(PropertyChangeListener l) { + pcs.addPropertyChangeListener(l); + } + + /** + * Removes the property change listener. + * + * @param l the l + */ + @Override + public void removePropertyChangeListener(PropertyChangeListener l) { + pcs.removePropertyChangeListener(l); + } + } 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 8927a3c..64446da 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 @@ -92,13 +92,13 @@ import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.swt.Constants; -public class WaveformView implements IWaveformView { +public class WaveformView implements IWaveformView { private ListenerList selectionChangedListeners = new ListenerList<>(); private PropertyChangeSupport pcs; - static final DecimalFormat df = new DecimalFormat("#0.00####"); + static final DecimalFormat df = new DecimalFormat("#0.00####"); private ITx currentTxSelection; @@ -118,7 +118,7 @@ public class WaveformView implements IWaveformView { final ToolTipHandler toolTipHandler; - private boolean revealSelected=false; + private boolean revealSelected = false; private Composite top; @@ -140,11 +140,12 @@ public class WaveformView implements IWaveformView { public void mouseDown(MouseEvent e) { if (e.button == 1) { Entry entry = trackVerticalOffset.floorEntry(e.y); - if(entry!=null) - entry.getValue().selected=true; + if (entry != null) + entry.getValue().selected = true; } else if (e.button == 3) { - Menu topMenu= top.getMenu(); - if(topMenu!=null) topMenu.setVisible(true); + Menu topMenu = top.getMenu(); + if (topMenu != null) + topMenu.setVisible(true); } } @@ -153,16 +154,18 @@ public class WaveformView implements IWaveformView { if (e.button == 1) { Entry entry = trackVerticalOffset.floorEntry(e.y); if (entry != null) { - if((e.stateMask & SWT.SHIFT) != 0) { - if(lastClickedEntry.selected) { - int firstIdx=streams.indexOf(lastClickedEntry); + if ((e.stateMask & SWT.SHIFT) != 0) { + if (lastClickedEntry.selected) { + int firstIdx = streams.indexOf(lastClickedEntry); int lastIdx = streams.indexOf(entry.getValue()); - List res = firstIdx>lastIdx?streams.subList(lastIdx, firstIdx+1):streams.subList(firstIdx, lastIdx+1); - setSelection(new StructuredSelection(res), (e.stateMask & SWT.CTRL) !=0 , false); + List res = firstIdx > lastIdx ? streams.subList(lastIdx, firstIdx + 1) + : streams.subList(firstIdx, lastIdx + 1); + setSelection(new StructuredSelection(res), (e.stateMask & SWT.CTRL) != 0, false); } else - setSelection(new StructuredSelection(entry.getValue()), (e.stateMask & SWT.CTRL) !=0 , false); + setSelection(new StructuredSelection(entry.getValue()), (e.stateMask & SWT.CTRL) != 0, + false); } else { - setSelection(new StructuredSelection(entry.getValue()), (e.stateMask & SWT.CTRL) !=0 , false); + setSelection(new StructuredSelection(entry.getValue()), (e.stateMask & SWT.CTRL) != 0, false); } lastClickedEntry = entry.getValue(); } @@ -174,103 +177,107 @@ public class WaveformView implements IWaveformView { Point start; Point end; List initialSelected; - boolean down=false; + boolean down = false; @Override public void paintControl(PaintEvent e) { - if(down) { + if (down) { GC gc = e.gc; gc.setAlpha(128); int minX = Math.min(start.x, end.x); int width = Math.max(start.x, end.x) - minX; int yTop = waveformCanvas.getRulerHeight(); int yBottom = waveformCanvas.getSize().y; - gc.fillRectangle(minX, yTop, width,yBottom); + gc.fillRectangle(minX, yTop, width, yBottom); } } private void mouseUp(MouseEvent e) { - down=false; - if(start==null) return; - if((e.stateMask&SWT.MODIFIER_MASK&~SWT.SHIFT)!=0) return; //don't react on modifier except shift - if(e.button == 1 && Math.abs(e.x-start.x)>3){ + down = false; + if (start == null) + return; + if ((e.stateMask & SWT.MODIFIER_MASK & ~SWT.SHIFT) != 0) + return; // don't react on modifier except shift + if (e.button == 1 && Math.abs(e.x - start.x) > 3) { asyncUpdate(e.widget); long startTime = waveformCanvas.getTimeForOffset(start.x); long endTime = waveformCanvas.getTimeForOffset(end.x); - long targetTimeRange = endTime-startTime; - long currentTimeRange = waveformCanvas.getMaxVisibleTime()-waveformCanvas.getMinVisibleTime(); - if(targetTimeRange==0) return; - long relation = currentTimeRange/targetTimeRange; + long targetTimeRange = endTime - startTime; + long currentTimeRange = waveformCanvas.getMaxVisibleTime() - waveformCanvas.getMinVisibleTime(); + if (targetTimeRange == 0) + return; + long relation = currentTimeRange / targetTimeRange; long i = 1; - int level=0; + int level = 0; do { - if(relation<0 ) { - if(-relation floorEntry=null; - Entry ceilEntry=null; - if(o instanceof TrackEntry){ + long time = waveformCanvas.getTimeForOffset(p.x); + long scaling = 5 * waveformCanvas.getScaleFactor(); + for (Object o : waveformCanvas.getElementsAt(p)) { + Entry floorEntry = null; + Entry ceilEntry = null; + if (o instanceof TrackEntry) { TrackEntry entry = (TrackEntry) o; NavigableMap map = entry.waveform.getEvents(); floorEntry = map.floorEntry(time); ceilEntry = map.ceilingEntry(time); - } else if(o instanceof ITx){ - NavigableMap map = ((ITx)o).getStream().getEvents(); + } else if (o instanceof ITx) { + NavigableMap map = ((ITx) o).getStream().getEvents(); floorEntry = map.floorEntry(time); ceilEntry = map.ceilingEntry(time); } - if(floorEntry!=null && time-floorEntry.getKey()>scaling) - floorEntry=null; - if(ceilEntry!=null && ceilEntry.getKey()-time>scaling) - ceilEntry=null; - if(ceilEntry==null && floorEntry!=null){ - time=floorEntry.getKey(); - }else if(ceilEntry!=null && floorEntry==null){ - time=ceilEntry.getKey(); - }else if(ceilEntry!=null && floorEntry!=null){ - time=time-floorEntry.getKey() scaling) + floorEntry = null; + if (ceilEntry != null && ceilEntry.getKey() - time > scaling) + ceilEntry = null; + if (ceilEntry == null && floorEntry != null) { + time = floorEntry.getKey(); + } else if (ceilEntry != null && floorEntry == null) { + time = ceilEntry.getKey(); + } else if (ceilEntry != null && floorEntry != null) { + time = time - floorEntry.getKey() < ceilEntry.getKey() - time ? floorEntry.getKey() + : ceilEntry.getKey(); } } return time; @@ -282,25 +289,27 @@ public class WaveformView implements IWaveformView { case SWT.MouseWheel: break; case SWT.MouseDown: - start=new Point(e.x, e.y); - end=new Point(e.x, e.y); - if((e.stateMask&SWT.MODIFIER_MASK)!=0) return; //don't react on modifier - if (e.button == 1) { - down=true; + start = new Point(e.x, e.y); + end = new Point(e.x, e.y); + if ((e.stateMask & SWT.MODIFIER_MASK) != 0) + return; // don't react on modifier + if (e.button == 1) { + down = true; initialSelected = waveformCanvas.getElementsAt(start); } else if (e.button == 3) { - Menu topMenu= top.getMenu(); - if(topMenu!=null) topMenu.setVisible(true); + Menu topMenu = top.getMenu(); + if (topMenu != null) + topMenu.setVisible(true); } break; case SWT.MouseUp: mouseUp(new MouseEvent(e)); break; case SWT.MouseMove: - if(down) { - end=new Point(e.x, e.y); + if (down) { + end = new Point(e.x, e.y); asyncUpdate(e.widget); - } + } break; default: break; @@ -309,15 +318,16 @@ public class WaveformView implements IWaveformView { } } - protected WaveformMouseListener waveformMouseListener = new WaveformMouseListener(); + + protected WaveformMouseListener waveformMouseListener = new WaveformMouseListener(); public WaveformView(Composite parent, IWaveformStyleProvider styleProvider) { - this.styleProvider=styleProvider; + this.styleProvider = styleProvider; - pcs=new PropertyChangeSupport(this); + pcs = new PropertyChangeSupport(this); trackVerticalOffset = new TreeMap<>(); - tracksVerticalHeight=0; + tracksVerticalHeight = 0; streams = new ObservableList<>(); streams.addPropertyChangeListener("content", this); @@ -328,7 +338,7 @@ public class WaveformView implements IWaveformView { SashForm topSash = new SashForm(top, SWT.SMOOTH); topSash.setBackground(topSash.getDisplay().getSystemColor(SWT.COLOR_GRAY)); - Composite namePane = new Composite(topSash, SWT.NONE); + Composite namePane = new Composite(topSash, SWT.NONE); Composite rightPane = new Composite(topSash, SWT.NONE); rightPane.setLayout(new FillLayout(SWT.HORIZONTAL)); @@ -336,12 +346,12 @@ public class WaveformView implements IWaveformView { rightSash.setBackground(SWTResourceManager.getColor(SWT.COLOR_GRAY)); Composite valuePane = new Composite(rightSash, SWT.NONE); - waveformCanvas = new WaveformCanvas(rightSash, SWT.NONE, styleProvider); + waveformCanvas = new WaveformCanvas(rightSash, SWT.NONE, styleProvider); // create the name pane createTextPane(namePane, "Name"); - namePaneHeader= namePane.getChildren()[0]; + namePaneHeader = namePane.getChildren()[0]; namePane.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND)); nameListScrolled = new ScrolledComposite(namePane, SWT.H_SCROLL | SWT.V_SCROLL); @@ -364,7 +374,7 @@ public class WaveformView implements IWaveformView { } }; nameList.addListener(SWT.Paint, (Event event) -> { - if(!trackVerticalOffset.isEmpty()) { + if (!trackVerticalOffset.isEmpty()) { GC gc = event.gc; Rectangle rect = ((Canvas) event.widget).getClientArea(); paintNames(gc, rect); @@ -396,7 +406,7 @@ public class WaveformView implements IWaveformView { } }; valueList.addListener(SWT.Paint, (Event event) -> { - if(!trackVerticalOffset.isEmpty()) { + if (!trackVerticalOffset.isEmpty()) { GC gc = event.gc; Rectangle rect = ((Canvas) event.widget).getClientArea(); paintValues(gc, rect); @@ -405,11 +415,11 @@ public class WaveformView implements IWaveformView { valueList.addMouseListener(nameValueMouseListener); valueListScrolled.setContent(valueList); - waveformCanvas.setMaxTime(1); - waveformCanvas.addPaintListener(waveformMouseListener); - waveformCanvas.addListener(SWT.MouseDown,waveformMouseListener); - waveformCanvas.addListener(SWT.MouseUp,waveformMouseListener); - waveformCanvas.addListener(SWT.MouseMove,waveformMouseListener); + waveformCanvas.setMaxTime(1); + waveformCanvas.addPaintListener(waveformMouseListener); + waveformCanvas.addListener(SWT.MouseDown, waveformMouseListener); + waveformCanvas.addListener(SWT.MouseUp, waveformMouseListener); + waveformCanvas.addListener(SWT.MouseMove, waveformMouseListener); waveformCanvas.addListener(SWT.MouseWheel, waveformMouseListener); nameListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { @@ -477,15 +487,15 @@ public class WaveformView implements IWaveformView { @Override public void propertyChange(PropertyChangeEvent pce) { if ("size".equals(pce.getPropertyName()) || "content".equals(pce.getPropertyName())) { - if(revealSelected) { - waveformCanvas.getDisplay().asyncExec(() ->{ + if (revealSelected) { + waveformCanvas.getDisplay().asyncExec(() -> { update(); currentWaveformSelection.stream().forEach(e -> waveformCanvas.reveal(e.waveform)); valueList.redraw(); nameList.redraw(); }); - revealSelected=false; - } else + revealSelected = false; + } else waveformCanvas.getDisplay().asyncExec(WaveformView.this::update); } } @@ -501,13 +511,13 @@ public class WaveformView implements IWaveformView { tl.setFont(styleProvider.getNameFont()); for (TrackEntry streamEntry : streams) { streamEntry.height = styleProvider.getTrackHeight(); - streamEntry.vOffset=tracksVerticalHeight; - if (streamEntry.waveform.getType()==WaveformType.TRANSACTION) { - streamEntry.currentValue=""; + streamEntry.vOffset = tracksVerticalHeight; + if (streamEntry.waveform.getType() == WaveformType.TRANSACTION) { + streamEntry.currentValue = ""; streamEntry.height *= streamEntry.waveform.getWidth(); painter = new StreamPainter(waveformCanvas, even, streamEntry); - } else if (streamEntry.waveform.getType()==WaveformType.SIGNAL) { - streamEntry.currentValue="---"; + } else if (streamEntry.waveform.getType() == WaveformType.SIGNAL) { + streamEntry.currentValue = "---"; painter = new SignalPainter(waveformCanvas, even, streamEntry); } waveformCanvas.addWaveformPainter(painter, false); @@ -524,7 +534,7 @@ public class WaveformView implements IWaveformView { updateValueList(); waveformCanvas.redraw(); top.layout(new Control[] { valueList, nameList, waveformCanvas }); - if (trackVerticalOffset.isEmpty()){ + if (trackVerticalOffset.isEmpty()) { waveformCanvas.setOrigin(0, 0); } } @@ -540,58 +550,61 @@ public class WaveformView implements IWaveformView { return valueMaxWidth + 15; } - private void updateValueList(){ + private void updateValueList() { final Long time = getCursorTime(); - for(TrackEntry entry:streams){ - if(entry.waveform.getType() == WaveformType.SIGNAL){ + for (TrackEntry entry : streams) { + if (entry.waveform.getType() == WaveformType.SIGNAL) { IEvent[] value = entry.waveform.getEventsBeforeTime(time); - if(value[0] instanceof BitVector){ + if (value[0] instanceof BitVector) { BitVector bv = (BitVector) value[0]; - if(bv.getWidth()==1) - entry.currentValue="b'"+bv; + if (bv.getWidth() == 1) + entry.currentValue = "b'" + bv; else { - switch(entry.valueDisplay) { + switch (entry.valueDisplay) { case SIGNED: - entry.currentValue=Long.toString(bv.toSignedValue()); - break; + entry.currentValue = Long.toString(bv.toSignedValue()); + break; case UNSIGNED: - entry.currentValue=Long.toString(bv.toUnsignedValue()); + entry.currentValue = Long.toString(bv.toUnsignedValue()); break; default: - entry.currentValue="h'"+bv.toHexString(); + entry.currentValue = "h'" + bv.toHexString(); } } - } else if(value[0] instanceof DoubleVal){ + } else if (value[0] instanceof DoubleVal) { Double val = ((DoubleVal) value[0]).value; - if(val>0.001) - entry.currentValue=String.format("%1$,.3f", val); + if (val > 0.001) + entry.currentValue = String.format("%1$,.3f", val); else - entry.currentValue=Double.toString(val); + entry.currentValue = Double.toString(val); } - } else if(entry.waveform.getType() == WaveformType.TRANSACTION){ + } else if (entry.waveform.getType() == WaveformType.TRANSACTION) { ITx[] resultsList = new ITx[entry.waveform.getWidth()]; - Entry firstTx=entry.waveform.getEvents().floorEntry(time); - if(firstTx!=null){ + Entry firstTx = entry.waveform.getEvents().floorEntry(time); + if (firstTx != null) { do { - for(IEvent evt:firstTx.getValue()){ - if(evt instanceof ITxEvent) { - ITx tx=((ITxEvent)evt).getTransaction(); - if((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) && tx.getBeginTime()<=time && tx.getEndTime()>=time){ - if(resultsList[tx.getConcurrencyIndex()]==null) - resultsList[tx.getConcurrencyIndex()]= ((ITxEvent)evt).getTransaction(); + for (IEvent evt : firstTx.getValue()) { + if (evt instanceof ITxEvent) { + ITx tx = ((ITxEvent) evt).getTransaction(); + if ((evt.getKind() == EventKind.BEGIN || evt.getKind() == EventKind.SINGLE) + && tx.getBeginTime() <= time && tx.getEndTime() >= time) { + if (resultsList[tx.getConcurrencyIndex()] == null) + resultsList[tx.getConcurrencyIndex()] = ((ITxEvent) evt).getTransaction(); } } } - firstTx=entry.waveform.getEvents().lowerEntry(firstTx.getKey()); - }while(firstTx!=null && !isArrayFull(resultsList)); - boolean separator=false; + firstTx = entry.waveform.getEvents().lowerEntry(firstTx.getKey()); + } while (firstTx != null && !isArrayFull(resultsList)); + boolean separator = false; StringBuilder sb = new StringBuilder(); - for(ITx o:resultsList){ - if(separator) sb.append("|"); - if(o!=null) sb.append(o.getGenerator().getName()); - separator=true; + for (ITx o : resultsList) { + if (separator) + sb.append("|"); + if (o != null) + sb.append(o.getGenerator().getName()); + separator = true; } - entry.currentValue=sb.toString(); + entry.currentValue = sb.toString(); } } @@ -602,31 +615,41 @@ public class WaveformView implements IWaveformView { valueListScrolled.redraw(); } - - private boolean isArrayFull(Object[] array){ - for(Object o:array){ - if(o==null) return false; + private boolean isArrayFull(Object[] array) { + for (Object o : array) { + if (o == null) + return false; } return true; } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) + /* + * (non-Javadoc) + * + * @see + * com.minres.scviewer.database.swt.IWaveformPanel#addSelectionChangedListener( + * org.eclipse.jface.viewers.ISelectionChangedListener) */ @Override public void addSelectionChangedListener(ISelectionChangedListener listener) { selectionChangedListeners.add(listener); } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) + /* + * (non-Javadoc) + * + * @see com.minres.scviewer.database.swt.IWaveformPanel# + * removeSelectionChangedListener(org.eclipse.jface.viewers. + * ISelectionChangedListener) */ @Override public void removeSelectionChangedListener(ISelectionChangedListener listener) { selectionChangedListeners.remove(listener); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getControl() */ @Override @@ -634,7 +657,9 @@ public class WaveformView implements IWaveformView { return top; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getNameControl() */ @Override @@ -642,7 +667,9 @@ public class WaveformView implements IWaveformView { return nameList; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getValueControl() */ @Override @@ -650,7 +677,9 @@ public class WaveformView implements IWaveformView { return valueList; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getWaveformControl() */ @Override @@ -658,7 +687,9 @@ public class WaveformView implements IWaveformView { return waveformCanvas; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getSelection() */ @Override @@ -671,59 +702,75 @@ public class WaveformView implements IWaveformView { return new StructuredSelection(sel.toArray()); } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#setSelection(org.eclipse.jface.viewers.ISelection) + /* + * (non-Javadoc) + * + * @see + * com.minres.scviewer.database.swt.IWaveformPanel#setSelection(org.eclipse. + * jface.viewers.ISelection) */ @Override public void setSelection(ISelection selection) { setSelection(selection, false, false); } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#setSelection(org.eclipse.jface.viewers.ISelection, boolean) + + /* + * (non-Javadoc) + * + * @see + * com.minres.scviewer.database.swt.IWaveformPanel#setSelection(org.eclipse. + * jface.viewers.ISelection, boolean) */ @Override public void setSelection(ISelection selection, boolean showIfNeeded) { setSelection(selection, false, showIfNeeded); } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#addToSelection(org.eclipse.jface.viewers.ISelection, boolean) + + /* + * (non-Javadoc) + * + * @see + * com.minres.scviewer.database.swt.IWaveformPanel#addToSelection(org.eclipse. + * jface.viewers.ISelection, boolean) */ @Override public void addToSelection(ISelection selection, boolean showIfNeeded) { - setSelection(selection, true, showIfNeeded); + setSelection(selection, true, showIfNeeded); } public void setSelection(ISelection selection, boolean add, boolean addIfNeeded) { boolean selectionChanged = false; - currentWaveformSelection.forEach(e->e.selected=false); + currentWaveformSelection.forEach(e -> e.selected = false); if (selection instanceof IStructuredSelection) { IStructuredSelection sel = (IStructuredSelection) selection; - if(sel.size()==0){ - selectionChanged = currentTxSelection!=null||currentWaveformSelection!=null; + if (sel.size() == 0) { + selectionChanged = currentTxSelection != null || currentWaveformSelection != null; currentTxSelection = null; - currentWaveformSelection .clear(); + currentWaveformSelection.clear(); } else { - if(!add) currentWaveformSelection.clear(); + if (!add) + currentWaveformSelection.clear(); List selList = sel.toList(); - if(selList.get(0) instanceof ITx) { + if (selList.get(0) instanceof ITx) { ITx txSel = (ITx) selList.get(0); - TrackEntry trackEntry = selList.size()==2 && selList.get(1) instanceof TrackEntry? - (TrackEntry) selList.get(1):null; - if(trackEntry==null) { + TrackEntry trackEntry = selList.size() == 2 && selList.get(1) instanceof TrackEntry + ? (TrackEntry) selList.get(1) + : null; + if (trackEntry == null) { trackEntry = getEntryFor(txSel); - if(trackEntry==null && addIfNeeded){ - trackEntry=new TrackEntry(txSel.getStream(), styleProvider); + if (trackEntry == null && addIfNeeded) { + trackEntry = new TrackEntry(txSel.getStream(), styleProvider); streams.add(trackEntry); } } currentTxSelection = txSel; currentWaveformSelection.clear(); currentWaveformSelection.add(trackEntry); - selectionChanged = true; - } else if(selList.size()==1 && selList.get(0) instanceof TrackEntry) { - currentWaveformSelection.add((TrackEntry)selList.get(0)); - if(currentTxSelection!=null) - currentTxSelection=null; + selectionChanged = true; + } else if (selList.size() == 1 && selList.get(0) instanceof TrackEntry) { + currentWaveformSelection.add((TrackEntry) selList.get(0)); + if (currentTxSelection != null) + currentTxSelection = null; selectionChanged = true; } else { System.err.println("Invalid selection"); @@ -746,93 +793,112 @@ public class WaveformView implements IWaveformView { } protected void fireSelectionChanged() { - if(currentWaveformSelection==null) return; - ISelection selection=getSelection(); + if (currentWaveformSelection == null) + return; + ISelection selection = getSelection(); Object[] list = selectionChangedListeners.getListeners(); for (int i = 0; i < list.length; i++) { ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); } } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#moveSelection(com.minres.scviewer.database.swt.GotoDirection) + /* + * (non-Javadoc) + * + * @see + * com.minres.scviewer.database.swt.IWaveformPanel#moveSelection(com.minres. + * scviewer.database.swt.GotoDirection) */ @Override public void moveSelection(GotoDirection direction) { - if(direction==GotoDirection.NEXT || direction==GotoDirection.PREV) - moveSelection(direction, NEXT_PREV_IN_STREAM) ; + if (direction == GotoDirection.NEXT || direction == GotoDirection.PREV) + moveSelection(direction, NEXT_PREV_IN_STREAM); else { - if(currentWaveformSelection.size()==1) { + if (currentWaveformSelection.size() == 1) { int idx = streams.indexOf(currentWaveformSelection.get(0)); - 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))); + 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) - * @see com.minres.scviewer.database.swt.IWaveformPanel#moveSelection(com.minres.scviewer.database.swt.GotoDirection, com.minres.scviewer.database.RelationType) + /* + * (non-Javadoc) + * + * @see + * com.minres.scviewer.database.swt.IWaveformPanel#moveSelection(com.minres. + * scviewer.database.swt.GotoDirection, + * com.minres.scviewer.database.RelationType) */ @Override public void moveSelection(GotoDirection direction, RelationType relationType) { - if(currentWaveformSelection.size() !=1 && currentTxSelection==null) return; - TrackEntry selectedWaveform=currentWaveformSelection.size() == 1? - currentWaveformSelection.get(0) : getEntryFor(currentTxSelection); - if(selectedWaveform.waveform.getType()==WaveformType.TRANSACTION && currentTxSelection!=null) { - if(relationType.equals(IWaveformView.NEXT_PREV_IN_STREAM)){ + if (currentWaveformSelection.size() != 1 && currentTxSelection == null) + return; + TrackEntry selectedWaveform = currentWaveformSelection.size() == 1 ? currentWaveformSelection.get(0) + : getEntryFor(currentTxSelection); + if (selectedWaveform.waveform.getType() == WaveformType.TRANSACTION && currentTxSelection != null) { + if (relationType.equals(IWaveformView.NEXT_PREV_IN_STREAM)) { ITx transaction = null; if (direction == GotoDirection.NEXT) { IEvent[] eventsList = selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime()); - boolean meFound=false; + boolean meFound = false; for (IEvent evt : eventsList) { - if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) { - if(meFound){ - transaction = ((ITxEvent)evt).getTransaction(); + if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN + || evt.getKind() == EventKind.SINGLE) { + if (meFound) { + transaction = ((ITxEvent) evt).getTransaction(); break; } - meFound|= ((ITxEvent)evt).getTransaction().equals(currentTxSelection); + meFound |= ((ITxEvent) evt).getTransaction().equals(currentTxSelection); } } - if (transaction == null){ - Entry entry = selectedWaveform.waveform.getEvents().higherEntry(currentTxSelection.getBeginTime()); - if (entry != null) do { - for (IEvent evt : entry.getValue()) { - if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)) { - transaction = ((ITxEvent)evt).getTransaction(); - break; + if (transaction == null) { + Entry entry = selectedWaveform.waveform.getEvents() + .higherEntry(currentTxSelection.getBeginTime()); + if (entry != null) + do { + for (IEvent evt : entry.getValue()) { + if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN + || evt.getKind() == EventKind.SINGLE)) { + transaction = ((ITxEvent) evt).getTransaction(); + break; + } } - } - if (transaction == null) - entry = selectedWaveform.waveform.getEvents().higherEntry(entry.getKey()); - } while (entry != null && transaction == null); + if (transaction == null) + entry = selectedWaveform.waveform.getEvents().higherEntry(entry.getKey()); + } while (entry != null && transaction == null); } } else if (direction == GotoDirection.PREV) { IEvent[] eventsList = selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime()); - boolean meFound=false; - for (IEvent evt : Lists.reverse(Arrays.asList(eventsList))) { - if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)) { - if(meFound){ - transaction = ((ITxEvent)evt).getTransaction(); + boolean meFound = false; + for (IEvent evt : Lists.reverse(Arrays.asList(eventsList))) { + if (evt instanceof ITxEvent + && (evt.getKind() == EventKind.BEGIN || evt.getKind() == EventKind.SINGLE)) { + if (meFound) { + transaction = ((ITxEvent) evt).getTransaction(); break; } - meFound|= ((ITxEvent)evt).getTransaction().equals(currentTxSelection); + meFound |= ((ITxEvent) evt).getTransaction().equals(currentTxSelection); } } - if (transaction == null){ - Entry entry = selectedWaveform.waveform.getEvents().lowerEntry(currentTxSelection.getBeginTime()); - if (entry != null) do { - for (IEvent evt : Lists.reverse(Arrays.asList(entry.getValue()))) { - if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)) { - transaction = ((ITxEvent)evt).getTransaction(); - break; + if (transaction == null) { + Entry entry = selectedWaveform.waveform.getEvents() + .lowerEntry(currentTxSelection.getBeginTime()); + if (entry != null) + do { + for (IEvent evt : Lists.reverse(Arrays.asList(entry.getValue()))) { + if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN + || evt.getKind() == EventKind.SINGLE)) { + transaction = ((ITxEvent) evt).getTransaction(); + break; + } } - } - if (transaction == null) - entry = selectedWaveform.waveform.getEvents().lowerEntry(entry.getKey()); - } while (entry != null && transaction == null); + if (transaction == null) + entry = selectedWaveform.waveform.getEvents().lowerEntry(entry.getKey()); + } while (entry != null && transaction == null); } } if (transaction != null) { @@ -841,14 +907,14 @@ public class WaveformView implements IWaveformView { } else { ITxRelation tx = null; if (direction == GotoDirection.NEXT) { - Collection outRel=currentTxSelection.getOutgoingRelations(); + Collection outRel = currentTxSelection.getOutgoingRelations(); tx = selectTxToNavigateTo(outRel, relationType, true); - if(tx!=null) + if (tx != null) setSelection(new StructuredSelection(tx.getTarget()), true); } else if (direction == GotoDirection.PREV) { - Collection inRel=currentTxSelection.getIncomingRelations(); + Collection inRel = currentTxSelection.getIncomingRelations(); tx = selectTxToNavigateTo(inRel, relationType, false); - if(tx!=null) + if (tx != null) setSelection(new StructuredSelection(tx.getSource()), true); } } @@ -856,16 +922,20 @@ public class WaveformView implements IWaveformView { } private ITxRelation selectTxToNavigateTo(Collection rel, RelationType relationType, boolean target) { - ArrayList candidates = rel.stream().filter(r -> relationType.equals(r.getRelationType())).collect(Collectors.toCollection(ArrayList::new)); + ArrayList candidates = rel.stream().filter(r -> relationType.equals(r.getRelationType())) + .collect(Collectors.toCollection(ArrayList::new)); switch (candidates.size()) { - case 0: return null; - case 1: return candidates.get(0); + case 0: + return null; + case 1: + return candidates.get(0); default: - ArrayList visibleCandidates = candidates.stream().filter(this::streamsVisible).collect(Collectors.toCollection(ArrayList::new)); - if(visibleCandidates.isEmpty()) { + ArrayList visibleCandidates = candidates.stream().filter(this::streamsVisible) + .collect(Collectors.toCollection(ArrayList::new)); + if (visibleCandidates.isEmpty()) { return new RelSelectionDialog(waveformCanvas.getShell(), candidates, target).open(); - } else if(visibleCandidates.size()==1) { - return visibleCandidates.size()==1?visibleCandidates.get(0):null; + } else if (visibleCandidates.size() == 1) { + return visibleCandidates.size() == 1 ? visibleCandidates.get(0) : null; } else { return new RelSelectionDialog(waveformCanvas.getShell(), visibleCandidates, target).open(); } @@ -878,22 +948,26 @@ public class WaveformView implements IWaveformView { return streams.stream().anyMatch(x -> x.waveform == src) && streams.stream().anyMatch(x -> x.waveform == tgt); } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#moveCursor(com.minres.scviewer.database.swt.GotoDirection) + /* + * (non-Javadoc) + * + * @see com.minres.scviewer.database.swt.IWaveformPanel#moveCursor(com.minres. + * scviewer.database.swt.GotoDirection) */ @Override public void moveCursor(GotoDirection direction) { - if(currentWaveformSelection.size()!=1) return; + if (currentWaveformSelection.size() != 1) + return; TrackEntry sel = currentWaveformSelection.get(0); long time = getCursorTime(); - NavigableMap map=null; - if(sel.waveform.getType()==WaveformType.TRANSACTION || sel.waveform.getType()==WaveformType.SIGNAL){ - map=sel.waveform.getEvents(); + NavigableMap map = null; + if (sel.waveform.getType() == WaveformType.TRANSACTION || sel.waveform.getType() == WaveformType.SIGNAL) { + map = sel.waveform.getEvents(); } - if(map!=null){ - Entry entry=direction==GotoDirection.PREV?map.lowerEntry(time):map.higherEntry(time); - if(entry!=null) { - time=entry.getKey(); + if (map != null) { + Entry entry = direction == GotoDirection.PREV ? map.lowerEntry(time) : map.higherEntry(time); + if (entry != null) { + time = entry.getKey(); setCursorTime(time); waveformCanvas.reveal(time); waveformCanvas.redraw(); @@ -903,48 +977,56 @@ public class WaveformView implements IWaveformView { } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getStreamList() */ @Override public List getStreamList() { return streams; } - /* (non-Javadoc) + + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#deleteSelectedTracks() */ @Override public void deleteSelectedTracks() { List streamList = getStreamList(); - for (Object o : (IStructuredSelection)getSelection()) { - if(o instanceof TrackEntry) { + for (Object o : (IStructuredSelection) getSelection()) { + if (o instanceof TrackEntry) { TrackEntry e = (TrackEntry) o; - e.selected=false; - streamList.remove(e); + e.selected = false; + streamList.remove(e); } } setSelection(new StructuredSelection()); update(); } - /* (non-Javadoc) + + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#moveSelected(int) */ @Override public void moveSelectedTrack(int i) { - if(!currentWaveformSelection.isEmpty()){ + if (!currentWaveformSelection.isEmpty()) { int idx = streams.indexOf(currentWaveformSelection.get(0)); - for(Object o: currentWaveformSelection) + for (Object o : currentWaveformSelection) streams.remove(o); - int tgtIdx=idx+i; - if(tgtIdx<0) tgtIdx=0; - if(tgtIdx>=streams.size()) + int tgtIdx = idx + i; + if (tgtIdx < 0) + tgtIdx = 0; + if (tgtIdx >= streams.size()) streams.addAll(currentWaveformSelection); else streams.addAll(tgtIdx, currentWaveformSelection); - } + } } - protected void paintNames(GC gc, Rectangle rect) { if (!streams.isEmpty()) { try { @@ -954,21 +1036,23 @@ public class WaveformView implements IWaveformView { Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); Rectangle subArea = new Rectangle(rect.x, 0, rect.width, styleProvider.getTrackHeight()); if (lastKey.equals(firstKey)) { - TrackEntry trackEntry=trackVerticalOffset.get(firstKey); + TrackEntry trackEntry = trackVerticalOffset.get(firstKey); IWaveform w = trackEntry.waveform; - if (w.getType()==WaveformType.TRANSACTION) + if (w.getType() == WaveformType.TRANSACTION) subArea.height *= w.getWidth(); drawTextFormat(gc, subArea, firstKey, w.getFullName(), trackEntry.selected); } else { - for (Entry entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()) { + for (Entry entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) + .entrySet()) { IWaveform w = entry.getValue().waveform; subArea.height = styleProvider.getTrackHeight(); - if (w.getType()==WaveformType.TRANSACTION) + if (w.getType() == WaveformType.TRANSACTION) subArea.height *= w.getWidth(); drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), entry.getValue().selected); } } - }catch(NoSuchElementException e){} + } catch (NoSuchElementException e) { + } } } @@ -981,9 +1065,9 @@ public class WaveformView implements IWaveformView { Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); Rectangle subArea = new Rectangle(rect.x, 0, rect.width, styleProvider.getTrackHeight()); if (lastKey.equals(firstKey)) { - TrackEntry trackEntry=trackVerticalOffset.get(firstKey); + TrackEntry trackEntry = trackVerticalOffset.get(firstKey); IWaveform w = trackEntry.waveform; - if (w.getType()==WaveformType.TRANSACTION) + if (w.getType() == WaveformType.TRANSACTION) subArea.height *= w.getWidth(); drawValue(gc, subArea, firstKey, trackEntry.currentValue, trackEntry.selected); } else { @@ -991,22 +1075,25 @@ public class WaveformView implements IWaveformView { .entrySet()) { IWaveform w = entry.getValue().waveform; subArea.height = styleProvider.getTrackHeight(); - if (w.getType()==WaveformType.TRANSACTION) + if (w.getType() == WaveformType.TRANSACTION) subArea.height *= w.getWidth(); - drawValue(gc, subArea, entry.getKey(), entry.getValue().currentValue, entry.getValue().selected); + drawValue(gc, subArea, entry.getKey(), entry.getValue().currentValue, + entry.getValue().selected); } } - }catch(NoSuchElementException e){} + } catch (NoSuchElementException e) { + } } } protected void drawValue(GC gc, Rectangle subArea, Integer yOffset, String value, boolean highlite) { - int beginIndex=0; - for(int offset=0; offsetindex+1){ - final Long oldVal= waveformCanvas.getCursorPainters().get(1+index).getTime(); - waveformCanvas.getCursorPainters().get(1+index).setTime(time); + public void setMarkerTime(long time, int index) { + if (waveformCanvas.getCursorPainters().size() > index + 1) { + final Long oldVal = waveformCanvas.getCursorPainters().get(1 + index).getTime(); + waveformCanvas.getCursorPainters().get(1 + index).setTime(time); pcs.firePropertyChange(MARKER_PROPERTY, oldVal, time); } } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getCursorTime() */ @Override - public long getCursorTime(){ - return waveformCanvas.getCursorPainters().get(0).getTime(); + public long getCursorTime() { + return waveformCanvas.getCursorPainters().get(0).getTime(); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getActMarkerTime() */ @Override - public int getSelectedMarkerId(){ + public int getSelectedMarkerId() { return selectedMarker; } @Override - public List getCursorList(){ + public List getCursorList() { List cursors = new LinkedList<>(); - for(CursorPainter painter:waveformCanvas.getCursorPainters()) cursors.add(painter); + for (CursorPainter painter : waveformCanvas.getCursorPainters()) + cursors.add(painter); return Collections.unmodifiableList(cursors); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getMarkerTime(int) */ @Override - public long getMarkerTime(int index){ - return waveformCanvas.getCursorPainters().get(index+1).getTime(); + public long getMarkerTime(int index) { + return waveformCanvas.getCursorPainters().get(index + 1).getTime(); } private void createStreamDragSource(final Canvas canvas) { @@ -1125,13 +1230,15 @@ public class WaveformView implements IWaveformView { public void dragStart(DragSourceEvent event) { if (event.y < tracksVerticalHeight) { event.doit = true; - LocalSelectionTransfer.getTransfer().setSelection(new StructuredSelection(currentWaveformSelection)); + LocalSelectionTransfer.getTransfer() + .setSelection(new StructuredSelection(currentWaveformSelection)); } } + @Override public void dragSetData(DragSourceEvent event) { if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) { - event.data =getSelection(); + event.data = getSelection(); } } }); @@ -1146,25 +1253,26 @@ public class WaveformView implements IWaveformView { @SuppressWarnings("unchecked") @Override public void drop(DropTargetEvent event) { - if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)){ + if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)) { ISelection s = LocalSelectionTransfer.getTransfer().getSelection(); - if(s instanceof IStructuredSelection){ + if (s instanceof IStructuredSelection) { IStructuredSelection sel = (IStructuredSelection) s; - for(Object o: sel.toList()) + for (Object o : sel.toList()) streams.remove(o); DropTarget tgt = (DropTarget) event.widget; Point dropPoint = ((Canvas) tgt.getControl()).toControl(event.x, event.y); // extract all elements being selected - if( dropPoint.y > trackVerticalOffset.lastKey()) { + if (dropPoint.y > trackVerticalOffset.lastKey()) { streams.addAll(sel.toList()); } else { TrackEntry target = trackVerticalOffset.floorEntry(dropPoint.y).getValue(); - int tgtIdx=streams.indexOf(target); + int tgtIdx = streams.indexOf(target); streams.addAll(tgtIdx, sel.toList()); - } + } } } } + @Override public void dropAccept(DropTargetEvent event) { if (event.detail != DND.DROP_MOVE) { @@ -1175,24 +1283,25 @@ public class WaveformView implements IWaveformView { } public TrackEntry getEntryFor(ITx source) { - Optional optGen = streams.stream().filter(e->source.getGenerator().equals(e.waveform)).findFirst(); - if(optGen.isPresent()) + Optional optGen = streams.stream().filter(e -> source.getGenerator().equals(e.waveform)) + .findFirst(); + if (optGen.isPresent()) return optGen.get(); - Optional optStr = streams.stream().filter(e->source.getStream().equals(e.waveform)).findFirst(); - if(optStr.isPresent()) + Optional optStr = streams.stream().filter(e -> source.getStream().equals(e.waveform)).findFirst(); + if (optStr.isPresent()) return optStr.get(); return null; } @Override public TrackEntry getEntryFor(IWaveform source) { - Optional optGen = streams.stream().filter(e->source.equals(e.waveform)).findFirst(); - if(optGen.isPresent()) + Optional optGen = streams.stream().filter(e -> source.equals(e.waveform)).findFirst(); + if (optGen.isPresent()) return optGen.get(); return null; } - public List getElementsAt(Point pt){ + public List getElementsAt(Point pt) { return waveformCanvas.getElementsAt(pt); } @@ -1205,31 +1314,23 @@ public class WaveformView implements IWaveformView { public void dragStart(DragSourceEvent event) { event.doit = false; List clicked = waveformCanvas.getElementsAt(new Point(event.x, event.y)); - for(Object o:clicked){ - if(o instanceof CursorPainter){ + for (Object o : clicked) { + if (o instanceof CursorPainter) { LocalSelectionTransfer.getTransfer().setSelection(new StructuredSelection(o)); - ((CursorPainter)o).setDragging(true); + ((CursorPainter) o).setDragging(true); event.doit = true; return; } } } + @Override public void dragSetData(DragSourceEvent event) { if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) { - event.data=waveformCanvas.getElementsAt(new Point(event.x, event.y)); + event.data = waveformCanvas.getElementsAt(new Point(event.x, event.y)); } } }); - // int style = SWT.MULTI | SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER; - // final StyledText text = new StyledText(waveformCanvas, style); - // text.setText("Dragging"); - // dragSource.setDragSourceEffect(new DragSourceEffect(text) { - // @Override - // public void dragStart(DragSourceEvent event) { - // event.image = waveformCanvas.getDisplay().getSystemImage(SWT.ICON_WARNING); - // } - // }); } private void createWaveformDropTarget(final Canvas canvas) { @@ -1239,45 +1340,48 @@ public class WaveformView implements IWaveformView { dropTarget.addDropListener(new DropTargetAdapter() { @Override public void drop(DropTargetEvent event) { - if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)){ + if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)) { ISelection sel = LocalSelectionTransfer.getTransfer().getSelection(); - if(sel instanceof IStructuredSelection && - ((IStructuredSelection)sel).getFirstElement() instanceof CursorPainter){ - CursorPainter painter = (CursorPainter)((IStructuredSelection)sel).getFirstElement(); + if (sel instanceof IStructuredSelection + && ((IStructuredSelection) sel).getFirstElement() instanceof CursorPainter) { + CursorPainter painter = (CursorPainter) ((IStructuredSelection) sel).getFirstElement(); painter.setDragging(false); updateWaveform(canvas, event, painter); } } } + @Override public void dropAccept(DropTargetEvent event) { - Point offset = canvas.toControl(event.x, event.y); - if (event.detail != DND.DROP_MOVE || offset.y > trackVerticalOffset.lastKey() + styleProvider.getTrackHeight()) { + Point offset = canvas.toControl(event.x, event.y); + if (event.detail != DND.DROP_MOVE + || offset.y > trackVerticalOffset.lastKey() + styleProvider.getTrackHeight()) { event.detail = DND.DROP_NONE; } } + @Override - public void dragOver(DropTargetEvent event){ + public void dragOver(DropTargetEvent event) { ISelection sel = LocalSelectionTransfer.getTransfer().getSelection(); - if(sel instanceof IStructuredSelection && - ((IStructuredSelection)sel).getFirstElement() instanceof CursorPainter){ - updateWaveform(canvas, event, (CursorPainter) ((IStructuredSelection)sel).getFirstElement()); + if (sel instanceof IStructuredSelection + && ((IStructuredSelection) sel).getFirstElement() instanceof CursorPainter) { + updateWaveform(canvas, event, (CursorPainter) ((IStructuredSelection) sel).getFirstElement()); } } protected void updateWaveform(final Canvas canvas, DropTargetEvent event, CursorPainter painter) { Point dropPoint = canvas.toControl(event.x, event.y); long time = waveformCanvas.getTimeForOffset(dropPoint.x); - final Long oldVal= painter.getTime(); + final Long oldVal = painter.getTime(); painter.setTime(time); - if(painter.id<0){ + if (painter.id < 0) { pcs.firePropertyChange(CURSOR_PROPERTY, oldVal, time); - }else{ + } else { pcs.firePropertyChange(MARKER_PROPERTY, oldVal, time); - pcs.firePropertyChange(MARKER_PROPERTY+painter.id, oldVal, time); + pcs.firePropertyChange(MARKER_PROPERTY + painter.id, oldVal, time); } canvas.getDisplay().asyncExec(() -> { - if(!canvas.isDisposed()){ + if (!canvas.isDisposed()) { canvas.redraw(); updateValueList(); } @@ -1287,16 +1391,24 @@ public class WaveformView implements IWaveformView { } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#addPropertyChangeListener(java.beans.PropertyChangeListener) + /* + * (non-Javadoc) + * + * @see + * com.minres.scviewer.database.swt.IWaveformPanel#addPropertyChangeListener( + * java.beans.PropertyChangeListener) */ @Override public void addPropertyChangeListener(PropertyChangeListener listener) { this.pcs.addPropertyChangeListener(listener); } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#addPropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) + /* + * (non-Javadoc) + * + * @see + * com.minres.scviewer.database.swt.IWaveformPanel#addPropertyChangeListener( + * java.lang.String, java.beans.PropertyChangeListener) */ @Override public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { @@ -1311,16 +1423,24 @@ public class WaveformView implements IWaveformView { return this.pcs.getPropertyChangeListeners(propertyName); } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#removePropertyChangeListener(java.beans.PropertyChangeListener) + /* + * (non-Javadoc) + * + * @see + * com.minres.scviewer.database.swt.IWaveformPanel#removePropertyChangeListener( + * java.beans.PropertyChangeListener) */ @Override public void removePropertyChangeListener(PropertyChangeListener listener) { this.pcs.removePropertyChangeListener(listener); } - /* (non-Javadoc) - * @see com.minres.scviewer.database.swt.IWaveformPanel#removePropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) + /* + * (non-Javadoc) + * + * @see + * com.minres.scviewer.database.swt.IWaveformPanel#removePropertyChangeListener( + * java.lang.String, java.beans.PropertyChangeListener) */ @Override public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { @@ -1331,27 +1451,31 @@ public class WaveformView implements IWaveformView { return this.pcs.hasListeners(propertyName); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getScaledTime(long) */ @Override public String getScaledTime(long time) { StringBuilder sb = new StringBuilder(); - double dTime=time; - double scaledTime = dTime/waveformCanvas.getScaleFactorPow10(); + double dTime = time; + double scaledTime = dTime / waveformCanvas.getScaleFactorPow10(); return sb.append(df.format(scaledTime)).append(waveformCanvas.getUnitStr()).toString(); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.minres.scviewer.database.swt.IWaveformPanel#getZoomLevels() */ @Override - public String[] getZoomLevels(){ - String[] res = new String[Constants.UNIT_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; + public String[] getZoomLevels() { + String[] res = new String[Constants.UNIT_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; } } return res; @@ -1359,23 +1483,25 @@ public class WaveformView implements IWaveformView { @Override public long getBaselineTime() { - return -waveformCanvas.getScaleFactorPow10()*waveformCanvas.getOrigin().x; + return -waveformCanvas.getScaleFactorPow10() * waveformCanvas.getOrigin().x; } @Override public void setBaselineTime(Long time) { Point origin = waveformCanvas.getOrigin(); - origin.x=(int) (-time/waveformCanvas.getScaleFactorPow10()); + 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; + if (percent < -100) + percent = -100; + if (percent > 100) + percent = 100; + int diff = (waveformCanvas.getWidth() * percent) / 100; Point o = waveformCanvas.getOrigin(); - waveformCanvas.setOrigin(o.x-diff, o.y); + waveformCanvas.setOrigin(o.x - diff, o.y); waveformCanvas.redraw(); } @@ -1388,13 +1514,13 @@ public class WaveformView implements IWaveformView { /// probably not the way it should be done @Override - public void addDisposeListener(DisposeListener listener ) { + public void addDisposeListener(DisposeListener listener) { waveformCanvas.addDisposeListener(listener); } @Override public void setStyleProvider(IWaveformStyleProvider styleProvider) { - this.styleProvider=styleProvider; + this.styleProvider = styleProvider; waveformCanvas.setStyleProvider(styleProvider); update(); } @@ -1402,7 +1528,7 @@ public class WaveformView implements IWaveformView { @Override public TrackEntry addWaveform(IWaveform waveform, int idx) { TrackEntry e = new TrackEntry(waveform, styleProvider); - if(idx<0) + if (idx < 0) getStreamList().add(e); else getStreamList().add(idx, e); diff --git a/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java b/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java index 62a9851..1d5c165 100644 --- a/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java +++ b/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java @@ -10,6 +10,8 @@ *******************************************************************************/ package com.minres.scviewer.database.vcd; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -23,6 +25,7 @@ import java.util.TreeMap; import java.util.Vector; import java.util.zip.GZIPInputStream; +import com.google.common.collect.Iterables; import com.minres.scviewer.database.BitVector; import com.minres.scviewer.database.DoubleVal; import com.minres.scviewer.database.IEvent; @@ -50,6 +53,9 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { /** The max time. */ private long maxTime; + /** The pcs. */ + protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); + private static boolean isGzipped(File f) { try (InputStream is = new FileInputStream(f)) { byte [] signature = new byte[2]; @@ -62,23 +68,44 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { } - /* (non-Javadoc) - * @see com.minres.scviewer.database.ITrDb#load(java.io.File) + /** + * Can load. + * + * @param inputFile the input file + * @return true, if successful */ - @SuppressWarnings("unchecked") @Override - public boolean load(IWaveformDb db, File file) throws InputFormatException { - dispose(); - if(file.isDirectory() || !file.exists()) return false; - this.maxTime=0; - boolean res = false; - try { - String name = file.getCanonicalFile().getName(); + public boolean canLoad(File inputFile) { + if(!inputFile.isDirectory() || inputFile.exists()) { + String name = inputFile.getName(); if(!(name.endsWith(".vcd") || name.endsWith(".vcdz") || name.endsWith(".vcdgz") || name.endsWith(".vcd.gz")) ) return false; + boolean gzipped = isGzipped(inputFile); + try(InputStream stream = gzipped ? new GZIPInputStream(new FileInputStream(inputFile)) : new FileInputStream(inputFile)){ + byte[] buffer = new byte[8]; + if (stream.read(buffer, 0, buffer.length) == buffer.length) { + return buffer[0]=='$'; + } + } catch (Exception e) { + return false; + } + } + return false; + } + + /* (non-Javadoc) + * @see com.minres.scviewer.database.ITrDb#load(java.io.File) + */ + @SuppressWarnings("unchecked") + @Override + public void load(IWaveformDb db, File file) throws InputFormatException { + dispose(); + this.maxTime=0; + boolean res = false; + try { signals = new Vector<>(); moduleStack= new ArrayDeque<>(); FileInputStream fis = new FileInputStream(file); @@ -89,13 +116,13 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { throw new InputFormatException(); } if(!res) throw new InputFormatException(); - // calculate max time of database + // calculate max time of this database for(IWaveform waveform:signals) { NavigableMap events =waveform.getEvents(); - if(events.size()>0) + if(!events.isEmpty()) maxTime= Math.max(maxTime, events.lastKey()); } - // extend signals to hav a last value set at max time + // extend signals to have a last value set at max time for(IWaveform s:signals){ if(s instanceof VCDSignal) { TreeMap events = (TreeMap) ((VCDSignal)s).getEvents(); @@ -108,7 +135,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { } } } - return true; + pcs.firePropertyChange(IWaveformDbLoader.LOADING_FINISHED, null, null); } public void dispose() { @@ -167,6 +194,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { signals.add( i<0 ? new VCDSignal(id, netName, width) : new VCDSignal((VCDSignal)signals.get(i), id, netName)); } + pcs.firePropertyChange(IWaveformDbLoader.SIGNAL_ADDED, null, Iterables.getLast(signals)); return id; } @@ -209,4 +237,25 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { return Collections.emptyList(); } + /** + * Adds the property change listener. + * + * @param l the l + */ + @Override + public void addPropertyChangeListener(PropertyChangeListener l) { + pcs.addPropertyChangeListener(l); + } + + /** + * Removes the property change listener. + * + * @param l the l + */ + @Override + public void removePropertyChangeListener(PropertyChangeListener l) { + pcs.removePropertyChangeListener(l); + } + + } diff --git a/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDFileParser.java b/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDFileParser.java index 3135345..fdd3c4c 100644 --- a/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDFileParser.java +++ b/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDFileParser.java @@ -161,12 +161,9 @@ class VCDFileParser { else if (tokenizer.sval.equals("$enddefinitions")) { match("$end"); return false; - } else { - // Ignore this defintion - do { - if (!nextToken()) return false; - } while (!tokenizer.sval.equals("$end")); - } + } else do { + if (!nextToken()) return false; + } while (!tokenizer.sval.equals("$end")); return true; } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java index fbcb3bf..c37416b 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java @@ -13,6 +13,7 @@ package com.minres.scviewer.database; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -27,18 +28,10 @@ public class HierNode implements IHierNode { protected IHierNode parent = null; /** The childs. */ - protected ArrayList childs; + protected List childNodes = Collections.synchronizedList(new ArrayList<>()); /** The pcs. */ - protected PropertyChangeSupport pcs; - - /** - * Instantiates a new hier node. - */ - public HierNode() { - childs = new ArrayList<>(); - pcs = new PropertyChangeSupport(this); - } + protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); /** * Instantiates a new hier node. @@ -46,7 +39,6 @@ public class HierNode implements IHierNode { * @param name the name */ public HierNode(String name) { - this(); this.name = name; } @@ -57,11 +49,16 @@ public class HierNode implements IHierNode { * @param parent the parent */ public HierNode(String name, IHierNode parent) { - this(); this.name = name; this.parent = parent; } + /** + * Instantiates a new hier node. + */ + public HierNode() { + } + /** * Adds the property change listener. * @@ -115,6 +112,16 @@ public class HierNode implements IHierNode { this.name = name; } + /** + * Gets the parent. + * + * @return the parent + */ + @Override + public IHierNode getParent() { + return parent; + } + /** * Sets the parent. * @@ -132,7 +139,7 @@ public class HierNode implements IHierNode { */ @Override public List getChildNodes() { - return childs; + return Collections.unmodifiableList(childNodes); } /** @@ -140,9 +147,10 @@ public class HierNode implements IHierNode { * * @param child the child */ + @Override public void addChild(IHierNode child) { - if (!childs.contains(child)) { - childs.add(child); + if (!childNodes.contains(child)) { + childNodes.add(child); child.setParent(this); } } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java index e81576e..44acf93 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java @@ -18,6 +18,15 @@ import java.util.List; */ public interface IHierNode extends Comparable { + /** The Constant WAVEFORMS. */ + static final String WAVEFORMS = "Waveforms"; + + /** The Constant CHILDS. */ + static final String CHILDS = "Childs"; + + /** The Constant LOADING_FINISHED. */ + static final String LOADING_FINISHED = "LoadingFinished"; + /** * Attach a non-null PropertyChangeListener to this object. * @@ -61,6 +70,13 @@ public interface IHierNode extends Comparable { */ public void setParent(IHierNode parent); + /** + * Gets the parent. + * + * @return the parent + */ + public IHierNode getParent(); + /** * Gets the child nodes. * @@ -68,6 +84,12 @@ public interface IHierNode extends Comparable { */ public List getChildNodes(); + /** + * Adds the child. + * + * @param child the child + */ + public void addChild(IHierNode child); /** * Derive waveform. * diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbLoader.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbLoader.java index 3cff5b9..740f6cf 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbLoader.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbLoader.java @@ -10,6 +10,7 @@ *******************************************************************************/ package com.minres.scviewer.database; +import java.beans.PropertyChangeListener; import java.io.File; import java.util.Collection; @@ -17,38 +18,51 @@ import java.util.Collection; * The Interface IWaveformDbLoader. */ public interface IWaveformDbLoader { -// static final String STREAM_ADDED = "StreamAdded"; -// -// static final String GENERATOR_ADDED = "GeneratorAdded"; -// -// static final String LOADING_FINISHED = "LoadingFinished"; -// /** -// * Attach a non-null PropertyChangeListener to this object. -// * -// * @param l -// * a non-null PropertyChangeListener instance -// * @throws IllegalArgumentException -// * if the parameter is null -// */ -// public void addPropertyChangeListener(PropertyChangeListener l); -// -// /** -// * Remove a PropertyChangeListener from this component. -// * -// * @param l -// * a PropertyChangeListener instance -// */ -// public void removePropertyChangeListener(PropertyChangeListener l) ; + + /** The Constant STREAM_ADDED. */ + static final String STREAM_ADDED = "StreamAdded"; + + /** The Constant STREAM_ADDED. */ + static final String SIGNAL_ADDED = "SignalAdded"; + + /** The Constant GENERATOR_ADDED. */ + static final String GENERATOR_ADDED = "GeneratorAdded"; + + /** The Constant LOADING_FINISHED. */ + static final String LOADING_FINISHED = "LoadingFinished"; + /** + * Attach a non-null PropertyChangeListener to this object. + * + * @param l + * a non-null PropertyChangeListener instance + * @throws IllegalArgumentException + * if the parameter is null + */ + public void addPropertyChangeListener(PropertyChangeListener l); + /** + * Remove a PropertyChangeListener from this component. + * + * @param l + * a PropertyChangeListener instance + */ + public void removePropertyChangeListener(PropertyChangeListener l) ; + + /** + * Can load the given file. + * + * @param inputFile the input file + * @return true, if successful + */ + public boolean canLoad(File inputFile); /** * Load. * * @param db the db - * @param inp the inp - * @return true, if successful + * @param inputFile the input file * @throws InputFormatException the input format exception */ - public boolean load(IWaveformDb db, File inp) throws InputFormatException; + public void load(IWaveformDb db, File inputFile) throws InputFormatException; /** * Gets the max time. 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 6930e06..5524e83 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 @@ -10,6 +10,8 @@ *******************************************************************************/ package com.minres.scviewer.database.internal; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.io.File; import java.util.ArrayList; import java.util.Collections; @@ -28,7 +30,7 @@ import com.minres.scviewer.database.RelationType; /** * The Class WaveformDb. */ -public class WaveformDb extends HierNode implements IWaveformDb { +public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeListener { /** The loaders. */ private static List loaders = new LinkedList<>(); @@ -122,8 +124,11 @@ public class WaveformDb extends HierNode implements IWaveformDb { @Override public boolean load(File inp) { for (IWaveformDbLoader loader : loaders) { - try { - if (loader.load(this, inp)) { + if(loader.canLoad(inp)) { + try { + loader.addPropertyChangeListener(this); + loader.load(this, inp); + loader.removePropertyChangeListener(this); for (IWaveform w : loader.getAllWaves()) { waveforms.put(w.getFullName(), w); } @@ -134,13 +139,12 @@ public class WaveformDb extends HierNode implements IWaveformDb { name = getFileBasename(inp.getName()); buildHierarchyNodes(); relationTypes.addAll(loader.getAllRelationTypes()); - pcs.firePropertyChange("WAVEFORMS", null, waveforms); - pcs.firePropertyChange("CHILDS", null, childs); + pcs.firePropertyChange(IHierNode.LOADING_FINISHED, null, null); loaded = true; return true; + } catch (Exception e) { + return false; } - } catch (Exception e) { - return false; } } return false; @@ -167,7 +171,7 @@ public class WaveformDb extends HierNode implements IWaveformDb { @Override public void clear() { waveforms.clear(); - childs.clear(); + childNodes.clear(); loaded = false; } @@ -180,49 +184,60 @@ public class WaveformDb extends HierNode implements IWaveformDb { return loaded; } + @Override + public void propertyChange(PropertyChangeEvent evt) { + if(IWaveformDbLoader.SIGNAL_ADDED.equals(evt.getPropertyName()) || + IWaveformDbLoader.STREAM_ADDED.equals(evt.getPropertyName())) { + IWaveform waveform = (IWaveform) evt.getNewValue(); + putInHierarchy(waveform); + pcs.firePropertyChange(IHierNode.WAVEFORMS, null, waveforms); + pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes); + } else if(IWaveformDbLoader.GENERATOR_ADDED.equals(evt.getPropertyName())) { + pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes); + } + } + /** * Builds the hierarchy nodes. */ private void buildHierarchyNodes() { + boolean needsSorting=false; for (IWaveform stream : getAllWaves()) { - String[] hier = stream.getName().split("\\."); - IHierNode node = this; - for (int i = 0; i < hier.length - 1; ++i) { - String name = hier[i]; - IHierNode childNode = null; - for (IHierNode n : node.getChildNodes()) { - if (n.getName().equals(name)) { - childNode = n; - break; - } - } - if (childNode != null) { - node = childNode; - break; - } - HierNode newNode = new HierNode(name, node); - node.getChildNodes().add(newNode); - node = newNode; - + if(stream.getParent()==null) { + putInHierarchy(stream); + needsSorting=true; } - node.getChildNodes().add(stream); - stream.setParent(node); - stream.setName(hier[hier.length - 1]); } - sortRecursive(this); + if(needsSorting) { + pcs.firePropertyChange(IHierNode.WAVEFORMS, null, waveforms); + pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes); + } } - /** - * Sort recursive. - * - * @param node the node - */ - private void sortRecursive(IHierNode node) { - Collections.sort(node.getChildNodes(), (IHierNode o1, IHierNode o2) -> o1.getName().compareTo(o2.getName())); - for (IHierNode n : node.getChildNodes()) { - if (!n.getChildNodes().isEmpty()) - sortRecursive(n); + private synchronized void putInHierarchy(IWaveform waveform) { + String[] hier = waveform.getName().split("\\."); + IHierNode node = this; + for (int i = 0; i < hier.length - 1; ++i) { + String name = hier[i]; + IHierNode childNode = null; + for (IHierNode n : node.getChildNodes()) { + if (n.getName().equals(name)) { + childNode = n; + break; + } + } + if (childNode != null) { + node = childNode; + break; + } + HierNode newNode = new HierNode(name, node); + node.addChild(newNode); + node = newNode; + } + node.addChild(waveform); + waveform.setParent(node); + waveform.setName(hier[hier.length - 1]); } /** @@ -234,4 +249,5 @@ public class WaveformDb extends HierNode implements IWaveformDb { public List getAllRelationTypes() { return relationTypes; } + } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Constants.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Constants.java new file mode 100644 index 0000000..63dc35a --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Constants.java @@ -0,0 +1,9 @@ +package com.minres.scviewer.e4.application; + +public class Constants { + + public static final String PLUGIN_ID = "com.minres.scviewer.e4.application"; //$NON-NLS-1$ + + private Constants() {} + +} diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddWaveformHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddWaveformHandler.java index 38223d3..177c131 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddWaveformHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddWaveformHandler.java @@ -29,8 +29,8 @@ import com.minres.scviewer.e4.application.parts.DesignBrowser; public class AddWaveformHandler { - public final static String PARAM_WHERE_ID="com.minres.scviewer.e4.application.command.addwaveform.where"; //$NON-NLS-1$ - public final static String PARAM_ALL_ID="com.minres.scviewer.e4.application.command.addwaveform.all"; //$NON-NLS-1$ + public static final String PARAM_WHERE_ID="com.minres.scviewer.e4.application.command.addwaveform.where"; //$NON-NLS-1$ + public static final String PARAM_ALL_ID="com.minres.scviewer.e4.application.command.addwaveform.all"; //$NON-NLS-1$ @Inject @Optional DesignBrowser designBrowser; @@ -42,8 +42,11 @@ public class AddWaveformHandler { if(designBrowser==null || designBrowser.getActiveWaveformViewerPart()==null) return false; boolean before = "before".equalsIgnoreCase(where); //$NON-NLS-1$ IStructuredSelection waveformSelection = null; - if(designBrowser.getActiveWaveformViewerPart()!=null) + if(designBrowser.getActiveWaveformViewerPart()!=null) { + if(!designBrowser.getActiveWaveformViewerPart().getDatabase().isLoaded()) + return false; waveformSelection = (IStructuredSelection)designBrowser.getActiveWaveformViewerPart().getSelection(); + } if("true".equalsIgnoreCase(all)) //$NON-NLS-1$ return designBrowser.getFilteredChildren().length>0 && (!before || (waveformSelection!=null && waveformSelection.size()>0)); diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/status/HeapStatus.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/status/HeapStatus.java index 9cf6433..5158d49 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/status/HeapStatus.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/status/HeapStatus.java @@ -36,6 +36,8 @@ import org.eclipse.wb.swt.ResourceManager; import org.eclipse.wb.swt.SWTResourceManager; import org.osgi.service.prefs.Preferences; +import com.minres.scviewer.e4.application.Constants; + /** * The Heap Status control, which shows the heap usage statistics in the window trim. * Part of the code is taken from the eclipse internal implementation @@ -162,7 +164,7 @@ public class HeapStatus extends Composite { button = new Canvas(this, SWT.NONE); button.setToolTipText("Run Garbage Collection"); - ImageDescriptor imageDesc = ResourceManager.getPluginImageDescriptor("com.minres.scviewer.e4.application", "icons/trash.png"); //$NON-NLS-1$ + ImageDescriptor imageDesc = ResourceManager.getPluginImageDescriptor(Constants.PLUGIN_ID, "icons/trash.png"); //$NON-NLS-1$ Display display = getDisplay(); gcImage = imageDesc.createImage(); if (gcImage != null) { @@ -228,6 +230,8 @@ public class HeapStatus extends Composite { arm(false); } break; + default: + break; } } @@ -301,8 +305,8 @@ public class HeapStatus extends Composite { long max = Long.MAX_VALUE; try { // Must use reflect to allow compilation against JCL/Foundation - Method maxMemMethod = Runtime.class.getMethod("maxMemory", new Class[0]); //$NON-NLS-1$ - Object o = maxMemMethod.invoke(Runtime.getRuntime(), new Object[0]); + Method maxMemMethod = Runtime.class.getMethod("maxMemory"); //$NON-NLS-1$ + Object o = maxMemMethod.invoke(Runtime.getRuntime()); if (o instanceof Long) { max = ((Long) o).longValue(); } @@ -441,14 +445,7 @@ public class HeapStatus extends Composite { @Override public void run() { busyGC(); - getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - if (!isDisposed()) { - gcRunning(false); - } - } - }); + getDisplay().asyncExec(() -> { if (!isDisposed()) gcRunning(false); }); } }; t.start(); @@ -669,7 +666,7 @@ public class HeapStatus extends Composite { * @return the string */ private String convertToMegString(long numBytes) { - return new Long(convertToMeg(numBytes)).toString()+"M"; + return Long.toString(convertToMeg(numBytes))+"M"; } /** diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/AboutDialog.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/AboutDialog.java index c63aea0..2be95b1 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/AboutDialog.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/AboutDialog.java @@ -26,8 +26,6 @@ import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; @@ -36,13 +34,12 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.wb.swt.ResourceManager; import org.eclipse.wb.swt.SWTResourceManager; import org.osgi.framework.Version; +import com.minres.scviewer.e4.application.Constants; import com.minres.scviewer.e4.application.Messages; /** @@ -73,34 +70,32 @@ public class AboutDialog extends Dialog { @Override protected Control createDialogArea(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); - GridData gd_composite = new GridData(SWT.LEFT, SWT.FILL, true, true); - gd_composite.widthHint = 600; - gd_composite.heightHint =300; - composite.setLayoutData(gd_composite); + GridData gdComposite = new GridData(SWT.LEFT, SWT.FILL, true, true); + gdComposite.widthHint = 600; + gdComposite.heightHint =300; + composite.setLayoutData(gdComposite); composite.setLayout(new GridLayout(2, false)); final Color white=SWTResourceManager.getColor(SWT.COLOR_WHITE); - final Image scviewerLogo=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/SCViewer_logo.png"); //$NON-NLS-1$ //$NON-NLS-2$ - final Image minresLogo=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/Minres_logo.png"); //$NON-NLS-1$ //$NON-NLS-2$ + final Image scviewerLogo=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/SCViewer_logo.png"); //$NON-NLS-1$ + final Image minresLogo=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/Minres_logo.png"); //$NON-NLS-1$ Canvas canvas = new Canvas(composite,SWT.NO_REDRAW_RESIZE); - GridData gd_canvas = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); - gd_canvas.widthHint = 200; - gd_canvas.heightHint =300; - canvas.setLayoutData(gd_canvas); - canvas.addPaintListener(new PaintListener() { - public void paintControl(PaintEvent e) { + GridData gdCanvas = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gdCanvas.widthHint = 200; + gdCanvas.heightHint =300; + canvas.setLayoutData(gdCanvas); + canvas.addPaintListener(e -> { e.gc.setBackground(white); e.gc.fillRectangle(e.x, e.y, e.width, e.height); e.gc.drawImage(scviewerLogo,4,0); e.gc.drawImage(minresLogo,0,200); - } }); StyledText styledText = new StyledText(composite, SWT.V_SCROLL | SWT.BORDER); styledText.setEditable(false); - GridData gd_styledText = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); - styledText.setLayoutData(gd_styledText); + GridData gdStyledText = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + styledText.setLayoutData(gdStyledText); Version version = Platform.getProduct().getDefiningBundle().getVersion(); String versionString = String.format("%d.%d.%d", version.getMajor(), version.getMinor(), version.getMicro()); String productTitle = NLS.bind(Messages.AboutDialog_0, versionString); @@ -129,22 +124,17 @@ public class AboutDialog extends Dialog { styleRange.length = matcher.end()-matcher.start(); styledText.setStyleRange(styleRange); } - styledText.addListener(SWT.MouseDown, new Listener() { - @Override - public void handleEvent(Event event) { - // It is up to the application to determine when and how a link should be activated. - // links are activated on mouse down when the control key is held down -// if ((event.stateMask & SWT.MOD1) != 0) { - try { - @SuppressWarnings("deprecation") - int offset = ((StyledText)event.widget).getOffsetAtLocation(new Point (event.x, event.y)); - StyleRange style = ((StyledText)event.widget).getStyleRangeAtOffset(offset); - if (style != null && style.underline && style.underlineStyle == SWT.UNDERLINE_LINK) { - Desktop.getDesktop().browse(new java.net.URI(style.data.toString())); - } - } catch (IOException | URISyntaxException | IllegalArgumentException e) {} -// } - } + styledText.addListener(SWT.MouseDown, event -> { + // It is up to the application to determine when and how a link should be activated. + // links are activated on mouse down when the control key is held down + try { + @SuppressWarnings("deprecation") + int offset = ((StyledText)event.widget).getOffsetAtLocation(new Point (event.x, event.y)); + StyleRange style = ((StyledText)event.widget).getStyleRangeAtOffset(offset); + if (style != null && style.underline && style.underlineStyle == SWT.UNDERLINE_LINK) { + Desktop.getDesktop().browse(new java.net.URI(style.data.toString())); + } + } catch (IOException | URISyntaxException | IllegalArgumentException e) {} }); styleRange.start = 0; @@ -154,6 +144,7 @@ public class AboutDialog extends Dialog { /* (non-Javadoc) * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) */ + @Override protected void createButtonsForButtonBar(Composite parent) { // create OK button createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true); diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/DesignBrowser.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/DesignBrowser.java index 4032795..be74068 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/DesignBrowser.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/DesignBrowser.java @@ -13,7 +13,6 @@ package com.minres.scviewer.e4.application.parts; import java.beans.PropertyChangeListener; import java.lang.annotation.Annotation; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -65,6 +64,7 @@ import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.IHierNode; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; +import com.minres.scviewer.e4.application.Constants; import com.minres.scviewer.e4.application.Messages; import com.minres.scviewer.e4.application.handlers.AddWaveformHandler; import com.minres.scviewer.e4.application.provider.TxDbContentProvider; @@ -125,12 +125,17 @@ public class DesignBrowser { /** The tree viewer pcl. */ private PropertyChangeListener treeViewerPCL = evt -> { - if("CHILDS".equals(evt.getPropertyName())){ //$NON-NLS-1$ + if(IHierNode.CHILDS.equals(evt.getPropertyName())){ //$NON-NLS-1$ treeViewer.getTree().getDisplay().asyncExec(() -> treeViewer.refresh()); - } else if("WAVEFORMS".equals(evt.getPropertyName())) { + } else if(IHierNode.WAVEFORMS.equals(evt.getPropertyName())) { treeViewer.getTree().getDisplay().asyncExec(() -> { - IWaveformDb database = waveformViewerPart.getDatabase(); - treeViewer.setInput(Arrays.asList(database.isLoaded()?new IWaveformDb[]{database}:new IWaveformDb[]{new LoadingWaveformDb()})); + treeViewer.setInput(new IWaveformDb[]{waveformViewerPart.getDatabase()}); + treeViewer.refresh(); + }); + } else if(IHierNode.LOADING_FINISHED.equals(evt.getPropertyName())) { + treeViewer.getTree().getDisplay().asyncExec(() -> { + treeViewer.update(waveformViewerPart.getDatabase(), null); + DesignBrowser.this.updateButtons(); }); } }; @@ -195,7 +200,12 @@ public class DesignBrowser { treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); - treeViewer.setContentProvider(new TxDbContentProvider()); + treeViewer.setContentProvider(new TxDbContentProvider() { + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + updateButtons(); + } + }); treeViewer.setLabelProvider(new TxDbLabelProvider()); treeViewer.addFilter(treeAttributeFilter); treeViewer.setUseHashlookup(true); @@ -236,7 +246,12 @@ public class DesignBrowser { tableAttributeFilter = new StreamTableFilter(); txTableViewer = new TableViewer(parent); - txTableViewer.setContentProvider(new TxDbContentProvider(true)); + txTableViewer.setContentProvider(new TxDbContentProvider(true) { + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + updateButtons(); + } + }); txTableViewer.setLabelProvider(new TxDbLabelProvider()); txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); txTableViewer.addFilter(tableAttributeFilter); @@ -258,7 +273,7 @@ public class DesignBrowser { appendItem = new ToolItem(toolBar, SWT.NONE); appendItem.setToolTipText(Messages.DesignBrowser_4); - appendItem.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/append_wave.png")); //$NON-NLS-1$ //$NON-NLS-2$ + appendItem.setImage(ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/append_wave.png")); //$NON-NLS-1$ appendItem.setEnabled(false); appendItem.addSelectionListener(new SelectionAdapter() { @Override @@ -273,7 +288,7 @@ public class DesignBrowser { insertItem = new ToolItem(toolBar, SWT.NONE); insertItem.setToolTipText(Messages.DesignBrowser_8); - insertItem.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/insert_wave.png")); //$NON-NLS-1$ //$NON-NLS-2$ + insertItem.setImage(ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/insert_wave.png")); //$NON-NLS-1$ insertItem.setEnabled(false); insertItem.addSelectionListener(new SelectionAdapter() { @Override @@ -356,7 +371,7 @@ public class DesignBrowser { if(db==database) return; // do nothing if old and new database is the same ((List)input).get(0).removePropertyChangeListener(treeViewerPCL); } - treeViewer.setInput(Arrays.asList(database.isLoaded()?new IWaveformDb[]{database}:new IWaveformDb[]{new LoadingWaveformDb()})); + treeViewer.setInput(new IWaveformDb[]{database}); Object state=this.waveformViewerPart.retrieveDesignBrowerState(); if(state instanceof DBState) ((DBState)state).apply(); diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java index 2063f3f..8d86b03 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java @@ -5,7 +5,6 @@ import java.nio.file.FileSystems; import java.nio.file.PathMatcher; import java.util.ArrayList; import java.util.Arrays; -import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -48,6 +47,8 @@ import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.wb.swt.ResourceManager; +import com.minres.scviewer.e4.application.Constants; + public class FileBrowserDialog extends TrayDialog { private Image folderImage; @@ -80,9 +81,9 @@ public class FileBrowserDialog extends TrayDialog { public FileBrowserDialog(Shell parentShell) { super(parentShell); - folderImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/folder.png"); //$NON-NLS-1$ //$NON-NLS-2$ - dbImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/database.png"); //$NON-NLS-1$ //$NON-NLS-2$ - fileImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/page_white.png"); //$NON-NLS-1$ //$NON-NLS-2$ + folderImage=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/folder.png"); //$NON-NLS-1$ + dbImage=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/database.png"); //$NON-NLS-1$ + fileImage=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/page_white.png"); //$NON-NLS-1$ currentDirFile = new File("."); } @@ -148,7 +149,7 @@ public class FileBrowserDialog extends TrayDialog { toolBar.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); final ToolItem toolbarItemUp = new ToolItem(toolBar, SWT.PUSH); toolbarItemUp.setToolTipText("up one level"); - toolbarItemUp.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/arrow_up.png")); //$NON-NLS-1$ //$NON-NLS-2$); + toolbarItemUp.setImage(ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/arrow_up.png")); //$NON-NLS-1$ toolbarItemUp.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { @@ -158,7 +159,7 @@ public class FileBrowserDialog extends TrayDialog { } } }); - tableViewer = new TableViewer(tableViewerParent, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI); + tableViewer = new TableViewer(tableViewerParent, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); tableViewer.getTable().setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); tableViewer.addSelectionChangedListener(event -> { IStructuredSelection sel = event.getStructuredSelection(); @@ -187,8 +188,8 @@ public class FileBrowserDialog extends TrayDialog { public void mouseDown(MouseEvent e) { mouseUp(e); } @Override public void mouseUp(MouseEvent e) { - TableItem element = (TableItem)tableViewer.getTable().getItem(new Point(e.x, e.y)); final Table table = tableViewer.getTable(); + TableItem element = table.getItem(new Point(e.x, e.y)); if (element == null )//&& (e.stateMask&SWT.MODIFIER_MASK)!=0) table.deselectAll(); else { @@ -231,7 +232,6 @@ public class FileBrowserDialog extends TrayDialog { colEmpty.setLabelProvider(new FileTableLabelProvider() { @Override public String getText(Object element) { return ""; } }); - //colEmpty.getColumn().setWidth(200); colEmpty.getColumn().setText(""); fileTableComparator = new FileTableComparator(); @@ -268,7 +268,7 @@ public class FileBrowserDialog extends TrayDialog { } private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index) { - SelectionAdapter selectionAdapter = new SelectionAdapter() { + return new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { fileTableComparator.setColumn(index); @@ -278,7 +278,6 @@ public class FileBrowserDialog extends TrayDialog { tableViewer.refresh(); } }; - return selectionAdapter; } private void setDirSelection(File f) { @@ -334,10 +333,11 @@ public class FileBrowserDialog extends TrayDialog { } public boolean matches(Object f) { - assert(f instanceof File); - if(matchers.size()==0) return true; - for (PathMatcher m : matchers) { - if(m.matches(((File)f).toPath())) return true; + if(f instanceof File) { + if(matchers.isEmpty()) return true; + for (PathMatcher m : matchers) { + if(m.matches(((File)f).toPath())) return true; + } } return false; } @@ -349,10 +349,8 @@ public class FileBrowserDialog extends TrayDialog { if(entries != null) { List res = Arrays.stream(entries) .filter(file -> !(file.isFile()||file.getName().startsWith(".") ||globber.matches(file))) - .sorted(new Comparator(){ - public int compare(File f1, File f2){return f1.getName().compareTo(f2.getName());} - }) - .collect(Collectors.toList()); ; + .sorted( (f1, f2) -> f1.getName().compareTo(f2.getName())) + .collect(Collectors.toList()); return res.toArray(); } else return new Object[0]; @@ -364,25 +362,20 @@ public class FileBrowserDialog extends TrayDialog { public boolean hasChildren(Object arg0) { Object[] obj = getChildren(arg0); - return obj == null ? false : obj.length > 0; + return obj != null && obj.length > 0; } public Object[] getElements(Object arg0) { return File.listRoots(); } - public void dispose() { - } - - public void inputChanged(Viewer arg0, Object arg1, Object arg2) { - } } class FileTreeLabelProvider implements ILabelProvider { private List listeners; public FileTreeLabelProvider() { - listeners = new ArrayList(); + listeners = new ArrayList<>(); } public Image getImage(Object arg0) { @@ -400,6 +393,7 @@ public class FileBrowserDialog extends TrayDialog { @Override public void dispose() { + // nothing to ispose } public boolean isLabelProperty(Object arg0, String arg1) { @@ -425,15 +419,12 @@ public class FileBrowserDialog extends TrayDialog { private int propertyIndex = 0; private boolean descending = false; - public FileTableComparator() { - } - public int getDirection() { return descending ? SWT.DOWN : SWT.UP; } public void setColumn(int column) { - descending = column == this.propertyIndex?!descending : false; + descending = column == this.propertyIndex && !descending; this.propertyIndex = column; } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/LoadingWaveformDb.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/LoadingWaveformDb.java deleted file mode 100644 index bb781b9..0000000 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/LoadingWaveformDb.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.minres.scviewer.e4.application.parts; - -import java.beans.PropertyChangeListener; -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import com.minres.scviewer.database.IDerivedWaveform; -import com.minres.scviewer.database.IHierNode; -import com.minres.scviewer.database.IWaveform; -import com.minres.scviewer.database.IWaveformDb; -import com.minres.scviewer.database.RelationType; -import com.minres.scviewer.e4.application.Messages; - -public class LoadingWaveformDb implements IWaveformDb { - - private final String label = Messages.LoadingWaveformDb_0; - - @Override - public void addPropertyChangeListener(PropertyChangeListener l) { - } - - @Override - public void removePropertyChangeListener(PropertyChangeListener l) { - } - - @Override - public String getFullName() { - return label; - } - - @Override - public String getName() { - return label; - } - - @Override - public void setName(String name) { - } - - @Override - public void setParent(IHierNode name) { - } - - @Override - public List getChildNodes() { - return new ArrayList(); - } - - @Override - public int compareTo(IHierNode o) { - return 0; - } - - @Override - public Long getMaxTime() { - return new Long(0); - } - - @Override - public IWaveform getStreamByName(String name) { - return null; - } - - @Override - public List getAllWaves() { - return new ArrayList(); - } - - @Override - public List getAllRelationTypes() { - return new ArrayList(); - } - - @Override - public boolean load(File inp) { - return false; - } - - @Override - public boolean isLoaded() { - return false; - } - - @Override - public void clear() { - } - - @Override - public IDerivedWaveform deriveWaveform() { - return null; - } - -} diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java index a64fc74..53cc956 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java @@ -85,9 +85,6 @@ public class TransactionDetails { /** The selection service. */ @Inject ESelectionService selectionService; - /** The name filter. */ - private Text nameFilter; - /** The tree viewer. */ private TreeViewer treeViewer; @@ -122,7 +119,7 @@ public class TransactionDetails { top = new Composite(parent, SWT.NONE); top.setLayout(new GridLayout(1, false)); - nameFilter = new Text(top, SWT.BORDER); + Text nameFilter = new Text(top, SWT.BORDER); nameFilter.setMessage(Messages.TransactionDetails_0); nameFilter.addModifyListener(e -> { attributeFilter.setSearchText(((Text) e.widget).getText()); @@ -204,11 +201,6 @@ public class TransactionDetails { treeViewer.refresh(); } }); - // Pack the columns - // for (int i = 0, n = table.getColumnCount(); i < n; i++) { - // table.getColumn(i).pack(); - // } - // Turn on the header and the lines tree.setHeaderVisible(true); tree.setLinesVisible(true); diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java index 213d799..c615af0 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java @@ -75,6 +75,7 @@ import org.eclipse.swt.widgets.Widget; import com.minres.scviewer.database.DataType; import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.IHierNode; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbFactory; @@ -251,7 +252,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis showHover=hover; database = dbFactory.getDatabase(); database.addPropertyChangeListener(evt -> { - if ("WAVEFORMS".equals(evt.getPropertyName())) { //$NON-NLS-1$ + if (IHierNode.WAVEFORMS.equals(evt.getPropertyName())) { //$NON-NLS-1$ myParent.getDisplay().syncExec(() -> waveformPane.setMaxTime(database.getMaxTime())); } }); @@ -536,6 +537,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis protected void loadDatabase(final Map state, long delay) { fileMonitor.removeFileChangeListener(this); + database.setName(filesToLoad.stream().map(File::getName).reduce(null, (prefix, element) -> prefix==null? element : prefix + ","+ element)); Job job = new Job(Messages.WaveformViewer_15) { @Override protected IStatus run(IProgressMonitor monitor) { @@ -683,9 +685,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis //clear old streams before loading tab settings if(!waveformPane.getStreamList().isEmpty()) { waveformPane.getStreamList().clear(); - for (TrackEntry trackEntry : waveformPane.getStreamList()) { - trackEntry.selected = false; - } + waveformPane.getStreamList().stream().forEach(e -> e.selected=false); } try (FileInputStream in = new FileInputStream(fileName)) { Properties props = new Properties(); @@ -916,15 +916,6 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis return ext; } - /** - * Gets the model. - * - * @return the model - */ - public IWaveformDb getModel() { - return database; - } - /** * Gets the database. * diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/PreferenceConstants.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/PreferenceConstants.java index 8200463..8026c12 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/PreferenceConstants.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/PreferenceConstants.java @@ -10,13 +10,15 @@ *******************************************************************************/ package com.minres.scviewer.e4.application.preferences; +import com.minres.scviewer.e4.application.Constants; + /** * The Class PreferenceConstants for the preferences dialog & setting. */ public class PreferenceConstants { /** The Constant PREFERENCES_SCOPE. */ - public static final String PREFERENCES_SCOPE="com.minres.scviewer.e4.application"; //$NON-NLS-1$ + public static final String PREFERENCES_SCOPE=Constants.PLUGIN_ID; //$NON-NLS-1$ /** The Constant DATABASE_RELOAD. */ public static final String DATABASE_RELOAD="databaseReload"; //$NON-NLS-1$ @@ -81,5 +83,5 @@ public class PreferenceConstants { /** The Constant MARKER_TEXT_COLOR. */ public static final String MARKER_TEXT_COLOR="MARKER_TEXT_COLOR"; //$NON-NLS-1$ - + private PreferenceConstants() {} } 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 d009bd9..8be23c4 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 @@ -10,7 +10,8 @@ *******************************************************************************/ package com.minres.scviewer.e4.application.provider; -import java.util.Collection; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -35,7 +36,7 @@ public class TxDbContentProvider implements ITreeContentProvider { super(); this.tableEntries = false; } - + /** * Instantiates a new tx db content provider. * @@ -54,12 +55,15 @@ public class TxDbContentProvider implements ITreeContentProvider { if(tableEntries && inputElement instanceof IWaveformDb){ return new Object[]{}; }else if(inputElement instanceof IHierNode){ - Collection res = ((IHierNode)inputElement).getChildNodes().stream().filter(n -> + // make a copy as the laoder might continue to add waveforms + ArrayList nodes = new ArrayList<>(((IHierNode)inputElement).getChildNodes()); + return nodes.stream().filter(n -> tableEntries? n instanceof IWaveform : !n.getChildNodes().isEmpty() - ).collect(Collectors.toList()); - return res.toArray(); + ).sorted(Comparator.comparing(IHierNode::getName)).collect(Collectors.toList()).toArray(); }else if(inputElement instanceof List){ return ((List)inputElement).toArray(); + }else if(inputElement instanceof Object[]){ + return (Object[]) inputElement; } else return new Object[]{}; } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbLabelProvider.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbLabelProvider.java index b66e0cb..df52c1a 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbLabelProvider.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbLabelProvider.java @@ -21,7 +21,7 @@ import org.eclipse.wb.swt.ResourceManager; import com.minres.scviewer.database.IHierNode; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; -import com.minres.scviewer.e4.application.parts.LoadingWaveformDb; +import com.minres.scviewer.e4.application.Constants; /** * The Class TxDbLabelProvider providing the labels for the respective viewers. @@ -29,25 +29,44 @@ import com.minres.scviewer.e4.application.parts.LoadingWaveformDb; public class TxDbLabelProvider implements ILabelProvider { /** The listeners. */ - private List listeners = new ArrayList(); + private List listeners = new ArrayList<>(); /** The wave. */ - private Image loadinDatabase, database, stream, signal, folder, wave; + private Image loadinDatabase; + /** The database. */ + private Image database; + + /** The stream. */ + private Image stream; + + /** The signal. */ + private Image signal; + + /** The folder. */ + private Image folder; + + /** The wave. */ + private Image wave; /** * Instantiates a new tx db label provider. */ public TxDbLabelProvider() { super(); - loadinDatabase=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/database_go.png"); //$NON-NLS-1$ //$NON-NLS-2$ - database=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/database.png"); //$NON-NLS-1$ //$NON-NLS-2$ - stream=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/stream.png"); //$NON-NLS-1$ //$NON-NLS-2$ - folder=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/folder.png"); //$NON-NLS-1$ //$NON-NLS-2$ - signal=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/signal.png"); //$NON-NLS-1$ //$NON-NLS-2$ - wave=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/wave.png"); //$NON-NLS-1$ //$NON-NLS-2$ + loadinDatabase=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/database_go.png"); //$NON-NLS-1$ //$NON-NLS-2$ + database=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/database.png"); //$NON-NLS-1$ //$NON-NLS-2$ + stream=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/stream.png"); //$NON-NLS-1$ //$NON-NLS-2$ + folder=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/folder.png"); //$NON-NLS-1$ //$NON-NLS-2$ + signal=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/signal.png"); //$NON-NLS-1$ //$NON-NLS-2$ + wave=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/wave.png"); //$NON-NLS-1$ //$NON-NLS-2$ } + /** + * Adds the listener. + * + * @param listener the listener + */ /* (non-Javadoc) * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener) */ @@ -56,13 +75,24 @@ public class TxDbLabelProvider implements ILabelProvider { listeners.add(listener); } + /** + * Dispose. + */ /* (non-Javadoc) * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose() */ @Override public void dispose() { + // no resources to dispose } + /** + * Checks if is label property. + * + * @param element the element + * @param property the property + * @return true, if is label property + */ /* (non-Javadoc) * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String) */ @@ -71,6 +101,11 @@ public class TxDbLabelProvider implements ILabelProvider { return false; } + /** + * Removes the listener. + * + * @param listener the listener + */ /* (non-Javadoc) * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener) */ @@ -79,16 +114,19 @@ public class TxDbLabelProvider implements ILabelProvider { listeners.remove(listener); } + /** + * Gets the image. + * + * @param element the element + * @return the image + */ /* (non-Javadoc) * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object) */ @Override public Image getImage(Object element) { if(element instanceof IWaveformDb){ - if(element instanceof LoadingWaveformDb) - return loadinDatabase; - else - return database; + return ((IWaveformDb)element).isLoaded()?database:loadinDatabase; }else if(element instanceof IWaveform){ switch(((IWaveform) element).getType()) { case TRANSACTION: @@ -110,6 +148,12 @@ public class TxDbLabelProvider implements ILabelProvider { return null; } + /** + * Gets the text. + * + * @param element the element + * @return the text + */ /* (non-Javadoc) * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) */ diff --git a/plugins/com.minres.scviewer.e4.application/src/org/eclipse/wb/swt/ResourceManager.java b/plugins/com.minres.scviewer.e4.application/src/org/eclipse/wb/swt/ResourceManager.java index 56f340d..f7b6899 100644 --- a/plugins/com.minres.scviewer.e4.application/src/org/eclipse/wb/swt/ResourceManager.java +++ b/plugins/com.minres.scviewer.e4.application/src/org/eclipse/wb/swt/ResourceManager.java @@ -13,8 +13,6 @@ package org.eclipse.wb.swt; import java.io.File; import java.io.InputStream; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; @@ -61,7 +59,7 @@ public class ResourceManager extends SWTResourceManager { /** * The map where we store our images. */ - private static Map m_descriptorImageMap = new HashMap(); + private static Map descriptorImageMap = new HashMap<>(); /** * Returns an {@link ImageDescriptor} stored in the file at the specified path @@ -97,22 +95,16 @@ public class ResourceManager extends SWTResourceManager { * @return the {@link Image} based on the specified {@link ImageDescriptor}. */ public static Image getImage(ImageDescriptor descriptor) { - if (descriptor == null) { + if (descriptor == null) return null; - } - Image image = m_descriptorImageMap.get(descriptor); - if (image == null) { - image = descriptor.createImage(); - m_descriptorImageMap.put(descriptor, image); - } - return image; + return descriptorImageMap.computeIfAbsent(descriptor, ImageDescriptor::createImage); } /** * Maps images to decorated images. */ @SuppressWarnings("unchecked") - private static Map>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY]; + private static Map>[] decoratedImageMap = new Map[LAST_CORNER_KEY]; /** * Returns an {@link Image} composed of a base image decorated by another image. @@ -140,17 +132,12 @@ public class ResourceManager extends SWTResourceManager { if (corner <= 0 || corner >= LAST_CORNER_KEY) { throw new IllegalArgumentException(Messages.ResourceManager_0); } - Map> cornerDecoratedImageMap = m_decoratedImageMap[corner]; + Map> cornerDecoratedImageMap = decoratedImageMap[corner]; if (cornerDecoratedImageMap == null) { - cornerDecoratedImageMap = new HashMap>(); - m_decoratedImageMap[corner] = cornerDecoratedImageMap; + cornerDecoratedImageMap = new HashMap<>(); + decoratedImageMap[corner] = cornerDecoratedImageMap; } - Map decoratedMap = cornerDecoratedImageMap.get(baseImage); - if (decoratedMap == null) { - decoratedMap = new HashMap(); - cornerDecoratedImageMap.put(baseImage, decoratedMap); - } - // + Map decoratedMap = cornerDecoratedImageMap.computeIfAbsent(baseImage, k -> new HashMap()); Image result = decoratedMap.get(decorator); if (result == null) { final Rectangle bib = baseImage.getBounds(); @@ -181,7 +168,7 @@ public class ResourceManager extends SWTResourceManager { } return result; } - + private static ImageDataProvider getUnzoomedImageDataProvider(ImageData imageData) { return zoom -> zoom == 100 ? imageData : null; } @@ -193,15 +180,13 @@ public class ResourceManager extends SWTResourceManager { public static void disposeImages() { SWTResourceManager.disposeImages(); // dispose ImageDescriptor images - { - for (Iterator I = m_descriptorImageMap.values().iterator(); I.hasNext();) { - I.next().dispose(); - } - m_descriptorImageMap.clear(); + for (Iterator I = descriptorImageMap.values().iterator(); I.hasNext();) { + I.next().dispose(); } + descriptorImageMap.clear(); // dispose decorated images - for (int i = 0; i < m_decoratedImageMap.length; i++) { - Map> cornerDecoratedImageMap = m_decoratedImageMap[i]; + for (int i = 0; i < decoratedImageMap.length; i++) { + Map> cornerDecoratedImageMap = decoratedImageMap[i]; if (cornerDecoratedImageMap != null) { for (Map decoratedMap : cornerDecoratedImageMap.values()) { for (Image image : decoratedMap.values()) { @@ -213,12 +198,10 @@ public class ResourceManager extends SWTResourceManager { } } // dispose plugin images - { - for (Iterator I = m_URLImageMap.values().iterator(); I.hasNext();) { - I.next().dispose(); - } - m_URLImageMap.clear(); + for (Iterator I = urlImageMap.values().iterator(); I.hasNext();) { + I.next().dispose(); } + urlImageMap.clear(); } //////////////////////////////////////////////////////////////////////////// @@ -229,7 +212,7 @@ public class ResourceManager extends SWTResourceManager { /** * Maps URL to images. */ - private static Map m_URLImageMap = new HashMap(); + private static Map urlImageMap = new HashMap<>(); /** * Provider for plugin resources, used by WindowBuilder at design time. @@ -242,29 +225,7 @@ public class ResourceManager extends SWTResourceManager { * Instance of {@link PluginResourceProvider}, used by WindowBuilder at design * time. */ - private static PluginResourceProvider m_designTimePluginResourceProvider = null; - - /** - * Returns an {@link Image} based on a plugin and file path. - * - * @param plugin the plugin {@link Object} containing the image - * @param name the path to the image within the plugin - * @return the {@link Image} stored in the file at the specified path - * - * @deprecated Use {@link #getPluginImage(String, String)} instead. - */ - @Deprecated - public static Image getPluginImage(Object plugin, String name) { - try { - URL url = getPluginImageURL(plugin, name); - if (url != null) { - return getPluginImageFromUrl(url); - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } + private static PluginResourceProvider designTimePluginResourceProvider = null; /** * Returns an {@link Image} based on a {@link Bundle} and resource entry path. @@ -279,7 +240,7 @@ public class ResourceManager extends SWTResourceManager { if (url != null) { return getPluginImageFromUrl(url); } - } catch (Throwable e) { + } catch (Exception e) { // Ignore any exceptions } return null; @@ -290,47 +251,19 @@ public class ResourceManager extends SWTResourceManager { */ private static Image getPluginImageFromUrl(URL url) { try { - try { - String key = url.toExternalForm(); - Image image = m_URLImageMap.get(key); - if (image == null) { - InputStream stream = url.openStream(); - try { - image = getImage(stream); - m_URLImageMap.put(key, image); - } finally { - stream.close(); - } + String key = url.toExternalForm(); + Image image = urlImageMap.get(key); + if (image == null) { + InputStream stream = url.openStream(); + try { + image = getImage(stream); + urlImageMap.put(key, image); + } finally { + stream.close(); } - return image; - } catch (Throwable e) { - // Ignore any exceptions } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - - /** - * Returns an {@link ImageDescriptor} based on a plugin and file path. - * - * @param plugin the plugin {@link Object} containing the image. - * @param name the path to th eimage within the plugin. - * @return the {@link ImageDescriptor} stored in the file at the specified path. - * - * @deprecated Use {@link #getPluginImageDescriptor(String, String)} instead. - */ - @Deprecated - public static ImageDescriptor getPluginImageDescriptor(Object plugin, String name) { - try { - try { - URL url = getPluginImageURL(plugin, name); - return ImageDescriptor.createFromURL(url); - } catch (Throwable e) { - // Ignore any exceptions - } - } catch (Throwable e) { + return image; + } catch (Exception e) { // Ignore any exceptions } return null; @@ -351,7 +284,7 @@ public class ResourceManager extends SWTResourceManager { if (url != null) { return ImageDescriptor.createFromURL(url); } - } catch (Throwable e) { + } catch (Exception e) { // Ignore any exceptions } return null; @@ -362,66 +295,18 @@ public class ResourceManager extends SWTResourceManager { */ private static URL getPluginImageURL(String symbolicName, String path) { // try runtime plugins - { - Bundle bundle = Platform.getBundle(symbolicName); - if (bundle != null) { - return bundle.getEntry(path); - } + Bundle bundle = Platform.getBundle(symbolicName); + if (bundle != null) { + return bundle.getEntry(path); } // try design time provider - if (m_designTimePluginResourceProvider != null) { - return m_designTimePluginResourceProvider.getEntry(symbolicName, path); + if (designTimePluginResourceProvider != null) { + return designTimePluginResourceProvider.getEntry(symbolicName, path); } // no such resource return null; } - /** - * Returns an {@link URL} based on a plugin and file path. - * - * @param plugin the plugin {@link Object} containing the file path. - * @param name the file path. - * @return the {@link URL} representing the file at the specified path. - * @throws Exception - */ - private static URL getPluginImageURL(Object plugin, String name) throws Exception { - // try to work with 'plugin' as with OSGI BundleContext - try { - Class BundleClass = Class.forName("org.osgi.framework.Bundle"); //$NON-NLS-1$ - Class BundleContextClass = Class.forName("org.osgi.framework.BundleContext"); //$NON-NLS-1$ - if (BundleContextClass.isAssignableFrom(plugin.getClass())) { - Method getBundleMethod = BundleContextClass.getMethod("getBundle", new Class[0]); //$NON-NLS-1$ - Object bundle = getBundleMethod.invoke(plugin, new Object[0]); - // - Class PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$ - Constructor pathConstructor = PathClass.getConstructor(new Class[] { String.class }); - Object path = pathConstructor.newInstance(new Object[] { name }); - // - Class IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$ - Class PlatformClass = Class.forName("org.eclipse.core.runtime.Platform"); //$NON-NLS-1$ - Method findMethod = PlatformClass.getMethod("find", new Class[] { BundleClass, IPathClass }); //$NON-NLS-1$ - return (URL) findMethod.invoke(null, new Object[] { bundle, path }); - } - } catch (Throwable e) { - // Ignore any exceptions - } - // else work with 'plugin' as with usual Eclipse plugin - { - Class PluginClass = Class.forName("org.eclipse.core.runtime.Plugin"); //$NON-NLS-1$ - if (PluginClass.isAssignableFrom(plugin.getClass())) { - // - Class PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$ - Constructor pathConstructor = PathClass.getConstructor(new Class[] { String.class }); - Object path = pathConstructor.newInstance(new Object[] { name }); - // - Class IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$ - Method findMethod = PluginClass.getMethod("find", new Class[] { IPathClass }); //$NON-NLS-1$ - return (URL) findMethod.invoke(plugin, new Object[] { path }); - } - } - return null; - } - //////////////////////////////////////////////////////////////////////////// // // General diff --git a/tests/com.minres.scviewer.database.test/DatabaseServicesTest.launch b/tests/com.minres.scviewer.database.test/DatabaseServicesTest.launch index f8e3594..4536e71 100644 --- a/tests/com.minres.scviewer.database.test/DatabaseServicesTest.launch +++ b/tests/com.minres.scviewer.database.test/DatabaseServicesTest.launch @@ -34,7 +34,7 @@ - + diff --git a/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java b/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java index 4029e07..b17f7c2 100644 --- a/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java +++ b/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015 MINRES Technologies GmbH and others. + * Copyright (c) 2015-2021 MINRES Technologies GmbH and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -71,10 +71,10 @@ public class DatabaseServicesTest { assertEquals(2, waveformDb.getChildNodes().size()); IWaveform bus_data_wave = waves.get(0); Entry bus_data_entry = bus_data_wave.getEvents().floorEntry(1400000000L); - assertTrue("01111000".equals(bus_data_entry.getValue()[0].toString())); + assertEquals("01111000", bus_data_entry.getValue()[0].toString()); IWaveform rw_wave = waves.get(2); Entry rw_entry = rw_wave.getEvents().floorEntry(2360000000L); - assertTrue("1".equals(rw_entry.getValue()[0].toString())); + assertEquals("1", rw_entry.getValue()[0].toString()); } @Test @@ -107,6 +107,16 @@ public class DatabaseServicesTest { } } + @Test + public void testTxTextLargeFile() throws Exception { + File f = new File("inputs/hw_cfg7.txlog").getAbsoluteFile(); + assertTrue(f.exists()); + waveformDb.load(f); + assertNotNull(waveformDb); + // hw_cfg_2_gen.txlog: 7.5s (2G) + // hw_cfg7.txlog: 48s(2G) + } + @Test public void testTxTextTruncated() throws Exception { File f = new File("inputs/my_db_truncated.txlog").getAbsoluteFile();