Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7360fcea2c | |||
| f763ee842e | |||
| fadfec46ab | |||
| 2ff69be4f8 | |||
| af7eef7fd3 | |||
| 4209f5dc5a | |||
| de40522533 | |||
| c57bf22bbb | |||
| 567b01b80d | |||
| 4a8424634b | |||
| e342a2de4f | |||
| 2d61095f90 | |||
| b24e6cd060 | |||
| 247d7a768d | |||
| 2db2e9cc2d | |||
| 3fb6da5306 |
+1
-5
@@ -1,5 +1 @@
|
|||||||
/.metadata/
|
/.project
|
||||||
/.graph-browser/
|
|
||||||
/.recommenders/
|
|
||||||
/RemoteSystemsTempFiles/
|
|
||||||
/*.zip
|
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
SCViewer
|
|
||||||
========
|
|
||||||
|
|
||||||
SCViewer is composed of a set of eclipse plugins to display VCD and transaction streams
|
|
||||||
created by the SystemC VCD trace implementation and the SystemC Verification Library (SCV).
|
|
||||||
For further description of the SCV please refer to
|
|
||||||
http://www.accellera.org/activities/committees/systemc-verification.
|
|
||||||
|
|
||||||
The viewer is in early alpha stage and not yet ready for production use!
|
|
||||||
|
|
||||||
The plugins are structured as follows:
|
|
||||||
- com.minres.scviewer.database
|
|
||||||
the interface defining the API to access the database and the implementation for VCD
|
|
||||||
- com.minres.scviewer.database.text
|
|
||||||
an implementation of the API to read the text files generated by the SCV
|
|
||||||
sc_tr_text database
|
|
||||||
- com.minres.scviewer.database.sqlite
|
|
||||||
an implementation of the API to read the files generated by implementation in the
|
|
||||||
sc_tr_sqlite project using a SQLite based database
|
|
||||||
- com.minres.scviewer.database.test
|
|
||||||
a some JUnit tests of the 3 back ends
|
|
||||||
- com.minres.scviewer.ui
|
|
||||||
the viewer it self to diplay the transactions and associated views like the
|
|
||||||
outline of the DB and the properties of the transaction
|
|
||||||
- com.minres.scviewer.feature
|
|
||||||
the feature combining the plugins above into a somhow usable form
|
|
||||||
- scv_tr_sqlite
|
|
||||||
a C++ project containing the SQLite based SCV database implementation. A simple
|
|
||||||
example (scv_tr_recording_example.cpp) for testig purposes is provided.
|
|
||||||
|
|
||||||
To build the plugins the Eclipse SDK or PDE can be used. In both cases the Groovy
|
|
||||||
eclipse plugin (http://groovy.codehaus.org/Eclipse+Plugin or Market) has to be
|
|
||||||
installed.
|
|
||||||
|
|
||||||
TODO
|
|
||||||
====
|
|
||||||
- refactor the graphical viewer (again)
|
|
||||||
- add more tests
|
|
||||||
- additional analysis means
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
theme: jekyll-theme-minimal
|
||||||
|
logo: /assets/img/SCViewer_logo.png
|
||||||
|
title: SCViewer
|
||||||
|
description: A a simple tool to display waveforms
|
||||||
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
|
||||||
<classpathentry kind="src" path="src"/>
|
|
||||||
<classpathentry exported="true" kind="lib" path="sqlite-jdbc-3.8.7.jar"/>
|
|
||||||
<classpathentry kind="output" path="target/classes"/>
|
|
||||||
</classpath>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
/bin/
|
|
||||||
/target/
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>com.minres.scviewer.database.sqlite</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.ManifestBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.SchemaBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.ds.core.builder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
|
||||||
<nature>org.eclipse.pde.PluginNature</nature>
|
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
encoding/<project>=UTF-8
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.7
|
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.source=1.7
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
activeProfiles=
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
resolveWorkspaceProjects=true
|
|
||||||
version=1
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
pluginProject.extensions=false
|
|
||||||
resolve.requirebundle=false
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
Manifest-Version: 1.0
|
|
||||||
Bundle-ManifestVersion: 2
|
|
||||||
Bundle-Name: SQLite transaction database
|
|
||||||
Bundle-SymbolicName: com.minres.scviewer.database.sqlite
|
|
||||||
Bundle-Version: 1.0.0.qualifier
|
|
||||||
Bundle-Vendor: MINRES Technologies GmbH
|
|
||||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
|
||||||
Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0",
|
|
||||||
org.eclipse.equinox.util;bundle-version="1.0.500",
|
|
||||||
org.eclipse.equinox.ds;bundle-version="1.4.200",
|
|
||||||
org.eclipse.osgi.services;bundle-version="3.4.0"
|
|
||||||
Bundle-ClassPath: .,sqlite-jdbc-3.8.7.jar
|
|
||||||
Service-Component: OSGI-INF/component.xml
|
|
||||||
Bundle-ActivationPolicy: lazy
|
|
||||||
Embed-Dependency: sqlite-jdbc
|
|
||||||
Embedded-Artifacts: sqlite-jdbc-3.8.7.jar;g="org.xerial";
|
|
||||||
a="sqlite-jdbc";v="3.8.7"
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="SQLiteDbLoader">
|
|
||||||
<implementation class="com.minres.scviewer.database.sqlite.SQLiteDbLoader"/>
|
|
||||||
<service>
|
|
||||||
<provide interface="com.minres.scviewer.database.IWaveformDbLoader"/>
|
|
||||||
</service>
|
|
||||||
</scr:component>
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
###############################################################################
|
|
||||||
# Copyright (c) 2014, 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
|
|
||||||
###############################################################################
|
|
||||||
source.. = src/
|
|
||||||
bin.includes = META-INF/,\
|
|
||||||
.,\
|
|
||||||
sqlite-jdbc-3.8.7.jar,\
|
|
||||||
OSGI-INF/
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<artifactId>com.minres.scviewer.database.sqlite</artifactId>
|
|
||||||
<parent>
|
|
||||||
<groupId>com.minres.scviewer</groupId>
|
|
||||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../com.minres.scviewer.parent</relativePath>
|
|
||||||
</parent>
|
|
||||||
<packaging>eclipse-plugin</packaging>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.xerial</groupId>
|
|
||||||
<artifactId>sqlite-jdbc</artifactId>
|
|
||||||
<version>3.8.7</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
-113
@@ -1,113 +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.sqlite;
|
|
||||||
|
|
||||||
import java.beans.IntrospectionException;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
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.IWaveformEvent;
|
|
||||||
import com.minres.scviewer.database.RelationType;
|
|
||||||
import com.minres.scviewer.database.sqlite.db.IDatabase;
|
|
||||||
import com.minres.scviewer.database.sqlite.db.SQLiteDatabase;
|
|
||||||
import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler;
|
|
||||||
import com.minres.scviewer.database.sqlite.tables.ScvSimProps;
|
|
||||||
import com.minres.scviewer.database.sqlite.tables.ScvStream;
|
|
||||||
import com.minres.scviewer.database.sqlite.tables.ScvTxEvent;
|
|
||||||
|
|
||||||
public class SQLiteDbLoader implements IWaveformDbLoader {
|
|
||||||
|
|
||||||
protected IDatabase database;
|
|
||||||
|
|
||||||
private List<RelationType> usedRelationsList = new ArrayList<>();
|
|
||||||
|
|
||||||
private IWaveformDb db;
|
|
||||||
|
|
||||||
private ScvSimProps scvSimProps;
|
|
||||||
|
|
||||||
public SQLiteDbLoader() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getMaxTime() {
|
|
||||||
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<ScvTxEvent>(ScvTxEvent.class,
|
|
||||||
database, "time = (SELECT MAX(time) FROM ScvTxEvent)");
|
|
||||||
try {
|
|
||||||
List<ScvTxEvent> event = handler.selectObjects();
|
|
||||||
if(event.size()>0)
|
|
||||||
return event.get(0).getTime()*scvSimProps.getTime_resolution();
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return 0L;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<IWaveform<? extends IWaveformEvent>> getAllWaves() {
|
|
||||||
SQLiteDatabaseSelectHandler<ScvStream> handler = new SQLiteDatabaseSelectHandler<ScvStream>(ScvStream.class, database);
|
|
||||||
List<IWaveform<? extends IWaveformEvent>> streams=new ArrayList<IWaveform<? extends IWaveformEvent>>();
|
|
||||||
try {
|
|
||||||
for(ScvStream scvStream:handler.selectObjects()){
|
|
||||||
TxStream stream = new TxStream(database, db, scvStream);
|
|
||||||
stream.setRelationTypeList(usedRelationsList);
|
|
||||||
streams.add(stream);
|
|
||||||
}
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
}
|
|
||||||
return streams;
|
|
||||||
}
|
|
||||||
|
|
||||||
private byte[] x = "SQLite format 3".getBytes();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean load(IWaveformDb db, File file) throws Exception {
|
|
||||||
this.db=db;
|
|
||||||
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;
|
|
||||||
|
|
||||||
database=new SQLiteDatabase(file.getAbsolutePath());
|
|
||||||
database.setData("TIMERESOLUTION", 1L);
|
|
||||||
SQLiteDatabaseSelectHandler<ScvSimProps> handler = new SQLiteDatabaseSelectHandler<ScvSimProps>(ScvSimProps.class, database);
|
|
||||||
try {
|
|
||||||
for(ScvSimProps simProps:handler.selectObjects()){
|
|
||||||
scvSimProps=simProps;
|
|
||||||
database.setData("TIMERESOLUTION", scvSimProps.getTime_resolution());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<RelationType> getAllRelationTypes(){
|
|
||||||
return usedRelationsList;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,193 +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.sqlite;
|
|
||||||
|
|
||||||
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 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.sqlite.db.IDatabase;
|
|
||||||
import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler;
|
|
||||||
import com.minres.scviewer.database.sqlite.tables.ScvStream;
|
|
||||||
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;
|
|
||||||
|
|
||||||
public class Tx implements ITx {
|
|
||||||
|
|
||||||
private IDatabase database;
|
|
||||||
private TxStream trStream;
|
|
||||||
private TxGenerator trGenerator;
|
|
||||||
private ScvTx scvTx;
|
|
||||||
private List<ITxAttribute> attributes;
|
|
||||||
private Long begin, end;
|
|
||||||
private List<ITxRelation> incoming, outgoing;
|
|
||||||
|
|
||||||
public Tx(IDatabase database, TxStream trStream, TxGenerator trGenerator, ScvTx scvTx) {
|
|
||||||
this.database=database;
|
|
||||||
this.trStream=trStream;
|
|
||||||
this.trGenerator=trGenerator;
|
|
||||||
this.scvTx=scvTx;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getId() {
|
|
||||||
return (long) scvTx.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ITxStream<ITxEvent> getStream() {
|
|
||||||
return trStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ITxGenerator getGenerator() {
|
|
||||||
return trGenerator;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getConcurrencyIndex() {
|
|
||||||
return scvTx.getConcurrencyLevel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getBeginTime() {
|
|
||||||
if(begin==null){
|
|
||||||
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<ScvTxEvent>(ScvTxEvent.class,
|
|
||||||
database, "tx="+scvTx.getId()+" AND type="+ AssociationType.BEGIN.ordinal());
|
|
||||||
try {
|
|
||||||
for(ScvTxEvent scvEvent:handler.selectObjects()){
|
|
||||||
begin= scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION");
|
|
||||||
}
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return begin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getEndTime() {
|
|
||||||
if(end==null){
|
|
||||||
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<ScvTxEvent>(ScvTxEvent.class,
|
|
||||||
database, "tx="+scvTx.getId()+" AND type="+ AssociationType.END.ordinal());
|
|
||||||
try {
|
|
||||||
for(ScvTxEvent scvEvent:handler.selectObjects()){
|
|
||||||
end = scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION");
|
|
||||||
}
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return end;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<ITxAttribute> getAttributes() {
|
|
||||||
if(attributes==null){
|
|
||||||
SQLiteDatabaseSelectHandler<ScvTxAttribute> handler = new SQLiteDatabaseSelectHandler<ScvTxAttribute>(
|
|
||||||
ScvTxAttribute.class, database, "tx="+scvTx.getId());
|
|
||||||
try {
|
|
||||||
attributes = new ArrayList<ITxAttribute>();
|
|
||||||
for(ScvTxAttribute scvAttribute:handler.selectObjects()){
|
|
||||||
attributes.add(new TxAttribute(this, scvAttribute));
|
|
||||||
|
|
||||||
}
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return attributes;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<ITxRelation> getIncomingRelations() {
|
|
||||||
if(incoming==null){
|
|
||||||
SQLiteDatabaseSelectHandler<ScvTxRelation> handler = new SQLiteDatabaseSelectHandler<ScvTxRelation>(
|
|
||||||
ScvTxRelation.class, database, "sink="+scvTx.getId());
|
|
||||||
try {
|
|
||||||
incoming = new ArrayList<ITxRelation>();
|
|
||||||
for(ScvTxRelation scvRelation:handler.selectObjects()){
|
|
||||||
incoming.add(createRelation(scvRelation, false));
|
|
||||||
}
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return incoming;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<ITxRelation> getOutgoingRelations() {
|
|
||||||
if(outgoing==null){
|
|
||||||
SQLiteDatabaseSelectHandler<ScvTxRelation> handler = new SQLiteDatabaseSelectHandler<ScvTxRelation>(
|
|
||||||
ScvTxRelation.class, database, "src="+scvTx.getId());
|
|
||||||
try {
|
|
||||||
outgoing = new ArrayList<ITxRelation>();
|
|
||||||
for(ScvTxRelation scvRelation:handler.selectObjects()){
|
|
||||||
outgoing.add(createRelation(scvRelation, true));
|
|
||||||
}
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return outgoing;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ITxRelation createRelation(ScvTxRelation rel, boolean outgoing) {
|
|
||||||
int otherId = outgoing?rel.getSink():rel.getSrc();
|
|
||||||
SQLiteDatabaseSelectHandler<ScvTx> handler = new SQLiteDatabaseSelectHandler<ScvTx>(ScvTx.class, database,
|
|
||||||
"id="+otherId);
|
|
||||||
try {
|
|
||||||
List<ScvTx> res = handler.selectObjects();
|
|
||||||
if(res.size()!=1) return null;
|
|
||||||
List<ScvStream> streams = new SQLiteDatabaseSelectHandler<ScvStream>(ScvStream.class, database,
|
|
||||||
"id="+res.get(0).getStream()).selectObjects();
|
|
||||||
if(streams.size()!=1) return null;
|
|
||||||
TxStream tgtStream = (TxStream) trStream.getDb().getStreamByName(streams.get(0).getName());
|
|
||||||
Tx that = (Tx) tgtStream.getTransactions().get(otherId);
|
|
||||||
if(outgoing)
|
|
||||||
return new TxRelation(trStream.getRelationType(rel.getName()), this, that);
|
|
||||||
else
|
|
||||||
return new TxRelation(trStream.getRelationType(rel.getName()), that, this);
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(ITx o) {
|
|
||||||
int res = this.getBeginTime().compareTo(o.getBeginTime());
|
|
||||||
if(res!=0)
|
|
||||||
return res;
|
|
||||||
else
|
|
||||||
return this.getId().compareTo(o.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "tx#"+getId()+"["+getBeginTime()/1000000+"ns - "+getEndTime()/1000000+"ns]";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-48
@@ -1,48 +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.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;
|
|
||||||
|
|
||||||
public class TxAttribute implements ITxAttribute{
|
|
||||||
|
|
||||||
Tx trTransaction;
|
|
||||||
ScvTxAttribute scvAttribute;
|
|
||||||
|
|
||||||
public TxAttribute(Tx trTransaction, ScvTxAttribute scvAttribute) {
|
|
||||||
this.trTransaction=trTransaction;
|
|
||||||
this.scvAttribute=scvAttribute;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return scvAttribute.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DataType getDataType() {
|
|
||||||
return DataType.values()[scvAttribute.getData_type()];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AssociationType getType() {
|
|
||||||
return AssociationType.values()[scvAttribute.getType()];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getValue() {
|
|
||||||
return scvAttribute.getData_value();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-57
@@ -1,57 +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.sqlite;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.ITx;
|
|
||||||
import com.minres.scviewer.database.ITxEvent;
|
|
||||||
import com.minres.scviewer.database.IWaveformEvent;
|
|
||||||
|
|
||||||
public class TxEvent implements ITxEvent {
|
|
||||||
|
|
||||||
private final Type type;
|
|
||||||
private ITx tx;
|
|
||||||
|
|
||||||
public TxEvent(Type type, ITx tx) {
|
|
||||||
super();
|
|
||||||
this.type = type;
|
|
||||||
this.tx = tx;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getTime() {
|
|
||||||
return type==Type.BEGIN?tx.getBeginTime():tx.getEndTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IWaveformEvent 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() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return type.toString()+"@"+getTime()+" of tx #"+tx.getId();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-52
@@ -1,52 +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.sqlite;
|
|
||||||
|
|
||||||
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.sqlite.tables.ScvGenerator;
|
|
||||||
|
|
||||||
public class TxGenerator implements ITxGenerator {
|
|
||||||
|
|
||||||
private ITxStream<ITxEvent> stream;
|
|
||||||
|
|
||||||
private ScvGenerator scvGenerator;
|
|
||||||
|
|
||||||
public TxGenerator(ITxStream<ITxEvent> stream, ScvGenerator scvGenerator) {
|
|
||||||
this.stream=stream;
|
|
||||||
this.scvGenerator=scvGenerator;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getId() {
|
|
||||||
return (long) scvGenerator.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ITxStream<ITxEvent> getStream() {
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return scvGenerator.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<ITx> getTransactions() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-43
@@ -1,43 +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.sqlite;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.ITxRelation;
|
|
||||||
import com.minres.scviewer.database.ITx;
|
|
||||||
import com.minres.scviewer.database.RelationType;
|
|
||||||
|
|
||||||
public class TxRelation implements ITxRelation {
|
|
||||||
|
|
||||||
RelationType relationType;
|
|
||||||
Tx source, target;
|
|
||||||
|
|
||||||
public TxRelation(RelationType relationType, Tx source, Tx target) {
|
|
||||||
this.source = source;
|
|
||||||
this.target = target;
|
|
||||||
this.relationType = relationType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RelationType getRelationType() {
|
|
||||||
return relationType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ITx getSource() {
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ITx getTarget() {
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-199
@@ -1,199 +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.sqlite;
|
|
||||||
|
|
||||||
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.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.IWaveform;
|
|
||||||
import com.minres.scviewer.database.IWaveformDb;
|
|
||||||
import com.minres.scviewer.database.IWaveformEvent;
|
|
||||||
import com.minres.scviewer.database.RelationType;
|
|
||||||
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;
|
|
||||||
|
|
||||||
public class TxStream extends HierNode implements ITxStream<ITxEvent> {
|
|
||||||
|
|
||||||
private IDatabase database;
|
|
||||||
|
|
||||||
private String fullName;
|
|
||||||
|
|
||||||
private IWaveformDb db;
|
|
||||||
|
|
||||||
private ScvStream scvStream;
|
|
||||||
|
|
||||||
private TreeMap<Integer, TxGenerator> generators;
|
|
||||||
|
|
||||||
private TreeMap<Integer, ITx> transactions;
|
|
||||||
|
|
||||||
private Integer maxConcurrency;
|
|
||||||
|
|
||||||
private TreeMap<Long, List<ITxEvent>> events;
|
|
||||||
|
|
||||||
private List<RelationType> usedRelationsList;
|
|
||||||
|
|
||||||
public TxStream(IDatabase database, IWaveformDb waveformDb, ScvStream scvStream) {
|
|
||||||
super(scvStream.getName());
|
|
||||||
this.database=database;
|
|
||||||
fullName=scvStream.getName();
|
|
||||||
this.scvStream=scvStream;
|
|
||||||
db=waveformDb;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IWaveformDb getDb() {
|
|
||||||
return db;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getFullName() {
|
|
||||||
return fullName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getId() {
|
|
||||||
return (long) scvStream.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getKind() {
|
|
||||||
return scvStream.getKind();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<ITxGenerator> getGenerators() {
|
|
||||||
if(generators==null){
|
|
||||||
SQLiteDatabaseSelectHandler<ScvGenerator> handler = new SQLiteDatabaseSelectHandler<ScvGenerator>(
|
|
||||||
ScvGenerator.class, database, "stream="+scvStream.getId());
|
|
||||||
generators=new TreeMap<Integer, TxGenerator>();
|
|
||||||
try {
|
|
||||||
for(ScvGenerator scvGenerator:handler.selectObjects()){
|
|
||||||
generators.put(scvGenerator.getId(), new TxGenerator(this, scvGenerator));
|
|
||||||
}
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new ArrayList<ITxGenerator>(generators.values());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMaxConcurrency() {
|
|
||||||
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());
|
|
||||||
while (resultSet.next()) {
|
|
||||||
Object value = resultSet.getObject("concurrencyLevel");
|
|
||||||
if(value!=null)
|
|
||||||
maxConcurrency=(Integer) value;
|
|
||||||
}
|
|
||||||
} 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;
|
|
||||||
}
|
|
||||||
return maxConcurrency;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NavigableMap<Long, List<ITxEvent>> getEvents(){
|
|
||||||
if(events==null){
|
|
||||||
events=new TreeMap<Long, List<ITxEvent>>();
|
|
||||||
for(Entry<Integer, ITx> entry:getTransactions().entrySet()){
|
|
||||||
putEvent(new TxEvent(TxEvent.Type.BEGIN, entry.getValue()));
|
|
||||||
putEvent(new TxEvent(TxEvent.Type.END, entry.getValue()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void putEvent(TxEvent ev){
|
|
||||||
Long time = ev.getTime();
|
|
||||||
if(!events.containsKey(time)){
|
|
||||||
Vector<ITxEvent> vector=new Vector<ITxEvent>();
|
|
||||||
vector.add(ev);
|
|
||||||
events.put(time, vector);
|
|
||||||
} else {
|
|
||||||
events.get(time).add(ev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Map<Integer, ITx> getTransactions() {
|
|
||||||
if(transactions==null){
|
|
||||||
if(generators==null) getGenerators();
|
|
||||||
transactions = new TreeMap<Integer, ITx>();
|
|
||||||
SQLiteDatabaseSelectHandler<ScvTx> handler = new SQLiteDatabaseSelectHandler<ScvTx>(ScvTx.class, database,
|
|
||||||
"stream="+scvStream.getId());
|
|
||||||
try {
|
|
||||||
for(ScvTx scvTx:handler.selectObjects()){
|
|
||||||
transactions.put(scvTx.getId(), new Tx(database, this, generators.get(scvTx.getGenerator()), scvTx));
|
|
||||||
}
|
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
|
||||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return transactions;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<ITxEvent> getWaveformEventsAtTime(Long time) {
|
|
||||||
return getEvents().get(time);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRelationTypeList(List<RelationType> usedRelationsList){
|
|
||||||
this.usedRelationsList=usedRelationsList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RelationType getRelationType(String name) {
|
|
||||||
RelationType relType=RelationType.create(name);
|
|
||||||
if(!usedRelationsList.contains(relType)) usedRelationsList.add(relType);
|
|
||||||
return relType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Boolean equals(IWaveform<? extends IWaveformEvent> other) {
|
|
||||||
return(other instanceof TxStream && this.getId()==other.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-94
@@ -1,94 +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.sqlite.db;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An abstract class that handles insert/select-operations into/from a database
|
|
||||||
*
|
|
||||||
* @author Tino for http://www.java-blog.com
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
*/
|
|
||||||
public abstract class AbstractDatabaseHandler<T> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The type of the objects that should be created and filled with values
|
|
||||||
* from the database or inserted into the database
|
|
||||||
*/
|
|
||||||
protected Class<T> type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains the settings to create a connection to the database like
|
|
||||||
* host/port/database/user/password
|
|
||||||
*/
|
|
||||||
protected IDatabase databaseConnectionFactory;
|
|
||||||
|
|
||||||
/** The SQL-select-query */
|
|
||||||
protected final String query;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param type
|
|
||||||
* The type of the objects that should be created and filled with
|
|
||||||
* values from the database or inserted into the database
|
|
||||||
* @param databaseConnecter
|
|
||||||
* Contains the settings to create a connection to the database
|
|
||||||
* like host/port/database/user/password
|
|
||||||
*/
|
|
||||||
protected AbstractDatabaseHandler(Class<T> type,
|
|
||||||
IDatabase databaseConnectionFactory, String criterion) {
|
|
||||||
|
|
||||||
this.databaseConnectionFactory = databaseConnectionFactory;
|
|
||||||
this.type = type;
|
|
||||||
this.query = createQuery(criterion);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create the SQL-String to insert into / select from the database
|
|
||||||
*
|
|
||||||
* @return the SQL-String
|
|
||||||
*/
|
|
||||||
protected abstract String createQuery(String criterion);
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Creates a comma-separated-String with the names of the variables in this
|
|
||||||
* class
|
|
||||||
*
|
|
||||||
* @param usePlaceHolders
|
|
||||||
* true, if PreparedStatement-placeholders ('?') should be used
|
|
||||||
* instead of the names of the variables
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected String getColumns(boolean usePlaceHolders) {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
|
|
||||||
boolean first = true;
|
|
||||||
/* Iterate the column-names */
|
|
||||||
for (Field f : type.getDeclaredFields()) {
|
|
||||||
if (first)
|
|
||||||
first = false;
|
|
||||||
else
|
|
||||||
sb.append(", ");
|
|
||||||
|
|
||||||
if (usePlaceHolders)
|
|
||||||
sb.append("?");
|
|
||||||
else
|
|
||||||
sb.append(f.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-61
@@ -1,61 +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.sqlite.db;
|
|
||||||
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Statement;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Creates a connection to a database.
|
|
||||||
*
|
|
||||||
* @author Tino
|
|
||||||
* @created 03.12.2008
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public interface IDatabase {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Establishes a new connection to the database
|
|
||||||
*
|
|
||||||
* @return A new connection to the database
|
|
||||||
* @throws SQLException
|
|
||||||
*/
|
|
||||||
public Connection createConnection() throws SQLException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the connection url
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public String getConnectionUrl();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* releases the result set
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public void close(ResultSet resultSet, Statement statement, Connection connection);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* releases the preparedStatement
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public void close(PreparedStatement preparedStatement, Connection connection);
|
|
||||||
|
|
||||||
public void setData(String name, Object value);
|
|
||||||
|
|
||||||
public Object getData(String name);
|
|
||||||
}
|
|
||||||
-92
@@ -1,92 +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.sqlite.db;
|
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLClassLoader;
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.DriverManager;
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Statement;
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
public class SQLiteDatabase implements IDatabase {
|
|
||||||
|
|
||||||
protected String dbFileName;
|
|
||||||
|
|
||||||
protected HashMap<String, Object> props;
|
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
URL dbUrl = SQLiteDatabase.class.getResource("/sqlite-jdbc-3.8.7.jar");
|
|
||||||
ClassLoader loader = URLClassLoader.newInstance(
|
|
||||||
new URL[] { dbUrl },
|
|
||||||
SQLiteDatabase.class.getClassLoader()
|
|
||||||
);
|
|
||||||
Class.forName("org.sqlite.JDBC", true, loader);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SQLiteDatabase(String dbFileName) {
|
|
||||||
super();
|
|
||||||
this.dbFileName = dbFileName;
|
|
||||||
props = new HashMap<String, Object>();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Connection createConnection() throws SQLException {
|
|
||||||
// create a database connection and return it
|
|
||||||
return DriverManager.getConnection(getConnectionUrl() );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getConnectionUrl() {
|
|
||||||
// now we set up a set of fairly basic string variables to use in the body of the code proper
|
|
||||||
String sJdbc = "jdbc:sqlite";
|
|
||||||
String sDbUrl = sJdbc + ":" + dbFileName;
|
|
||||||
// which will produce a legitimate Url for SqlLite JDBC :
|
|
||||||
// jdbc:sqlite:hello.db
|
|
||||||
return sDbUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close(ResultSet resultSet, Statement statement, Connection connection) {
|
|
||||||
try {
|
|
||||||
if(resultSet!=null) resultSet.close();
|
|
||||||
if(statement!=null) statement.close();
|
|
||||||
if(connection!=null) connection.close();
|
|
||||||
} catch (SQLException e) {}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close(PreparedStatement preparedStatement, Connection connection) {
|
|
||||||
try {
|
|
||||||
preparedStatement.close();
|
|
||||||
connection.close();
|
|
||||||
} catch (SQLException e) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setData(String name, Object value){
|
|
||||||
props.put(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getData(String name){
|
|
||||||
return props.get(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-104
@@ -1,104 +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.sqlite.db;
|
|
||||||
import java.beans.IntrospectionException;
|
|
||||||
import java.beans.PropertyDescriptor;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Class that inserts a list of <T>s into the corresponding database-table.
|
|
||||||
*
|
|
||||||
* @author Tino for http://www.java-blog.com
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
*/
|
|
||||||
public class SQLiteDatabaseInsertHandler<T> extends AbstractDatabaseHandler<T> {
|
|
||||||
|
|
||||||
public SQLiteDatabaseInsertHandler(Class<T> type,
|
|
||||||
IDatabase databaseConnecter) {
|
|
||||||
super(type, databaseConnecter, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String createQuery(String criterion) {
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
|
|
||||||
sb.append("INSERT INTO ");
|
|
||||||
sb.append(type.getSimpleName());
|
|
||||||
sb.append("(");
|
|
||||||
sb.append(super.getColumns(false));
|
|
||||||
sb.append(")");
|
|
||||||
sb.append(" VALUES (");
|
|
||||||
sb.append(super.getColumns(true));
|
|
||||||
sb.append(")");
|
|
||||||
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a list of <T>s into the corresponding database-table
|
|
||||||
*
|
|
||||||
* @param list
|
|
||||||
* List of <T>s that should be inserted into the corresponding
|
|
||||||
* database-table
|
|
||||||
*
|
|
||||||
* @throws SQLException
|
|
||||||
* @throws SecurityException
|
|
||||||
* @throws IllegalArgumentException
|
|
||||||
* @throws InstantiationException
|
|
||||||
* @throws IllegalAccessException
|
|
||||||
* @throws IntrospectionException
|
|
||||||
* @throws InvocationTargetException
|
|
||||||
*/
|
|
||||||
public void insertObjects(List<T> list) throws SQLException,
|
|
||||||
SecurityException, IllegalArgumentException,
|
|
||||||
InstantiationException, IllegalAccessException,
|
|
||||||
IntrospectionException, InvocationTargetException {
|
|
||||||
|
|
||||||
Connection connection = null;
|
|
||||||
PreparedStatement preparedStatement = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
connection = databaseConnectionFactory.createConnection();
|
|
||||||
preparedStatement = connection.prepareStatement(query);
|
|
||||||
|
|
||||||
for (T instance : list) {
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
for (Field field : type.getDeclaredFields()) {
|
|
||||||
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
|
||||||
field.getName(), type);
|
|
||||||
|
|
||||||
Method method = propertyDescriptor
|
|
||||||
.getReadMethod();
|
|
||||||
|
|
||||||
Object value = method.invoke(instance);
|
|
||||||
|
|
||||||
preparedStatement.setObject(++i, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
preparedStatement.addBatch();
|
|
||||||
}
|
|
||||||
preparedStatement.executeBatch();
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
databaseConnectionFactory.close(preparedStatement, connection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-144
@@ -1,144 +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.sqlite.db;
|
|
||||||
|
|
||||||
import java.beans.IntrospectionException;
|
|
||||||
import java.beans.PropertyDescriptor;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Statement;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Class that creates a list of <T>s filled with values from the corresponding
|
|
||||||
* database-table.
|
|
||||||
*
|
|
||||||
* @author Tino for http://www.java-blog.com
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
*/
|
|
||||||
public class SQLiteDatabaseSelectHandler<T> extends AbstractDatabaseHandler<T> {
|
|
||||||
|
|
||||||
public SQLiteDatabaseSelectHandler(Class<T> type,
|
|
||||||
IDatabase databaseConnectionFactory) {
|
|
||||||
super(type, databaseConnectionFactory, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SQLiteDatabaseSelectHandler(Class<T> type,
|
|
||||||
IDatabase databaseConnectionFactory, String criteria) {
|
|
||||||
super(type, databaseConnectionFactory, criteria);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String createQuery(String criterion) {
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
|
|
||||||
sb.append("SELECT ");
|
|
||||||
sb.append(super.getColumns(false));
|
|
||||||
sb.append(" FROM ");
|
|
||||||
|
|
||||||
/* We assume the table-name exactly matches the simpleName of T */
|
|
||||||
sb.append(type.getSimpleName());
|
|
||||||
if(criterion!=null){
|
|
||||||
sb.append(" WHERE ( ");
|
|
||||||
sb.append(criterion);
|
|
||||||
sb.append(" )");
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a list of <T>s filled with values from the corresponding
|
|
||||||
* database-table
|
|
||||||
*
|
|
||||||
* @return List of <T>s filled with values from the corresponding
|
|
||||||
* database-table
|
|
||||||
*
|
|
||||||
* @throws SQLException
|
|
||||||
* @throws SecurityException
|
|
||||||
* @throws IllegalArgumentException
|
|
||||||
* @throws InstantiationException
|
|
||||||
* @throws IllegalAccessException
|
|
||||||
* @throws IntrospectionException
|
|
||||||
* @throws InvocationTargetException
|
|
||||||
*/
|
|
||||||
public synchronized List<T> selectObjects() throws SQLException,
|
|
||||||
SecurityException, IllegalArgumentException,
|
|
||||||
InstantiationException, IllegalAccessException,
|
|
||||||
IntrospectionException, InvocationTargetException {
|
|
||||||
|
|
||||||
Connection connection = null;
|
|
||||||
Statement statement = null;
|
|
||||||
ResultSet resultSet = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
connection = databaseConnectionFactory.createConnection();
|
|
||||||
statement = connection.createStatement();
|
|
||||||
resultSet = statement.executeQuery(query);
|
|
||||||
|
|
||||||
return createObjects(resultSet);
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
databaseConnectionFactory.close(resultSet, statement, connection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Creates a list of <T>s filled with values from the provided ResultSet
|
|
||||||
*
|
|
||||||
* @param resultSet
|
|
||||||
* ResultSet that contains the result of the
|
|
||||||
* database-select-query
|
|
||||||
*
|
|
||||||
* @return List of <T>s filled with values from the provided ResultSet
|
|
||||||
*
|
|
||||||
* @throws SecurityException
|
|
||||||
* @throws IllegalArgumentException
|
|
||||||
* @throws SQLException
|
|
||||||
* @throws InstantiationException
|
|
||||||
* @throws IllegalAccessException
|
|
||||||
* @throws IntrospectionException
|
|
||||||
* @throws InvocationTargetException
|
|
||||||
*/
|
|
||||||
private List<T> createObjects(ResultSet resultSet)
|
|
||||||
throws SecurityException, IllegalArgumentException,
|
|
||||||
SQLException, InstantiationException,
|
|
||||||
IllegalAccessException, IntrospectionException,
|
|
||||||
InvocationTargetException {
|
|
||||||
|
|
||||||
List<T> list = new ArrayList<T>();
|
|
||||||
|
|
||||||
while (resultSet.next()) {
|
|
||||||
|
|
||||||
T instance = type.newInstance();
|
|
||||||
|
|
||||||
for (Field field : type.getDeclaredFields()) {
|
|
||||||
|
|
||||||
/* We assume the table-column-names exactly match the variable-names of T */
|
|
||||||
Object value = resultSet.getObject(field.getName());
|
|
||||||
if(value!=null){
|
|
||||||
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), type);
|
|
||||||
propertyDescriptor.getWriteMethod().invoke(instance, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
list.add(instance);
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-59
@@ -1,59 +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.sqlite.tables;
|
|
||||||
|
|
||||||
public class ScvGenerator {
|
|
||||||
public int getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(int id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getStream() {
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStream(int stream) {
|
|
||||||
this.stream = stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getBegin_attr() {
|
|
||||||
return begin_attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBegin_attr(int begin_attr) {
|
|
||||||
this.begin_attr = begin_attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getEnd_attr() {
|
|
||||||
return end_attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setEnd_attr(int end_attr) {
|
|
||||||
this.end_attr = end_attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int id;
|
|
||||||
private int stream;
|
|
||||||
private String name;
|
|
||||||
private int begin_attr;
|
|
||||||
private int end_attr;
|
|
||||||
}
|
|
||||||
-29
@@ -1,29 +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.sqlite.tables;
|
|
||||||
|
|
||||||
public class ScvSimProps {
|
|
||||||
|
|
||||||
private long time_resolution;
|
|
||||||
|
|
||||||
public ScvSimProps() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getTime_resolution() {
|
|
||||||
return time_resolution;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTime_resolution(long time_resolution) {
|
|
||||||
this.time_resolution = time_resolution;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-41
@@ -1,41 +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.sqlite.tables;
|
|
||||||
|
|
||||||
public class ScvStream {
|
|
||||||
public int getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(int id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getKind() {
|
|
||||||
return kind;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setKind(String kind) {
|
|
||||||
this.kind = kind;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int id;
|
|
||||||
private String name;
|
|
||||||
private String kind;
|
|
||||||
}
|
|
||||||
-50
@@ -1,50 +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.sqlite.tables;
|
|
||||||
|
|
||||||
public class ScvTx {
|
|
||||||
public int getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(int id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getGenerator() {
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGenerator(int generator) {
|
|
||||||
this.generator = generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getStream() {
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStream(int stream) {
|
|
||||||
this.stream = stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getConcurrencyLevel() {
|
|
||||||
return concurrencyLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setConcurrencyLevel(int concurrencyLevel) {
|
|
||||||
this.concurrencyLevel = concurrencyLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int id;
|
|
||||||
private int generator;
|
|
||||||
private int stream;
|
|
||||||
private int concurrencyLevel;
|
|
||||||
}
|
|
||||||
-60
@@ -1,60 +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.sqlite.tables;
|
|
||||||
|
|
||||||
public class ScvTxAttribute {
|
|
||||||
|
|
||||||
public int getTx() {
|
|
||||||
return tx;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTx(int tx) {
|
|
||||||
this.tx = tx;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setType(int type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getData_type() {
|
|
||||||
return data_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setData_type(int data_type) {
|
|
||||||
this.data_type = data_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getData_value() {
|
|
||||||
return data_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setData_value(String data_value) {
|
|
||||||
this.data_value = data_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int tx;
|
|
||||||
private int type;
|
|
||||||
private String name;
|
|
||||||
private int data_type;
|
|
||||||
private String data_value;
|
|
||||||
}
|
|
||||||
-41
@@ -1,41 +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.sqlite.tables;
|
|
||||||
|
|
||||||
public class ScvTxEvent {
|
|
||||||
public int getTx() {
|
|
||||||
return tx;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTx(int tx) {
|
|
||||||
this.tx = tx;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setType(int type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getTime() {
|
|
||||||
return time;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTime(long time) {
|
|
||||||
this.time = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int tx;
|
|
||||||
private int type;
|
|
||||||
private long time;
|
|
||||||
}
|
|
||||||
-42
@@ -1,42 +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.sqlite.tables;
|
|
||||||
|
|
||||||
public class ScvTxRelation {
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSrc() {
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSrc(int src) {
|
|
||||||
this.src = src;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSink() {
|
|
||||||
return sink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSink(int sink) {
|
|
||||||
this.sink = sink;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String name;
|
|
||||||
private int src;
|
|
||||||
private int sink;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
|
||||||
<classpathentry kind="src" path="src/"/>
|
|
||||||
<classpathentry kind="output" path="target/classes"/>
|
|
||||||
</classpath>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
/bin/
|
|
||||||
/target/
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>com.minres.scviewer.database.test</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.ManifestBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.SchemaBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.ds.core.builder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
|
||||||
<nature>org.eclipse.pde.PluginNature</nature>
|
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
encoding//src/com/minres/scviewer/database/test/DatabaseServicesTest.java=UTF-8
|
|
||||||
encoding/<project>=UTF-8
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.7
|
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
|
||||||
org.eclipse.jdt.core.compiler.source=1.7
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
activeProfiles=
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
resolveWorkspaceProjects=true
|
|
||||||
version=1
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
pluginProject.extensions=false
|
|
||||||
resolve.requirebundle=false
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
|
|
||||||
<booleanAttribute key="append.args" value="true"/>
|
|
||||||
<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
|
|
||||||
<booleanAttribute key="askclear" value="false"/>
|
|
||||||
<booleanAttribute key="automaticAdd" value="true"/>
|
|
||||||
<booleanAttribute key="automaticValidate" value="false"/>
|
|
||||||
<stringAttribute key="bootstrap" value=""/>
|
|
||||||
<stringAttribute key="checked" value="[NONE]"/>
|
|
||||||
<booleanAttribute key="clearConfig" value="true"/>
|
|
||||||
<booleanAttribute key="clearws" value="true"/>
|
|
||||||
<booleanAttribute key="clearwslog" value="false"/>
|
|
||||||
<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
|
|
||||||
<booleanAttribute key="default" value="false"/>
|
|
||||||
<stringAttribute key="deselected_workspace_plugins" value="com.minres.scviewer.database.swt,com.minres.scviewer.e4.application,com.minres.scviewer.ui"/>
|
|
||||||
<booleanAttribute key="includeOptional" value="true"/>
|
|
||||||
<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
|
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
|
||||||
<listEntry value="/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java"/>
|
|
||||||
</listAttribute>
|
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
|
||||||
<listEntry value="1"/>
|
|
||||||
</listAttribute>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.minres.scviewer.database.test.DatabaseServicesTest"/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.minres.scviewer.database.test"/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms40m -Xmx512m -Xdock:icon=../Resources/Eclipse.icns -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts"/>
|
|
||||||
<stringAttribute key="pde.version" value="3.3"/>
|
|
||||||
<stringAttribute key="product" value="com.minres.scviewer.e4.product"/>
|
|
||||||
<booleanAttribute key="run_in_ui_thread" value="true"/>
|
|
||||||
<stringAttribute key="selected_target_plugins" value="com.google.guava*10.0.1.v201203051515@default:default,com.google.guava*15.0.0.v201403281430@default:default,com.ibm.icu@default:default,javax.annotation@default:default,javax.inject@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.servlet*3.1.0.v201410161800@default:default,javax.xml@default:default,org.apache.ant@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.commons.jxpath@default:default,org.apache.commons.logging@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.codehaus.groovy*2.4.3.xx-201508121448-e45@default:default,org.eclipse.ant.core@default:default,org.eclipse.compare.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filesystem.java7@default:false,org.eclipse.core.filesystem.macosx@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.annotations@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.emf.xpath@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt.cocoa@default:false,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.help@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface@default:default,org.eclipse.osgi.compatibility.state@default:false,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.swt.cocoa.macosx.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.ui.cocoa@default:false,org.eclipse.ui.trace@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.hamcrest.core@default:default,org.junit@default:default,org.mozilla.javascript@default:default,org.w3c.css.sac@default:default,org.w3c.dom.events@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
|
|
||||||
<stringAttribute key="selected_workspace_plugins" value="com.minres.scviewer.database.sqlite@default:true,com.minres.scviewer.database.test@default:default,com.minres.scviewer.database.text@default:true,com.minres.scviewer.database.vcd@default:default,com.minres.scviewer.database@default:true"/>
|
|
||||||
<booleanAttribute key="show_selected_only" value="false"/>
|
|
||||||
<booleanAttribute key="tracing" value="false"/>
|
|
||||||
<booleanAttribute key="useCustomFeatures" value="false"/>
|
|
||||||
<booleanAttribute key="useDefaultConfig" value="true"/>
|
|
||||||
<booleanAttribute key="useDefaultConfigArea" value="false"/>
|
|
||||||
<booleanAttribute key="useProduct" value="false"/>
|
|
||||||
</launchConfiguration>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
Manifest-Version: 1.0
|
|
||||||
Bundle-ManifestVersion: 2
|
|
||||||
Bundle-Name: SCViewer database tests
|
|
||||||
Bundle-SymbolicName: com.minres.scviewer.database.test
|
|
||||||
Bundle-Version: 1.0.0.qualifier
|
|
||||||
Bundle-Vendor: MINRES Technologies GnbH
|
|
||||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
|
||||||
Require-Bundle: org.junit,
|
|
||||||
com.minres.scviewer.database,
|
|
||||||
com.minres.scviewer.database.sqlite;bundle-version="1.0.0",
|
|
||||||
com.minres.scviewer.database.text;bundle-version="1.0.0",
|
|
||||||
com.minres.scviewer.database.vcd;bundle-version="1.0.0"
|
|
||||||
Bundle-ActivationPolicy: lazy
|
|
||||||
Service-Component: OSGI-INF/component.xml
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="com.minres.scviewer.database.test">
|
|
||||||
<implementation class="com.minres.scviewer.database.test.DatabaseServicesTest"/>
|
|
||||||
<reference bind="setFactory" cardinality="1..1" interface="com.minres.scviewer.database.IWaveformDbFactory" name="IWaveformDbFactory" policy="static" unbind="unsetFactory"/>
|
|
||||||
</scr:component>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
bin.includes = META-INF/,\
|
|
||||||
.,\
|
|
||||||
OSGI-INF/
|
|
||||||
source.. = src/
|
|
||||||
Binary file not shown.
@@ -1,254 +0,0 @@
|
|||||||
scv_tr_stream (ID 1, name "tr.pipelined_stream", kind "transactor")
|
|
||||||
scv_tr_stream (ID 2, name "tr.addr_stream", kind "transactor")
|
|
||||||
scv_tr_stream (ID 3, name "tr.data_stream", kind "transactor")
|
|
||||||
scv_tr_generator (ID 4, name "read", scv_tr_stream 1,
|
|
||||||
begin_attribute (ID 0, name "addr", type "UNSIGNED")
|
|
||||||
end_attribute (ID 1, name "data", type "UNSIGNED")
|
|
||||||
)
|
|
||||||
scv_tr_generator (ID 5, name "write", scv_tr_stream 1,
|
|
||||||
begin_attribute (ID 0, name "addr", type "UNSIGNED")
|
|
||||||
end_attribute (ID 1, name "data", type "UNSIGNED")
|
|
||||||
)
|
|
||||||
scv_tr_generator (ID 6, name "addr", scv_tr_stream 2,
|
|
||||||
begin_attribute (ID 0, name "addr", type "UNSIGNED")
|
|
||||||
)
|
|
||||||
scv_tr_generator (ID 7, name "rdata", scv_tr_stream 3,
|
|
||||||
end_attribute (ID 0, name "data", type "UNSIGNED")
|
|
||||||
)
|
|
||||||
scv_tr_generator (ID 8, name "wdata", scv_tr_stream 3,
|
|
||||||
begin_attribute (ID 0, name "data", type "UNSIGNED")
|
|
||||||
)
|
|
||||||
tx_begin 1 4 0 s
|
|
||||||
a 0
|
|
||||||
tx_record_attribute 1 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 2 6 0 s
|
|
||||||
a 0
|
|
||||||
tx_relation "addr_phase" 2 1
|
|
||||||
tx_end 2 6 180 ns
|
|
||||||
tx_begin 3 7 180 ns
|
|
||||||
tx_relation "data_phase" 3 1
|
|
||||||
tx_begin 4 4 180 ns
|
|
||||||
a 0
|
|
||||||
tx_record_attribute 4 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 5 6 180 ns
|
|
||||||
a 0
|
|
||||||
tx_relation "addr_phase" 5 4
|
|
||||||
tx_end 5 6 300 ns
|
|
||||||
tx_end 3 7 420 ns
|
|
||||||
a 0
|
|
||||||
tx_end 1 4 420 ns
|
|
||||||
a 0
|
|
||||||
tx_begin 6 4 420 ns
|
|
||||||
a 1
|
|
||||||
tx_record_attribute 6 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 7 6 420 ns
|
|
||||||
a 1
|
|
||||||
tx_relation "addr_phase" 7 6
|
|
||||||
tx_begin 8 7 420 ns
|
|
||||||
tx_relation "data_phase" 8 4
|
|
||||||
tx_end 7 6 480 ns
|
|
||||||
tx_end 8 7 620 ns
|
|
||||||
a 0
|
|
||||||
tx_end 4 4 620 ns
|
|
||||||
a 0
|
|
||||||
tx_begin 9 4 620 ns
|
|
||||||
a 1
|
|
||||||
tx_record_attribute 9 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 10 6 620 ns
|
|
||||||
a 1
|
|
||||||
tx_relation "addr_phase" 10 9
|
|
||||||
tx_begin 11 7 620 ns
|
|
||||||
tx_relation "data_phase" 11 6
|
|
||||||
tx_end 11 7 700 ns
|
|
||||||
a 1
|
|
||||||
tx_end 6 4 700 ns
|
|
||||||
a 1
|
|
||||||
tx_end 10 6 760 ns
|
|
||||||
tx_begin 12 7 760 ns
|
|
||||||
tx_relation "data_phase" 12 9
|
|
||||||
tx_begin 13 4 760 ns
|
|
||||||
a 2
|
|
||||||
tx_record_attribute 13 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 14 6 760 ns
|
|
||||||
a 2
|
|
||||||
tx_relation "addr_phase" 14 13
|
|
||||||
tx_end 14 6 880 ns
|
|
||||||
tx_end 12 7 980 ns
|
|
||||||
a 1
|
|
||||||
tx_end 9 4 980 ns
|
|
||||||
a 1
|
|
||||||
tx_begin 15 4 980 ns
|
|
||||||
a 2
|
|
||||||
tx_record_attribute 15 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 16 6 980 ns
|
|
||||||
a 2
|
|
||||||
tx_relation "addr_phase" 16 15
|
|
||||||
tx_begin 17 7 980 ns
|
|
||||||
tx_relation "data_phase" 17 13
|
|
||||||
tx_end 16 6 1040 ns
|
|
||||||
tx_end 17 7 1200 ns
|
|
||||||
a 2
|
|
||||||
tx_end 13 4 1200 ns
|
|
||||||
a 2
|
|
||||||
tx_begin 18 4 1200 ns
|
|
||||||
a 120
|
|
||||||
tx_record_attribute 18 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 19 6 1200 ns
|
|
||||||
a 120
|
|
||||||
tx_relation "addr_phase" 19 18
|
|
||||||
tx_begin 20 7 1200 ns
|
|
||||||
tx_relation "data_phase" 20 15
|
|
||||||
tx_end 19 6 1300 ns
|
|
||||||
tx_end 20 7 1340 ns
|
|
||||||
a 2
|
|
||||||
tx_end 15 4 1340 ns
|
|
||||||
a 2
|
|
||||||
tx_begin 21 4 1340 ns
|
|
||||||
a 11
|
|
||||||
tx_record_attribute 21 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 22 6 1340 ns
|
|
||||||
a 11
|
|
||||||
tx_relation "addr_phase" 22 21
|
|
||||||
tx_begin 23 7 1340 ns
|
|
||||||
tx_relation "data_phase" 23 18
|
|
||||||
tx_end 23 7 1420 ns
|
|
||||||
a 120
|
|
||||||
tx_end 18 4 1420 ns
|
|
||||||
a 120
|
|
||||||
tx_end 22 6 1540 ns
|
|
||||||
tx_begin 24 7 1540 ns
|
|
||||||
tx_relation "data_phase" 24 21
|
|
||||||
tx_begin 25 4 1540 ns
|
|
||||||
a 147
|
|
||||||
tx_record_attribute 25 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 26 6 1540 ns
|
|
||||||
a 147
|
|
||||||
tx_relation "addr_phase" 26 25
|
|
||||||
tx_end 24 7 1660 ns
|
|
||||||
a 11
|
|
||||||
tx_end 21 4 1660 ns
|
|
||||||
a 11
|
|
||||||
tx_end 26 6 1740 ns
|
|
||||||
tx_begin 27 7 1740 ns
|
|
||||||
tx_relation "data_phase" 27 25
|
|
||||||
tx_begin 28 4 1740 ns
|
|
||||||
a 99
|
|
||||||
tx_record_attribute 28 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 29 6 1740 ns
|
|
||||||
a 99
|
|
||||||
tx_relation "addr_phase" 29 28
|
|
||||||
tx_end 29 6 1800 ns
|
|
||||||
tx_end 27 7 1980 ns
|
|
||||||
a 147
|
|
||||||
tx_end 25 4 1980 ns
|
|
||||||
a 147
|
|
||||||
tx_begin 30 4 1980 ns
|
|
||||||
a 55
|
|
||||||
tx_record_attribute 30 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 31 6 1980 ns
|
|
||||||
a 55
|
|
||||||
tx_relation "addr_phase" 31 30
|
|
||||||
tx_begin 32 7 1980 ns
|
|
||||||
tx_relation "data_phase" 32 28
|
|
||||||
tx_end 32 7 2060 ns
|
|
||||||
a 99
|
|
||||||
tx_end 28 4 2060 ns
|
|
||||||
a 99
|
|
||||||
tx_end 31 6 2100 ns
|
|
||||||
tx_begin 33 7 2100 ns
|
|
||||||
tx_relation "data_phase" 33 30
|
|
||||||
tx_begin 34 4 2100 ns
|
|
||||||
a 126
|
|
||||||
tx_record_attribute 34 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 35 6 2100 ns
|
|
||||||
a 126
|
|
||||||
tx_relation "addr_phase" 35 34
|
|
||||||
tx_end 33 7 2340 ns
|
|
||||||
a 55
|
|
||||||
tx_end 30 4 2340 ns
|
|
||||||
a 55
|
|
||||||
tx_end 35 6 2340 ns
|
|
||||||
tx_begin 36 7 2340 ns
|
|
||||||
tx_relation "data_phase" 36 34
|
|
||||||
tx_begin 37 5 2340 ns
|
|
||||||
a 204
|
|
||||||
tx_record_attribute 37 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 38 6 2340 ns
|
|
||||||
a 204
|
|
||||||
tx_relation "addr_phase" 38 37
|
|
||||||
tx_end 38 6 2400 ns
|
|
||||||
tx_end 36 7 2540 ns
|
|
||||||
a 126
|
|
||||||
tx_end 34 4 2540 ns
|
|
||||||
a 126
|
|
||||||
tx_begin 39 5 2540 ns
|
|
||||||
a 242
|
|
||||||
tx_record_attribute 39 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 40 6 2540 ns
|
|
||||||
a 242
|
|
||||||
tx_relation "addr_phase" 40 39
|
|
||||||
tx_begin 41 8 2540 ns
|
|
||||||
a 211
|
|
||||||
tx_relation "data_phase" 41 37
|
|
||||||
tx_end 41 8 2640 ns
|
|
||||||
tx_end 37 5 2640 ns
|
|
||||||
a 211
|
|
||||||
tx_end 40 6 2780 ns
|
|
||||||
tx_begin 42 8 2780 ns
|
|
||||||
a 58
|
|
||||||
tx_relation "data_phase" 42 39
|
|
||||||
tx_begin 43 5 2780 ns
|
|
||||||
a 135
|
|
||||||
tx_record_attribute 43 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 44 6 2780 ns
|
|
||||||
a 135
|
|
||||||
tx_relation "addr_phase" 44 43
|
|
||||||
tx_end 44 6 2960 ns
|
|
||||||
tx_end 42 8 3 us
|
|
||||||
tx_end 39 5 3 us
|
|
||||||
a 58
|
|
||||||
tx_begin 45 5 3 us
|
|
||||||
a 26
|
|
||||||
tx_record_attribute 45 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 46 6 3 us
|
|
||||||
a 26
|
|
||||||
tx_relation "addr_phase" 46 45
|
|
||||||
tx_begin 47 8 3 us
|
|
||||||
a 31
|
|
||||||
tx_relation "data_phase" 47 43
|
|
||||||
tx_end 47 8 3140 ns
|
|
||||||
tx_end 43 5 3140 ns
|
|
||||||
a 31
|
|
||||||
tx_end 46 6 3200 ns
|
|
||||||
tx_begin 48 8 3200 ns
|
|
||||||
a 37
|
|
||||||
tx_relation "data_phase" 48 45
|
|
||||||
tx_begin 49 5 3200 ns
|
|
||||||
a 176
|
|
||||||
tx_record_attribute 49 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 50 6 3200 ns
|
|
||||||
a 176
|
|
||||||
tx_relation "addr_phase" 50 49
|
|
||||||
tx_end 50 6 3300 ns
|
|
||||||
tx_end 48 8 3380 ns
|
|
||||||
tx_end 45 5 3380 ns
|
|
||||||
a 37
|
|
||||||
tx_begin 51 5 3380 ns
|
|
||||||
a 58
|
|
||||||
tx_record_attribute 51 "data_size" UNSIGNED = 24
|
|
||||||
tx_begin 52 6 3380 ns
|
|
||||||
a 58
|
|
||||||
tx_relation "addr_phase" 52 51
|
|
||||||
tx_begin 53 8 3380 ns
|
|
||||||
a 220
|
|
||||||
tx_relation "data_phase" 53 49
|
|
||||||
tx_end 52 6 3440 ns
|
|
||||||
tx_end 53 8 3560 ns
|
|
||||||
tx_end 49 5 3560 ns
|
|
||||||
a 220
|
|
||||||
tx_begin 54 8 3560 ns
|
|
||||||
a 109
|
|
||||||
tx_relation "data_phase" 54 51
|
|
||||||
tx_end 54 8 3660 ns
|
|
||||||
tx_end 51 5 3660 ns
|
|
||||||
a 109
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,31 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<artifactId>com.minres.scviewer.database.test</artifactId>
|
|
||||||
<parent>
|
|
||||||
<groupId>com.minres.scviewer</groupId>
|
|
||||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../com.minres.scviewer.parent</relativePath>
|
|
||||||
</parent>
|
|
||||||
<packaging>eclipse-test-plugin</packaging>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.eclipse.tycho</groupId>
|
|
||||||
<artifactId>tycho-surefire-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<!-- <bundleStartLevel /> -->
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<type>p2-installable-unit</type>
|
|
||||||
<artifactId>org.eclipse.equinox.ds</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
<groupId>com.minres.scviewer</groupId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
</project>
|
|
||||||
-90
@@ -1,90 +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.test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.IWaveformDb;
|
|
||||||
import com.minres.scviewer.database.IWaveformDbFactory;
|
|
||||||
|
|
||||||
public class DatabaseServicesTest {
|
|
||||||
|
|
||||||
|
|
||||||
private static IWaveformDbFactory waveformDbFactory;
|
|
||||||
|
|
||||||
private IWaveformDb waveformDb;
|
|
||||||
|
|
||||||
public synchronized void setFactory(IWaveformDbFactory service) {
|
|
||||||
waveformDbFactory = service;
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized void unsetFactory(IWaveformDbFactory service) {
|
|
||||||
if (waveformDbFactory == service) {
|
|
||||||
waveformDbFactory = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() throws Exception {
|
|
||||||
waveformDb=waveformDbFactory.getDatabase();
|
|
||||||
// Wait for OSGi dependencies
|
|
||||||
// for (int i = 0; i < 10; i++) {
|
|
||||||
// if (waveformDb.size() == 3) // Dependencies fulfilled
|
|
||||||
// return;
|
|
||||||
// Thread.sleep(1000);
|
|
||||||
// }
|
|
||||||
// assertEquals("OSGi dependencies unfulfilled", 3, WaveformDb.getLoaders().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void tearDown() throws Exception {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testVCD() throws Exception {
|
|
||||||
File f = new File("inputs/my_db.vcd").getAbsoluteFile();
|
|
||||||
assertTrue(f.exists());
|
|
||||||
waveformDb.load(f);
|
|
||||||
assertNotNull(waveformDb);
|
|
||||||
assertEquals(14, waveformDb.getAllWaves().size());
|
|
||||||
assertEquals(2, waveformDb.getChildNodes().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testTxSQLite() throws Exception {
|
|
||||||
File f = new File("inputs/my_db.txdb").getAbsoluteFile();
|
|
||||||
assertTrue(f.exists());
|
|
||||||
waveformDb.load(f);
|
|
||||||
assertNotNull(waveformDb);
|
|
||||||
assertEquals(3, waveformDb.getAllWaves().size());
|
|
||||||
assertEquals(1, waveformDb.getChildNodes().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testTxText() throws Exception {
|
|
||||||
File f = new File("inputs/my_db.txlog").getAbsoluteFile();
|
|
||||||
assertTrue(f.exists());
|
|
||||||
waveformDb.load(f);
|
|
||||||
assertNotNull(waveformDb);
|
|
||||||
assertEquals(3, waveformDb.getAllWaves().size());
|
|
||||||
assertEquals(1, waveformDb.getChildNodes().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
|
||||||
<classpathentry kind="src" path="src/"/>
|
|
||||||
<classpathentry kind="output" path="target/classes"/>
|
|
||||||
</classpath>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
/bin
|
|
||||||
/target/
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>com.minres.scviewer.database.text</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.ManifestBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.SchemaBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.ds.core.builder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
|
||||||
<nature>org.eclipse.jdt.groovy.core.groovyNature</nature>
|
|
||||||
<nature>org.eclipse.pde.PluginNature</nature>
|
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.7
|
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
|
||||||
org.eclipse.jdt.core.compiler.source=1.7
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
groovy.compiler.level=23
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
activeProfiles=
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
resolveWorkspaceProjects=true
|
|
||||||
version=1
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
Manifest-Version: 1.0
|
|
||||||
Bundle-ManifestVersion: 2
|
|
||||||
Bundle-Name: Textual transaction database
|
|
||||||
Bundle-SymbolicName: com.minres.scviewer.database.text
|
|
||||||
Bundle-Version: 1.0.0.qualifier
|
|
||||||
Bundle-Vendor: MINRES Technologies GmbH
|
|
||||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
|
||||||
Import-Package: com.minres.scviewer.database,
|
|
||||||
org.osgi.framework;version="1.3.0"
|
|
||||||
Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0",
|
|
||||||
org.codehaus.groovy;bundle-version="1.8.6",
|
|
||||||
org.eclipse.equinox.util;bundle-version="1.0.500",
|
|
||||||
org.eclipse.equinox.ds;bundle-version="1.4.200",
|
|
||||||
org.eclipse.osgi.services;bundle-version="3.4.0",
|
|
||||||
com.google.guava;bundle-version="15.0.0"
|
|
||||||
Service-Component: OSGI-INF/component.xml
|
|
||||||
Bundle-ActivationPolicy: lazy
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="TextDbLoader">
|
|
||||||
<implementation class="com.minres.scviewer.database.text.TextDbLoader"/>
|
|
||||||
<service>
|
|
||||||
<provide interface="com.minres.scviewer.database.IWaveformDbLoader"/>
|
|
||||||
</service>
|
|
||||||
</scr:component>
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
###############################################################################
|
|
||||||
# Copyright (c) 2014, 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
|
|
||||||
###############################################################################
|
|
||||||
bin.includes = META-INF/,\
|
|
||||||
.,\
|
|
||||||
OSGI-INF/
|
|
||||||
bin.excludes = **/*.groovy
|
|
||||||
source.. = src/
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<artifactId>com.minres.scviewer.database.text</artifactId>
|
|
||||||
<parent>
|
|
||||||
<groupId>com.minres.scviewer</groupId>
|
|
||||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../com.minres.scviewer.parent</relativePath>
|
|
||||||
</parent>
|
|
||||||
<packaging>eclipse-plugin</packaging>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.eclipse.tycho</groupId>
|
|
||||||
<artifactId>tycho-compiler-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<compilerId>groovy-eclipse-compiler</compilerId>
|
|
||||||
<!-- set verbose to be true if you want lots of uninteresting messages -->
|
|
||||||
<!-- <verbose>true</verbose> -->
|
|
||||||
<source>1.7</source>
|
|
||||||
<target>1.7</target>
|
|
||||||
</configuration>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.codehaus.groovy</groupId>
|
|
||||||
<artifactId>groovy-eclipse-compiler</artifactId>
|
|
||||||
<version>${groovy-eclipse-compiler-version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.codehaus.groovy</groupId>
|
|
||||||
<artifactId>groovy-eclipse-batch</artifactId>
|
|
||||||
<version>${groovy-eclipse-batch-version}</version>
|
|
||||||
<!-- or choose a different compiler version -->
|
|
||||||
<!-- <version>2.1.8-01</version> -->
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
<groupId>com.minres.scviewer</groupId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
</project>
|
|
||||||
-171
@@ -1,171 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2012 IT Just working.
|
|
||||||
* 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:
|
|
||||||
* IT Just working - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
package com.minres.scviewer.database.text;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
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.RelationType
|
|
||||||
|
|
||||||
public class TextDbLoader implements IWaveformDbLoader{
|
|
||||||
|
|
||||||
private Long maxTime;
|
|
||||||
|
|
||||||
IWaveformDb db;
|
|
||||||
|
|
||||||
def streams = []
|
|
||||||
|
|
||||||
def relationTypes=[:]
|
|
||||||
|
|
||||||
public TextDbLoader() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getMaxTime() {
|
|
||||||
return maxTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<IWaveform> getAllWaves() {
|
|
||||||
return new LinkedList<IWaveform>(streams);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<Long, ITxGenerator> getGeneratorsById() {
|
|
||||||
TreeMap<Long, ITxGenerator> res = new TreeMap<Long, ITxGenerator>();
|
|
||||||
streams.each{TxStream stream -> stream.generators.each{res.put(it.id, id)} }
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static final byte[] x = "scv_tr_stream".bytes
|
|
||||||
|
|
||||||
@Override
|
|
||||||
boolean load(IWaveformDb db, File file) throws Exception {
|
|
||||||
this.db=db
|
|
||||||
this.streams=[]
|
|
||||||
FileInputStream fis = new FileInputStream(file)
|
|
||||||
byte[] buffer = new byte[x.size()]
|
|
||||||
def readCnt = fis.read(buffer, 0, x.size())
|
|
||||||
fis.close()
|
|
||||||
if(readCnt==x.size())
|
|
||||||
for(int i=0; i<x.size(); i++)
|
|
||||||
if(buffer[i]!=x[i]) return false
|
|
||||||
parseInput(file)
|
|
||||||
calculateConcurrencyIndicees()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
private stringToScale(String scale){
|
|
||||||
switch(scale.trim()){
|
|
||||||
case "fs":return 1L
|
|
||||||
case "ps":return 1000L
|
|
||||||
case "ns":return 1000000L
|
|
||||||
case "us":return 1000000000L
|
|
||||||
case "ms":return 1000000000000L
|
|
||||||
case "s": return 1000000000000000L
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private def parseInput(File input){
|
|
||||||
def streamsById = [:]
|
|
||||||
def generatorsById = [:]
|
|
||||||
def transactionsById = [:]
|
|
||||||
TxGenerator generator
|
|
||||||
Tx transaction
|
|
||||||
boolean endTransaction=false
|
|
||||||
def matcher
|
|
||||||
input.eachLine { line ->
|
|
||||||
def tokens = line.split(/\s+/)
|
|
||||||
switch(tokens[0]){
|
|
||||||
case "scv_tr_stream":
|
|
||||||
case "scv_tr_generator":
|
|
||||||
case "begin_attribute":
|
|
||||||
case "end_attribute":
|
|
||||||
if ((matcher = line =~ /^scv_tr_stream\s+\(ID (\d+),\s+name\s+"([^"]+)",\s+kind\s+"([^"]+)"\)$/)) {
|
|
||||||
def id = Integer.parseInt(matcher[0][1])
|
|
||||||
def stream = new TxStream(db, id, matcher[0][2], matcher[0][3])
|
|
||||||
streams<<stream
|
|
||||||
streamsById[id]=stream
|
|
||||||
} else 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])]
|
|
||||||
generator=new TxGenerator(id, stream, matcher[0][2])
|
|
||||||
stream.generators<<generator
|
|
||||||
generatorsById[id]=generator
|
|
||||||
} else if ((matcher = line =~ /^begin_attribute \(ID (\d+), name "([^"]+)", type "([^"]+)"\)$/)) {
|
|
||||||
generator.begin_attrs << TxAttributeType.getAttrType(matcher[0][2], DataType.valueOf(matcher[0][3]), AssociationType.BEGIN)
|
|
||||||
} else if ((matcher = line =~ /^end_attribute \(ID (\d+), name "([^"]+)", type "([^"]+)"\)$/)) {
|
|
||||||
generator.end_attrs << TxAttributeType.getAttrType(matcher[0][2], DataType.valueOf(matcher[0][3]), AssociationType.END)
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ")":
|
|
||||||
generator=null
|
|
||||||
break
|
|
||||||
case "tx_begin"://matcher = line =~ /^tx_begin\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/
|
|
||||||
def id = Integer.parseInt(tokens[1])
|
|
||||||
TxGenerator gen=generatorsById[Integer.parseInt(tokens[2])]
|
|
||||||
transaction = new Tx(id, gen.stream, gen, Long.parseLong(tokens[3])*stringToScale(tokens[4]))
|
|
||||||
gen.transactions << transaction
|
|
||||||
transactionsById[id]= transaction
|
|
||||||
gen.begin_attrs_idx=0;
|
|
||||||
maxTime = maxTime>transaction.beginTime?maxTime:transaction.beginTime
|
|
||||||
endTransaction=false
|
|
||||||
break
|
|
||||||
case "tx_end"://matcher = line =~ /^tx_end\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/
|
|
||||||
def id = Integer.parseInt(tokens[1])
|
|
||||||
transaction = transactionsById[id]
|
|
||||||
assert Integer.parseInt(tokens[2])==transaction.generator.id
|
|
||||||
transaction.endTime = Long.parseLong(tokens[3])*stringToScale(tokens[4])
|
|
||||||
transaction.generator.end_attrs_idx=0;
|
|
||||||
maxTime = maxTime>transaction.endTime?maxTime:transaction.endTime
|
|
||||||
endTransaction=true
|
|
||||||
break
|
|
||||||
case "tx_record_attribute"://matcher = line =~ /^tx_record_attribute\s+(\d+)\s+"([^"]+)"\s+(\S+)\s*=\s*(.+)$/
|
|
||||||
def id = Integer.parseInt(tokens[1])
|
|
||||||
transactionsById[id].attributes<<new TxAttribute(tokens[2][1..-2], DataType.valueOf(tokens[3]), AssociationType.RECORD, tokens[5..-1].join(' '))
|
|
||||||
break
|
|
||||||
case "a"://matcher = line =~ /^a\s+(.+)$/
|
|
||||||
if(endTransaction){
|
|
||||||
transaction.attributes << new TxAttribute(transaction.generator.end_attrs[0], tokens[1])
|
|
||||||
} else {
|
|
||||||
transaction.attributes << new TxAttribute(transaction.generator.begin_attrs[0], tokens[1])
|
|
||||||
}
|
|
||||||
break
|
|
||||||
case "tx_relation"://matcher = line =~ /^tx_relation\s+\"(\S+)\"\s+(\d+)\s+(\d+)$/
|
|
||||||
Tx tr2= transactionsById[Integer.parseInt(tokens[2])]
|
|
||||||
Tx tr1= transactionsById[Integer.parseInt(tokens[3])]
|
|
||||||
def relType=tokens[1][1..-2]
|
|
||||||
if(!relationTypes.containsKey(relType)) relationTypes[relType]=RelationType.create(relType)
|
|
||||||
def rel = new TxRelation(relationTypes[relType], tr1, tr2)
|
|
||||||
tr1.outgoingRelations<<rel
|
|
||||||
tr2.incomingRelations<<rel
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
println "Don't know what to do with: '$line'"
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private def calculateConcurrencyIndicees(){
|
|
||||||
streams.each{ TxStream stream -> stream.getMaxConcurrency() }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Collection<RelationType> getAllRelationTypes(){
|
|
||||||
return relationTypes.values();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2012 IT Just working.
|
|
||||||
* 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:
|
|
||||||
* IT Just working - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
package com.minres.scviewer.database.text
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.*
|
|
||||||
|
|
||||||
class Tx implements ITx {
|
|
||||||
|
|
||||||
Long id
|
|
||||||
|
|
||||||
TxGenerator generator
|
|
||||||
|
|
||||||
TxStream stream
|
|
||||||
|
|
||||||
int concurrencyIndex
|
|
||||||
|
|
||||||
Long beginTime
|
|
||||||
|
|
||||||
Long endTime
|
|
||||||
|
|
||||||
ArrayList<ITxAttribute> attributes = new ArrayList<ITxAttribute>()
|
|
||||||
|
|
||||||
def incomingRelations =[]
|
|
||||||
|
|
||||||
def outgoingRelations =[]
|
|
||||||
|
|
||||||
Tx(int id, TxStream stream, TxGenerator generator, Long begin){
|
|
||||||
this.id=id
|
|
||||||
this.stream=stream
|
|
||||||
this.generator=generator
|
|
||||||
this.beginTime=begin
|
|
||||||
this.endTime=begin
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<ITxRelation> getIncomingRelations() {
|
|
||||||
return incomingRelations;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<ITxRelation> getOutgoingRelations() {
|
|
||||||
return outgoingRelations;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(ITx o) {
|
|
||||||
def res =beginTime.compareTo(o.beginTime)
|
|
||||||
if(res!=0)
|
|
||||||
return res
|
|
||||||
else
|
|
||||||
return id.compareTo(o.id)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "tx#"+getId()+"["+getBeginTime()/1000000+"ns - "+getEndTime()/1000000+"ns]";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-59
@@ -1,59 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2012 IT Just working.
|
|
||||||
* 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:
|
|
||||||
* IT Just working - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
package com.minres.scviewer.database.text
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.AssociationType;
|
|
||||||
import com.minres.scviewer.database.DataType;
|
|
||||||
import com.minres.scviewer.database.ITxAttributeType;
|
|
||||||
import com.minres.scviewer.database.ITxAttribute
|
|
||||||
|
|
||||||
class TxAttribute implements ITxAttribute{
|
|
||||||
|
|
||||||
TxAttributeType attributeType
|
|
||||||
|
|
||||||
def value
|
|
||||||
|
|
||||||
TxAttribute(String name, DataType dataType, AssociationType type, value){
|
|
||||||
attributeType = TxAttributeTypeFactory.instance.getAttrType(name, dataType, type)
|
|
||||||
switch(dataType){
|
|
||||||
case DataType.STRING:
|
|
||||||
case DataType.ENUMERATION:
|
|
||||||
this.value=value[1..-2]
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
this.value=value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TxAttribute(TxAttributeType other){
|
|
||||||
attributeType=other
|
|
||||||
}
|
|
||||||
|
|
||||||
TxAttribute(TxAttributeType other, value){
|
|
||||||
this(other.name, other.dataType, other.type, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return attributeType.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AssociationType getType() {
|
|
||||||
attributeType.type;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DataType getDataType() {
|
|
||||||
attributeType.dataType;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-31
@@ -1,31 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2012 IT Just working.
|
|
||||||
* 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:
|
|
||||||
* IT Just working - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
package com.minres.scviewer.database.text
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.AssociationType;
|
|
||||||
import com.minres.scviewer.database.DataType;
|
|
||||||
import com.minres.scviewer.database.ITxAttributeType;
|
|
||||||
|
|
||||||
class TxAttributeType implements ITxAttributeType {
|
|
||||||
String name
|
|
||||||
DataType dataType
|
|
||||||
AssociationType type
|
|
||||||
|
|
||||||
static TxAttributeType getAttrType(String name, DataType dataType, AssociationType type){
|
|
||||||
TxAttributeTypeFactory.instance.getAttrType(name, dataType, type)
|
|
||||||
}
|
|
||||||
|
|
||||||
TxAttributeType(String name, DataType dataType, AssociationType type){
|
|
||||||
this.name=name
|
|
||||||
this.dataType=dataType
|
|
||||||
this.type=type
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-38
@@ -1,38 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2012 IT Just working.
|
|
||||||
* 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:
|
|
||||||
* IT Just working - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
package com.minres.scviewer.database.text
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.AssociationType;
|
|
||||||
import com.minres.scviewer.database.DataType
|
|
||||||
import com.minres.scviewer.database.ITxAttributeType
|
|
||||||
import com.minres.scviewer.database.ITxAttribute
|
|
||||||
|
|
||||||
class TxAttributeTypeFactory {
|
|
||||||
private static final instance = new TxAttributeTypeFactory()
|
|
||||||
|
|
||||||
def attributes = [:]
|
|
||||||
|
|
||||||
private TxAttributeTypeFactory() {
|
|
||||||
TxAttributeTypeFactory.metaClass.constructor = {-> instance }
|
|
||||||
}
|
|
||||||
|
|
||||||
ITxAttributeType getAttrType(String name, DataType dataType, AssociationType type){
|
|
||||||
def key = name+":"+dataType.toString()
|
|
||||||
ITxAttributeType res
|
|
||||||
if(attributes.containsKey(key)){
|
|
||||||
res=attributes[key]
|
|
||||||
} else {
|
|
||||||
res=new TxAttributeType(name, dataType, type)
|
|
||||||
attributes[key]=res
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-36
@@ -1,36 +0,0 @@
|
|||||||
package com.minres.scviewer.database.text;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.ITx
|
|
||||||
import com.minres.scviewer.database.ITxEvent
|
|
||||||
import com.minres.scviewer.database.IWaveformEvent
|
|
||||||
|
|
||||||
class TxEvent implements ITxEvent {
|
|
||||||
|
|
||||||
final ITxEvent.Type type;
|
|
||||||
|
|
||||||
final Tx transaction;
|
|
||||||
|
|
||||||
final Long time
|
|
||||||
|
|
||||||
TxEvent(ITxEvent.Type type, ITx transaction) {
|
|
||||||
super();
|
|
||||||
this.type = type;
|
|
||||||
this.transaction = transaction;
|
|
||||||
this.time = type==ITxEvent.Type.BEGIN?transaction.beginTime:transaction.endTime
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
IWaveformEvent duplicate() throws CloneNotSupportedException {
|
|
||||||
new TxEvent(type, transaction, time)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
int compareTo(IWaveformEvent o) {
|
|
||||||
time.compareTo(o.time)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
String toString() {
|
|
||||||
type.toString()+"@"+time+" of tx #"+transaction.id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-52
@@ -1,52 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2012 IT Just working.
|
|
||||||
* 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:
|
|
||||||
* IT Just working - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
package com.minres.scviewer.database.text
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.ITxAttributeType
|
|
||||||
import com.minres.scviewer.database.ITxAttribute;
|
|
||||||
import com.minres.scviewer.database.ITxEvent;
|
|
||||||
import com.minres.scviewer.database.ITxGenerator;
|
|
||||||
import com.minres.scviewer.database.ITxStream;
|
|
||||||
import com.minres.scviewer.database.ITx;
|
|
||||||
import com.minres.scviewer.database.IWaveformEvent;
|
|
||||||
|
|
||||||
class TxGenerator implements ITxGenerator{
|
|
||||||
Long id
|
|
||||||
TxStream stream
|
|
||||||
String name
|
|
||||||
Boolean active = false
|
|
||||||
ArrayList<ITx> transactions=[]
|
|
||||||
|
|
||||||
ArrayList<ITxAttributeType> begin_attrs = []
|
|
||||||
int begin_attrs_idx = 0
|
|
||||||
ArrayList<ITxAttributeType> end_attrs= []
|
|
||||||
int end_attrs_idx = 0
|
|
||||||
|
|
||||||
TxGenerator(int id, TxStream stream, name){
|
|
||||||
this.id=id
|
|
||||||
this.stream=stream
|
|
||||||
this.name=name
|
|
||||||
}
|
|
||||||
|
|
||||||
ITxStream<? extends ITxEvent> getStream(){
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ITx> getTransactions(){
|
|
||||||
return transactions
|
|
||||||
}
|
|
||||||
|
|
||||||
Boolean isActive() {return active};
|
|
||||||
|
|
||||||
}
|
|
||||||
-36
@@ -1,36 +0,0 @@
|
|||||||
package com.minres.scviewer.database.text
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.ITxRelation
|
|
||||||
import com.minres.scviewer.database.ITx;
|
|
||||||
import com.minres.scviewer.database.RelationType;
|
|
||||||
|
|
||||||
class TxRelation implements ITxRelation {
|
|
||||||
Tx source
|
|
||||||
|
|
||||||
Tx target
|
|
||||||
|
|
||||||
RelationType relationType
|
|
||||||
|
|
||||||
|
|
||||||
public TxRelation(RelationType relationType, Tx source, Tx target) {
|
|
||||||
this.source = source;
|
|
||||||
this.target = target;
|
|
||||||
this.relationType = relationType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RelationType getRelationType() {
|
|
||||||
return relationType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ITx getSource() {
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ITx getTarget() {
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-117
@@ -1,117 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2012 IT Just working.
|
|
||||||
* 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:
|
|
||||||
* IT Just working - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
package com.minres.scviewer.database.text
|
|
||||||
|
|
||||||
import java.beans.PropertyChangeListener;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.NavigableMap;
|
|
||||||
|
|
||||||
import com.google.common.collect.TreeMultimap
|
|
||||||
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.HierNode;
|
|
||||||
import com.minres.scviewer.database.IHierNode
|
|
||||||
import com.minres.scviewer.database.ITxStream
|
|
||||||
import com.minres.scviewer.database.ITx
|
|
||||||
|
|
||||||
class TxStream extends HierNode implements ITxStream {
|
|
||||||
|
|
||||||
Long id
|
|
||||||
|
|
||||||
IWaveformDb database
|
|
||||||
|
|
||||||
String fullName
|
|
||||||
|
|
||||||
String kind
|
|
||||||
|
|
||||||
def generators = []
|
|
||||||
|
|
||||||
int maxConcurrency
|
|
||||||
|
|
||||||
private TreeMap<Long, List<ITxEvent>> events
|
|
||||||
|
|
||||||
TxStream(IWaveformDb db, int id, String name, String kind){
|
|
||||||
super(name)
|
|
||||||
this.id=id
|
|
||||||
this.database=db
|
|
||||||
this.fullName=name
|
|
||||||
this.kind=kind
|
|
||||||
this.maxConcurrency=0
|
|
||||||
events = new TreeMap<Long, List<ITxEvent>>()
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ITxGenerator> getGenerators(){
|
|
||||||
return generators as List<ITxGenerator>
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IWaveformDb getDb() {
|
|
||||||
return database
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMaxConcurrency() {
|
|
||||||
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))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
def rowendtime = [0]
|
|
||||||
events.keySet().each{long time ->
|
|
||||||
def value=events.get(time)
|
|
||||||
def starts=value.findAll{ITxEvent event ->event.type==ITxEvent.Type.BEGIN}
|
|
||||||
starts.each {ITxEvent event ->
|
|
||||||
Tx tx = event.transaction
|
|
||||||
def rowIdx = 0
|
|
||||||
for(rowIdx=0; rowIdx<rowendtime.size() && rowendtime[rowIdx]>tx.beginTime; rowIdx++);
|
|
||||||
if(rowendtime.size<=rowIdx)
|
|
||||||
rowendtime<<tx.endTime
|
|
||||||
else
|
|
||||||
rowendtime[rowIdx]=tx.endTime
|
|
||||||
tx.concurrencyIndex=rowIdx
|
|
||||||
}
|
|
||||||
}
|
|
||||||
maxConcurrency=rowendtime.size()
|
|
||||||
}
|
|
||||||
return maxConcurrency
|
|
||||||
}
|
|
||||||
|
|
||||||
private putEvent(ITxEvent event){
|
|
||||||
if(!events.containsKey(event.time))
|
|
||||||
events.put(event.time, [event])
|
|
||||||
else
|
|
||||||
events[event.time]<<event
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NavigableMap getEvents() {
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection getWaveformEventsAtTime(Long time) {
|
|
||||||
return events.get(time);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Boolean equals(IWaveform<? extends IWaveformEvent> other) {
|
|
||||||
return(other instanceof TxStream && this.getId()==other.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
|
||||||
<classpathentry kind="src" path="src/"/>
|
|
||||||
<classpathentry kind="output" path="target/classes"/>
|
|
||||||
</classpath>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
/bin/
|
|
||||||
/target/
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>com.minres.scviewer.database.ui.swt</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.ManifestBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.SchemaBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
|
||||||
<nature>org.eclipse.pde.PluginNature</nature>
|
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
encoding/<project>=UTF-8
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.7
|
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.source=1.7
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
activeProfiles=
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
resolveWorkspaceProjects=true
|
|
||||||
version=1
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
pluginProject.extensions=false
|
|
||||||
resolve.requirebundle=false
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
Manifest-Version: 1.0
|
|
||||||
Bundle-ManifestVersion: 2
|
|
||||||
Bundle-Name: SWT widget
|
|
||||||
Bundle-SymbolicName: com.minres.scviewer.database.ui.swt
|
|
||||||
Bundle-Version: 1.0.0.qualifier
|
|
||||||
Bundle-Vendor: MINRES Technologies GmbH
|
|
||||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
|
||||||
Require-Bundle: org.eclipse.swt;bundle-version="3.103.1",
|
|
||||||
com.minres.scviewer.database;bundle-version="1.0.0",
|
|
||||||
com.google.guava;bundle-version="15.0.0",
|
|
||||||
org.eclipse.jface,
|
|
||||||
org.eclipse.equinox.registry,
|
|
||||||
com.minres.scviewer.database.ui,
|
|
||||||
org.eclipse.core.runtime,
|
|
||||||
org.eclipse.osgi
|
|
||||||
Export-Package: com.minres.scviewer.database.swt
|
|
||||||
Bundle-ClassPath: .
|
|
||||||
Bundle-ActivationPolicy: lazy
|
|
||||||
Bundle-Activator: com.minres.scviewer.database.swt.DatabaseUiPlugin
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
###############################################################################
|
|
||||||
# Copyright (c) 2014, 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
|
|
||||||
###############################################################################
|
|
||||||
bin.includes = META-INF/,\
|
|
||||||
.
|
|
||||||
source.. = src/
|
|
||||||
jars.compile.order = .
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<artifactId>com.minres.scviewer.database.ui.swt</artifactId>
|
|
||||||
<packaging>eclipse-plugin</packaging>
|
|
||||||
<parent>
|
|
||||||
<groupId>com.minres.scviewer</groupId>
|
|
||||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../com.minres.scviewer.parent</relativePath>
|
|
||||||
</parent>
|
|
||||||
</project>
|
|
||||||
-27
@@ -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.swt;
|
|
||||||
|
|
||||||
import org.eclipse.core.runtime.IStatus;
|
|
||||||
import org.eclipse.core.runtime.Plugin;
|
|
||||||
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..."));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-26
@@ -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.swt;
|
|
||||||
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.swt.internal.WaveformViewer;
|
|
||||||
import com.minres.scviewer.database.ui.IWaveformViewer;
|
|
||||||
import com.minres.scviewer.database.ui.IWaveformViewerFactory;
|
|
||||||
|
|
||||||
public class WaveformViewerFactory implements IWaveformViewerFactory {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IWaveformViewer createPanel(Composite parent) {
|
|
||||||
return new WaveformViewer(parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-178
@@ -1,178 +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.swt.internal;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
import org.eclipse.swt.graphics.Color;
|
|
||||||
import org.eclipse.swt.graphics.GC;
|
|
||||||
import org.eclipse.swt.graphics.Path;
|
|
||||||
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.ui.WaveformColors;
|
|
||||||
|
|
||||||
public class ArrowPainter implements IPainter {
|
|
||||||
|
|
||||||
private final int xCtrlOffset = 50;
|
|
||||||
|
|
||||||
private final int yCtrlOffset = 30;
|
|
||||||
|
|
||||||
private WaveformCanvas waveCanvas;
|
|
||||||
|
|
||||||
private ITx tx;
|
|
||||||
|
|
||||||
private List<LinkEntry> iRect;
|
|
||||||
|
|
||||||
private List<LinkEntry> oRect;
|
|
||||||
|
|
||||||
private Rectangle txRectangle;
|
|
||||||
|
|
||||||
private RelationType highlightType;
|
|
||||||
|
|
||||||
long scaleFactor;
|
|
||||||
|
|
||||||
boolean deferredUpdate;
|
|
||||||
|
|
||||||
public ArrowPainter(WaveformCanvas waveCanvas, RelationType relationType) {
|
|
||||||
this.waveCanvas = waveCanvas;
|
|
||||||
highlightType=relationType;
|
|
||||||
setTx(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RelationType getHighlightType() {
|
|
||||||
return highlightType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHighlightType(RelationType highlightType) {
|
|
||||||
this.highlightType = highlightType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ITx getTx() {
|
|
||||||
return tx;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTx(ITx newTx) {
|
|
||||||
this.tx = newTx;
|
|
||||||
iRect = new LinkedList<>();
|
|
||||||
oRect = new LinkedList<>();
|
|
||||||
scaleFactor = waveCanvas.getScaleFactor();
|
|
||||||
if (tx != null) {
|
|
||||||
calculateGeometries();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void calculateGeometries() {
|
|
||||||
deferredUpdate = false;
|
|
||||||
ITxStream<?> stream = tx.getStream();
|
|
||||||
IWaveformPainter painter = waveCanvas.wave2painterMap.get(stream);
|
|
||||||
if (painter == null) { // stream has been added but painter not yet
|
|
||||||
// created
|
|
||||||
deferredUpdate = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int laneHeight = painter.getHeight() / stream.getMaxConcurrency();
|
|
||||||
txRectangle = new Rectangle((int) (tx.getBeginTime() / scaleFactor),
|
|
||||||
waveCanvas.rulerHeight + painter.getVerticalOffset() + laneHeight * tx.getConcurrencyIndex(),
|
|
||||||
(int) ((tx.getEndTime() - tx.getBeginTime()) / scaleFactor), laneHeight);
|
|
||||||
deriveGeom(tx.getIncomingRelations(), iRect, false);
|
|
||||||
deriveGeom(tx.getOutgoingRelations(), oRect, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void deriveGeom(Collection<ITxRelation> relations, List<LinkEntry> res, boolean useTarget) {
|
|
||||||
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);
|
|
||||||
res.add(new LinkEntry(bb, iTxRelation.getRelationType()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void paintArea(GC gc, Rectangle area) {
|
|
||||||
Color fgColor = waveCanvas.colors[WaveformColors.REL_ARROW.ordinal()];
|
|
||||||
Color highliteColor = waveCanvas.colors[WaveformColors.REL_ARROW_HIGHLITE.ordinal()];
|
|
||||||
|
|
||||||
if (deferredUpdate || (tx != null && waveCanvas.getScaleFactor() != scaleFactor)) {
|
|
||||||
scaleFactor = waveCanvas.getScaleFactor();
|
|
||||||
calculateGeometries();
|
|
||||||
}
|
|
||||||
for (LinkEntry entry : iRect) {
|
|
||||||
Point target = drawPath(gc, highlightType.equals(entry.relationType) ? highliteColor : fgColor,
|
|
||||||
entry.rectangle, txRectangle);
|
|
||||||
drawArrow(gc, target);
|
|
||||||
}
|
|
||||||
for (LinkEntry entry : oRect) {
|
|
||||||
Point target = drawPath(gc, highlightType.equals(entry.relationType) ? highliteColor : fgColor, txRectangle,
|
|
||||||
entry.rectangle);
|
|
||||||
drawArrow(gc, target);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void drawArrow(GC gc, Point target) {
|
|
||||||
gc.drawLine(target.x - 8, target.y - 5, target.x, target.y);
|
|
||||||
gc.drawLine(target.x - 8, target.y + 5, target.x, target.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Point drawPath(GC gc, Color fgColor, Rectangle srcRectangle, Rectangle tgtRectangle) {
|
|
||||||
Point point1 = new Point(0, srcRectangle.y + srcRectangle.height / 2);
|
|
||||||
Point point2 = new Point(0, tgtRectangle.y + tgtRectangle.height / 2);
|
|
||||||
|
|
||||||
point1.x = srcRectangle.x;
|
|
||||||
point2.x = tgtRectangle.x;
|
|
||||||
|
|
||||||
if (point2.x > point1.x + srcRectangle.width)
|
|
||||||
point1.x += srcRectangle.width;
|
|
||||||
if (point1.x > point2.x + tgtRectangle.width)
|
|
||||||
point2.x += tgtRectangle.width;
|
|
||||||
|
|
||||||
Path path = new Path(Display.getCurrent());
|
|
||||||
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);
|
|
||||||
} else
|
|
||||||
path.cubicTo(point1.x + xCtrlOffset, point1.y, point2.x - xCtrlOffset, point2.y, point2.x, point2.y);
|
|
||||||
gc.setAntialias(SWT.ON);
|
|
||||||
gc.setForeground(fgColor);
|
|
||||||
gc.drawPath(path);
|
|
||||||
path.dispose();
|
|
||||||
return point2;
|
|
||||||
}
|
|
||||||
|
|
||||||
class LinkEntry {
|
|
||||||
public Rectangle rectangle;
|
|
||||||
public RelationType relationType;
|
|
||||||
|
|
||||||
public LinkEntry(Rectangle rectangle, RelationType relationType) {
|
|
||||||
super();
|
|
||||||
this.rectangle = rectangle;
|
|
||||||
this.relationType = relationType;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-78
@@ -1,78 +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.swt.internal;
|
|
||||||
|
|
||||||
import org.eclipse.swt.graphics.Color;
|
|
||||||
import org.eclipse.swt.graphics.GC;
|
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.ui.ICursor;
|
|
||||||
import com.minres.scviewer.database.ui.WaveformColors;
|
|
||||||
|
|
||||||
public class CursorPainter implements IPainter, ICursor {
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private final WaveformCanvas waveCanvas;
|
|
||||||
|
|
||||||
private long time;
|
|
||||||
|
|
||||||
private boolean isDragging;
|
|
||||||
|
|
||||||
public final int id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param i
|
|
||||||
* @param txDisplay
|
|
||||||
*/
|
|
||||||
public CursorPainter(WaveformCanvas txDisplay, long time, int id) {
|
|
||||||
this.waveCanvas = txDisplay;
|
|
||||||
this.time=time;
|
|
||||||
this.id=id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getTime() {
|
|
||||||
return time;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTime(long time) {
|
|
||||||
this.time = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDragging() {
|
|
||||||
return isDragging;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDragging(boolean isDragging) {
|
|
||||||
this.isDragging = isDragging;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void paintArea(GC gc, Rectangle area) {
|
|
||||||
if(this.waveCanvas.painterList.size()>0){
|
|
||||||
long scaleFactor=waveCanvas.getScaleFactor();
|
|
||||||
int x = (int) (time/scaleFactor);
|
|
||||||
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()];
|
|
||||||
if(x>=area.x && x<=(area.x+area.width)){
|
|
||||||
gc.setForeground(isDragging?dragColor:drawColor);
|
|
||||||
gc.drawLine(x, top, x, area.y+area.height);
|
|
||||||
gc.setBackground(drawColor);
|
|
||||||
gc.setForeground(textColor);
|
|
||||||
Double dTime=new Double(time);
|
|
||||||
gc.drawText((dTime/waveCanvas.getScaleFactorPow10())+waveCanvas.getUnitStr(), x+1, top);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-20
@@ -1,20 +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.swt.internal;
|
|
||||||
|
|
||||||
import org.eclipse.swt.graphics.GC;
|
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
|
||||||
|
|
||||||
public interface IPainter {
|
|
||||||
|
|
||||||
void paintArea(GC gc,Rectangle area);
|
|
||||||
|
|
||||||
}
|
|
||||||
-23
@@ -1,23 +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.swt.internal;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.ui.TrackEntry;
|
|
||||||
|
|
||||||
public interface IWaveformPainter extends IPainter {
|
|
||||||
|
|
||||||
public int getHeight();
|
|
||||||
|
|
||||||
public int getVerticalOffset();
|
|
||||||
|
|
||||||
public TrackEntry getTrackEntry();
|
|
||||||
|
|
||||||
}
|
|
||||||
-566
@@ -1,566 +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.swt.internal;
|
|
||||||
|
|
||||||
import java.beans.PropertyChangeEvent;
|
|
||||||
import java.beans.PropertyChangeListener;
|
|
||||||
import java.beans.PropertyChangeSupport;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.ListIterator;
|
|
||||||
|
|
||||||
public class ObservableList<E> implements List<E> {
|
|
||||||
private List<E> delegate;
|
|
||||||
private PropertyChangeSupport pcs;
|
|
||||||
public static final String SIZE_PROPERTY = "size";
|
|
||||||
public static final String CONTENT_PROPERTY = "content";
|
|
||||||
|
|
||||||
public ObservableList() {
|
|
||||||
this(new ArrayList<E>());
|
|
||||||
}
|
|
||||||
|
|
||||||
public ObservableList(List<E> delegate) {
|
|
||||||
this.delegate = delegate;
|
|
||||||
this.pcs = new PropertyChangeSupport(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<E> getContent() {
|
|
||||||
return Collections.unmodifiableList(this.delegate);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected List<E> getDelegateList() {
|
|
||||||
return this.delegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void fireElementAddedEvent(int index, Object element) {
|
|
||||||
fireElementEvent(new ElementAddedEvent(this, element, index));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void fireMultiElementAddedEvent(int index, List<E> values) {
|
|
||||||
fireElementEvent(new MultiElementAddedEvent(this, index, values));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void fireElementClearedEvent(List<E> values) {
|
|
||||||
fireElementEvent(new ElementClearedEvent(this, values));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void fireElementRemovedEvent(int index, Object element) {
|
|
||||||
fireElementEvent(new ElementRemovedEvent(this, element, index));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void fireMultiElementRemovedEvent(List<E> values) {
|
|
||||||
fireElementEvent(new MultiElementRemovedEvent(this, values));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void fireElementUpdatedEvent(int index, Object oldValue, Object newValue) {
|
|
||||||
fireElementEvent(new ElementUpdatedEvent(this, oldValue, newValue, index));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void fireElementEvent(ElementEvent event) {
|
|
||||||
this.pcs.firePropertyChange(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void fireSizeChangedEvent(int oldValue, int newValue) {
|
|
||||||
this.pcs.firePropertyChange(new PropertyChangeEvent(this, "size", Integer.valueOf(oldValue), Integer
|
|
||||||
.valueOf(newValue)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void add(int index, E element) {
|
|
||||||
int oldSize = size();
|
|
||||||
this.delegate.add(index, element);
|
|
||||||
fireElementAddedEvent(index, element);
|
|
||||||
fireSizeChangedEvent(oldSize, size());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean add(E o) {
|
|
||||||
int oldSize = size();
|
|
||||||
boolean success = this.delegate.add(o);
|
|
||||||
if (success) {
|
|
||||||
fireElementAddedEvent(size() - 1, o);
|
|
||||||
fireSizeChangedEvent(oldSize, size());
|
|
||||||
}
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean addAll(Collection<? extends E> c) {
|
|
||||||
int oldSize = size();
|
|
||||||
int index = size() - 1;
|
|
||||||
index = (index < 0) ? 0 : index;
|
|
||||||
|
|
||||||
boolean success = this.delegate.addAll(c);
|
|
||||||
if ((success) && (c != null)) {
|
|
||||||
List<E> values = new ArrayList<E>();
|
|
||||||
for (Iterator<? extends E> i = c.iterator(); i.hasNext();) {
|
|
||||||
values.add(i.next());
|
|
||||||
}
|
|
||||||
if (values.size() > 0) {
|
|
||||||
fireMultiElementAddedEvent(index, values);
|
|
||||||
fireSizeChangedEvent(oldSize, size());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean addAll(int index, Collection<? extends E> c) {
|
|
||||||
int oldSize = size();
|
|
||||||
boolean success = this.delegate.addAll(index, c);
|
|
||||||
|
|
||||||
if ((success) && (c != null)) {
|
|
||||||
List<E> values = new ArrayList<E>();
|
|
||||||
for (Iterator<? extends E> i = c.iterator(); i.hasNext();) {
|
|
||||||
values.add(i.next());
|
|
||||||
}
|
|
||||||
if (values.size() > 0) {
|
|
||||||
fireMultiElementAddedEvent(index, values);
|
|
||||||
fireSizeChangedEvent(oldSize, size());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clear() {
|
|
||||||
int oldSize = size();
|
|
||||||
List<E> values = new ArrayList<E>();
|
|
||||||
values.addAll(this.delegate);
|
|
||||||
this.delegate.clear();
|
|
||||||
if (!(values.isEmpty())) {
|
|
||||||
fireElementClearedEvent(values);
|
|
||||||
}
|
|
||||||
fireSizeChangedEvent(oldSize, size());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean contains(Object o) {
|
|
||||||
return this.delegate.contains(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean containsAll(Collection<?> c) {
|
|
||||||
return this.delegate.containsAll(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
return this.delegate.equals(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
public E get(int index) {
|
|
||||||
return this.delegate.get(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int hashCode() {
|
|
||||||
return this.delegate.hashCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int indexOf(Object o) {
|
|
||||||
return this.delegate.indexOf(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isEmpty() {
|
|
||||||
return this.delegate.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Iterator<E> iterator() {
|
|
||||||
return new ObservableIterator(this.delegate.iterator());
|
|
||||||
}
|
|
||||||
|
|
||||||
public int lastIndexOf(Object o) {
|
|
||||||
return this.delegate.lastIndexOf(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListIterator<E> listIterator() {
|
|
||||||
return new ObservableListIterator(this.delegate.listIterator(), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListIterator<E> listIterator(int index) {
|
|
||||||
return new ObservableListIterator(this.delegate.listIterator(index), index);
|
|
||||||
}
|
|
||||||
|
|
||||||
public E remove(int index) {
|
|
||||||
int oldSize = size();
|
|
||||||
E element = this.delegate.remove(index);
|
|
||||||
fireElementRemovedEvent(index, element);
|
|
||||||
fireSizeChangedEvent(oldSize, size());
|
|
||||||
return element;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean remove(Object o) {
|
|
||||||
int index = this.delegate.indexOf(o);
|
|
||||||
if(index<0) return false;
|
|
||||||
return remove(index)!=null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean remove(Collection<?> o) {
|
|
||||||
int oldSize = size();
|
|
||||||
int index = this.delegate.indexOf(o);
|
|
||||||
boolean success = this.delegate.remove(o);
|
|
||||||
if (success) {
|
|
||||||
fireElementRemovedEvent(index, o);
|
|
||||||
fireSizeChangedEvent(oldSize, size());
|
|
||||||
}
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
public boolean removeAll(Collection<?> c) {
|
|
||||||
if (c == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<E> values = new ArrayList<E>();
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int oldSize = size();
|
|
||||||
boolean success = this.delegate.removeAll(c);
|
|
||||||
if ((success) && (!(values.isEmpty()))) {
|
|
||||||
fireMultiElementRemovedEvent(values);
|
|
||||||
fireSizeChangedEvent(oldSize, size());
|
|
||||||
}
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean retainAll(Collection<?> c) {
|
|
||||||
if (c == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<E> values = new ArrayList<E>();
|
|
||||||
Iterator<? extends E> i;
|
|
||||||
if (c != null) {
|
|
||||||
for (i = this.delegate.iterator(); i.hasNext();) {
|
|
||||||
E element = i.next();
|
|
||||||
if (!(c.contains(element))) {
|
|
||||||
values.add(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int oldSize = size();
|
|
||||||
boolean success = this.delegate.retainAll(c);
|
|
||||||
if ((success) && (!(values.isEmpty()))) {
|
|
||||||
fireMultiElementRemovedEvent(values);
|
|
||||||
fireSizeChangedEvent(oldSize, size());
|
|
||||||
}
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
public E set(int index, E o) {
|
|
||||||
E oldValue = this.delegate.set(index, o);
|
|
||||||
fireElementUpdatedEvent(index, oldValue, o);
|
|
||||||
return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int size() {
|
|
||||||
return this.delegate.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSize() {
|
|
||||||
return size();
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<E> subList(int fromIndex, int toIndex) {
|
|
||||||
return this.delegate.subList(fromIndex, toIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void rotate(int fromIndex, int toIndex, int distance){
|
|
||||||
Collections.rotate(this.delegate.subList(fromIndex, toIndex), distance);
|
|
||||||
fireElementEvent(new MultiElementUpdatedEvent(this, this.delegate.subList(fromIndex, toIndex)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object[] toArray() {
|
|
||||||
return this.delegate.toArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T> T[] toArray(T[] a){
|
|
||||||
return this.delegate.toArray(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addPropertyChangeListener(PropertyChangeListener listener) {
|
|
||||||
this.pcs.addPropertyChangeListener(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
|
|
||||||
this.pcs.addPropertyChangeListener(propertyName, listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
public PropertyChangeListener[] getPropertyChangeListeners() {
|
|
||||||
return this.pcs.getPropertyChangeListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
public PropertyChangeListener[] getPropertyChangeListeners(String propertyName) {
|
|
||||||
return this.pcs.getPropertyChangeListeners(propertyName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removePropertyChangeListener(PropertyChangeListener listener) {
|
|
||||||
this.pcs.removePropertyChangeListener(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
|
|
||||||
this.pcs.removePropertyChangeListener(propertyName, listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasListeners(String propertyName) {
|
|
||||||
return this.pcs.hasListeners(propertyName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class MultiElementUpdatedEvent extends ObservableList.ElementEvent {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 7819626246672640599L;
|
|
||||||
|
|
||||||
private List<Object> values = new ArrayList<Object>();
|
|
||||||
|
|
||||||
public MultiElementUpdatedEvent(Object source, List<?> values) {
|
|
||||||
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0,
|
|
||||||
ObservableList.ChangeType.MULTI_UPDATED);
|
|
||||||
if (values != null)
|
|
||||||
this.values.addAll(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<?> getValues() {
|
|
||||||
return Collections.unmodifiableList(this.values);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class MultiElementRemovedEvent extends ObservableList.ElementEvent {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 7819626246672640599L;
|
|
||||||
|
|
||||||
private List<Object> values = new ArrayList<Object>();
|
|
||||||
|
|
||||||
public MultiElementRemovedEvent(Object source, List<?> values) {
|
|
||||||
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0,
|
|
||||||
ObservableList.ChangeType.MULTI_REMOVE);
|
|
||||||
if (values != null)
|
|
||||||
this.values.addAll(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<?> getValues() {
|
|
||||||
return Collections.unmodifiableList(this.values);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class MultiElementAddedEvent extends ObservableList.ElementEvent {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = -116376519087713082L;
|
|
||||||
private List<Object> values = new ArrayList<Object>();
|
|
||||||
|
|
||||||
public MultiElementAddedEvent(Object source, int index, List<?> values) {
|
|
||||||
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, index,
|
|
||||||
ObservableList.ChangeType.MULTI_ADD);
|
|
||||||
if (values != null)
|
|
||||||
this.values.addAll(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<?> getValues() {
|
|
||||||
return Collections.unmodifiableList(this.values);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ElementClearedEvent extends ObservableList.ElementEvent {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = -8654027608903811577L;
|
|
||||||
private List<Object> values = new ArrayList<Object>();
|
|
||||||
|
|
||||||
public ElementClearedEvent(Object source, List<?> values) {
|
|
||||||
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0,
|
|
||||||
ObservableList.ChangeType.CLEARED);
|
|
||||||
if (values != null)
|
|
||||||
this.values.addAll(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<?> getValues() {
|
|
||||||
return Collections.unmodifiableList(this.values);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ElementRemovedEvent extends ObservableList.ElementEvent {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = -6664217547528652003L;
|
|
||||||
|
|
||||||
public ElementRemovedEvent(Object source, Object value, int index) {
|
|
||||||
super(source, value, null, index, ObservableList.ChangeType.REMOVED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ElementUpdatedEvent extends ObservableList.ElementEvent {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 7793549621724991011L;
|
|
||||||
|
|
||||||
public ElementUpdatedEvent(Object source, Object oldValue, Object newValue, int index) {
|
|
||||||
super(source, oldValue, newValue, index, ObservableList.ChangeType.UPDATED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ElementAddedEvent extends ObservableList.ElementEvent {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = -6990071468319043554L;
|
|
||||||
|
|
||||||
public ElementAddedEvent(Object source, Object newValue, int index) {
|
|
||||||
super(source, null, newValue, index, ObservableList.ChangeType.ADDED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static abstract class ElementEvent extends PropertyChangeEvent {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 964946867437728530L;
|
|
||||||
private final ObservableList.ChangeType type;
|
|
||||||
private final int index;
|
|
||||||
|
|
||||||
public ElementEvent(Object source, Object oldValue, Object newValue, int index, ObservableList.ChangeType type) {
|
|
||||||
super(source, "content", oldValue, newValue);
|
|
||||||
this.type = type;
|
|
||||||
this.index = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getIndex() {
|
|
||||||
return this.index;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getType() {
|
|
||||||
return this.type.ordinal();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ObservableList.ChangeType getChangeType() {
|
|
||||||
return this.type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTypeAsString() {
|
|
||||||
return this.type.name().toUpperCase();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static enum ChangeType {
|
|
||||||
ADDED, UPDATED, REMOVED, CLEARED, MULTI_ADD, MULTI_UPDATED, MULTI_REMOVE, NONE;
|
|
||||||
|
|
||||||
public static final Object oldValue;
|
|
||||||
public static final Object newValue;
|
|
||||||
|
|
||||||
public static ChangeType resolve(int ordinal) {
|
|
||||||
switch (ordinal) {
|
|
||||||
case 0:
|
|
||||||
return ADDED;
|
|
||||||
case 2:
|
|
||||||
return REMOVED;
|
|
||||||
case 3:
|
|
||||||
return CLEARED;
|
|
||||||
case 4:
|
|
||||||
return MULTI_ADD;
|
|
||||||
case 5:
|
|
||||||
return MULTI_REMOVE;
|
|
||||||
case 6:
|
|
||||||
return NONE;
|
|
||||||
case 1:
|
|
||||||
}
|
|
||||||
return UPDATED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static {
|
|
||||||
oldValue = new Object();
|
|
||||||
newValue = new Object();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected class ObservableListIterator extends ObservableList<E>.ObservableIterator implements ListIterator<E> {
|
|
||||||
|
|
||||||
public ObservableListIterator(ListIterator<E> listIterator, int index) {
|
|
||||||
super(listIterator);
|
|
||||||
this.cursor = (index - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListIterator<E> getListIterator() {
|
|
||||||
return ((ListIterator<E>) getDelegate());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void add(E o) {
|
|
||||||
ObservableList.this.add(o);
|
|
||||||
this.cursor += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasPrevious() {
|
|
||||||
return getListIterator().hasPrevious();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int nextIndex() {
|
|
||||||
return getListIterator().nextIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
public E previous() {
|
|
||||||
return getListIterator().previous();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int previousIndex() {
|
|
||||||
return getListIterator().previousIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void set(E o) {
|
|
||||||
ObservableList.this.set(this.cursor, o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected class ObservableIterator implements Iterator<E> {
|
|
||||||
|
|
||||||
private Iterator<E> iterDelegate;
|
|
||||||
|
|
||||||
protected int cursor = -1;
|
|
||||||
|
|
||||||
public ObservableIterator(Iterator<E> paramIterator) {
|
|
||||||
this.iterDelegate = paramIterator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Iterator<E> getDelegate() {
|
|
||||||
return this.iterDelegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasNext() {
|
|
||||||
return this.iterDelegate.hasNext();
|
|
||||||
}
|
|
||||||
|
|
||||||
public E next() {
|
|
||||||
this.cursor += 1;
|
|
||||||
return this.iterDelegate.next();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void remove() {
|
|
||||||
int oldSize = ObservableList.this.size();
|
|
||||||
Object element = ObservableList.this.get(this.cursor);
|
|
||||||
this.iterDelegate.remove();
|
|
||||||
ObservableList.this.fireElementRemovedEvent(this.cursor, element);
|
|
||||||
ObservableList.this.fireSizeChangedEvent(oldSize, ObservableList.this.size());
|
|
||||||
this.cursor -= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-78
@@ -1,78 +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.swt.internal;
|
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
import org.eclipse.swt.graphics.Color;
|
|
||||||
import org.eclipse.swt.graphics.GC;
|
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
|
||||||
import org.eclipse.wb.swt.SWTResourceManager;
|
|
||||||
|
|
||||||
public class RulerPainter implements IPainter {
|
|
||||||
protected WaveformCanvas waveCanvas;
|
|
||||||
|
|
||||||
static final int rulerTickMinorC = 10;
|
|
||||||
static final int rulerTickMajorC = 100;
|
|
||||||
|
|
||||||
public RulerPainter(WaveformCanvas waveCanvas) {
|
|
||||||
this.waveCanvas=waveCanvas;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void paintArea(GC gc, Rectangle area) {
|
|
||||||
Color headerFgColor=waveCanvas.getDisplay().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND);
|
|
||||||
if(headerFgColor.isDisposed())
|
|
||||||
headerFgColor=SWTResourceManager.getColor(0,0,0);
|
|
||||||
Color headerBgColor = waveCanvas.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
|
|
||||||
if(headerBgColor.isDisposed())
|
|
||||||
headerBgColor=SWTResourceManager.getColor(255,255,255);
|
|
||||||
String unit=waveCanvas.getUnitStr();
|
|
||||||
int unitMultiplier=waveCanvas.getUnitMultiplier();
|
|
||||||
long scaleFactor=waveCanvas.getScaleFactor();
|
|
||||||
long zoomLevel = waveCanvas.getZoomLevel();
|
|
||||||
long start=area.x*scaleFactor;
|
|
||||||
long end=start+area.width*scaleFactor;
|
|
||||||
|
|
||||||
long rulerTickMinor = rulerTickMinorC*scaleFactor;
|
|
||||||
long rulerTickMajor = rulerTickMajorC*scaleFactor;
|
|
||||||
if(zoomLevel%3==1){
|
|
||||||
rulerTickMinor/=3;
|
|
||||||
rulerTickMajor/=3;
|
|
||||||
}
|
|
||||||
int minorTickY = waveCanvas.rulerHeight-5;
|
|
||||||
int majorTickY = waveCanvas.rulerHeight-15;
|
|
||||||
int textY=waveCanvas.rulerHeight-20;
|
|
||||||
int baselineY=waveCanvas.rulerHeight - 1;
|
|
||||||
int bottom=waveCanvas.rulerHeight - 2;
|
|
||||||
|
|
||||||
long startMinorIncr = start;
|
|
||||||
long modulo = start % rulerTickMinor;
|
|
||||||
startMinorIncr+=rulerTickMinor-modulo;
|
|
||||||
|
|
||||||
gc.setBackground(waveCanvas.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
|
|
||||||
gc.fillRectangle(new Rectangle(area.x, area.y, area.width, waveCanvas.rulerHeight));
|
|
||||||
gc.setBackground(headerBgColor);
|
|
||||||
gc.fillRectangle(new Rectangle(area.x, area.y, area.width, baselineY));
|
|
||||||
gc.setForeground(headerFgColor);
|
|
||||||
gc.drawLine(area.x, area.y+bottom, area.x+area.width, area.y+bottom);
|
|
||||||
|
|
||||||
for (long tick = startMinorIncr; tick < end; tick += rulerTickMinor) {
|
|
||||||
int x0 = (int) (tick/scaleFactor);
|
|
||||||
if ((tick % rulerTickMajor) == 0) {
|
|
||||||
gc.drawText(Double.toString(tick/scaleFactor*unitMultiplier)+unit, x0, area.y+textY);
|
|
||||||
gc.drawLine(x0, area.y+majorTickY, x0,area.y+ bottom);
|
|
||||||
} else {
|
|
||||||
gc.drawLine(x0, area.y+minorTickY, x0, area.y+bottom);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-145
@@ -1,145 +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.swt.internal;
|
|
||||||
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.NavigableMap;
|
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
import org.eclipse.swt.graphics.Color;
|
|
||||||
import org.eclipse.swt.graphics.GC;
|
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.ISignal;
|
|
||||||
import com.minres.scviewer.database.ISignalChange;
|
|
||||||
import com.minres.scviewer.database.ISignalChangeMulti;
|
|
||||||
import com.minres.scviewer.database.ISignalChangeSingle;
|
|
||||||
import com.minres.scviewer.database.ui.TrackEntry;
|
|
||||||
import com.minres.scviewer.database.ui.WaveformColors;
|
|
||||||
|
|
||||||
public class SignalPainter extends TrackPainter {
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private final WaveformCanvas waveCanvas;
|
|
||||||
private ISignal<? extends ISignalChange> signal;
|
|
||||||
|
|
||||||
public SignalPainter(WaveformCanvas txDisplay, boolean even, TrackEntry trackEntry) {
|
|
||||||
super(trackEntry, even);
|
|
||||||
this.waveCanvas = txDisplay;
|
|
||||||
this.signal=trackEntry.getSignal();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void paintArea(GC gc, Rectangle area) {
|
|
||||||
if(trackEntry.selected)
|
|
||||||
gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]);
|
|
||||||
else
|
|
||||||
gc.setBackground(this.waveCanvas.colors[even?WaveformColors.TRACK_BG_EVEN.ordinal():WaveformColors.TRACK_BG_ODD.ordinal()]);
|
|
||||||
gc.setFillRule(SWT.FILL_EVEN_ODD);
|
|
||||||
gc.fillRectangle(area);
|
|
||||||
Entry<Long, ? extends ISignalChange> firstChange=signal.getEvents().floorEntry(area.x*this.waveCanvas.getScaleFactor());
|
|
||||||
Entry<Long, ? extends ISignalChange> lastTx=signal.getEvents().ceilingEntry((area.x+area.width)*this.waveCanvas.getScaleFactor());
|
|
||||||
if(firstChange==null){
|
|
||||||
if(lastTx==null) return;
|
|
||||||
firstChange = signal.getEvents().firstEntry();
|
|
||||||
} else if(lastTx==null){
|
|
||||||
lastTx=signal.getEvents().lastEntry();
|
|
||||||
}
|
|
||||||
gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
|
|
||||||
gc.setLineStyle(SWT.LINE_SOLID);
|
|
||||||
gc.setLineWidth(1);
|
|
||||||
Entry<Long, ? extends ISignalChange> left=firstChange;
|
|
||||||
if(left.getValue() instanceof ISignalChangeSingle){
|
|
||||||
NavigableMap<Long, ? extends ISignalChange> entries=signal.getEvents().subMap(firstChange.getKey(), false, lastTx.getKey(), true);
|
|
||||||
for(Entry<Long, ? extends ISignalChange> right:entries.entrySet()){
|
|
||||||
int xEnd= (int)(right.getKey()/this.waveCanvas.getScaleFactor());
|
|
||||||
int xBegin= (int)(left.getKey()/this.waveCanvas.getScaleFactor());
|
|
||||||
if(xEnd>xBegin){
|
|
||||||
int yOffset = this.waveCanvas.getTrackHeight()/2;
|
|
||||||
Color color = this.waveCanvas.colors[WaveformColors.SIGNALX.ordinal()];
|
|
||||||
switch(((ISignalChangeSingle) left.getValue()).getValue()){
|
|
||||||
case '1':
|
|
||||||
color=this.waveCanvas.colors[WaveformColors.SIGNAL1.ordinal()];
|
|
||||||
yOffset = this.waveCanvas.getTrackHeight()/5;
|
|
||||||
break;
|
|
||||||
case '0':
|
|
||||||
color=this.waveCanvas.colors[WaveformColors.SIGNAL0.ordinal()];
|
|
||||||
yOffset = 4*this.waveCanvas.getTrackHeight()/5;
|
|
||||||
break;
|
|
||||||
case 'Z':
|
|
||||||
color=this.waveCanvas.colors[WaveformColors.SIGNALZ.ordinal()];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
yOffset+=area.y;
|
|
||||||
gc.setForeground(color);
|
|
||||||
gc.drawLine(xBegin, yOffset, xEnd, yOffset);
|
|
||||||
int yNext = this.waveCanvas.getTrackHeight()/2;
|
|
||||||
switch(((ISignalChangeSingle) right.getValue()).getValue()){
|
|
||||||
case '1':
|
|
||||||
yNext = this.waveCanvas.getTrackHeight()/5+area.y;
|
|
||||||
break;
|
|
||||||
case '0':
|
|
||||||
yNext = 4*this.waveCanvas.getTrackHeight()/5+area.y;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
gc.drawLine(xEnd, yOffset, xEnd, yNext);
|
|
||||||
}
|
|
||||||
left=right;
|
|
||||||
}
|
|
||||||
} else if(left.getValue() instanceof ISignalChangeMulti){
|
|
||||||
NavigableMap<Long,? extends ISignalChange> entries=signal.getEvents().subMap(firstChange.getKey(), false, lastTx.getKey(), true);
|
|
||||||
for(Entry<Long, ? extends ISignalChange> right:entries.entrySet()){
|
|
||||||
int yOffsetT = this.waveCanvas.getTrackHeight()/5+area.y;
|
|
||||||
int yOffsetM = this.waveCanvas.getTrackHeight()/2+area.y;
|
|
||||||
int yOffsetB = 4*this.waveCanvas.getTrackHeight()/5+area.y;
|
|
||||||
Color colorBorder = this.waveCanvas.colors[WaveformColors.SIGNAL0.ordinal()];
|
|
||||||
ISignalChangeMulti last = (ISignalChangeMulti) left.getValue();
|
|
||||||
if(last.getValue().toString().contains("X")){
|
|
||||||
colorBorder=this.waveCanvas.colors[WaveformColors.SIGNALX.ordinal()];
|
|
||||||
}else if(last.getValue().toString().contains("Z")){
|
|
||||||
colorBorder=this.waveCanvas.colors[WaveformColors.SIGNALZ.ordinal()];
|
|
||||||
}
|
|
||||||
int beginTime= (int)(left.getKey()/this.waveCanvas.getScaleFactor());
|
|
||||||
int endTime= (int)(right.getKey()/this.waveCanvas.getScaleFactor());
|
|
||||||
int[] points = {
|
|
||||||
beginTime,yOffsetM,
|
|
||||||
beginTime+1,yOffsetT,
|
|
||||||
endTime-1,yOffsetT,
|
|
||||||
endTime,yOffsetM,
|
|
||||||
endTime-1,yOffsetB,
|
|
||||||
beginTime+1,yOffsetB
|
|
||||||
};
|
|
||||||
gc.setForeground(colorBorder);
|
|
||||||
gc.drawPolygon(points);
|
|
||||||
gc.setForeground(this.waveCanvas.colors[WaveformColors.SIGNAL_TEXT.ordinal()]);
|
|
||||||
int size = gc.getDevice().getDPI().y * gc.getFont().getFontData()[0].getHeight()/72;
|
|
||||||
if(beginTime<area.x) beginTime=area.x;
|
|
||||||
int width=endTime-beginTime;
|
|
||||||
if(width>6) {
|
|
||||||
Rectangle old = gc.getClipping();
|
|
||||||
gc.setClipping(beginTime+3, yOffsetT, endTime-beginTime-5, yOffsetB-yOffsetT);
|
|
||||||
gc.drawText("h'"+last.getValue().toHexString(), beginTime+3, yOffsetM-size/2-1);
|
|
||||||
gc.setClipping(old);
|
|
||||||
}
|
|
||||||
left=right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public ISignal<? extends ISignalChange> getSignal() {
|
|
||||||
return signal;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-159
@@ -1,159 +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.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.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.ui.TrackEntry;
|
|
||||||
import com.minres.scviewer.database.ui.WaveformColors;
|
|
||||||
|
|
||||||
public class StreamPainter extends TrackPainter{
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private final WaveformCanvas waveCanvas;
|
|
||||||
private ITxStream<? extends ITxEvent> stream;
|
|
||||||
private int txBase, txHeight;
|
|
||||||
private boolean even;
|
|
||||||
private TreeSet<ITx> seenTx;
|
|
||||||
|
|
||||||
public StreamPainter(WaveformCanvas waveCanvas, boolean even, TrackEntry trackEntry) {
|
|
||||||
super(trackEntry, even);
|
|
||||||
this.waveCanvas = waveCanvas;
|
|
||||||
this.stream=trackEntry.getStream();
|
|
||||||
this.seenTx=new TreeSet<ITx>();
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void paintArea(GC gc, Rectangle area) {
|
|
||||||
if(stream.getEvents().size()==0) return;
|
|
||||||
int trackHeight=trackEntry.height/stream.getMaxConcurrency();
|
|
||||||
txBase=trackHeight/5;
|
|
||||||
txHeight=trackHeight*3/5;
|
|
||||||
if(trackEntry.selected)
|
|
||||||
gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]);
|
|
||||||
else
|
|
||||||
gc.setBackground(this.waveCanvas.colors[even?WaveformColors.TRACK_BG_EVEN.ordinal():WaveformColors.TRACK_BG_ODD.ordinal()]);
|
|
||||||
gc.setFillRule(SWT.FILL_EVEN_ODD);
|
|
||||||
gc.fillRectangle(area);
|
|
||||||
Entry<Long, ?> firstTx=stream.getEvents().floorEntry(area.x*waveCanvas.getScaleFactor());
|
|
||||||
Entry<Long, ?> lastTx=stream.getEvents().ceilingEntry((area.x+area.width)*waveCanvas.getScaleFactor());
|
|
||||||
if(firstTx==null) firstTx = stream.getEvents().firstEntry();
|
|
||||||
if(lastTx==null) lastTx=stream.getEvents().lastEntry();
|
|
||||||
gc.setFillRule(SWT.FILL_EVEN_ODD);
|
|
||||||
gc.setLineStyle(SWT.LINE_SOLID);
|
|
||||||
gc.setLineWidth(1);
|
|
||||||
gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
|
|
||||||
for(int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight)
|
|
||||||
gc.drawLine(area.x, y1, area.x+area.width, y1);
|
|
||||||
if(firstTx==lastTx)
|
|
||||||
for(ITxEvent txEvent:(Collection<? extends ITxEvent>)firstTx.getValue())
|
|
||||||
drawTx(gc, area, txEvent.getTransaction());
|
|
||||||
else{
|
|
||||||
seenTx.clear();
|
|
||||||
NavigableMap<Long,?> entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true);
|
|
||||||
boolean highlighed=false;
|
|
||||||
gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
|
|
||||||
gc.setBackground(this.waveCanvas.colors[WaveformColors.TX_BG.ordinal()]);
|
|
||||||
for(Entry<Long, ?> entry: entries.entrySet())
|
|
||||||
for(ITxEvent txEvent:(Collection<? extends ITxEvent>)entry.getValue()){
|
|
||||||
if(txEvent.getType()==ITxEvent.Type.BEGIN)
|
|
||||||
seenTx.add(txEvent.getTransaction());
|
|
||||||
if(txEvent.getType()==ITxEvent.Type.END){
|
|
||||||
ITx tx = txEvent.getTransaction();
|
|
||||||
highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.equals(tx);
|
|
||||||
drawTx(gc, area, tx);
|
|
||||||
seenTx.remove(tx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(ITx tx:seenTx){
|
|
||||||
drawTx(gc, area, tx);
|
|
||||||
}
|
|
||||||
if(highlighed){
|
|
||||||
gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE_HIGHLITE.ordinal()]);
|
|
||||||
gc.setBackground(this.waveCanvas.colors[WaveformColors.TX_BG_HIGHLITE.ordinal()]);
|
|
||||||
drawTx(gc, area, waveCanvas.currentSelection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void drawTx(GC gc, Rectangle area, ITx tx) {
|
|
||||||
int offset = tx.getConcurrencyIndex()*this.waveCanvas.getTrackHeight();
|
|
||||||
Rectangle bb = new Rectangle(
|
|
||||||
(int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+txBase,
|
|
||||||
(int)((tx.getEndTime()-tx.getBeginTime())/this.waveCanvas.getScaleFactor()), txHeight);
|
|
||||||
if(bb.x+bb.width<area.x || bb.x>area.x+area.width) return;
|
|
||||||
if(bb.width==0){
|
|
||||||
gc.drawLine(bb.x, bb.y, bb.x, bb.y+bb.height);
|
|
||||||
} else if(bb.width<10){
|
|
||||||
gc.fillRectangle(bb);
|
|
||||||
gc.drawRectangle(bb);
|
|
||||||
} else {
|
|
||||||
gc.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5);
|
|
||||||
gc.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ITx getClicked(Point point) {
|
|
||||||
int lane=point.y/waveCanvas.getTrackHeight();
|
|
||||||
Entry<Long, List<ITxEvent>> firstTx=stream.getEvents().floorEntry(point.x*waveCanvas.getScaleFactor());
|
|
||||||
if(firstTx!=null){
|
|
||||||
do {
|
|
||||||
ITx tx = getTxFromEntry(lane, point.x, firstTx);
|
|
||||||
if(tx!=null) return tx;
|
|
||||||
firstTx=stream.getEvents().lowerEntry(firstTx.getKey());
|
|
||||||
}while(firstTx!=null);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ITxStream<? extends ITxEvent> getStream() {
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStream(ITxStream<? extends ITxEvent> stream) {
|
|
||||||
this.stream = stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ITx getTxFromEntry(int lane, int offset, Entry<Long, List<ITxEvent>> 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-76
@@ -1,76 +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.swt.internal;
|
|
||||||
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
import org.eclipse.swt.graphics.GC;
|
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.ui.WaveformColors;
|
|
||||||
|
|
||||||
public class TrackAreaPainter implements IPainter {
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private final WaveformCanvas waveCanvas;
|
|
||||||
|
|
||||||
TreeMap<Integer, IWaveformPainter> trackVerticalOffset;
|
|
||||||
/**
|
|
||||||
* @param txDisplay
|
|
||||||
*/
|
|
||||||
public TrackAreaPainter(WaveformCanvas waveCanvas) {
|
|
||||||
this.waveCanvas = waveCanvas;
|
|
||||||
this.trackVerticalOffset= new TreeMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void paintArea(GC gc, Rectangle a) {
|
|
||||||
Rectangle area = new Rectangle(a.x, a.y+waveCanvas.rulerHeight, a.width, a.height-waveCanvas.rulerHeight);
|
|
||||||
gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_EVEN.ordinal()]);
|
|
||||||
gc.setFillRule(SWT.FILL_EVEN_ODD);
|
|
||||||
gc.fillRectangle(area);
|
|
||||||
if(trackVerticalOffset.size()>0){
|
|
||||||
Integer firstKey=trackVerticalOffset.floorKey(area.y);
|
|
||||||
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){
|
|
||||||
subArea.y=firstKey;
|
|
||||||
IWaveformPainter p = trackVerticalOffset.get(firstKey);
|
|
||||||
subArea.height=p.getHeight();
|
|
||||||
p.paintArea(gc, subArea);
|
|
||||||
}else{
|
|
||||||
for(Entry<Integer, IWaveformPainter> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()){
|
|
||||||
subArea.y=entry.getKey();
|
|
||||||
subArea.height=entry.getValue().getHeight();
|
|
||||||
entry.getValue().paintArea(gc, subArea);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public TreeMap<Integer, IWaveformPainter> getTrackVerticalOffset() {
|
|
||||||
return trackVerticalOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addTrackPainter(IWaveformPainter trackPainter){
|
|
||||||
trackVerticalOffset.put(trackPainter.getVerticalOffset()+waveCanvas.rulerHeight, trackPainter);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getHeight(){
|
|
||||||
if(trackVerticalOffset.size()==0) return 1;
|
|
||||||
return trackVerticalOffset.lastKey() + trackVerticalOffset.lastEntry().getValue().getHeight();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-42
@@ -1,42 +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.swt.internal;
|
|
||||||
|
|
||||||
import com.minres.scviewer.database.ui.TrackEntry;
|
|
||||||
|
|
||||||
public abstract class TrackPainter implements IWaveformPainter {
|
|
||||||
|
|
||||||
protected boolean even;
|
|
||||||
|
|
||||||
protected TrackEntry trackEntry;
|
|
||||||
|
|
||||||
public TrackPainter(TrackEntry trackEntry, boolean even) {
|
|
||||||
this.trackEntry = trackEntry;
|
|
||||||
this.even=even;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getHeight() {
|
|
||||||
return trackEntry.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getVerticalOffset() {
|
|
||||||
return trackEntry.vOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isEven() {
|
|
||||||
return even;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TrackEntry getTrackEntry() {
|
|
||||||
return trackEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-497
@@ -1,497 +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.swt.internal;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
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.Point;
|
|
||||||
import org.eclipse.swt.graphics.RGB;
|
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
|
||||||
import org.eclipse.swt.graphics.Transform;
|
|
||||||
import org.eclipse.swt.widgets.Canvas;
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
|
||||||
import org.eclipse.swt.widgets.Display;
|
|
||||||
import org.eclipse.swt.widgets.Event;
|
|
||||||
import org.eclipse.swt.widgets.ScrollBar;
|
|
||||||
import org.eclipse.wb.swt.SWTResourceManager;
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.minres.scviewer.database.ITx;
|
|
||||||
import com.minres.scviewer.database.IWaveform;
|
|
||||||
import com.minres.scviewer.database.IWaveformEvent;
|
|
||||||
import com.minres.scviewer.database.RelationType;
|
|
||||||
import com.minres.scviewer.database.ui.IWaveformViewer;
|
|
||||||
import com.minres.scviewer.database.ui.WaveformColors;
|
|
||||||
|
|
||||||
public class WaveformCanvas extends Canvas {
|
|
||||||
|
|
||||||
Color[] colors = new Color[WaveformColors.values().length];
|
|
||||||
|
|
||||||
private int trackHeight = 50;
|
|
||||||
|
|
||||||
private long scaleFactor = 1000000L; // 1ns
|
|
||||||
|
|
||||||
String unit="ns";
|
|
||||||
|
|
||||||
private int level = 12;
|
|
||||||
|
|
||||||
public final static String[] unitString={"fs", "ps", "ns", "µs", "ms"};//, "s"};
|
|
||||||
|
|
||||||
public final static int[] unitMultiplier={1, 3, 10, 30, 100, 300};
|
|
||||||
|
|
||||||
private long maxTime;
|
|
||||||
|
|
||||||
protected Point origin; /* original size */
|
|
||||||
|
|
||||||
protected Transform transform;
|
|
||||||
|
|
||||||
protected int rulerHeight=40;
|
|
||||||
|
|
||||||
protected List<IPainter> painterList;
|
|
||||||
|
|
||||||
ITx currentSelection;
|
|
||||||
|
|
||||||
private List<SelectionAdapter> selectionListeners;
|
|
||||||
|
|
||||||
private RulerPainter rulerPainter;
|
|
||||||
|
|
||||||
private TrackAreaPainter trackAreaPainter;
|
|
||||||
|
|
||||||
private ArrowPainter arrowPainter;
|
|
||||||
|
|
||||||
private List<CursorPainter> cursorPainters;
|
|
||||||
|
|
||||||
HashMap<IWaveform<?>, IWaveformPainter> wave2painterMap;
|
|
||||||
/**
|
|
||||||
* Constructor for ScrollableCanvas.
|
|
||||||
*
|
|
||||||
* @param parent
|
|
||||||
* the parent of this control.
|
|
||||||
* @param style
|
|
||||||
* the style of this control.
|
|
||||||
*/
|
|
||||||
public WaveformCanvas(final Composite parent, int style) {
|
|
||||||
super(parent, style | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE | SWT.V_SCROLL | SWT.H_SCROLL);
|
|
||||||
addControlListener(new ControlAdapter() { /* resize listener. */
|
|
||||||
public void controlResized(ControlEvent event) {
|
|
||||||
syncScrollBars();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
addPaintListener(new PaintListener() { /* paint listener. */
|
|
||||||
public void paintControl(final PaintEvent event) {
|
|
||||||
paint(event.gc);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
painterList = new LinkedList<IPainter>();
|
|
||||||
origin = new Point(0, 0);
|
|
||||||
transform = new Transform(getDisplay());
|
|
||||||
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);
|
|
||||||
rulerPainter=new RulerPainter(this);
|
|
||||||
painterList.add(rulerPainter);
|
|
||||||
arrowPainter=new ArrowPainter(this, IWaveformViewer.NEXT_PREV_IN_STREAM);
|
|
||||||
painterList.add(arrowPainter);
|
|
||||||
CursorPainter cp = new CursorPainter(this, scaleFactor * 10, cursorPainters.size()-1);
|
|
||||||
painterList.add(cp);
|
|
||||||
cursorPainters.add(cp);
|
|
||||||
CursorPainter marker = new CursorPainter(this, scaleFactor * 100, cursorPainters.size()-1);
|
|
||||||
painterList.add(marker);
|
|
||||||
cursorPainters.add(marker);
|
|
||||||
wave2painterMap=new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addCursoPainter(CursorPainter cursorPainter){
|
|
||||||
painterList.add(cursorPainter);
|
|
||||||
cursorPainters.add(cursorPainter);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void initColors(HashMap<WaveformColors, RGB> 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();
|
|
||||||
} else {
|
|
||||||
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_DARK_GREEN);
|
|
||||||
colors[WaveformColors.SIGNAL1.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN);
|
|
||||||
colors[WaveformColors.SIGNALZ.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_GRAY);
|
|
||||||
colors[WaveformColors.SIGNALX.ordinal()] = SWTResourceManager.getColor(255, 128, 182);
|
|
||||||
colors[WaveformColors.SIGNAL_TEXT.ordinal()] = SWTResourceManager.getColor(SWT.COLOR_WHITE);
|
|
||||||
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 setHighliteRelation(RelationType relationType){
|
|
||||||
if(arrowPainter!=null){
|
|
||||||
boolean redraw = arrowPainter.getHighlightType()!=relationType;
|
|
||||||
arrowPainter.setHighlightType(relationType);
|
|
||||||
if(redraw) redraw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Point getOrigin() {
|
|
||||||
return origin;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOrigin(Point origin) {
|
|
||||||
setOrigin(origin.x, origin.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOrigin(int x, int y) {
|
|
||||||
checkWidget();
|
|
||||||
ScrollBar hBar = getHorizontalBar();
|
|
||||||
hBar.setSelection(-x);
|
|
||||||
x = -hBar.getSelection();
|
|
||||||
ScrollBar vBar = getVerticalBar();
|
|
||||||
vBar.setSelection(-y);
|
|
||||||
y = -vBar.getSelection();
|
|
||||||
origin.x = x;
|
|
||||||
origin.y = y;
|
|
||||||
syncScrollBars();
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getMaxTime() {
|
|
||||||
return maxTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMaxTime(long maxTime) {
|
|
||||||
this.maxTime = maxTime;
|
|
||||||
syncScrollBars();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTrackHeight() {
|
|
||||||
return trackHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTrackHeight(int trackHeight) {
|
|
||||||
this.trackHeight = trackHeight;
|
|
||||||
syncScrollBars();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getZoomLevel() {
|
|
||||||
return level;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMaxZoomLevel(){
|
|
||||||
return unitMultiplier.length*unitString.length-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setZoomLevel(int level) {
|
|
||||||
if(level<unitMultiplier.length*unitString.length){
|
|
||||||
this.level = level;
|
|
||||||
this.scaleFactor = (long) Math.pow(10, level/2);
|
|
||||||
if(level%2==1) this.scaleFactor*=3;
|
|
||||||
ITx tx = arrowPainter.getTx();
|
|
||||||
arrowPainter.setTx(null);
|
|
||||||
syncScrollBars();
|
|
||||||
arrowPainter.setTx(tx);
|
|
||||||
redraw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getScaleFactor() {
|
|
||||||
return scaleFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getScaleFactorPow10() {
|
|
||||||
int scale = level/unitMultiplier.length;
|
|
||||||
double res = Math.pow(1000, scale);
|
|
||||||
return (long) res;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUnitStr(){
|
|
||||||
return unitString[level/unitMultiplier.length];
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getUnitMultiplier(){
|
|
||||||
return unitMultiplier[level%unitMultiplier.length];
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getTimeForOffset(int xOffset){
|
|
||||||
return (xOffset-origin.x) * scaleFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addPainter(IPainter painter) {
|
|
||||||
painterList.add(painter);
|
|
||||||
redraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removePainter(IPainter painter) {
|
|
||||||
painterList.remove(painter);
|
|
||||||
redraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clearAllWaveformPainter() {
|
|
||||||
trackAreaPainter.getTrackVerticalOffset().clear();
|
|
||||||
wave2painterMap.clear();
|
|
||||||
syncScrollBars();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addWaveformPainter(IWaveformPainter painter) {
|
|
||||||
trackAreaPainter.addTrackPainter(painter);
|
|
||||||
wave2painterMap.put(painter.getTrackEntry().waveform, painter);
|
|
||||||
syncScrollBars();
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<CursorPainter> getCursorPainters() {
|
|
||||||
return cursorPainters;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dispose the garbage here
|
|
||||||
*/
|
|
||||||
public void dispose() {
|
|
||||||
transform.dispose();
|
|
||||||
for (WaveformColors c : WaveformColors.values())
|
|
||||||
colors[c.ordinal()].dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initalize the scrollbar and register listeners. */
|
|
||||||
private void initScrollBars() {
|
|
||||||
ScrollBar horizontal = getHorizontalBar();
|
|
||||||
horizontal.setEnabled(false);
|
|
||||||
horizontal.setVisible(true);
|
|
||||||
horizontal.addSelectionListener(new SelectionAdapter() {
|
|
||||||
public void widgetSelected(SelectionEvent event) {
|
|
||||||
if (painterList.size() == 0)
|
|
||||||
return;
|
|
||||||
setOrigin(-((ScrollBar) event.widget).getSelection(), origin.y);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
ScrollBar vertical = getVerticalBar();
|
|
||||||
vertical.setEnabled(false);
|
|
||||||
vertical.setVisible(true);
|
|
||||||
vertical.addSelectionListener(new SelectionAdapter() {
|
|
||||||
public void widgetSelected(SelectionEvent event) {
|
|
||||||
if (painterList.size() == 0)
|
|
||||||
return;
|
|
||||||
setOrigin(origin.x, -((ScrollBar) event.widget).getSelection());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Synchronize the scrollbar with the image. If the transform is out of
|
|
||||||
* range, it will correct it. This function considers only following factors
|
|
||||||
* :<b> transform, image size, client area</b>.
|
|
||||||
*/
|
|
||||||
public void syncScrollBars() {
|
|
||||||
if (painterList.size() == 0) {
|
|
||||||
redraw();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int height = trackAreaPainter.getHeight();
|
|
||||||
int width = (int) (maxTime / scaleFactor);
|
|
||||||
ScrollBar horizontal = getHorizontalBar();
|
|
||||||
horizontal.setIncrement((int) (getClientArea().width / 100));
|
|
||||||
horizontal.setPageIncrement(getClientArea().width);
|
|
||||||
int cw = getClientArea().width;
|
|
||||||
if (width > cw) { /* image is wider than client area */
|
|
||||||
horizontal.setMaximum(width);
|
|
||||||
horizontal.setEnabled(true);
|
|
||||||
if (((int) -origin.x) > horizontal.getMaximum() - cw)
|
|
||||||
origin.x = -horizontal.getMaximum() + cw;
|
|
||||||
} else { /* image is narrower than client area */
|
|
||||||
horizontal.setEnabled(false);
|
|
||||||
}
|
|
||||||
horizontal.setSelection(-origin.x);
|
|
||||||
horizontal.setThumb(cw);
|
|
||||||
|
|
||||||
ScrollBar vertical = getVerticalBar();
|
|
||||||
vertical.setIncrement((int) (getClientArea().height / 100));
|
|
||||||
vertical.setPageIncrement((int) (getClientArea().height));
|
|
||||||
int ch = getClientArea().height;
|
|
||||||
if (height > ch) { /* image is higher than client area */
|
|
||||||
vertical.setMaximum(height);
|
|
||||||
vertical.setEnabled(true);
|
|
||||||
if (((int) -origin.y) > vertical.getMaximum() - ch)
|
|
||||||
origin.y = -vertical.getMaximum() + ch;
|
|
||||||
} else { /* image is less higher than client area */
|
|
||||||
vertical.setMaximum((int) (ch));
|
|
||||||
vertical.setEnabled(false);
|
|
||||||
}
|
|
||||||
vertical.setSelection(-origin.y);
|
|
||||||
vertical.setThumb(ch);
|
|
||||||
redraw();
|
|
||||||
fireSelectionEvent();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Paint function */
|
|
||||||
private void paint(GC gc) {
|
|
||||||
Rectangle clientRect = getClientArea(); /* Canvas' painting area */
|
|
||||||
clientRect.x = -origin.x;
|
|
||||||
clientRect.y = -origin.y;
|
|
||||||
// reset the transform
|
|
||||||
transform.identity();
|
|
||||||
// shift the content
|
|
||||||
transform.translate(origin.x, origin.y);
|
|
||||||
gc.setTransform(transform);
|
|
||||||
gc.setClipping(clientRect);
|
|
||||||
if (painterList.size() > 0 ) {
|
|
||||||
for (IPainter painter : painterList)
|
|
||||||
painter.paintArea(gc, clientRect);
|
|
||||||
} else {
|
|
||||||
gc.fillRectangle(clientRect);
|
|
||||||
initScrollBars();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Object> getClicked(Point point) {
|
|
||||||
LinkedList<Object> result=new LinkedList<>();
|
|
||||||
for (IPainter p : Lists.reverse(painterList)) {
|
|
||||||
if (p instanceof TrackAreaPainter) {
|
|
||||||
int y = point.y - origin.y;
|
|
||||||
int x = point.x - origin.x;
|
|
||||||
Entry<Integer, IWaveformPainter> entry = trackAreaPainter.getTrackVerticalOffset().floorEntry(y);
|
|
||||||
if (entry != null) {
|
|
||||||
if (entry.getValue() instanceof StreamPainter) {
|
|
||||||
ITx tx = ((StreamPainter) entry.getValue()).getClicked(new Point(x, y - entry.getKey()));
|
|
||||||
if(tx!=null)
|
|
||||||
result.add(tx);
|
|
||||||
}
|
|
||||||
result.add(entry.getValue().getTrackEntry());
|
|
||||||
}
|
|
||||||
} else if (p instanceof CursorPainter) {
|
|
||||||
if (Math.abs(point.x - origin.x - ((CursorPainter) p).getTime()/scaleFactor) < 2) {
|
|
||||||
result.add(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Object> getEntriesAtPosition(IWaveform<? extends IWaveformEvent> iWaveform, int i) {
|
|
||||||
LinkedList<Object> result=new LinkedList<>();
|
|
||||||
int x = i - origin.x;
|
|
||||||
for(IPainter p: wave2painterMap.values()){
|
|
||||||
if (p instanceof StreamPainter && ((StreamPainter)p).getStream()==iWaveform) {
|
|
||||||
result.add(((StreamPainter) p).getClicked(new Point(x, trackHeight/2)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSelected(ITx currentSelection) {
|
|
||||||
this.currentSelection = currentSelection;
|
|
||||||
if (currentSelection != null)
|
|
||||||
reveal(currentSelection);
|
|
||||||
arrowPainter.setTx(currentSelection);
|
|
||||||
redraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void reveal(ITx tx) {
|
|
||||||
int lower = (int) (tx.getBeginTime() / scaleFactor);
|
|
||||||
int higher = (int) (tx.getEndTime() / scaleFactor);
|
|
||||||
Point size = getSize();
|
|
||||||
size.x -= getVerticalBar().getSize().x + 2;
|
|
||||||
size.y -= getHorizontalBar().getSize().y;
|
|
||||||
if (lower < -origin.x) {
|
|
||||||
setOrigin(-lower, origin.y);
|
|
||||||
} else if (higher > (size.x - origin.x)) {
|
|
||||||
setOrigin(size.x - higher, origin.y);
|
|
||||||
}
|
|
||||||
for (IWaveformPainter painter : wave2painterMap.values()) {
|
|
||||||
if (painter instanceof StreamPainter && ((StreamPainter) painter).getStream() == tx.getStream()) {
|
|
||||||
int top = painter.getVerticalOffset() + trackHeight * tx.getConcurrencyIndex();
|
|
||||||
int bottom = top + trackHeight;
|
|
||||||
if (top < -origin.y) {
|
|
||||||
setOrigin(origin.x, -(top-trackHeight));
|
|
||||||
} else if (bottom > (size.y - origin.y)) {
|
|
||||||
setOrigin(origin.x, size.y - bottom);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void reveal(long time) {
|
|
||||||
int scaledTime = (int) (time / scaleFactor);
|
|
||||||
Point size = getSize();
|
|
||||||
size.x -= getVerticalBar().getSize().x + 2;
|
|
||||||
size.y -= getHorizontalBar().getSize().y;
|
|
||||||
if (scaledTime < -origin.x) {
|
|
||||||
setOrigin(-scaledTime+10, origin.y);
|
|
||||||
} else if (scaledTime > (size.x - origin.x)) {
|
|
||||||
setOrigin(size.x - scaledTime-30, origin.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getRulerHeight() {
|
|
||||||
return rulerHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRulerHeight(int rulerHeight) {
|
|
||||||
this.rulerHeight = rulerHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addSelectionListener(SelectionAdapter selectionAdapter) {
|
|
||||||
selectionListeners.add(selectionAdapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeSelectionListener(SelectionAdapter selectionAdapter) {
|
|
||||||
selectionListeners.remove(selectionAdapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected void fireSelectionEvent() {
|
|
||||||
Event e = new Event();
|
|
||||||
e.widget = this;
|
|
||||||
e.detail=SWT.SELECTED;
|
|
||||||
e.type=SWT.Selection;
|
|
||||||
SelectionEvent ev = new SelectionEvent(e);
|
|
||||||
ev.x = origin.x;
|
|
||||||
ev.y = origin.y;
|
|
||||||
for (SelectionAdapter a : selectionListeners) {
|
|
||||||
a.widgetSelected(ev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
-1166
File diff suppressed because it is too large
Load Diff
@@ -1,447 +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 org.eclipse.wb.swt;
|
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
import org.eclipse.swt.graphics.Color;
|
|
||||||
import org.eclipse.swt.graphics.Cursor;
|
|
||||||
import org.eclipse.swt.graphics.Font;
|
|
||||||
import org.eclipse.swt.graphics.FontData;
|
|
||||||
import org.eclipse.swt.graphics.GC;
|
|
||||||
import org.eclipse.swt.graphics.Image;
|
|
||||||
import org.eclipse.swt.graphics.ImageData;
|
|
||||||
import org.eclipse.swt.graphics.RGB;
|
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
|
||||||
import org.eclipse.swt.widgets.Display;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Utility class for managing OS resources associated with SWT controls such as colors, fonts, images, etc.
|
|
||||||
* <p>
|
|
||||||
* !!! IMPORTANT !!! Application code must explicitly invoke the <code>dispose()</code> method to release the
|
|
||||||
* operating system resources managed by cached objects when those objects and OS resources are no longer
|
|
||||||
* needed (e.g. on application shutdown)
|
|
||||||
* <p>
|
|
||||||
* This class may be freely distributed as part of any application or plugin.
|
|
||||||
* <p>
|
|
||||||
* @author scheglov_ke
|
|
||||||
* @author Dan Rubel
|
|
||||||
*/
|
|
||||||
public class SWTResourceManager {
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Color
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
private static Map<RGB, Color> m_colorMap = new HashMap<RGB, Color>();
|
|
||||||
/**
|
|
||||||
* Returns the system {@link Color} matching the specific ID.
|
|
||||||
*
|
|
||||||
* @param systemColorID
|
|
||||||
* the ID value for the color
|
|
||||||
* @return the system {@link Color} matching the specific ID
|
|
||||||
*/
|
|
||||||
public static Color getColor(int systemColorID) {
|
|
||||||
Display display = Display.getCurrent();
|
|
||||||
return display.getSystemColor(systemColorID);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a {@link Color} given its red, green and blue component values.
|
|
||||||
*
|
|
||||||
* @param r
|
|
||||||
* the red component of the color
|
|
||||||
* @param g
|
|
||||||
* the green component of the color
|
|
||||||
* @param b
|
|
||||||
* the blue component of the color
|
|
||||||
* @return the {@link Color} matching the given red, green and blue component values
|
|
||||||
*/
|
|
||||||
public static Color getColor(int r, int g, int b) {
|
|
||||||
return getColor(new RGB(r, g, b));
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a {@link Color} given its RGB value.
|
|
||||||
*
|
|
||||||
* @param rgb
|
|
||||||
* the {@link RGB} value of the color
|
|
||||||
* @return the {@link Color} matching the RGB value
|
|
||||||
*/
|
|
||||||
public static Color getColor(RGB rgb) {
|
|
||||||
Color color = m_colorMap.get(rgb);
|
|
||||||
if (color == null) {
|
|
||||||
Display display = Display.getCurrent();
|
|
||||||
color = new Color(display, rgb);
|
|
||||||
m_colorMap.put(rgb, color);
|
|
||||||
}
|
|
||||||
return color;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Dispose of all the cached {@link Color}'s.
|
|
||||||
*/
|
|
||||||
public static void disposeColors() {
|
|
||||||
for (Color color : m_colorMap.values()) {
|
|
||||||
color.dispose();
|
|
||||||
}
|
|
||||||
m_colorMap.clear();
|
|
||||||
}
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Image
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
/**
|
|
||||||
* Maps image paths to images.
|
|
||||||
*/
|
|
||||||
private static Map<String, Image> m_imageMap = new HashMap<String, Image>();
|
|
||||||
/**
|
|
||||||
* Returns an {@link Image} encoded by the specified {@link InputStream}.
|
|
||||||
*
|
|
||||||
* @param stream
|
|
||||||
* the {@link InputStream} encoding the image data
|
|
||||||
* @return the {@link Image} encoded by the specified input stream
|
|
||||||
*/
|
|
||||||
protected static Image getImage(InputStream stream) throws IOException {
|
|
||||||
try {
|
|
||||||
Display display = Display.getCurrent();
|
|
||||||
ImageData data = new ImageData(stream);
|
|
||||||
if (data.transparentPixel > 0) {
|
|
||||||
return new Image(display, data, data.getTransparencyMask());
|
|
||||||
}
|
|
||||||
return new Image(display, data);
|
|
||||||
} finally {
|
|
||||||
stream.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns an {@link Image} stored in the file at the specified path.
|
|
||||||
*
|
|
||||||
* @param path
|
|
||||||
* the path to the image file
|
|
||||||
* @return the {@link Image} stored in the file at the specified path
|
|
||||||
*/
|
|
||||||
public static Image getImage(String path) {
|
|
||||||
Image image = m_imageMap.get(path);
|
|
||||||
if (image == null) {
|
|
||||||
try {
|
|
||||||
image = getImage(new FileInputStream(path));
|
|
||||||
m_imageMap.put(path, image);
|
|
||||||
} catch (Exception e) {
|
|
||||||
image = getMissingImage();
|
|
||||||
m_imageMap.put(path, image);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return image;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns an {@link Image} stored in the file at the specified path relative to the specified class.
|
|
||||||
*
|
|
||||||
* @param clazz
|
|
||||||
* the {@link Class} relative to which to find the image
|
|
||||||
* @param path
|
|
||||||
* the path to the image file, if starts with <code>'/'</code>
|
|
||||||
* @return the {@link Image} stored in the file at the specified path
|
|
||||||
*/
|
|
||||||
public static Image getImage(Class<?> clazz, String path) {
|
|
||||||
String key = clazz.getName() + '|' + path;
|
|
||||||
Image image = m_imageMap.get(key);
|
|
||||||
if (image == null) {
|
|
||||||
try {
|
|
||||||
image = getImage(clazz.getResourceAsStream(path));
|
|
||||||
m_imageMap.put(key, image);
|
|
||||||
} catch (Exception e) {
|
|
||||||
image = getMissingImage();
|
|
||||||
m_imageMap.put(key, image);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return image;
|
|
||||||
}
|
|
||||||
private static final int MISSING_IMAGE_SIZE = 10;
|
|
||||||
/**
|
|
||||||
* @return the small {@link Image} that can be used as placeholder for missing image.
|
|
||||||
*/
|
|
||||||
private static Image getMissingImage() {
|
|
||||||
Image image = new Image(Display.getCurrent(), MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE);
|
|
||||||
//
|
|
||||||
GC gc = new GC(image);
|
|
||||||
gc.setBackground(getColor(SWT.COLOR_RED));
|
|
||||||
gc.fillRectangle(0, 0, MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE);
|
|
||||||
gc.dispose();
|
|
||||||
//
|
|
||||||
return image;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Style constant for placing decorator image in top left corner of base image.
|
|
||||||
*/
|
|
||||||
public static final int TOP_LEFT = 1;
|
|
||||||
/**
|
|
||||||
* Style constant for placing decorator image in top right corner of base image.
|
|
||||||
*/
|
|
||||||
public static final int TOP_RIGHT = 2;
|
|
||||||
/**
|
|
||||||
* Style constant for placing decorator image in bottom left corner of base image.
|
|
||||||
*/
|
|
||||||
public static final int BOTTOM_LEFT = 3;
|
|
||||||
/**
|
|
||||||
* Style constant for placing decorator image in bottom right corner of base image.
|
|
||||||
*/
|
|
||||||
public static final int BOTTOM_RIGHT = 4;
|
|
||||||
/**
|
|
||||||
* Internal value.
|
|
||||||
*/
|
|
||||||
protected static final int LAST_CORNER_KEY = 5;
|
|
||||||
/**
|
|
||||||
* Maps images to decorated images.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private static Map<Image, Map<Image, Image>>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY];
|
|
||||||
/**
|
|
||||||
* Returns an {@link Image} composed of a base image decorated by another image.
|
|
||||||
*
|
|
||||||
* @param baseImage
|
|
||||||
* the base {@link Image} that should be decorated
|
|
||||||
* @param decorator
|
|
||||||
* the {@link Image} to decorate the base image
|
|
||||||
* @return {@link Image} The resulting decorated image
|
|
||||||
*/
|
|
||||||
public static Image decorateImage(Image baseImage, Image decorator) {
|
|
||||||
return decorateImage(baseImage, decorator, BOTTOM_RIGHT);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns an {@link Image} composed of a base image decorated by another image.
|
|
||||||
*
|
|
||||||
* @param baseImage
|
|
||||||
* the base {@link Image} that should be decorated
|
|
||||||
* @param decorator
|
|
||||||
* the {@link Image} to decorate the base image
|
|
||||||
* @param corner
|
|
||||||
* the corner to place decorator image
|
|
||||||
* @return the resulting decorated {@link Image}
|
|
||||||
*/
|
|
||||||
public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) {
|
|
||||||
if (corner <= 0 || corner >= LAST_CORNER_KEY) {
|
|
||||||
throw new IllegalArgumentException("Wrong decorate corner");
|
|
||||||
}
|
|
||||||
Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[corner];
|
|
||||||
if (cornerDecoratedImageMap == null) {
|
|
||||||
cornerDecoratedImageMap = new HashMap<Image, Map<Image, Image>>();
|
|
||||||
m_decoratedImageMap[corner] = cornerDecoratedImageMap;
|
|
||||||
}
|
|
||||||
Map<Image, Image> decoratedMap = cornerDecoratedImageMap.get(baseImage);
|
|
||||||
if (decoratedMap == null) {
|
|
||||||
decoratedMap = new HashMap<Image, Image>();
|
|
||||||
cornerDecoratedImageMap.put(baseImage, decoratedMap);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
Image result = decoratedMap.get(decorator);
|
|
||||||
if (result == null) {
|
|
||||||
Rectangle bib = baseImage.getBounds();
|
|
||||||
Rectangle dib = decorator.getBounds();
|
|
||||||
//
|
|
||||||
result = new Image(Display.getCurrent(), bib.width, bib.height);
|
|
||||||
//
|
|
||||||
GC gc = new GC(result);
|
|
||||||
gc.drawImage(baseImage, 0, 0);
|
|
||||||
if (corner == TOP_LEFT) {
|
|
||||||
gc.drawImage(decorator, 0, 0);
|
|
||||||
} else if (corner == TOP_RIGHT) {
|
|
||||||
gc.drawImage(decorator, bib.width - dib.width, 0);
|
|
||||||
} else if (corner == BOTTOM_LEFT) {
|
|
||||||
gc.drawImage(decorator, 0, bib.height - dib.height);
|
|
||||||
} else if (corner == BOTTOM_RIGHT) {
|
|
||||||
gc.drawImage(decorator, bib.width - dib.width, bib.height - dib.height);
|
|
||||||
}
|
|
||||||
gc.dispose();
|
|
||||||
//
|
|
||||||
decoratedMap.put(decorator, result);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Dispose all of the cached {@link Image}'s.
|
|
||||||
*/
|
|
||||||
public static void disposeImages() {
|
|
||||||
// dispose loaded images
|
|
||||||
{
|
|
||||||
for (Image image : m_imageMap.values()) {
|
|
||||||
image.dispose();
|
|
||||||
}
|
|
||||||
m_imageMap.clear();
|
|
||||||
}
|
|
||||||
// dispose decorated images
|
|
||||||
for (int i = 0; i < m_decoratedImageMap.length; i++) {
|
|
||||||
Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[i];
|
|
||||||
if (cornerDecoratedImageMap != null) {
|
|
||||||
for (Map<Image, Image> decoratedMap : cornerDecoratedImageMap.values()) {
|
|
||||||
for (Image image : decoratedMap.values()) {
|
|
||||||
image.dispose();
|
|
||||||
}
|
|
||||||
decoratedMap.clear();
|
|
||||||
}
|
|
||||||
cornerDecoratedImageMap.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Font
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
/**
|
|
||||||
* Maps font names to fonts.
|
|
||||||
*/
|
|
||||||
private static Map<String, Font> m_fontMap = new HashMap<String, Font>();
|
|
||||||
/**
|
|
||||||
* Maps fonts to their bold versions.
|
|
||||||
*/
|
|
||||||
private static Map<Font, Font> m_fontToBoldFontMap = new HashMap<Font, Font>();
|
|
||||||
/**
|
|
||||||
* Returns a {@link Font} based on its name, height and style.
|
|
||||||
*
|
|
||||||
* @param name
|
|
||||||
* the name of the font
|
|
||||||
* @param height
|
|
||||||
* the height of the font
|
|
||||||
* @param style
|
|
||||||
* the style of the font
|
|
||||||
* @return {@link Font} The font matching the name, height and style
|
|
||||||
*/
|
|
||||||
public static Font getFont(String name, int height, int style) {
|
|
||||||
return getFont(name, height, style, false, false);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a {@link Font} based on its name, height and style. Windows-specific strikeout and underline
|
|
||||||
* flags are also supported.
|
|
||||||
*
|
|
||||||
* @param name
|
|
||||||
* the name of the font
|
|
||||||
* @param size
|
|
||||||
* the size of the font
|
|
||||||
* @param style
|
|
||||||
* the style of the font
|
|
||||||
* @param strikeout
|
|
||||||
* the strikeout flag (warning: Windows only)
|
|
||||||
* @param underline
|
|
||||||
* the underline flag (warning: Windows only)
|
|
||||||
* @return {@link Font} The font matching the name, height, style, strikeout and underline
|
|
||||||
*/
|
|
||||||
public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) {
|
|
||||||
String fontName = name + '|' + size + '|' + style + '|' + strikeout + '|' + underline;
|
|
||||||
Font font = m_fontMap.get(fontName);
|
|
||||||
if (font == null) {
|
|
||||||
FontData fontData = new FontData(name, size, style);
|
|
||||||
if (strikeout || underline) {
|
|
||||||
try {
|
|
||||||
Class<?> logFontClass = Class.forName("org.eclipse.swt.internal.win32.LOGFONT"); //$NON-NLS-1$
|
|
||||||
Object logFont = FontData.class.getField("data").get(fontData); //$NON-NLS-1$
|
|
||||||
if (logFont != null && logFontClass != null) {
|
|
||||||
if (strikeout) {
|
|
||||||
logFontClass.getField("lfStrikeOut").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
if (underline) {
|
|
||||||
logFontClass.getField("lfUnderline").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Throwable e) {
|
|
||||||
System.err.println("Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
font = new Font(Display.getCurrent(), fontData);
|
|
||||||
m_fontMap.put(fontName, font);
|
|
||||||
}
|
|
||||||
return font;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a bold version of the given {@link Font}.
|
|
||||||
*
|
|
||||||
* @param baseFont
|
|
||||||
* the {@link Font} for which a bold version is desired
|
|
||||||
* @return the bold version of the given {@link Font}
|
|
||||||
*/
|
|
||||||
public static Font getBoldFont(Font baseFont) {
|
|
||||||
Font font = m_fontToBoldFontMap.get(baseFont);
|
|
||||||
if (font == null) {
|
|
||||||
FontData fontDatas[] = baseFont.getFontData();
|
|
||||||
FontData data = fontDatas[0];
|
|
||||||
font = new Font(Display.getCurrent(), data.getName(), data.getHeight(), SWT.BOLD);
|
|
||||||
m_fontToBoldFontMap.put(baseFont, font);
|
|
||||||
}
|
|
||||||
return font;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Dispose all of the cached {@link Font}'s.
|
|
||||||
*/
|
|
||||||
public static void disposeFonts() {
|
|
||||||
// clear fonts
|
|
||||||
for (Font font : m_fontMap.values()) {
|
|
||||||
font.dispose();
|
|
||||||
}
|
|
||||||
m_fontMap.clear();
|
|
||||||
// clear bold fonts
|
|
||||||
for (Font font : m_fontToBoldFontMap.values()) {
|
|
||||||
font.dispose();
|
|
||||||
}
|
|
||||||
m_fontToBoldFontMap.clear();
|
|
||||||
}
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Cursor
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
/**
|
|
||||||
* Maps IDs to cursors.
|
|
||||||
*/
|
|
||||||
private static Map<Integer, Cursor> m_idToCursorMap = new HashMap<Integer, Cursor>();
|
|
||||||
/**
|
|
||||||
* Returns the system cursor matching the specific ID.
|
|
||||||
*
|
|
||||||
* @param id
|
|
||||||
* int The ID value for the cursor
|
|
||||||
* @return Cursor The system cursor matching the specific ID
|
|
||||||
*/
|
|
||||||
public static Cursor getCursor(int id) {
|
|
||||||
Integer key = Integer.valueOf(id);
|
|
||||||
Cursor cursor = m_idToCursorMap.get(key);
|
|
||||||
if (cursor == null) {
|
|
||||||
cursor = new Cursor(Display.getDefault(), id);
|
|
||||||
m_idToCursorMap.put(key, cursor);
|
|
||||||
}
|
|
||||||
return cursor;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Dispose all of the cached cursors.
|
|
||||||
*/
|
|
||||||
public static void disposeCursors() {
|
|
||||||
for (Cursor cursor : m_idToCursorMap.values()) {
|
|
||||||
cursor.dispose();
|
|
||||||
}
|
|
||||||
m_idToCursorMap.clear();
|
|
||||||
}
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// General
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
/**
|
|
||||||
* Dispose of cached objects and their underlying OS resources. This should only be called when the cached
|
|
||||||
* objects are no longer needed (e.g. on application shutdown).
|
|
||||||
*/
|
|
||||||
public static void dispose() {
|
|
||||||
disposeColors();
|
|
||||||
disposeImages();
|
|
||||||
disposeFonts();
|
|
||||||
disposeCursors();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
|
||||||
<classpathentry kind="src" path="src"/>
|
|
||||||
<classpathentry kind="output" path="bin"/>
|
|
||||||
</classpath>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
/bin/
|
|
||||||
/target/
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>com.minres.scviewer.database.ui</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.ManifestBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.pde.SchemaBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.pde.PluginNature</nature>
|
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.7
|
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.source=1.7
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
pluginProject.extensions=false
|
|
||||||
resolve.requirebundle=false
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user