diff --git a/features/com.minres.scviewer.database.feature/feature.xml b/features/com.minres.scviewer.database.feature/feature.xml index f9100b4..cf69f50 100644 --- a/features/com.minres.scviewer.database.feature/feature.xml +++ b/features/com.minres.scviewer.database.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/com.minres.scviewer.database.feature/pom.xml b/features/com.minres.scviewer.database.feature/pom.xml index 83ceb26..3fc8ae0 100644 --- a/features/com.minres.scviewer.database.feature/pom.xml +++ b/features/com.minres.scviewer.database.feature/pom.xml @@ -8,5 +8,5 @@ 2.0.0-SNAPSHOT ../.. - 1.0.0-SNAPSHOT + 2.0.0-SNAPSHOT diff --git a/features/com.minres.scviewer.e4.feature/feature.xml b/features/com.minres.scviewer.e4.feature/feature.xml index cb817da..9a978bc 100644 --- a/features/com.minres.scviewer.e4.feature/feature.xml +++ b/features/com.minres.scviewer.e4.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/com.minres.scviewer.e4.feature/pom.xml b/features/com.minres.scviewer.e4.feature/pom.xml index 9556b46..35f956b 100644 --- a/features/com.minres.scviewer.e4.feature/pom.xml +++ b/features/com.minres.scviewer.e4.feature/pom.xml @@ -8,5 +8,5 @@ 2.0.0-SNAPSHOT ../.. - 1.0.0-SNAPSHOT + 1.1.0-SNAPSHOT diff --git a/features/com.minres.scviewer.feature/feature.xml b/features/com.minres.scviewer.feature/feature.xml index e5989c3..1f35310 100644 --- a/features/com.minres.scviewer.feature/feature.xml +++ b/features/com.minres.scviewer.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/com.minres.scviewer.feature/pom.xml b/features/com.minres.scviewer.feature/pom.xml index 309086f..d4210c8 100644 --- a/features/com.minres.scviewer.feature/pom.xml +++ b/features/com.minres.scviewer.feature/pom.xml @@ -8,5 +8,5 @@ 2.0.0-SNAPSHOT ../.. - 1.0.0-SNAPSHOT + 1.1.0-SNAPSHOT diff --git a/features/com.minres.scviewer.ui.feature/feature.xml b/features/com.minres.scviewer.ui.feature/feature.xml index 26fb07f..d79b2cc 100644 --- a/features/com.minres.scviewer.ui.feature/feature.xml +++ b/features/com.minres.scviewer.ui.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/com.minres.scviewer.ui.feature/pom.xml b/features/com.minres.scviewer.ui.feature/pom.xml index 2d31c46..4a76eb7 100644 --- a/features/com.minres.scviewer.ui.feature/pom.xml +++ b/features/com.minres.scviewer.ui.feature/pom.xml @@ -8,5 +8,5 @@ 2.0.0-SNAPSHOT ../.. - 1.0.0-SNAPSHOT + 1.1.0-SNAPSHOT diff --git a/p2repositories/com.minres.scviewer.updateSite/category.xml b/p2repositories/com.minres.scviewer.updateSite/category.xml index 4b66073..6199736 100644 --- a/p2repositories/com.minres.scviewer.updateSite/category.xml +++ b/p2repositories/com.minres.scviewer.updateSite/category.xml @@ -1,11 +1,11 @@ - - - + + + Viewer for SystemC Verification (SCV) library's transaction recording 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 a1f2ac6..c2470ae 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 @@ -13,7 +13,6 @@ package com.minres.scviewer.database.sqlite; import java.beans.IntrospectionException; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; @@ -24,6 +23,7 @@ import java.util.List; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbLoader; +import com.minres.scviewer.database.InputFormatException; import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.sqlite.db.IDatabase; import com.minres.scviewer.database.sqlite.db.SQLiteDatabase; @@ -42,16 +42,13 @@ public class SQLiteDbLoader implements IWaveformDbLoader { private ScvSimProps scvSimProps; - public SQLiteDbLoader() { - } - @Override public Long getMaxTime() { - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvTxEvent.class, + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, database, "time = (SELECT MAX(time) FROM ScvTxEvent)"); try { List event = handler.selectObjects(); - if(event.size()>0) + if(!event.isEmpty()) return event.get(0).getTime()*scvSimProps.getTime_resolution(); } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException | SQLException | IntrospectionException e) { @@ -62,8 +59,8 @@ public class SQLiteDbLoader implements IWaveformDbLoader { @Override public Collection getAllWaves() { - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvStream.class, database); - List streams=new ArrayList(); + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>(ScvStream.class, database); + List streams=new ArrayList<>(); try { for(ScvStream scvStream:handler.selectObjects()){ TxStream stream = new TxStream(database, db, scvStream); @@ -72,7 +69,6 @@ public class SQLiteDbLoader implements IWaveformDbLoader { } } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException | SQLException | IntrospectionException e) { -// e.printStackTrace(); } return streams; } @@ -80,25 +76,21 @@ public class SQLiteDbLoader implements IWaveformDbLoader { private byte[] x = "SQLite format 3".getBytes(); @Override - public boolean load(IWaveformDb db, File file) throws Exception { + public boolean load(IWaveformDb db, File file) throws InputFormatException { if(file.isDirectory() || !file.exists()) return false; this.db=db; - try { - FileInputStream fis = new FileInputStream(file); + try(FileInputStream fis = new FileInputStream(file)) { byte[] buffer = new byte[x.length]; int read = fis.read(buffer, 0, x.length); - fis.close(); if (read == x.length) for (int i = 0; i < x.length; i++) if (buffer[i] != x[i]) return false; - } catch(FileNotFoundException e) { - return false; - } catch(IOException e) { //if an I/O error occurs + } catch(IOException e) { return false; } database=new SQLiteDatabase(file.getAbsolutePath()); database.setData("TIMERESOLUTION", 1L); - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvSimProps.class, database); + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>(ScvSimProps.class, database); try { for(ScvSimProps simProps:handler.selectObjects()){ scvSimProps=simProps; diff --git a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java index dea611a..f2ab703 100644 --- a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java +++ b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java @@ -18,12 +18,7 @@ import java.util.Collection; import java.util.List; import com.minres.scviewer.database.AssociationType; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxAttribute; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.ITxGenerator; -import com.minres.scviewer.database.ITxRelation; -import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.sqlite.db.IDatabase; import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler; import com.minres.scviewer.database.sqlite.tables.ScvStream; @@ -31,6 +26,10 @@ import com.minres.scviewer.database.sqlite.tables.ScvTx; import com.minres.scviewer.database.sqlite.tables.ScvTxAttribute; import com.minres.scviewer.database.sqlite.tables.ScvTxEvent; import com.minres.scviewer.database.sqlite.tables.ScvTxRelation; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxAttribute; +import com.minres.scviewer.database.tx.ITxGenerator; +import com.minres.scviewer.database.tx.ITxRelation; public class Tx implements ITx { @@ -39,8 +38,10 @@ public class Tx implements ITx { private TxGenerator trGenerator; private ScvTx scvTx; private List attributes; - private Long begin, end; - private List incoming, outgoing; + private Long begin; + private Long end; + private List incoming; + private List outgoing; public Tx(IDatabase database, TxStream trStream, TxGenerator trGenerator, ScvTx scvTx) { this.database=database; @@ -55,7 +56,7 @@ public class Tx implements ITx { } @Override - public ITxStream getStream() { + public IWaveform getStream() { return trStream; } @@ -72,7 +73,7 @@ public class Tx implements ITx { @Override public Long getBeginTime() { if(begin==null){ - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvTxEvent.class, + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, database, "tx="+scvTx.getId()+" AND type="+ AssociationType.BEGIN.ordinal()); try { for(ScvTxEvent scvEvent:handler.selectObjects()){ @@ -88,7 +89,7 @@ public class Tx implements ITx { @Override public Long getEndTime() { if(end==null){ - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvTxEvent.class, + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, database, "tx="+scvTx.getId()+" AND type="+ AssociationType.END.ordinal()); try { for(ScvTxEvent scvEvent:handler.selectObjects()){ @@ -104,10 +105,10 @@ public class Tx implements ITx { @Override public List getAttributes() { if(attributes==null){ - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler( + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>( ScvTxAttribute.class, database, "tx="+scvTx.getId()); try { - attributes = new ArrayList(); + attributes = new ArrayList<>(); for(ScvTxAttribute scvAttribute:handler.selectObjects()){ attributes.add(new TxAttribute(this, scvAttribute)); @@ -122,10 +123,10 @@ public class Tx implements ITx { @Override public Collection getIncomingRelations() { if(incoming==null){ - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler( + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>( ScvTxRelation.class, database, "sink="+scvTx.getId()); try { - incoming = new ArrayList(); + incoming = new ArrayList<>(); for(ScvTxRelation scvRelation:handler.selectObjects()){ incoming.add(createRelation(scvRelation, false)); } @@ -139,10 +140,10 @@ public class Tx implements ITx { @Override public Collection getOutgoingRelations() { if(outgoing==null){ - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler( + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>( ScvTxRelation.class, database, "src="+scvTx.getId()); try { - outgoing = new ArrayList(); + outgoing = new ArrayList<>(); for(ScvTxRelation scvRelation:handler.selectObjects()){ outgoing.add(createRelation(scvRelation, true)); } @@ -155,7 +156,7 @@ public class Tx implements ITx { private ITxRelation createRelation(ScvTxRelation rel, boolean outgoing) { int otherId = outgoing?rel.getSink():rel.getSrc(); - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvTx.class, database, + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>(ScvTx.class, database, "id="+otherId); try { List res = handler.selectObjects(); diff --git a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxAttribute.java b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxAttribute.java index f06af9e..c6c987c 100644 --- a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxAttribute.java +++ b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxAttribute.java @@ -12,8 +12,8 @@ package com.minres.scviewer.database.sqlite; import com.minres.scviewer.database.AssociationType; import com.minres.scviewer.database.DataType; -import com.minres.scviewer.database.ITxAttribute; import com.minres.scviewer.database.sqlite.tables.ScvTxAttribute; +import com.minres.scviewer.database.tx.ITxAttribute; public class TxAttribute implements ITxAttribute{ diff --git a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxEvent.java b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxEvent.java index 28041ab..3900e0d 100644 --- a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxEvent.java +++ b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxEvent.java @@ -10,16 +10,18 @@ *******************************************************************************/ package com.minres.scviewer.database.sqlite; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.IWaveformEvent; +import com.minres.scviewer.database.EventKind; +import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.WaveformType; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxEvent; public class TxEvent implements ITxEvent { - private final Type type; + private final EventKind type; private ITx tx; - public TxEvent(Type type, ITx tx) { + public TxEvent(EventKind type, ITx tx) { super(); this.type = type; this.tx = tx; @@ -27,26 +29,21 @@ public class TxEvent implements ITxEvent { @Override public Long getTime() { - return type==Type.BEGIN?tx.getBeginTime():tx.getEndTime(); + return type==EventKind.BEGIN?tx.getBeginTime():tx.getEndTime(); } @Override - public IWaveformEvent duplicate() throws CloneNotSupportedException { + public IEvent duplicate() throws CloneNotSupportedException { return new TxEvent(type, tx); } - @Override - public int compareTo(IWaveformEvent o) { - return getTime().compareTo(o.getTime()); - } - @Override public ITx getTransaction() { return tx; } @Override - public Type getType() { + public EventKind getKind() { return type; } @@ -54,4 +51,9 @@ public class TxEvent implements ITxEvent { public String toString() { return type.toString()+"@"+getTime()+" of tx #"+tx.getId(); } + + @Override + public WaveformType getType() { + return WaveformType.TRANSACTION; + } } diff --git a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxGenerator.java b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxGenerator.java index 260a467..5ceca40 100644 --- a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxGenerator.java +++ b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxGenerator.java @@ -10,21 +10,21 @@ *******************************************************************************/ package com.minres.scviewer.database.sqlite; +import java.util.ArrayList; import java.util.List; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.ITxGenerator; -import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.sqlite.tables.ScvGenerator; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxGenerator; public class TxGenerator implements ITxGenerator { - private ITxStream stream; + private IWaveform stream; private ScvGenerator scvGenerator; - public TxGenerator(ITxStream stream, ScvGenerator scvGenerator) { + public TxGenerator(IWaveform stream, ScvGenerator scvGenerator) { this.stream=stream; this.scvGenerator=scvGenerator; } @@ -35,7 +35,7 @@ public class TxGenerator implements ITxGenerator { } @Override - public ITxStream getStream() { + public IWaveform getStream() { return stream; } @@ -46,7 +46,7 @@ public class TxGenerator implements ITxGenerator { @Override public List getTransactions() { - return null; + return new ArrayList<>(); } } diff --git a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxRelation.java b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxRelation.java index e1ba06c..2b092fd 100644 --- a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxRelation.java +++ b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxRelation.java @@ -10,14 +10,15 @@ *******************************************************************************/ package com.minres.scviewer.database.sqlite; -import com.minres.scviewer.database.ITxRelation; -import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.RelationType; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxRelation; public class TxRelation implements ITxRelation { RelationType relationType; - Tx source, target; + Tx source; + Tx target; public TxRelation(RelationType relationType, Tx source, Tx target) { this.source = source; diff --git a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java index dd605ba..c6df2a1 100644 --- a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java +++ b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java @@ -14,48 +14,47 @@ import java.beans.IntrospectionException; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.NavigableMap; import java.util.TreeMap; -import java.util.Vector; +import com.minres.scviewer.database.EventKind; import com.minres.scviewer.database.HierNode; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.ITxGenerator; -import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.RelationType; +import com.minres.scviewer.database.WaveformType; import com.minres.scviewer.database.sqlite.db.IDatabase; import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler; import com.minres.scviewer.database.sqlite.tables.ScvGenerator; import com.minres.scviewer.database.sqlite.tables.ScvStream; import com.minres.scviewer.database.sqlite.tables.ScvTx; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxGenerator; -public class TxStream extends HierNode implements ITxStream { +public class TxStream extends HierNode implements IWaveform { private IDatabase database; private String fullName; - + private IWaveformDb db; - + private ScvStream scvStream; - + private TreeMap generators; - + private TreeMap transactions; - + private Integer maxConcurrency; - - private TreeMap> events; + + private TreeMap events; private List usedRelationsList; - + public TxStream(IDatabase database, IWaveformDb waveformDb, ScvStream scvStream) { super(scvStream.getName()); this.database=database; @@ -79,17 +78,11 @@ public class TxStream extends HierNode implements ITxStream { return (long) scvStream.getId(); } - @Override - public String getKind() { - return scvStream.getKind(); - } - - @Override public List getGenerators() { if(generators==null){ - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler( + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>( ScvGenerator.class, database, "stream="+scvStream.getId()); - generators=new TreeMap(); + generators=new TreeMap<>(); try { for(ScvGenerator scvGenerator:handler.selectObjects()){ generators.put(scvGenerator.getId(), new TxGenerator(this, scvGenerator)); @@ -99,22 +92,20 @@ public class TxStream extends HierNode implements ITxStream { e.printStackTrace(); } } - return new ArrayList(generators.values()); + return new ArrayList<>(generators.values()); } @Override - public int getMaxConcurrency() { + public int getWidth() { if(maxConcurrency==null){ - java.sql.Connection connection=null; - java.sql.Statement statement=null; - java.sql.ResultSet resultSet=null; - try { - connection = database.createConnection(); - statement = connection.createStatement(); - StringBuilder sb = new StringBuilder(); - sb.append("SELECT MAX(concurrencyLevel) as concurrencyLevel FROM ScvTx where stream="); - sb.append(scvStream.getId()); - resultSet = statement.executeQuery(sb.toString()); + StringBuilder sb = new StringBuilder(); + sb.append("SELECT MAX(concurrencyLevel) as concurrencyLevel FROM ScvTx where stream="); + sb.append(scvStream.getId()); + try( + java.sql.Connection connection = database.createConnection(); + java.sql.Statement statement = connection.createStatement(); + java.sql.ResultSet resultSet = statement.executeQuery(sb.toString()); + ) { while (resultSet.next()) { if(maxConcurrency==null) maxConcurrency=0; Object value = resultSet.getObject("concurrencyLevel"); @@ -123,12 +114,6 @@ public class TxStream extends HierNode implements ITxStream { } } catch (SQLException e) { if(maxConcurrency==null) maxConcurrency=0; - } finally { - try{ - if(resultSet!=null) resultSet.close(); - if(statement!=null) statement.close(); - if(connection!=null) connection.close(); - } catch (SQLException e) { } } maxConcurrency+=1; } @@ -136,12 +121,12 @@ public class TxStream extends HierNode implements ITxStream { } @Override - public NavigableMap> getEvents(){ + public NavigableMap getEvents(){ if(events==null){ - events=new TreeMap>(); + events=new TreeMap<>(); for(Entry entry:getTransactions().entrySet()){ - putEvent(new TxEvent(TxEvent.Type.BEGIN, entry.getValue())); - putEvent(new TxEvent(TxEvent.Type.END, entry.getValue())); + putEvent(new TxEvent(EventKind.BEGIN, entry.getValue())); + putEvent(new TxEvent(EventKind.END, entry.getValue())); } } return events; @@ -149,20 +134,22 @@ public class TxStream extends HierNode implements ITxStream { private void putEvent(TxEvent ev){ Long time = ev.getTime(); - if(!events.containsKey(time)){ - Vector vector=new Vector(); - vector.add(ev); - events.put(time, vector); + if(events.containsKey(time)) { + IEvent[] oldV = events.get(time); + IEvent[] newV = new IEvent[oldV.length+1]; + System.arraycopy(oldV, 0, newV, 0, oldV.length); + newV[oldV.length]=ev; + events.put(time, newV); } else { - events.get(time).add(ev); + events.put(time, new IEvent[] {ev}); } } protected Map getTransactions() { if(transactions==null){ if(generators==null) getGenerators(); - transactions = new TreeMap(); - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvTx.class, database, + transactions = new TreeMap<>(); + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler<>(ScvTx.class, database, "stream="+scvStream.getId()); try { for(ScvTx scvTx:handler.selectObjects()){ @@ -177,14 +164,14 @@ public class TxStream extends HierNode implements ITxStream { } @Override - public Collection getWaveformEventsAtTime(Long time) { + public IEvent[] getEventsAtTime(Long time) { return getEvents().get(time); } public void setRelationTypeList(List usedRelationsList){ this.usedRelationsList=usedRelationsList; } - + public RelationType getRelationType(String name) { RelationType relType=RelationType.create(name); if(!usedRelationsList.contains(relType)) usedRelationsList.add(relType); @@ -192,8 +179,22 @@ public class TxStream extends HierNode implements ITxStream { } @Override - public Boolean equals(IWaveform other) { + public boolean isSame(IWaveform other) { return(other instanceof TxStream && this.getId().equals(other.getId())); } + @Override + public IEvent[] getEventsBeforeTime(Long time) { + Entry e = events.floorEntry(time); + if(e==null) + return new IEvent[]{}; + else + return events.floorEntry(time).getValue(); + } + + @Override + public WaveformType getType() { + return WaveformType.TRANSACTION; + } + } diff --git a/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF index 5d85fb1..ffdda45 100644 --- a/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Textual transaction database Bundle-SymbolicName: com.minres.scviewer.database.text -Bundle-Version: 2.0.2.qualifier +Bundle-Version: 2.1.0.qualifier Bundle-Vendor: MINRES Technologies GmbH Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.osgi.framework;version="1.3.0" diff --git a/plugins/com.minres.scviewer.database.text/pom.xml b/plugins/com.minres.scviewer.database.text/pom.xml index b47c051..51a8962 100644 --- a/plugins/com.minres.scviewer.database.text/pom.xml +++ b/plugins/com.minres.scviewer.database.text/pom.xml @@ -2,7 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.minres.scviewer.database.text - 2.0.2-SNAPSHOT + 2.1.0-SNAPSHOT com.minres.scviewer com.minres.scviewer.parent diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy index 10947f9..0f07966 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy @@ -22,12 +22,12 @@ import groovy.io.FileType import com.minres.scviewer.database.AssociationType import com.minres.scviewer.database.DataType -import com.minres.scviewer.database.ITxGenerator -import com.minres.scviewer.database.ITxStream import com.minres.scviewer.database.IWaveform import com.minres.scviewer.database.IWaveformDb import com.minres.scviewer.database.IWaveformDbLoader +import com.minres.scviewer.database.InputFormatException import com.minres.scviewer.database.RelationType +import com.minres.scviewer.database.tx.ITxGenerator public class TextDbLoader implements IWaveformDbLoader{ @@ -63,7 +63,7 @@ public class TextDbLoader implements IWaveformDbLoader{ static final byte[] x = "scv_tr_stream".bytes @Override - boolean load(IWaveformDb db, File file) throws Exception { + boolean load(IWaveformDb db, File file) throws InputFormatException { if(file.isDirectory() || !file.exists()) return false; this.db=db this.streams=[] @@ -83,7 +83,7 @@ public class TextDbLoader implements IWaveformDbLoader{ .make() // NPE here ---> parseInput(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file)) - streams.each{ TxStream stream -> stream.getMaxConcurrency() } + streams.each{ TxStream stream -> stream.getWidth() } return true } } catch (IndexOutOfBoundsException e) { @@ -98,6 +98,9 @@ public class TextDbLoader implements IWaveformDbLoader{ System.out.println("---->>> Exception "+e.toString()+" caught while loading database"); //System.out.println("---->>> Exception "+e.toString()+" caught while loading database. StackTrace following... "); //e.printStackTrace() + } catch(Error e) { + System.out.println("---->>> Exception "+e.toString()+" caught while loading database. StackTrace following... "); + e.printStackTrace() } return false; } @@ -163,7 +166,7 @@ public class TextDbLoader implements IWaveformDbLoader{ case "scv_tr_generator": if ((matcher = line =~ /^scv_tr_generator\s+\(ID\s+(\d+),\s+name\s+"([^"]+)",\s+scv_tr_stream\s+(\d+),$/)) { def id = Integer.parseInt(matcher[0][1]) - ITxStream stream=streamsById[Integer.parseInt(matcher[0][3])] + TxStream stream=streamsById[Integer.parseInt(matcher[0][3])] as TxStream generator=new TxGenerator(id, stream, matcher[0][2]) stream.generators< transactions=[] @@ -39,7 +37,7 @@ class TxGenerator implements ITxGenerator{ this.name=name } - ITxStream getStream(){ + IWaveform getStream(){ return stream; } diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxRelation.groovy b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxRelation.java similarity index 68% rename from plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxRelation.groovy rename to plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxRelation.java index 4bd9f98..6990b4f 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxRelation.groovy +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxRelation.java @@ -1,16 +1,15 @@ -package com.minres.scviewer.database.text +package com.minres.scviewer.database.text; -import com.minres.scviewer.database.ITxRelation -import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.RelationType; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxRelation; class TxRelation implements ITxRelation { - Tx source + final Tx source; - Tx target - - RelationType relationType + final Tx target; + final RelationType relationType; public TxRelation(RelationType relationType, Tx source, Tx target) { this.source = source; diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy index 02858c8..619e334 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy @@ -16,20 +16,22 @@ import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.NavigableMap; +import java.util.Map.Entry import org.mapdb.Serializer -import com.minres.scviewer.database.ITxEvent; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb -import com.minres.scviewer.database.IWaveformEvent -import com.minres.scviewer.database.ITxGenerator +import com.minres.scviewer.database.WaveformType +import com.minres.scviewer.database.tx.ITx +import com.minres.scviewer.database.tx.ITxEvent +import com.minres.scviewer.database.tx.ITxGenerator +import com.minres.scviewer.database.EventKind import com.minres.scviewer.database.HierNode; +import com.minres.scviewer.database.IEvent import com.minres.scviewer.database.IHierNode -import com.minres.scviewer.database.ITxStream -import com.minres.scviewer.database.ITx -class TxStream extends HierNode implements ITxStream { +class TxStream extends HierNode implements IWaveform { Long id @@ -37,20 +39,17 @@ class TxStream extends HierNode implements ITxStream { String fullName - String kind - def generators = [] int maxConcurrency - private TreeMap> events + private TreeMap events TxStream(TextDbLoader loader, int id, String name, String kind){ super(name) this.id=id this.database=loader.db this.fullName=name - this.kind=kind this.maxConcurrency=0 //events = new TreeMap>() events = loader.mapDb.treeMap(name).keySerializer(Serializer.LONG).createOrOpen(); @@ -66,18 +65,18 @@ class TxStream extends HierNode implements ITxStream { } @Override - public int getMaxConcurrency() { + public int getWidth() { if(!maxConcurrency){ generators.each {TxGenerator generator -> generator.transactions.each{ Tx tx -> - putEvent(new TxEvent(ITxEvent.Type.BEGIN, tx)) - putEvent(new TxEvent(ITxEvent.Type.END, tx)) + putEvent(new TxEvent(EventKind.BEGIN, tx)) + putEvent(new TxEvent(EventKind.END, tx)) } } def rowendtime = [0] events.keySet().each{long time -> def value=events.get(time) - def starts=value.findAll{ITxEvent event ->event.type==ITxEvent.Type.BEGIN} + def starts=value.findAll{IEvent event ->event.kind==EventKind.BEGIN} starts.each {ITxEvent event -> Tx tx = event.transaction def rowIdx = 0 @@ -96,24 +95,41 @@ class TxStream extends HierNode implements ITxStream { private putEvent(ITxEvent event){ if(!events.containsKey(event.time)) - events.put(event.time, [event]) - else - events[event.time]< getEvents() { return events; } @Override - public Collection getWaveformEventsAtTime(Long time) { + public IEvent[] getEventsAtTime(Long time) { return events.get(time); } @Override - public Boolean equals(IWaveform other) { + public boolean isSame(IWaveform other) { return(other instanceof TxStream && this.getId()==other.getId()); } + @Override + public IEvent[] getEventsBeforeTime(Long time) { + Entry e = events.floorEntry(time); + if(e==null) + return null; + else + return events.floorEntry(time).getValue(); + } + + @Override + public WaveformType getType() { + return WaveformType.TRANSACTION; + } + } diff --git a/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF index a2f3b4a..d6fbeea 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: SWT widget Bundle-SymbolicName: com.minres.scviewer.database.ui.swt -Bundle-Version: 2.3.1.qualifier +Bundle-Version: 3.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.eclipse.swt;bundle-version="3.103.1", diff --git a/plugins/com.minres.scviewer.database.ui.swt/pom.xml b/plugins/com.minres.scviewer.database.ui.swt/pom.xml index dc0eda7..616f432 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/pom.xml +++ b/plugins/com.minres.scviewer.database.ui.swt/pom.xml @@ -8,5 +8,5 @@ 2.0.0-SNAPSHOT ../.. - 2.3.1-SNAPSHOT + 3.0.0-SNAPSHOT diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformStyleProvider.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformStyleProvider.java new file mode 100644 index 0000000..cbc3d1f --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformStyleProvider.java @@ -0,0 +1,17 @@ +package com.minres.scviewer.database.ui; + +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; + +public interface IWaveformStyleProvider { + + Font getNameFont(); + + Font getNameFontHighlite(); + + int getTrackHeight(); + + Color getColor(WaveformColors type); + + Color[] computeColor(String name); +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformView.java index c3eeb49..9830894 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformView.java @@ -11,7 +11,6 @@ package com.minres.scviewer.database.ui; import java.beans.PropertyChangeListener; -import java.util.HashMap; import java.util.List; import org.eclipse.jface.viewers.ISelection; @@ -19,7 +18,6 @@ import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Control; import com.minres.scviewer.database.IWaveform; @@ -37,6 +35,8 @@ public interface IWaveformView extends PropertyChangeListener, ISelectionProvide public void removeSelectionChangedListener(ISelectionChangedListener listener); + public void setStyleProvider(IWaveformStyleProvider styleProvider); + public void update(); public Control getControl(); @@ -103,8 +103,6 @@ public interface IWaveformView extends PropertyChangeListener, ISelectionProvide public List getCursorList(); - public void setColors(HashMap colourMap); - public long getBaselineTime(); public void setBaselineTime(Long scale); @@ -114,4 +112,6 @@ public interface IWaveformView extends PropertyChangeListener, ISelectionProvide public void addDisposeListener( DisposeListener listener ); public void deleteSelectedTracks(); + + public TrackEntry addWaveform(IWaveform waveform, int pos); } \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformViewFactory.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformViewFactory.java index 79179e1..f535534 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformViewFactory.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/IWaveformViewFactory.java @@ -14,4 +14,6 @@ import org.eclipse.swt.widgets.Composite; public interface IWaveformViewFactory { public IWaveformView createPanel(Composite parent); + + public IWaveformView createPanel(Composite parent, IWaveformStyleProvider styleProvider); } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntry.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntry.java index 3bc00a5..e8dbd1d 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntry.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntry.java @@ -11,66 +11,11 @@ package com.minres.scviewer.database.ui; -import java.awt.Color; - -import com.minres.scviewer.database.ISignal; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.IWaveform; public class TrackEntry { - // color info - public static Color fallbackColor = new Color(200,0,0); - public static Color highlightedFallbackColor = new Color(255,0,0); - private Color[]signalColors; - - // list of random colors - private static Color[][] randomColors = { - { new Color( 170, 66, 37 ), new Color ( 190, 66, 37 ) }, - { new Color( 96, 74, 110 ), new Color ( 96, 74, 130 ) }, - { new Color( 133, 105, 128 ), new Color ( 153, 105, 128 ) }, - { new Color( 0, 126, 135 ), new Color ( 0, 126, 155 ) }, - { new Color( 243, 146, 75 ), new Color ( 255, 146, 75 ) }, - { new Color( 206, 135, 163 ), new Color ( 226, 135, 163 ) }, - { new Color( 124, 103, 74 ), new Color ( 144, 103, 74 ) }, - { new Color( 194, 187, 169 ), new Color ( 214, 187, 169 ) }, - { new Color( 104, 73, 71 ), new Color ( 124, 73, 71 ) }, - { new Color( 75, 196, 213 ), new Color ( 75, 196, 233 ) }, - { new Color( 206, 232, 229 ), new Color ( 206, 252, 229 ) }, - { new Color( 169, 221, 199 ), new Color ( 169, 241, 199 ) }, - { new Color( 100, 165, 197 ), new Color ( 100, 165, 217 ) }, - { new Color( 150, 147, 178 ), new Color ( 150, 147, 198 ) }, - { new Color( 200, 222, 182 ), new Color ( 200, 242, 182 ) }, - { new Color( 147, 208, 197 ), new Color ( 147, 228, 197 ) } - }; - - public static Color[] computeColor (String streamValue, Color fallback, Color highlightedFallback) { - - Color[]result = new Color[2]; - - result[0] = fallback; - result[1] = highlightedFallback; - - // assign "random" color here, one name always results in the same color! - if( streamValue!=null && randomColors.length > 0 ) { - int index = Math.abs(streamValue.hashCode()) % randomColors.length; - result[0] = randomColors[index][0]; - result[1] = randomColors[index][1]; - } - - return result; - - } - - public void setColor(Color changedColor, Color highlightColor) { - signalColors[0] = changedColor; - signalColors[1] = highlightColor; - } - - public Color[] getColors() { - return signalColors; - } + IWaveformStyleProvider styleProvider; public enum ValueDisplay { DEFAULT, SIGNED, UNSIGNED @@ -95,32 +40,14 @@ public class TrackEntry { public WaveDisplay waveDisplay = WaveDisplay.DEFAULT; - public TrackEntry(IWaveform waveform) { + public TrackEntry(IWaveform waveform, IWaveformStyleProvider styleProvider) { this.waveform = waveform; + this.styleProvider=styleProvider; vOffset=0; height=0; selected=false; - signalColors = new Color[2]; - signalColors[0] = fallbackColor; - signalColors[1] = highlightedFallbackColor; } - public boolean isStream(){ - return waveform instanceof ITxStream; - } - - public ITxStream getStream(){ - return (ITxStream) waveform; - } - - public boolean isSignal(){ - return waveform instanceof ISignal; - } - - public ISignal getSignal(){ - return (ISignal) waveform; - } - @Override public boolean equals(Object obj) { if(obj instanceof TrackEntry){ diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/Constants.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/Constants.java index 31b43eb..7e8563f 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/Constants.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/Constants.java @@ -2,11 +2,13 @@ package com.minres.scviewer.database.ui.swt; public class Constants { - public static final String[] unitString={"fs", "ps", "ns", "us", "ms"};//, "s"}; + public static final String[] UNIT_STRING={"fs", "ps", "ns", "us", "ms"};//, "s"}; - public static final int[] unitMultiplier={1, 3, 10, 30, 100, 300}; + public static final int[] UNIT_MULTIPLIER={1, 3, 10, 30, 100, 300}; public static final String CONTENT_PROVIDER_TAG = "TOOLTIP_CONTENT_PROVIDER"; public static final String HELP_PROVIDER_TAG = "TOOLTIP_HELP_PROVIDER"; + + private Constants() {} } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DatabaseUiPlugin.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DatabaseUiPlugin.java index f274d1d..26fa9ac 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DatabaseUiPlugin.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DatabaseUiPlugin.java @@ -16,12 +16,14 @@ import org.eclipse.core.runtime.Status; import org.osgi.framework.BundleContext; public class DatabaseUiPlugin extends Plugin { - - public void start(BundleContext context) throws Exception { - getLog().log(new Status(IStatus.OK, "org.eclipse.e4.core", "Starting org.eclipse.e4.core bundle...")); - } - - public void stop(BundleContext context) throws Exception { - getLog().log(new Status(IStatus.OK, "org.eclipse.e4.core", "Stopping org.eclipse.e4.core bundle...")); - } + + @Override + public void start(BundleContext context) throws Exception { + getLog().log(new Status(IStatus.OK, "org.eclipse.e4.core", "Starting org.eclipse.e4.core bundle...")); + } + + @Override + public void stop(BundleContext context) throws Exception { + getLog().log(new Status(IStatus.OK, "org.eclipse.e4.core", "Stopping org.eclipse.e4.core bundle...")); + } } \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DefaultWaveformStyleProvider.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DefaultWaveformStyleProvider.java new file mode 100644 index 0000000..a0a1e85 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DefaultWaveformStyleProvider.java @@ -0,0 +1,91 @@ +package com.minres.scviewer.database.ui.swt; + +import java.util.Map; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.wb.swt.SWTResourceManager; + +import com.minres.scviewer.database.ui.IWaveformStyleProvider; +import com.minres.scviewer.database.ui.WaveformColors; + +public class DefaultWaveformStyleProvider implements IWaveformStyleProvider { + + Composite parent; + + private Font nameFont; + + private Font nameFontB; + + Color[] colors = new Color[WaveformColors.values().length]; + + public DefaultWaveformStyleProvider() { + nameFont = Display.getCurrent().getSystemFont(); + nameFontB = SWTResourceManager.getBoldFont(nameFont); + colors[WaveformColors.LINE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[WaveformColors.LINE_HIGHLITE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_CYAN); + colors[WaveformColors.TRACK_BG_EVEN.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_BLACK); + colors[WaveformColors.TRACK_BG_ODD.ordinal()] = SWTResourceManager.getColor(40, 40, 40); + colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()] = SWTResourceManager.getColor(40, 40, 80); + colors[WaveformColors.TX_BG.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN); + colors[WaveformColors.TX_BG_HIGHLITE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN); + colors[WaveformColors.TX_BORDER.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[WaveformColors.SIGNAL0.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN); + colors[WaveformColors.SIGNAL1.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN); + colors[WaveformColors.SIGNALZ.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_YELLOW); + colors[WaveformColors.SIGNALX.ordinal()] = SWTResourceManager.getColor(255, 51, 51); + colors[WaveformColors.SIGNALU.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_YELLOW); + colors[WaveformColors.SIGNAL_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE); + colors[WaveformColors.SIGNAL_REAL.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_YELLOW); + colors[WaveformColors.SIGNAL_NAN.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[WaveformColors.CURSOR.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[WaveformColors.CURSOR_DRAG.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GRAY); + colors[WaveformColors.CURSOR_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE); + colors[WaveformColors.MARKER.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY); + colors[WaveformColors.MARKER_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE); + colors[WaveformColors.REL_ARROW.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_MAGENTA); + colors[WaveformColors.REL_ARROW_HIGHLITE.ordinal()] = SWTResourceManager.getColor(255, 128, 255); + } + /** + * needs redraw() afterwards + * @param colourMap + */ + public void initColors(Map colourMap) { + Display d = parent.getDisplay(); + if (colourMap != null) { + for (WaveformColors c : WaveformColors.values()) { + if (colourMap.containsKey(c)) + colors[c.ordinal()] = new Color(d, colourMap.get(c)); + } + } + } + + @Override + public Font getNameFont() { + return nameFont; + } + + @Override + public Font getNameFontHighlite() { + return nameFontB; + } + + @Override + public int getTrackHeight() { + return 50; + } + @Override + public Color getColor(WaveformColors type) { + return colors[type.ordinal()]; + } + @Override + public Color[] computeColor(String name) { + return new Color[] {SWTResourceManager.getColor( 200,0,0), SWTResourceManager.getColor( 255,0,0)}; + + } + +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/WaveformViewFactory.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/WaveformViewFactory.java index cb197dc..fc997b2 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/WaveformViewFactory.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/WaveformViewFactory.java @@ -12,6 +12,7 @@ package com.minres.scviewer.database.ui.swt; import org.eclipse.swt.widgets.Composite; +import com.minres.scviewer.database.ui.IWaveformStyleProvider; import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformViewFactory; import com.minres.scviewer.database.ui.swt.internal.WaveformView; @@ -20,7 +21,12 @@ public class WaveformViewFactory implements IWaveformViewFactory { @Override public IWaveformView createPanel(Composite parent) { - return new WaveformView(parent); + return new WaveformView(parent, new DefaultWaveformStyleProvider()); + } + + @Override + public IWaveformView createPanel(Composite parent, IWaveformStyleProvider styleProvider) { + return new WaveformView(parent, styleProvider); } } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java index 0c58157..4e21fba 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java @@ -21,17 +21,16 @@ import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxRelation; -import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.RelationType; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxRelation; import com.minres.scviewer.database.ui.WaveformColors; public class ArrowPainter implements IPainter { - private final int xCtrlOffset = 50; + private static final float X_CTRL_OFFSET = 50; - private final int yCtrlOffset = 30; + private int yCtrlOffset = 30; private WaveformCanvas waveCanvas; @@ -83,14 +82,13 @@ public class ArrowPainter implements IPainter { deferUpdate = false; iRect.clear(); oRect.clear(); - ITxStream stream = tx.getStream(); - IWaveformPainter painter = waveCanvas.wave2painterMap.get(stream); + IWaveformPainter painter = waveCanvas.wave2painterMap.get(tx.getStream()); if (painter == null) { // stream has been added but painter not yet // created deferUpdate = true; return; } - int laneHeight = painter.getHeight() / stream.getMaxConcurrency(); + int laneHeight = painter.getHeight() / tx.getStream().getWidth(); txRectangle = new Rectangle((int) (tx.getBeginTime() / scaleFactor), waveCanvas.rulerHeight + painter.getVerticalOffset() + laneHeight * tx.getConcurrencyIndex(), (int) ((tx.getEndTime() - tx.getBeginTime()) / scaleFactor), laneHeight); @@ -102,13 +100,13 @@ public class ArrowPainter implements IPainter { for (ITxRelation iTxRelation : relations) { ITx otherTx = useTarget ? iTxRelation.getTarget() : iTxRelation.getSource(); if (waveCanvas.wave2painterMap.containsKey(otherTx.getStream())) { - ITxStream stream = otherTx.getStream(); - IWaveformPainter painter = waveCanvas.wave2painterMap.get(stream); - int laneHeight = painter.getHeight() / stream.getMaxConcurrency(); - Rectangle bb = new Rectangle((int) (otherTx.getBeginTime() / scaleFactor), - waveCanvas.rulerHeight + painter.getVerticalOffset() - + laneHeight * otherTx.getConcurrencyIndex(), - (int) ((otherTx.getEndTime() - otherTx.getBeginTime()) / scaleFactor), laneHeight); + IWaveformPainter painter = waveCanvas.wave2painterMap.get(otherTx.getStream()); + int height = waveCanvas.styleProvider.getTrackHeight(); + Rectangle bb = new Rectangle( + (int) (otherTx.getBeginTime() / scaleFactor), + waveCanvas.rulerHeight + painter.getVerticalOffset() + height * otherTx.getConcurrencyIndex(), + (int) ((otherTx.getEndTime() - otherTx.getBeginTime()) / scaleFactor), + height); res.add(new LinkEntry(bb, iTxRelation.getRelationType())); } } @@ -116,8 +114,9 @@ public class ArrowPainter implements IPainter { @Override public void paintArea(Projection proj, Rectangle clientRect) { - Color fgColor = waveCanvas.colors[WaveformColors.REL_ARROW.ordinal()]; - Color highliteColor = waveCanvas.colors[WaveformColors.REL_ARROW_HIGHLITE.ordinal()]; + yCtrlOffset = waveCanvas.styleProvider.getTrackHeight()/2; + Color fgColor = waveCanvas.styleProvider.getColor(WaveformColors.REL_ARROW); + Color highliteColor = waveCanvas.styleProvider.getColor(WaveformColors.REL_ARROW_HIGHLITE); if(tx==null) return; if (!deferUpdate) { @@ -152,10 +151,10 @@ public class ArrowPainter implements IPainter { path.moveTo(point1.x, point1.y); if (point1.y == point2.y) { Point center = new Point((point1.x + point2.x) / 2, point1.y - yCtrlOffset); - path.cubicTo(point1.x + xCtrlOffset, point1.y, center.x - xCtrlOffset, center.y, center.x, center.y); - path.cubicTo(center.x + xCtrlOffset, center.y, point2.x - xCtrlOffset, point2.y, point2.x, point2.y); + path.cubicTo(point1.x + X_CTRL_OFFSET, point1.y, center.x - X_CTRL_OFFSET, center.y, center.x, center.y); + path.cubicTo(center.x + X_CTRL_OFFSET, center.y, point2.x - X_CTRL_OFFSET, point2.y, point2.x, point2.y); } else - path.cubicTo(point1.x + xCtrlOffset, point1.y, point2.x - xCtrlOffset, point2.y, point2.x, point2.y); + path.cubicTo(point1.x + X_CTRL_OFFSET, point1.y, point2.x - X_CTRL_OFFSET, point2.y, point2.x, point2.y); proj.setAntialias(SWT.ON); proj.setForeground(fgColor); @@ -168,8 +167,8 @@ public class ArrowPainter implements IPainter { } class LinkEntry { - public Rectangle rectangle; - public RelationType relationType; + public final Rectangle rectangle; + public final RelationType relationType; public LinkEntry(Rectangle rectangle, RelationType relationType) { super(); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/CursorPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/CursorPainter.java index 1c5719f..a5dcde9 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/CursorPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/CursorPainter.java @@ -63,7 +63,7 @@ public class CursorPainter implements IPainter, ICursor { public void paintArea(Projection proj, Rectangle clientRect) { Rectangle area = proj.unProject(clientRect); - if(this.waveCanvas.painterList.size()>0){ + if(!waveCanvas.painterList.isEmpty()){ long scaleFactor=waveCanvas.getScaleFactor(); long beginPos = area.x; @@ -75,15 +75,15 @@ public class CursorPainter implements IPainter, ICursor { int x = (int) (time/scaleFactor); // distance of marker from the top of Canvas' painting area int top = id<0?area.y:area.y+15; - Color drawColor=waveCanvas.colors[id<0?WaveformColors.CURSOR.ordinal():WaveformColors.MARKER.ordinal()]; - Color dragColor = waveCanvas.colors[WaveformColors.CURSOR_DRAG.ordinal()]; - Color textColor=waveCanvas.colors[id<0?WaveformColors.CURSOR_TEXT.ordinal():WaveformColors.MARKER_TEXT.ordinal()]; + Color drawColor=waveCanvas.styleProvider.getColor(id<0?WaveformColors.CURSOR:WaveformColors.MARKER); + Color dragColor = waveCanvas.styleProvider.getColor(WaveformColors.CURSOR_DRAG); + Color textColor=waveCanvas.styleProvider.getColor(id<0?WaveformColors.CURSOR_TEXT:WaveformColors.MARKER_TEXT); if(x>=beginPos && x<=maxValX){ proj.setForeground(isDragging?dragColor:drawColor); proj.drawLine(x, top, x, area.y+area.height); proj.setBackground(drawColor); proj.setForeground(textColor); - Double dTime=new Double(time); + double dTime=time; proj.drawText((dTime/waveCanvas.getScaleFactorPow10())+waveCanvas.getUnitStr(), x+1, top); } } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ObservableList.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ObservableList.java index 9adfe03..21f90d4 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ObservableList.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ObservableList.java @@ -27,7 +27,7 @@ public class ObservableList implements List { public static final String CONTENT_PROPERTY = "content"; public ObservableList() { - this(new ArrayList()); + this(new ArrayList<>()); } public ObservableList(List delegate) { @@ -100,7 +100,7 @@ public class ObservableList implements List { boolean success = this.delegate.addAll(c); if ((success) && (c != null)) { - List values = new ArrayList(); + List values = new ArrayList<>(); for (Iterator i = c.iterator(); i.hasNext();) { values.add(i.next()); } @@ -118,7 +118,7 @@ public class ObservableList implements List { boolean success = this.delegate.addAll(index, c); if ((success) && (c != null)) { - List values = new ArrayList(); + List values = new ArrayList<>(); for (Iterator i = c.iterator(); i.hasNext();) { values.add(i.next()); } @@ -133,7 +133,7 @@ public class ObservableList implements List { public void clear() { int oldSize = size(); - List values = new ArrayList(); + List values = new ArrayList<>(); values.addAll(this.delegate); this.delegate.clear(); if (!(values.isEmpty())) { @@ -215,14 +215,12 @@ public class ObservableList implements List { return false; } - List values = new ArrayList(); - if (c != null) { - for (Iterator i = c.iterator(); i.hasNext();) { - @SuppressWarnings("unchecked") - E element = (E) i.next(); - if (this.delegate.contains(element)) { - values.add(element); - } + List values = new ArrayList<>(); + for (Iterator i = c.iterator(); i.hasNext();) { + @SuppressWarnings("unchecked") + E element = (E) i.next(); + if (this.delegate.contains(element)) { + values.add(element); } } @@ -241,14 +239,12 @@ public class ObservableList implements List { return false; } - List values = new ArrayList(); + List values = new ArrayList<>(); Iterator i; - if (c != null) { - for (i = this.delegate.iterator(); i.hasNext();) { - E element = i.next(); - if (!(c.contains(element))) { - values.add(element); - } + for (i = this.delegate.iterator(); i.hasNext();) { + E element = i.next(); + if (!(c.contains(element))) { + values.add(element); } } @@ -327,7 +323,7 @@ public class ObservableList implements List { */ private static final long serialVersionUID = 7819626246672640599L; - private List values = new ArrayList(); + private List values = new ArrayList<>(); public MultiElementUpdatedEvent(Object source, List values) { super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0, @@ -336,7 +332,7 @@ public class ObservableList implements List { this.values.addAll(values); } - public List getValues() { + public List getValues() { return Collections.unmodifiableList(this.values); } } @@ -347,7 +343,7 @@ public class ObservableList implements List { */ private static final long serialVersionUID = 7819626246672640599L; - private List values = new ArrayList(); + private List values = new ArrayList<>(); public MultiElementRemovedEvent(Object source, List values) { super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0, @@ -356,7 +352,7 @@ public class ObservableList implements List { this.values.addAll(values); } - public List getValues() { + public List getValues() { return Collections.unmodifiableList(this.values); } } @@ -366,7 +362,7 @@ public class ObservableList implements List { * */ private static final long serialVersionUID = -116376519087713082L; - private List values = new ArrayList(); + private List values = new ArrayList<>(); public MultiElementAddedEvent(Object source, int index, List values) { super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, index, @@ -375,7 +371,7 @@ public class ObservableList implements List { this.values.addAll(values); } - public List getValues() { + public List getValues() { return Collections.unmodifiableList(this.values); } } @@ -385,7 +381,7 @@ public class ObservableList implements List { * */ private static final long serialVersionUID = -8654027608903811577L; - private List values = new ArrayList(); + private List values = new ArrayList<>(); public ElementClearedEvent(Object source, List values) { super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0, @@ -394,7 +390,7 @@ public class ObservableList implements List { this.values.addAll(values); } - public List getValues() { + public List getValues() { return Collections.unmodifiableList(this.values); } } @@ -432,7 +428,7 @@ public class ObservableList implements List { } } - public static abstract class ElementEvent extends PropertyChangeEvent { + public abstract static class ElementEvent extends PropertyChangeEvent { /** * */ @@ -441,7 +437,7 @@ public class ObservableList implements List { private final int index; public ElementEvent(Object source, Object oldValue, Object newValue, int index, ObservableList.ChangeType type) { - super(source, "content", oldValue, newValue); + super(source, CONTENT_PROPERTY, oldValue, newValue); this.type = type; this.index = index; } @@ -463,7 +459,7 @@ public class ObservableList implements List { } } - public static enum ChangeType { + public enum ChangeType { ADDED, UPDATED, REMOVED, CLEARED, MULTI_ADD, MULTI_UPDATED, MULTI_REMOVE, NONE; public static final Object oldValue; @@ -483,9 +479,9 @@ public class ObservableList implements List { return MULTI_REMOVE; case 6: return NONE; - case 1: + default: + return UPDATED; } - return UPDATED; } static { @@ -554,6 +550,7 @@ public class ObservableList implements List { return this.iterDelegate.next(); } + @Override public void remove() { int oldSize = ObservableList.this.size(); Object element = ObservableList.this.get(this.cursor); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RelSelectionDialog.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RelSelectionDialog.java index 28c7d97..124ec0e 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RelSelectionDialog.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RelSelectionDialog.java @@ -14,8 +14,8 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Shell; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxRelation; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxRelation; class RelSelectionDialog extends Dialog { private java.util.List entries; @@ -24,7 +24,7 @@ class RelSelectionDialog extends Dialog { private ITxRelation selected = null; - public RelSelectionDialog(Shell shell, ArrayList candidates, boolean target) { + public RelSelectionDialog(Shell shell, java.util.List candidates, boolean target) { super(shell); entries = candidates; entryTx = entries.stream().map(r->target?r.getTarget():r.getSource()).collect(Collectors.toCollection(ArrayList::new)); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RulerPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RulerPainter.java index 85c0364..be31f05 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RulerPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/RulerPainter.java @@ -21,8 +21,8 @@ import org.eclipse.wb.swt.SWTResourceManager; public class RulerPainter implements IPainter { protected WaveformCanvas waveCanvas; - static final int rulerTickMinorC = 10; - static final int rulerTickMajorC = 100; + static final int RULER_TICK_MINOR = 10; + static final int RULER_TICK_MAJOR = 100; static final DecimalFormat df = new DecimalFormat("#.00####"); @@ -47,8 +47,8 @@ public class RulerPainter implements IPainter { long startVal=startPos - proj.getTranslation().x*scaleFactor; long endPos=startPos+area.width*scaleFactor; - long rulerTickMinor = rulerTickMinorC*scaleFactor; - long rulerTickMajor = rulerTickMajorC*scaleFactor; + long rulerTickMinor = RULER_TICK_MINOR*scaleFactor; + long rulerTickMajor = RULER_TICK_MAJOR*scaleFactor; int minorTickY = waveCanvas.rulerHeight-5; int majorTickY = waveCanvas.rulerHeight-15; @@ -68,13 +68,13 @@ public class RulerPainter implements IPainter { gc.drawLine(area.x, area.y+bottom, area.x+area.width, area.y+bottom); for (long pos = startMinorIncrPos, tick = startMinorIncrVal; pos < endPos; pos+= rulerTickMinor, tick += rulerTickMinor) { - int x0_pos = (int) (pos/scaleFactor); - long x0_val = tick/scaleFactor; + int x0Pos = (int) (pos/scaleFactor); + long x0Val = tick/scaleFactor; if ((tick % rulerTickMajor) == 0) { - gc.drawText(df.format(x0_val*unitMultiplier)+unit, x0_pos, area.y+textY); - gc.drawLine(x0_pos, area.y+majorTickY, x0_pos,area.y+ bottom); + gc.drawText(df.format(x0Val*unitMultiplier)+unit, x0Pos, area.y+textY); + gc.drawLine(x0Pos, area.y+majorTickY, x0Pos,area.y+ bottom); } else { - gc.drawLine(x0_pos, area.y+minorTickY, x0_pos, area.y+bottom); + gc.drawLine(x0Pos, area.y+minorTickY, x0Pos, area.y+bottom); } } } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/SignalPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/SignalPainter.java index 4672582..896d7fb 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/SignalPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/SignalPainter.java @@ -10,6 +10,7 @@ *******************************************************************************/ package com.minres.scviewer.database.ui.swt.internal; +import java.util.Arrays; import java.util.Collection; import java.util.Map.Entry; import java.util.NavigableMap; @@ -24,26 +25,28 @@ import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import com.minres.scviewer.database.BitVector; -import com.minres.scviewer.database.ISignal; +import com.minres.scviewer.database.DoubleVal; +import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.WaveformColors; public class SignalPainter extends TrackPainter { private class SignalChange { long time; - Object value; + IEvent value; boolean fromMap; - public SignalChange(Entry entry) { + public SignalChange(Entry entry) { time = entry.getKey(); - value = entry.getValue(); + value = entry.getValue()[0]; fromMap = true; } - public void set(Entry entry, Long actTime) { + public void set(Entry entry, Long actTime) { if (entry != null) { time = entry.getKey(); - value = entry.getValue(); + value = entry.getValue()[0]; fromMap = true; } else { time = actTime; @@ -84,11 +87,11 @@ public class SignalPainter extends TrackPainter { } public void paintArea(Projection proj, Rectangle area) { - ISignal signal = trackEntry.getSignal(); + IWaveform signal = trackEntry.waveform; if (trackEntry.selected) - proj.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]); + proj.setBackground(this.waveCanvas.styleProvider.getColor(WaveformColors.TRACK_BG_HIGHLITE)); else - proj.setBackground(this.waveCanvas.colors[even ? WaveformColors.TRACK_BG_EVEN.ordinal() : WaveformColors.TRACK_BG_ODD.ordinal()]); + proj.setBackground(this.waveCanvas.styleProvider.getColor(even ? WaveformColors.TRACK_BG_EVEN : WaveformColors.TRACK_BG_ODD)); proj.setFillRule(SWT.FILL_EVEN_ODD); proj.fillRectangle(area); @@ -97,8 +100,8 @@ public class SignalPainter extends TrackPainter { long beginTime = beginPos*scaleFactor; long endTime = beginTime + area.width*scaleFactor; - Entry first = signal.getEvents().floorEntry(beginTime); - Entry last = signal.getEvents().floorEntry(endTime); + Entry first = signal.getEvents().floorEntry(beginTime); + Entry last = signal.getEvents().floorEntry(endTime); if (first == null) { if (last == null) return; @@ -106,16 +109,16 @@ public class SignalPainter extends TrackPainter { } else if (last == null) { last = signal.getEvents().lastEntry(); } - proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]); + proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE)); proj.setLineStyle(SWT.LINE_SOLID); proj.setLineWidth(1); - NavigableMap entries = signal.getEvents().subMap(first.getKey(), false, last.getKey(), true); + NavigableMap entries = signal.getEvents().subMap(first.getKey(), false, last.getKey(), true); SignalChange left = new SignalChange(first); SignalChange right = new SignalChange(entries.size() > 0 ? entries.firstEntry() : first); maxPosX = area.x + area.width; - yOffsetT = this.waveCanvas.getTrackHeight() / 5 + area.y; - yOffsetM = this.waveCanvas.getTrackHeight() / 2 + area.y; - yOffsetB = 4 * this.waveCanvas.getTrackHeight() / 5 + area.y; + yOffsetT = this.waveCanvas.styleProvider.getTrackHeight() / 5 + area.y; + yOffsetM = this.waveCanvas.styleProvider.getTrackHeight() / 2 + area.y; + yOffsetB = 4 * this.waveCanvas.styleProvider.getTrackHeight() / 5 + area.y; int xSigChangeBeginVal = Math.max(area.x, (int) (left.time / this.waveCanvas.getScaleFactor())); int xSigChangeBeginPos = area.x; int xSigChangeEndPos = Math.max(area.x, getXPosEnd(right.time)); @@ -138,7 +141,7 @@ public class SignalPainter extends TrackPainter { SignalStencil stencil = getStencil(proj.getGC(), left, entries); - do { + if(stencil!=null) do { stencil.draw(proj, area, left.value, right.value, xSigChangeBeginPos, xSigChangeEndPos, multiple); if (right.time >= endTime) break; @@ -150,7 +153,7 @@ public class SignalPainter extends TrackPainter { if (xSigChangeEndPos == xSigChangeBeginPos) { multiple = true; long eTime = (xSigChangeBeginPos + 1) * this.waveCanvas.getScaleFactor(); - Entry entry = entries.floorEntry(eTime); + Entry entry = entries.floorEntry(eTime); if(entry!=null && entry.getKey()> right.time) right.set(entry, endTime); xSigChangeEndPos = getXPosEnd(eTime); @@ -158,8 +161,8 @@ public class SignalPainter extends TrackPainter { } while (left.time < endTime); } - private SignalStencil getStencil(GC gc, SignalChange left, NavigableMap entries) { - Object val = left.value; + private SignalStencil getStencil(GC gc, SignalChange left, NavigableMap entries) { + IEvent val = left.value; if(val instanceof BitVector) { BitVector bv = (BitVector) val; if(bv.getWidth()==1) @@ -170,7 +173,7 @@ public class SignalPainter extends TrackPainter { return new MultiBitStencilAnalog(entries, left.value, trackEntry.waveDisplay==TrackEntry.WaveDisplay.CONTINOUS, trackEntry.valueDisplay==TrackEntry.ValueDisplay.SIGNED); - } else if (val instanceof Double) + } else if (val instanceof DoubleVal) return new RealStencil(entries, left.value, trackEntry.waveDisplay==TrackEntry.WaveDisplay.CONTINOUS); else return null; @@ -178,7 +181,7 @@ public class SignalPainter extends TrackPainter { private interface SignalStencil { - public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple); + public void draw(Projection proj, Rectangle area, IEvent left, IEvent right, int xBegin, int xEnd, boolean multiple); } private class MultiBitStencil implements SignalStencil { @@ -192,13 +195,13 @@ public class SignalPainter extends TrackPainter { tmpAwtFont = new java.awt.Font(fd.getName(), fd.getStyle(), height); } - public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) { - Color colorBorder = waveCanvas.colors[WaveformColors.SIGNAL0.ordinal()]; + public void draw(Projection proj, Rectangle area, IEvent left, IEvent right, int xBegin, int xEnd, boolean multiple) { + Color colorBorder = waveCanvas.styleProvider.getColor(WaveformColors.SIGNAL0); BitVector last = (BitVector) left; - if (last.getValue().toString().contains("X")) { - colorBorder = waveCanvas.colors[WaveformColors.SIGNALX.ordinal()]; - } else if (last.getValue().toString().contains("Z")) { - colorBorder = waveCanvas.colors[WaveformColors.SIGNALZ.ordinal()]; + if (Arrays.toString(last.getValue()).contains("X")) { + colorBorder = waveCanvas.styleProvider.getColor(WaveformColors.SIGNALX); + } else if (Arrays.toString(last.getValue()).contains("Z")) { + colorBorder = waveCanvas.styleProvider.getColor(WaveformColors.SIGNALZ); } int width = xEnd - xBegin; if (width > 1) { @@ -212,8 +215,7 @@ public class SignalPainter extends TrackPainter { }; proj.setForeground(colorBorder); proj.drawPolygon(points); - proj.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_TEXT.ordinal()]); - //TODO: this code should be provided from a central location + proj.setForeground(waveCanvas.styleProvider.getColor(WaveformColors.SIGNAL_TEXT)); String label = null; switch(trackEntry.valueDisplay) { case SIGNED: @@ -247,35 +249,39 @@ public class SignalPainter extends TrackPainter { private class MultiBitStencilAnalog implements SignalStencil { final boolean continous; + final boolean signed; + private long maxVal; private long minVal; - private long range; double yRange = (yOffsetB-yOffsetT); - public MultiBitStencilAnalog(NavigableMap entries, Object left, boolean continous, boolean signed) { + public MultiBitStencilAnalog(NavigableMap entries, Object left, boolean continous, boolean signed) { this.continous=continous; - Collection values = ((NavigableMap) entries).values(); - minVal=((BitVector) left).toUnsignedValue(); - range=2; + this.signed=signed; + Collection values = entries.values(); + minVal=signed?((BitVector)left).toSignedValue():((BitVector)left).toUnsignedValue(); if(!values.isEmpty()) { - long maxVal=minVal; - for (Object e : entries.values()) { - long v = ((BitVector)e).toUnsignedValue(); - maxVal=Math.max(maxVal, v); - minVal=Math.min(minVal, v); - } + maxVal=minVal; + for (IEvent[] tp : entries.values()) + for(IEvent e: tp) { + long v = signed?((BitVector)e).toSignedValue():((BitVector)e).toUnsignedValue(); + maxVal=Math.max(maxVal, v); + minVal=Math.min(minVal, v); + } if(maxVal==minVal) { maxVal--; minVal++; } - range = maxVal-minVal; - } else + } else { minVal--; + maxVal=minVal+2; + } } - public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) { - long leftVal = ((BitVector) left).toUnsignedValue(); - long rightVal= ((BitVector) right).toUnsignedValue(); - proj.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_REAL.ordinal()]); + public void draw(Projection proj, Rectangle area, IEvent left, IEvent right, int xBegin, int xEnd, boolean multiple) { + long leftVal = signed?((BitVector)left).toSignedValue():((BitVector)left).toUnsignedValue(); + long rightVal= signed?((BitVector)right).toSignedValue():((BitVector)right).toUnsignedValue(); + proj.setForeground(waveCanvas.styleProvider.getColor(WaveformColors.SIGNAL_REAL)); + long range = maxVal-minVal; int yOffsetLeft = (int) ((leftVal-minVal) * yRange / range); int yOffsetRight = (int) ((rightVal-minVal) * yRange / range); if(continous) { @@ -298,26 +304,26 @@ public class SignalPainter extends TrackPainter { } private class SingleBitStencil implements SignalStencil { - public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) { + public void draw(Projection proj, Rectangle area, IEvent left, IEvent right, int xBegin, int xEnd, boolean multiple) { if (multiple) { - proj.setForeground(waveCanvas.colors[WaveformColors.SIGNALU.ordinal()]); + proj.setForeground(waveCanvas.styleProvider.getColor(WaveformColors.SIGNALU)); proj.drawLine(xBegin, yOffsetT, xBegin, yOffsetB); if(xEnd>xBegin) proj.drawLine(xEnd, yOffsetT, xEnd, yOffsetB); } else { - Color color = waveCanvas.colors[WaveformColors.SIGNALX.ordinal()]; + Color color = waveCanvas.styleProvider.getColor(WaveformColors.SIGNALX); int yOffset = yOffsetM; switch (((BitVector) left).getValue()[0]) { case '1': - color = waveCanvas.colors[WaveformColors.SIGNAL1.ordinal()]; + color = waveCanvas.styleProvider.getColor(WaveformColors.SIGNAL1); yOffset = yOffsetT; break; case '0': - color = waveCanvas.colors[WaveformColors.SIGNAL0.ordinal()]; + color = waveCanvas.styleProvider.getColor(WaveformColors.SIGNAL0); yOffset = yOffsetB; break; case 'Z': - color = waveCanvas.colors[WaveformColors.SIGNALZ.ordinal()]; + color = waveCanvas.styleProvider.getColor(WaveformColors.SIGNALZ); break; default: } @@ -345,30 +351,32 @@ public class SignalPainter extends TrackPainter { private class RealStencil implements SignalStencil { - double minVal, range; + double minVal; + double range; final double scaleFactor = 1.05; boolean continous=true; - public RealStencil(NavigableMap entries, Object left, boolean continous) { + public RealStencil(NavigableMap entries, Object left, boolean continous) { this.continous=continous; - Collection values = ((NavigableMap) entries).values(); + Collection values = entries.values(); minVal=(Double) left; range=2.0; if(!values.isEmpty()) { double maxVal=minVal; - for (Object e : entries.values()) { - double v = ((Double)e); - if(Double.isNaN(maxVal)) - maxVal=v; - else if(!Double.isNaN(v)) - maxVal=Math.max(maxVal, v); - if(Double.isNaN(minVal)) - minVal=v; - else if(!Double.isNaN(v)) - minVal=Math.min(minVal, v); - } + for (IEvent[] val : entries.values()) + for(IEvent e:val) { + double v = ((DoubleVal)e).value; + if(Double.isNaN(maxVal)) + maxVal=v; + else if(!Double.isNaN(v)) + maxVal=Math.max(maxVal, v); + if(Double.isNaN(minVal)) + minVal=v; + else if(!Double.isNaN(v)) + minVal=Math.min(minVal, v); + } if(Double.isNaN(maxVal)){ maxVal=minVal=0.0; } @@ -378,11 +386,11 @@ public class SignalPainter extends TrackPainter { } } - public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) { - double leftVal = (Double) left; - double rightVal= (Double) right; + public void draw(Projection proj, Rectangle area, IEvent left, IEvent right, int xBegin, int xEnd, boolean multiple) { + double leftVal = ((DoubleVal) left).value; + double rightVal= ((DoubleVal) right).value; if(Double.isNaN(leftVal)) { - Color color = waveCanvas.colors[WaveformColors.SIGNAL_NAN.ordinal()]; + Color color = waveCanvas.styleProvider.getColor(WaveformColors.SIGNAL_NAN); int width = xEnd - xBegin; if (width > 1) { int[] points = { @@ -400,7 +408,7 @@ public class SignalPainter extends TrackPainter { proj.drawLine(xEnd, yOffsetT, xEnd, yOffsetB); } } else { - proj.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_REAL.ordinal()]); + proj.setForeground(waveCanvas.styleProvider.getColor(WaveformColors.SIGNAL_REAL)); int yOffsetLeft = (int) ((leftVal-minVal) * (yOffsetB-yOffsetT) / range); int yOffsetRight = Double.isNaN(rightVal)?yOffsetLeft:(int) ((rightVal-minVal) * (yOffsetB-yOffsetT) / range); if(continous) { diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java index a746fde..2b06b4b 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java @@ -11,19 +11,20 @@ package com.minres.scviewer.database.ui.swt.internal; import java.util.Collection; -import java.util.List; import java.util.Map.Entry; import java.util.NavigableMap; import java.util.TreeSet; import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.EventKind; +import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxEvent; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.WaveformColors; @@ -33,51 +34,36 @@ public class StreamPainter extends TrackPainter{ * */ private final WaveformCanvas waveCanvas; - private ITxStream stream; - private int txBase, txHeight; - private boolean even; + private IWaveform stream; + private int txBase; + private int txHeight; private TreeSet seenTx; public StreamPainter(WaveformCanvas waveCanvas, boolean even, TrackEntry trackEntry) { super(trackEntry, even); this.waveCanvas = waveCanvas; - this.stream=trackEntry.getStream(); - this.seenTx=new TreeSet(); - } - - /* - * convert java.awt.Color to org.eclipse.swt.graphics.Color - */ - static org.eclipse.swt.graphics.Color toSwtColor( GC gc, java.awt.Color awtColor ){ - return new org.eclipse.swt.graphics.Color( gc.getDevice(), awtColor.getRed(), awtColor.getGreen(), awtColor.getBlue() ); - } - - static org.eclipse.swt.graphics.Color[] toSwtColors( GC gc, java.awt.Color[] awtColors ){ - org.eclipse.swt.graphics.Color[] swtColors = new org.eclipse.swt.graphics.Color[awtColors.length]; - for( int i=0; i(); } @SuppressWarnings("unchecked") public void paintArea(Projection proj, Rectangle area) { if(stream.getEvents().size()==0) return; - int trackHeight=trackEntry.height/stream.getMaxConcurrency(); + int trackHeight=trackEntry.height/stream.getWidth(); txBase=trackHeight/5; txHeight=trackHeight*3/5; if(trackEntry.selected) { - proj.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]); + proj.setBackground(this.waveCanvas.styleProvider.getColor(WaveformColors.TRACK_BG_HIGHLITE)); } else - proj.setBackground(this.waveCanvas.colors[even?WaveformColors.TRACK_BG_EVEN.ordinal():WaveformColors.TRACK_BG_ODD.ordinal()]); + proj.setBackground(this.waveCanvas.styleProvider.getColor(even?WaveformColors.TRACK_BG_EVEN:WaveformColors.TRACK_BG_ODD)); proj.setFillRule(SWT.FILL_EVEN_ODD); proj.fillRectangle(area); - + long scaleFactor = this.waveCanvas.getScaleFactor(); long beginPos = area.x; long beginTime = beginPos*scaleFactor; - //long endPos = beginPos + area.width; - long endTime = beginTime + area.width*scaleFactor; + long endTime = beginTime + area.width*scaleFactor; Entry firstTx=stream.getEvents().floorEntry(beginTime); Entry lastTx=stream.getEvents().ceilingEntry(endTime); @@ -86,24 +72,25 @@ public class StreamPainter extends TrackPainter{ proj.setFillRule(SWT.FILL_EVEN_ODD); proj.setLineStyle(SWT.LINE_SOLID); proj.setLineWidth(1); - proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]); - - for( int y1=area.y+trackHeight/2; y1)firstTx.getValue()) drawTx(proj, area, txEvent.getTransaction(), false); }else{ seenTx.clear(); - NavigableMap entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true); + NavigableMap entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true); boolean highlighed=false; - proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]); - - for(Entry entry: entries.entrySet()) - for(ITxEvent txEvent:(Collection)entry.getValue()){ - if(txEvent.getType()==ITxEvent.Type.BEGIN) + proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE)); + + for(Entry entry: entries.entrySet()) + for(IEvent evt:entry.getValue()){ + ITxEvent txEvent = (ITxEvent) evt; + if(txEvent.getKind()==EventKind.BEGIN) seenTx.add(txEvent.getTransaction()); - if(txEvent.getType()==ITxEvent.Type.END){ + if(txEvent.getKind()==EventKind.END){ ITx tx = txEvent.getTransaction(); highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.equals(tx); drawTx(proj, area, tx, false); @@ -114,20 +101,19 @@ public class StreamPainter extends TrackPainter{ drawTx(proj, area, tx, false); } if(highlighed){ - proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE_HIGHLITE.ordinal()]); - drawTx(proj, area, waveCanvas.currentSelection, true); + proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE_HIGHLITE)); + drawTx(proj, area, waveCanvas.currentSelection, true); } } } - + protected void drawTx(Projection proj, Rectangle area, ITx tx, boolean highlighted ) { // compute colors - java.awt.Color[] fallbackColors = trackEntry.getColors(); - java.awt.Color[] transColor = TrackEntry.computeColor( tx.getGenerator().getName(), fallbackColors[0], fallbackColors[1] ); - - proj.setBackground( toSwtColor( proj.getGC(), transColor[highlighted?1:0] ) ); - - int offset = tx.getConcurrencyIndex()*this.waveCanvas.getTrackHeight(); + Color[] transColor = waveCanvas.styleProvider.computeColor( tx.getGenerator().getName()); + + proj.setBackground(transColor[highlighted?1:0]); + + int offset = tx.getConcurrencyIndex()*this.waveCanvas.styleProvider.getTrackHeight(); Rectangle bb = new Rectangle( (int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+txBase, (int)((tx.getEndTime()-tx.getBeginTime())/this.waveCanvas.getScaleFactor()), txHeight); @@ -140,11 +126,11 @@ public class StreamPainter extends TrackPainter{ bb.width = bb.width-(area.x-bb.x)+5; bb.x=area.x-5; } - int bb_x2 = bb.x+bb.width; - int area_x2 = area.x+area.width; - if(bb_x2>area_x2){ - bb_x2=area_x2+5; - bb.width= bb_x2-bb.x; + int bbX2 = bb.x+bb.width; + int areaX2 = area.x+area.width; + if(bbX2>areaX2){ + bbX2=areaX2+5; + bb.width= bbX2-bb.x; } int arc = bb.width<10?1:5; proj.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, arc, arc); @@ -153,8 +139,8 @@ public class StreamPainter extends TrackPainter{ } public ITx getClicked(Point point) { - int lane=point.y/waveCanvas.getTrackHeight(); - Entry> firstTx=stream.getEvents().floorEntry(point.x*waveCanvas.getScaleFactor()); + int lane=point.y/waveCanvas.styleProvider.getTrackHeight(); + Entry firstTx=stream.getEvents().floorEntry(point.x*waveCanvas.getScaleFactor()); if(firstTx!=null){ do { ITx tx = getTxFromEntry(lane, point.x, firstTx); @@ -165,31 +151,35 @@ public class StreamPainter extends TrackPainter{ return null; } - public ITxStream getStream() { + public IWaveform getStream() { return stream; } - public void setStream(ITxStream stream) { + public void setStream(IWaveform stream) { this.stream = stream; } - protected ITx getTxFromEntry(int lane, int offset, Entry> firstTx) { - long timePoint=offset*waveCanvas.getScaleFactor(); - for(ITxEvent evt:firstTx.getValue()){ - ITx tx=evt.getTransaction(); - if(evt.getType()==ITxEvent.Type.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePoint && tx.getEndTime()>=timePoint){ - return evt.getTransaction(); + protected ITx getTxFromEntry(int lane, int offset, Entry firstTx) { + long timePoint=offset*waveCanvas.getScaleFactor(); + for(IEvent evt:firstTx.getValue()){ + if(evt instanceof ITxEvent) { + ITx tx=((ITxEvent)evt).getTransaction(); + if(evt.getKind()==EventKind.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePoint && tx.getEndTime()>=timePoint){ + return ((ITxEvent)evt).getTransaction(); + } } } // now with some fuzziness - timePoint=(offset-5)*waveCanvas.getScaleFactor(); - long timePointHigh=(offset+5)*waveCanvas.getScaleFactor(); - for(ITxEvent evt:firstTx.getValue()){ - ITx tx=evt.getTransaction(); - if(evt.getType()==ITxEvent.Type.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePointHigh && tx.getEndTime()>=timePoint){ - return evt.getTransaction(); - } - } + timePoint=(offset-5)*waveCanvas.getScaleFactor(); + long timePointHigh=(offset+5)*waveCanvas.getScaleFactor(); + for(IEvent evt:firstTx.getValue()){ + if(evt instanceof ITxEvent) { + ITx tx=((ITxEvent)evt).getTransaction(); + if(evt.getKind()==EventKind.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePointHigh && tx.getEndTime()>=timePoint){ + return ((ITxEvent)evt).getTransaction(); + } + } + } return null; } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ToolTipHandler.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ToolTipHandler.java index b86ad5b..9c62d72 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ToolTipHandler.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ToolTipHandler.java @@ -26,7 +26,7 @@ class ToolTipHandler { private Widget tipWidget; // widget this tooltip is hovering over private Point tipPosition; // the position being hovered over - private static final int hoverYOffset = 1; + private static final int HOVER_YOFFSET = 1; /** * Creates a new tooltip handler @@ -45,56 +45,57 @@ class ToolTipHandler { */ public void activateHoverHelp(final Control control) { Listener listener = new Listener () { - Shell tip = null; + Shell shell = null; @Override public void handleEvent (Event event) { switch (event.type) { - case SWT.KeyDown:{ - if (tip != null && tip.isVisible() && event.keyCode == SWT.F2) { - tip.setFocus(); - break; - } - } + case SWT.KeyDown: + if (shell != null && shell.isVisible() && event.keyCode == SWT.F2) + shell.setFocus(); + break; case SWT.Dispose: case SWT.MouseMove: - case SWT.MouseDown: { - if (tip != null){ - tip.dispose (); - tip = null; + case SWT.MouseDown: + if (shell != null){ + shell.dispose (); + shell = null; tipWidget=null; } break; + case SWT.MouseHover: + createHoverWindow(control, event); + break; + default: + /* do nothing */ } - case SWT.MouseHover: { - Object o = control.getData(Constants.CONTENT_PROVIDER_TAG); - if(o != null && o instanceof ToolTipContentProvider) { - ToolTipContentProvider provider = ((ToolTipContentProvider)o); - Point pt = new Point (event.x, event.y); - tipPosition = control.toDisplay(pt); - if (tip != null && !tip.isDisposed ()) tip.dispose (); - tip = new Shell (parentShell, SWT.NO_FOCUS | SWT.TOOL); - tip.setBackground (display.getSystemColor (SWT.COLOR_INFO_BACKGROUND)); - GridLayout layout = new GridLayout(1, true); - layout.verticalSpacing=0; - layout.horizontalSpacing=0; - layout.marginWidth = 0; - layout.marginHeight = 0; - tip.setLayout(layout); - boolean visible = provider.createContent(tip, pt); - tip.pack(); - tip.setSize(tip.computeSize(SWT.DEFAULT, SWT.DEFAULT)); - setHoverLocation(tip, tipPosition); - tip.setVisible (visible); - if(visible) - tipWidget=event.widget; - } - } + } + private void createHoverWindow(final Control control, Event event) { + Object o = control.getData(Constants.CONTENT_PROVIDER_TAG); + if(o instanceof ToolTipContentProvider) { + ToolTipContentProvider provider = ((ToolTipContentProvider)o); + Point pt = new Point (event.x, event.y); + tipPosition = control.toDisplay(pt); + if (shell != null && !shell.isDisposed ()) shell.dispose (); + shell = new Shell (parentShell, SWT.NO_FOCUS | SWT.TOOL); + shell.setBackground (display.getSystemColor (SWT.COLOR_INFO_BACKGROUND)); + GridLayout layout = new GridLayout(1, true); + layout.verticalSpacing=0; + layout.horizontalSpacing=0; + layout.marginWidth = 0; + layout.marginHeight = 0; + shell.setLayout(layout); + boolean visible = provider.createContent(shell, pt); + shell.pack(); + shell.setSize(shell.computeSize(SWT.DEFAULT, SWT.DEFAULT)); + setHoverLocation(shell, tipPosition); + shell.setVisible (visible); + if(visible) + tipWidget=event.widget; } } }; control.addListener (SWT.Dispose, listener); control.addListener (SWT.KeyDown, listener); - //control.addListener (SWT.MouseMove, listener); control.addListener (SWT.MouseHover, listener); control.addListener (SWT.MouseDown, listener); @@ -119,11 +120,6 @@ class ToolTipHandler { helpShell.open(); } }); - // control.addKeyListener(KeyListener.keyPressedAdapter( e-> { - // if (e.keyCode == SWT.F2 && shell.isVisible()) { - // shell.setFocus(); - // } - // })); } /** @@ -136,7 +132,7 @@ class ToolTipHandler { Rectangle displayBounds = shell.getDisplay().getBounds(); Rectangle shellBounds = shell.getBounds(); shellBounds.x = Math.max(Math.min(position.x, displayBounds.width - shellBounds.width), 0); - shellBounds.y = Math.max(Math.min(position.y + hoverYOffset, displayBounds.height - shellBounds.height), 0); + shellBounds.y = Math.max(Math.min(position.y + HOVER_YOFFSET, displayBounds.height - shellBounds.height), 0); shell.setBounds(shellBounds); } } \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/TrackAreaPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/TrackAreaPainter.java index 0ffaf35..5f2ecb8 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/TrackAreaPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/TrackAreaPainter.java @@ -25,7 +25,7 @@ public class TrackAreaPainter implements IPainter { */ private final WaveformCanvas waveCanvas; - TreeMap trackVerticalOffset; + final TreeMap trackVerticalOffset; /** * @param txDisplay */ @@ -36,7 +36,7 @@ public class TrackAreaPainter implements IPainter { public void paintArea(Projection proj, Rectangle a) { Rectangle area = proj.unProject(new Rectangle(a.x, a.y+waveCanvas.rulerHeight, a.width, a.height-waveCanvas.rulerHeight)); - proj.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_EVEN.ordinal()]); + proj.setBackground(this.waveCanvas.styleProvider.getColor(WaveformColors.TRACK_BG_EVEN)); proj.setFillRule(SWT.FILL_EVEN_ODD); proj.fillRectangle(area); if(trackVerticalOffset.size()>0){ @@ -44,7 +44,7 @@ public class TrackAreaPainter implements IPainter { if(firstKey==null) firstKey=trackVerticalOffset.firstKey(); Integer lastKey = trackVerticalOffset.floorKey(area.y+area.height); Rectangle subArea = new Rectangle(area.x, 0, area.width, 0); - if(lastKey==firstKey){ + if(lastKey.equals(firstKey)){ subArea.y=firstKey; IWaveformPainter p = trackVerticalOffset.get(firstKey); subArea.height=p.getHeight(); @@ -59,10 +59,6 @@ public class TrackAreaPainter implements IPainter { } } - public TreeMap getTrackVerticalOffset() { - return trackVerticalOffset; - } - public void addTrackPainter(IWaveformPainter trackPainter){ trackVerticalOffset.put(trackPainter.getVerticalOffset()+waveCanvas.rulerHeight, trackPainter); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java index 2d0f9cf..f08178b 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java @@ -20,39 +20,32 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.ScrollBar; -import org.eclipse.wb.swt.SWTResourceManager; import com.google.common.collect.Lists; -import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.RelationType; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.ui.IWaveformStyleProvider; import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.TrackEntry; -import com.minres.scviewer.database.ui.WaveformColors; import com.minres.scviewer.database.ui.swt.Constants; public class WaveformCanvas extends Canvas { - Color[] colors = new Color[WaveformColors.values().length]; - private boolean doubleBuffering = true; - private int trackHeight = 50; - + IWaveformStyleProvider styleProvider; + private long scaleFactor = 1000000L; // 1ns String unit="ns"; @@ -88,26 +81,23 @@ public class WaveformCanvas extends Canvas { * @param style * the style of this control. */ - public WaveformCanvas(final Composite parent, int style) { + public WaveformCanvas(final Composite parent, int style, IWaveformStyleProvider styleProvider) { super(parent, style | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.V_SCROLL | SWT.H_SCROLL); + this.styleProvider=styleProvider; addControlListener(new ControlAdapter() { /* resize listener. */ - public void controlResized(ControlEvent event) { + @Override + public void controlResized(ControlEvent event) { syncScrollBars(); } }); - addPaintListener(new PaintListener() { /* paint listener. */ - public void paintControl(final PaintEvent event) { - paint(event.gc); - } - }); - painterList = new LinkedList(); + addPaintListener((final PaintEvent event) -> paint(event.gc)); + painterList = new LinkedList<>(); origin = new Point(0, 0); selectionListeners = new LinkedList<>(); cursorPainters= new ArrayList<>(); wave2painterMap=new HashMap<>(); initScrollBars(); - initColors(null); // order is important: it is bottom to top trackAreaPainter=new TrackAreaPainter(this); painterList.add(trackAreaPainter); @@ -122,31 +112,6 @@ public class WaveformCanvas extends Canvas { painterList.add(marker); cursorPainters.add(marker); wave2painterMap=new HashMap<>(); - // fall back initialization - colors[WaveformColors.LINE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); - colors[WaveformColors.LINE_HIGHLITE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_CYAN); - colors[WaveformColors.TRACK_BG_EVEN.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_BLACK); - colors[WaveformColors.TRACK_BG_ODD.ordinal()] = SWTResourceManager.getColor(40, 40, 40); - colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()] = SWTResourceManager.getColor(40, 40, 80); - colors[WaveformColors.TX_BG.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN); - colors[WaveformColors.TX_BG_HIGHLITE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN); - colors[WaveformColors.TX_BORDER.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); - colors[WaveformColors.SIGNAL0.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN); - colors[WaveformColors.SIGNAL1.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN); - colors[WaveformColors.SIGNALZ.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_YELLOW); - colors[WaveformColors.SIGNALX.ordinal()] = SWTResourceManager.getColor(255, 51, 51); - colors[WaveformColors.SIGNALU.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_YELLOW); - colors[WaveformColors.SIGNAL_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE); - colors[WaveformColors.SIGNAL_REAL.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_YELLOW); - colors[WaveformColors.SIGNAL_NAN.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); - colors[WaveformColors.CURSOR.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); - colors[WaveformColors.CURSOR_DRAG.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GRAY); - colors[WaveformColors.CURSOR_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE); - colors[WaveformColors.MARKER.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY); - colors[WaveformColors.MARKER_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE); - colors[WaveformColors.REL_ARROW.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_MAGENTA); - colors[WaveformColors.REL_ARROW_HIGHLITE.ordinal()] = SWTResourceManager.getColor(255, 128, 255); - } public void addCursoPainter(CursorPainter cursorPainter){ @@ -154,17 +119,6 @@ public class WaveformCanvas extends Canvas { cursorPainters.add(cursorPainter); } - public void initColors(HashMap colourMap) { - Display d = getDisplay(); - if (colourMap != null) { - for (WaveformColors c : WaveformColors.values()) { - if (colourMap.containsKey(c)) - colors[c.ordinal()] = new Color(d, colourMap.get(c)); - } - redraw(); - } - } - public void setHighliteRelation(RelationType relationType){ if(arrowPainter!=null){ boolean redraw = arrowPainter.getHighlightType()!=relationType; @@ -206,21 +160,12 @@ public class WaveformCanvas extends Canvas { syncScrollBars(); } - public int getTrackHeight() { - return trackHeight; - } - - public void setTrackHeight(int trackHeight) { - this.trackHeight = trackHeight; - syncScrollBars(); - } - public int getZoomLevel() { return level; } public int getMaxZoomLevel(){ - return Constants.unitMultiplier.length*Constants.unitString.length-1; + return Constants.UNIT_MULTIPLIER.length*Constants.UNIT_STRING.length-1; } public void setZoomLevel(int level) { @@ -232,8 +177,8 @@ public class WaveformCanvas extends Canvas { //FIXME: keep center if zoom-out and cursor is not in view long oldScaleFactor=scaleFactor; if(level<0) level = 0; - if(level transform, image size, client area. */ public void syncScrollBars() { - if (painterList.size() == 0) { + if (painterList.isEmpty()) { redraw(); return; } @@ -362,14 +300,14 @@ public class WaveformCanvas extends Canvas { long width = maxTime / scaleFactor; Rectangle clientArea=getClientArea(); ScrollBar horizontal = getHorizontalBar(); - horizontal.setIncrement((int) (getClientArea().width / 100)); + horizontal.setIncrement(getClientArea().width / 100); horizontal.setPageIncrement(getClientArea().width); int clientWidthw = clientArea.width; if (width > clientWidthw) { /* image is wider than client area */ horizontal.setMinimum(0); horizontal.setMaximum((int)width); horizontal.setEnabled(true); - if (((int) -origin.x) > horizontal.getMaximum() - clientWidthw) { + if (-origin.x > horizontal.getMaximum() - clientWidthw) { origin.x = -horizontal.getMaximum() + clientWidthw; } } else { /* image is narrower than client area */ @@ -379,18 +317,18 @@ public class WaveformCanvas extends Canvas { horizontal.setSelection(-origin.x); ScrollBar vertical = getVerticalBar(); - vertical.setIncrement((int) (getClientArea().height / 100)); - vertical.setPageIncrement((int) (getClientArea().height)); + vertical.setIncrement(getClientArea().height / 100); + vertical.setPageIncrement(getClientArea().height); int clientHeighth = clientArea.height; if (height > clientHeighth) { /* image is higher than client area */ vertical.setMinimum(0); vertical.setMaximum(height); vertical.setEnabled(true); - if (((int) -origin.y) > vertical.getMaximum() - clientHeighth) { + if ( -origin.y > vertical.getMaximum() - clientHeighth) { origin.y = -vertical.getMaximum() + clientHeighth; } } else { /* image is less higher than client area */ - vertical.setMaximum((int) (clientHeighth)); + vertical.setMaximum(clientHeighth); vertical.setEnabled(false); } vertical.setThumb(clientHeighth); @@ -405,10 +343,10 @@ public class WaveformCanvas extends Canvas { if(pt.x==0 || pt.y==0) return; Rectangle clientRect = getClientArea(); /* Canvas' painting area */ GC thisGc = gc; - Image d_backingImg = null; + Image dBackingImg = null; if(doubleBuffering) { - d_backingImg = new Image(getDisplay(), pt.x, pt.y); - thisGc = new GC(d_backingImg); + dBackingImg = new Image(getDisplay(), pt.x, pt.y); + thisGc = new GC(dBackingImg); thisGc.setBackground(gc.getBackground()); thisGc.setForeground(gc.getForeground()); thisGc.setFont(gc.getFont()); @@ -416,7 +354,7 @@ public class WaveformCanvas extends Canvas { } Projection p = new Projection(thisGc); p.setTranslation(origin); - if (painterList.size() > 0 ) { + if (!painterList.isEmpty() ) { for (IPainter painter : painterList) painter.paintArea(p, clientRect); } else { @@ -424,8 +362,8 @@ public class WaveformCanvas extends Canvas { initScrollBars(); } if(doubleBuffering) { - gc.drawImage(d_backingImg, 0, 0); - d_backingImg.dispose(); + gc.drawImage(dBackingImg, 0, 0); + if(dBackingImg!=null) dBackingImg.dispose(); thisGc.dispose(); } } @@ -436,7 +374,7 @@ public class WaveformCanvas extends Canvas { if (p instanceof TrackAreaPainter) { int y = point.y - origin.y; int x = point.x - origin.x; - Entry entry = trackAreaPainter.getTrackVerticalOffset().floorEntry(y); + Entry entry = trackAreaPainter.trackVerticalOffset.floorEntry(y); if (entry != null) { if (entry.getValue() instanceof StreamPainter) { ITx tx = ((StreamPainter) entry.getValue()).getClicked(new Point(x, y - entry.getKey())); @@ -457,9 +395,9 @@ public class WaveformCanvas extends Canvas { public List getEntriesAtPosition(IWaveform iWaveform, int i) { LinkedList result=new LinkedList<>(); int x = i - origin.x; - for(IPainter p: wave2painterMap.values()){ + for(IWaveformPainter p: wave2painterMap.values()){ if (p instanceof StreamPainter && ((StreamPainter)p).getStream()==iWaveform) { - result.add(((StreamPainter) p).getClicked(new Point(x, trackHeight/2))); + result.add(((StreamPainter) p).getClicked(new Point(x, styleProvider.getTrackHeight()/2))); } } return result; @@ -486,10 +424,10 @@ public class WaveformCanvas extends Canvas { } for (IWaveformPainter painter : wave2painterMap.values()) { if (painter instanceof StreamPainter && ((StreamPainter) painter).getStream() == tx.getStream()) { - int top = painter.getVerticalOffset() + trackHeight * tx.getConcurrencyIndex(); - int bottom = top + trackHeight; + int top = painter.getVerticalOffset() + styleProvider.getTrackHeight() * tx.getConcurrencyIndex(); + int bottom = top + styleProvider.getTrackHeight(); if (top < -origin.y) { - setOrigin(origin.x, -(top-trackHeight)); + setOrigin(origin.x, -(top-styleProvider.getTrackHeight())); } else if (bottom > (size.y - origin.y)) { setOrigin(origin.x, size.y - bottom); } @@ -502,15 +440,14 @@ public class WaveformCanvas extends Canvas { TrackEntry te = painter.getTrackEntry(); if(te.waveform == waveform) { Point size = getSize(); - //size.x -= getVerticalBar().getSize().x + 2; size.y -=+rulerHeight; ScrollBar sb = getHorizontalBar(); - if((sb.getStyle()&SWT.SCROLLBAR_OVERLAY)!=0 && sb.isVisible()) // TODO: check on other platform than MacOSX + if((sb.getStyle()&SWT.SCROLLBAR_OVERLAY)!=0 && sb.isVisible()) size.y-= getHorizontalBar().getSize().y; int top = te.vOffset; - int bottom = top + trackHeight; + int bottom = top + styleProvider.getTrackHeight(); if (top < -origin.y) { - setOrigin(origin.x, -(top-trackHeight)); + setOrigin(origin.x, -(top-styleProvider.getTrackHeight())); } else if (bottom > (size.y - origin.y)) { setOrigin(origin.x, size.y - bottom); } @@ -569,4 +506,9 @@ public class WaveformCanvas extends Canvas { long getMinVisibleTime() { return origin.x * scaleFactor; } + + public void setStyleProvider(IWaveformStyleProvider styleProvider) { + this.styleProvider=styleProvider; + redraw(); + } } 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 49d6da6..205ad87 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 @@ -10,15 +10,14 @@ *******************************************************************************/ package com.minres.scviewer.database.ui.swt.internal; -import java.awt.Color; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; @@ -56,10 +55,8 @@ import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.TextLayout; import org.eclipse.swt.layout.FillLayout; @@ -78,23 +75,25 @@ import org.eclipse.wb.swt.SWTResourceManager; import com.google.common.collect.Lists; import com.minres.scviewer.database.BitVector; -import com.minres.scviewer.database.ISignal; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.ITxRelation; -import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.DoubleVal; +import com.minres.scviewer.database.EventKind; +import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.RelationType; +import com.minres.scviewer.database.WaveformType; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxEvent; +import com.minres.scviewer.database.tx.ITxRelation; import com.minres.scviewer.database.ui.GotoDirection; import com.minres.scviewer.database.ui.ICursor; +import com.minres.scviewer.database.ui.IWaveformStyleProvider; import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.TrackEntry; -import com.minres.scviewer.database.ui.WaveformColors; import com.minres.scviewer.database.ui.swt.Constants; public class WaveformView implements IWaveformView { - private ListenerList selectionChangedListeners = new ListenerList(); + private ListenerList selectionChangedListeners = new ListenerList<>(); private PropertyChangeSupport pcs; @@ -110,9 +109,9 @@ public class WaveformView implements IWaveformView { private Control namePaneHeader; - final private Canvas nameList; + private final Canvas nameList; - final private Canvas valueList; + private final Canvas valueList; final WaveformCanvas waveformCanvas; @@ -126,11 +125,11 @@ public class WaveformView implements IWaveformView { int selectedMarker = 0; - private int trackVerticalHeight; + private int tracksVerticalHeight; private TreeMap trackVerticalOffset; - - private Font nameFont, nameFontB; + + private IWaveformStyleProvider styleProvider; protected TrackEntry lastClickedEntry; @@ -171,7 +170,8 @@ public class WaveformView implements IWaveformView { }; class WaveformMouseListener implements PaintListener, Listener { - Point start, end; + Point start; + Point end; List initialSelected; boolean down=false; @@ -182,9 +182,9 @@ public class WaveformView implements IWaveformView { gc.setAlpha(128); int minX = Math.min(start.x, end.x); int width = Math.max(start.x, end.x) - minX; - int y_top = waveformCanvas.getRulerHeight(); - int y_bottom = waveformCanvas.getSize().y; - gc.fillRectangle(minX, y_top, width,y_bottom); + int yTop = waveformCanvas.getRulerHeight(); + int yBottom = waveformCanvas.getSize().y; + gc.fillRectangle(minX, yTop, width,yBottom); } } @@ -201,7 +201,7 @@ public class WaveformView implements IWaveformView { if(targetTimeRange==0) return; long relation = currentTimeRange/targetTimeRange; long i = 1; - int level=0;//relation>0?0:0; + int level=0; do { if(relation<0 ) { if(-relation floorEntry=null, ceilEntry=null; + Entry floorEntry=null; + Entry ceilEntry=null; if(o instanceof TrackEntry){ TrackEntry entry = (TrackEntry) o; - if(entry.waveform instanceof ISignal){ - NavigableMap map = ((ISignal)entry.waveform).getEvents(); - floorEntry = map.floorEntry(time); - ceilEntry = map.ceilingEntry(time); - } else if (entry.waveform instanceof ITxStream){ - NavigableMap map = ((ITxStream)entry.waveform).getEvents(); - floorEntry = map.floorEntry(time); - ceilEntry = map.ceilingEntry(time); - } + NavigableMap map = entry.waveform.getEvents(); + floorEntry = map.floorEntry(time); + ceilEntry = map.ceilingEntry(time); } else if(o instanceof ITx){ - NavigableMap map = ((ITx)o).getStream().getEvents(); + NavigableMap map = ((ITx)o).getStream().getEvents(); floorEntry = map.floorEntry(time); ceilEntry = map.ceilingEntry(time); } @@ -300,9 +295,6 @@ public class WaveformView implements IWaveformView { case SWT.MouseUp: mouseUp(new MouseEvent(e)); break; - //case SWT.MouseDoubleClick: - //mouseDoubleClick(new MouseEvent(e)); - //break; case SWT.MouseMove: if(down) { end=new Point(e.x, e.y); @@ -315,17 +307,16 @@ public class WaveformView implements IWaveformView { } - }; + } protected WaveformMouseListener waveformMouseListener = new WaveformMouseListener(); - public WaveformView(Composite parent) { + public WaveformView(Composite parent, IWaveformStyleProvider styleProvider) { + this.styleProvider=styleProvider; + pcs=new PropertyChangeSupport(this); - trackVerticalOffset = new TreeMap(); - trackVerticalHeight=0; - - nameFont = parent.getDisplay().getSystemFont(); - nameFontB = SWTResourceManager.getBoldFont(nameFont); + trackVerticalOffset = new TreeMap<>(); + tracksVerticalHeight=0; streams = new ObservableList<>(); streams.addPropertyChangeListener("content", this); @@ -344,7 +335,7 @@ 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); + waveformCanvas = new WaveformCanvas(rightSash, SWT.NONE, styleProvider); // create the name pane createTextPane(namePane, "Name"); @@ -371,14 +362,11 @@ public class WaveformView implements IWaveformView { return new Point(bounds.width, bounds.height); } }; - nameList.addListener(SWT.Paint, new Listener() { - @Override - public void handleEvent(Event event) { - if(!trackVerticalOffset.isEmpty()) { - GC gc = event.gc; - Rectangle rect = ((Canvas) event.widget).getClientArea(); - paintNames(gc, rect); - } + nameList.addListener(SWT.Paint, (Event event) -> { + if(!trackVerticalOffset.isEmpty()) { + GC gc = event.gc; + Rectangle rect = ((Canvas) event.widget).getClientArea(); + paintNames(gc, rect); } }); nameList.addMouseListener(nameValueMouseListener); @@ -406,14 +394,11 @@ public class WaveformView implements IWaveformView { return new Point(bounds.width, bounds.height); } }; - valueList.addListener(SWT.Paint, new Listener() { - @Override - public void handleEvent(Event event) { - if(!trackVerticalOffset.isEmpty()) { - GC gc = event.gc; - Rectangle rect = ((Canvas) event.widget).getClientArea(); - paintValues(gc, rect); - } + valueList.addListener(SWT.Paint, (Event event) -> { + if(!trackVerticalOffset.isEmpty()) { + GC gc = event.gc; + Rectangle rect = ((Canvas) event.widget).getClientArea(); + paintValues(gc, rect); } }); valueList.addMouseListener(nameValueMouseListener); @@ -423,11 +408,11 @@ public class WaveformView implements IWaveformView { waveformCanvas.addPaintListener(waveformMouseListener); waveformCanvas.addListener(SWT.MouseDown,waveformMouseListener); waveformCanvas.addListener(SWT.MouseUp,waveformMouseListener); - //waveformCanvas.addListener(SWT.MouseDoubleClick,waveformMouseListener); waveformCanvas.addListener(SWT.MouseMove,waveformMouseListener); waveformCanvas.addListener(SWT.MouseWheel, waveformMouseListener); nameListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { + @Override public void widgetSelected(SelectionEvent e) { int y = ((ScrollBar) e.widget).getSelection(); Point v = valueListScrolled.getOrigin(); @@ -437,6 +422,7 @@ public class WaveformView implements IWaveformView { } }); valueListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { + @Override public void widgetSelected(SelectionEvent e) { int y = ((ScrollBar) e.widget).getSelection(); nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); @@ -444,6 +430,7 @@ public class WaveformView implements IWaveformView { } }); waveformCanvas.addSelectionListener(new SelectionAdapter() { + @Override public void widgetSelected(SelectionEvent e) { int y = waveformCanvas.getVerticalBar().getSelection(); nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); @@ -465,81 +452,73 @@ public class WaveformView implements IWaveformView { } private void createTextPane(Composite namePane, String text) { - GridLayout gl_namePane = new GridLayout(1, false); - gl_namePane.verticalSpacing = 0; - gl_namePane.marginWidth = 0; - gl_namePane.horizontalSpacing = 0; - gl_namePane.marginHeight = 0; - namePane.setLayout(gl_namePane); + GridLayout glNamePane = new GridLayout(1, false); + glNamePane.verticalSpacing = 0; + glNamePane.marginWidth = 0; + glNamePane.horizontalSpacing = 0; + glNamePane.marginHeight = 0; + namePane.setLayout(glNamePane); CLabel nameLabel = new CLabel(namePane, SWT.NONE); - GridData gd_nameLabel = new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1); - gd_nameLabel.heightHint = waveformCanvas.getRulerHeight() - 2; - nameLabel.setLayoutData(gd_nameLabel); + GridData gdNameLabel = new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1); + gdNameLabel.heightHint = waveformCanvas.getRulerHeight() - 2; + nameLabel.setLayoutData(gdNameLabel); nameLabel.setText(text); Label nameSep = new Label(namePane, SWT.SEPARATOR | SWT.HORIZONTAL); nameSep.setBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY)); nameSep.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK)); - GridData gd_nameSep = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); - gd_nameSep.heightHint = 2; - nameSep.setLayoutData(gd_nameSep); + GridData gdNameSep = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + gdNameSep.heightHint = 2; + nameSep.setLayoutData(gdNameSep); } @Override public void propertyChange(PropertyChangeEvent pce) { if ("size".equals(pce.getPropertyName()) || "content".equals(pce.getPropertyName())) { if(revealSelected) { - waveformCanvas.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { + waveformCanvas.getDisplay().asyncExec(() ->{ update(); currentWaveformSelection.stream().forEach(e -> waveformCanvas.reveal(e.waveform)); valueList.redraw(); nameList.redraw(); - } }); revealSelected=false; } else - waveformCanvas.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - update(); - } - }); + waveformCanvas.getDisplay().asyncExec(WaveformView.this::update); } } public void update() { - trackVerticalHeight = 0; + tracksVerticalHeight = 0; int nameMaxWidth = 0; IWaveformPainter painter = null; trackVerticalOffset.clear(); waveformCanvas.clearAllWaveformPainter(false); boolean even = true; TextLayout tl = new TextLayout(waveformCanvas.getDisplay()); - tl.setFont(nameFontB); + tl.setFont(styleProvider.getNameFont()); for (TrackEntry streamEntry : streams) { - streamEntry.height = waveformCanvas.getTrackHeight(); - streamEntry.vOffset=trackVerticalHeight; - if (streamEntry.isStream()) { + streamEntry.height = styleProvider.getTrackHeight(); + streamEntry.vOffset=tracksVerticalHeight; + if (streamEntry.waveform.getType()==WaveformType.TRANSACTION) { streamEntry.currentValue=""; - streamEntry.height *= streamEntry.getStream().getMaxConcurrency(); + streamEntry.height *= streamEntry.waveform.getWidth(); painter = new StreamPainter(waveformCanvas, even, streamEntry); - } else if (streamEntry.isSignal()) { + } else if (streamEntry.waveform.getType()==WaveformType.SIGNAL) { streamEntry.currentValue="---"; painter = new SignalPainter(waveformCanvas, even, streamEntry); } waveformCanvas.addWaveformPainter(painter, false); - trackVerticalOffset.put(trackVerticalHeight, streamEntry); + trackVerticalOffset.put(tracksVerticalHeight, streamEntry); tl.setText(streamEntry.waveform.getFullName()); nameMaxWidth = Math.max(nameMaxWidth, tl.getBounds().width); - trackVerticalHeight += streamEntry.height; + tracksVerticalHeight += streamEntry.height; even = !even; } waveformCanvas.syncScrollBars(); - nameList.setSize(nameMaxWidth + 15, trackVerticalHeight); - nameListScrolled.setMinSize(nameMaxWidth + 15, trackVerticalHeight); + nameList.setSize(nameMaxWidth + 15, tracksVerticalHeight); + nameListScrolled.setMinSize(nameMaxWidth + 15, tracksVerticalHeight); nameList.redraw(); updateValueList(); waveformCanvas.redraw(); @@ -551,7 +530,7 @@ public class WaveformView implements IWaveformView { private int calculateValueWidth() { TextLayout tl = new TextLayout(waveformCanvas.getDisplay()); - tl.setFont(nameFontB); + tl.setFont(styleProvider.getNameFontHighlite()); int valueMaxWidth = 0; for (TrackEntry v : streams) { tl.setText(v.currentValue); @@ -563,15 +542,13 @@ public class WaveformView implements IWaveformView { private void updateValueList(){ final Long time = getCursorTime(); for(TrackEntry entry:streams){ - if(entry.isSignal()){ - ISignal signal = (ISignal) entry.waveform; - Object value = signal.getWaveformValueBeforeTime(time); - if(value instanceof BitVector){ - BitVector bv = (BitVector) value; + if(entry.waveform.getType() == WaveformType.SIGNAL){ + IEvent[] value = entry.waveform.getEventsBeforeTime(time); + if(value[0] instanceof BitVector){ + BitVector bv = (BitVector) value[0]; if(bv.getWidth()==1) entry.currentValue="b'"+bv; else { - // TODO: same code resides in SignalPainter, fix it switch(entry.valueDisplay) { case SIGNED: entry.currentValue=Long.toString(bv.toSignedValue()); @@ -583,43 +560,44 @@ public class WaveformView implements IWaveformView { entry.currentValue="h'"+bv.toHexString(); } } - } else if(value instanceof Double){ - Double val = (Double) value; + } else if(value[0] instanceof DoubleVal){ + Double val = ((DoubleVal) value[0]).value; if(val>0.001) entry.currentValue=String.format("%1$,.3f", val); else entry.currentValue=Double.toString(val); } - } else if(entry.isStream()){ - ITxStream stream = (ITxStream) entry.waveform; - ITx[] resultsList = new ITx[stream.getMaxConcurrency()]; - Entry> firstTx=stream.getEvents().floorEntry(time); + } else if(entry.waveform.getType() == WaveformType.TRANSACTION){ + ITx[] resultsList = new ITx[entry.waveform.getWidth()]; + Entry firstTx=entry.waveform.getEvents().floorEntry(time); if(firstTx!=null){ do { - for(ITxEvent evt:firstTx.getValue()){ - ITx tx=evt.getTransaction(); - if(evt.getType()==ITxEvent.Type.BEGIN && tx.getBeginTime()<=time && tx.getEndTime()>=time){ + for(IEvent evt:firstTx.getValue()){ + if(evt instanceof ITxEvent) { + ITx tx=((ITxEvent)evt).getTransaction(); + if(evt.getKind()==EventKind.BEGIN && tx.getBeginTime()<=time && tx.getEndTime()>=time){ if(resultsList[tx.getConcurrencyIndex()]==null) - resultsList[tx.getConcurrencyIndex()]= evt.getTransaction(); + resultsList[tx.getConcurrencyIndex()]= ((ITxEvent)evt).getTransaction(); + } } } - firstTx=stream.getEvents().lowerEntry(firstTx.getKey()); + firstTx=entry.waveform.getEvents().lowerEntry(firstTx.getKey()); }while(firstTx!=null && !isArrayFull(resultsList)); - entry.currentValue=""; boolean separator=false; - + StringBuilder sb = new StringBuilder(); for(ITx o:resultsList){ - if(separator) entry.currentValue+="|"; - if(o!=null) entry.currentValue+=((ITx)o).getGenerator().getName(); - + if(separator) sb.append("|"); + if(o!=null) sb.append(o.getGenerator().getName()); separator=true; } + entry.currentValue=sb.toString(); + } } } int width = calculateValueWidth(); - valueList.setSize(width, trackVerticalHeight); - valueListScrolled.setMinSize(width, trackVerticalHeight); + valueList.setSize(width, tracksVerticalHeight); + valueListScrolled.setMinSize(width, tracksVerticalHeight); valueListScrolled.redraw(); } @@ -688,7 +666,6 @@ public class WaveformView implements IWaveformView { if (currentTxSelection != null) { sel.add(currentTxSelection); } - // sel.addAll(currentWaveformSelection.stream().map(e -> e.waveform).collect(Collectors.toList())); sel.addAll(currentWaveformSelection); return new StructuredSelection(sel.toArray()); } @@ -730,16 +707,10 @@ public class WaveformView implements IWaveformView { ITx txSel = (ITx) sel; TrackEntry trackEntry = getEntryForStream(txSel.getStream()); if(trackEntry==null && addIfNeeded){ - trackEntry=new TrackEntry(txSel.getStream()); - // compute fallback colors - Color fallbackColors[] = TrackEntry.computeColor(txSel.getStream().getName(), TrackEntry.fallbackColor, TrackEntry.highlightedFallbackColor); - trackEntry.setColor(fallbackColors[0], fallbackColors[1]); + trackEntry=new TrackEntry(txSel.getStream(), styleProvider); streams.add(trackEntry); } currentTxSelection = txSel; -// if(trackEntry!=null) { -// currentWaveformSelection.add((TrackEntry)sel); -// } selectionChanged = true; } else if (sel instanceof TrackEntry && !currentWaveformSelection.contains(sel)) { currentWaveformSelection.add((TrackEntry)sel); @@ -750,7 +721,7 @@ public class WaveformView implements IWaveformView { } } } else { - if (currentTxSelection != null || currentWaveformSelection.size() > 0) + if (currentTxSelection != null || !currentWaveformSelection.isEmpty()) selectionChanged = true; currentTxSelection = null; currentWaveformSelection.clear(); @@ -804,15 +775,14 @@ public class WaveformView implements IWaveformView { else if(currentWaveformSelection.size()!=1) return; if(selectedWaveform==null) selectedWaveform = currentWaveformSelection.get(1); - if (selectedWaveform!=null && selectedWaveform.isStream() && currentTxSelection!=null) { + if (selectedWaveform!=null && selectedWaveform.waveform.getType()==WaveformType.TRANSACTION && currentTxSelection!=null) { if(relationType.equals(IWaveformView.NEXT_PREV_IN_STREAM)){ - ITxStream stream = selectedWaveform.getStream(); ITx transaction = null; if (direction == GotoDirection.NEXT) { - List thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime()); + ITxEvent[] thisEntryList = (ITxEvent[]) selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime()); boolean meFound=false; for (ITxEvent evt : thisEntryList) { - if (evt.getType() == ITxEvent.Type.BEGIN) { + if (evt.getKind() == EventKind.BEGIN) { if(meFound){ transaction = evt.getTransaction(); break; @@ -821,42 +791,42 @@ public class WaveformView implements IWaveformView { } } if (transaction == null){ - Entry> entry = stream.getEvents().higherEntry(currentTxSelection.getBeginTime()); + Entry entry = selectedWaveform.waveform.getEvents().higherEntry(currentTxSelection.getBeginTime()); if (entry != null) do { - for (ITxEvent evt : entry.getValue()) { - if (evt.getType() == ITxEvent.Type.BEGIN) { - transaction = evt.getTransaction(); + for (IEvent evt : entry.getValue()) { + if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) { + transaction = ((ITxEvent)evt).getTransaction(); break; } } if (transaction == null) - entry = stream.getEvents().higherEntry(entry.getKey()); + entry = selectedWaveform.waveform.getEvents().higherEntry(entry.getKey()); } while (entry != null && transaction == null); } } else if (direction == GotoDirection.PREV) { - List thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime()); + IEvent[] thisEntryList = selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime()); boolean meFound=false; - for (ITxEvent evt : Lists.reverse(thisEntryList)) { - if (evt.getType() == ITxEvent.Type.BEGIN) { + for (IEvent evt : Lists.reverse(Arrays.asList(thisEntryList))) { + if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) { if(meFound){ - transaction = evt.getTransaction(); + transaction = ((ITxEvent)evt).getTransaction(); break; } - meFound|= evt.getTransaction().equals(currentTxSelection); + meFound|= ((ITxEvent)evt).getTransaction().equals(currentTxSelection); } } if (transaction == null){ - Entry> entry = stream.getEvents().lowerEntry(currentTxSelection.getBeginTime()); + Entry entry = selectedWaveform.waveform.getEvents().lowerEntry(currentTxSelection.getBeginTime()); if (entry != null) do { - for (ITxEvent evt : Lists.reverse(entry.getValue())) { - if (evt.getType() == ITxEvent.Type.BEGIN) { - transaction = evt.getTransaction(); + for (IEvent evt : Lists.reverse(Arrays.asList(thisEntryList))) { + if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) { + transaction = ((ITxEvent)evt).getTransaction(); break; } } if (transaction == null) - entry = stream.getEvents().lowerEntry(entry.getKey()); + entry = selectedWaveform.waveform.getEvents().lowerEntry(entry.getKey()); } while (entry != null && transaction == null); } } @@ -879,13 +849,12 @@ 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)); - //new RelSelectionDialog(waveformCanvas.getShell(), candidates, target).open(); switch (candidates.size()) { case 0: return null; case 1: return candidates.get(0); default: - ArrayList visibleCandidates = candidates.stream().filter(r -> streamsVisible(r)).collect(Collectors.toCollection(ArrayList::new)); - if(visibleCandidates.size()==0) { + 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; @@ -896,8 +865,8 @@ public class WaveformView implements IWaveformView { } private boolean streamsVisible(ITxRelation relation) { - final ITxStream src = relation.getSource().getStream(); - final ITxStream tgt = relation.getTarget().getStream(); + final IWaveform src = relation.getSource().getStream(); + final IWaveform tgt = relation.getTarget().getStream(); return streams.stream().anyMatch(x -> x.waveform == src) && streams.stream().anyMatch(x -> x.waveform == tgt); } @@ -910,10 +879,8 @@ public class WaveformView implements IWaveformView { TrackEntry sel = currentWaveformSelection.get(0); long time = getCursorTime(); NavigableMap map=null; - if(sel.isStream()){ - map=sel.getStream().getEvents(); - } else if(sel.isSignal()){ - map=sel.getSignal().getEvents(); + 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); @@ -940,12 +907,12 @@ public class WaveformView implements IWaveformView { */ @Override public void deleteSelectedTracks() { - List streams = getStreamList(); + List streamList = getStreamList(); for (Object o : (IStructuredSelection)getSelection()) { if(o instanceof TrackEntry) { TrackEntry e = (TrackEntry) o; e.selected=false; - streams.remove(e); + streamList.remove(e); } } setSelection(new StructuredSelection()); @@ -956,7 +923,7 @@ public class WaveformView implements IWaveformView { */ @Override public void moveSelectedTrack(int i) { - if(currentWaveformSelection.size()>0){ + if(!currentWaveformSelection.isEmpty()){ int idx = streams.indexOf(currentWaveformSelection.get(0)); for(Object o: currentWaveformSelection) streams.remove(o); @@ -971,25 +938,25 @@ public class WaveformView implements IWaveformView { protected void paintNames(GC gc, Rectangle rect) { - if (streams.size() > 0) { + if (!streams.isEmpty()) { try { Integer firstKey = trackVerticalOffset.floorKey(rect.y); if (firstKey == null) firstKey = trackVerticalOffset.firstKey(); Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); - Rectangle subArea = new Rectangle(rect.x, 0, rect.width, waveformCanvas.getTrackHeight()); - if (lastKey == firstKey) { + Rectangle subArea = new Rectangle(rect.x, 0, rect.width, styleProvider.getTrackHeight()); + if (lastKey.equals(firstKey)) { TrackEntry trackEntry=trackVerticalOffset.get(firstKey); IWaveform w = trackEntry.waveform; - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w).getMaxConcurrency(); + 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()) { IWaveform w = entry.getValue().waveform; - subArea.height = waveformCanvas.getTrackHeight(); - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w).getMaxConcurrency(); + subArea.height = styleProvider.getTrackHeight(); + if (w.getType()==WaveformType.TRANSACTION) + subArea.height *= w.getWidth(); drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), entry.getValue().selected); } } @@ -998,26 +965,26 @@ public class WaveformView implements IWaveformView { } protected void paintValues(GC gc, Rectangle rect) { - if (streams.size() > 0) { + if (!streams.isEmpty()) { try { Integer firstKey = trackVerticalOffset.floorKey(rect.y); if (firstKey == null) firstKey = trackVerticalOffset.firstKey(); Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); - Rectangle subArea = new Rectangle(rect.x, 0, rect.width, waveformCanvas.getTrackHeight()); - if (lastKey == firstKey) { + Rectangle subArea = new Rectangle(rect.x, 0, rect.width, styleProvider.getTrackHeight()); + if (lastKey.equals(firstKey)) { TrackEntry trackEntry=trackVerticalOffset.get(firstKey); IWaveform w = trackEntry.waveform; - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w).getMaxConcurrency(); + if (w.getType()==WaveformType.TRANSACTION) + subArea.height *= w.getWidth(); drawValue(gc, subArea, firstKey, trackEntry.currentValue, trackEntry.selected); } else { for (Entry entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) .entrySet()) { IWaveform w = entry.getValue().waveform; - subArea.height = waveformCanvas.getTrackHeight(); - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w).getMaxConcurrency(); + subArea.height = styleProvider.getTrackHeight(); + if (w.getType()==WaveformType.TRANSACTION) + subArea.height *= w.getWidth(); drawValue(gc, subArea, entry.getKey(), entry.getValue().currentValue, entry.getValue().selected); } } @@ -1027,10 +994,10 @@ public class WaveformView implements IWaveformView { protected void drawValue(GC gc, Rectangle subArea, Integer yOffset, String value, boolean highlite) { int beginIndex=0; - for(int offset=0; offset clicked = waveformCanvas.getElementsAt(new Point(event.x, event.y)); @@ -1224,13 +1194,22 @@ public class WaveformView implements IWaveformView { } } } - + @Override public void dragSetData(DragSourceEvent event) { if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) { 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) { @@ -1238,10 +1217,11 @@ public class WaveformView implements IWaveformView { DropTarget dropTarget = new DropTarget(canvas, DND.DROP_MOVE); dropTarget.setTransfer(types); dropTarget.addDropListener(new DropTargetAdapter() { + @Override public void drop(DropTargetEvent event) { if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)){ ISelection sel = LocalSelectionTransfer.getTransfer().getSelection(); - if(sel!=null && sel instanceof IStructuredSelection && + if(sel instanceof IStructuredSelection && ((IStructuredSelection)sel).getFirstElement() instanceof CursorPainter){ CursorPainter painter = (CursorPainter)((IStructuredSelection)sel).getFirstElement(); painter.setDragging(false); @@ -1249,17 +1229,17 @@ public class WaveformView implements IWaveformView { } } } - + @Override public void dropAccept(DropTargetEvent event) { Point offset = canvas.toControl(event.x, event.y); - if (event.detail != DND.DROP_MOVE || offset.y > trackVerticalOffset.lastKey() + waveformCanvas.getTrackHeight()) { + if (event.detail != DND.DROP_MOVE || offset.y > trackVerticalOffset.lastKey() + styleProvider.getTrackHeight()) { event.detail = DND.DROP_NONE; } } - + @Override public void dragOver(DropTargetEvent event){ ISelection sel = LocalSelectionTransfer.getTransfer().getSelection(); - if(sel!=null && sel instanceof IStructuredSelection && + if(sel instanceof IStructuredSelection && ((IStructuredSelection)sel).getFirstElement() instanceof CursorPainter){ updateWaveform(canvas, event, (CursorPainter) ((IStructuredSelection)sel).getFirstElement()); } @@ -1276,13 +1256,10 @@ public class WaveformView implements IWaveformView { pcs.firePropertyChange(MARKER_PROPERTY, oldVal, time); pcs.firePropertyChange(MARKER_PROPERTY+painter.id, oldVal, time); } - canvas.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - if(!canvas.isDisposed()){ - canvas.redraw(); - updateValueList(); - } + canvas.getDisplay().asyncExec(() -> { + if(!canvas.isDisposed()){ + canvas.redraw(); + updateValueList(); } }); } @@ -1340,8 +1317,8 @@ public class WaveformView implements IWaveformView { @Override public String getScaledTime(long time) { StringBuilder sb = new StringBuilder(); - Double dTime=new Double(time); - Double scaledTime = dTime/waveformCanvas.getScaleFactorPow10(); + double dTime=time; + double scaledTime = dTime/waveformCanvas.getScaleFactorPow10(); return sb.append(df.format(scaledTime)).append(waveformCanvas.getUnitStr()).toString(); } @@ -1350,21 +1327,16 @@ public class WaveformView implements IWaveformView { */ @Override public String[] getZoomLevels(){ - String[] res = new String[Constants.unitMultiplier.length*Constants.unitString.length]; + String[] res = new String[Constants.UNIT_MULTIPLIER.length*Constants.UNIT_STRING.length]; int index=0; - for(String unit:Constants.unitString){ - for(int factor:Constants.unitMultiplier){ - res[index++]= new Integer(factor).toString()+unit; + for(String unit:Constants.UNIT_STRING){ + for(int factor:Constants.UNIT_MULTIPLIER){ + res[index++]= Integer.toString(factor)+unit; } } return res; } - @Override - public void setColors(HashMap colourMap) { - waveformCanvas.initColors(colourMap); - } - @Override public long getBaselineTime() { return -waveformCanvas.getScaleFactorPow10()*waveformCanvas.getOrigin().x; @@ -1388,18 +1360,33 @@ public class WaveformView implements IWaveformView { } public void asyncUpdate(Widget widget) { - widget.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - waveformCanvas.redraw(); - updateValueList(); - } + widget.getDisplay().asyncExec(() -> { + waveformCanvas.redraw(); + updateValueList(); }); } /// probably not the way it should be done - public void addDisposeListener( DisposeListener listener ) { + @Override + public void addDisposeListener(DisposeListener listener ) { waveformCanvas.addDisposeListener(listener); } + @Override + public void setStyleProvider(IWaveformStyleProvider styleProvider) { + this.styleProvider=styleProvider; + waveformCanvas.setStyleProvider(styleProvider); + update(); + } + + @Override + public TrackEntry addWaveform(IWaveform waveform, int idx) { + TrackEntry e = new TrackEntry(waveform, styleProvider); + if(idx<0) + getStreamList().add(e); + else + getStreamList().add(idx, e); + return e; + } + } diff --git a/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF index 15323ef..0476d22 100644 --- a/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: VCD signal database Bundle-SymbolicName: com.minres.scviewer.database.vcd -Bundle-Version: 2.0.2.qualifier +Bundle-Version: 2.1.0.qualifier Bundle-Vendor: MINRES Technologies GmbH Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", diff --git a/plugins/com.minres.scviewer.database.vcd/pom.xml b/plugins/com.minres.scviewer.database.vcd/pom.xml index b03d4cb..c0b0902 100644 --- a/plugins/com.minres.scviewer.database.vcd/pom.xml +++ b/plugins/com.minres.scviewer.database.vcd/pom.xml @@ -1,7 +1,7 @@ 4.0.0 com.minres.scviewer.database.vcd - 2.0.2-SNAPSHOT + 2.1.0-SNAPSHOT com.minres.scviewer com.minres.scviewer.parent 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 fb7f474..dade0ff 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 @@ -14,17 +14,18 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayDeque; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.NavigableMap; -import java.util.Stack; import java.util.TreeMap; import java.util.Vector; import java.util.zip.GZIPInputStream; import com.minres.scviewer.database.BitVector; -import com.minres.scviewer.database.ISignal; +import com.minres.scviewer.database.DoubleVal; +import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbLoader; @@ -36,39 +37,30 @@ import com.minres.scviewer.database.RelationType; */ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { - + /** The Constant TIME_RES. */ - private static final Long TIME_RES = 1000L; // ps; + private static final Long TIME_RES = 1000L; // ps /** The db. */ private IWaveformDb db; - + /** The module stack. */ - private Stack moduleStack; - + private ArrayDeque moduleStack; + /** The signals. */ private List signals; - + /** The max time. */ private long maxTime; - - /** - * Instantiates a new VCD db. - */ - public VCDDbLoader() { - } private static boolean isGzipped(File f) { - InputStream is = null; - try { - is = new FileInputStream(f); + try (InputStream is = new FileInputStream(f)) { byte [] signature = new byte[2]; int nread = is.read( signature ); //read the gzip signature return nread == 2 && signature[ 0 ] == (byte) 0x1f && signature[ 1 ] == (byte) 0x8b; - } catch (IOException e) { + } + catch (IOException e) { return false; - } finally { - try { is.close();} catch (IOException e) { } } } @@ -78,25 +70,31 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { */ @SuppressWarnings("unchecked") @Override - public boolean load(IWaveformDb db, File file) throws Exception { + public boolean load(IWaveformDb db, File file) throws InputFormatException { if(file.isDirectory() || !file.exists()) return false; this.db=db; this.maxTime=0; - String name = file.getCanonicalFile().getName(); - if(!(name.endsWith(".vcd") || - name.endsWith(".vcdz") || - name.endsWith(".vcdgz") || - name.endsWith(".vcd.gz")) ) - return false; - signals = new Vector(); - moduleStack= new Stack(); - FileInputStream fis = new FileInputStream(file); - boolean res = new VCDFileParser(false).load(isGzipped(file)?new GZIPInputStream(fis):fis, this); - moduleStack=null; + boolean res = false; + try { + String name = file.getCanonicalFile().getName(); + if(!(name.endsWith(".vcd") || + name.endsWith(".vcdz") || + name.endsWith(".vcdgz") || + name.endsWith(".vcd.gz")) ) + return false; + signals = new Vector<>(); + moduleStack= new ArrayDeque<>(); + FileInputStream fis = new FileInputStream(file); + res = new VCDFileParser(false).load(isGzipped(file)?new GZIPInputStream(fis):fis, this); + moduleStack=null; + } catch(IOException e) { + moduleStack=null; + throw new InputFormatException(); + } if(!res) throw new InputFormatException(); // calculate max time of database for(IWaveform waveform:signals) { - NavigableMap events =((ISignal)waveform).getEvents(); + NavigableMap events =waveform.getEvents(); if(events.size()>0) maxTime= Math.max(maxTime, events.lastKey()); } @@ -108,8 +106,8 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { Object val = events.lastEntry().getValue(); if(val instanceof BitVector) { ((VCDSignal)s).addSignalChange(maxTime, (BitVector) val); - } else if(val instanceof Double) - ((VCDSignal)s).addSignalChange(maxTime, (Double) val); + } else if(val instanceof DoubleVal) + ((VCDSignal)s).addSignalChange(maxTime, (DoubleVal) val); } } } @@ -158,12 +156,11 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { @SuppressWarnings("unchecked") @Override public Integer newNet(String name, int i, int width) { - String netName = moduleStack.empty()? name: moduleStack.lastElement()+"."+name; + String netName = moduleStack.isEmpty()? name: moduleStack.peek()+"."+name; int id = signals.size(); - assert(width>=0); if(width==0) { - signals.add( i<0 ? new VCDSignal(db, id, netName, width) : - new VCDSignal((VCDSignal)signals.get(i), id, netName)); + signals.add( i<0 ? new VCDSignal(db, id, netName, width) : + new VCDSignal((VCDSignal)signals.get(i), id, netName)); } else if(width>0){ signals.add( i<0 ? new VCDSignal(db, id, netName, width) : new VCDSignal((VCDSignal)signals.get(i), id, netName)); @@ -188,22 +185,20 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { public void appendTransition(int signalId, long currentTime, BitVector value) { VCDSignal signal = (VCDSignal) signals.get(signalId); Long time = currentTime* TIME_RES; - signal.getEvents().put(time, value); + signal.addSignalChange(time, value); } - + /* (non-Javadoc) * @see com.minres.scviewer.database.vcd.ITraceBuilder#appendTransition(int, long, com.minres.scviewer.database.vcd.BitVector) */ @SuppressWarnings("unchecked") @Override public void appendTransition(int signalId, long currentTime, double value) { - VCDSignal signal = (VCDSignal) signals.get(signalId); + VCDSignal signal = (VCDSignal) signals.get(signalId); Long time = currentTime* TIME_RES; - if(signal.getWidth()==0){ - ((VCDSignal)signal).getEvents().put(time, value); - } + signal.addSignalChange(time, new DoubleVal(value)); } - + /* (non-Javadoc) * @see com.minres.scviewer.database.IWaveformDbLoader#getAllRelationTypes() */ 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 cd41817..bed4f89 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 @@ -11,6 +11,7 @@ package com.minres.scviewer.database.vcd; import java.io.*; +import java.text.ParseException; import java.util.*; import com.minres.scviewer.database.BitValue; @@ -19,7 +20,7 @@ import com.minres.scviewer.database.BitVector; class VCDFileParser { private StreamTokenizer tokenizer; private IVCDDatabaseBuilder traceBuilder; - private HashMap nameToNetMap = new HashMap(); + private HashMap nameToNetMap = new HashMap<>(); private long picoSecondsPerIncrement; private boolean stripNetWidth; private boolean replaceColon; @@ -50,19 +51,19 @@ class VCDFileParser { } } - private void parseScope() throws Exception { + private void parseScope() throws IOException, ParseException { nextToken(); // Scope type (ignore) nextToken(); traceBuilder.enterModule(tokenizer.sval); match("$end"); } - private void parseUpscope() throws Exception { + private void parseUpscope() throws IOException, ParseException { match("$end"); traceBuilder.exitModule(); } - private void parseVar() throws Exception { + private void parseVar() throws IOException { nextToken(); // type String type = tokenizer.sval; nextToken(); // size @@ -72,11 +73,12 @@ class VCDFileParser { nextToken(); String id = tokenizer.sval; nextToken(); - String netName = tokenizer.sval; + StringBuilder sb = new StringBuilder(); + sb.append(tokenizer.sval); while (nextToken() && !tokenizer.sval.equals("$end")) { - netName+=tokenizer.sval; + sb.append(tokenizer.sval); } - + String netName = sb.toString(); Integer net = nameToNetMap.get(id); if (net == null) { // We've never seen this net before int openBracket = netName.indexOf('['); @@ -86,9 +88,9 @@ class VCDFileParser { } if(replaceColon) { if (openBracket != -1) { - netName = netName.substring(0, openBracket).replaceAll(":", ".")+netName.substring(openBracket); + netName = netName.substring(0, openBracket).replace(":", ".")+netName.substring(openBracket); } else - netName=netName.replaceAll(":", "."); + netName=netName.replace(":", "."); } nameToNetMap.put(id, traceBuilder.newNet(netName, -1, width)); } else { @@ -97,25 +99,28 @@ class VCDFileParser { } } - private void parseComment() throws Exception { + private void parseComment() throws IOException { nextToken(); - String s = tokenizer.sval; + StringBuilder s = new StringBuilder(); + s.append(tokenizer.sval); nextToken(); while(!tokenizer.sval.equals("$end")){ - s+=" "+tokenizer.sval; + s.append(" ").append(tokenizer.sval); nextToken(); } - replaceColon|=s.contains("ARTERIS Architecture"); + replaceColon|=s.toString().contains("ARTERIS Architecture"); } - private void parseTimescale() throws Exception { + private void parseTimescale() throws IOException { nextToken(); - String s = tokenizer.sval; + StringBuilder sb = new StringBuilder(); + sb.append(tokenizer.sval); nextToken(); while(!tokenizer.sval.equals("$end")){ - s+=" "+tokenizer.sval; + sb.append(" ").append(tokenizer.sval); nextToken(); } + String s = sb.toString(); switch (s.charAt(s.length() - 2)){ case 'p': // Nano-seconds picoSecondsPerIncrement = 1; @@ -141,7 +146,7 @@ class VCDFileParser { picoSecondsPerIncrement *= Long.parseLong(s); } - private boolean parseDefinition() throws Exception { + private boolean parseDefinition() throws IOException, ParseException { nextToken(); if (tokenizer.sval.equals("$scope")) parseScope(); @@ -166,7 +171,7 @@ class VCDFileParser { return true; } - private boolean parseTransition() throws Exception { + private boolean parseTransition() throws IOException { if (!nextToken()) return false; if (tokenizer.sval.charAt(0) == '#') { // If the line begins with a #, this is a timestamp. currentTime = Long.parseLong(tokenizer.sval.substring(1)) * picoSecondsPerIncrement; @@ -179,19 +184,13 @@ class VCDFileParser { } if (tokenizer.sval.equals("$dumpvars") || tokenizer.sval.equals("$end")) return true; - String value, id; - if (tokenizer.sval.charAt(0) == 'b') { - // Multiple value net. Value appears first, followed by space, - // then identifier + String value; + String id; + if (tokenizer.sval.charAt(0) == 'b' || tokenizer.sval.charAt(0) == 'r') { + // Multiple value net. Value appears first, followed by space, then identifier value = tokenizer.sval.substring(1); nextToken(); id = tokenizer.sval; - }else if (tokenizer.sval.charAt(0) == 'r') { - // Multiple value net. Value appears first, followed by space, - // then identifier - value = tokenizer.sval.substring(1); - nextToken(); - id = tokenizer.sval; } else { // Single value net. identifier first, then value, no space. value = tokenizer.sval.substring(0, 1); @@ -199,10 +198,8 @@ class VCDFileParser { } Integer net = nameToNetMap.get(id); - if (net == null) { - System.out.println("unknown net " + id + " value " + value); + if (net == null) return true; - } int netWidth = traceBuilder.getNetWidth(net); if(netWidth==0) { @@ -253,14 +250,14 @@ class VCDFileParser { return true; } - private void match(String value) throws Exception { + private void match(String value) throws ParseException, IOException { nextToken(); if (!tokenizer.sval.equals(value)) - throw new Exception("Line "+tokenizer.lineno()+": parse error, expected "+value+" got "+tokenizer.sval); + throw new ParseException("Line "+tokenizer.lineno()+": parse error, expected "+value+" got "+tokenizer.sval, tokenizer.lineno()); } private boolean nextToken() throws IOException { return tokenizer.nextToken() != StreamTokenizer.TT_EOF; } -}; +} diff --git a/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java b/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java index 1e50ce2..dc57d56 100644 --- a/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java +++ b/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java @@ -15,26 +15,22 @@ import java.util.NavigableMap; import java.util.TreeMap; import com.minres.scviewer.database.HierNode; -import com.minres.scviewer.database.ISignal; +import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; -import com.minres.scviewer.database.IWaveformEvent; +import com.minres.scviewer.database.WaveformType; -public class VCDSignal extends HierNode implements ISignal { +public class VCDSignal extends HierNode implements IWaveform { private long id; private String fullName; - private final String kind = "signal"; - private final int width; - private final T dummy = null; - private IWaveformDb db; - private TreeMap values; + private NavigableMap values; public VCDSignal(IWaveformDb db, String name) { this(db, 0, name, 1); @@ -50,18 +46,16 @@ public class VCDSignal extends HierNode implements ISignal { fullName=name; this.id=id; this.width=width; - this.values=new TreeMap(); + this.values=new TreeMap<>(); } - @SuppressWarnings("unchecked") - public VCDSignal(ISignal other, int id, String name) { + public VCDSignal(VCDSignal o, int id, String name) { super(name); fullName=name; this.id=id; - assert(other instanceof VCDSignal); - this.width=((VCDSignal)other).width; - this.values=((VCDSignal)other).values; - this.db=other.getDb(); + this.width=o.width; + this.values=o.values; + this.db=o.getDb(); } @Override @@ -78,53 +72,55 @@ public class VCDSignal extends HierNode implements ISignal { return id; } - @Override - public String getKind() { - return kind; - } - - public int getWidth() { - return width; - } - @Override public IWaveformDb getDb() { return db; } public void addSignalChange(Long time, T value){ - values.put(time, value); + if(values.containsKey(time)) { + IEvent[] oldV = values.get(time); + IEvent[] newV = new IEvent[oldV.length+1]; + System.arraycopy(oldV, 0, newV, 0, oldV.length); + newV[oldV.length]=value; + values.put(time, newV); + } else { + values.put(time, new IEvent[] {value}); + } } @Override - public NavigableMap getEvents() { + public NavigableMap getEvents() { return values; } @Override - public T getWaveformValueAtTime(Long time) { + public IEvent[] getEventsAtTime(Long time) { return values.get(time); } @Override - public T getWaveformValueBeforeTime(Long time) { - Entry e = values.floorEntry(time); + public IEvent[] getEventsBeforeTime(Long time) { + Entry e = values.floorEntry(time); if(e==null) - return null; + return new IEvent[] {}; else - return values.floorEntry(time).getValue(); + return values.floorEntry(time).getValue(); } @Override - public Boolean equals(IWaveform other) { + public boolean isSame(IWaveform other) { return( other instanceof VCDSignal && this.getId().equals(other.getId())); } @Override - public Class getType() { - return dummy.getClass(); + public WaveformType getType() { + return WaveformType.SIGNAL; } - + @Override + public int getWidth() { + return width; + } } diff --git a/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF index 09d9fe4..a85dd7f 100644 --- a/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF @@ -2,11 +2,11 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Waveform database Bundle-SymbolicName: com.minres.scviewer.database -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 2.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Export-Package: com.minres.scviewer.database, - com.minres.scviewer.database.internal;x-internal:=true + com.minres.scviewer.database.tx Bundle-ActivationPolicy: lazy Service-Component: OSGI-INF/component.xml,OSGI-INF/component2.xml Automatic-Module-Name: com.minres.scviewer.database diff --git a/plugins/com.minres.scviewer.database/pom.xml b/plugins/com.minres.scviewer.database/pom.xml index a23746c..55ca613 100644 --- a/plugins/com.minres.scviewer.database/pom.xml +++ b/plugins/com.minres.scviewer.database/pom.xml @@ -8,5 +8,5 @@ ../.. eclipse-plugin - 1.0.0-SNAPSHOT + 2.0.0-SNAPSHOT diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/BitVector.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/BitVector.java index 212a7dd..7ca5888 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/BitVector.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/BitVector.java @@ -10,12 +10,12 @@ *******************************************************************************/ package com.minres.scviewer.database; -public class BitVector { +public class BitVector implements IEvent { private final int width; - + private int[] packedValues; - + public BitVector(int netWidth) { this.width=netWidth; packedValues = new int[(netWidth+15)/16]; @@ -31,19 +31,19 @@ public class BitVector { } public char[] getValue() { - int bitOffset = 0; - int wordOffset = 0; - char[] res = new char[width]; - // Copy values out of packed array - for (int i = 0; i < width; i++) { - int currentWord = (packedValues[wordOffset] >> bitOffset)&3; - res[width-i-1]=BitValue.fromInt(currentWord).toChar(); - bitOffset += 2; - if (bitOffset == 32) { - wordOffset++; - bitOffset = 0; - } - } + int bitOffset = 0; + int wordOffset = 0; + char[] res = new char[width]; + // Copy values out of packed array + for (int i = 0; i < width; i++) { + int currentWord = (packedValues[wordOffset] >> bitOffset)&3; + res[width-i-1]=BitValue.fromInt(currentWord).toChar(); + bitOffset += 2; + if (bitOffset == 32) { + wordOffset++; + bitOffset = 0; + } + } return res; } @@ -68,7 +68,7 @@ public class BitVector { public String toString(){ return new String(getValue()); } - + public String toHexString(){ int resWidth=(width-1)/4+1; char[] value=getValue(); @@ -76,33 +76,34 @@ public class BitVector { for(int i=resWidth-1; i>=0; i--){ int digit=0; for(int j=3; j>=0; j--){ - if((4*i+j)>=value.length) continue; - BitValue val = BitValue.fromChar(value[4*i+j]); - switch(val) { - case X: - case Z: - res[i]=val.toChar(); - continue; - case ONE: - digit+=1<<(3-j); - break; - default: - break; + if((4*i+j)>= 2; - } - } - return res; + bitOffset += 2; + if (bitOffset == 32) { + wordOffset++; + bitOffset = 0; + } else { + currentWord >>= 2; + } + } + return res; } - + public long toSignedValue() { long res = 0; - int bitOffset = 0; - int wordOffset = 0; - int currentWord = 0; - int lastVal=0; - // Copy values out of packed array - for (int i = 0; i < width; i++) { - if(bitOffset==0) currentWord = packedValues[wordOffset]; - lastVal=0; + int bitOffset = 0; + int wordOffset = 0; + int currentWord = 0; + int lastVal=0; + // Copy values out of packed array + for (int i = 0; i < width; i++) { + if(bitOffset==0) currentWord = packedValues[wordOffset]; + lastVal=0; switch (currentWord & 3) { case 1: res|=1<>= 2; - } - } - for(int i=width; i<64; i++) { - if(bitOffset==0) currentWord = packedValues[wordOffset]; - res|=lastVal<>= 2; - } - - } + bitOffset += 2; + if (bitOffset == 32) { + wordOffset++; + bitOffset = 0; + } else { + currentWord >>= 2; + } + } + if(lastVal!=0) + res |= -1l< childs; protected PropertyChangeSupport pcs; public HierNode() { - childs = new ArrayList(); + childs = new ArrayList<>(); pcs=new PropertyChangeSupport(this); } public HierNode(String name) { - this(name, ""); - } - - public HierNode(String name, String parentName) { this(); this.name=name; - this.parentName=parentName; + } + + public HierNode(String name, IHierNode parent) { + this(); + this.name=name; + this.parent=parent; } @Override @@ -53,8 +54,8 @@ public class HierNode implements IHierNode { @Override public String getFullName() { - if(parentName!=null && parentName.length()>0) - return parentName+"."+name; + if(parent!=null) + return parent.getFullName()+"."+name; else return name; } @@ -70,8 +71,8 @@ public class HierNode implements IHierNode { } @Override - public void setParentName(String name) { - this.parentName=name; + public void setParent(IHierNode parent) { + this.parent=parent; } @Override @@ -81,7 +82,12 @@ public class HierNode implements IHierNode { @Override public int compareTo(IHierNode o) { - return name.compareTo(o.getName()); + return getFullName().compareTo(o.getFullName()); + } + + @Override + public IDerivedWaveform deriveWaveform() { + return null; } } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformEvent.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IDerivedWaveform.java similarity index 70% rename from plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformEvent.java rename to plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IDerivedWaveform.java index 376736b..10beacd 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformEvent.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IDerivedWaveform.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015 MINRES Technologies GmbH and others. + * Copyright (c) 2015, 2020 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 @@ -10,11 +10,10 @@ *******************************************************************************/ package com.minres.scviewer.database; +/** + * The Interface IDerivedWaveform. + */ +public interface IDerivedWaveform extends IWaveform { -public interface IWaveformEvent extends Comparable{ - - public Long getTime(); - - public IWaveformEvent duplicate() throws CloneNotSupportedException; - + void addSourceWaveform(IWaveform waveform); } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IEvent.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IEvent.java new file mode 100644 index 0000000..6d0bf25 --- /dev/null +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IEvent.java @@ -0,0 +1,11 @@ +package com.minres.scviewer.database; + +public interface IEvent { + + public IEvent duplicate() throws CloneNotSupportedException; + + public EventKind getKind(); + + public WaveformType getType(); + +} 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 2900ace..e91ea84 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015 MINRES Technologies GmbH and others. + * Copyright (c) 2015, 2020 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 @@ -13,6 +13,9 @@ package com.minres.scviewer.database; import java.beans.PropertyChangeListener; import java.util.List; +/** + * The Interface IHierNode. + */ public interface IHierNode extends Comparable{ /** @@ -33,14 +36,46 @@ public interface IHierNode extends Comparable{ */ public void removePropertyChangeListener(PropertyChangeListener l) ; + /** + * Gets the full name. + * + * @return the full name + */ public String getFullName(); + /** + * Gets the name. + * + * @return the name + */ public String getName(); + /** + * Sets the name. + * + * @param name the new name + */ public void setName(String name); - public void setParentName(String name); + /** + * Sets the parent. + * + * @param parent the new parent + */ + public void setParent(IHierNode parent); + /** + * Gets the child nodes. + * + * @return the child nodes + */ public List getChildNodes(); + + /** + * Derive waveform. + * + * @return the i derived waveform or null if none could be created + */ + public IDerivedWaveform deriveWaveform(); } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignal.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignal.java deleted file mode 100644 index 32a5a48..0000000 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignal.java +++ /dev/null @@ -1,26 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * MINRES Technologies GmbH - initial API and implementation - *******************************************************************************/ -package com.minres.scviewer.database; - -import java.util.NavigableMap; - - -public interface ISignal extends IWaveform{ - - public NavigableMap getEvents(); - - public T getWaveformValueAtTime(Long time); - - public T getWaveformValueBeforeTime(Long time); - - public Class getType(); -} - diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxStream.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxStream.java deleted file mode 100644 index 6f6fd0c..0000000 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxStream.java +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * MINRES Technologies GmbH - initial API and implementation - *******************************************************************************/ -package com.minres.scviewer.database; - -import java.util.Collection; -import java.util.List; -import java.util.NavigableMap; - -public interface ITxStream extends IWaveform { - - public List getGenerators(); - - public int getMaxConcurrency(); - - public NavigableMap> getEvents(); - - public Collection getWaveformEventsAtTime(Long time); - -} diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java index d12753d..6441571 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java @@ -10,15 +10,24 @@ *******************************************************************************/ package com.minres.scviewer.database; +import java.util.NavigableMap; public interface IWaveform extends IHierNode { public Long getId(); - public String getKind(); - public IWaveformDb getDb(); - public Boolean equals(IWaveform other); + public boolean isSame(IWaveform other); + + public NavigableMap getEvents(); + + public IEvent[] getEventsAtTime(Long time); + + public IEvent[] getEventsBeforeTime(Long time); + + public WaveformType getType(); + + public int getWidth(); } 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 1ccba07..0bf3197 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 @@ -15,7 +15,7 @@ import java.util.Collection; public interface IWaveformDbLoader { - public boolean load(IWaveformDb db, File inp) throws Exception; + public boolean load(IWaveformDb db, File inp) throws InputFormatException; public Long getMaxTime(); diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/RelationType.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/RelationType.java index 95d365c..1011edf 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/RelationType.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/RelationType.java @@ -50,4 +50,9 @@ public class RelationType { public int hashCode() { return name.hashCode(); } + + @Override + public boolean equals(Object obj) { + return name.equals(obj); + } } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/WaveformType.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/WaveformType.java new file mode 100644 index 0000000..9e56f65 --- /dev/null +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/WaveformType.java @@ -0,0 +1,5 @@ +package com.minres.scviewer.database; + +public enum WaveformType { + SIGNAL, TRANSACTION, FILTER +} 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 eec0871..32d20e8 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 @@ -12,10 +12,8 @@ package com.minres.scviewer.database.internal; import java.io.File; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -25,17 +23,14 @@ import com.minres.scviewer.database.IHierNode; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbLoader; -import com.minres.scviewer.database.InputFormatException; import com.minres.scviewer.database.RelationType; public class WaveformDb extends HierNode implements IWaveformDb { - private static List loaders=new LinkedList(); + private static List loaders=new LinkedList<>(); private boolean loaded; - private List childNodes; - private List relationTypes; private Map waveforms; @@ -58,7 +53,7 @@ public class WaveformDb extends HierNode implements IWaveformDb { public WaveformDb() { super(); - waveforms = new HashMap(); + waveforms = new HashMap<>(); relationTypes=new ArrayList<>(); maxTime=0L; } @@ -75,7 +70,7 @@ public class WaveformDb extends HierNode implements IWaveformDb { @Override public List getAllWaves() { - return new ArrayList(waveforms.values()); + return new ArrayList<>(waveforms.values()); } @Override @@ -93,7 +88,7 @@ public class WaveformDb extends HierNode implements IWaveformDb { buildHierarchyNodes() ; relationTypes.addAll(loader.getAllRelationTypes()); pcs.firePropertyChange("WAVEFORMS", null, waveforms); - pcs.firePropertyChange("CHILDS", null, childNodes); + pcs.firePropertyChange("CHILDS", null, childs); loaded = true; return true; } @@ -116,7 +111,7 @@ public class WaveformDb extends HierNode implements IWaveformDb { @Override public void clear() { waveforms.clear(); - childNodes.clear(); + childs.clear(); loaded=false; } @@ -124,62 +119,41 @@ public class WaveformDb extends HierNode implements IWaveformDb { return loaded; } - private void buildHierarchyNodes() throws InputFormatException{ - childNodes= new ArrayList(); + private void buildHierarchyNodes() { for(IWaveform stream:getAllWaves()){ - //updateMaxTime(stream); String[] hier = stream.getName().split("\\."); IHierNode node = this; - List path=new LinkedList(); - path.add(name); - for(String name:hier){ - IHierNode n1 = null; + for(int i=0; i col, String delim) { - StringBuilder sb = new StringBuilder(); - Iterator iter = col.iterator(); - if (iter.hasNext()) - sb.append(iter.next().toString()); - while (iter.hasNext()) { - sb.append(delim); - sb.append(iter.next().toString()); - } - return sb.toString(); + 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); + } } @Override diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITx.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITx.java similarity index 89% rename from plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITx.java rename to plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITx.java index bc1b000..73e72d7 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITx.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITx.java @@ -8,16 +8,18 @@ * Contributors: * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ -package com.minres.scviewer.database; +package com.minres.scviewer.database.tx; import java.util.Collection; import java.util.List; +import com.minres.scviewer.database.IWaveform; + public interface ITx extends Comparable{ public Long getId(); - public ITxStream getStream(); + public IWaveform getStream(); public ITxGenerator getGenerator(); diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxAttribute.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxAttribute.java similarity index 93% rename from plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxAttribute.java rename to plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxAttribute.java index f976cfa..1e06781 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxAttribute.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxAttribute.java @@ -8,7 +8,7 @@ * Contributors: * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ -package com.minres.scviewer.database; +package com.minres.scviewer.database.tx; public interface ITxAttribute extends ITxAttributeType { public Object getValue(); diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxAttributeType.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxAttributeType.java similarity index 82% rename from plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxAttributeType.java rename to plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxAttributeType.java index 19125a3..fe21390 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxAttributeType.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxAttributeType.java @@ -8,7 +8,10 @@ * Contributors: * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ -package com.minres.scviewer.database; +package com.minres.scviewer.database.tx; + +import com.minres.scviewer.database.AssociationType; +import com.minres.scviewer.database.DataType; public interface ITxAttributeType { public String getName(); diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxEvent.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxEvent.java similarity index 75% rename from plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxEvent.java rename to plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxEvent.java index 97f67e1..1aada15 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxEvent.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxEvent.java @@ -8,12 +8,13 @@ * Contributors: * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ -package com.minres.scviewer.database; +package com.minres.scviewer.database.tx; -public interface ITxEvent extends IWaveformEvent { - enum Type {BEGIN, END}; +import com.minres.scviewer.database.IEvent; + +public interface ITxEvent extends IEvent { + + public Long getTime(); - public ITx getTransaction(); - - public Type getType(); + public ITx getTransaction(); } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxGenerator.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxGenerator.java similarity index 85% rename from plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxGenerator.java rename to plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxGenerator.java index 1f05afb..92a8e2b 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxGenerator.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxGenerator.java @@ -8,13 +8,15 @@ * Contributors: * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ -package com.minres.scviewer.database; +package com.minres.scviewer.database.tx; import java.util.List; +import com.minres.scviewer.database.IWaveform; + public interface ITxGenerator { public Long getId(); - public ITxStream getStream(); + public IWaveform getStream(); public String getName(); public List getTransactions(); } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxRelation.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxRelation.java similarity index 87% rename from plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxRelation.java rename to plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxRelation.java index cb3bd88..40eafe1 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/ITxRelation.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxRelation.java @@ -8,7 +8,9 @@ * Contributors: * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ -package com.minres.scviewer.database; +package com.minres.scviewer.database.tx; + +import com.minres.scviewer.database.RelationType; public interface ITxRelation { diff --git a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF index a82f6b5..ed5a1d4 100644 --- a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: com.minres.scviewer.e4.application;singleton:=true -Bundle-Version: 2.10.0.qualifier +Bundle-Version: 2.11.0.qualifier Bundle-Vendor: %Bundle-Vendor Require-Bundle: javax.inject;bundle-version="1.0.0", org.eclipse.core.runtime;bundle-version="3.11.1", diff --git a/plugins/com.minres.scviewer.e4.application/plugin.xml b/plugins/com.minres.scviewer.e4.application/plugin.xml index e5b3bf8..de027ae 100644 --- a/plugins/com.minres.scviewer.e4.application/plugin.xml +++ b/plugins/com.minres.scviewer.e4.application/plugin.xml @@ -70,7 +70,7 @@ - + diff --git a/plugins/com.minres.scviewer.e4.application/pom.xml b/plugins/com.minres.scviewer.e4.application/pom.xml index d4253c4..15c9c2b 100644 --- a/plugins/com.minres.scviewer.e4.application/pom.xml +++ b/plugins/com.minres.scviewer.e4.application/pom.xml @@ -1,7 +1,7 @@ 4.0.0 com.minres.scviewer.e4.application - 2.10.0-SNAPSHOT + 2.11.0-SNAPSHOT com.minres.scviewer com.minres.scviewer.parent diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/E4LifeCycle.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/E4LifeCycle.java index 054b8be..54de3da 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/E4LifeCycle.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/E4LifeCycle.java @@ -13,6 +13,7 @@ package com.minres.scviewer.e4.application; import java.io.IOException; import javax.annotation.PostConstruct; +import javax.inject.Inject; import org.eclipse.core.runtime.Platform; import org.eclipse.e4.core.contexts.IEclipseContext; @@ -30,8 +31,10 @@ import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState; import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.osgi.service.datalocation.Location; +import org.eclipse.swt.widgets.Display; import org.osgi.service.event.Event; import org.osgi.service.event.EventHandler; +import org.eclipse.e4.core.services.log.Logger; import com.minres.scviewer.e4.application.options.Options; import com.minres.scviewer.e4.application.options.Options.Multiplicity; @@ -45,6 +48,8 @@ import com.minres.scviewer.e4.application.options.Options.Separator; **/ public class E4LifeCycle { + @Inject private Logger logger; + /** * Post construct. * @@ -70,20 +75,10 @@ public class E4LifeCycle { .addOption("clearPersistedState", Multiplicity.ZERO_OR_ONE) .addOption("c", Separator.BLANK, Multiplicity.ZERO_OR_ONE); if (!opt.check(Options.DEFAULT_SET, true, false)) { - System.err.println(opt.getCheckErrors()); + logger.error(opt.getCheckErrors()); System.exit(1); } - final String confFile =opt.getSet().isSet("c")?opt.getSet().getOption("c").getResultValue(0):""; - // react on the first view being created, at that time the UI is available -// eventBroker.subscribe(UIEvents.UILifeCycle.ACTIVATE, new EventHandler() { -// @Override -// public void handleEvent(Event event) { -// MPart part = (MPart) event.getProperty("ChangedElement"); //$NON-NLS-1$ -// if(part!=null){ -// } -// } -// }); eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, new EventHandler() { @Override public void handleEvent(Event event) { @@ -93,19 +88,22 @@ public class E4LifeCycle { if(isLocked) instanceLocation.release(); } catch (IOException e) { } - if(opt.getSet().getData().size()>0) { - MApplication app= workbenchContext.get(MApplication.class); - EModelService modelService = workbenchContext.get(EModelService.class); - EPartService partService= workbenchContext.get(EPartService.class); - MPart part = partService .createPart("com.minres.scviewer.e4.application.partdescriptor.waveformviewer"); //$NON-NLS-1$ - part.setLabel(opt.getSet().getData().get(0)); - MPartStack partStack = (MPartStack)modelService.find("org.eclipse.editorss", app); //$NON-NLS-1$ - partStack.getChildren().add(part); - partService.showPart(part, PartState.CREATE); - partService.showPart(part, PartState.ACTIVATE); - IEclipseContext ctx = part.getContext(); - ctx.modify("input", opt.getSet().getData()); - ctx.modify("config", confFile); //$NON-NLS-1$ + if(!opt.getSet().getData().isEmpty()) { + Display.getCurrent().timerExec (100, () -> { + MApplication app= workbenchContext.get(MApplication.class); + EModelService modelService = workbenchContext.get(EModelService.class); + EPartService partService= workbenchContext.get(EPartService.class); + MPart part = partService .createPart("com.minres.scviewer.e4.application.partdescriptor.waveformviewer"); //$NON-NLS-1$ + part.setLabel(opt.getSet().getData().get(0)); + MPartStack partStack = (MPartStack)modelService.find("org.eclipse.editorss", app); //$NON-NLS-1$ + partStack.getChildren().add(part); + partService.showPart(part, PartState.CREATE); + partService.showPart(part, PartState.ACTIVATE); + IEclipseContext ctx = part.getContext(); + ctx.modify("input", opt.getSet().getData()); + String confFile =opt.getSet().isSet("c")?opt.getSet().getOption("c").getResultValue(0):""; + ctx.modify("config", confFile); //$NON-NLS-1$ + }); } } }); @@ -118,6 +116,7 @@ public class E4LifeCycle { */ @PreSave void preSave(IEclipseContext workbenchContext) { + /* nothing to be done here */ } /** @@ -127,6 +126,7 @@ public class E4LifeCycle { */ @ProcessAdditions void processAdditions(IEclipseContext workbenchContext) { + /* nothing to be done here */ } /** @@ -136,5 +136,6 @@ public class E4LifeCycle { */ @ProcessRemovals void processRemovals(IEclipseContext workbenchContext) { + /* nothing to be done here */ } } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Messages.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Messages.java index bb69c23..0bb7585 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Messages.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Messages.java @@ -23,6 +23,7 @@ public class Messages extends NLS { public static String ResourceManager_0; public static String SCViewerPreferencesPage_0; public static String SCViewerPreferencesPage_1; + public static String SCViewerPreferencesPage_2; public static String StatusBarControl_1; public static String StatusBarControl_2; public static String StatusBarControl_3; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java index 2c214a7..bb38cb6 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java @@ -29,8 +29,8 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; -import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.RelationType; +import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.e4.application.Messages; import com.minres.scviewer.e4.application.parts.PartListener; import com.minres.scviewer.e4.application.parts.WaveformViewer; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java index bdf0e15..58cf2a2 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java @@ -22,7 +22,8 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import com.minres.scviewer.database.BitVector; -import com.minres.scviewer.database.ISignal; +import com.minres.scviewer.database.DoubleVal; +import com.minres.scviewer.database.WaveformType; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.e4.application.parts.WaveformViewer; @@ -31,16 +32,16 @@ public class WaveformPopupMenuContribution { @Inject MPart activePart; - final TrackEntry nullEntry = new TrackEntry(null); + final TrackEntry nullEntry = new TrackEntry(null, null); private boolean selHasBitVector(ISelection sel, boolean checkForDouble) { if(!sel.isEmpty() && sel instanceof IStructuredSelection) { for(Object elem:(IStructuredSelection)sel) { if(elem instanceof TrackEntry) { TrackEntry e = (TrackEntry) elem; - if(e.waveform instanceof ISignal) { - Object o = ((ISignal) e.waveform).getEvents().firstEntry().getValue(); - if(checkForDouble && o instanceof Double) + if(e.waveform.getType() == WaveformType.SIGNAL) { + Object o = e.waveform.getEvents().firstEntry().getValue()[0]; + if(checkForDouble && o instanceof DoubleVal) return true; else if(o instanceof BitVector && ((BitVector)o).getWidth()>1) return true; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/MoveWaveformHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/MoveWaveformHandler.java index 3b5fcce..388a931 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/MoveWaveformHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/MoveWaveformHandler.java @@ -20,8 +20,8 @@ import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.modeling.ESelectionService; import org.eclipse.jface.viewers.IStructuredSelection; -import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.e4.application.parts.WaveformViewer; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateEvent.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateEvent.java index 971d409..4c4ad61 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateEvent.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateEvent.java @@ -20,8 +20,8 @@ import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.modeling.ESelectionService; import org.eclipse.jface.viewers.IStructuredSelection; -import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.ui.GotoDirection; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.e4.application.parts.WaveformViewer; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateTrans.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateTrans.java index 8a2f75c..f73c811 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateTrans.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateTrans.java @@ -20,7 +20,7 @@ import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.modeling.ESelectionService; import org.eclipse.jface.viewers.IStructuredSelection; -import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.ui.GotoDirection; import com.minres.scviewer.e4.application.parts.WaveformViewer; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SearchHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SearchHandler.java index 729e6d0..3e77803 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SearchHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SearchHandler.java @@ -17,6 +17,7 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Shell; +import com.minres.scviewer.database.WaveformType; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.e4.application.parts.WaveformViewer; public class SearchHandler { @@ -31,7 +32,7 @@ public class SearchHandler { Object[] elem = ((StructuredSelection)sel).toArray(); if(elem.length ==0) return false; TrackEntry e = findTrackEntry(elem); - return e!=null && e.isStream(); + return e!=null && e.waveform.getType()==WaveformType.TRANSACTION; } } return false; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/ThemeSetHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/ThemeSetHandler.java index 5abaa72..7cc12e3 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/ThemeSetHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/ThemeSetHandler.java @@ -22,7 +22,7 @@ import org.eclipse.e4.ui.workbench.modeling.EPartService; */ @SuppressWarnings("restriction") public class ThemeSetHandler { - final static String PARAMTER_ID = "com.minres.scviewer.e4.application.command.theme.parameter.id"; //$NON-NLS-1$ + static final String PARAMTER_ID = "com.minres.scviewer.e4.application.command.theme.parameter.id"; //$NON-NLS-1$ @CanExecute public boolean canExecute(EPartService partService) { diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties index 4cc0144..25acce6 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties @@ -17,6 +17,7 @@ RelationTypeToolControl_1=Select ResourceManager_0=Wrong decorate corner SCViewerPreferencesPage_0=Check for changed database SCViewerPreferencesPage_1=Show hover window in waveform +SCViewerPreferencesPage_2=Waveform track height StatusBarControl_1=Currently running: StatusBarControl_2=\nLast task: StatusBarControl_3=Currently running: 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 0e11385..6616c3e 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 @@ -77,9 +77,9 @@ import org.eclipse.wb.swt.SWTResourceManager; import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.IHierNode; -import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; +import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.e4.application.Messages; import com.minres.scviewer.e4.application.handlers.AddWaveformHandler; import com.minres.scviewer.e4.application.provider.TxDbContentProvider; 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 index 56c69f6..bb781b9 100644 --- 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 @@ -5,6 +5,7 @@ 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; @@ -38,7 +39,7 @@ public class LoadingWaveformDb implements IWaveformDb { } @Override - public void setParentName(String name) { + public void setParent(IHierNode name) { } @Override @@ -85,4 +86,9 @@ public class LoadingWaveformDb implements IWaveformDb { 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/SearchTxDialog.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/SearchTxDialog.java deleted file mode 100644 index e73870a..0000000 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/SearchTxDialog.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.minres.scviewer.e4.application.parts; - -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.TitleAreaDialog; -import org.eclipse.jface.viewers.ArrayContentProvider; -import org.eclipse.jface.viewers.ComboViewer; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.eclipse.wb.swt.ResourceManager; - -import com.minres.scviewer.database.DataType; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.ITxStream; - -public class SearchTxDialog extends TitleAreaDialog { - private ComboViewer propNameComboViewer = null; - - private Text propValueText = null; - - private String propName=""; - private DataType propType=null; - private String propValue=""; - - private ITxStream stream; - - private ConcurrentHashMap propNames=new ConcurrentHashMap(); - - /** - * Create the dialog. - * @param parentShell - * @param iTxStream - */ - public SearchTxDialog(Shell parentShell, ITxStream iTxStream) { - super(parentShell); - setShellStyle(SWT.BORDER | SWT.RESIZE | SWT.TITLE | SWT.APPLICATION_MODAL); - stream=iTxStream; - new Thread() { - public void run() { - stream.getEvents().values().parallelStream().forEach(evtLst -> { - evtLst.forEach(evt -> { - evt.getTransaction().getAttributes().stream().forEach(attr -> { - propNames.put(attr.getName(), attr.getDataType()); - }); - }); - }); - parentShell.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - if (propNameComboViewer!=null) { - propNameComboViewer.setInput(getEntries()); - propNameComboViewer.setSelection(new StructuredSelection(propNameComboViewer.getElementAt(0))); - } - } - }); - } - }.run(); - } - - /** - * Create contents of the dialog. - * @param parent - */ - @Override - protected Control createDialogArea(Composite parent) { - setMessage("Specify property name and value to search for"); - setTitleImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/Minres_logo.png")); - setTitle("Search Tx in stream"); - final Composite area = (Composite) super.createDialogArea(parent); - final GridLayout gridLayout = (GridLayout) area.getLayout(); - gridLayout.marginTop = 10; - gridLayout.marginBottom = 10; - final Composite container = new Composite(area, SWT.NONE); - final GridLayout gl_container = new GridLayout(2, false); - gl_container.horizontalSpacing = 2; - container.setLayout(gl_container); - container.setLayoutData(new GridData(GridData.FILL_BOTH)); - - final Label header = new Label(container, SWT.CENTER | SWT.WRAP); - GridData gd_header = new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1); - gd_header.verticalIndent = 10; - header.setLayoutData(gd_header); - header.setText("Stream: "+stream.getName()); - - final Label propNameLabel = new Label(container, SWT.NONE); - propNameLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); - propNameLabel.setText("Property Name:"); - - propNameComboViewer = new ComboViewer(container, SWT.NONE); - propNameComboViewer.getCombo().setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - propNameComboViewer.setContentProvider(ArrayContentProvider.getInstance()); - propNameComboViewer.setLabelProvider(new LabelProvider() { - @SuppressWarnings("unchecked") - @Override - public String getText(Object element) { - Map.Entry e = (Map.Entry)element; - return e.getKey()+" ("+e.getValue().name()+")"; - } - - }); - propNameComboViewer.addSelectionChangedListener(new ISelectionChangedListener() { - - @SuppressWarnings("unchecked") - @Override - public void selectionChanged(SelectionChangedEvent event) { - IStructuredSelection sel = event.getStructuredSelection(); - Map.Entry e = (Map.Entry)sel.getFirstElement(); - propName=e.getKey(); - propType=e.getValue(); - } - }); - propNameComboViewer.setInput(getEntries()); - propNameComboViewer.setSelection(new StructuredSelection(propNameComboViewer.getElementAt(0))); - - final Label propValueLabel = new Label(container, SWT.NONE); - propValueLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); - propValueLabel.setText("Property Value:"); - - propValueText = new Text(container, SWT.BORDER); - propValueText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - - return area; - } - - private List> getEntries() { - return propNames.entrySet().stream().sorted((e1,e2)->e1.getKey().compareTo(e2.getKey())).collect(Collectors.toList()); - } - - /** - * Create contents of the button bar. - * @param parent - */ - @Override - protected void createButtonsForButtonBar(Composite parent) { - final Button okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); - okButton.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/tick.png")); - final Button cancelButton = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); - cancelButton.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/cross.png")); - } - - protected void constrainShellSize() { - super.constrainShellSize(); - getShell().setMinimumSize(getShell().computeSize(-1, -1)); - - } - - @Override - protected void okPressed() { - propValue=propValueText.getText(); - super.okPressed(); - } - - public String getPropName() { - return propName; - } - - public DataType getPropType() { - return propType; - } - - public String getPropValue() { - return propValue; - } -} 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 b6c2af4..2a973eb 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 @@ -57,7 +57,7 @@ import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; -import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.e4.application.Messages; import com.minres.scviewer.e4.application.parts.txTableTree.AttributeLabelProvider; import com.minres.scviewer.e4.application.parts.txTableTree.AbstractTransactionTreeContentProvider; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java index dbad8f9..e69ba0f 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java @@ -1,6 +1,8 @@ package com.minres.scviewer.e4.application.parts; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -10,8 +12,6 @@ import org.eclipse.core.databinding.observable.list.WritableList; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; @@ -36,11 +36,13 @@ import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import com.minres.scviewer.database.DataType; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxAttribute; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.ITxEvent.Type; -import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.EventKind; +import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.WaveformType; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxAttribute; +import com.minres.scviewer.database.tx.ITxEvent; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.e4.application.parts.txTableTree.AbstractTransactionTreeContentProvider; import com.minres.scviewer.e4.application.parts.txTableTree.AttributeLabelProvider; @@ -84,7 +86,7 @@ public class TransactionList extends Composite { private AttributeLabelProvider valueLabelProvider = null; - private ITxStream stream; + private IWaveform stream; private ObservableList attrNames = new WritableList(); @@ -121,11 +123,14 @@ public class TransactionList extends Composite { searchPropComboViewer.setContentProvider(new ObservableListContentProvider()); searchPropComboViewer.setInput(attrNames); Combo searchPropCombo = searchPropComboViewer.getCombo(); - searchPropCombo.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1)); + GridData gd_searchProp = new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1); + gd_searchProp.widthHint=100; + searchPropCombo.setLayoutData(gd_searchProp); searchPropCombo.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { int idx = searchPropCombo.getSelectionIndex(); + if(idx<0) return; AttributeNameBean sel = attrNames.get(idx); txFilter.setSearchProp(sel.getName(), sel.getType()); tableViewer.refresh(); @@ -133,6 +138,7 @@ public class TransactionList extends Composite { @Override public void widgetDefaultSelected(SelectionEvent e) { int idx = searchPropCombo.getSelectionIndex(); + if(idx<0) return; AttributeNameBean sel = attrNames.get(idx); txFilter.setSearchProp(sel.getName(), sel.getType()); tableViewer.refresh(); @@ -166,11 +172,14 @@ public class TransactionList extends Composite { viewPropComboViewer.setContentProvider(new ObservableListContentProvider()); viewPropComboViewer.setInput(attrNames); Combo viewPropCombo = viewPropComboViewer.getCombo(); - viewPropCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); + GridData gd_viewProp = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_viewProp.widthHint=100; + viewPropCombo.setLayoutData(gd_viewProp); viewPropCombo.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { int idx = viewPropCombo.getSelectionIndex(); + if(idx<0) return; valueLabelProvider.setShowProp(attrNames.get(idx).getName()); tableViewer.refresh(true); } @@ -238,11 +247,11 @@ public class TransactionList extends Composite { } public void setInput(TrackEntry trackEntry) { - if(trackEntry==null || !trackEntry.isStream()) { + if(trackEntry==null || trackEntry.waveform.getType()!=WaveformType.TRANSACTION) { attrNames.clear(); tableViewer.setInput(emptyList); } else { - stream=trackEntry.getStream(); + stream=trackEntry.waveform; tableViewer.setInput(emptyList); new Thread() { private ConcurrentHashMap propNames=new ConcurrentHashMap(); @@ -255,11 +264,12 @@ public class TransactionList extends Composite { } public void run() { - eventList = stream.getEvents().values().parallelStream() + Collection values = stream.getEvents().values(); + eventList = values.parallelStream().map(Arrays::asList) .flatMap(List::stream) - .filter(evt -> evt.getType()==Type.BEGIN) + .filter(evt -> evt.getKind()==EventKind.BEGIN) .map(evt-> { - ITx tx = evt.getTransaction(); + ITx tx = ((ITxEvent)evt).getTransaction(); for(ITxAttribute attr: tx.getAttributes()) { propNames.put(attr.getName(), attr.getDataType()); } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformStyleProvider.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformStyleProvider.java new file mode 100644 index 0000000..b2f389f --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformStyleProvider.java @@ -0,0 +1,142 @@ +package com.minres.scviewer.e4.application.parts; + +import java.util.HashMap; + +import org.eclipse.core.runtime.preferences.DefaultScope; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.jface.resource.StringConverter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.wb.swt.SWTResourceManager; +import org.osgi.service.prefs.Preferences; + +import com.minres.scviewer.database.ui.IWaveformStyleProvider; +import com.minres.scviewer.database.ui.WaveformColors; +import com.minres.scviewer.e4.application.preferences.PreferenceConstants; + +public class WaveformStyleProvider implements IWaveformStyleProvider { + + private Composite parent; + + private Font nameFont; + + private Color[] colors = new Color[WaveformColors.values().length]; + + // list of random colors + private static Color[][] randomColors; + + private int trackHeigth=25; + + public WaveformStyleProvider() { + setupDefaults(); + } + + private void setupDefaults() { + Display display = Display.getCurrent(); + + nameFont = display.getSystemFont(); + colors[WaveformColors.LINE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[WaveformColors.LINE_HIGHLITE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_CYAN); + colors[WaveformColors.TRACK_BG_EVEN.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_BLACK); + colors[WaveformColors.TRACK_BG_ODD.ordinal()] = SWTResourceManager.getColor(40, 40, 40); + colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()] = SWTResourceManager.getColor(40, 40, 80); + colors[WaveformColors.TX_BG.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN); + colors[WaveformColors.TX_BG_HIGHLITE.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN); + colors[WaveformColors.TX_BORDER.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[WaveformColors.SIGNAL0.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN); + colors[WaveformColors.SIGNAL1.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GREEN); + colors[WaveformColors.SIGNALZ.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_YELLOW); + colors[WaveformColors.SIGNALX.ordinal()] = SWTResourceManager.getColor(255, 51, 51); + colors[WaveformColors.SIGNALU.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_YELLOW); + colors[WaveformColors.SIGNAL_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE); + colors[WaveformColors.SIGNAL_REAL.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_YELLOW); + colors[WaveformColors.SIGNAL_NAN.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[WaveformColors.CURSOR.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_RED); + colors[WaveformColors.CURSOR_DRAG.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GRAY); + colors[WaveformColors.CURSOR_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE); + colors[WaveformColors.MARKER.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY); + colors[WaveformColors.MARKER_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE); + colors[WaveformColors.REL_ARROW.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_MAGENTA); + colors[WaveformColors.REL_ARROW_HIGHLITE.ordinal()] = SWTResourceManager.getColor(255, 128, 255); + randomColors = new Color[][] { + { SWTResourceManager.getColor( 170, 66, 37 ), SWTResourceManager.getColor( 190, 66, 37 ) }, + { SWTResourceManager.getColor( 96, 74, 110 ), SWTResourceManager.getColor( 96, 74, 130 ) }, + { SWTResourceManager.getColor( 133, 105, 128 ), SWTResourceManager.getColor( 153, 105, 128 ) }, + { SWTResourceManager.getColor( 0, 126, 135 ), SWTResourceManager.getColor( 0, 126, 155 ) }, + { SWTResourceManager.getColor( 243, 146, 75 ), SWTResourceManager.getColor( 255, 146, 75 ) }, + { SWTResourceManager.getColor( 206, 135, 163 ), SWTResourceManager.getColor( 226, 135, 163 ) }, + { SWTResourceManager.getColor( 124, 103, 74 ), SWTResourceManager.getColor( 144, 103, 74 ) }, + { SWTResourceManager.getColor( 194, 187, 169 ), SWTResourceManager.getColor( 214, 187, 169 ) }, + { SWTResourceManager.getColor( 104, 73, 71 ), SWTResourceManager.getColor( 124, 73, 71 ) }, + { SWTResourceManager.getColor( 75, 196, 213 ), SWTResourceManager.getColor( 75, 196, 233 ) }, + { SWTResourceManager.getColor( 206, 232, 229 ), SWTResourceManager.getColor( 206, 252, 229 ) }, + { SWTResourceManager.getColor( 169, 221, 199 ), SWTResourceManager.getColor( 169, 241, 199 ) }, + { SWTResourceManager.getColor( 100, 165, 197 ), SWTResourceManager.getColor( 100, 165, 217 ) }, + { SWTResourceManager.getColor( 150, 147, 178 ), SWTResourceManager.getColor( 150, 147, 198 ) }, + { SWTResourceManager.getColor( 200, 222, 182 ), SWTResourceManager.getColor( 200, 242, 182 ) }, + { SWTResourceManager.getColor( 147, 208, 197 ), SWTResourceManager.getColor( 147, 228, 197 ) } + }; + } + + public WaveformStyleProvider(IEclipsePreferences store) { + setupDefaults(); + Preferences defaultPrefs= store.parent().parent().node("/"+DefaultScope.SCOPE+"/"+PreferenceConstants.PREFERENCES_SCOPE); + HashMap colorPref = new HashMap<>(); + for (WaveformColors c : WaveformColors.values()) { + String key = c.name() + "_COLOR"; + String prefValue = store.get(key, defaultPrefs.get(key, "")); //$NON-NLS-1$ + RGB rgb = StringConverter.asRGB(prefValue); + colorPref.put(c, rgb); + } + trackHeigth = store.getInt(PreferenceConstants.TRACK_HEIGHT, defaultPrefs.getInt(PreferenceConstants.TRACK_HEIGHT, 25)); //$NON-NLS-1$ + } + /** + * needs redraw() afterwards + * @param colourMap + */ + public void initColors(HashMap colourMap) { + Display d = parent.getDisplay(); + if (colourMap != null) { + for (WaveformColors c : WaveformColors.values()) { + if (colourMap.containsKey(c)) + colors[c.ordinal()] = new Color(d, colourMap.get(c)); + } + } + } + + @Override + public Font getNameFont() { + return nameFont; + } + + @Override + public Font getNameFontHighlite() { + return nameFont; + } + + @Override + public int getTrackHeight() { + return trackHeigth; + } + @Override + public Color getColor(WaveformColors type) { + return colors[type.ordinal()]; + } + + @Override + public Color[] computeColor (String streamValue) { + Color[] result = new Color[] {SWTResourceManager.getColor( 200,0,0), SWTResourceManager.getColor( 255,0,0)}; + // assign "random" color here, one name always results in the same color! + if( streamValue!=null && randomColors.length > 0 ) { + int index = Math.abs(streamValue.hashCode()) % randomColors.length; + result[0] = randomColors[index][0]; + result[1] = randomColors[index][1]; + } + return result; + } + +} 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 5846845..98bfa41 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 @@ -37,7 +37,6 @@ import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobGroup; -import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; @@ -55,15 +54,12 @@ import org.eclipse.e4.ui.services.EMenuService; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.modeling.ESelectionService; import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.resource.StringConverter; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CTabFolder; -import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; @@ -72,7 +68,6 @@ import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; @@ -85,24 +80,23 @@ import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Widget; -import org.osgi.service.prefs.Preferences; import com.minres.scviewer.database.DataType; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxAttribute; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.ITxRelation; +import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbFactory; import com.minres.scviewer.database.RelationType; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxAttribute; +import com.minres.scviewer.database.tx.ITxEvent; +import com.minres.scviewer.database.tx.ITxRelation; import com.minres.scviewer.database.ui.GotoDirection; import com.minres.scviewer.database.ui.ICursor; import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.TrackEntry.ValueDisplay; import com.minres.scviewer.database.ui.TrackEntry.WaveDisplay; -import com.minres.scviewer.database.ui.WaveformColors; import com.minres.scviewer.database.ui.swt.Constants; import com.minres.scviewer.database.ui.swt.ToolTipContentProvider; import com.minres.scviewer.database.ui.swt.ToolTipHelpTextProvider; @@ -302,7 +296,6 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis transactionList = ContextInjectionFactory.make(TransactionListView.class, ctx); waveformPane.setMaxTime(0); - setupColors(); //set selection to empty selection when opening a new waveformPane selectionService.setSelection(new StructuredSelection()); @@ -511,6 +504,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis return false; } }); + waveformPane.setStyleProvider(new WaveformStyleProvider(store)); } @Inject @@ -543,25 +537,9 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis @Override public void preferenceChange(PreferenceChangeEvent event) { if (!PreferenceConstants.DATABASE_RELOAD.equals(event.getKey()) && !PreferenceConstants.SHOW_HOVER.equals(event.getKey())){ - setupColors(); - } + waveformPane.setStyleProvider(new WaveformStyleProvider(store)); } } - /** - * Setup colors. - */ - protected void setupColors() { - Preferences defaultPrefs= store.parent().parent().node("/"+DefaultScope.SCOPE+"/"+PreferenceConstants.PREFERENCES_SCOPE); - HashMap colorPref = new HashMap<>(); - for (WaveformColors c : WaveformColors.values()) { - String key = c.name() + "_COLOR"; - String prefValue = store.get(key, defaultPrefs.get(key, "")); //$NON-NLS-1$ - RGB rgb = StringConverter.asRGB(prefValue); - colorPref.put(c, rgb); - } - waveformPane.setColors(colorPref); - } - class DbLoadJob extends Job { final File file; public DbLoadJob(String name, final File file) { @@ -790,7 +768,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis // get transaction id persistedState.put(SELECTED_TX_ID, Long.toString(tx.getId())); //get TrackEntry name - String name = te.getStream().getFullName(); + String name = te.waveform.getFullName(); persistedState.put(SELECTED_TRACKENTRY_NAME, name); } } @@ -823,7 +801,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis for (int i = 0; i < waves; i++) { IWaveform waveform = database.getStreamByName(state.get(SHOWN_WAVEFORM + i)); if (waveform != null) { - TrackEntry t = new TrackEntry(waveform); + TrackEntry t = waveformPane.addWaveform(waveform, -1); //check if t is selected boolean isSelected = Boolean.valueOf(state.get(SHOWN_WAVEFORM + i + WAVEFORM_SELECTED)); if(isSelected) { @@ -840,8 +818,6 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis t.waveDisplay=WaveDisplay.valueOf(s); } } - if (res.size() > 0) - waveformPane.getStreamList().addAll(res); Integer cursorLength = state.containsKey(SHOWN_CURSOR+"S")?Integer.parseInt(state.get(SHOWN_CURSOR + "S")):0; //$NON-NLS-1$ //$NON-NLS-2$ List cursors = waveformPane.getCursorList(); if (cursorLength == cursors.size()) { @@ -874,11 +850,11 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis if(te.waveform.getFullName().compareTo(trackentryName)==0) { boolean found = false; // TODO: find transaction by time? To avoid 3x for-loop - for( List lev : te.getStream().getEvents().values() ) { + for( IEvent[] lev : te.waveform.getEvents().values() ) { if(lev == null) continue; - for(ITxEvent itxe : lev) { - if(itxe == null) continue; - ITx itx = itxe.getTransaction(); + for(IEvent itxe : lev) { + if(itxe == null || !(itxe instanceof ITxEvent)) continue; + ITx itx = ((ITxEvent)itxe).getTransaction(); if(itx.getId() == txId) { found = true; ArrayList selectionList = new ArrayList(); @@ -1011,12 +987,10 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis * @param insert the insert */ public void addStreamsToList(IWaveform[] iWaveforms, boolean insert) { - List streams = new LinkedList<>(); - for (IWaveform stream : iWaveforms) - streams.add(new TrackEntry(stream)); IStructuredSelection selection = (IStructuredSelection) waveformPane.getSelection(); if (selection.size() == 0) { - waveformPane.getStreamList().addAll(streams); + for (IWaveform waveform : iWaveforms) + waveformPane.addWaveform(waveform, -1); } else { Object first = selection.getFirstElement(); if(first instanceof ITx) { @@ -1024,17 +998,21 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis TrackEntry trackEntry = waveformPane.getEntryForStream(stream); if (insert) { int index = waveformPane.getStreamList().indexOf(trackEntry); - waveformPane.getStreamList().addAll(index, streams); + for (IWaveform waveform : iWaveforms) + waveformPane.addWaveform(waveform, index++); } else { - waveformPane.getStreamList().addAll(streams); + for (IWaveform waveform : iWaveforms) + waveformPane.addWaveform(waveform, -1); } } else if(first instanceof TrackEntry) { TrackEntry trackEntry = (TrackEntry) first; if (insert) { int index = waveformPane.getStreamList().indexOf(trackEntry); - waveformPane.getStreamList().addAll(index, streams); + for (IWaveform waveform : iWaveforms) + waveformPane.addWaveform(waveform, index++); } else { - waveformPane.getStreamList().addAll(streams); + for (IWaveform waveform : iWaveforms) + waveformPane.addWaveform(waveform, -1); } } @@ -1115,7 +1093,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis boolean foundZoom=false; //try to find existing zoomlevel where scaleFactor*clientAreaWidth >= maxTime, if one is found set it as new zoomlevel - for (int level=0; level= maxTime) { @@ -1125,7 +1103,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis } } //if no zoom level is found, set biggest one available - if(!foundZoom) setZoomLevel(Constants.unitMultiplier.length*Constants.unitString.length-1); + if(!foundZoom) setZoomLevel(Constants.UNIT_MULTIPLIER.length*Constants.UNIT_STRING.length-1); updateAll(); } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AbstractTransactionTreeContentProvider.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AbstractTransactionTreeContentProvider.java index 9934945..ee9f230 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AbstractTransactionTreeContentProvider.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AbstractTransactionTreeContentProvider.java @@ -5,8 +5,8 @@ import java.util.Vector; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxRelation; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxRelation; import com.minres.scviewer.e4.application.Messages; import com.minres.scviewer.e4.application.parts.WaveformViewer; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AttributeLabelProvider.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AttributeLabelProvider.java index 6b20914..10e4b33 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AttributeLabelProvider.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AttributeLabelProvider.java @@ -8,9 +8,9 @@ import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; import com.minres.scviewer.database.DataType; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxAttribute; -import com.minres.scviewer.database.ITxRelation; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxAttribute; +import com.minres.scviewer.database.tx.ITxRelation; import com.minres.scviewer.e4.application.Messages; import com.minres.scviewer.e4.application.parts.WaveformViewer; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TransactionTreeNode.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TransactionTreeNode.java index d800104..4c1c17e 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TransactionTreeNode.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TransactionTreeNode.java @@ -5,7 +5,7 @@ import java.util.Map; import java.util.TreeMap; import java.util.stream.Collectors; -import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.e4.application.Messages; /** diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeFilter.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeFilter.java index aea24ee..54520ab 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeFilter.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeFilter.java @@ -5,7 +5,7 @@ import java.util.regex.PatternSyntaxException; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; -import com.minres.scviewer.database.ITxAttribute; +import com.minres.scviewer.database.tx.ITxAttribute; /** * The Class TxAttributeFilter. diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeViewerSorter.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeViewerSorter.java index 1b1dc4d..a7297e4 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeViewerSorter.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeViewerSorter.java @@ -3,7 +3,7 @@ package com.minres.scviewer.e4.application.parts.txTableTree; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; -import com.minres.scviewer.database.ITxAttribute; +import com.minres.scviewer.database.tx.ITxAttribute; /** * The Class TxAttributeViewerSorter. diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxFilter.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxFilter.java index 8b642b5..4cd613e 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxFilter.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxFilter.java @@ -11,8 +11,8 @@ import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import com.minres.scviewer.database.DataType; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxAttribute; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxAttribute; /** * The Class TxAttributeFilter. diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/DefaultValuesInitializer.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/DefaultValuesInitializer.java index 71f299c..e7c1e64 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/DefaultValuesInitializer.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/DefaultValuesInitializer.java @@ -68,6 +68,7 @@ public class DefaultValuesInitializer extends AbstractPreferenceInitializer { store.putBoolean(PreferenceConstants.DATABASE_RELOAD, true); store.putBoolean(PreferenceConstants.SHOW_HOVER, true); + store.putInt(PreferenceConstants.TRACK_HEIGHT, 30); for (WaveformColors c : WaveformColors.values()) { store.put(c.name()+"_COLOR", StringConverter.asString(colors[c.ordinal()].getRGB())); //$NON-NLS-1$ } 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 9a6d057..9146fe6 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 @@ -24,6 +24,9 @@ public class PreferenceConstants { /** The Constant DATABASE_RELOAD. */ public static final String SHOW_HOVER="showWaveformHover"; //$NON-NLS-1$ + /** The Constant TRACK_HEIGHT. */ + public static final String TRACK_HEIGHT="trackHeigth"; //$NON-NLS-1$ + /** The Constant LINE_COLOR. */ public static final String LINE_COLOR="LINE_COLOR"; //$NON-NLS-1$ diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/SCViewerPreferencesPage.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/SCViewerPreferencesPage.java index 25005e9..fe80cef 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/SCViewerPreferencesPage.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/preferences/SCViewerPreferencesPage.java @@ -12,6 +12,7 @@ package com.minres.scviewer.e4.application.preferences; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; +import org.eclipse.jface.preference.IntegerFieldEditor; import com.minres.scviewer.e4.application.Messages; @@ -38,6 +39,8 @@ public class SCViewerPreferencesPage extends FieldEditorPreferencePage { getFieldEditorParent())); addField(new BooleanFieldEditor(PreferenceConstants.SHOW_HOVER, Messages.SCViewerPreferencesPage_1, getFieldEditorParent())); + addField(new IntegerFieldEditor(PreferenceConstants.TRACK_HEIGHT, Messages.SCViewerPreferencesPage_2, + getFieldEditorParent())); } 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 9a9164f..a267de6 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 @@ -18,10 +18,8 @@ import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.swt.graphics.Image; import org.eclipse.wb.swt.ResourceManager; -import com.minres.scviewer.database.BitVector; import com.minres.scviewer.database.IHierNode; -import com.minres.scviewer.database.ISignal; -import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.e4.application.parts.LoadingWaveformDb; @@ -91,14 +89,21 @@ public class TxDbLabelProvider implements ILabelProvider { return loadinDatabase; else return database; - }else if(element instanceof ITxStream){ - return stream; - }else if(element instanceof ISignal){ - Object o = ((ISignal)element).getEvents().firstEntry().getValue(); - if(o instanceof BitVector && ((BitVector)o).getWidth()==1) - return signal; - else - return wave; + }else if(element instanceof IWaveform){ + switch(((IWaveform) element).getType()) { + case TRANSACTION: + return stream; + case FILTER: + break; + case SIGNAL: + if(((IWaveform) element).getWidth()==1) + return signal; + else + return wave; + default: + break; + } + return wave; }else if(element instanceof IHierNode){ return folder; } else diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxPropertiesContentProvider.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxPropertiesContentProvider.java index a04cf8c..d13b681 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxPropertiesContentProvider.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxPropertiesContentProvider.java @@ -18,8 +18,8 @@ import org.eclipse.jface.viewers.Viewer; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.minres.scviewer.database.IHierNode; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxAttribute; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxAttribute; /** * The Class TxPropertiesContentProvider. Not used atm diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxPropertiesLabelProvider.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxPropertiesLabelProvider.java index b6f068b..340f616 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxPropertiesLabelProvider.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxPropertiesLabelProvider.java @@ -17,7 +17,7 @@ import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.swt.graphics.Image; -import com.minres.scviewer.database.ITxAttribute; +import com.minres.scviewer.database.tx.ITxAttribute; import com.minres.scviewer.e4.application.parts.TransactionDetails; /** diff --git a/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF index fe01223..e823ab3 100644 --- a/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: SCViewer Bundle-SymbolicName: com.minres.scviewer.ui;singleton:=true -Bundle-Version: 1.0.1.qualifier +Bundle-Version: 1.1.0.qualifier Bundle-Activator: com.minres.scviewer.ui.TxEditorPlugin Bundle-Vendor: MINRES Technologies GmbH Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", diff --git a/plugins/com.minres.scviewer.ui/plugin.xml b/plugins/com.minres.scviewer.ui/plugin.xml index c924485..ca5912b 100644 --- a/plugins/com.minres.scviewer.ui/plugin.xml +++ b/plugins/com.minres.scviewer.ui/plugin.xml @@ -67,7 +67,7 @@ id="com.minres.scviewer.ui.propertySectionAll" tab="com.minres.scviewer.ui.propertyTabTransaction"> + type="com.minres.scviewer.database.tx.ITx"> + type="com.minres.scviewer.database.tx.ITx"> + type="com.minres.scviewer.database.tx.ITx"> @@ -93,7 +93,7 @@ @@ -465,7 +465,7 @@ - + diff --git a/plugins/com.minres.scviewer.ui/pom.xml b/plugins/com.minres.scviewer.ui/pom.xml index d932c0a..da96cae 100644 --- a/plugins/com.minres.scviewer.ui/pom.xml +++ b/plugins/com.minres.scviewer.ui/pom.xml @@ -8,5 +8,5 @@ ../.. eclipse-plugin - 1.0.1-SNAPSHOT + 1.1.0-SNAPSHOT diff --git a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPart.java b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPart.java index a7dbfb8..fbcca4f 100644 --- a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPart.java +++ b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPart.java @@ -16,7 +16,6 @@ import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -78,7 +77,7 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage public static final String WAVE_ACTION_ID = "com.minres.scviewer.ui.action.AddToWave"; - private IWaveformView txDisplay; + private IWaveformView waveformView; /** This is the root of the editor's model. */ private IWaveformDb database; @@ -106,23 +105,23 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage myParent.getDisplay().syncExec(new Runnable() { @Override public void run() { - txDisplay.setMaxTime(database.getMaxTime()); + waveformView.setMaxTime(database.getMaxTime()); } }); } } }); WaveformViewFactory factory = new WaveformViewFactory(); - txDisplay = factory.createPanel(parent); - txDisplay.setMaxTime(0); - txDisplay.addPropertyChangeListener(IWaveformView.CURSOR_PROPERTY, new PropertyChangeListener() { + waveformView = factory.createPanel(parent); + waveformView.setMaxTime(0); + waveformView.addPropertyChangeListener(IWaveformView.CURSOR_PROPERTY, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { Long time = (Long) evt.getNewValue(); cursorStatusLineItem.setText("Cursor: "+ time/1000000+"ns"); } }); - getSite().setSelectionProvider(txDisplay); + getSite().setSelectionProvider(waveformView); new Thread(new Runnable() { @Override public void run() { @@ -133,8 +132,8 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage } } }).run(); - zoomStatusLineItem.setText("Zoom level: "+zoomLevel[txDisplay.getZoomLevel()]); - cursorStatusLineItem.setText("Cursor: "+ txDisplay.getCursorTime()/1000000+"ns"); + zoomStatusLineItem.setText("Zoom level: "+zoomLevel[waveformView.getZoomLevel()]); + cursorStatusLineItem.setText("Cursor: "+ waveformView.getCursorTime()/1000000+"ns"); MenuManager menuMgr = new MenuManager("#PopupMenu"); // menuMgr.setRemoveAllWhenShown(true); // menuMgr.addMenuListener(new IMenuListener() { @@ -142,9 +141,9 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage // fillContextMenu(manager); // } // }); - Menu menu = menuMgr.createContextMenu(txDisplay.getControl()); - txDisplay.getControl().setMenu(menu); - getSite().registerContextMenu(menuMgr, txDisplay); + Menu menu = menuMgr.createContextMenu(waveformView.getControl()); + waveformView.getControl().setMenu(menu); + getSite().registerContextMenu(menuMgr, waveformView); } @@ -204,7 +203,7 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage pm.beginTask("Loading database "+files[0].getName(), files.length); try { database.load(files[0]); - database.addPropertyChangeListener(txDisplay); + database.addPropertyChangeListener(waveformView); pm.worked(1); if(pm.isCanceled()) return; if(files.length==2){ @@ -236,16 +235,14 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage } protected void updateTxDisplay() { - txDisplay.setMaxTime(database.getMaxTime()); + waveformView.setMaxTime(database.getMaxTime()); if(TxEditorPart.this.getEditorInput() instanceof TxEditorInput && ((TxEditorInput) TxEditorPart.this.getEditorInput()).getStreamNames().size()>0){ - LinkedList entries= new LinkedList<>(); for(String streamName:((TxEditorInput) TxEditorPart.this.getEditorInput()).getStreamNames()){ - IWaveform stream = database.getStreamByName(streamName); - if(stream!=null) - entries.add(new TrackEntry(stream)); + IWaveform waveform = database.getStreamByName(streamName); + if(waveform!=null) + waveformView.addWaveform(waveform, -1); } - txDisplay.getStreamList().addAll(entries); } } @@ -335,9 +332,9 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage public void addStreamToList(IWaveform obj){ if(getEditorInput() instanceof TxEditorInput && !((TxEditorInput) getEditorInput()).getStreamNames().contains(obj.getFullName())){ ((TxEditorInput) getEditorInput()).getStreamNames().add(obj.getFullName()); - txDisplay.getStreamList().add(new TrackEntry(obj)); + waveformView.addWaveform(obj, -1); } else - txDisplay.getStreamList().add(new TrackEntry(obj)); + waveformView.addWaveform(obj, -1); } @@ -351,13 +348,13 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage ((TxEditorInput) getEditorInput()).getStreamNames().remove(waveform.getFullName()); } TrackEntry entry=null; - for(TrackEntry e:txDisplay.getStreamList()) { + for(TrackEntry e:waveformView.getStreamList()) { if(e.waveform==waveform) { entry=e; break; } } - txDisplay.getStreamList().remove(entry); + waveformView.getStreamList().remove(entry); } public void removeStreamsFromList(IWaveform[] iWaveforms){ @@ -366,20 +363,20 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage } public List getStreamList(){ - return txDisplay.getStreamList(); + return waveformView.getStreamList(); } public void setSelection(final ISelection selection){ myParent.getDisplay().asyncExec(new Runnable() { @Override public void run() { - txDisplay.setSelection(selection); + waveformView.setSelection(selection); } }); } public ISelection getSelection(){ - return txDisplay.getSelection(); + return waveformView.getSelection(); } @Override @@ -388,19 +385,19 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage } public void moveSelection(GotoDirection next) { - txDisplay.moveSelection( next); + waveformView.moveSelection( next); } public void setZoomLevel(Integer level) { - txDisplay.setZoomLevel(level); + waveformView.setZoomLevel(level); } public void setZoomFit() { - txDisplay.setZoomLevel(6); + waveformView.setZoomLevel(6); } public int getZoomLevel() { - return txDisplay.getZoomLevel(); + return waveformView.getZoomLevel(); } public void removeSelected() { diff --git a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/adapter/ITransactionPropertySource.java b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/adapter/ITransactionPropertySource.java index a24f978..450be66 100644 --- a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/adapter/ITransactionPropertySource.java +++ b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/adapter/ITransactionPropertySource.java @@ -16,7 +16,7 @@ import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.ui.views.properties.IPropertySource; import org.eclipse.ui.views.properties.PropertyDescriptor; -import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.tx.ITx; public class ITransactionPropertySource implements IPropertySource { diff --git a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/adapter/TxAdapterFactory.java b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/adapter/TxAdapterFactory.java index d4c59aa..383dd77 100644 --- a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/adapter/TxAdapterFactory.java +++ b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/adapter/TxAdapterFactory.java @@ -13,7 +13,7 @@ package com.minres.scviewer.ui.adapter; import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.ui.views.properties.IPropertySource; -import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.tx.ITx; public class TxAdapterFactory implements IAdapterFactory { diff --git a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/provider/TxDbTreeLabelProvider.java b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/provider/TxDbTreeLabelProvider.java index 80fc416..359005b 100644 --- a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/provider/TxDbTreeLabelProvider.java +++ b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/provider/TxDbTreeLabelProvider.java @@ -17,10 +17,9 @@ import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.swt.graphics.Image; -import com.minres.scviewer.database.ISignal; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IHierNode; -import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.ui.TxEditorPlugin; public class TxDbTreeLabelProvider implements ILabelProvider { @@ -31,7 +30,8 @@ public class TxDbTreeLabelProvider implements ILabelProvider { private Image stream; private Image signal; private Image folder; - + private Image wave; + public TxDbTreeLabelProvider() { super(); @@ -39,6 +39,8 @@ public class TxDbTreeLabelProvider implements ILabelProvider { stream=TxEditorPlugin.createImage("stream"); folder=TxEditorPlugin.createImage("folder"); signal=TxEditorPlugin.createImage("signal"); + wave=TxEditorPlugin.createImage("wave"); + } @Override @@ -68,10 +70,21 @@ public class TxDbTreeLabelProvider implements ILabelProvider { public Image getImage(Object element) { if(element instanceof IWaveformDb){ return database; - }else if(element instanceof ITxStream){ - return stream; - }else if(element instanceof ISignal){ - return signal; + }else if(element instanceof IWaveform){ + switch(((IWaveform) element).getType()) { + case TRANSACTION: + return stream; + case FILTER: + break; + case SIGNAL: + if(((IWaveform) element).getWidth()==1) + return signal; + else + return wave; + default: + break; + } + return wave; }else if(element instanceof IHierNode){ return folder; } else diff --git a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/AttributeProperty.java b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/AttributeProperty.java index 703ed20..72f2c44 100644 --- a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/AttributeProperty.java +++ b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/AttributeProperty.java @@ -45,8 +45,8 @@ import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; import com.minres.scviewer.database.AssociationType; import com.minres.scviewer.database.DataType; -import com.minres.scviewer.database.ITxAttribute; -import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxAttribute; public class AttributeProperty extends AbstractPropertySection implements ISelectionProvider { diff --git a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/RelatedProperty.java b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/RelatedProperty.java index c98f83c..c8ce08b 100644 --- a/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/RelatedProperty.java +++ b/plugins/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/RelatedProperty.java @@ -48,8 +48,8 @@ import org.eclipse.ui.PlatformUI; import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxRelation; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxRelation; public class RelatedProperty extends AbstractPropertySection implements ISelectionProvider, ISelectionChangedListener { 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 8c90a63..882f7db 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 @@ -25,15 +25,14 @@ import org.junit.Test; import com.minres.scviewer.database.AssociationType; import com.minres.scviewer.database.DataType; -import com.minres.scviewer.database.ISignal; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxAttribute; -import com.minres.scviewer.database.ITxEvent; -import com.minres.scviewer.database.ITxEvent.Type; -import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.EventKind; +import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbFactory; +import com.minres.scviewer.database.tx.ITx; +import com.minres.scviewer.database.tx.ITxAttribute; +import com.minres.scviewer.database.tx.ITxEvent; public class DatabaseServicesTest { @@ -71,13 +70,11 @@ public class DatabaseServicesTest { assertEquals(14, waves.size()); assertEquals(2, waveformDb.getChildNodes().size()); IWaveform bus_data_wave = waves.get(0); - ISignal bus_data_sig = (ISignal) bus_data_wave; - Entry bus_data_entry = bus_data_sig.getEvents().floorEntry(1400000000L); - assertTrue("01111000".equals(bus_data_entry.getValue().toString())); + Entry bus_data_entry = bus_data_wave.getEvents().floorEntry(1400000000L); + assertTrue("01111000".equals(bus_data_entry.getValue()[0].toString())); IWaveform rw_wave = waves.get(2); - ISignal rw_sig = (ISignal) rw_wave; - Entry rw_entry = rw_sig.getEvents().floorEntry(2360000000L); - assertTrue("1".equals(rw_entry.getValue().toString())); + Entry rw_entry = rw_wave.getEvents().floorEntry(2360000000L); + assertTrue("1".equals(rw_entry.getValue()[0].toString())); } @Test @@ -119,19 +116,17 @@ public class DatabaseServicesTest { assertEquals(1, waveformDb.getChildNodes().size()); List waves = waveformDb.getAllWaves(); assertEquals(3, waves.size()); - IWaveform wave = waves.get(0); - assertTrue(wave instanceof ITxStream); - ITxStream stream = (ITxStream) wave; - assertEquals(2, stream.getGenerators().size()); - NavigableMap> eventsList = stream.getEvents(); + IWaveform stream = waves.get(0); + NavigableMap eventsList = stream.getEvents(); assertEquals(27, eventsList.size()); - Entry> eventEntry = eventsList.firstEntry(); + Entry eventEntry = eventsList.firstEntry(); assertEquals(100000000L, (long) eventEntry.getKey()); - List events = eventEntry.getValue(); - assertEquals(1, events.size()); - ITxEvent event = events.get(0); - assertEquals(Type.BEGIN, event.getType()); - ITx tx = event.getTransaction(); + IEvent[] events = eventEntry.getValue(); + assertEquals(1, events.length); + IEvent event = events[0]; + assertEquals(EventKind.BEGIN, event.getKind()); + assertTrue(event instanceof ITxEvent); + ITx tx = ((ITxEvent)event).getTransaction(); assertEquals(3L, (long) tx.getId()); List attrs = tx.getAttributes(); assertEquals(1, attrs.size());