Compare commits
No commits in common. "master" and "V1.1.0" have entirely different histories.
8
.gitignore
vendored
8
.gitignore
vendored
@ -3,11 +3,3 @@
|
|||||||
/.recommenders/
|
/.recommenders/
|
||||||
/RemoteSystemsTempFiles/
|
/RemoteSystemsTempFiles/
|
||||||
/*.zip
|
/*.zip
|
||||||
SCViewer initiator_target.launch
|
|
||||||
SCViewer.xcf
|
|
||||||
SCViewer_1.png
|
|
||||||
copyrightLog.txt
|
|
||||||
/workspace
|
|
||||||
?*.launch
|
|
||||||
/.settings/
|
|
||||||
.tycho-consumer-pom.xml
|
|
@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
|
|
||||||
<intAttribute key="M2_COLORS" value="0"/>
|
|
||||||
<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
|
|
||||||
<stringAttribute key="M2_GOALS" value="package"/>
|
|
||||||
<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
|
|
||||||
<booleanAttribute key="M2_OFFLINE" value="false"/>
|
|
||||||
<stringAttribute key="M2_PROFILES" value=""/>
|
|
||||||
<listAttribute key="M2_PROPERTIES"/>
|
|
||||||
<stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
|
|
||||||
<booleanAttribute key="M2_SKIP_TESTS" value="false"/>
|
|
||||||
<intAttribute key="M2_THREADS" value="1"/>
|
|
||||||
<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
|
|
||||||
<stringAttribute key="M2_USER_SETTINGS" value=""/>
|
|
||||||
<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.debug.core.ATTR_FORCE_SYSTEM_CONSOLE_ENCODING" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES" value="true"/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_CLASSPATH_ONLY_JAR" value="false"/>
|
|
||||||
<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-17/"/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.minres.scviewer.parent}"/>
|
|
||||||
</launchConfiguration>
|
|
@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
|
|
||||||
<intAttribute key="M2_COLORS" value="0"/>
|
|
||||||
<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
|
|
||||||
<stringAttribute key="M2_GOALS" value="package"/>
|
|
||||||
<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
|
|
||||||
<booleanAttribute key="M2_OFFLINE" value="false"/>
|
|
||||||
<stringAttribute key="M2_PROFILES" value="release-composite"/>
|
|
||||||
<listAttribute key="M2_PROPERTIES"/>
|
|
||||||
<stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
|
|
||||||
<booleanAttribute key="M2_SKIP_TESTS" value="false"/>
|
|
||||||
<intAttribute key="M2_THREADS" value="4"/>
|
|
||||||
<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
|
|
||||||
<stringAttribute key="M2_USER_SETTINGS" value=""/>
|
|
||||||
<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="true"/>
|
|
||||||
<booleanAttribute key="org.eclipse.debug.core.ATTR_FORCE_SYSTEM_CONSOLE_ENCODING" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES" value="true"/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_CLASSPATH_ONLY_JAR" value="false"/>
|
|
||||||
<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-17/"/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.minres.scviewer.parent}"/>
|
|
||||||
</launchConfiguration>
|
|
@ -1,26 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
|
|
||||||
<intAttribute key="M2_COLORS" value="0"/>
|
|
||||||
<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
|
|
||||||
<stringAttribute key="M2_GOALS" value="tycho-versions:set-version tycho-versions:update-pom"/>
|
|
||||||
<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
|
|
||||||
<booleanAttribute key="M2_OFFLINE" value="false"/>
|
|
||||||
<stringAttribute key="M2_PROFILES" value=""/>
|
|
||||||
<listAttribute key="M2_PROPERTIES">
|
|
||||||
<listEntry value="newVersion=${string_prompt:new version number}"/>
|
|
||||||
</listAttribute>
|
|
||||||
<stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
|
|
||||||
<booleanAttribute key="M2_SKIP_TESTS" value="false"/>
|
|
||||||
<intAttribute key="M2_THREADS" value="1"/>
|
|
||||||
<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
|
|
||||||
<stringAttribute key="M2_USER_SETTINGS" value=""/>
|
|
||||||
<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
|
|
||||||
<stringAttribute key="bad_container_name" value="/com.minres.scviewer.parent/.launch"/>
|
|
||||||
<booleanAttribute key="org.eclipse.debug.core.ATTR_FORCE_SYSTEM_CONSOLE_ENCODING" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES" value="true"/>
|
|
||||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_CLASSPATH_ONLY_JAR" value="false"/>
|
|
||||||
<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-17/"/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.minres.scviewer.parent}"/>
|
|
||||||
</launchConfiguration>
|
|
203
LICENSE
203
LICENSE
@ -1,203 +0,0 @@
|
|||||||
Eclipse Public License - v 1.0
|
|
||||||
|
|
||||||
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
|
|
||||||
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
|
|
||||||
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
|
|
||||||
|
|
||||||
1. DEFINITIONS
|
|
||||||
|
|
||||||
"Contribution" means:
|
|
||||||
|
|
||||||
a) in the case of the initial Contributor, the initial code and documentation
|
|
||||||
distributed under this Agreement, and
|
|
||||||
b) in the case of each subsequent Contributor:
|
|
||||||
i) changes to the Program, and
|
|
||||||
ii) additions to the Program;
|
|
||||||
|
|
||||||
where such changes and/or additions to the Program originate from and are
|
|
||||||
distributed by that particular Contributor. A Contribution 'originates'
|
|
||||||
from a Contributor if it was added to the Program by such Contributor
|
|
||||||
itself or anyone acting on such Contributor's behalf. Contributions do not
|
|
||||||
include additions to the Program which: (i) are separate modules of
|
|
||||||
software distributed in conjunction with the Program under their own
|
|
||||||
license agreement, and (ii) are not derivative works of the Program.
|
|
||||||
|
|
||||||
"Contributor" means any person or entity that distributes the Program.
|
|
||||||
|
|
||||||
"Licensed Patents" mean patent claims licensable by a Contributor which are
|
|
||||||
necessarily infringed by the use or sale of its Contribution alone or when
|
|
||||||
combined with the Program.
|
|
||||||
|
|
||||||
"Program" means the Contributions distributed in accordance with this
|
|
||||||
Agreement.
|
|
||||||
|
|
||||||
"Recipient" means anyone who receives the Program under this Agreement,
|
|
||||||
including all Contributors.
|
|
||||||
|
|
||||||
2. GRANT OF RIGHTS
|
|
||||||
a) Subject to the terms of this Agreement, each Contributor hereby grants
|
|
||||||
Recipient a non-exclusive, worldwide, royalty-free copyright license to
|
|
||||||
reproduce, prepare derivative works of, publicly display, publicly
|
|
||||||
perform, distribute and sublicense the Contribution of such Contributor,
|
|
||||||
if any, and such derivative works, in source code and object code form.
|
|
||||||
b) Subject to the terms of this Agreement, each Contributor hereby grants
|
|
||||||
Recipient a non-exclusive, worldwide, royalty-free patent license under
|
|
||||||
Licensed Patents to make, use, sell, offer to sell, import and otherwise
|
|
||||||
transfer the Contribution of such Contributor, if any, in source code and
|
|
||||||
object code form. This patent license shall apply to the combination of
|
|
||||||
the Contribution and the Program if, at the time the Contribution is
|
|
||||||
added by the Contributor, such addition of the Contribution causes such
|
|
||||||
combination to be covered by the Licensed Patents. The patent license
|
|
||||||
shall not apply to any other combinations which include the Contribution.
|
|
||||||
No hardware per se is licensed hereunder.
|
|
||||||
c) Recipient understands that although each Contributor grants the licenses
|
|
||||||
to its Contributions set forth herein, no assurances are provided by any
|
|
||||||
Contributor that the Program does not infringe the patent or other
|
|
||||||
intellectual property rights of any other entity. Each Contributor
|
|
||||||
disclaims any liability to Recipient for claims brought by any other
|
|
||||||
entity based on infringement of intellectual property rights or
|
|
||||||
otherwise. As a condition to exercising the rights and licenses granted
|
|
||||||
hereunder, each Recipient hereby assumes sole responsibility to secure
|
|
||||||
any other intellectual property rights needed, if any. For example, if a
|
|
||||||
third party patent license is required to allow Recipient to distribute
|
|
||||||
the Program, it is Recipient's responsibility to acquire that license
|
|
||||||
before distributing the Program.
|
|
||||||
d) Each Contributor represents that to its knowledge it has sufficient
|
|
||||||
copyright rights in its Contribution, if any, to grant the copyright
|
|
||||||
license set forth in this Agreement.
|
|
||||||
|
|
||||||
3. REQUIREMENTS
|
|
||||||
|
|
||||||
A Contributor may choose to distribute the Program in object code form under
|
|
||||||
its own license agreement, provided that:
|
|
||||||
|
|
||||||
a) it complies with the terms and conditions of this Agreement; and
|
|
||||||
b) its license agreement:
|
|
||||||
i) effectively disclaims on behalf of all Contributors all warranties
|
|
||||||
and conditions, express and implied, including warranties or
|
|
||||||
conditions of title and non-infringement, and implied warranties or
|
|
||||||
conditions of merchantability and fitness for a particular purpose;
|
|
||||||
ii) effectively excludes on behalf of all Contributors all liability for
|
|
||||||
damages, including direct, indirect, special, incidental and
|
|
||||||
consequential damages, such as lost profits;
|
|
||||||
iii) states that any provisions which differ from this Agreement are
|
|
||||||
offered by that Contributor alone and not by any other party; and
|
|
||||||
iv) states that source code for the Program is available from such
|
|
||||||
Contributor, and informs licensees how to obtain it in a reasonable
|
|
||||||
manner on or through a medium customarily used for software exchange.
|
|
||||||
|
|
||||||
When the Program is made available in source code form:
|
|
||||||
|
|
||||||
a) it must be made available under this Agreement; and
|
|
||||||
b) a copy of this Agreement must be included with each copy of the Program.
|
|
||||||
Contributors may not remove or alter any copyright notices contained
|
|
||||||
within the Program.
|
|
||||||
|
|
||||||
Each Contributor must identify itself as the originator of its Contribution,
|
|
||||||
if
|
|
||||||
any, in a manner that reasonably allows subsequent Recipients to identify the
|
|
||||||
originator of the Contribution.
|
|
||||||
|
|
||||||
4. COMMERCIAL DISTRIBUTION
|
|
||||||
|
|
||||||
Commercial distributors of software may accept certain responsibilities with
|
|
||||||
respect to end users, business partners and the like. While this license is
|
|
||||||
intended to facilitate the commercial use of the Program, the Contributor who
|
|
||||||
includes the Program in a commercial product offering should do so in a manner
|
|
||||||
which does not create potential liability for other Contributors. Therefore,
|
|
||||||
if a Contributor includes the Program in a commercial product offering, such
|
|
||||||
Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
|
|
||||||
every other Contributor ("Indemnified Contributor") against any losses,
|
|
||||||
damages and costs (collectively "Losses") arising from claims, lawsuits and
|
|
||||||
other legal actions brought by a third party against the Indemnified
|
|
||||||
Contributor to the extent caused by the acts or omissions of such Commercial
|
|
||||||
Contributor in connection with its distribution of the Program in a commercial
|
|
||||||
product offering. The obligations in this section do not apply to any claims
|
|
||||||
or Losses relating to any actual or alleged intellectual property
|
|
||||||
infringement. In order to qualify, an Indemnified Contributor must:
|
|
||||||
a) promptly notify the Commercial Contributor in writing of such claim, and
|
|
||||||
b) allow the Commercial Contributor to control, and cooperate with the
|
|
||||||
Commercial Contributor in, the defense and any related settlement
|
|
||||||
negotiations. The Indemnified Contributor may participate in any such claim at
|
|
||||||
its own expense.
|
|
||||||
|
|
||||||
For example, a Contributor might include the Program in a commercial product
|
|
||||||
offering, Product X. That Contributor is then a Commercial Contributor. If
|
|
||||||
that Commercial Contributor then makes performance claims, or offers
|
|
||||||
warranties related to Product X, those performance claims and warranties are
|
|
||||||
such Commercial Contributor's responsibility alone. Under this section, the
|
|
||||||
Commercial Contributor would have to defend claims against the other
|
|
||||||
Contributors related to those performance claims and warranties, and if a
|
|
||||||
court requires any other Contributor to pay any damages as a result, the
|
|
||||||
Commercial Contributor must pay those damages.
|
|
||||||
|
|
||||||
5. NO WARRANTY
|
|
||||||
|
|
||||||
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
|
|
||||||
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
|
|
||||||
NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
|
|
||||||
Recipient is solely responsible for determining the appropriateness of using
|
|
||||||
and distributing the Program and assumes all risks associated with its
|
|
||||||
exercise of rights under this Agreement , including but not limited to the
|
|
||||||
risks and costs of program errors, compliance with applicable laws, damage to
|
|
||||||
or loss of data, programs or equipment, and unavailability or interruption of
|
|
||||||
operations.
|
|
||||||
|
|
||||||
6. DISCLAIMER OF LIABILITY
|
|
||||||
|
|
||||||
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
|
|
||||||
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
|
|
||||||
LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
|
|
||||||
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
|
|
||||||
OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
7. GENERAL
|
|
||||||
|
|
||||||
If any provision of this Agreement is invalid or unenforceable under
|
|
||||||
applicable law, it shall not affect the validity or enforceability of the
|
|
||||||
remainder of the terms of this Agreement, and without further action by the
|
|
||||||
parties hereto, such provision shall be reformed to the minimum extent
|
|
||||||
necessary to make such provision valid and enforceable.
|
|
||||||
|
|
||||||
If Recipient institutes patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Program itself
|
|
||||||
(excluding combinations of the Program with other software or hardware)
|
|
||||||
infringes such Recipient's patent(s), then such Recipient's rights granted
|
|
||||||
under Section 2(b) shall terminate as of the date such litigation is filed.
|
|
||||||
|
|
||||||
All Recipient's rights under this Agreement shall terminate if it fails to
|
|
||||||
comply with any of the material terms or conditions of this Agreement and does
|
|
||||||
not cure such failure in a reasonable period of time after becoming aware of
|
|
||||||
such noncompliance. If all Recipient's rights under this Agreement terminate,
|
|
||||||
Recipient agrees to cease use and distribution of the Program as soon as
|
|
||||||
reasonably practicable. However, Recipient's obligations under this Agreement
|
|
||||||
and any licenses granted by Recipient relating to the Program shall continue
|
|
||||||
and survive.
|
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute copies of this Agreement, but in
|
|
||||||
order to avoid inconsistency the Agreement is copyrighted and may only be
|
|
||||||
modified in the following manner. The Agreement Steward reserves the right to
|
|
||||||
publish new versions (including revisions) of this Agreement from time to
|
|
||||||
time. No one other than the Agreement Steward has the right to modify this
|
|
||||||
Agreement. The Eclipse Foundation is the initial Agreement Steward. The
|
|
||||||
Eclipse Foundation may assign the responsibility to serve as the Agreement
|
|
||||||
Steward to a suitable separate entity. Each new version of the Agreement will
|
|
||||||
be given a distinguishing version number. The Program (including
|
|
||||||
Contributions) may always be distributed subject to the version of the
|
|
||||||
Agreement under which it was received. In addition, after a new version of the
|
|
||||||
Agreement is published, Contributor may elect to distribute the Program
|
|
||||||
(including its Contributions) under the new version. Except as expressly
|
|
||||||
stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
|
|
||||||
licenses to the intellectual property of any Contributor under this Agreement,
|
|
||||||
whether expressly, by implication, estoppel or otherwise. All rights in the
|
|
||||||
Program not expressly granted under this Agreement are reserved.
|
|
||||||
|
|
||||||
This Agreement is governed by the laws of the State of New York and the
|
|
||||||
intellectual property laws of the United States of America. No party to this
|
|
||||||
Agreement will bring a legal action under this Agreement more than one year
|
|
||||||
after the cause of action arose. Each party waives its rights to a jury trial in
|
|
||||||
any resulting litigation.
|
|
98
README.md
98
README.md
@ -1,70 +1,42 @@
|
|||||||
SCViewer
|
SCViewer
|
||||||
========
|
========
|
||||||
|
|
||||||
SCViewer is composed of a set of eclipse plugins to display VCD (e.g. created by SystemC VCD trace) and transaction streams. Those streams can be
|
SCViewer is composed of a set of eclipse plugins to display VCD and transaction streams
|
||||||
created by the SystemC Verification Library (SCV, For further description of the SCV please refer to https://www.accellera.org/activities/working-groups/systemc-verification) or by the **L**ight**w**eight **T**ranasaction **R**ecording for SystemC ( [LWTR4SC](https://github.com/Minres/LWTR4SC) ).
|
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 has the following features
|
The viewer is in early alpha stage and not yet ready for production use!
|
||||||
- support of VCD files (compressed and uncompressed)
|
|
||||||
- real numbers
|
|
||||||
- showing vectors and real numbers as analog (step-wise & continuous)
|
|
||||||
- various value representations of bit vectors
|
|
||||||
- support of SCV transaction recordings in various formats
|
|
||||||
- text log files (compressed and uncompressed)
|
|
||||||
- sqlite based
|
|
||||||
- visualization of transaction relations
|
|
||||||
|
|
||||||
> If you encounter issue when running on Linux please try running as `SWT_GTK3=0 scviewer` as there exist issues wiht GTK3.
|
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 and the scv4tlm
|
||||||
|
socket implementations.
|
||||||
|
A simple example (scv_tr_recording_example.cpp) for testig purposes of the database is
|
||||||
|
provided.
|
||||||
|
|
||||||
To build the plugins the Eclipse SDK or PDE can be used.
|
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
|
||||||
Key Shortcuts
|
installed.
|
||||||
=============
|
|
||||||
|
|
||||||
Legend:
|
|
||||||
|
|
||||||
* Left Mouse Button: LMB
|
|
||||||
* Middle Mouse Button: MMB
|
|
||||||
* Mouse Scroll wheel: MScrl
|
|
||||||
* Context any means Name List, Value List or Waveform
|
|
||||||
|
|
||||||
| Input | Modifier | Context | Action |
|
|
||||||
|------------|----------|----------|-----------------------------------|
|
|
||||||
| LMB click | | any | select |
|
|
||||||
| LMB click | Shift | Waveform | move selected marker to position |
|
|
||||||
| LMB click | Control | Waveform | move cursor to position |
|
|
||||||
| LMB drag | | Waveform | zoom to range |
|
|
||||||
| MMB click | | Waveform | move selected marker to position |
|
|
||||||
| MScrl | | any | scroll window up/down |
|
|
||||||
| MScrl | Shift | any | scroll window left/right |
|
|
||||||
| MScrl | Control | Waveform | zoom in/out |
|
|
||||||
| Key left | | Waveform | scroll window to the left (slow) |
|
|
||||||
| Key right | | Waveform | scroll window to the right (slow) |
|
|
||||||
| Key left | Shift | Waveform | scroll window to the left (fast) |
|
|
||||||
| Key right | Shift | Waveform | scroll window to the right (fast) |
|
|
||||||
| Key up | | Waveform | move selection up |
|
|
||||||
| Key down | | Waveform | move selection down |
|
|
||||||
| Key up | Control | Waveform | move selected track up |
|
|
||||||
| Key down | Control | Waveform | move selected track down |
|
|
||||||
| Key + | Control | Waveform | zoom in |
|
|
||||||
| Key - | Control | Waveform | zoom out |
|
|
||||||
| Key Pos1 | | Waveform | jump to selected marker |
|
|
||||||
| Key End | | Waveform | jump to cursor |
|
|
||||||
| Key Del | | any | delete selected entries |
|
|
||||||
| LMB click | | ZoomBar | increment/decrement 1 page |
|
|
||||||
| LMB drag | | ZoomBar | drag both markers (pan) |
|
|
||||||
| LMB drag | Control | ZoomBar | drag one marker (zoom) |
|
|
||||||
| MMB drag | | ZoomBar | drag one marker (zoom) |
|
|
||||||
| xMB dclick | | ZoomBar | pan to position |
|
|
||||||
| MScrl | | ZoomBar | scroll window left/right |
|
|
||||||
| MScrl | Shift | ZoomBar | scroll window left/right double speed |
|
|
||||||
| MScrl | Control | ZoomBar | zoom in/out |
|
|
||||||
| Key left | | ZoomBar | scroll window to the left (slow) |
|
|
||||||
| Key right | | ZoomBar | scroll window to the right (slow) |
|
|
||||||
| Key up | | ZoomBar | scroll window to the left (slow) |
|
|
||||||
| Key down | | ZoomBar | scroll window to the right (slow) |
|
|
||||||
| Key PgUp | | ZoomBar | scroll window to the left (fast) |
|
|
||||||
| Key PgDown | | ZoomBar | scroll window to the right (fast) |
|
|
||||||
| Key Pos1 | | ZoomBar | scroll to begin |
|
|
||||||
| Key End | | ZoomBar | scroll to end |
|
|
||||||
|
|
||||||
|
TODO
|
||||||
|
====
|
||||||
|
- add more tests
|
||||||
|
- move to feature based product to allow automatic updates
|
||||||
|
- improve graphics
|
||||||
|
- catch-up e3 plugin to functionality of e4 product
|
@ -1,11 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<classpath>
|
<classpath>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
||||||
<attributes>
|
|
||||||
<attribute name="module" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry exported="true" kind="lib" path="sqlite-jdbc-3.8.7.jar"/>
|
||||||
<classpathentry kind="output" path="target/classes"/>
|
<classpathentry kind="output" path="target/classes"/>
|
||||||
</classpath>
|
</classpath>
|
@ -0,0 +1,7 @@
|
|||||||
|
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
|
@ -2,14 +2,16 @@ Manifest-Version: 1.0
|
|||||||
Bundle-ManifestVersion: 2
|
Bundle-ManifestVersion: 2
|
||||||
Bundle-Name: SQLite transaction database
|
Bundle-Name: SQLite transaction database
|
||||||
Bundle-SymbolicName: com.minres.scviewer.database.sqlite
|
Bundle-SymbolicName: com.minres.scviewer.database.sqlite
|
||||||
Bundle-Version: 1.1.0.qualifier
|
Bundle-Version: 1.0.0.qualifier
|
||||||
Bundle-Vendor: MINRES Technologies GmbH
|
Bundle-Vendor: MINRES Technologies GmbH
|
||||||
Bundle-RequiredExecutionEnvironment: JavaSE-17
|
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
||||||
Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0"
|
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
|
Bundle-ClassPath: .,sqlite-jdbc-3.8.7.jar
|
||||||
Service-Component: OSGI-INF/component.xml
|
Service-Component: OSGI-INF/component.xml
|
||||||
Bundle-ActivationPolicy: lazy
|
Bundle-ActivationPolicy: lazy
|
||||||
Embed-Dependency: sqlite-jdbc
|
Embed-Dependency: sqlite-jdbc
|
||||||
Embedded-Artifacts: sqlite-jdbc-3.8.7.jar;g="org.xerial";
|
Embedded-Artifacts: sqlite-jdbc-3.8.7.jar;g="org.xerial";
|
||||||
a="sqlite-jdbc";v="3.8.7"
|
a="sqlite-jdbc";v="3.8.7"
|
||||||
Automatic-Module-Name: com.minres.scviewer.database.sqlite
|
|
@ -1,5 +1,5 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
# Copyright (c) 2014, 2015-2021 MINRES Technologies GmbH and others.
|
# Copyright (c) 2014, 2015 MINRES Technologies GmbH and others.
|
||||||
# All rights reserved. This program and the accompanying materials
|
# All rights reserved. This program and the accompanying materials
|
||||||
# are made available under the terms of the Eclipse Public License v1.0
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
# which accompanies this distribution, and is available at
|
# which accompanies this distribution, and is available at
|
@ -4,8 +4,8 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.minres.scviewer</groupId>
|
<groupId>com.minres.scviewer</groupId>
|
||||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||||
<version>2.19.4</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
<relativePath>../..</relativePath>
|
<relativePath>../com.minres.scviewer.parent</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<packaging>eclipse-plugin</packaging>
|
<packaging>eclipse-plugin</packaging>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@ -15,5 +15,4 @@
|
|||||||
<version>3.8.7</version>
|
<version>3.8.7</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<version>1.1.0-SNAPSHOT</version>
|
</project>
|
||||||
</project>
|
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -11,9 +11,8 @@
|
|||||||
package com.minres.scviewer.database.sqlite;
|
package com.minres.scviewer.database.sqlite;
|
||||||
|
|
||||||
import java.beans.IntrospectionException;
|
import java.beans.IntrospectionException;
|
||||||
import java.beans.PropertyChangeListener;
|
|
||||||
import java.beans.PropertyChangeSupport;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -21,8 +20,9 @@ import java.util.Collection;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.minres.scviewer.database.IWaveform;
|
import com.minres.scviewer.database.IWaveform;
|
||||||
|
import com.minres.scviewer.database.IWaveformDb;
|
||||||
import com.minres.scviewer.database.IWaveformDbLoader;
|
import com.minres.scviewer.database.IWaveformDbLoader;
|
||||||
import com.minres.scviewer.database.InputFormatException;
|
import com.minres.scviewer.database.IWaveformEvent;
|
||||||
import com.minres.scviewer.database.RelationType;
|
import com.minres.scviewer.database.RelationType;
|
||||||
import com.minres.scviewer.database.sqlite.db.IDatabase;
|
import com.minres.scviewer.database.sqlite.db.IDatabase;
|
||||||
import com.minres.scviewer.database.sqlite.db.SQLiteDatabase;
|
import com.minres.scviewer.database.sqlite.db.SQLiteDatabase;
|
||||||
@ -37,81 +37,72 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
|
|||||||
|
|
||||||
private List<RelationType> usedRelationsList = new ArrayList<>();
|
private List<RelationType> usedRelationsList = new ArrayList<>();
|
||||||
|
|
||||||
|
private IWaveformDb db;
|
||||||
|
|
||||||
private ScvSimProps scvSimProps;
|
private ScvSimProps scvSimProps;
|
||||||
|
|
||||||
/** The pcs. */
|
public SQLiteDbLoader() {
|
||||||
protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getMaxTime() {
|
public Long getMaxTime() {
|
||||||
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class,
|
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<ScvTxEvent>(ScvTxEvent.class,
|
||||||
database, "time = (SELECT MAX(time) FROM ScvTxEvent)");
|
database, "time = (SELECT MAX(time) FROM ScvTxEvent)");
|
||||||
try {
|
try {
|
||||||
List<ScvTxEvent> event = handler.selectObjects();
|
List<ScvTxEvent> event = handler.selectObjects();
|
||||||
if(!event.isEmpty())
|
if(event.size()>0)
|
||||||
return event.get(0).getTime()*scvSimProps.getTime_resolution();
|
return event.get(0).getTime()*scvSimProps.getTime_resolution();
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return 0L;
|
return 0L;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<IWaveform> getAllWaves() {
|
public List<IWaveform<? extends IWaveformEvent>> getAllWaves() {
|
||||||
SQLiteDatabaseSelectHandler<ScvStream> handler = new SQLiteDatabaseSelectHandler<>(ScvStream.class, database);
|
SQLiteDatabaseSelectHandler<ScvStream> handler = new SQLiteDatabaseSelectHandler<ScvStream>(ScvStream.class, database);
|
||||||
List<IWaveform> streams=new ArrayList<>();
|
List<IWaveform<? extends IWaveformEvent>> streams=new ArrayList<IWaveform<? extends IWaveformEvent>>();
|
||||||
try {
|
try {
|
||||||
for(ScvStream scvStream:handler.selectObjects()){
|
for(ScvStream scvStream:handler.selectObjects()){
|
||||||
TxStream stream = new TxStream(database, scvStream);
|
TxStream stream = new TxStream(database, db, scvStream);
|
||||||
stream.setRelationTypeList(usedRelationsList);
|
stream.setRelationTypeList(usedRelationsList);
|
||||||
streams.add(stream);
|
streams.add(stream);
|
||||||
}
|
}
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||||
|
// e.printStackTrace();
|
||||||
}
|
}
|
||||||
return streams;
|
return streams;
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Override
|
private byte[] x = "SQLite format 3".getBytes();
|
||||||
// public boolean canLoad(File inputFile) {
|
|
||||||
// if (!inputFile.isDirectory() && inputFile.exists()) {
|
|
||||||
// try(InputStream stream = new FileInputStream(inputFile)){
|
|
||||||
// byte[] buffer = new byte[x.length];
|
|
||||||
// int readCnt = stream.read(buffer, 0, x.length);
|
|
||||||
// if (readCnt == x.length) {
|
|
||||||
// for (int i = 0; i < x.length; i++)
|
|
||||||
// if (buffer[i] != x[i])
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// return true;
|
|
||||||
// } catch (Exception e) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(File file) throws InputFormatException {
|
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=new SQLiteDatabase(file.getAbsolutePath());
|
||||||
database.setData("TIMERESOLUTION", 1L);
|
database.setData("TIMERESOLUTION", 1L);
|
||||||
SQLiteDatabaseSelectHandler<ScvSimProps> handler = new SQLiteDatabaseSelectHandler<>(ScvSimProps.class, database);
|
SQLiteDatabaseSelectHandler<ScvSimProps> handler = new SQLiteDatabaseSelectHandler<ScvSimProps>(ScvSimProps.class, database);
|
||||||
try {
|
try {
|
||||||
for(ScvSimProps simProps:handler.selectObjects()){
|
for(ScvSimProps simProps:handler.selectObjects()){
|
||||||
scvSimProps=simProps;
|
scvSimProps=simProps;
|
||||||
database.setData("TIMERESOLUTION", scvSimProps.getTime_resolution());
|
database.setData("TIMERESOLUTION", scvSimProps.getTime_resolution());
|
||||||
}
|
}
|
||||||
pcs.firePropertyChange(IWaveformDbLoader.LOADING_FINISHED, null, null);
|
return true;
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||||
throw new InputFormatException(e.toString());
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
return false;
|
||||||
|
|
||||||
public void dispose() {
|
|
||||||
database=null;
|
|
||||||
usedRelationsList=null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -119,24 +110,4 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
|
|||||||
return usedRelationsList;
|
return usedRelationsList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the property change listener.
|
|
||||||
*
|
|
||||||
* @param l the l
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void addPropertyChangeListener(PropertyChangeListener l) {
|
|
||||||
pcs.addPropertyChangeListener(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the property change listener.
|
|
||||||
*
|
|
||||||
* @param l the l
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void removePropertyChangeListener(PropertyChangeListener l) {
|
|
||||||
pcs.removePropertyChangeListener(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -18,7 +18,12 @@ import java.util.Collection;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.minres.scviewer.database.AssociationType;
|
import com.minres.scviewer.database.AssociationType;
|
||||||
import com.minres.scviewer.database.IWaveform;
|
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.IDatabase;
|
||||||
import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler;
|
import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler;
|
||||||
import com.minres.scviewer.database.sqlite.tables.ScvStream;
|
import com.minres.scviewer.database.sqlite.tables.ScvStream;
|
||||||
@ -26,9 +31,6 @@ import com.minres.scviewer.database.sqlite.tables.ScvTx;
|
|||||||
import com.minres.scviewer.database.sqlite.tables.ScvTxAttribute;
|
import com.minres.scviewer.database.sqlite.tables.ScvTxAttribute;
|
||||||
import com.minres.scviewer.database.sqlite.tables.ScvTxEvent;
|
import com.minres.scviewer.database.sqlite.tables.ScvTxEvent;
|
||||||
import com.minres.scviewer.database.sqlite.tables.ScvTxRelation;
|
import com.minres.scviewer.database.sqlite.tables.ScvTxRelation;
|
||||||
import com.minres.scviewer.database.tx.ITx;
|
|
||||||
import com.minres.scviewer.database.tx.ITxAttribute;
|
|
||||||
import com.minres.scviewer.database.tx.ITxRelation;
|
|
||||||
|
|
||||||
public class Tx implements ITx {
|
public class Tx implements ITx {
|
||||||
|
|
||||||
@ -37,10 +39,8 @@ public class Tx implements ITx {
|
|||||||
private TxGenerator trGenerator;
|
private TxGenerator trGenerator;
|
||||||
private ScvTx scvTx;
|
private ScvTx scvTx;
|
||||||
private List<ITxAttribute> attributes;
|
private List<ITxAttribute> attributes;
|
||||||
private long begin=-1;
|
private Long begin, end;
|
||||||
private long end=-1;
|
private List<ITxRelation> incoming, outgoing;
|
||||||
private List<ITxRelation> incoming;
|
|
||||||
private List<ITxRelation> outgoing;
|
|
||||||
|
|
||||||
public Tx(IDatabase database, TxStream trStream, TxGenerator trGenerator, ScvTx scvTx) {
|
public Tx(IDatabase database, TxStream trStream, TxGenerator trGenerator, ScvTx scvTx) {
|
||||||
this.database=database;
|
this.database=database;
|
||||||
@ -50,51 +50,52 @@ public class Tx implements ITx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getId() {
|
public Long getId() {
|
||||||
return (long) scvTx.getId();
|
return (long) scvTx.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IWaveform getStream() {
|
public ITxStream<ITxEvent> getStream() {
|
||||||
return trStream;
|
return trStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IWaveform getGenerator() {
|
public ITxGenerator getGenerator() {
|
||||||
return trGenerator;
|
return trGenerator;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getConcurrencyIndex() {
|
@Override
|
||||||
|
public int getConcurrencyIndex() {
|
||||||
return scvTx.getConcurrencyLevel();
|
return scvTx.getConcurrencyLevel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getBeginTime() {
|
public Long getBeginTime() {
|
||||||
if(begin<0){
|
if(begin==null){
|
||||||
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class,
|
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<ScvTxEvent>(ScvTxEvent.class,
|
||||||
database, "tx="+scvTx.getId()+" AND type="+ AssociationType.BEGIN.ordinal());
|
database, "tx="+scvTx.getId()+" AND type="+ AssociationType.BEGIN.ordinal());
|
||||||
try {
|
try {
|
||||||
for(ScvTxEvent scvEvent:handler.selectObjects()){
|
for(ScvTxEvent scvEvent:handler.selectObjects()){
|
||||||
begin= scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION");
|
begin= scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION");
|
||||||
}
|
}
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return begin;
|
return begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getEndTime() {
|
public Long getEndTime() {
|
||||||
if(end<0){
|
if(end==null){
|
||||||
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class,
|
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<ScvTxEvent>(ScvTxEvent.class,
|
||||||
database, "tx="+scvTx.getId()+" AND type="+ AssociationType.END.ordinal());
|
database, "tx="+scvTx.getId()+" AND type="+ AssociationType.END.ordinal());
|
||||||
try {
|
try {
|
||||||
for(ScvTxEvent scvEvent:handler.selectObjects()){
|
for(ScvTxEvent scvEvent:handler.selectObjects()){
|
||||||
end = scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION");
|
end = scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION");
|
||||||
}
|
}
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return end;
|
return end;
|
||||||
@ -103,16 +104,16 @@ public class Tx implements ITx {
|
|||||||
@Override
|
@Override
|
||||||
public List<ITxAttribute> getAttributes() {
|
public List<ITxAttribute> getAttributes() {
|
||||||
if(attributes==null){
|
if(attributes==null){
|
||||||
SQLiteDatabaseSelectHandler<ScvTxAttribute> handler = new SQLiteDatabaseSelectHandler<>(
|
SQLiteDatabaseSelectHandler<ScvTxAttribute> handler = new SQLiteDatabaseSelectHandler<ScvTxAttribute>(
|
||||||
ScvTxAttribute.class, database, "tx="+scvTx.getId());
|
ScvTxAttribute.class, database, "tx="+scvTx.getId());
|
||||||
try {
|
try {
|
||||||
attributes = new ArrayList<>();
|
attributes = new ArrayList<ITxAttribute>();
|
||||||
for(ScvTxAttribute scvAttribute:handler.selectObjects()){
|
for(ScvTxAttribute scvAttribute:handler.selectObjects()){
|
||||||
attributes.add(new TxAttribute(this, scvAttribute));
|
attributes.add(new TxAttribute(this, scvAttribute));
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return attributes;
|
return attributes;
|
||||||
@ -121,15 +122,15 @@ public class Tx implements ITx {
|
|||||||
@Override
|
@Override
|
||||||
public Collection<ITxRelation> getIncomingRelations() {
|
public Collection<ITxRelation> getIncomingRelations() {
|
||||||
if(incoming==null){
|
if(incoming==null){
|
||||||
SQLiteDatabaseSelectHandler<ScvTxRelation> handler = new SQLiteDatabaseSelectHandler<>(
|
SQLiteDatabaseSelectHandler<ScvTxRelation> handler = new SQLiteDatabaseSelectHandler<ScvTxRelation>(
|
||||||
ScvTxRelation.class, database, "sink="+scvTx.getId());
|
ScvTxRelation.class, database, "sink="+scvTx.getId());
|
||||||
try {
|
try {
|
||||||
incoming = new ArrayList<>();
|
incoming = new ArrayList<ITxRelation>();
|
||||||
for(ScvTxRelation scvRelation:handler.selectObjects()){
|
for(ScvTxRelation scvRelation:handler.selectObjects()){
|
||||||
incoming.add(createRelation(scvRelation, false));
|
incoming.add(createRelation(scvRelation, false));
|
||||||
}
|
}
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return incoming;
|
return incoming;
|
||||||
@ -138,15 +139,15 @@ public class Tx implements ITx {
|
|||||||
@Override
|
@Override
|
||||||
public Collection<ITxRelation> getOutgoingRelations() {
|
public Collection<ITxRelation> getOutgoingRelations() {
|
||||||
if(outgoing==null){
|
if(outgoing==null){
|
||||||
SQLiteDatabaseSelectHandler<ScvTxRelation> handler = new SQLiteDatabaseSelectHandler<>(
|
SQLiteDatabaseSelectHandler<ScvTxRelation> handler = new SQLiteDatabaseSelectHandler<ScvTxRelation>(
|
||||||
ScvTxRelation.class, database, "src="+scvTx.getId());
|
ScvTxRelation.class, database, "src="+scvTx.getId());
|
||||||
try {
|
try {
|
||||||
outgoing = new ArrayList<>();
|
outgoing = new ArrayList<ITxRelation>();
|
||||||
for(ScvTxRelation scvRelation:handler.selectObjects()){
|
for(ScvTxRelation scvRelation:handler.selectObjects()){
|
||||||
outgoing.add(createRelation(scvRelation, true));
|
outgoing.add(createRelation(scvRelation, true));
|
||||||
}
|
}
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return outgoing;
|
return outgoing;
|
||||||
@ -154,7 +155,7 @@ public class Tx implements ITx {
|
|||||||
|
|
||||||
private ITxRelation createRelation(ScvTxRelation rel, boolean outgoing) {
|
private ITxRelation createRelation(ScvTxRelation rel, boolean outgoing) {
|
||||||
int otherId = outgoing?rel.getSink():rel.getSrc();
|
int otherId = outgoing?rel.getSink():rel.getSrc();
|
||||||
SQLiteDatabaseSelectHandler<ScvTx> handler = new SQLiteDatabaseSelectHandler<>(ScvTx.class, database,
|
SQLiteDatabaseSelectHandler<ScvTx> handler = new SQLiteDatabaseSelectHandler<ScvTx>(ScvTx.class, database,
|
||||||
"id="+otherId);
|
"id="+otherId);
|
||||||
try {
|
try {
|
||||||
List<ScvTx> res = handler.selectObjects();
|
List<ScvTx> res = handler.selectObjects();
|
||||||
@ -162,14 +163,14 @@ public class Tx implements ITx {
|
|||||||
List<ScvStream> streams = new SQLiteDatabaseSelectHandler<ScvStream>(ScvStream.class, database,
|
List<ScvStream> streams = new SQLiteDatabaseSelectHandler<ScvStream>(ScvStream.class, database,
|
||||||
"id="+res.get(0).getStream()).selectObjects();
|
"id="+res.get(0).getStream()).selectObjects();
|
||||||
if(streams.size()!=1) return null;
|
if(streams.size()!=1) return null;
|
||||||
TxStream tgtStream = (TxStream) database.getWaveformDb().getStreamByName(streams.get(0).getName());
|
TxStream tgtStream = (TxStream) trStream.getDb().getStreamByName(streams.get(0).getName());
|
||||||
Tx that = (Tx) tgtStream.getTransactions().get(otherId);
|
Tx that = (Tx) tgtStream.getTransactions().get(otherId);
|
||||||
if(outgoing)
|
if(outgoing)
|
||||||
return new TxRelation(trStream.getRelationType(rel.getName()), this, that);
|
return new TxRelation(trStream.getRelationType(rel.getName()), this, that);
|
||||||
else
|
else
|
||||||
return new TxRelation(trStream.getRelationType(rel.getName()), that, this);
|
return new TxRelation(trStream.getRelationType(rel.getName()), that, this);
|
||||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,11 +179,11 @@ public class Tx implements ITx {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(ITx o) {
|
public int compareTo(ITx o) {
|
||||||
int res = Long.compare(this.getBeginTime(), o.getBeginTime());
|
int res = this.getBeginTime().compareTo(o.getBeginTime());
|
||||||
if(res!=0)
|
if(res!=0)
|
||||||
return res;
|
return res;
|
||||||
else
|
else
|
||||||
return Long.compare(this.getId(), o.getId());
|
return this.getId().compareTo(o.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -12,8 +12,8 @@ package com.minres.scviewer.database.sqlite;
|
|||||||
|
|
||||||
import com.minres.scviewer.database.AssociationType;
|
import com.minres.scviewer.database.AssociationType;
|
||||||
import com.minres.scviewer.database.DataType;
|
import com.minres.scviewer.database.DataType;
|
||||||
|
import com.minres.scviewer.database.ITxAttribute;
|
||||||
import com.minres.scviewer.database.sqlite.tables.ScvTxAttribute;
|
import com.minres.scviewer.database.sqlite.tables.ScvTxAttribute;
|
||||||
import com.minres.scviewer.database.tx.ITxAttribute;
|
|
||||||
|
|
||||||
public class TxAttribute implements ITxAttribute{
|
public class TxAttribute implements ITxAttribute{
|
||||||
|
|
||||||
@ -32,18 +32,7 @@ public class TxAttribute implements ITxAttribute{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DataType getDataType() {
|
public DataType getDataType() {
|
||||||
int dt = scvAttribute.getData_type();
|
return DataType.values()[scvAttribute.getData_type()];
|
||||||
switch(dt) {
|
|
||||||
case 12:
|
|
||||||
return DataType.STRING;
|
|
||||||
case 10:
|
|
||||||
return DataType.POINTER;
|
|
||||||
default:
|
|
||||||
if(dt<9)
|
|
||||||
return DataType.values()[dt];
|
|
||||||
else
|
|
||||||
return DataType.NONE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -10,40 +10,43 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.sqlite;
|
package com.minres.scviewer.database.sqlite;
|
||||||
|
|
||||||
import com.minres.scviewer.database.EventKind;
|
import com.minres.scviewer.database.ITx;
|
||||||
import com.minres.scviewer.database.IEvent;
|
import com.minres.scviewer.database.ITxEvent;
|
||||||
import com.minres.scviewer.database.WaveformType;
|
import com.minres.scviewer.database.IWaveformEvent;
|
||||||
import com.minres.scviewer.database.tx.ITx;
|
|
||||||
import com.minres.scviewer.database.tx.ITxEvent;
|
|
||||||
|
|
||||||
public class TxEvent implements ITxEvent {
|
public class TxEvent implements ITxEvent {
|
||||||
|
|
||||||
private final EventKind type;
|
private final Type type;
|
||||||
private ITx tx;
|
private ITx tx;
|
||||||
|
|
||||||
public TxEvent(EventKind type, ITx tx) {
|
public TxEvent(Type type, ITx tx) {
|
||||||
super();
|
super();
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.tx = tx;
|
this.tx = tx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getTime() {
|
public Long getTime() {
|
||||||
return type==EventKind.BEGIN?tx.getBeginTime():tx.getEndTime();
|
return type==Type.BEGIN?tx.getBeginTime():tx.getEndTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IEvent duplicate() throws CloneNotSupportedException {
|
public IWaveformEvent duplicate() throws CloneNotSupportedException {
|
||||||
return new TxEvent(type, tx);
|
return new TxEvent(type, tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(IWaveformEvent o) {
|
||||||
|
return getTime().compareTo(o.getTime());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ITx getTransaction() {
|
public ITx getTransaction() {
|
||||||
return tx;
|
return tx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EventKind getKind() {
|
public Type getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,15 +54,4 @@ public class TxEvent implements ITxEvent {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
return type.toString()+"@"+getTime()+" of tx #"+tx.getId();
|
return type.toString()+"@"+getTime()+" of tx #"+tx.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public WaveformType getType() {
|
|
||||||
return WaveformType.TRANSACTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getRowIndex() {
|
|
||||||
return ((Tx)tx).getConcurrencyIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -10,15 +10,14 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.sqlite;
|
package com.minres.scviewer.database.sqlite;
|
||||||
|
|
||||||
|
import com.minres.scviewer.database.ITxRelation;
|
||||||
|
import com.minres.scviewer.database.ITx;
|
||||||
import com.minres.scviewer.database.RelationType;
|
import com.minres.scviewer.database.RelationType;
|
||||||
import com.minres.scviewer.database.tx.ITx;
|
|
||||||
import com.minres.scviewer.database.tx.ITxRelation;
|
|
||||||
|
|
||||||
public class TxRelation implements ITxRelation {
|
public class TxRelation implements ITxRelation {
|
||||||
|
|
||||||
RelationType relationType;
|
RelationType relationType;
|
||||||
Tx source;
|
Tx source, target;
|
||||||
Tx target;
|
|
||||||
|
|
||||||
public TxRelation(RelationType relationType, Tx source, Tx target) {
|
public TxRelation(RelationType relationType, Tx source, Tx target) {
|
||||||
this.source = source;
|
this.source = source;
|
@ -0,0 +1,199 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -16,8 +16,6 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
|
|
||||||
import com.minres.scviewer.database.IWaveformDb;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Creates a connection to a database.
|
* Creates a connection to a database.
|
||||||
@ -60,6 +58,4 @@ public interface IDatabase {
|
|||||||
public void setData(String name, Object value);
|
public void setData(String name, Object value);
|
||||||
|
|
||||||
public Object getData(String name);
|
public Object getData(String name);
|
||||||
|
|
||||||
public IWaveformDb getWaveformDb();
|
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -20,8 +20,6 @@ import java.sql.SQLException;
|
|||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import com.minres.scviewer.database.IWaveformDb;
|
|
||||||
|
|
||||||
public class SQLiteDatabase implements IDatabase {
|
public class SQLiteDatabase implements IDatabase {
|
||||||
|
|
||||||
protected String dbFileName;
|
protected String dbFileName;
|
||||||
@ -91,9 +89,4 @@ public class SQLiteDatabase implements IDatabase {
|
|||||||
return props.get(name);
|
return props.get(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public IWaveformDb getWaveformDb() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -75,11 +75,11 @@ public class SQLiteDatabaseSelectHandler<T> extends AbstractDatabaseHandler<T> {
|
|||||||
* @throws IllegalAccessException
|
* @throws IllegalAccessException
|
||||||
* @throws IntrospectionException
|
* @throws IntrospectionException
|
||||||
* @throws InvocationTargetException
|
* @throws InvocationTargetException
|
||||||
* @throws NoSuchMethodException
|
|
||||||
*/
|
*/
|
||||||
public synchronized List<T> selectObjects() throws SQLException,
|
public synchronized List<T> selectObjects() throws SQLException,
|
||||||
|
SecurityException, IllegalArgumentException,
|
||||||
InstantiationException, IllegalAccessException,
|
InstantiationException, IllegalAccessException,
|
||||||
IntrospectionException, InvocationTargetException, IllegalArgumentException, NoSuchMethodException, SecurityException {
|
IntrospectionException, InvocationTargetException {
|
||||||
|
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
Statement statement = null;
|
Statement statement = null;
|
||||||
@ -114,18 +114,18 @@ public class SQLiteDatabaseSelectHandler<T> extends AbstractDatabaseHandler<T> {
|
|||||||
* @throws IllegalAccessException
|
* @throws IllegalAccessException
|
||||||
* @throws IntrospectionException
|
* @throws IntrospectionException
|
||||||
* @throws InvocationTargetException
|
* @throws InvocationTargetException
|
||||||
* @throws NoSuchMethodException
|
|
||||||
*/
|
*/
|
||||||
private List<T> createObjects(ResultSet resultSet)
|
private List<T> createObjects(ResultSet resultSet)
|
||||||
throws SQLException, InstantiationException,
|
throws SecurityException, IllegalArgumentException,
|
||||||
|
SQLException, InstantiationException,
|
||||||
IllegalAccessException, IntrospectionException,
|
IllegalAccessException, IntrospectionException,
|
||||||
InvocationTargetException, IllegalArgumentException, NoSuchMethodException, SecurityException {
|
InvocationTargetException {
|
||||||
|
|
||||||
List<T> list = new ArrayList<>();
|
List<T> list = new ArrayList<T>();
|
||||||
|
|
||||||
while (resultSet.next()) {
|
while (resultSet.next()) {
|
||||||
|
|
||||||
T instance = type.getDeclaredConstructor().newInstance();
|
T instance = type.newInstance();
|
||||||
|
|
||||||
for (Field field : type.getDeclaredFields()) {
|
for (Field field : type.getDeclaredFields()) {
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
7
com.minres.scviewer.database.test/.classpath
Normal file
7
com.minres.scviewer.database.test/.classpath
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?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>
|
@ -0,0 +1,3 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
encoding//src/com/minres/scviewer/database/test/DatabaseServicesTest.java=UTF-8
|
||||||
|
encoding/<project>=UTF-8
|
@ -0,0 +1,8 @@
|
|||||||
|
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
|
@ -0,0 +1,46 @@
|
|||||||
|
<?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>
|
@ -2,14 +2,13 @@ Manifest-Version: 1.0
|
|||||||
Bundle-ManifestVersion: 2
|
Bundle-ManifestVersion: 2
|
||||||
Bundle-Name: SCViewer database tests
|
Bundle-Name: SCViewer database tests
|
||||||
Bundle-SymbolicName: com.minres.scviewer.database.test
|
Bundle-SymbolicName: com.minres.scviewer.database.test
|
||||||
Bundle-Version: 4.0.0.qualifier
|
Bundle-Version: 1.0.0.qualifier
|
||||||
Bundle-Vendor: MINRES Technologies GmbH
|
Bundle-Vendor: MINRES Technologies GnbH
|
||||||
Bundle-RequiredExecutionEnvironment: JavaSE-17
|
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
||||||
Require-Bundle: com.minres.scviewer.database,
|
Require-Bundle: org.junit,
|
||||||
|
com.minres.scviewer.database,
|
||||||
com.minres.scviewer.database.sqlite;bundle-version="1.0.0",
|
com.minres.scviewer.database.sqlite;bundle-version="1.0.0",
|
||||||
com.minres.scviewer.database.text;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",
|
com.minres.scviewer.database.vcd;bundle-version="1.0.0"
|
||||||
org.junit
|
|
||||||
Bundle-ActivationPolicy: lazy
|
Bundle-ActivationPolicy: lazy
|
||||||
Service-Component: OSGI-INF/component.xml
|
Service-Component: OSGI-INF/component.xml
|
||||||
Automatic-Module-Name: com.minres.scviewer.database.test
|
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<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.TestWaveformDbFactory"/>
|
<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"/>
|
<reference bind="setFactory" cardinality="1..1" interface="com.minres.scviewer.database.IWaveformDbFactory" name="IWaveformDbFactory" policy="static" unbind="unsetFactory"/>
|
||||||
</scr:component>
|
</scr:component>
|
@ -235,4 +235,20 @@ tx_end 45 5 3380 ns
|
|||||||
a 37
|
a 37
|
||||||
tx_begin 51 5 3380 ns
|
tx_begin 51 5 3380 ns
|
||||||
a 58
|
a 58
|
||||||
tx_record_attribute 51 "data_
|
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
|
@ -2,12 +2,11 @@
|
|||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
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>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>com.minres.scviewer.database.test</artifactId>
|
<artifactId>com.minres.scviewer.database.test</artifactId>
|
||||||
<version>4.0.0-SNAPSHOT</version>
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.minres.scviewer</groupId>
|
<groupId>com.minres.scviewer</groupId>
|
||||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||||
<version>2.19.4</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
<relativePath>../..</relativePath>
|
<relativePath>../com.minres.scviewer.parent</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<packaging>eclipse-test-plugin</packaging>
|
<packaging>eclipse-test-plugin</packaging>
|
||||||
<build>
|
<build>
|
||||||
@ -15,8 +14,18 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.eclipse.tycho</groupId>
|
<groupId>org.eclipse.tycho</groupId>
|
||||||
<artifactId>tycho-surefire-plugin</artifactId>
|
<artifactId>tycho-surefire-plugin</artifactId>
|
||||||
<version>${tycho-version}</version>
|
<configuration>
|
||||||
|
<!-- <bundleStartLevel /> -->
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<type>p2-installable-unit</type>
|
||||||
|
<artifactId>org.eclipse.equinox.ds</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
<groupId>com.minres.scviewer</groupId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</project>
|
</project>
|
@ -0,0 +1,90 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
7
com.minres.scviewer.database.text/.classpath
Normal file
7
com.minres.scviewer.database.text/.classpath
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?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>
|
@ -33,6 +33,7 @@
|
|||||||
</buildSpec>
|
</buildSpec>
|
||||||
<natures>
|
<natures>
|
||||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||||
|
<nature>org.eclipse.jdt.groovy.core.groovyNature</nature>
|
||||||
<nature>org.eclipse.pde.PluginNature</nature>
|
<nature>org.eclipse.pde.PluginNature</nature>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
</natures>
|
</natures>
|
@ -0,0 +1,8 @@
|
|||||||
|
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 +1,2 @@
|
|||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
encoding/<project>=UTF-8
|
groovy.compiler.level=23
|
17
com.minres.scviewer.database.text/META-INF/MANIFEST.MF
Normal file
17
com.minres.scviewer.database.text/META-INF/MANIFEST.MF
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
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 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="TextDbLoaderFactory">
|
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="TextDbLoader">
|
||||||
<implementation class="com.minres.scviewer.database.text.TextDbLoaderFactory"/>
|
<implementation class="com.minres.scviewer.database.text.TextDbLoader"/>
|
||||||
<service>
|
<service>
|
||||||
<provide interface="com.minres.scviewer.database.IWaveformDbLoaderFactory"/>
|
<provide interface="com.minres.scviewer.database.IWaveformDbLoader"/>
|
||||||
</service>
|
</service>
|
||||||
</scr:component>
|
</scr:component>
|
@ -1,5 +1,5 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
# Copyright (c) 2014, 2015-2021 MINRES Technologies GmbH and others.
|
# Copyright (c) 2014, 2015 MINRES Technologies GmbH and others.
|
||||||
# All rights reserved. This program and the accompanying materials
|
# All rights reserved. This program and the accompanying materials
|
||||||
# are made available under the terms of the Eclipse Public License v1.0
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
# which accompanies this distribution, and is available at
|
# which accompanies this distribution, and is available at
|
||||||
@ -11,4 +11,5 @@
|
|||||||
bin.includes = META-INF/,\
|
bin.includes = META-INF/,\
|
||||||
.,\
|
.,\
|
||||||
OSGI-INF/
|
OSGI-INF/
|
||||||
|
bin.excludes = **/*.groovy
|
||||||
source.. = src/
|
source.. = src/
|
43
com.minres.scviewer.database.text/pom.xml
Normal file
43
com.minres.scviewer.database.text/pom.xml
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<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>
|
@ -0,0 +1,171 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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]";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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};
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,117 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
7
com.minres.scviewer.database.ui.swt/.classpath
Normal file
7
com.minres.scviewer.database.ui.swt/.classpath
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?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>
|
@ -0,0 +1,7 @@
|
|||||||
|
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
|
19
com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF
Normal file
19
com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
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,5 +1,5 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
# Copyright (c) 2014, 2015-2021 MINRES Technologies GmbH and others.
|
# Copyright (c) 2014, 2015 MINRES Technologies GmbH and others.
|
||||||
# All rights reserved. This program and the accompanying materials
|
# All rights reserved. This program and the accompanying materials
|
||||||
# are made available under the terms of the Eclipse Public License v1.0
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
# which accompanies this distribution, and is available at
|
# which accompanies this distribution, and is available at
|
@ -5,8 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.minres.scviewer</groupId>
|
<groupId>com.minres.scviewer</groupId>
|
||||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||||
<version>2.19.4</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
<relativePath>../..</relativePath>
|
<relativePath>../com.minres.scviewer.parent</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<version>4.0.0-SNAPSHOT</version>
|
</project>
|
||||||
</project>
|
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -8,24 +8,20 @@
|
|||||||
* Contributors:
|
* Contributors:
|
||||||
* MINRES Technologies GmbH - initial API and implementation
|
* MINRES Technologies GmbH - initial API and implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ui.swt;
|
package com.minres.scviewer.database.swt;
|
||||||
|
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Plugin;
|
import org.eclipse.core.runtime.Plugin;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
import org.eclipse.wb.swt.SWTResourceManager;
|
|
||||||
import org.osgi.framework.BundleContext;
|
import org.osgi.framework.BundleContext;
|
||||||
|
|
||||||
public class DatabaseUiPlugin extends Plugin {
|
public class DatabaseUiPlugin extends Plugin {
|
||||||
|
|
||||||
@Override
|
|
||||||
public void start(BundleContext context) throws Exception {
|
public void start(BundleContext context) throws Exception {
|
||||||
getLog().log(new Status(IStatus.OK, "org.eclipse.e4.core", "Starting org.eclipse.e4.core bundle..."));
|
getLog().log(new Status(IStatus.OK, "org.eclipse.e4.core", "Starting org.eclipse.e4.core bundle..."));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stop(BundleContext context) throws Exception {
|
public void stop(BundleContext context) throws Exception {
|
||||||
SWTResourceManager.dispose();
|
|
||||||
getLog().log(new Status(IStatus.OK, "org.eclipse.e4.core", "Stopping org.eclipse.e4.core bundle..."));
|
getLog().log(new Status(IStatus.OK, "org.eclipse.e4.core", "Stopping org.eclipse.e4.core bundle..."));
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -8,33 +8,19 @@
|
|||||||
* Contributors:
|
* Contributors:
|
||||||
* MINRES Technologies GmbH - initial API and implementation
|
* MINRES Technologies GmbH - initial API and implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.tx;
|
package com.minres.scviewer.database.swt;
|
||||||
|
|
||||||
import com.minres.scviewer.database.RelationType;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
|
||||||
/**
|
import com.minres.scviewer.database.swt.internal.WaveformViewer;
|
||||||
* The Interface ITxRelation.
|
import com.minres.scviewer.database.ui.IWaveformViewer;
|
||||||
*/
|
import com.minres.scviewer.database.ui.IWaveformViewerFactory;
|
||||||
public interface ITxRelation {
|
|
||||||
|
|
||||||
/**
|
public class WaveformViewerFactory implements IWaveformViewerFactory {
|
||||||
* Gets the relation type.
|
|
||||||
*
|
|
||||||
* @return the relation type
|
|
||||||
*/
|
|
||||||
RelationType getRelationType();
|
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Gets the source.
|
public IWaveformViewer createPanel(Composite parent) {
|
||||||
*
|
return new WaveformViewer(parent);
|
||||||
* @return the source
|
}
|
||||||
*/
|
|
||||||
ITx getSource();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the target.
|
|
||||||
*
|
|
||||||
* @return the target
|
|
||||||
*/
|
|
||||||
ITx getTarget();
|
|
||||||
}
|
}
|
@ -0,0 +1,178 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -8,9 +8,10 @@
|
|||||||
* Contributors:
|
* Contributors:
|
||||||
* MINRES Technologies GmbH - initial API and implementation
|
* MINRES Technologies GmbH - initial API and implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ui.swt.internal;
|
package com.minres.scviewer.database.swt.internal;
|
||||||
|
|
||||||
import org.eclipse.swt.graphics.Color;
|
import org.eclipse.swt.graphics.Color;
|
||||||
|
import org.eclipse.swt.graphics.GC;
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
import org.eclipse.swt.graphics.Rectangle;
|
||||||
|
|
||||||
import com.minres.scviewer.database.ui.ICursor;
|
import com.minres.scviewer.database.ui.ICursor;
|
||||||
@ -29,11 +30,6 @@ public class CursorPainter implements IPainter, ICursor {
|
|||||||
|
|
||||||
public final int id;
|
public final int id;
|
||||||
|
|
||||||
/// maximum visible canvas position in canvas coordinates
|
|
||||||
int maxPosX;
|
|
||||||
/// maximum visible position in waveform coordinates
|
|
||||||
int maxValX;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param i
|
* @param i
|
||||||
* @param txDisplay
|
* @param txDisplay
|
||||||
@ -60,31 +56,23 @@ public class CursorPainter implements IPainter, ICursor {
|
|||||||
this.isDragging = isDragging;
|
this.isDragging = isDragging;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void paintArea(GC gc, Rectangle area) {
|
||||||
public void paintArea(Projection proj, Rectangle clientRect) {
|
if(this.waveCanvas.painterList.size()>0){
|
||||||
Rectangle area = proj.unProject(clientRect);
|
long scaleFactor=waveCanvas.getScaleFactor();
|
||||||
if(!waveCanvas.painterList.isEmpty()){
|
|
||||||
|
|
||||||
long scaleFactor=waveCanvas.getScale();
|
|
||||||
long beginPos = area.x;
|
|
||||||
|
|
||||||
maxPosX = area.x + area.width;
|
|
||||||
maxValX = maxPosX;
|
|
||||||
|
|
||||||
// x position of marker in pixels on canvas
|
|
||||||
int x = (int) (time/scaleFactor);
|
int x = (int) (time/scaleFactor);
|
||||||
// distance of marker from the top of Canvas' painting area
|
|
||||||
int top = id<0?area.y:area.y+15;
|
int top = id<0?area.y:area.y+15;
|
||||||
Color drawColor=waveCanvas.styleProvider.getColor(id<0?WaveformColors.CURSOR:WaveformColors.MARKER);
|
Color drawColor=waveCanvas.colors[id<0?WaveformColors.CURSOR.ordinal():WaveformColors.MARKER.ordinal()];
|
||||||
Color dragColor = waveCanvas.styleProvider.getColor(WaveformColors.CURSOR_DRAG);
|
Color dragColor = waveCanvas.colors[WaveformColors.CURSOR_DRAG.ordinal()];
|
||||||
Color textColor=waveCanvas.styleProvider.getColor(id<0?WaveformColors.CURSOR_TEXT:WaveformColors.MARKER_TEXT);
|
Color textColor=waveCanvas.colors[id<0?WaveformColors.CURSOR_TEXT.ordinal():WaveformColors.MARKER_TEXT.ordinal()];
|
||||||
if(x>=beginPos && x<=maxValX){
|
if(x>=area.x && x<=(area.x+area.width)){
|
||||||
proj.setForeground(isDragging?dragColor:drawColor);
|
gc.setForeground(isDragging?dragColor:drawColor);
|
||||||
proj.drawLine(x, top, x, area.y+area.height);
|
gc.drawLine(x, top, x, area.y+area.height);
|
||||||
proj.setBackground(drawColor);
|
gc.setBackground(drawColor);
|
||||||
proj.setForeground(textColor);
|
gc.setForeground(textColor);
|
||||||
proj.drawText(waveCanvas.timeToString(time), x+1, top);
|
Double dTime=new Double(time);
|
||||||
|
gc.drawText((dTime/waveCanvas.getScaleFactorPow10())+waveCanvas.getUnitStr(), x+1, top);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -8,12 +8,13 @@
|
|||||||
* Contributors:
|
* Contributors:
|
||||||
* MINRES Technologies GmbH - initial API and implementation
|
* MINRES Technologies GmbH - initial API and implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ui.swt.internal;
|
package com.minres.scviewer.database.swt.internal;
|
||||||
|
|
||||||
|
import org.eclipse.swt.graphics.GC;
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
import org.eclipse.swt.graphics.Rectangle;
|
||||||
|
|
||||||
public interface IPainter {
|
public interface IPainter {
|
||||||
|
|
||||||
void paintArea(Projection gc, Rectangle area);
|
void paintArea(GC gc,Rectangle area);
|
||||||
|
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -8,7 +8,7 @@
|
|||||||
* Contributors:
|
* Contributors:
|
||||||
* MINRES Technologies GmbH - initial API and implementation
|
* MINRES Technologies GmbH - initial API and implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ui.swt.internal;
|
package com.minres.scviewer.database.swt.internal;
|
||||||
|
|
||||||
import com.minres.scviewer.database.ui.TrackEntry;
|
import com.minres.scviewer.database.ui.TrackEntry;
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -8,7 +8,7 @@
|
|||||||
* Contributors:
|
* Contributors:
|
||||||
* MINRES Technologies GmbH - initial API and implementation
|
* MINRES Technologies GmbH - initial API and implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ui.swt.internal;
|
package com.minres.scviewer.database.swt.internal;
|
||||||
|
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
@ -27,7 +27,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
public static final String CONTENT_PROPERTY = "content";
|
public static final String CONTENT_PROPERTY = "content";
|
||||||
|
|
||||||
public ObservableList() {
|
public ObservableList() {
|
||||||
this(new ArrayList<>());
|
this(new ArrayList<E>());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ObservableList(List<E> delegate) {
|
public ObservableList(List<E> delegate) {
|
||||||
@ -100,7 +100,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
|
|
||||||
boolean success = this.delegate.addAll(c);
|
boolean success = this.delegate.addAll(c);
|
||||||
if ((success) && (c != null)) {
|
if ((success) && (c != null)) {
|
||||||
List<E> values = new ArrayList<>();
|
List<E> values = new ArrayList<E>();
|
||||||
for (Iterator<? extends E> i = c.iterator(); i.hasNext();) {
|
for (Iterator<? extends E> i = c.iterator(); i.hasNext();) {
|
||||||
values.add(i.next());
|
values.add(i.next());
|
||||||
}
|
}
|
||||||
@ -115,10 +115,10 @@ public class ObservableList<E> implements List<E> {
|
|||||||
|
|
||||||
public boolean addAll(int index, Collection<? extends E> c) {
|
public boolean addAll(int index, Collection<? extends E> c) {
|
||||||
int oldSize = size();
|
int oldSize = size();
|
||||||
boolean success = this.delegate.addAll(index<0?0:index, c);
|
boolean success = this.delegate.addAll(index, c);
|
||||||
|
|
||||||
if ((success) && (c != null)) {
|
if ((success) && (c != null)) {
|
||||||
List<E> values = new ArrayList<>();
|
List<E> values = new ArrayList<E>();
|
||||||
for (Iterator<? extends E> i = c.iterator(); i.hasNext();) {
|
for (Iterator<? extends E> i = c.iterator(); i.hasNext();) {
|
||||||
values.add(i.next());
|
values.add(i.next());
|
||||||
}
|
}
|
||||||
@ -133,7 +133,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
|
|
||||||
public void clear() {
|
public void clear() {
|
||||||
int oldSize = size();
|
int oldSize = size();
|
||||||
List<E> values = new ArrayList<>();
|
List<E> values = new ArrayList<E>();
|
||||||
values.addAll(this.delegate);
|
values.addAll(this.delegate);
|
||||||
this.delegate.clear();
|
this.delegate.clear();
|
||||||
if (!(values.isEmpty())) {
|
if (!(values.isEmpty())) {
|
||||||
@ -215,7 +215,8 @@ public class ObservableList<E> implements List<E> {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<E> values = new ArrayList<>();
|
List<E> values = new ArrayList<E>();
|
||||||
|
if (c != null) {
|
||||||
for (Iterator<?> i = c.iterator(); i.hasNext();) {
|
for (Iterator<?> i = c.iterator(); i.hasNext();) {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
E element = (E) i.next();
|
E element = (E) i.next();
|
||||||
@ -223,6 +224,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
values.add(element);
|
values.add(element);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int oldSize = size();
|
int oldSize = size();
|
||||||
boolean success = this.delegate.removeAll(c);
|
boolean success = this.delegate.removeAll(c);
|
||||||
@ -239,14 +241,16 @@ public class ObservableList<E> implements List<E> {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<E> values = new ArrayList<>();
|
List<E> values = new ArrayList<E>();
|
||||||
Iterator<? extends E> i;
|
Iterator<? extends E> i;
|
||||||
|
if (c != null) {
|
||||||
for (i = this.delegate.iterator(); i.hasNext();) {
|
for (i = this.delegate.iterator(); i.hasNext();) {
|
||||||
E element = i.next();
|
E element = i.next();
|
||||||
if (!(c.contains(element))) {
|
if (!(c.contains(element))) {
|
||||||
values.add(element);
|
values.add(element);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int oldSize = size();
|
int oldSize = size();
|
||||||
boolean success = this.delegate.retainAll(c);
|
boolean success = this.delegate.retainAll(c);
|
||||||
@ -323,7 +327,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 7819626246672640599L;
|
private static final long serialVersionUID = 7819626246672640599L;
|
||||||
|
|
||||||
private List<Object> values = new ArrayList<>();
|
private List<Object> values = new ArrayList<Object>();
|
||||||
|
|
||||||
public MultiElementUpdatedEvent(Object source, List<?> values) {
|
public MultiElementUpdatedEvent(Object source, List<?> values) {
|
||||||
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0,
|
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0,
|
||||||
@ -332,7 +336,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
this.values.addAll(values);
|
this.values.addAll(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Object> getValues() {
|
public List<?> getValues() {
|
||||||
return Collections.unmodifiableList(this.values);
|
return Collections.unmodifiableList(this.values);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -343,7 +347,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 7819626246672640599L;
|
private static final long serialVersionUID = 7819626246672640599L;
|
||||||
|
|
||||||
private List<Object> values = new ArrayList<>();
|
private List<Object> values = new ArrayList<Object>();
|
||||||
|
|
||||||
public MultiElementRemovedEvent(Object source, List<?> values) {
|
public MultiElementRemovedEvent(Object source, List<?> values) {
|
||||||
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0,
|
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0,
|
||||||
@ -352,7 +356,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
this.values.addAll(values);
|
this.values.addAll(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Object> getValues() {
|
public List<?> getValues() {
|
||||||
return Collections.unmodifiableList(this.values);
|
return Collections.unmodifiableList(this.values);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -362,7 +366,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = -116376519087713082L;
|
private static final long serialVersionUID = -116376519087713082L;
|
||||||
private List<Object> values = new ArrayList<>();
|
private List<Object> values = new ArrayList<Object>();
|
||||||
|
|
||||||
public MultiElementAddedEvent(Object source, int index, List<?> values) {
|
public MultiElementAddedEvent(Object source, int index, List<?> values) {
|
||||||
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, index,
|
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, index,
|
||||||
@ -371,7 +375,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
this.values.addAll(values);
|
this.values.addAll(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Object> getValues() {
|
public List<?> getValues() {
|
||||||
return Collections.unmodifiableList(this.values);
|
return Collections.unmodifiableList(this.values);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -381,7 +385,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = -8654027608903811577L;
|
private static final long serialVersionUID = -8654027608903811577L;
|
||||||
private List<Object> values = new ArrayList<>();
|
private List<Object> values = new ArrayList<Object>();
|
||||||
|
|
||||||
public ElementClearedEvent(Object source, List<?> values) {
|
public ElementClearedEvent(Object source, List<?> values) {
|
||||||
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0,
|
super(source, ObservableList.ChangeType.oldValue, ObservableList.ChangeType.newValue, 0,
|
||||||
@ -390,7 +394,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
this.values.addAll(values);
|
this.values.addAll(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Object> getValues() {
|
public List<?> getValues() {
|
||||||
return Collections.unmodifiableList(this.values);
|
return Collections.unmodifiableList(this.values);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -428,7 +432,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract static class ElementEvent extends PropertyChangeEvent {
|
public static abstract class ElementEvent extends PropertyChangeEvent {
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@ -437,7 +441,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
private final int index;
|
private final int index;
|
||||||
|
|
||||||
public ElementEvent(Object source, Object oldValue, Object newValue, int index, ObservableList.ChangeType type) {
|
public ElementEvent(Object source, Object oldValue, Object newValue, int index, ObservableList.ChangeType type) {
|
||||||
super(source, CONTENT_PROPERTY, oldValue, newValue);
|
super(source, "content", oldValue, newValue);
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.index = index;
|
this.index = index;
|
||||||
}
|
}
|
||||||
@ -459,7 +463,7 @@ public class ObservableList<E> implements List<E> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ChangeType {
|
public static enum ChangeType {
|
||||||
ADDED, UPDATED, REMOVED, CLEARED, MULTI_ADD, MULTI_UPDATED, MULTI_REMOVE, NONE;
|
ADDED, UPDATED, REMOVED, CLEARED, MULTI_ADD, MULTI_UPDATED, MULTI_REMOVE, NONE;
|
||||||
|
|
||||||
public static final Object oldValue;
|
public static final Object oldValue;
|
||||||
@ -479,9 +483,9 @@ public class ObservableList<E> implements List<E> {
|
|||||||
return MULTI_REMOVE;
|
return MULTI_REMOVE;
|
||||||
case 6:
|
case 6:
|
||||||
return NONE;
|
return NONE;
|
||||||
default:
|
case 1:
|
||||||
return UPDATED;
|
|
||||||
}
|
}
|
||||||
|
return UPDATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@ -550,7 +554,6 @@ public class ObservableList<E> implements List<E> {
|
|||||||
return this.iterDelegate.next();
|
return this.iterDelegate.next();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void remove() {
|
public void remove() {
|
||||||
int oldSize = ObservableList.this.size();
|
int oldSize = ObservableList.this.size();
|
||||||
Object element = ObservableList.this.get(this.cursor);
|
Object element = ObservableList.this.get(this.cursor);
|
@ -0,0 +1,78 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,145 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,159 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -8,12 +8,13 @@
|
|||||||
* Contributors:
|
* Contributors:
|
||||||
* MINRES Technologies GmbH - initial API and implementation
|
* MINRES Technologies GmbH - initial API and implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ui.swt.internal;
|
package com.minres.scviewer.database.swt.internal;
|
||||||
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.GC;
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
import org.eclipse.swt.graphics.Rectangle;
|
||||||
|
|
||||||
import com.minres.scviewer.database.ui.WaveformColors;
|
import com.minres.scviewer.database.ui.WaveformColors;
|
||||||
@ -25,7 +26,7 @@ public class TrackAreaPainter implements IPainter {
|
|||||||
*/
|
*/
|
||||||
private final WaveformCanvas waveCanvas;
|
private final WaveformCanvas waveCanvas;
|
||||||
|
|
||||||
final TreeMap<Integer, IWaveformPainter> trackVerticalOffset;
|
TreeMap<Integer, IWaveformPainter> trackVerticalOffset;
|
||||||
/**
|
/**
|
||||||
* @param txDisplay
|
* @param txDisplay
|
||||||
*/
|
*/
|
||||||
@ -34,32 +35,35 @@ public class TrackAreaPainter implements IPainter {
|
|||||||
this.trackVerticalOffset= new TreeMap<>();
|
this.trackVerticalOffset= new TreeMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void paintArea(Projection proj, Rectangle a) {
|
public void paintArea(GC gc, Rectangle a) {
|
||||||
Rectangle area = proj.unProject(new Rectangle(a.x, a.y+waveCanvas.rulerHeight, a.width, a.height-waveCanvas.rulerHeight));
|
Rectangle area = new Rectangle(a.x, a.y+waveCanvas.rulerHeight, a.width, a.height-waveCanvas.rulerHeight);
|
||||||
proj.setBackground(this.waveCanvas.styleProvider.getColor(WaveformColors.TRACK_BG_EVEN));
|
gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_EVEN.ordinal()]);
|
||||||
proj.setFillRule(SWT.FILL_EVEN_ODD);
|
gc.setFillRule(SWT.FILL_EVEN_ODD);
|
||||||
proj.fillRectangle(area);
|
gc.fillRectangle(area);
|
||||||
if(trackVerticalOffset.size()>0){
|
if(trackVerticalOffset.size()>0){
|
||||||
Integer firstKey=trackVerticalOffset.floorKey(area.y);
|
Integer firstKey=trackVerticalOffset.floorKey(area.y);
|
||||||
if(firstKey==null) firstKey=trackVerticalOffset.firstKey();
|
if(firstKey==null) firstKey=trackVerticalOffset.firstKey();
|
||||||
Integer lastKey = trackVerticalOffset.floorKey(area.y+area.height);
|
Integer lastKey = trackVerticalOffset.floorKey(area.y+area.height);
|
||||||
//if(lastKey==null) lastKey= trackVerticalOffset.lastKey();
|
|
||||||
Rectangle subArea = new Rectangle(area.x, 0, area.width, 0);
|
Rectangle subArea = new Rectangle(area.x, 0, area.width, 0);
|
||||||
if(lastKey.equals(firstKey)){
|
if(lastKey==firstKey){
|
||||||
subArea.y=firstKey;
|
subArea.y=firstKey;
|
||||||
IWaveformPainter p = trackVerticalOffset.get(firstKey);
|
IWaveformPainter p = trackVerticalOffset.get(firstKey);
|
||||||
subArea.height=p.getHeight();
|
subArea.height=p.getHeight();
|
||||||
p.paintArea(proj, subArea);
|
p.paintArea(gc, subArea);
|
||||||
}else{
|
}else{
|
||||||
for(Entry<Integer, IWaveformPainter> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()){
|
for(Entry<Integer, IWaveformPainter> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()){
|
||||||
subArea.y=entry.getKey();
|
subArea.y=entry.getKey();
|
||||||
subArea.height=entry.getValue().getHeight();
|
subArea.height=entry.getValue().getHeight();
|
||||||
entry.getValue().paintArea(proj, subArea);
|
entry.getValue().paintArea(gc, subArea);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TreeMap<Integer, IWaveformPainter> getTrackVerticalOffset() {
|
||||||
|
return trackVerticalOffset;
|
||||||
|
}
|
||||||
|
|
||||||
public void addTrackPainter(IWaveformPainter trackPainter){
|
public void addTrackPainter(IWaveformPainter trackPainter){
|
||||||
trackVerticalOffset.put(trackPainter.getVerticalOffset()+waveCanvas.rulerHeight, trackPainter);
|
trackVerticalOffset.put(trackPainter.getVerticalOffset()+waveCanvas.rulerHeight, trackPainter);
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@ -8,7 +8,7 @@
|
|||||||
* Contributors:
|
* Contributors:
|
||||||
* MINRES Technologies GmbH - initial API and implementation
|
* MINRES Technologies GmbH - initial API and implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ui.swt.internal;
|
package com.minres.scviewer.database.swt.internal;
|
||||||
|
|
||||||
import com.minres.scviewer.database.ui.TrackEntry;
|
import com.minres.scviewer.database.ui.TrackEntry;
|
||||||
|
|
@ -0,0 +1,513 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* 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) {
|
||||||
|
long oldScaleFactor=scaleFactor;
|
||||||
|
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);
|
||||||
|
/*
|
||||||
|
* xc = tc/oldScaleFactor
|
||||||
|
* xoffs = xc+origin.x
|
||||||
|
* xcn = tc/newScaleFactor
|
||||||
|
* t0n = (xcn-xoffs)*scaleFactor
|
||||||
|
*/
|
||||||
|
long tc=cursorPainters.get(0).getTime(); // cursor time
|
||||||
|
long xc=tc/oldScaleFactor; // cursor total x-offset
|
||||||
|
long xoffs=xc+origin.x; // cursor offset relative to left border
|
||||||
|
long xcn=tc/scaleFactor; // new total x-offset
|
||||||
|
long originX=xcn-xoffs;
|
||||||
|
if(originX>0)
|
||||||
|
origin.x=(int) -originX; // new cursor time offset relative to left border
|
||||||
|
else
|
||||||
|
origin.x=0;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
@ -1,10 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<classpath>
|
<classpath>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
||||||
<attributes>
|
|
||||||
<attribute name="module" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<projectDescription>
|
<projectDescription>
|
||||||
<name>com.minres.scviewer.e4.application.help</name>
|
<name>com.minres.scviewer.database.ui</name>
|
||||||
<comment></comment>
|
<comment></comment>
|
||||||
<projects>
|
<projects>
|
||||||
</projects>
|
</projects>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user