add dynamic update of waveform list

This commit is contained in:
Eyck Jentzsch 2021-01-09 20:10:58 +01:00
parent 15fb825548
commit 73b21cb80b
24 changed files with 1028 additions and 894 deletions

View File

@ -11,9 +11,11 @@
package com.minres.scviewer.database.sqlite; package com.minres.scviewer.database.sqlite;
import java.beans.IntrospectionException; import java.beans.IntrospectionException;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.InputStream;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -40,6 +42,11 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
private ScvSimProps scvSimProps; private ScvSimProps scvSimProps;
private static final byte[] x = "SQLite format 3".getBytes();
/** The pcs. */
protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);
@Override @Override
public Long getMaxTime() { public Long getMaxTime() {
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class,
@ -71,21 +78,28 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
return streams; 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 @Override
public boolean load(IWaveformDb db, File file) throws InputFormatException { public void load(IWaveformDb db, File file) throws InputFormatException {
dispose(); 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=new SQLiteDatabase(file.getAbsolutePath(), db);
database.setData("TIMERESOLUTION", 1L); database.setData("TIMERESOLUTION", 1L);
SQLiteDatabaseSelectHandler<ScvSimProps> handler = new SQLiteDatabaseSelectHandler<>(ScvSimProps.class, database); SQLiteDatabaseSelectHandler<ScvSimProps> handler = new SQLiteDatabaseSelectHandler<>(ScvSimProps.class, database);
@ -94,12 +108,11 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
scvSimProps=simProps; scvSimProps=simProps;
database.setData("TIMERESOLUTION", scvSimProps.getTime_resolution()); database.setData("TIMERESOLUTION", scvSimProps.getTime_resolution());
} }
return true; pcs.firePropertyChange(IWaveformDbLoader.LOADING_FINISHED, null, null);
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException e) {
e.printStackTrace(); throw new InputFormatException();
} }
return false;
} }
public void dispose() { public void dispose() {
@ -112,4 +125,24 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
return usedRelationsList; 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);
}
} }

View File

@ -11,6 +11,8 @@
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.database.text; package com.minres.scviewer.database.text;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -89,6 +91,12 @@ public class TextDbLoader implements IWaveformDbLoader {
/** The threads. */ /** The threads. */
List<Thread> threads = new ArrayList<>(); List<Thread> 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. * Gets the max time.
* *
@ -109,8 +117,31 @@ public class TextDbLoader implements IWaveformDbLoader {
return new ArrayList<>(txStreams.values()); 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. * Load.
@ -122,19 +153,9 @@ public class TextDbLoader implements IWaveformDbLoader {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public boolean load(IWaveformDb db, File file) throws InputFormatException { public void load(IWaveformDb db, File file) throws InputFormatException {
dispose(); dispose();
if (file.isDirectory() || !file.exists())
return false;
TextDbParser parser = new TextDbParser(this);
boolean gzipped = isGzipped(file); 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) if (file.length() < 75000000 * (gzipped ? 1 : 10)
|| "memory".equals(System.getProperty("ScvBackingDB", "file"))) || "memory".equals(System.getProperty("ScvBackingDB", "file")))
mapDb = DBMaker.memoryDirectDB().allocateStartSize(512l * 1024l * 1024l) 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 */); mapDbFile = File.createTempFile("." + file.getName(), ".mapdb", null /* file.parentFile */);
Files.delete(Paths.get(mapDbFile.getPath())); Files.delete(Paths.get(mapDbFile.getPath()));
} catch (IOException e1) { } catch (IOException e1) {
return false; throw new InputFormatException();
} }
mapDb = DBMaker.fileDB(mapDbFile).fileMmapEnable() // Always enable mmap mapDb = DBMaker.fileDB(mapDbFile).fileMmapEnable() // Always enable mmap
.fileMmapEnableIfSupported().fileMmapPreclearDisable().allocateStartSize(512l * 1024l * 1024l) .fileMmapEnableIfSupported().fileMmapPreclearDisable().allocateStartSize(512l * 1024l * 1024l)
.allocateIncrement(128l * 1024l * 1024l).cleanerHackEnable().make(); .allocateIncrement(128l * 1024l * 1024l).cleanerHackEnable().make();
mapDbFile.deleteOnExit(); mapDbFile.deleteOnExit();
} }
TextDbParser parser = new TextDbParser(this);
try { try {
parser.txSink = mapDb.treeMap("transactions", Serializer.LONG, Serializer.JAVA).createFromSink(); parser.txSink = mapDb.treeMap("transactions", Serializer.LONG, Serializer.JAVA).createFromSink();
parser.parseInput(gzipped ? new GZIPInputStream(new FileInputStream(file)) : new FileInputStream(file)); parser.parseInput(gzipped ? new GZIPInputStream(new FileInputStream(file)) : new FileInputStream(file));
@ -160,7 +182,7 @@ public class TextDbLoader implements IWaveformDbLoader {
} catch (Exception e) { } catch (Exception e) {
System.out.println("---->>> Exception " + e.toString() + " caught while loading database"); System.out.println("---->>> Exception " + e.toString() + " caught while loading database");
e.printStackTrace(); e.printStackTrace();
return false; throw new InputFormatException();
} }
for (TxStream stream : txStreams.values()) { for (TxStream stream : txStreams.values()) {
Thread t = new Thread() { Thread t = new Thread() {
@ -175,7 +197,6 @@ public class TextDbLoader implements IWaveformDbLoader {
threads.add(t); threads.add(t);
t.start(); 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. * Checks if is gzipped.
* *
@ -416,7 +415,7 @@ public class TextDbLoader implements IWaveformDbLoader {
if (matcher.matches()) { if (matcher.matches()) {
Long id = Long.parseLong(matcher.group(1)); Long id = Long.parseLong(matcher.group(1));
TxStream stream = new TxStream(loader, id, matcher.group(2), matcher.group(3)); 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])) { } else if ("scv_tr_generator".equals(tokens[0])) {
Matcher matcher = scv_tr_generator.matcher(curLine); Matcher matcher = scv_tr_generator.matcher(curLine);
@ -424,7 +423,7 @@ public class TextDbLoader implements IWaveformDbLoader {
Long id = Long.parseLong(matcher.group(1)); Long id = Long.parseLong(matcher.group(1));
TxStream stream = loader.txStreams.get(Long.parseLong(matcher.group(3))); TxStream stream = loader.txStreams.get(Long.parseLong(matcher.group(3)));
generator = new TxGenerator(loader, id, matcher.group(2), stream); generator = new TxGenerator(loader, id, matcher.group(2), stream);
loader.txGenerators.put(id, generator); add(id, generator);
} }
} else if ("begin_attribute".equals(tokens[0])) { } else if ("begin_attribute".equals(tokens[0])) {
Matcher matcher = begin_attribute.matcher(curLine); Matcher matcher = begin_attribute.matcher(curLine);
@ -497,6 +496,16 @@ public class TextDbLoader implements IWaveformDbLoader {
return 1000000000000000L; return 1000000000000000L;
return 1L; 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; 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);
}
} }

View File

@ -10,6 +10,8 @@
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.database.vcd; package com.minres.scviewer.database.vcd;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
@ -23,6 +25,7 @@ import java.util.TreeMap;
import java.util.Vector; import java.util.Vector;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import com.google.common.collect.Iterables;
import com.minres.scviewer.database.BitVector; import com.minres.scviewer.database.BitVector;
import com.minres.scviewer.database.DoubleVal; import com.minres.scviewer.database.DoubleVal;
import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IEvent;
@ -50,6 +53,9 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
/** The max time. */ /** The max time. */
private long maxTime; private long maxTime;
/** The pcs. */
protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private static boolean isGzipped(File f) { private static boolean isGzipped(File f) {
try (InputStream is = new FileInputStream(f)) { try (InputStream is = new FileInputStream(f)) {
byte [] signature = new byte[2]; 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 @Override
public boolean load(IWaveformDb db, File file) throws InputFormatException { public boolean canLoad(File inputFile) {
dispose(); if(!inputFile.isDirectory() || inputFile.exists()) {
if(file.isDirectory() || !file.exists()) return false; String name = inputFile.getName();
this.maxTime=0;
boolean res = false;
try {
String name = file.getCanonicalFile().getName();
if(!(name.endsWith(".vcd") || if(!(name.endsWith(".vcd") ||
name.endsWith(".vcdz") || name.endsWith(".vcdz") ||
name.endsWith(".vcdgz") || name.endsWith(".vcdgz") ||
name.endsWith(".vcd.gz")) ) name.endsWith(".vcd.gz")) )
return false; 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<>(); signals = new Vector<>();
moduleStack= new ArrayDeque<>(); moduleStack= new ArrayDeque<>();
FileInputStream fis = new FileInputStream(file); FileInputStream fis = new FileInputStream(file);
@ -89,13 +116,13 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
throw new InputFormatException(); throw new InputFormatException();
} }
if(!res) throw new InputFormatException(); if(!res) throw new InputFormatException();
// calculate max time of database // calculate max time of this database
for(IWaveform waveform:signals) { for(IWaveform waveform:signals) {
NavigableMap<Long, IEvent[]> events =waveform.getEvents(); NavigableMap<Long, IEvent[]> events =waveform.getEvents();
if(events.size()>0) if(!events.isEmpty())
maxTime= Math.max(maxTime, events.lastKey()); 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){ for(IWaveform s:signals){
if(s instanceof VCDSignal<?>) { if(s instanceof VCDSignal<?>) {
TreeMap<Long,?> events = (TreeMap<Long, ?>) ((VCDSignal<?>)s).getEvents(); TreeMap<Long,?> events = (TreeMap<Long, ?>) ((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() { public void dispose() {
@ -167,6 +194,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
signals.add( i<0 ? new VCDSignal<BitVector>(id, netName, width) : signals.add( i<0 ? new VCDSignal<BitVector>(id, netName, width) :
new VCDSignal<BitVector>((VCDSignal<BitVector>)signals.get(i), id, netName)); new VCDSignal<BitVector>((VCDSignal<BitVector>)signals.get(i), id, netName));
} }
pcs.firePropertyChange(IWaveformDbLoader.SIGNAL_ADDED, null, Iterables.getLast(signals));
return id; return id;
} }
@ -209,4 +237,25 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
return Collections.emptyList(); 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);
}
} }

View File

@ -161,12 +161,9 @@ class VCDFileParser {
else if (tokenizer.sval.equals("$enddefinitions")) { else if (tokenizer.sval.equals("$enddefinitions")) {
match("$end"); match("$end");
return false; return false;
} else { } else do {
// Ignore this defintion if (!nextToken()) return false;
do { } while (!tokenizer.sval.equals("$end"));
if (!nextToken()) return false;
} while (!tokenizer.sval.equals("$end"));
}
return true; return true;
} }

View File

@ -13,6 +13,7 @@ package com.minres.scviewer.database;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport; import java.beans.PropertyChangeSupport;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
/** /**
@ -27,18 +28,10 @@ public class HierNode implements IHierNode {
protected IHierNode parent = null; protected IHierNode parent = null;
/** The childs. */ /** The childs. */
protected ArrayList<IHierNode> childs; protected List<IHierNode> childNodes = Collections.synchronizedList(new ArrayList<>());
/** The pcs. */ /** The pcs. */
protected PropertyChangeSupport pcs; protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);
/**
* Instantiates a new hier node.
*/
public HierNode() {
childs = new ArrayList<>();
pcs = new PropertyChangeSupport(this);
}
/** /**
* Instantiates a new hier node. * Instantiates a new hier node.
@ -46,7 +39,6 @@ public class HierNode implements IHierNode {
* @param name the name * @param name the name
*/ */
public HierNode(String name) { public HierNode(String name) {
this();
this.name = name; this.name = name;
} }
@ -57,11 +49,16 @@ public class HierNode implements IHierNode {
* @param parent the parent * @param parent the parent
*/ */
public HierNode(String name, IHierNode parent) { public HierNode(String name, IHierNode parent) {
this();
this.name = name; this.name = name;
this.parent = parent; this.parent = parent;
} }
/**
* Instantiates a new hier node.
*/
public HierNode() {
}
/** /**
* Adds the property change listener. * Adds the property change listener.
* *
@ -115,6 +112,16 @@ public class HierNode implements IHierNode {
this.name = name; this.name = name;
} }
/**
* Gets the parent.
*
* @return the parent
*/
@Override
public IHierNode getParent() {
return parent;
}
/** /**
* Sets the parent. * Sets the parent.
* *
@ -132,7 +139,7 @@ public class HierNode implements IHierNode {
*/ */
@Override @Override
public List<IHierNode> getChildNodes() { public List<IHierNode> getChildNodes() {
return childs; return Collections.unmodifiableList(childNodes);
} }
/** /**
@ -140,9 +147,10 @@ public class HierNode implements IHierNode {
* *
* @param child the child * @param child the child
*/ */
@Override
public void addChild(IHierNode child) { public void addChild(IHierNode child) {
if (!childs.contains(child)) { if (!childNodes.contains(child)) {
childs.add(child); childNodes.add(child);
child.setParent(this); child.setParent(this);
} }
} }

View File

@ -18,6 +18,15 @@ import java.util.List;
*/ */
public interface IHierNode extends Comparable<IHierNode> { public interface IHierNode extends Comparable<IHierNode> {
/** 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. * Attach a non-null PropertyChangeListener to this object.
* *
@ -61,6 +70,13 @@ public interface IHierNode extends Comparable<IHierNode> {
*/ */
public void setParent(IHierNode parent); public void setParent(IHierNode parent);
/**
* Gets the parent.
*
* @return the parent
*/
public IHierNode getParent();
/** /**
* Gets the child nodes. * Gets the child nodes.
* *
@ -68,6 +84,12 @@ public interface IHierNode extends Comparable<IHierNode> {
*/ */
public List<IHierNode> getChildNodes(); public List<IHierNode> getChildNodes();
/**
* Adds the child.
*
* @param child the child
*/
public void addChild(IHierNode child);
/** /**
* Derive waveform. * Derive waveform.
* *

View File

@ -10,6 +10,7 @@
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.database; package com.minres.scviewer.database;
import java.beans.PropertyChangeListener;
import java.io.File; import java.io.File;
import java.util.Collection; import java.util.Collection;
@ -17,38 +18,51 @@ import java.util.Collection;
* The Interface IWaveformDbLoader. * The Interface IWaveformDbLoader.
*/ */
public 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. * Load.
* *
* @param db the db * @param db the db
* @param inp the inp * @param inputFile the input file
* @return true, if successful
* @throws InputFormatException the input format exception * @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. * Gets the max time.

View File

@ -10,6 +10,8 @@
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.database.internal; package com.minres.scviewer.database.internal;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -28,7 +30,7 @@ import com.minres.scviewer.database.RelationType;
/** /**
* The Class WaveformDb. * The Class WaveformDb.
*/ */
public class WaveformDb extends HierNode implements IWaveformDb { public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeListener {
/** The loaders. */ /** The loaders. */
private static List<IWaveformDbLoader> loaders = new LinkedList<>(); private static List<IWaveformDbLoader> loaders = new LinkedList<>();
@ -122,8 +124,11 @@ public class WaveformDb extends HierNode implements IWaveformDb {
@Override @Override
public boolean load(File inp) { public boolean load(File inp) {
for (IWaveformDbLoader loader : loaders) { for (IWaveformDbLoader loader : loaders) {
try { if(loader.canLoad(inp)) {
if (loader.load(this, inp)) { try {
loader.addPropertyChangeListener(this);
loader.load(this, inp);
loader.removePropertyChangeListener(this);
for (IWaveform w : loader.getAllWaves()) { for (IWaveform w : loader.getAllWaves()) {
waveforms.put(w.getFullName(), w); waveforms.put(w.getFullName(), w);
} }
@ -134,13 +139,12 @@ public class WaveformDb extends HierNode implements IWaveformDb {
name = getFileBasename(inp.getName()); name = getFileBasename(inp.getName());
buildHierarchyNodes(); buildHierarchyNodes();
relationTypes.addAll(loader.getAllRelationTypes()); relationTypes.addAll(loader.getAllRelationTypes());
pcs.firePropertyChange("WAVEFORMS", null, waveforms); pcs.firePropertyChange(IHierNode.LOADING_FINISHED, null, null);
pcs.firePropertyChange("CHILDS", null, childs);
loaded = true; loaded = true;
return true; return true;
} catch (Exception e) {
return false;
} }
} catch (Exception e) {
return false;
} }
} }
return false; return false;
@ -167,7 +171,7 @@ public class WaveformDb extends HierNode implements IWaveformDb {
@Override @Override
public void clear() { public void clear() {
waveforms.clear(); waveforms.clear();
childs.clear(); childNodes.clear();
loaded = false; loaded = false;
} }
@ -180,49 +184,60 @@ public class WaveformDb extends HierNode implements IWaveformDb {
return loaded; 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. * Builds the hierarchy nodes.
*/ */
private void buildHierarchyNodes() { private void buildHierarchyNodes() {
boolean needsSorting=false;
for (IWaveform stream : getAllWaves()) { for (IWaveform stream : getAllWaves()) {
String[] hier = stream.getName().split("\\."); if(stream.getParent()==null) {
IHierNode node = this; putInHierarchy(stream);
for (int i = 0; i < hier.length - 1; ++i) { needsSorting=true;
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;
} }
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);
}
} }
/** private synchronized void putInHierarchy(IWaveform waveform) {
* Sort recursive. String[] hier = waveform.getName().split("\\.");
* IHierNode node = this;
* @param node the node for (int i = 0; i < hier.length - 1; ++i) {
*/ String name = hier[i];
private void sortRecursive(IHierNode node) { IHierNode childNode = null;
Collections.sort(node.getChildNodes(), (IHierNode o1, IHierNode o2) -> o1.getName().compareTo(o2.getName())); for (IHierNode n : node.getChildNodes()) {
for (IHierNode n : node.getChildNodes()) { if (n.getName().equals(name)) {
if (!n.getChildNodes().isEmpty()) childNode = n;
sortRecursive(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<RelationType> getAllRelationTypes() { public List<RelationType> getAllRelationTypes() {
return relationTypes; return relationTypes;
} }
} }

View File

@ -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() {}
}

View File

@ -29,8 +29,8 @@ import com.minres.scviewer.e4.application.parts.DesignBrowser;
public class AddWaveformHandler { public class AddWaveformHandler {
public final static String PARAM_WHERE_ID="com.minres.scviewer.e4.application.command.addwaveform.where"; //$NON-NLS-1$ public static final 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_ALL_ID="com.minres.scviewer.e4.application.command.addwaveform.all"; //$NON-NLS-1$
@Inject @Optional DesignBrowser designBrowser; @Inject @Optional DesignBrowser designBrowser;
@ -42,8 +42,11 @@ public class AddWaveformHandler {
if(designBrowser==null || designBrowser.getActiveWaveformViewerPart()==null) return false; if(designBrowser==null || designBrowser.getActiveWaveformViewerPart()==null) return false;
boolean before = "before".equalsIgnoreCase(where); //$NON-NLS-1$ boolean before = "before".equalsIgnoreCase(where); //$NON-NLS-1$
IStructuredSelection waveformSelection = null; IStructuredSelection waveformSelection = null;
if(designBrowser.getActiveWaveformViewerPart()!=null) if(designBrowser.getActiveWaveformViewerPart()!=null) {
if(!designBrowser.getActiveWaveformViewerPart().getDatabase().isLoaded())
return false;
waveformSelection = (IStructuredSelection)designBrowser.getActiveWaveformViewerPart().getSelection(); waveformSelection = (IStructuredSelection)designBrowser.getActiveWaveformViewerPart().getSelection();
}
if("true".equalsIgnoreCase(all)) //$NON-NLS-1$ if("true".equalsIgnoreCase(all)) //$NON-NLS-1$
return designBrowser.getFilteredChildren().length>0 && return designBrowser.getFilteredChildren().length>0 &&
(!before || (waveformSelection!=null && waveformSelection.size()>0)); (!before || (waveformSelection!=null && waveformSelection.size()>0));

View File

@ -36,6 +36,8 @@ import org.eclipse.wb.swt.ResourceManager;
import org.eclipse.wb.swt.SWTResourceManager; import org.eclipse.wb.swt.SWTResourceManager;
import org.osgi.service.prefs.Preferences; 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. * 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 * 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 = new Canvas(this, SWT.NONE);
button.setToolTipText("Run Garbage Collection"); 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(); Display display = getDisplay();
gcImage = imageDesc.createImage(); gcImage = imageDesc.createImage();
if (gcImage != null) { if (gcImage != null) {
@ -228,6 +230,8 @@ public class HeapStatus extends Composite {
arm(false); arm(false);
} }
break; break;
default:
break;
} }
} }
@ -301,8 +305,8 @@ public class HeapStatus extends Composite {
long max = Long.MAX_VALUE; long max = Long.MAX_VALUE;
try { try {
// Must use reflect to allow compilation against JCL/Foundation // Must use reflect to allow compilation against JCL/Foundation
Method maxMemMethod = Runtime.class.getMethod("maxMemory", new Class[0]); //$NON-NLS-1$ Method maxMemMethod = Runtime.class.getMethod("maxMemory"); //$NON-NLS-1$
Object o = maxMemMethod.invoke(Runtime.getRuntime(), new Object[0]); Object o = maxMemMethod.invoke(Runtime.getRuntime());
if (o instanceof Long) { if (o instanceof Long) {
max = ((Long) o).longValue(); max = ((Long) o).longValue();
} }
@ -441,14 +445,7 @@ public class HeapStatus extends Composite {
@Override @Override
public void run() { public void run() {
busyGC(); busyGC();
getDisplay().asyncExec(new Runnable() { getDisplay().asyncExec(() -> { if (!isDisposed()) gcRunning(false); });
@Override
public void run() {
if (!isDisposed()) {
gcRunning(false);
}
}
});
} }
}; };
t.start(); t.start();
@ -669,7 +666,7 @@ public class HeapStatus extends Composite {
* @return the string * @return the string
*/ */
private String convertToMegString(long numBytes) { private String convertToMegString(long numBytes) {
return new Long(convertToMeg(numBytes)).toString()+"M"; return Long.toString(convertToMeg(numBytes))+"M";
} }
/** /**

View File

@ -26,8 +26,6 @@ import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText; 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.Color;
import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point; 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.Canvas;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control; 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.swt.widgets.Shell;
import org.eclipse.wb.swt.ResourceManager; import org.eclipse.wb.swt.ResourceManager;
import org.eclipse.wb.swt.SWTResourceManager; import org.eclipse.wb.swt.SWTResourceManager;
import org.osgi.framework.Version; import org.osgi.framework.Version;
import com.minres.scviewer.e4.application.Constants;
import com.minres.scviewer.e4.application.Messages; import com.minres.scviewer.e4.application.Messages;
/** /**
@ -73,34 +70,32 @@ public class AboutDialog extends Dialog {
@Override @Override
protected Control createDialogArea(Composite parent) { protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE); Composite composite = new Composite(parent, SWT.NONE);
GridData gd_composite = new GridData(SWT.LEFT, SWT.FILL, true, true); GridData gdComposite = new GridData(SWT.LEFT, SWT.FILL, true, true);
gd_composite.widthHint = 600; gdComposite.widthHint = 600;
gd_composite.heightHint =300; gdComposite.heightHint =300;
composite.setLayoutData(gd_composite); composite.setLayoutData(gdComposite);
composite.setLayout(new GridLayout(2, false)); composite.setLayout(new GridLayout(2, false));
final Color white=SWTResourceManager.getColor(SWT.COLOR_WHITE); 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 scviewerLogo=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/SCViewer_logo.png"); //$NON-NLS-1$
final Image minresLogo=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/Minres_logo.png"); //$NON-NLS-1$ //$NON-NLS-2$ final Image minresLogo=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/Minres_logo.png"); //$NON-NLS-1$
Canvas canvas = new Canvas(composite,SWT.NO_REDRAW_RESIZE); Canvas canvas = new Canvas(composite,SWT.NO_REDRAW_RESIZE);
GridData gd_canvas = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); GridData gdCanvas = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_canvas.widthHint = 200; gdCanvas.widthHint = 200;
gd_canvas.heightHint =300; gdCanvas.heightHint =300;
canvas.setLayoutData(gd_canvas); canvas.setLayoutData(gdCanvas);
canvas.addPaintListener(new PaintListener() { canvas.addPaintListener(e -> {
public void paintControl(PaintEvent e) {
e.gc.setBackground(white); e.gc.setBackground(white);
e.gc.fillRectangle(e.x, e.y, e.width, e.height); e.gc.fillRectangle(e.x, e.y, e.width, e.height);
e.gc.drawImage(scviewerLogo,4,0); e.gc.drawImage(scviewerLogo,4,0);
e.gc.drawImage(minresLogo,0,200); e.gc.drawImage(minresLogo,0,200);
}
}); });
StyledText styledText = new StyledText(composite, SWT.V_SCROLL | SWT.BORDER); StyledText styledText = new StyledText(composite, SWT.V_SCROLL | SWT.BORDER);
styledText.setEditable(false); styledText.setEditable(false);
GridData gd_styledText = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); GridData gdStyledText = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
styledText.setLayoutData(gd_styledText); styledText.setLayoutData(gdStyledText);
Version version = Platform.getProduct().getDefiningBundle().getVersion(); Version version = Platform.getProduct().getDefiningBundle().getVersion();
String versionString = String.format("%d.%d.%d", version.getMajor(), version.getMinor(), version.getMicro()); String versionString = String.format("%d.%d.%d", version.getMajor(), version.getMinor(), version.getMicro());
String productTitle = NLS.bind(Messages.AboutDialog_0, versionString); String productTitle = NLS.bind(Messages.AboutDialog_0, versionString);
@ -129,22 +124,17 @@ public class AboutDialog extends Dialog {
styleRange.length = matcher.end()-matcher.start(); styleRange.length = matcher.end()-matcher.start();
styledText.setStyleRange(styleRange); styledText.setStyleRange(styleRange);
} }
styledText.addListener(SWT.MouseDown, new Listener() { styledText.addListener(SWT.MouseDown, event -> {
@Override // It is up to the application to determine when and how a link should be activated.
public void handleEvent(Event event) { // links are activated on mouse down when the control key is held down
// It is up to the application to determine when and how a link should be activated. try {
// links are activated on mouse down when the control key is held down @SuppressWarnings("deprecation")
// if ((event.stateMask & SWT.MOD1) != 0) { int offset = ((StyledText)event.widget).getOffsetAtLocation(new Point (event.x, event.y));
try { StyleRange style = ((StyledText)event.widget).getStyleRangeAtOffset(offset);
@SuppressWarnings("deprecation") if (style != null && style.underline && style.underlineStyle == SWT.UNDERLINE_LINK) {
int offset = ((StyledText)event.widget).getOffsetAtLocation(new Point (event.x, event.y)); Desktop.getDesktop().browse(new java.net.URI(style.data.toString()));
StyleRange style = ((StyledText)event.widget).getStyleRangeAtOffset(offset); }
if (style != null && style.underline && style.underlineStyle == SWT.UNDERLINE_LINK) { } catch (IOException | URISyntaxException | IllegalArgumentException e) {}
Desktop.getDesktop().browse(new java.net.URI(style.data.toString()));
}
} catch (IOException | URISyntaxException | IllegalArgumentException e) {}
// }
}
}); });
styleRange.start = 0; styleRange.start = 0;
@ -154,6 +144,7 @@ public class AboutDialog extends Dialog {
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/ */
@Override
protected void createButtonsForButtonBar(Composite parent) { protected void createButtonsForButtonBar(Composite parent) {
// create OK button // create OK button
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true); createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true);

View File

@ -13,7 +13,6 @@ package com.minres.scviewer.e4.application.parts;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException; 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.IHierNode;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb; 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.Messages;
import com.minres.scviewer.e4.application.handlers.AddWaveformHandler; import com.minres.scviewer.e4.application.handlers.AddWaveformHandler;
import com.minres.scviewer.e4.application.provider.TxDbContentProvider; import com.minres.scviewer.e4.application.provider.TxDbContentProvider;
@ -125,12 +125,17 @@ public class DesignBrowser {
/** The tree viewer pcl. */ /** The tree viewer pcl. */
private PropertyChangeListener treeViewerPCL = evt -> { 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()); treeViewer.getTree().getDisplay().asyncExec(() -> treeViewer.refresh());
} else if("WAVEFORMS".equals(evt.getPropertyName())) { } else if(IHierNode.WAVEFORMS.equals(evt.getPropertyName())) {
treeViewer.getTree().getDisplay().asyncExec(() -> { treeViewer.getTree().getDisplay().asyncExec(() -> {
IWaveformDb database = waveformViewerPart.getDatabase(); treeViewer.setInput(new IWaveformDb[]{waveformViewerPart.getDatabase()});
treeViewer.setInput(Arrays.asList(database.isLoaded()?new IWaveformDb[]{database}:new IWaveformDb[]{new LoadingWaveformDb()})); 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 = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); 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.setLabelProvider(new TxDbLabelProvider());
treeViewer.addFilter(treeAttributeFilter); treeViewer.addFilter(treeAttributeFilter);
treeViewer.setUseHashlookup(true); treeViewer.setUseHashlookup(true);
@ -236,7 +246,12 @@ public class DesignBrowser {
tableAttributeFilter = new StreamTableFilter(); tableAttributeFilter = new StreamTableFilter();
txTableViewer = new TableViewer(parent); 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.setLabelProvider(new TxDbLabelProvider());
txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
txTableViewer.addFilter(tableAttributeFilter); txTableViewer.addFilter(tableAttributeFilter);
@ -258,7 +273,7 @@ public class DesignBrowser {
appendItem = new ToolItem(toolBar, SWT.NONE); appendItem = new ToolItem(toolBar, SWT.NONE);
appendItem.setToolTipText(Messages.DesignBrowser_4); 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.setEnabled(false);
appendItem.addSelectionListener(new SelectionAdapter() { appendItem.addSelectionListener(new SelectionAdapter() {
@Override @Override
@ -273,7 +288,7 @@ public class DesignBrowser {
insertItem = new ToolItem(toolBar, SWT.NONE); insertItem = new ToolItem(toolBar, SWT.NONE);
insertItem.setToolTipText(Messages.DesignBrowser_8); 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.setEnabled(false);
insertItem.addSelectionListener(new SelectionAdapter() { insertItem.addSelectionListener(new SelectionAdapter() {
@Override @Override
@ -356,7 +371,7 @@ public class DesignBrowser {
if(db==database) return; // do nothing if old and new database is the same if(db==database) return; // do nothing if old and new database is the same
((List<IWaveformDb>)input).get(0).removePropertyChangeListener(treeViewerPCL); ((List<IWaveformDb>)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(); Object state=this.waveformViewerPart.retrieveDesignBrowerState();
if(state instanceof DBState) if(state instanceof DBState)
((DBState)state).apply(); ((DBState)state).apply();

View File

@ -5,7 +5,6 @@ import java.nio.file.FileSystems;
import java.nio.file.PathMatcher; import java.nio.file.PathMatcher;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -48,6 +47,8 @@ import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.wb.swt.ResourceManager; import org.eclipse.wb.swt.ResourceManager;
import com.minres.scviewer.e4.application.Constants;
public class FileBrowserDialog extends TrayDialog { public class FileBrowserDialog extends TrayDialog {
private Image folderImage; private Image folderImage;
@ -80,9 +81,9 @@ public class FileBrowserDialog extends TrayDialog {
public FileBrowserDialog(Shell parentShell) { public FileBrowserDialog(Shell parentShell) {
super(parentShell); super(parentShell);
folderImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/folder.png"); //$NON-NLS-1$ //$NON-NLS-2$ folderImage=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/folder.png"); //$NON-NLS-1$
dbImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/database.png"); //$NON-NLS-1$ //$NON-NLS-2$ dbImage=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/database.png"); //$NON-NLS-1$
fileImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/page_white.png"); //$NON-NLS-1$ //$NON-NLS-2$ fileImage=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/page_white.png"); //$NON-NLS-1$
currentDirFile = new File("."); currentDirFile = new File(".");
} }
@ -148,7 +149,7 @@ public class FileBrowserDialog extends TrayDialog {
toolBar.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); toolBar.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
final ToolItem toolbarItemUp = new ToolItem(toolBar, SWT.PUSH); final ToolItem toolbarItemUp = new ToolItem(toolBar, SWT.PUSH);
toolbarItemUp.setToolTipText("up one level"); 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() { toolbarItemUp.addSelectionListener(new SelectionAdapter() {
@Override @Override
public void widgetSelected(SelectionEvent e) { 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.getTable().setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
tableViewer.addSelectionChangedListener(event -> { tableViewer.addSelectionChangedListener(event -> {
IStructuredSelection sel = event.getStructuredSelection(); IStructuredSelection sel = event.getStructuredSelection();
@ -187,8 +188,8 @@ public class FileBrowserDialog extends TrayDialog {
public void mouseDown(MouseEvent e) { mouseUp(e); } public void mouseDown(MouseEvent e) { mouseUp(e); }
@Override @Override
public void mouseUp(MouseEvent e) { public void mouseUp(MouseEvent e) {
TableItem element = (TableItem)tableViewer.getTable().getItem(new Point(e.x, e.y));
final Table table = tableViewer.getTable(); final Table table = tableViewer.getTable();
TableItem element = table.getItem(new Point(e.x, e.y));
if (element == null )//&& (e.stateMask&SWT.MODIFIER_MASK)!=0) if (element == null )//&& (e.stateMask&SWT.MODIFIER_MASK)!=0)
table.deselectAll(); table.deselectAll();
else { else {
@ -231,7 +232,6 @@ public class FileBrowserDialog extends TrayDialog {
colEmpty.setLabelProvider(new FileTableLabelProvider() { colEmpty.setLabelProvider(new FileTableLabelProvider() {
@Override public String getText(Object element) { return ""; } @Override public String getText(Object element) { return ""; }
}); });
//colEmpty.getColumn().setWidth(200);
colEmpty.getColumn().setText(""); colEmpty.getColumn().setText("");
fileTableComparator = new FileTableComparator(); fileTableComparator = new FileTableComparator();
@ -268,7 +268,7 @@ public class FileBrowserDialog extends TrayDialog {
} }
private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index) { private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index) {
SelectionAdapter selectionAdapter = new SelectionAdapter() { return new SelectionAdapter() {
@Override @Override
public void widgetSelected(SelectionEvent e) { public void widgetSelected(SelectionEvent e) {
fileTableComparator.setColumn(index); fileTableComparator.setColumn(index);
@ -278,7 +278,6 @@ public class FileBrowserDialog extends TrayDialog {
tableViewer.refresh(); tableViewer.refresh();
} }
}; };
return selectionAdapter;
} }
private void setDirSelection(File f) { private void setDirSelection(File f) {
@ -334,10 +333,11 @@ public class FileBrowserDialog extends TrayDialog {
} }
public boolean matches(Object f) { public boolean matches(Object f) {
assert(f instanceof File); if(f instanceof File) {
if(matchers.size()==0) return true; if(matchers.isEmpty()) return true;
for (PathMatcher m : matchers) { for (PathMatcher m : matchers) {
if(m.matches(((File)f).toPath())) return true; if(m.matches(((File)f).toPath())) return true;
}
} }
return false; return false;
} }
@ -349,10 +349,8 @@ public class FileBrowserDialog extends TrayDialog {
if(entries != null) { if(entries != null) {
List<File> res = Arrays.stream(entries) List<File> res = Arrays.stream(entries)
.filter(file -> !(file.isFile()||file.getName().startsWith(".") ||globber.matches(file))) .filter(file -> !(file.isFile()||file.getName().startsWith(".") ||globber.matches(file)))
.sorted(new Comparator<File>(){ .sorted( (f1, f2) -> f1.getName().compareTo(f2.getName()))
public int compare(File f1, File f2){return f1.getName().compareTo(f2.getName());} .collect(Collectors.toList());
})
.collect(Collectors.toList()); ;
return res.toArray(); return res.toArray();
} else } else
return new Object[0]; return new Object[0];
@ -364,25 +362,20 @@ public class FileBrowserDialog extends TrayDialog {
public boolean hasChildren(Object arg0) { public boolean hasChildren(Object arg0) {
Object[] obj = getChildren(arg0); Object[] obj = getChildren(arg0);
return obj == null ? false : obj.length > 0; return obj != null && obj.length > 0;
} }
public Object[] getElements(Object arg0) { public Object[] getElements(Object arg0) {
return File.listRoots(); return File.listRoots();
} }
public void dispose() {
}
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
}
} }
class FileTreeLabelProvider implements ILabelProvider { class FileTreeLabelProvider implements ILabelProvider {
private List<ILabelProviderListener> listeners; private List<ILabelProviderListener> listeners;
public FileTreeLabelProvider() { public FileTreeLabelProvider() {
listeners = new ArrayList<ILabelProviderListener>(); listeners = new ArrayList<>();
} }
public Image getImage(Object arg0) { public Image getImage(Object arg0) {
@ -400,6 +393,7 @@ public class FileBrowserDialog extends TrayDialog {
@Override @Override
public void dispose() { public void dispose() {
// nothing to ispose
} }
public boolean isLabelProperty(Object arg0, String arg1) { public boolean isLabelProperty(Object arg0, String arg1) {
@ -425,15 +419,12 @@ public class FileBrowserDialog extends TrayDialog {
private int propertyIndex = 0; private int propertyIndex = 0;
private boolean descending = false; private boolean descending = false;
public FileTableComparator() {
}
public int getDirection() { public int getDirection() {
return descending ? SWT.DOWN : SWT.UP; return descending ? SWT.DOWN : SWT.UP;
} }
public void setColumn(int column) { public void setColumn(int column) {
descending = column == this.propertyIndex?!descending : false; descending = column == this.propertyIndex && !descending;
this.propertyIndex = column; this.propertyIndex = column;
} }

View File

@ -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<IHierNode> getChildNodes() {
return new ArrayList<IHierNode>();
}
@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<IWaveform> getAllWaves() {
return new ArrayList<IWaveform>();
}
@Override
public List<RelationType> getAllRelationTypes() {
return new ArrayList<RelationType>();
}
@Override
public boolean load(File inp) {
return false;
}
@Override
public boolean isLoaded() {
return false;
}
@Override
public void clear() {
}
@Override
public IDerivedWaveform deriveWaveform() {
return null;
}
}

View File

@ -85,9 +85,6 @@ public class TransactionDetails {
/** The selection service. */ /** The selection service. */
@Inject ESelectionService selectionService; @Inject ESelectionService selectionService;
/** The name filter. */
private Text nameFilter;
/** The tree viewer. */ /** The tree viewer. */
private TreeViewer treeViewer; private TreeViewer treeViewer;
@ -122,7 +119,7 @@ public class TransactionDetails {
top = new Composite(parent, SWT.NONE); top = new Composite(parent, SWT.NONE);
top.setLayout(new GridLayout(1, false)); 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.setMessage(Messages.TransactionDetails_0);
nameFilter.addModifyListener(e -> { nameFilter.addModifyListener(e -> {
attributeFilter.setSearchText(((Text) e.widget).getText()); attributeFilter.setSearchText(((Text) e.widget).getText());
@ -204,11 +201,6 @@ public class TransactionDetails {
treeViewer.refresh(); 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 // Turn on the header and the lines
tree.setHeaderVisible(true); tree.setHeaderVisible(true);
tree.setLinesVisible(true); tree.setLinesVisible(true);

View File

@ -75,6 +75,7 @@ import org.eclipse.swt.widgets.Widget;
import com.minres.scviewer.database.DataType; import com.minres.scviewer.database.DataType;
import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IHierNode;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.IWaveformDbFactory; import com.minres.scviewer.database.IWaveformDbFactory;
@ -251,7 +252,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
showHover=hover; showHover=hover;
database = dbFactory.getDatabase(); database = dbFactory.getDatabase();
database.addPropertyChangeListener(evt -> { 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())); myParent.getDisplay().syncExec(() -> waveformPane.setMaxTime(database.getMaxTime()));
} }
}); });
@ -536,6 +537,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
protected void loadDatabase(final Map<String, String> state, long delay) { protected void loadDatabase(final Map<String, String> state, long delay) {
fileMonitor.removeFileChangeListener(this); 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) { Job job = new Job(Messages.WaveformViewer_15) {
@Override @Override
protected IStatus run(IProgressMonitor monitor) { protected IStatus run(IProgressMonitor monitor) {
@ -683,9 +685,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
//clear old streams before loading tab settings //clear old streams before loading tab settings
if(!waveformPane.getStreamList().isEmpty()) { if(!waveformPane.getStreamList().isEmpty()) {
waveformPane.getStreamList().clear(); waveformPane.getStreamList().clear();
for (TrackEntry trackEntry : waveformPane.getStreamList()) { waveformPane.getStreamList().stream().forEach(e -> e.selected=false);
trackEntry.selected = false;
}
} }
try (FileInputStream in = new FileInputStream(fileName)) { try (FileInputStream in = new FileInputStream(fileName)) {
Properties props = new Properties(); Properties props = new Properties();
@ -916,15 +916,6 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
return ext; return ext;
} }
/**
* Gets the model.
*
* @return the model
*/
public IWaveformDb getModel() {
return database;
}
/** /**
* Gets the database. * Gets the database.
* *

View File

@ -10,13 +10,15 @@
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.e4.application.preferences; package com.minres.scviewer.e4.application.preferences;
import com.minres.scviewer.e4.application.Constants;
/** /**
* The Class PreferenceConstants for the preferences dialog & setting. * The Class PreferenceConstants for the preferences dialog & setting.
*/ */
public class PreferenceConstants { public class PreferenceConstants {
/** The Constant PREFERENCES_SCOPE. */ /** 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. */ /** The Constant DATABASE_RELOAD. */
public static final String DATABASE_RELOAD="databaseReload"; //$NON-NLS-1$ public static final String DATABASE_RELOAD="databaseReload"; //$NON-NLS-1$
@ -81,5 +83,5 @@ public class PreferenceConstants {
/** The Constant MARKER_TEXT_COLOR. */ /** The Constant MARKER_TEXT_COLOR. */
public static final String MARKER_TEXT_COLOR="MARKER_TEXT_COLOR"; //$NON-NLS-1$ public static final String MARKER_TEXT_COLOR="MARKER_TEXT_COLOR"; //$NON-NLS-1$
private PreferenceConstants() {}
} }

View File

@ -10,7 +10,8 @@
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.e4.application.provider; 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.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -54,12 +55,15 @@ public class TxDbContentProvider implements ITreeContentProvider {
if(tableEntries && inputElement instanceof IWaveformDb){ if(tableEntries && inputElement instanceof IWaveformDb){
return new Object[]{}; return new Object[]{};
}else if(inputElement instanceof IHierNode){ }else if(inputElement instanceof IHierNode){
Collection<IHierNode> res = ((IHierNode)inputElement).getChildNodes().stream().filter(n -> // make a copy as the laoder might continue to add waveforms
ArrayList<IHierNode> nodes = new ArrayList<>(((IHierNode)inputElement).getChildNodes());
return nodes.stream().filter(n ->
tableEntries? n instanceof IWaveform : !n.getChildNodes().isEmpty() tableEntries? n instanceof IWaveform : !n.getChildNodes().isEmpty()
).collect(Collectors.toList()); ).sorted(Comparator.comparing(IHierNode::getName)).collect(Collectors.toList()).toArray();
return res.toArray();
}else if(inputElement instanceof List<?>){ }else if(inputElement instanceof List<?>){
return ((List<?>)inputElement).toArray(); return ((List<?>)inputElement).toArray();
}else if(inputElement instanceof Object[]){
return (Object[]) inputElement;
} else } else
return new Object[]{}; return new Object[]{};
} }

View File

@ -21,7 +21,7 @@ import org.eclipse.wb.swt.ResourceManager;
import com.minres.scviewer.database.IHierNode; import com.minres.scviewer.database.IHierNode;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb; 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. * 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 { public class TxDbLabelProvider implements ILabelProvider {
/** The listeners. */ /** The listeners. */
private List<ILabelProviderListener> listeners = new ArrayList<ILabelProviderListener>(); private List<ILabelProviderListener> listeners = new ArrayList<>();
/** The wave. */ /** 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. * Instantiates a new tx db label provider.
*/ */
public TxDbLabelProvider() { public TxDbLabelProvider() {
super(); super();
loadinDatabase=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/database_go.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("com.minres.scviewer.e4.application", "icons/database.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("com.minres.scviewer.e4.application", "icons/stream.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("com.minres.scviewer.e4.application", "icons/folder.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("com.minres.scviewer.e4.application", "icons/signal.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("com.minres.scviewer.e4.application", "icons/wave.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) /* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener) * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/ */
@ -56,13 +75,24 @@ public class TxDbLabelProvider implements ILabelProvider {
listeners.add(listener); listeners.add(listener);
} }
/**
* Dispose.
*/
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose() * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
*/ */
@Override @Override
public void dispose() { 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) /* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String) * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
*/ */
@ -71,6 +101,11 @@ public class TxDbLabelProvider implements ILabelProvider {
return false; return false;
} }
/**
* Removes the listener.
*
* @param listener the listener
*/
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener) * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/ */
@ -79,16 +114,19 @@ public class TxDbLabelProvider implements ILabelProvider {
listeners.remove(listener); listeners.remove(listener);
} }
/**
* Gets the image.
*
* @param element the element
* @return the image
*/
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object) * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
*/ */
@Override @Override
public Image getImage(Object element) { public Image getImage(Object element) {
if(element instanceof IWaveformDb){ if(element instanceof IWaveformDb){
if(element instanceof LoadingWaveformDb) return ((IWaveformDb)element).isLoaded()?database:loadinDatabase;
return loadinDatabase;
else
return database;
}else if(element instanceof IWaveform){ }else if(element instanceof IWaveform){
switch(((IWaveform) element).getType()) { switch(((IWaveform) element).getType()) {
case TRANSACTION: case TRANSACTION:
@ -110,6 +148,12 @@ public class TxDbLabelProvider implements ILabelProvider {
return null; return null;
} }
/**
* Gets the text.
*
* @param element the element
* @return the text
*/
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
*/ */

View File

@ -13,8 +13,6 @@ package org.eclipse.wb.swt;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.HashMap; import java.util.HashMap;
@ -61,7 +59,7 @@ public class ResourceManager extends SWTResourceManager {
/** /**
* The map where we store our images. * The map where we store our images.
*/ */
private static Map<ImageDescriptor, Image> m_descriptorImageMap = new HashMap<ImageDescriptor, Image>(); private static Map<ImageDescriptor, Image> descriptorImageMap = new HashMap<>();
/** /**
* Returns an {@link ImageDescriptor} stored in the file at the specified path * 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}. * @return the {@link Image} based on the specified {@link ImageDescriptor}.
*/ */
public static Image getImage(ImageDescriptor descriptor) { public static Image getImage(ImageDescriptor descriptor) {
if (descriptor == null) { if (descriptor == null)
return null; return null;
} return descriptorImageMap.computeIfAbsent(descriptor, ImageDescriptor::createImage);
Image image = m_descriptorImageMap.get(descriptor);
if (image == null) {
image = descriptor.createImage();
m_descriptorImageMap.put(descriptor, image);
}
return image;
} }
/** /**
* Maps images to decorated images. * Maps images to decorated images.
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private static Map<Image, Map<Image, Image>>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY]; private static Map<Image, Map<Image, Image>>[] decoratedImageMap = new Map[LAST_CORNER_KEY];
/** /**
* Returns an {@link Image} composed of a base image decorated by another image. * 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) { if (corner <= 0 || corner >= LAST_CORNER_KEY) {
throw new IllegalArgumentException(Messages.ResourceManager_0); throw new IllegalArgumentException(Messages.ResourceManager_0);
} }
Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[corner]; Map<Image, Map<Image, Image>> cornerDecoratedImageMap = decoratedImageMap[corner];
if (cornerDecoratedImageMap == null) { if (cornerDecoratedImageMap == null) {
cornerDecoratedImageMap = new HashMap<Image, Map<Image, Image>>(); cornerDecoratedImageMap = new HashMap<>();
m_decoratedImageMap[corner] = cornerDecoratedImageMap; decoratedImageMap[corner] = cornerDecoratedImageMap;
} }
Map<Image, Image> decoratedMap = cornerDecoratedImageMap.get(baseImage); Map<Image, Image> decoratedMap = cornerDecoratedImageMap.computeIfAbsent(baseImage, k -> new HashMap<Image, Image>());
if (decoratedMap == null) {
decoratedMap = new HashMap<Image, Image>();
cornerDecoratedImageMap.put(baseImage, decoratedMap);
}
//
Image result = decoratedMap.get(decorator); Image result = decoratedMap.get(decorator);
if (result == null) { if (result == null) {
final Rectangle bib = baseImage.getBounds(); final Rectangle bib = baseImage.getBounds();
@ -193,15 +180,13 @@ public class ResourceManager extends SWTResourceManager {
public static void disposeImages() { public static void disposeImages() {
SWTResourceManager.disposeImages(); SWTResourceManager.disposeImages();
// dispose ImageDescriptor images // dispose ImageDescriptor images
{ for (Iterator<Image> I = descriptorImageMap.values().iterator(); I.hasNext();) {
for (Iterator<Image> I = m_descriptorImageMap.values().iterator(); I.hasNext();) { I.next().dispose();
I.next().dispose();
}
m_descriptorImageMap.clear();
} }
descriptorImageMap.clear();
// dispose decorated images // dispose decorated images
for (int i = 0; i < m_decoratedImageMap.length; i++) { for (int i = 0; i < decoratedImageMap.length; i++) {
Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[i]; Map<Image, Map<Image, Image>> cornerDecoratedImageMap = decoratedImageMap[i];
if (cornerDecoratedImageMap != null) { if (cornerDecoratedImageMap != null) {
for (Map<Image, Image> decoratedMap : cornerDecoratedImageMap.values()) { for (Map<Image, Image> decoratedMap : cornerDecoratedImageMap.values()) {
for (Image image : decoratedMap.values()) { for (Image image : decoratedMap.values()) {
@ -213,12 +198,10 @@ public class ResourceManager extends SWTResourceManager {
} }
} }
// dispose plugin images // dispose plugin images
{ for (Iterator<Image> I = urlImageMap.values().iterator(); I.hasNext();) {
for (Iterator<Image> I = m_URLImageMap.values().iterator(); I.hasNext();) { I.next().dispose();
I.next().dispose();
}
m_URLImageMap.clear();
} }
urlImageMap.clear();
} }
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
@ -229,7 +212,7 @@ public class ResourceManager extends SWTResourceManager {
/** /**
* Maps URL to images. * Maps URL to images.
*/ */
private static Map<String, Image> m_URLImageMap = new HashMap<String, Image>(); private static Map<String, Image> urlImageMap = new HashMap<>();
/** /**
* Provider for plugin resources, used by WindowBuilder at design time. * 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 * Instance of {@link PluginResourceProvider}, used by WindowBuilder at design
* time. * time.
*/ */
private static PluginResourceProvider m_designTimePluginResourceProvider = null; private static PluginResourceProvider 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;
}
/** /**
* Returns an {@link Image} based on a {@link Bundle} and resource entry path. * 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) { if (url != null) {
return getPluginImageFromUrl(url); return getPluginImageFromUrl(url);
} }
} catch (Throwable e) { } catch (Exception e) {
// Ignore any exceptions // Ignore any exceptions
} }
return null; return null;
@ -290,47 +251,19 @@ public class ResourceManager extends SWTResourceManager {
*/ */
private static Image getPluginImageFromUrl(URL url) { private static Image getPluginImageFromUrl(URL url) {
try { try {
try { String key = url.toExternalForm();
String key = url.toExternalForm(); Image image = urlImageMap.get(key);
Image image = m_URLImageMap.get(key); if (image == null) {
if (image == null) { InputStream stream = url.openStream();
InputStream stream = url.openStream(); try {
try { image = getImage(stream);
image = getImage(stream); urlImageMap.put(key, image);
m_URLImageMap.put(key, image); } finally {
} finally { stream.close();
stream.close();
}
} }
return image;
} catch (Throwable e) {
// Ignore any exceptions
} }
} catch (Throwable e) { return image;
// Ignore any exceptions } catch (Exception e) {
}
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) {
// Ignore any exceptions // Ignore any exceptions
} }
return null; return null;
@ -351,7 +284,7 @@ public class ResourceManager extends SWTResourceManager {
if (url != null) { if (url != null) {
return ImageDescriptor.createFromURL(url); return ImageDescriptor.createFromURL(url);
} }
} catch (Throwable e) { } catch (Exception e) {
// Ignore any exceptions // Ignore any exceptions
} }
return null; return null;
@ -362,66 +295,18 @@ public class ResourceManager extends SWTResourceManager {
*/ */
private static URL getPluginImageURL(String symbolicName, String path) { private static URL getPluginImageURL(String symbolicName, String path) {
// try runtime plugins // try runtime plugins
{ Bundle bundle = Platform.getBundle(symbolicName);
Bundle bundle = Platform.getBundle(symbolicName); if (bundle != null) {
if (bundle != null) { return bundle.getEntry(path);
return bundle.getEntry(path);
}
} }
// try design time provider // try design time provider
if (m_designTimePluginResourceProvider != null) { if (designTimePluginResourceProvider != null) {
return m_designTimePluginResourceProvider.getEntry(symbolicName, path); return designTimePluginResourceProvider.getEntry(symbolicName, path);
} }
// no such resource // no such resource
return null; 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 // General

View File

@ -34,7 +34,7 @@
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/> <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.minres.scviewer.database.test"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.minres.scviewer.database.test"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/> <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms40m -Xmx512m"/> <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms40m -Xmx2G"/>
<stringAttribute key="pde.version" value="3.3"/> <stringAttribute key="pde.version" value="3.3"/>
<stringAttribute key="product" value="com.minres.scviewer.e4.product"/> <stringAttribute key="product" value="com.minres.scviewer.e4.product"/>
<booleanAttribute key="run_in_ui_thread" value="true"/> <booleanAttribute key="run_in_ui_thread" value="true"/>

View File

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -71,10 +71,10 @@ public class DatabaseServicesTest {
assertEquals(2, waveformDb.getChildNodes().size()); assertEquals(2, waveformDb.getChildNodes().size());
IWaveform bus_data_wave = waves.get(0); IWaveform bus_data_wave = waves.get(0);
Entry<Long, IEvent[]> bus_data_entry = bus_data_wave.getEvents().floorEntry(1400000000L); Entry<Long, IEvent[]> 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); IWaveform rw_wave = waves.get(2);
Entry<Long, IEvent[]> rw_entry = rw_wave.getEvents().floorEntry(2360000000L); Entry<Long, IEvent[]> rw_entry = rw_wave.getEvents().floorEntry(2360000000L);
assertTrue("1".equals(rw_entry.getValue()[0].toString())); assertEquals("1", rw_entry.getValue()[0].toString());
} }
@Test @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 @Test
public void testTxTextTruncated() throws Exception { public void testTxTextTruncated() throws Exception {
File f = new File("inputs/my_db_truncated.txlog").getAbsoluteFile(); File f = new File("inputs/my_db_truncated.txlog").getAbsoluteFile();