Compare commits

...

22 Commits
2.6.0 ... 2.7.0

Author SHA1 Message Date
3de6c9900c Merge branch 'release/2.7.0' 2020-07-15 22:08:05 +02:00
ef1f2a758a fix wrongly shown signals and streams in table 2020-07-15 21:58:49 +02:00
3e6d5bd33e update version numbers 2020-07-15 21:48:41 +02:00
26968b8521 add multi-selection in waveform viewer 2020-07-15 21:43:07 +02:00
611cfc7b46 change package structure 2020-07-15 21:42:10 +02:00
8cb77a555b refactor plugin structures 2020-07-15 21:39:30 +02:00
b4a7f032f5 update versions 2020-07-11 21:05:04 +02:00
62e0ec2008 Merge branch 'release/v2.6.2' 2020-07-11 19:57:17 +02:00
f6cc12e8c3 fix analog painting calculation issue 2020-07-11 19:36:45 +02:00
b38b268fcb refactor class names 2020-07-11 19:36:28 +02:00
55a14edc9d improve preferences handling and textual representation 2020-06-21 17:06:18 +02:00
45c23564b5 Merge branch 'release/2.6.1' 2020-06-21 16:04:29 +02:00
b170fb3c2a Merge branch 'release/2.6.1' into develop 2020-06-21 16:04:29 +02:00
ab975eadd1 udate version numbers 2020-06-21 16:04:22 +02:00
7ad70411f3 fix preference handling 2020-06-21 15:37:38 +02:00
24720340be update feature definition 2020-06-21 12:23:34 +02:00
ad51066f1c add tycho settings 2020-06-21 09:25:24 +02:00
95e2db60b6 cleanup build and imports 2020-06-20 18:04:57 +02:00
db1d377da6 fix redraw issues 2020-06-20 17:58:26 +02:00
230e8dcc7a update status bar handling 2020-06-14 21:59:42 +02:00
ab2146102f fix startup 2020-06-14 15:27:27 +02:00
b1148922d8 implement feature-based product definition 2020-06-11 14:34:14 +02:00
77 changed files with 1247 additions and 1026 deletions

View File

@ -1,16 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>scviewer.parent</name>
<name>com.minres.scviewer.parent</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
<filteredResources>
<filter>
<id>1591076960924</id>
<id>0</id>
<name></name>
<type>10</type>
<matcher>
@ -19,7 +25,7 @@
</matcher>
</filter>
<filter>
<id>1591076960932</id>
<id>0</id>
<name></name>
<type>10</type>
<matcher>
@ -28,7 +34,7 @@
</matcher>
</filter>
<filter>
<id>1591076960936</id>
<id>0</id>
<name></name>
<type>10</type>
<matcher>
@ -37,7 +43,7 @@
</matcher>
</filter>
<filter>
<id>1591076960939</id>
<id>0</id>
<name></name>
<type>10</type>
<matcher>
@ -46,7 +52,7 @@
</matcher>
</filter>
<filter>
<id>1591076960950</id>
<id>0</id>
<name></name>
<type>10</type>
<matcher>
@ -55,7 +61,7 @@
</matcher>
</filter>
<filter>
<id>1591076960954</id>
<id>0</id>
<name></name>
<type>10</type>
<matcher>

View File

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View File

@ -1,104 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
<booleanAttribute key="append.args" value="true"/>
<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
<booleanAttribute key="askclear" value="false"/>
<booleanAttribute key="automaticAdd" value="true"/>
<booleanAttribute key="automaticValidate" value="false"/>
<stringAttribute key="bootstrap" value=""/>
<stringAttribute key="checked" value="[NONE]"/>
<booleanAttribute key="clearConfig" value="true"/>
<booleanAttribute key="clearws" value="true"/>
<booleanAttribute key="clearwslog" value="false"/>
<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
<booleanAttribute key="default" value="true"/>
<setAttribute key="deselected_workspace_bundles">
<setEntry value="com.minres.scviewer.e4.application"/>
<setEntry value="com.minres.scviewer.ui"/>
</setAttribute>
<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"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=com.minres.scviewer.database.test"/>
<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.8"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
<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"/>
<stringAttribute key="pde.version" value="3.3"/>
<stringAttribute key="product" value="com.minres.scviewer.e4.product"/>
<booleanAttribute key="run_in_ui_thread" value="true"/>
<setAttribute key="selected_target_bundles">
<setEntry value="com.google.guava@default:default"/>
<setEntry value="javax.annotation@default:default"/>
<setEntry value="javax.inject@default:default"/>
<setEntry value="javax.servlet@default:default"/>
<setEntry value="org.apache.ant@default:default"/>
<setEntry value="org.apache.commons.jxpath@default:default"/>
<setEntry value="org.apache.felix.gogo.command@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>
<setEntry value="org.codehaus.groovy@default:default"/>
<setEntry value="org.eclipse.ant.core@default:default"/>
<setEntry value="org.eclipse.core.commands@default:default"/>
<setEntry value="org.eclipse.core.contenttype@default:default"/>
<setEntry value="org.eclipse.core.expressions@default:default"/>
<setEntry value="org.eclipse.core.filesystem.macosx@default:false"/>
<setEntry value="org.eclipse.core.filesystem@default:default"/>
<setEntry value="org.eclipse.core.jobs@default:default"/>
<setEntry value="org.eclipse.core.resources@default:default"/>
<setEntry value="org.eclipse.core.runtime@default:true"/>
<setEntry value="org.eclipse.core.variables@default:default"/>
<setEntry value="org.eclipse.e4.core.contexts@default:default"/>
<setEntry value="org.eclipse.e4.core.di.annotations@default:default"/>
<setEntry value="org.eclipse.e4.core.di.extensions@default:default"/>
<setEntry value="org.eclipse.e4.core.di@default:default"/>
<setEntry value="org.eclipse.e4.core.services@default:default"/>
<setEntry value="org.eclipse.e4.emf.xpath@default:default"/>
<setEntry value="org.eclipse.e4.ui.di@default:default"/>
<setEntry value="org.eclipse.e4.ui.model.workbench@default:default"/>
<setEntry value="org.eclipse.e4.ui.services@default:default"/>
<setEntry value="org.eclipse.emf.common@default:default"/>
<setEntry value="org.eclipse.emf.ecore@default:default"/>
<setEntry value="org.eclipse.equinox.app@default:default"/>
<setEntry value="org.eclipse.equinox.bidi@default:default"/>
<setEntry value="org.eclipse.equinox.common@2:true"/>
<setEntry value="org.eclipse.equinox.ds@1:true"/>
<setEntry value="org.eclipse.equinox.preferences@default:default"/>
<setEntry value="org.eclipse.equinox.registry@default:default"/>
<setEntry value="org.eclipse.equinox.util@default:default"/>
<setEntry value="org.eclipse.jface@default:default"/>
<setEntry value="org.eclipse.osgi.compatibility.state@default:false"/>
<setEntry value="org.eclipse.osgi.services@default:default"/>
<setEntry value="org.eclipse.osgi@-1:true"/>
<setEntry value="org.eclipse.swt.cocoa.macosx.x86_64@default:false"/>
<setEntry value="org.eclipse.swt@default:default"/>
<setEntry value="org.hamcrest.core@default:default"/>
<setEntry value="org.junit@default:default"/>
</setAttribute>
<setAttribute key="selected_workspace_bundles">
<setEntry value="com.minres.scviewer.database.sqlite@default:true"/>
<setEntry value="com.minres.scviewer.database.test@default:default"/>
<setEntry value="com.minres.scviewer.database.text@default:true"/>
<setEntry value="com.minres.scviewer.database.ui.swt@default:default"/>
<setEntry value="com.minres.scviewer.database.ui@default:default"/>
<setEntry value="com.minres.scviewer.database.vcd@default:default"/>
<setEntry value="com.minres.scviewer.database@default:true"/>
<setEntry value="com.opcoach.e4.preferences@default:default"/>
</setAttribute>
<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>

View File

@ -10,7 +10,7 @@
<relativePath>..</relativePath>
</parent>
<artifactId>com.minres.scviewer.e4.product</artifactId>
<version>2.6.0-SNAPSHOT</version>
<version>2.7.0-SNAPSHOT</version>
<packaging>eclipse-repository</packaging>
<groupId>com.minres.scviewer</groupId>
<build>

View File

@ -1,15 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<?pde version="3.5"?>
<product name="SCViewer" uid="scviewer" id="com.minres.scviewer.e4.application.product" application="org.eclipse.e4.ui.workbench.swt.E4Application" version="2.6.0.qualifier" useFeatures="false" includeLaunchers="true">
<product name="SCViewer" uid="scviewer" id="com.minres.scviewer.e4.application.product" application="org.eclipse.e4.ui.workbench.swt.E4Application" version="2.7.0.qualifier" useFeatures="true" includeLaunchers="true">
<configIni use="default">
</configIni>
<launcherArgs>
<programArgs>-clearPersistedState</programArgs>
<vmArgs>-Xmx2G -Dosgi.instance.area=@user.home/.scviewer -Dosgi.instance.area.default=@user.home/.scviewer</vmArgs>
<vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
<programArgs>-clearPersistedState
</programArgs>
<vmArgs>-Xmx2G -Dosgi.instance.area=@user.home/.scviewer -Dosgi.instance.area.default=@user.home/.scviewer
</vmArgs>
<vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
</vmArgsMac>
</launcherArgs>
<windowImages/>
@ -41,103 +44,21 @@
</license>
<plugins>
<plugin id="com.google.guava"/>
<plugin id="com.ibm.icu"/>
<plugin id="com.minres.scviewer.database"/>
<plugin id="com.minres.scviewer.database.sqlite"/>
<plugin id="com.minres.scviewer.database.text"/>
<plugin id="com.minres.scviewer.database.ui"/>
<plugin id="com.minres.scviewer.database.ui.swt"/>
<plugin id="com.minres.scviewer.database.vcd"/>
<plugin id="com.minres.scviewer.e4.application"/>
<plugin id="com.opcoach.e4.preferences"/>
<plugin id="com.opcoach.e4.preferences.mainmenu"/>
<plugin id="javax.annotation"/>
<plugin id="javax.inject"/>
<plugin id="org.apache.batik.constants"/>
<plugin id="org.apache.batik.css"/>
<plugin id="org.apache.batik.i18n"/>
<plugin id="org.apache.batik.util"/>
<plugin id="org.apache.commons.io"/>
<plugin id="org.apache.commons.jxpath"/>
<plugin id="org.apache.commons.logging"/>
<plugin id="org.apache.felix.scr"/>
<plugin id="org.apache.xmlgraphics"/>
<plugin id="org.codehaus.groovy"/>
<plugin id="org.eclipse.core.commands"/>
<plugin id="org.eclipse.core.contenttype"/>
<plugin id="org.eclipse.core.databinding"/>
<plugin id="org.eclipse.core.databinding.beans"/>
<plugin id="org.eclipse.core.databinding.observable"/>
<plugin id="org.eclipse.core.databinding.property"/>
<plugin id="org.eclipse.core.expressions"/>
<plugin id="org.eclipse.core.filesystem"/>
<plugin id="org.eclipse.core.filesystem.linux.x86_64" fragment="true"/>
<plugin id="org.eclipse.core.filesystem.win32.x86_64" fragment="true"/>
<plugin id="org.eclipse.core.jobs"/>
<plugin id="org.eclipse.core.resources"/>
<plugin id="org.eclipse.core.resources.win32.x86_64" fragment="true"/>
<plugin id="org.eclipse.core.runtime"/>
<plugin id="org.eclipse.e4.core.commands"/>
<plugin id="org.eclipse.e4.core.contexts"/>
<plugin id="org.eclipse.e4.core.di"/>
<plugin id="org.eclipse.e4.core.di.annotations"/>
<plugin id="org.eclipse.e4.core.di.extensions"/>
<plugin id="org.eclipse.e4.core.di.extensions.supplier"/>
<plugin id="org.eclipse.e4.core.services"/>
<plugin id="org.eclipse.e4.emf.xpath"/>
<plugin id="org.eclipse.e4.ui.bindings"/>
<plugin id="org.eclipse.e4.ui.css.core"/>
<plugin id="org.eclipse.e4.ui.css.swt"/>
<plugin id="org.eclipse.e4.ui.css.swt.theme"/>
<plugin id="org.eclipse.e4.ui.di"/>
<plugin id="org.eclipse.e4.ui.dialogs"/>
<plugin id="org.eclipse.e4.ui.model.workbench"/>
<plugin id="org.eclipse.e4.ui.services"/>
<plugin id="org.eclipse.e4.ui.swt.gtk" fragment="true"/>
<plugin id="org.eclipse.e4.ui.widgets"/>
<plugin id="org.eclipse.e4.ui.workbench"/>
<plugin id="org.eclipse.e4.ui.workbench.addons.swt"/>
<plugin id="org.eclipse.e4.ui.workbench.renderers.swt"/>
<plugin id="org.eclipse.e4.ui.workbench.swt"/>
<plugin id="org.eclipse.e4.ui.workbench3"/>
<plugin id="org.eclipse.emf.common"/>
<plugin id="org.eclipse.emf.ecore"/>
<plugin id="org.eclipse.emf.ecore.change"/>
<plugin id="org.eclipse.emf.ecore.xmi"/>
<plugin id="org.eclipse.equinox.app"/>
<plugin id="org.eclipse.equinox.common"/>
<plugin id="org.eclipse.equinox.concurrent"/>
<plugin id="org.eclipse.equinox.event"/>
<plugin id="org.eclipse.equinox.preferences"/>
<plugin id="org.eclipse.equinox.region" fragment="true"/>
<plugin id="org.eclipse.equinox.registry"/>
<plugin id="org.eclipse.equinox.transforms.hook" fragment="true"/>
<plugin id="org.eclipse.equinox.weaving.hook" fragment="true"/>
<plugin id="org.eclipse.help"/>
<plugin id="org.eclipse.jface"/>
<plugin id="org.eclipse.jface.databinding"/>
<plugin id="org.eclipse.osgi"/>
<plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
<plugin id="org.eclipse.osgi.services"/>
<plugin id="org.eclipse.osgi.util"/>
<plugin id="org.eclipse.pde.ds.lib"/>
<plugin id="org.eclipse.swt"/>
<plugin id="org.eclipse.swt.cocoa.macosx.x86_64" fragment="true"/>
<plugin id="org.eclipse.swt.gtk.linux.x86_64" fragment="true"/>
<plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/>
<plugin id="org.eclipse.ui.workbench"/>
<plugin id="org.w3c.css.sac"/>
<plugin id="org.w3c.dom.events"/>
<plugin id="org.w3c.dom.smil"/>
<plugin id="org.w3c.dom.svg"/>
</plugins>
<features>
<feature id="com.minres.scviewer.e4.feature" installMode="root"/>
<feature id="com.minres.scviewer.e4.platform.feature" installMode="root"/>
</features>
<configurations>
<plugin id="com.minres.scviewer.database.text" autoStart="true" startLevel="2" />
<plugin id="com.minres.scviewer.database.vcd" autoStart="true" startLevel="2" />
<plugin id="org.apache.felix.scr" autoStart="true" startLevel="1" />
<plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="0" />
<plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
<plugin id="org.eclipse.equinox.event" autoStart="true" startLevel="2" />
<plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1" />
<plugin id="org.eclipse.osgi" autoStart="true" startLevel="-1" />
</configurations>

View File

@ -8,8 +8,9 @@
<unit id="org.eclipse.equinox.p2.sdk.feature.jar" version="0.0.0"/> <!-- needed by Linux exectable-->
<unit id="org.eclipse.equinox.sdk.feature.group" version="0.0.0"/>
<unit id="org.eclipse.platform.sdk" version="0.0.0"/>
<unit id="org.eclipse.sdk.feature.group" version="0.0.0"/> <!-- org.junit for testing -->
<unit id="org.eclipse.sdk.feature.group" version="0.0.0"/> <!-- org.eclipse.equinox.p2.iu -->
<unit id="org.eclipse.rcptt.core.feature.group" version="0.0.0"/><!-- com.google.guave-->
<unit id="org.eclipse.pde.feature.group" version="0.0.0"/> <!-- org.junit for testing -->
</location>
<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
<repository location="https://www.opcoach.com/repository/2020-03/"/>

View File

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View File

@ -29,26 +29,12 @@ http://www.eclipse.org/legal/epl-v10.html
</url>
<requires>
<import plugin="org.codehaus.groovy" version="2.5.8" match="greaterOrEqual"/>
<import plugin="org.eclipse.osgi.services" version="3.4.0" match="greaterOrEqual"/>
<import plugin="com.google.guava" version="15.0.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.osgi"/>
<import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/>
<import plugin="com.minres.scviewer.database.ui" version="1.0.0" match="greaterOrEqual"/>
<import plugin="com.minres.scviewer.database.ui.swt" version="1.0.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.jface.text"/>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.ui.editors"/>
<import plugin="org.eclipse.ui.ide"/>
<import plugin="org.eclipse.ui.views.properties.tabbed"/>
<import plugin="org.eclipse.swt"/>
<import plugin="org.eclipse.core.expressions" version="3.4.600" match="greaterOrEqual"/>
<import plugin="org.eclipse.jface"/>
<import plugin="org.eclipse.swt" version="3.103.1" match="greaterOrEqual"/>
<import plugin="org.eclipse.equinox.registry"/>
<import plugin="org.codehaus.groovy" version="2.5.8" match="greaterOrEqual"/>
<import plugin="org.hamcrest.core" version="1.3.0" match="greaterOrEqual"/>
</requires>
<plugin
@ -85,4 +71,11 @@ http://www.eclipse.org/legal/epl-v10.html
version="0.0.0"
unpack="false"/>
<plugin
id="com.google.guava"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>

View File

@ -41,7 +41,6 @@
<import plugin="org.eclipse.e4.ui.di" version="1.1.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.e4.core.contexts" version="1.4.0" match="greaterOrEqual"/>
<import plugin="com.minres.scviewer.database.ui.swt" version="1.0.0" match="greaterOrEqual"/>
<import plugin="com.minres.scviewer.database.ui"/>
<import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.osgi.services" version="3.5.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.e4.core.services" version="2.0.0" match="greaterOrEqual"/>
@ -51,17 +50,15 @@
<import plugin="org.eclipse.equinox.preferences"/>
<import plugin="org.eclipse.core.expressions"/>
<import plugin="org.eclipse.e4.core.commands" version="0.11.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.e4.ui.workbench.addons.swt"/>
<import plugin="com.opcoach.e4.preferences"/>
<import plugin="org.eclipse.e4.core.di.extensions"/>
<import plugin="org.eclipse.e4.ui.css.swt.theme" version="0.10.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.core.resources" version="3.13.0" match="greaterOrEqual"/>
<import plugin="com.opcoach.e4.preferences.mainmenu" version="1.2.0" match="greaterOrEqual"/>
<import feature="com.opcoach.e4.preferences.feature" version="1.3.0.202004072127"/>
<import feature="org.eclipse.equinox.executable" version="3.8.700.v20200207-2156"/>
<import feature="org.eclipse.equinox.sdk" version="3.20.100.v20200303-1901"/>
<import feature="org.eclipse.sdk" version="4.15.0.v20200305-0155"/>
<import feature="org.eclipse.rcptt.core" version="2.5.1.M3"/>
<import plugin="org.eclipse.core.commands"/>
</requires>
<plugin
@ -71,4 +68,11 @@
version="0.0.0"
unpack="false"/>
<plugin
id="com.opcoach.e4.preferences"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.minres.scviewer.e4.platform.feature</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.pde.FeatureBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.FeatureNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1 @@
bin.includes = feature.xml

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<feature
id="com.minres.scviewer.e4.platform.feature"
label="SCViewer Platform Feature"
version="1.0.0.qualifier"
provider-name="MINRES Technologies GmbH">
<description url="http://www.example.com/description">
[Enter Feature Description here.]
</description>
<copyright url="http://www.example.com/copyright">
[Enter Copyright Description here.]
</copyright>
<license url="http://www.example.com/license">
[Enter License Description here.]
</license>
<includes
id="org.eclipse.e4.rcp"
version="0.0.0"/>
<includes
id="org.eclipse.emf.ecore"
version="0.0.0"/>
<includes
id="org.eclipse.emf.common"
version="0.0.0"/>
<requires>
<import plugin="org.eclipse.core.expressions" version="3.2.0" match="compatible"/>
<import plugin="org.eclipse.core.filesystem" version="1.3.0" match="compatible"/>
<import plugin="org.eclipse.core.runtime" version="3.12.0" match="compatible"/>
</requires>
<plugin
id="org.eclipse.core.resources"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="org.eclipse.core.filesystem"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="org.eclipse.core.filesystem.linux.x86_64"
os="linux"
arch="x86_64"
download-size="0"
install-size="0"
version="0.0.0"
fragment="true"
unpack="false"/>
<plugin
id="org.eclipse.core.filesystem.win32.x86_64"
os="win32"
arch="x86_64"
download-size="0"
install-size="0"
version="0.0.0"
fragment="true"
unpack="false"/>
</feature>

View File

@ -1,12 +1,12 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>com.minres.scviewer.database.ui</artifactId>
<version>2.0.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
<artifactId>com.minres.scviewer.e4.platform.feature</artifactId>
<packaging>eclipse-feature</packaging>
<parent>
<groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
</project>
<version>1.0.0-SNAPSHOT</version>
</project>

View File

@ -6,9 +6,9 @@
provider-name="%providerName">
<description>
A viewer for SystemC Verification Library transactions and VCD
signals. It supports a SQLite based recording as well as the built-in
text base recording.
A viewer for SystemC Verification Library transactions and VCD
signals. It supports a SQLite based recording as well as the
built-in text base recording.
</description>
<copyright>
@ -37,8 +37,8 @@ http://www.eclipse.org/legal/epl-v10.html
version="0.0.0"/>
<requires>
<import plugin="org.hamcrest.core" version="1.3.0" match="greaterOrEqual"/>
<import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/>
<import plugin="com.minres.scviewer.database.ui" version="1.0.0" match="greaterOrEqual"/>
<import plugin="com.minres.scviewer.database.ui.swt" version="1.0.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.core.resources"/>
@ -52,7 +52,6 @@ http://www.eclipse.org/legal/epl-v10.html
<import plugin="org.eclipse.core.expressions" version="3.4.600" match="greaterOrEqual"/>
<import plugin="org.eclipse.jface"/>
<import plugin="com.google.guava" version="15.0.0" match="greaterOrEqual"/>
<import plugin="org.hamcrest.core" version="1.3.0" match="greaterOrEqual"/>
</requires>
<plugin

View File

@ -17,4 +17,25 @@
[Enter License Description here.]
</license>
<includes
id="com.minres.scviewer.database.feature"
version="0.0.0"/>
<requires>
<import plugin="org.eclipse.swt" version="3.103.1" match="greaterOrEqual"/>
<import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/>
<import plugin="com.google.guava" version="15.0.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.jface"/>
<import plugin="org.eclipse.equinox.registry"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.osgi"/>
</requires>
<plugin
id="com.minres.scviewer.database.ui.swt"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>

View File

@ -3,12 +3,13 @@
<feature url="features/com.minres.scviewer.feature_1.0.0.qualifier.jar" id="com.minres.scviewer.feature" version="1.0.0.qualifier">
<category name="com.minres.scviewer"/>
</feature>
<feature url="features/com.minres.scviewer.feature.source_1.0.0.qualifier.jar" id="com.minres.scviewer.feature.source" version="1.0.0.qualifier">
<category name="com.minres.scviewer"/>
<feature id="com.minres.scviewer.e4.feature">
<category name="com.minres.scviewer.e4"/>
</feature>
<category-def name="com.minres.scviewer" label="SCViewer">
<description>
Viewer for SystemC Verification (SCV) library&apos;s transaction recording
</description>
</category-def>
<category-def name="com.minres.scviewer.e4" label="SCViewer E4 application"/>
</site>

View File

@ -70,7 +70,7 @@ public class TextDbLoader implements IWaveformDbLoader{
try {
def gzipped = isGzipped(file)
if(isTxfile(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file))){
def mapDbFile = File.createTempFile("."+file.name, "tmp", file.parentFile)
def mapDbFile = File.createTempFile("."+file.name, null /*"tmp"*/, null /*file.parentFile*/)
mapDbFile.delete()
mapDbFile.deleteOnExit()
this.mapDb = DBMaker

View File

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: SWT widget
Bundle-SymbolicName: com.minres.scviewer.database.ui.swt
Bundle-Version: 2.2.0.qualifier
Bundle-Version: 2.3.0.qualifier
Bundle-Vendor: MINRES Technologies GmbH
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.eclipse.swt;bundle-version="3.103.1",
@ -10,11 +10,21 @@ Require-Bundle: org.eclipse.swt;bundle-version="3.103.1",
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
Export-Package: com.minres.scviewer.database.ui;
uses:="org.eclipse.swt.events,
org.eclipse.swt.graphics,
org.eclipse.swt.widgets,
com.minres.scviewer.database,
org.eclipse.jface.viewers",
com.minres.scviewer.database.ui.swt;
uses:="org.osgi.framework,
org.eclipse.core.runtime,
com.minres.scviewer.database.ui,
org.eclipse.swt.graphics,
org.eclipse.swt.widgets"
Bundle-ClassPath: .
Bundle-ActivationPolicy: lazy
Bundle-Activator: com.minres.scviewer.database.swt.DatabaseUiPlugin
Bundle-Activator: com.minres.scviewer.database.ui.swt.DatabaseUiPlugin
Automatic-Module-Name: com.minres.scviewer.database.ui.swt

View File

@ -8,5 +8,5 @@
<version>2.0.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<version>2.2.0-SNAPSHOT</version>
<version>2.3.0-SNAPSHOT</version>
</project>

View File

@ -25,7 +25,7 @@ import org.eclipse.swt.widgets.Control;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.RelationType;
public interface IWaveformViewer extends PropertyChangeListener, ISelectionProvider{
public interface IWaveformView extends PropertyChangeListener, ISelectionProvider{
String CURSOR_PROPERTY = "cursor_time";
@ -51,7 +51,9 @@ public interface IWaveformViewer extends PropertyChangeListener, ISelectionProvi
public void setSelection(ISelection selection);
public void setSelection(ISelection selection, boolean addIfNeeded);
public void setSelection(ISelection selection, boolean showIfNeeded);
public void addToSelection(ISelection selection, boolean showIfNeeded);
public void moveSelection(GotoDirection direction);
@ -110,4 +112,6 @@ public interface IWaveformViewer extends PropertyChangeListener, ISelectionProvi
public void scrollHorizontal(int percent);
public void addDisposeListener( DisposeListener listener );
public void deleteSelectedTracks();
}

View File

@ -12,6 +12,6 @@ package com.minres.scviewer.database.ui;
import org.eclipse.swt.widgets.Composite;
public interface IWaveformViewerFactory {
public IWaveformViewer createPanel(Composite parent);
public interface IWaveformViewFactory {
public IWaveformView createPanel(Composite parent);
}

View File

@ -1,4 +1,4 @@
package com.minres.scviewer.database.swt;
package com.minres.scviewer.database.ui.swt;
public class Constants {

View File

@ -8,7 +8,7 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt;
package com.minres.scviewer.database.ui.swt;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;

View File

@ -1,4 +1,4 @@
package com.minres.scviewer.database.swt;
package com.minres.scviewer.database.ui.swt;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;

View File

@ -1,4 +1,4 @@
package com.minres.scviewer.database.swt;
package com.minres.scviewer.database.ui.swt;
import org.eclipse.swt.widgets.Widget;

View File

@ -8,19 +8,19 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt;
package com.minres.scviewer.database.ui.swt;
import org.eclipse.swt.widgets.Composite;
import com.minres.scviewer.database.swt.internal.WaveformViewer;
import com.minres.scviewer.database.ui.IWaveformViewer;
import com.minres.scviewer.database.ui.IWaveformViewerFactory;
import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.IWaveformViewFactory;
import com.minres.scviewer.database.ui.swt.internal.WaveformView;
public class WaveformViewerFactory implements IWaveformViewerFactory {
public class WaveformViewFactory implements IWaveformViewFactory {
@Override
public IWaveformViewer createPanel(Composite parent) {
return new WaveformViewer(parent);
public IWaveformView createPanel(Composite parent) {
return new WaveformView(parent);
}
}

View File

@ -8,7 +8,7 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import java.util.Collection;
import java.util.LinkedList;
@ -16,7 +16,6 @@ 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;
@ -89,9 +88,8 @@ public class ArrowPainter implements IPainter {
deferredUpdate = true;
return;
}
selectionOffset = waveCanvas.getXOffset();
int laneHeight = painter.getHeight() / stream.getMaxConcurrency();
txRectangle = new Rectangle((int) (tx.getBeginTime() / scaleFactor-waveCanvas.getXOffset()),
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);
@ -105,7 +103,7 @@ public class ArrowPainter implements IPainter {
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.getXOffset()),
Rectangle bb = new Rectangle((int) (otherTx.getBeginTime() / scaleFactor),
waveCanvas.rulerHeight + painter.getVerticalOffset()
+ laneHeight * otherTx.getConcurrencyIndex(),
(int) ((otherTx.getEndTime() - otherTx.getBeginTime()) / scaleFactor), laneHeight);
@ -115,7 +113,7 @@ public class ArrowPainter implements IPainter {
}
@Override
public void paintArea(GC gc, Rectangle area) {
public void paintArea(Projection proj, Rectangle clientRect) {
Color fgColor = waveCanvas.colors[WaveformColors.REL_ARROW.ordinal()];
Color highliteColor = waveCanvas.colors[WaveformColors.REL_ARROW_HIGHLITE.ordinal()];
@ -124,33 +122,30 @@ public class ArrowPainter implements IPainter {
calculateGeometries();
}
if(txRectangle == null) return;
int correctionValue = (int)(selectionOffset - waveCanvas.getXOffset());
int correctionValue = (int)(selectionOffset);
Rectangle correctedTargetRectangle = new Rectangle(txRectangle.x+correctionValue, txRectangle.y, txRectangle.width, txRectangle.height);
for (LinkEntry entry : iRect) {
Rectangle correctedRectangle = new Rectangle(entry.rectangle.x+correctionValue, entry.rectangle.y, entry.rectangle.width, entry.rectangle.height);
Point target = drawPath(gc, highlightType.equals(entry.relationType) ? highliteColor : fgColor,
Point target = drawPath(proj, highlightType.equals(entry.relationType) ? highliteColor : fgColor,
correctedRectangle, correctedTargetRectangle);
drawArrow(gc, target);
drawArrow(proj, target);
}
for (LinkEntry entry : oRect) {
Rectangle correctedRectangle = new Rectangle(entry.rectangle.x+correctionValue, entry.rectangle.y, entry.rectangle.width, entry.rectangle.height);
Point target = drawPath(gc, highlightType.equals(entry.relationType) ? highliteColor : fgColor, correctedTargetRectangle,
Point target = drawPath(proj, highlightType.equals(entry.relationType) ? highliteColor : fgColor, correctedTargetRectangle,
correctedRectangle);
drawArrow(gc, target);
drawArrow(proj, 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 void drawArrow(Projection proj, Point target) {
proj.drawLine(target.x - 8, target.y - 5, target.x, target.y);
proj.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;
protected Point drawPath(Projection proj, Color fgColor, Rectangle srcRectangle, Rectangle tgtRectangle) {
Point point1 = proj.project(new Point(srcRectangle.x, srcRectangle.y + srcRectangle.height / 2));
Point point2 = proj.project(new Point(tgtRectangle.x, tgtRectangle.y + tgtRectangle.height / 2));
if (point2.x > point1.x + srcRectangle.width)
point1.x += srcRectangle.width;
@ -165,9 +160,9 @@ public class ArrowPainter implements IPainter {
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);
proj.setAntialias(SWT.ON);
proj.setForeground(fgColor);
proj.getGC().drawPath(path);
path.dispose();
return point2;
}

View File

@ -8,10 +8,9 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import com.minres.scviewer.database.ui.ICursor;
@ -62,30 +61,30 @@ public class CursorPainter implements IPainter, ICursor {
}
public void paintArea(GC gc, Rectangle area) {
public void paintArea(Projection proj, Rectangle clientRect) {
Rectangle area = proj.unProject(clientRect);
if(this.waveCanvas.painterList.size()>0){
long scaleFactor=waveCanvas.getScaleFactor();
long beginPos = area.x;
maxPosX = area.x + area.width;
maxValX = maxPosX + (int)waveCanvas.getXOffset();
maxValX = maxPosX;
// x position of marker in pixels on canvas
int x = (int) (time/scaleFactor);
// distance of marker from the top of Canvas' painting area
int top = id<0?area.y:area.y+15;
Color drawColor=waveCanvas.colors[id<0?WaveformColors.CURSOR.ordinal():WaveformColors.MARKER.ordinal()];
Color dragColor = waveCanvas.colors[WaveformColors.CURSOR_DRAG.ordinal()];
Color textColor=waveCanvas.colors[id<0?WaveformColors.CURSOR_TEXT.ordinal():WaveformColors.MARKER_TEXT.ordinal()];
if(x>=beginPos && x<=maxValX){
gc.setForeground(isDragging?dragColor:drawColor);
gc.drawLine(x-(int)waveCanvas.getXOffset(), top, x-(int)waveCanvas.getXOffset(), area.y+area.height);
gc.setBackground(drawColor);
gc.setForeground(textColor);
proj.setForeground(isDragging?dragColor:drawColor);
proj.drawLine(x, top, x, area.y+area.height);
proj.setBackground(drawColor);
proj.setForeground(textColor);
Double dTime=new Double(time);
gc.drawText((dTime/waveCanvas.getScaleFactorPow10())+waveCanvas.getUnitStr(), x+1-(int)waveCanvas.getXOffset(), top);
proj.drawText((dTime/waveCanvas.getScaleFactorPow10())+waveCanvas.getUnitStr(), x+1, top);
}
}
}

View File

@ -8,13 +8,12 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
public interface IPainter {
void paintArea(GC gc,Rectangle area);
void paintArea(Projection gc, Rectangle area);
}

View File

@ -8,7 +8,7 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import com.minres.scviewer.database.ui.TrackEntry;

View File

@ -8,7 +8,7 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

View File

@ -0,0 +1,122 @@
package com.minres.scviewer.database.ui.swt.internal;
import java.util.Arrays;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
public class Projection {
private Point translation;
private GC gc;
public Projection(GC gc) {
super();
this.gc = gc;
translation=new Point(0, 0);
}
void setTranslation(Point t) {
translation = t;
}
void setGC(GC gc) {
this.gc=gc;
}
Point getTranslation() {
return translation;
}
Point project(Point p) {
return new Point(p.x+translation.x, p.y+translation.y);
}
public Rectangle unProject(Rectangle r) {
return new Rectangle(r.x-translation.x, r.y-translation.y, r.width, r.height);
}
public void setBackground(Color color) {
gc.setBackground(color);
}
public void setFillRule(int rule) {
gc.setFillRule(rule);
}
public void fillRectangle(Rectangle rect) {
gc.fillRectangle(rect.x+translation.x, rect.y+translation.y, rect.width, rect.height);
}
public void setLineStyle(int style) {
gc.setLineStyle(style);
}
public void setLineWidth(int width) {
gc.setLineWidth(width);
}
public void setForeground(Color color) {
gc.setForeground(color);
}
public void drawLine(int x1, int y1, int x2, int y2) {
gc.drawLine(x1+translation.x, y1+translation.y, x2+translation.x, y2+translation.y);
}
public GC getGC() {
return gc;
}
public void drawRectangle(Rectangle rect) {
gc.drawRectangle(rect.x+translation.y, rect.y+translation.y, rect.width, rect.height);
}
public void fillRoundRectangle(int x, int y, int width, int height, int arcWidth, int arcHeight) {
gc.fillRoundRectangle(x+translation.x, y+translation.y, width, height, arcWidth, arcHeight);
}
public void drawRoundRectangle(int x, int y, int width, int height, int arcWidth, int arcHeight) {
gc.drawRoundRectangle(x+translation.x, y+translation.y, width, height, arcWidth, arcHeight);
}
public void setAntialias(int antialias) {
gc.setAntialias(antialias);
}
public void drawText(String string, int x, int y) {
gc.drawText(string, x+translation.x, y+translation.y);
}
private int[] project(int[] points) {
int[] res = Arrays.copyOf(points, points.length);
for(int i=0; i<points.length; i+=2) {
res[i]=points[i]+translation.x;
res[i+1]=points[i+1]+translation.y;
}
return res;
}
public void fillPolygon(int[] points) {
gc.fillPolygon(project(points));
}
public void drawPolygon(int[] points) {
gc.drawPolygon(project(points));
}
public Rectangle getClipping() {
Rectangle c = gc.getClipping();
return new Rectangle(c.x-translation.x, c.y-translation.y, c.width, c.height);
}
public void setClipping(int x, int y, int width, int height) {
gc.setClipping(x+translation.x, y+translation.y, width, height);
}
public void setClipping(Rectangle r) {
gc.setClipping(r.x+translation.x, r.y+translation.y, r.width, r.height);
}
}

View File

@ -1,4 +1,4 @@
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;

View File

@ -8,7 +8,7 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import java.text.DecimalFormat;
@ -31,8 +31,8 @@ public class RulerPainter implements IPainter {
}
@Override
public void paintArea(GC gc, Rectangle area) {
public void paintArea(Projection proj, Rectangle area) {
GC gc = proj.getGC();
Color headerFgColor=waveCanvas.getDisplay().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND);
if(headerFgColor.isDisposed())
headerFgColor=SWTResourceManager.getColor(0,0,0);
@ -44,7 +44,7 @@ public class RulerPainter implements IPainter {
long scaleFactor=waveCanvas.getScaleFactor();
long startPos=area.x*scaleFactor;
long startVal=startPos + waveCanvas.getXOffset()*scaleFactor;
long startVal=startPos - proj.getTranslation().x*scaleFactor;
long endPos=startPos+area.width*scaleFactor;
long rulerTickMinor = rulerTickMinorC*scaleFactor;

View File

@ -8,7 +8,7 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import java.util.Collection;
import java.util.Map.Entry;
@ -79,22 +79,22 @@ public class SignalPainter extends TrackPainter {
}
private int getXPosEnd(long time) {
long ltmp = time / this.waveCanvas.getScaleFactor() - waveCanvas.getXOffset();
long ltmp = time / this.waveCanvas.getScaleFactor();
return ltmp > maxPosX ? maxPosX : (int) ltmp;
}
public void paintArea(GC gc, Rectangle area) {
public void paintArea(Projection proj, Rectangle area) {
ISignal<?> signal = trackEntry.getSignal();
if (trackEntry.selected)
gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]);
proj.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);
proj.setBackground(this.waveCanvas.colors[even ? WaveformColors.TRACK_BG_EVEN.ordinal() : WaveformColors.TRACK_BG_ODD.ordinal()]);
proj.setFillRule(SWT.FILL_EVEN_ODD);
proj.fillRectangle(area);
long scaleFactor = this.waveCanvas.getScaleFactor();
long beginPos = area.x;
long beginTime = (beginPos + waveCanvas.getXOffset())*scaleFactor;
long beginTime = beginPos*scaleFactor;
long endTime = beginTime + area.width*scaleFactor;
Entry<Long, ?> first = signal.getEvents().floorEntry(beginTime);
@ -106,18 +106,17 @@ public class SignalPainter extends TrackPainter {
} else if (last == null) {
last = signal.getEvents().lastEntry();
}
gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
gc.setLineStyle(SWT.LINE_SOLID);
gc.setLineWidth(1);
proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
proj.setLineStyle(SWT.LINE_SOLID);
proj.setLineWidth(1);
NavigableMap<Long, ?> entries = signal.getEvents().subMap(first.getKey(), false, last.getKey(), true);
SignalChange left = new SignalChange(first);
SignalChange right = new SignalChange(entries.size() > 0 ? entries.firstEntry() : first);
maxPosX = area.x + area.width;
maxValX = maxPosX + (int)waveCanvas.getXOffset();
yOffsetT = this.waveCanvas.getTrackHeight() / 5 + area.y;
yOffsetM = this.waveCanvas.getTrackHeight() / 2 + area.y;
yOffsetB = 4 * this.waveCanvas.getTrackHeight() / 5 + area.y;
int xSigChangeBeginVal = Math.max(area.x + (int)waveCanvas.getXOffset(), (int) (left.time / this.waveCanvas.getScaleFactor()));
int xSigChangeBeginVal = Math.max(area.x, (int) (left.time / this.waveCanvas.getScaleFactor()));
int xSigChangeBeginPos = area.x;
int xSigChangeEndPos = Math.max(area.x, getXPosEnd(right.time));
@ -138,9 +137,9 @@ public class SignalPainter extends TrackPainter {
}
SignalStencil stencil = getStencil(gc, left, entries);
SignalStencil stencil = getStencil(proj.getGC(), left, entries);
do {
stencil.draw(gc, area, left.value, right.value, xSigChangeBeginPos, xSigChangeEndPos, multiple);
stencil.draw(proj, area, left.value, right.value, xSigChangeBeginPos, xSigChangeEndPos, multiple);
if (right.time >= endTime)
break;
left.assign(right);
@ -179,7 +178,7 @@ public class SignalPainter extends TrackPainter {
private interface SignalStencil {
public void draw(GC gc, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple);
public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple);
}
private class MultiBitStencil implements SignalStencil {
@ -193,7 +192,7 @@ public class SignalPainter extends TrackPainter {
tmpAwtFont = new java.awt.Font(fd.getName(), fd.getStyle(), height);
}
public void draw(GC gc, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
Color colorBorder = waveCanvas.colors[WaveformColors.SIGNAL0.ordinal()];
BitVector last = (BitVector) left;
if (last.getValue().toString().contains("X")) {
@ -211,9 +210,9 @@ public class SignalPainter extends TrackPainter {
xEnd - 1, yOffsetB,
xBegin + 1, yOffsetB
};
gc.setForeground(colorBorder);
gc.drawPolygon(points);
gc.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_TEXT.ordinal()]);
proj.setForeground(colorBorder);
proj.drawPolygon(points);
proj.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_TEXT.ordinal()]);
//TODO: this code should be provided from a central location
String label = null;
switch(trackEntry.valueDisplay) {
@ -226,27 +225,23 @@ public class SignalPainter extends TrackPainter {
default:
label="h'"+last.toHexString();
}
Point bb = getBoxWidth(gc, label);
Point bb = new Point(DUMMY_PANEL.getFontMetrics(tmpAwtFont).stringWidth(label), height);
if (xBegin < area.x) {
xBegin = area.x;
width = xEnd - xBegin;
}
if (width > (bb.x+1)) {
Rectangle old = gc.getClipping();
gc.setClipping(xBegin + 3, yOffsetT, xEnd - xBegin - 5, yOffsetB - yOffsetT);
gc.drawText(label, xBegin + 3, yOffsetM - bb.y / 2 - 1);
gc.setClipping(old);
Rectangle old = proj.getClipping();
proj.setClipping(xBegin + 3, yOffsetT, xEnd - xBegin - 5, yOffsetB - yOffsetT);
proj.drawText(label, xBegin + 3, yOffsetM - bb.y / 2 - 1);
proj.setClipping(old);
}
} else {
gc.setForeground(colorBorder);
gc.drawLine(xEnd, yOffsetT, xEnd, yOffsetB);
proj.setForeground(colorBorder);
proj.drawLine(xEnd, yOffsetT, xEnd, yOffsetB);
}
}
private Point getBoxWidth(GC gc, String label) {
return new Point(DUMMY_PANEL.getFontMetrics(tmpAwtFont).stringWidth(label), height);
}
}
private class MultiBitStencilAnalog implements SignalStencil {
@ -254,7 +249,7 @@ public class SignalPainter extends TrackPainter {
final boolean continous;
private long minVal;
private long range;
double yRange = (yOffsetB-yOffsetT);
public MultiBitStencilAnalog(NavigableMap<Long, ?> entries, Object left, boolean continous, boolean signed) {
this.continous=continous;
Collection<?> values = ((NavigableMap<Long, ?>) entries).values();
@ -277,25 +272,25 @@ public class SignalPainter extends TrackPainter {
}
public void draw(GC gc, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
long leftVal = ((BitVector) left).toUnsignedValue();
long rightVal= ((BitVector) right).toUnsignedValue();
gc.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_REAL.ordinal()]);
int yOffsetLeft = (int) ((leftVal-minVal) / range * (yOffsetB-yOffsetT));
int yOffsetRight = (int) ((rightVal-minVal) / range * (yOffsetB-yOffsetT));
proj.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_REAL.ordinal()]);
int yOffsetLeft = (int) ((leftVal-minVal) * yRange / range);
int yOffsetRight = (int) ((rightVal-minVal) * yRange / range);
if(continous) {
if (xEnd > maxPosX) {
gc.drawLine(xBegin, yOffsetB-yOffsetLeft, maxPosX, yOffsetB-yOffsetRight);
proj.drawLine(xBegin, yOffsetB-yOffsetLeft, maxPosX, yOffsetB-yOffsetRight);
} else {
gc.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight);
proj.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight);
}
} else {
if (xEnd > maxPosX) {
gc.drawLine(xBegin, yOffsetB-yOffsetLeft, maxPosX, yOffsetB-yOffsetLeft);
proj.drawLine(xBegin, yOffsetB-yOffsetLeft, maxPosX, yOffsetB-yOffsetLeft);
} else {
gc.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetLeft);
proj.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetLeft);
if(yOffsetRight!=yOffsetLeft) {
gc.drawLine(xEnd, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight);
proj.drawLine(xEnd, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight);
}
}
}
@ -303,12 +298,12 @@ public class SignalPainter extends TrackPainter {
}
private class SingleBitStencil implements SignalStencil {
public void draw(GC gc, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
if (multiple) {
gc.setForeground(waveCanvas.colors[WaveformColors.SIGNALU.ordinal()]);
gc.drawLine(xBegin, yOffsetT, xBegin, yOffsetB);
proj.setForeground(waveCanvas.colors[WaveformColors.SIGNALU.ordinal()]);
proj.drawLine(xBegin, yOffsetT, xBegin, yOffsetB);
if(xEnd>xBegin)
gc.drawLine(xEnd, yOffsetT, xEnd, yOffsetB);
proj.drawLine(xEnd, yOffsetT, xEnd, yOffsetB);
} else {
Color color = waveCanvas.colors[WaveformColors.SIGNALX.ordinal()];
int yOffset = yOffsetM;
@ -326,11 +321,11 @@ public class SignalPainter extends TrackPainter {
break;
default:
}
gc.setForeground(color);
proj.setForeground(color);
if (xEnd > maxPosX) {
gc.drawLine(xBegin, yOffset, maxPosX, yOffset);
proj.drawLine(xBegin, yOffset, maxPosX, yOffset);
} else {
gc.drawLine(xBegin, yOffset, xEnd, yOffset);
proj.drawLine(xBegin, yOffset, xEnd, yOffset);
int yNext = yOffsetM;
switch (((BitVector) right).getValue()[0]) {
case '1':
@ -342,7 +337,7 @@ public class SignalPainter extends TrackPainter {
default:
}
if (yOffset != yNext)
gc.drawLine(xEnd, yOffset, xEnd, yNext);
proj.drawLine(xEnd, yOffset, xEnd, yNext);
}
}
}
@ -383,7 +378,7 @@ public class SignalPainter extends TrackPainter {
}
}
public void draw(GC gc, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
double leftVal = (Double) left;
double rightVal= (Double) right;
if(Double.isNaN(leftVal)) {
@ -396,31 +391,31 @@ public class SignalPainter extends TrackPainter {
xEnd, yOffsetB,
xBegin, yOffsetB
};
gc.setForeground(color);
gc.drawPolygon(points);
gc.setBackground(color);
gc.fillPolygon(points);
proj.setForeground(color);
proj.drawPolygon(points);
proj.setBackground(color);
proj.fillPolygon(points);
} else {
gc.setForeground(color);
gc.drawLine(xEnd, yOffsetT, xEnd, yOffsetB);
proj.setForeground(color);
proj.drawLine(xEnd, yOffsetT, xEnd, yOffsetB);
}
} else {
gc.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_REAL.ordinal()]);
int yOffsetLeft = (int) ((leftVal-minVal) / range * (yOffsetB-yOffsetT));
int yOffsetRight = Double.isNaN(rightVal)?yOffsetLeft:(int) ((rightVal-minVal) / range * (yOffsetB-yOffsetT));
proj.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_REAL.ordinal()]);
int yOffsetLeft = (int) ((leftVal-minVal) * (yOffsetB-yOffsetT) / range);
int yOffsetRight = Double.isNaN(rightVal)?yOffsetLeft:(int) ((rightVal-minVal) * (yOffsetB-yOffsetT) / range);
if(continous) {
if (xEnd > maxPosX) {
gc.drawLine(xBegin, yOffsetB-yOffsetLeft, maxPosX, yOffsetB-yOffsetRight);
proj.drawLine(xBegin, yOffsetB-yOffsetLeft, maxPosX, yOffsetB-yOffsetRight);
} else {
gc.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight);
proj.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight);
}
} else {
if (xEnd > maxPosX) {
gc.drawLine(xBegin, yOffsetB-yOffsetLeft, maxPosX, yOffsetB-yOffsetLeft);
proj.drawLine(xBegin, yOffsetB-yOffsetLeft, maxPosX, yOffsetB-yOffsetLeft);
} else {
gc.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetLeft);
proj.drawLine(xBegin, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetLeft);
if(yOffsetRight!=yOffsetLeft) {
gc.drawLine(xEnd, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight);
proj.drawLine(xEnd, yOffsetB-yOffsetLeft, xEnd, yOffsetB-yOffsetRight);
}
}
}

View File

@ -8,7 +8,7 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import java.util.Collection;
import java.util.List;
@ -60,22 +60,22 @@ public class StreamPainter extends TrackPainter{
}
@SuppressWarnings("unchecked")
public void paintArea(GC gc, Rectangle area) {
public void paintArea(Projection proj, 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()]);
proj.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);
proj.setBackground(this.waveCanvas.colors[even?WaveformColors.TRACK_BG_EVEN.ordinal():WaveformColors.TRACK_BG_ODD.ordinal()]);
proj.setFillRule(SWT.FILL_EVEN_ODD);
proj.fillRectangle(area);
long scaleFactor = this.waveCanvas.getScaleFactor();
long beginPos = area.x;
long beginTime = (beginPos + waveCanvas.getXOffset())*scaleFactor;
long beginTime = beginPos*scaleFactor;
//long endPos = beginPos + area.width;
long endTime = beginTime + area.width*scaleFactor;
@ -83,21 +83,21 @@ public class StreamPainter extends TrackPainter{
Entry<Long, ?> lastTx=stream.getEvents().ceilingEntry(endTime);
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()]);
proj.setFillRule(SWT.FILL_EVEN_ODD);
proj.setLineStyle(SWT.LINE_SOLID);
proj.setLineWidth(1);
proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight)
gc.drawLine(area.x, y1, area.x+area.width, y1);
proj.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(), false);
drawTx(proj, area, txEvent.getTransaction(), false);
}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()]);
proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
for(Entry<Long, ?> entry: entries.entrySet())
for(ITxEvent txEvent:(Collection<? extends ITxEvent>)entry.getValue()){
@ -106,38 +106,38 @@ public class StreamPainter extends TrackPainter{
if(txEvent.getType()==ITxEvent.Type.END){
ITx tx = txEvent.getTransaction();
highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.equals(tx);
drawTx(gc, area, tx, false);
drawTx(proj, area, tx, false);
seenTx.remove(tx);
}
}
for(ITx tx:seenTx){
drawTx(gc, area, tx, false);
drawTx(proj, area, tx, false);
}
if(highlighed){
gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE_HIGHLITE.ordinal()]);
drawTx(gc, area, waveCanvas.currentSelection, true);
proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE_HIGHLITE.ordinal()]);
drawTx(proj, area, waveCanvas.currentSelection, true);
}
}
}
protected void drawTx(GC gc, Rectangle area, ITx tx, boolean highlighted ) {
protected void drawTx(Projection proj, Rectangle area, ITx tx, boolean highlighted ) {
// compute colors
java.awt.Color[] fallbackColors = trackEntry.getColors();
java.awt.Color[] transColor = TrackEntry.computeColor( tx.getGenerator().getName(), fallbackColors[0], fallbackColors[1] );
gc.setBackground( toSwtColor( gc, transColor[highlighted?1:0] ) );
proj.setBackground( toSwtColor( proj.getGC(), transColor[highlighted?1:0] ) );
int offset = tx.getConcurrencyIndex()*this.waveCanvas.getTrackHeight();
Rectangle bb = new Rectangle(
(int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()-waveCanvas.getXOffset()), area.y+offset+txBase,
(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);
proj.drawLine(bb.x, bb.y, bb.x, bb.y+bb.height);
} else if(bb.width<10){
gc.fillRectangle(bb);
gc.drawRectangle(bb);
proj.fillRectangle(bb);
proj.drawRectangle(bb);
} else {
if(bb.x < area.x) {
bb.width = bb.width-(area.x-bb.x)+5;
@ -149,8 +149,8 @@ public class StreamPainter extends TrackPainter{
bb_x2=area_x2+5;
bb.width= bb_x2-bb.x;
}
gc.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5);
gc.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5);
proj.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5);
proj.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5);
}
}

View File

@ -1,4 +1,4 @@
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
@ -13,9 +13,9 @@ import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Widget;
import com.minres.scviewer.database.swt.Constants;
import com.minres.scviewer.database.swt.ToolTipContentProvider;
import com.minres.scviewer.database.swt.ToolTipHelpTextProvider;
import com.minres.scviewer.database.ui.swt.Constants;
import com.minres.scviewer.database.ui.swt.ToolTipContentProvider;
import com.minres.scviewer.database.ui.swt.ToolTipHelpTextProvider;
class ToolTipHandler {

View File

@ -8,13 +8,12 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import com.minres.scviewer.database.ui.WaveformColors;
@ -35,11 +34,11 @@ public class TrackAreaPainter implements IPainter {
this.trackVerticalOffset= new TreeMap<>();
}
public void paintArea(GC gc, Rectangle a) {
Rectangle area = new Rectangle(a.x, a.y+waveCanvas.rulerHeight, a.width, a.height-waveCanvas.rulerHeight);
gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_EVEN.ordinal()]);
gc.setFillRule(SWT.FILL_EVEN_ODD);
gc.fillRectangle(area);
public void paintArea(Projection proj, Rectangle a) {
Rectangle area = proj.unProject(new Rectangle(a.x, a.y+waveCanvas.rulerHeight, a.width, a.height-waveCanvas.rulerHeight));
proj.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_EVEN.ordinal()]);
proj.setFillRule(SWT.FILL_EVEN_ODD);
proj.fillRectangle(area);
if(trackVerticalOffset.size()>0){
Integer firstKey=trackVerticalOffset.floorKey(area.y);
if(firstKey==null) firstKey=trackVerticalOffset.firstKey();
@ -49,12 +48,12 @@ public class TrackAreaPainter implements IPainter {
subArea.y=firstKey;
IWaveformPainter p = trackVerticalOffset.get(firstKey);
subArea.height=p.getHeight();
p.paintArea(gc, subArea);
p.paintArea(proj, subArea);
}else{
for(Entry<Integer, IWaveformPainter> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()){
subArea.y=entry.getKey();
subArea.height=entry.getValue().getHeight();
entry.getValue().paintArea(gc, subArea);
entry.getValue().paintArea(proj, subArea);
}
}
}

View File

@ -8,7 +8,7 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import com.minres.scviewer.database.ui.TrackEntry;

View File

@ -8,7 +8,7 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import java.util.ArrayList;
import java.util.HashMap;
@ -25,10 +25,10 @@ import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Transform;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
@ -40,15 +40,17 @@ import com.google.common.collect.Lists;
import com.minres.scviewer.database.ITx;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.swt.Constants;
import com.minres.scviewer.database.ui.IWaveformViewer;
import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.WaveformColors;
import com.minres.scviewer.database.ui.swt.Constants;
public class WaveformCanvas extends Canvas{
public class WaveformCanvas extends Canvas {
Color[] colors = new Color[WaveformColors.values().length];
private boolean doubleBuffering = true;
private int trackHeight = 50;
private long scaleFactor = 1000000L; // 1ns
@ -60,9 +62,7 @@ public class WaveformCanvas extends Canvas{
private long maxTime;
protected Point origin; /* original size */
protected Transform transform;
protected int rulerHeight=40;
protected List<IPainter> painterList;
@ -89,7 +89,7 @@ public class WaveformCanvas extends Canvas{
* 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);
super(parent, style | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.V_SCROLL | SWT.H_SCROLL);
addControlListener(new ControlAdapter() { /* resize listener. */
public void controlResized(ControlEvent event) {
syncScrollBars();
@ -102,7 +102,6 @@ public class WaveformCanvas extends Canvas{
});
painterList = new LinkedList<IPainter>();
origin = new Point(0, 0);
transform = new Transform(getDisplay());
selectionListeners = new LinkedList<>();
cursorPainters= new ArrayList<>();
wave2painterMap=new HashMap<>();
@ -114,7 +113,7 @@ public class WaveformCanvas extends Canvas{
painterList.add(trackAreaPainter);
rulerPainter=new RulerPainter(this);
painterList.add(rulerPainter);
arrowPainter=new ArrowPainter(this, IWaveformViewer.NEXT_PREV_IN_STREAM);
arrowPainter=new ArrowPainter(this, IWaveformView.NEXT_PREV_IN_STREAM);
painterList.add(arrowPainter);
CursorPainter cp = new CursorPainter(this, scaleFactor * 10, cursorPainters.size()-1);
painterList.add(cp);
@ -150,10 +149,6 @@ public class WaveformCanvas extends Canvas{
}
public long getXOffset() {
return -origin.x;
}
public void addCursoPainter(CursorPainter cursorPainter){
painterList.add(cursorPainter);
cursorPainters.add(cursorPainter);
@ -323,7 +318,6 @@ public class WaveformCanvas extends Canvas{
* Dispose the garbage here
*/
public void dispose() {
transform.dispose();
for (WaveformColors c : WaveformColors.values())
colors[c.ordinal()].dispose();
super.dispose();
@ -402,28 +396,36 @@ public class WaveformCanvas extends Canvas{
vertical.setSelection(-origin.y);
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
// DO NOT SHIFT HORIZONTALLY, the range is WAY TOO BIG for float!!!
transform.translate(0, origin.y);
gc.setTransform(transform);
gc.setClipping(clientRect);
GC thisGc = gc;
Image d_backingImg = null;
if(doubleBuffering) {
Point p = getSize();
d_backingImg = new Image(getDisplay(), p.x, p.y);
thisGc = new GC(d_backingImg);
thisGc.setBackground(gc.getBackground());
thisGc.setForeground(gc.getForeground());
thisGc.setFont(gc.getFont());
}
Projection p = new Projection(thisGc);
p.setTranslation(origin);
if (painterList.size() > 0 ) {
for (IPainter painter : painterList)
painter.paintArea(gc, clientRect);
painter.paintArea(p, clientRect);
} else {
gc.fillRectangle(clientRect);
initScrollBars();
}
if(doubleBuffering) {
gc.drawImage(d_backingImg, 0, 0);
d_backingImg.dispose();
thisGc.dispose();
}
}
public List<Object> getElementsAt(Point point) {

View File

@ -8,7 +8,7 @@
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
package com.minres.scviewer.database.ui.swt.internal;
import java.awt.Color;
import java.beans.PropertyChangeEvent;
@ -86,14 +86,14 @@ import com.minres.scviewer.database.ITxRelation;
import com.minres.scviewer.database.ITxStream;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.swt.Constants;
import com.minres.scviewer.database.ui.GotoDirection;
import com.minres.scviewer.database.ui.ICursor;
import com.minres.scviewer.database.ui.IWaveformViewer;
import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.WaveformColors;
import com.minres.scviewer.database.ui.swt.Constants;
public class WaveformViewer implements IWaveformViewer {
public class WaveformView implements IWaveformView {
private ListenerList<ISelectionChangedListener> selectionChangedListeners = new ListenerList<ISelectionChangedListener>();
@ -103,7 +103,7 @@ public class WaveformViewer implements IWaveformViewer {
private ITx currentTxSelection;
private TrackEntry currentWaveformSelection;
private ArrayList<TrackEntry> currentWaveformSelection = new ArrayList<>();
private ScrolledComposite nameListScrolled;
@ -133,18 +133,41 @@ public class WaveformViewer implements IWaveformViewer {
private Font nameFont, nameFontB;
protected TrackEntry lastClickedEntry;
protected MouseListener nameValueMouseListener = new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
if (e.button == 1) {
Entry<Integer, TrackEntry> entry = trackVerticalOffset.floorEntry(e.y);
if (entry != null)
setSelection(new StructuredSelection(entry.getValue()));
entry.getValue().selected=true;
} else if (e.button == 3) {
Menu topMenu= top.getMenu();
if(topMenu!=null) topMenu.setVisible(true);
}
}
@Override
public void mouseUp(MouseEvent e) {
if (e.button == 1) {
Entry<Integer, TrackEntry> entry = trackVerticalOffset.floorEntry(e.y);
if (entry != null) {
if((e.stateMask & SWT.SHIFT) != 0) {
if(lastClickedEntry.selected) {
int firstIdx=streams.indexOf(lastClickedEntry);
int lastIdx = streams.indexOf(entry.getValue());
List<TrackEntry> res = firstIdx>lastIdx?streams.subList(lastIdx, firstIdx+1):streams.subList(firstIdx, lastIdx+1);
setSelection(new StructuredSelection(res), (e.stateMask & SWT.CTRL) !=0 , false);
} else
setSelection(new StructuredSelection(entry.getValue()), (e.stateMask & SWT.CTRL) !=0 , false);
} else {
setSelection(new StructuredSelection(entry.getValue()), (e.stateMask & SWT.CTRL) !=0 , false);
}
}
lastClickedEntry = entry.getValue();
}
}
};
class WaveformMouseListener implements MouseMoveListener, MouseListener, PaintListener {
@ -185,8 +208,7 @@ public class WaveformViewer implements IWaveformViewer {
gc.setAlpha(128);
int minX = Math.min(start.x, end.x);
int width = Math.max(start.x, end.x) - minX;
Point origin = waveformCanvas.getOrigin();
int y_top = waveformCanvas.getRulerHeight()- origin.y;
int y_top = waveformCanvas.getRulerHeight();
int y_bottom = waveformCanvas.getSize().y;
gc.fillRectangle(minX, y_top, width,y_bottom);
}
@ -288,7 +310,7 @@ public class WaveformViewer implements IWaveformViewer {
};
protected WaveformMouseListener waveformMouseListener = new WaveformMouseListener();
public WaveformViewer(Composite parent) {
public WaveformView(Composite parent) {
pcs=new PropertyChangeSupport(this);
trackVerticalOffset = new TreeMap<Integer, TrackEntry>();
@ -458,7 +480,7 @@ public class WaveformViewer implements IWaveformViewer {
@Override
public void run() {
update();
waveformCanvas.reveal(currentWaveformSelection.waveform);
currentWaveformSelection.stream().forEach(e -> waveformCanvas.reveal(e.waveform));
valueList.redraw();
nameList.redraw();
}
@ -481,13 +503,11 @@ public class WaveformViewer implements IWaveformViewer {
trackVerticalOffset.clear();
waveformCanvas.clearAllWaveformPainter(false);
boolean even = true;
boolean clearSelection = true;
TextLayout tl = new TextLayout(waveformCanvas.getDisplay());
tl.setFont(nameFontB);
for (TrackEntry streamEntry : streams) {
streamEntry.height = waveformCanvas.getTrackHeight();
streamEntry.vOffset=trackVerticalHeight;
clearSelection &= currentWaveformSelection!=null && (streamEntry.waveform != currentWaveformSelection.waveform);
if (streamEntry.isStream()) {
streamEntry.currentValue="";
streamEntry.height *= streamEntry.getStream().getMaxConcurrency();
@ -513,7 +533,6 @@ public class WaveformViewer implements IWaveformViewer {
if (trackVerticalOffset.isEmpty()){
waveformCanvas.setOrigin(0, 0);
}
if(clearSelection) setSelection(new StructuredSelection());
}
private int calculateValueWidth() {
@ -652,11 +671,12 @@ public class WaveformViewer implements IWaveformViewer {
@Override
public ISelection getSelection() {
if (currentTxSelection != null) {
Object[] elem = {currentTxSelection, currentWaveformSelection};
return new StructuredSelection(elem);
} else if (currentWaveformSelection != null) {
Object[] elem = {currentWaveformSelection.waveform, currentWaveformSelection};
return new StructuredSelection(elem);
ArrayList<Object> sel = new ArrayList<>();
sel.add(currentTxSelection);
sel.addAll(currentWaveformSelection.stream().map(e -> e.waveform).collect(Collectors.toList()));
return new StructuredSelection(sel.toArray());
} else if (currentWaveformSelection.size()>0) {
return new StructuredSelection(currentWaveformSelection.toArray());
} else
return new StructuredSelection();
}
@ -666,22 +686,33 @@ public class WaveformViewer implements IWaveformViewer {
*/
@Override
public void setSelection(ISelection selection) {
setSelection(selection, false);
setSelection(selection, false, false);
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.swt.IWaveformPanel#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
*/
@Override
public void setSelection(ISelection selection, boolean addIfNeeded) {
public void setSelection(ISelection selection, boolean showIfNeeded) {
setSelection(selection, false, showIfNeeded);
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.swt.IWaveformPanel#addToSelection(org.eclipse.jface.viewers.ISelection, boolean)
*/
@Override
public void addToSelection(ISelection selection, boolean showIfNeeded) {
setSelection(selection, true, showIfNeeded);
}
public void setSelection(ISelection selection, boolean add, boolean addIfNeeded) {
boolean selectionChanged = false;
if(currentWaveformSelection!=null) currentWaveformSelection.selected=false;
currentWaveformSelection.forEach(e->e.selected=false);
if (selection instanceof IStructuredSelection) {
if(((IStructuredSelection) selection).size()==0){
selectionChanged = currentTxSelection!=null||currentWaveformSelection!=null;
currentTxSelection = null;
currentWaveformSelection = null;
currentWaveformSelection .clear();
} else {
if(!add) currentWaveformSelection.clear();
for(Object sel:((IStructuredSelection) selection).toArray()){
if (sel instanceof ITx && currentTxSelection != sel){
ITx txSel = (ITx) sel;
@ -694,26 +725,27 @@ public class WaveformViewer implements IWaveformViewer {
streams.add(trackEntry);
}
currentTxSelection = txSel;
if(trackEntry!=null) currentWaveformSelection = trackEntry;
if(trackEntry!=null) {
currentWaveformSelection.add((TrackEntry)sel);
}
selectionChanged = true;
} else if (sel instanceof TrackEntry && currentWaveformSelection != sel) {
currentWaveformSelection = (TrackEntry) sel;
if(currentTxSelection!=null && currentTxSelection.getStream()!=currentWaveformSelection)
currentTxSelection=null;
} else if (sel instanceof TrackEntry && !currentWaveformSelection.contains(sel)) {
currentWaveformSelection.add((TrackEntry)sel);
if(currentTxSelection!=null)
currentTxSelection=null;
selectionChanged = true;
}
}
}
} else {
if (currentTxSelection != null || currentWaveformSelection != null)
if (currentTxSelection != null || currentWaveformSelection.size() > 0)
selectionChanged = true;
currentTxSelection = null;
currentWaveformSelection = null;
currentWaveformSelection.clear();
}
if(currentWaveformSelection!=null) currentWaveformSelection.selected=true;
currentWaveformSelection.forEach(e -> e.selected = true);
if (selectionChanged) {
if(currentWaveformSelection!=null) waveformCanvas.reveal(currentWaveformSelection.waveform);
currentWaveformSelection.forEach(e -> waveformCanvas.reveal(e.waveform));
waveformCanvas.setSelected(currentTxSelection);
valueList.redraw();
nameList.redraw();
@ -723,13 +755,11 @@ public class WaveformViewer implements IWaveformViewer {
protected void fireSelectionChanged() {
if(currentWaveformSelection==null) return;
IStructuredSelection selection=currentTxSelection!=null?
new StructuredSelection(new Object[]{currentTxSelection, currentWaveformSelection.waveform}):
new StructuredSelection(currentWaveformSelection.waveform);
Object[] list = selectionChangedListeners.getListeners();
for (int i = 0; i < list.length; i++) {
((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection));
}
ISelection selection=getSelection();
Object[] list = selectionChangedListeners.getListeners();
for (int i = 0; i < list.length; i++) {
((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection));
}
}
/* (non-Javadoc)
@ -740,12 +770,14 @@ public class WaveformViewer implements IWaveformViewer {
if(direction==GotoDirection.NEXT || direction==GotoDirection.PREV)
moveSelection(direction, NEXT_PREV_IN_STREAM) ;
else {
int idx = streams.indexOf(currentWaveformSelection);
if(currentWaveformSelection.size()==1) {
int idx = streams.indexOf(currentWaveformSelection.get(0));
if(direction==GotoDirection.UP && idx>0) {
setSelection(new StructuredSelection(streams.get(idx-1)));
} else if(direction==GotoDirection.DOWN && idx<(streams.size()-1)) {
setSelection(new StructuredSelection(streams.get(idx+1)));
}
}
}
}
@ -754,9 +786,15 @@ public class WaveformViewer implements IWaveformViewer {
*/
@Override
public void moveSelection(GotoDirection direction, RelationType relationType) {
if (currentWaveformSelection!=null && currentWaveformSelection.isStream() && currentTxSelection!=null) {
if(relationType.equals(IWaveformViewer.NEXT_PREV_IN_STREAM)){
ITxStream<? extends ITxEvent> stream = currentWaveformSelection.getStream();
TrackEntry selectedWaveform=null;
if(currentTxSelection!=null)
selectedWaveform = getEntryForStream(currentTxSelection.getStream());
else if(currentWaveformSelection.size()!=1) return;
if(selectedWaveform==null)
selectedWaveform = currentWaveformSelection.get(1);
if (selectedWaveform!=null && selectedWaveform.isStream() && currentTxSelection!=null) {
if(relationType.equals(IWaveformView.NEXT_PREV_IN_STREAM)){
ITxStream<? extends ITxEvent> stream = selectedWaveform.getStream();
ITx transaction = null;
if (direction == GotoDirection.NEXT) {
List<ITxEvent> thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime());
@ -856,14 +894,14 @@ public class WaveformViewer implements IWaveformViewer {
*/
@Override
public void moveCursor(GotoDirection direction) {
if(currentWaveformSelection.size()!=1) return;
TrackEntry sel = currentWaveformSelection.get(1);
long time = getCursorTime();
NavigableMap<Long, ?> map=null;
if(currentWaveformSelection!=null) {
if(currentWaveformSelection.isStream()){
map=currentWaveformSelection.getStream().getEvents();
} else if(currentWaveformSelection.isSignal()){
map=currentWaveformSelection.getSignal().getEvents();
}
if(sel.isStream()){
map=sel.getStream().getEvents();
} else if(sel.isSignal()){
map=sel.getSignal().getEvents();
}
if(map!=null){
Entry<Long, ?> entry=direction==GotoDirection.PREV?map.lowerEntry(time):map.higherEntry(time);
@ -885,29 +923,37 @@ public class WaveformViewer implements IWaveformViewer {
public List<TrackEntry> getStreamList() {
return streams;
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.swt.IWaveformPanel#deleteSelectedTracks()
*/
@Override
public void deleteSelectedTracks() {
List<TrackEntry> streams = getStreamList();
for (Object o : (IStructuredSelection)getSelection()) {
if(o instanceof TrackEntry) {
TrackEntry e = (TrackEntry) o;
e.selected=false;
streams.remove(e);
}
}
setSelection(new StructuredSelection());
update();
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.swt.IWaveformPanel#moveSelected(int)
*/
@Override
public void moveSelectedTrack(int i) {
if(currentWaveformSelection!=null){
int idx = streams.indexOf(currentWaveformSelection);
int newIdx=idx+i;
if(newIdx>=0 && newIdx<streams.size()){
Collections.swap(streams,idx,newIdx);
revealSelected=true;
// update();
// ITx selectedTx=currentTxSelection;
// if(selectedTx!=null){
// setSelection(new StructuredSelection(new Object[]{selectedTx, currentWaveformSelection.waveform}));
// } else {
// setSelection(new StructuredSelection(currentWaveformSelection.waveform));
// }
// waveformCanvas.reveal(currentWaveformSelection.waveform);
// valueList.redraw();
// nameList.redraw();
}
if(currentWaveformSelection.size()>0){
int idx = streams.indexOf(currentWaveformSelection.get(0));
for(Object o: currentWaveformSelection)
streams.remove(o);
int tgtIdx=idx+i;
if(tgtIdx<0) tgtIdx=0;
if(tgtIdx>=streams.size())
streams.addAll(currentWaveformSelection);
else
streams.addAll(tgtIdx, currentWaveformSelection);
}
}
@ -1109,38 +1155,30 @@ public class WaveformViewer implements IWaveformViewer {
dropTarget.setTransfer(types);
dropTarget.addDropListener(new DropTargetAdapter() {
@SuppressWarnings("unchecked")
public void drop(DropTargetEvent event) {
if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)){
ISelection sel = LocalSelectionTransfer.getTransfer().getSelection();
if(sel!=null && sel instanceof IStructuredSelection){
Object source = ((IStructuredSelection)sel).getFirstElement();
ISelection s = LocalSelectionTransfer.getTransfer().getSelection();
if(s!=null && s instanceof IStructuredSelection){
IStructuredSelection sel = (IStructuredSelection) s;
for(Object o: sel.toList())
streams.remove(o);
DropTarget tgt = (DropTarget) event.widget;
Point dropPoint = ((Canvas) tgt.getControl()).toControl(event.x, event.y);
Object target = trackVerticalOffset.floorEntry(dropPoint.y).getValue();
if(source instanceof TrackEntry && target instanceof TrackEntry){
TrackEntry srcWave=(TrackEntry) source;
int srcIdx=streams.indexOf(srcWave);
streams.remove(srcWave);
// extract all elements being selected
if( dropPoint.y > trackVerticalOffset.lastKey()) {
streams.addAll(sel.toList());
} else {
TrackEntry target = trackVerticalOffset.floorEntry(dropPoint.y).getValue();
int tgtIdx=streams.indexOf(target);
if(srcIdx<=tgtIdx) tgtIdx++;
if(tgtIdx>=streams.size())
streams.add(srcWave);
else
streams.add(tgtIdx, srcWave);
currentWaveformSelection=srcWave;
update();
} else if(source instanceof CursorPainter){
((CursorPainter)source).setTime(0);
updateValueList();
}
streams.addAll(tgtIdx, sel.toList());
}
}
}
}
public void dropAccept(DropTargetEvent event) {
Point offset = canvas.toControl(event.x, event.y);
if (event.detail != DND.DROP_MOVE || offset.y > trackVerticalOffset.lastKey() + waveformCanvas.getTrackHeight()) {
if (event.detail != DND.DROP_MOVE) {
event.detail = DND.DROP_NONE;
}
}
@ -1351,4 +1389,5 @@ public class WaveformViewer implements IWaveformViewer {
public void addDisposeListener( DisposeListener listener ) {
waveformCanvas.addDisposeListener(listener);
}
}

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.minres.scviewer.database.ui</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -1,7 +0,0 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8

View File

@ -1,3 +0,0 @@
eclipse.preferences.version=1
pluginProject.extensions=false
resolve.requirebundle=false

View File

@ -1,12 +0,0 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Database UI
Bundle-SymbolicName: com.minres.scviewer.database.ui
Bundle-Version: 2.0.0.qualifier
Bundle-Vendor: MINRES Technologies GmbH
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Export-Package: com.minres.scviewer.database.ui
Require-Bundle: com.minres.scviewer.database,
org.eclipse.jface,
org.eclipse.swt
Automatic-Module-Name: com.minres.scviewer.database.ui

View File

@ -1,4 +0,0 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<application:Application xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:advanced="http://www.eclipse.org/ui/2010/UIModel/application/ui/advanced" xmlns:application="http://www.eclipse.org/ui/2010/UIModel/application" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:menu="http://www.eclipse.org/ui/2010/UIModel/application/ui/menu" xmlns:ui="http://www.eclipse.org/ui/2010/UIModel/application/ui" xmi:id="_95PfsHNmEeWBq8z1Dv39LA" elementId="org.eclipse.e4.ide.application" bindingContexts="_95PfuXNmEeWBq8z1Dv39LA">
<children xsi:type="basic:TrimmedWindow" xmi:id="_95PfsXNmEeWBq8z1Dv39LA" label="SC Viewer" bindingContexts="_95PfunNmEeWBq8z1Dv39LA" width="980" height="700">
<children xsi:type="basic:TrimmedWindow" xmi:id="_95PfsXNmEeWBq8z1Dv39LA" label="SC Viewer" bindingContexts="_95PfunNmEeWBq8z1Dv39LA" width="1280" height="700">
<children xsi:type="advanced:PerspectiveStack" xmi:id="_95QGxnNmEeWBq8z1Dv39LA">
<children xsi:type="advanced:Perspective" xmi:id="_95QGx3NmEeWBq8z1Dv39LA">
<children xsi:type="basic:PartSashContainer" xmi:id="_95QGyHNmEeWBq8z1Dv39LA" horizontal="true">
@ -144,10 +144,7 @@
<children xsi:type="menu:ToolControl" xmi:id="_YsBi8HfLEeWwZ-9vrAR2UQ" elementId="org.eclipse.ui.StatusLine" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.internal.status.WaveStatusBarControl">
<tags>stretch</tags>
</children>
<children xsi:type="menu:ToolControl" xmi:id="_VZzJMHdHEeWwZ-9vrAR2UQ" elementId="org.eclipse.ui.HeapStatus" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.internal.status.StatusBarControl">
<tags>Draggable</tags>
</children>
<children xsi:type="menu:ToolControl" xmi:id="_y0ZS0HfzEeWwZ-9vrAR2UQ" elementId="org.eclipse.ui.ProgressBar" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.internal.status.StatusBarControl">
<children xsi:type="menu:ToolControl" xmi:id="_VZzJMHdHEeWwZ-9vrAR2UQ" elementId="org.eclipse.ui.HeapStatus" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.internal.status.WaveStatusBarControl">
<tags>Draggable</tags>
</children>
</trimBars>

View File

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: com.minres.scviewer.e4.application;singleton:=true
Bundle-Version: 2.6.0.qualifier
Bundle-Version: 2.7.0.qualifier
Bundle-Vendor: %Bundle-Vendor
Require-Bundle: javax.inject;bundle-version="1.0.0",
org.eclipse.core.runtime;bundle-version="3.11.1",
@ -15,7 +15,6 @@ Require-Bundle: javax.inject;bundle-version="1.0.0",
org.eclipse.e4.ui.di;bundle-version="1.1.0",
org.eclipse.e4.core.contexts;bundle-version="1.4.0",
com.minres.scviewer.database.ui.swt;bundle-version="1.0.0",
com.minres.scviewer.database.ui,
com.minres.scviewer.database;bundle-version="1.0.0",
org.eclipse.osgi.services;bundle-version="3.5.0",
org.eclipse.e4.core.services;bundle-version="2.0.0",
@ -26,12 +25,10 @@ Require-Bundle: javax.inject;bundle-version="1.0.0",
org.eclipse.equinox.preferences,
org.eclipse.core.expressions,
org.eclipse.e4.core.commands;bundle-version="0.11.0",
org.eclipse.e4.ui.workbench.addons.swt,
com.opcoach.e4.preferences,
org.eclipse.e4.core.di.extensions,
org.eclipse.e4.ui.css.swt.theme;bundle-version="0.10.0",
org.eclipse.core.resources;bundle-version="3.13.0",
com.opcoach.e4.preferences.mainmenu;bundle-version="1.2.0"
org.eclipse.core.resources;bundle-version="3.13.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Import-Package: com.minres.scviewer.database,
javax.inject;version="1.0.0"

View File

@ -84,12 +84,5 @@
category="com.minres.scviewer.e4.application.preferences.scviewer">
</page>
</extension>
<extension
point="com.opcoach.e4.preferences.e4PreferenceStoreProvider">
<preferenceStoreProvider
class="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.preferences.PreferencesStoreProvider"
pluginId="com.minres.scviewer.e4.application">
</preferenceStoreProvider>
</extension>
</plugin>

View File

@ -1,7 +1,7 @@
<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.e4.application</artifactId>
<version>2.6.0-SNAPSHOT</version>
<version>2.7.0-SNAPSHOT</version>
<parent>
<groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId>

View File

@ -41,6 +41,7 @@ public class Messages extends NLS {
public static String TransactionDetails_21;
public static String TransactionDetails_3;
public static String TransactionDetails_4;
public static String WaveformPreferencesPage_description;
public static String WaveformPreferencesPage_1;
public static String WaveformViewer_13;
public static String WaveformViewer_14;
@ -61,6 +62,30 @@ public class Messages extends NLS {
public static String WaveStatusBarControl_6;
public static String WaveStatusBarControl_7;
public static String WaveStatusBarControl_8;
public static String line;
public static String line_highlite;
public static String track_bg_even;
public static String track_bg_odd;
public static String track_bg_highlite;
public static String tx_bg;
public static String tx_bg_highlite;
public static String tx_border;
public static String signal0;
public static String signal1;
public static String signalz;
public static String signalx;
public static String signalu;
public static String signal_text;
public static String signal_real;
public static String signal_nan;
public static String cursor;
public static String cursor_drag;
public static String cursor_text;
public static String marker;
public static String marker_text;
public static String rel_arrow;
public static String rel_arrow_highlite;
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);

View File

@ -1,7 +1,6 @@
package com.minres.scviewer.e4.application.elements;
import java.util.Iterator;
import java.util.List;
import javax.inject.Inject;
@ -34,22 +33,46 @@ public class WaveformPopupMenuContribution {
final TrackEntry nullEntry = new TrackEntry(null);
private boolean selHasBitVector(ISelection sel, boolean checkForDouble) {
if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
for(Object elem:(IStructuredSelection)sel) {
if(elem instanceof TrackEntry) {
TrackEntry e = (TrackEntry) elem;
if(e.waveform instanceof ISignal<?>) {
Object o = ((ISignal<?>) e.waveform).getEvents().firstEntry().getValue();
if(checkForDouble && o instanceof Double)
return true;
else if(o instanceof BitVector && ((BitVector)o).getWidth()>1)
return true;
else
return false;
}
}
}
}
return false;
}
private TrackEntry getSingleTrackEntry(ISelection sel) {
TrackEntry entry=null;
if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
for(Object elem:(IStructuredSelection)sel) {
if(elem instanceof TrackEntry) {
if(entry != null)
return null;
entry = (TrackEntry) elem;
}
}
}
return entry;
}
@Evaluate
public boolean evaluate() {
Object obj = activePart.getObject();
if(obj instanceof WaveformViewer){
WaveformViewer wfv = (WaveformViewer)obj;
ISelection sel = wfv.getSelection();
if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
Object selected = ((IStructuredSelection)sel).getFirstElement();
if(selected instanceof ISignal<?>) {
Object x = ((ISignal<?>) selected).getEvents().firstEntry().getValue();
if((x instanceof BitVector) && ((BitVector)x).getWidth()==1) {
return false;
} else
return true;
}
}
return selHasBitVector(wfv.getSelection(), true);
}
return false;
}
@ -60,39 +83,24 @@ public class WaveformPopupMenuContribution {
if(obj instanceof WaveformViewer){
WaveformViewer wfv = (WaveformViewer)obj;
ISelection sel = wfv.getSelection();
if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
Iterator<?> it = ((IStructuredSelection)sel).iterator();
Object first = it.next();
Object second=null;
if(it.hasNext()) second=it.next();
if(first instanceof ISignal<?>) {
Object o = ((ISignal<?>) first).getEvents().firstEntry().getValue();
//com.minres.scviewer.e4.application.menu.mulitvaluesettings
if((o instanceof Double) || (o instanceof BitVector)) {
TrackEntry entry=nullEntry;
if(second instanceof TrackEntry)
entry=(TrackEntry)second;
if(o instanceof BitVector) {
addValueMenuItem(items, application, modelService, "hex", TrackEntry.ValueDisplay.DEFAULT, entry.valueDisplay);
addValueMenuItem(items, application, modelService, "unsigned", TrackEntry.ValueDisplay.UNSIGNED, entry.valueDisplay);
addValueMenuItem(items, application, modelService, "signed", TrackEntry.ValueDisplay.SIGNED, entry.valueDisplay);
items.add(MMenuFactory.INSTANCE.createMenuSeparator());
addWaveMenuItem(items, application, modelService, "bit vector", TrackEntry.WaveDisplay.DEFAULT, entry.waveDisplay);
}
addWaveMenuItem(items, application, modelService, "analog step-wise", TrackEntry.WaveDisplay.STEP_WISE, entry.waveDisplay);
addWaveMenuItem(items, application, modelService, "analog continous", TrackEntry.WaveDisplay.CONTINOUS, entry.waveDisplay);
}
}
}
TrackEntry elem = getSingleTrackEntry(sel);
if(selHasBitVector(sel, false)) {
addValueMenuItem(items, application, modelService, "hex", TrackEntry.ValueDisplay.DEFAULT, elem);
addValueMenuItem(items, application, modelService, "unsigned", TrackEntry.ValueDisplay.UNSIGNED, elem);
addValueMenuItem(items, application, modelService, "signed", TrackEntry.ValueDisplay.SIGNED, elem);
items.add(MMenuFactory.INSTANCE.createMenuSeparator());
addWaveMenuItem(items, application, modelService, "bit vector", TrackEntry.WaveDisplay.DEFAULT, elem);
}
addWaveMenuItem(items, application, modelService, "analog step-wise", TrackEntry.WaveDisplay.STEP_WISE, elem);
addWaveMenuItem(items, application, modelService, "analog continous", TrackEntry.WaveDisplay.CONTINOUS, elem);
}
}
private void addValueMenuItem(List<MMenuElement> items, MApplication application, EModelService modelService,
String label, TrackEntry.ValueDisplay value, TrackEntry.ValueDisplay actual) {
String label, TrackEntry.ValueDisplay value, TrackEntry elem) {
MHandledMenuItem item = MMenuFactory.INSTANCE.createHandledMenuItem();
item.setType(ItemType.RADIO);
item.setSelected(value==actual);
item.setSelected(elem != null && elem.valueDisplay == value);
item.setLabel("Show as "+label);
item.setContributorURI("platform:/plugin/com.minres.scviewer.e4.application");
List<MCommand> cmds = modelService.findElements(application, "com.minres.scviewer.e4.application.command.changevaluedisplay", MCommand.class, null);
@ -106,10 +114,10 @@ public class WaveformPopupMenuContribution {
}
private void addWaveMenuItem(List<MMenuElement> items, MApplication application, EModelService modelService,
String label, TrackEntry.WaveDisplay value, TrackEntry.WaveDisplay actual) {
String label, TrackEntry.WaveDisplay value, TrackEntry elem) {
MHandledMenuItem item = MMenuFactory.INSTANCE.createHandledMenuItem();
item.setType(ItemType.RADIO);
item.setSelected(value==actual);
item.setSelected(elem != null && elem.waveDisplay==value);
item.setLabel("Render "+label);
item.setContributorURI("platform:/plugin/com.minres.scviewer.e4.application");
List<MCommand> cmds = modelService.findElements(application, "com.minres.scviewer.e4.application.command.changewavedisplay", MCommand.class, null);

View File

@ -1,8 +1,6 @@
package com.minres.scviewer.e4.application.handlers;
import java.util.Iterator;
import javax.inject.Named;
import org.eclipse.e4.core.di.annotations.CanExecute;
@ -34,18 +32,14 @@ public class ChangeValueDisplay {
WaveformViewer wfv = (WaveformViewer)obj;
ISelection sel = wfv.getSelection();
if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
Iterator<?> it = ((IStructuredSelection)sel).iterator();
it.next();
if(it.hasNext()) {
Object second = it.next();
if(second instanceof TrackEntry) {
TrackEntry.ValueDisplay val = TrackEntry.ValueDisplay.valueOf(param);
((TrackEntry)second).valueDisplay=val;
wfv.update();
}
for(Object elem:(IStructuredSelection)sel) {
if(elem instanceof TrackEntry) {
TrackEntry.ValueDisplay val= TrackEntry.ValueDisplay.valueOf(param);
((TrackEntry)elem).valueDisplay=val;
}
}
wfv.update();
}
}
}
}

View File

@ -1,8 +1,6 @@
package com.minres.scviewer.e4.application.handlers;
import java.util.Iterator;
import javax.inject.Named;
import org.eclipse.e4.core.di.annotations.CanExecute;
@ -34,16 +32,13 @@ public class ChangeWaveformDisplay {
WaveformViewer wfv = (WaveformViewer)obj;
ISelection sel = wfv.getSelection();
if(!sel.isEmpty() && sel instanceof IStructuredSelection) {
Iterator<?> it = ((IStructuredSelection)sel).iterator();
it.next();
if(it.hasNext()) {
Object second = it.next();
if(second instanceof TrackEntry) {
TrackEntry.WaveDisplay val= TrackEntry.WaveDisplay.valueOf(param);
((TrackEntry)second).waveDisplay=val;
wfv.update();
}
for(Object elem:(IStructuredSelection)sel) {
if(elem instanceof TrackEntry) {
TrackEntry.WaveDisplay val= TrackEntry.WaveDisplay.valueOf(param);
((TrackEntry)elem).waveDisplay=val;
}
}
wfv.update();
}
}
}

View File

@ -17,23 +17,30 @@ import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
import org.eclipse.jface.viewers.IStructuredSelection;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.e4.application.parts.WaveformViewer;
public class DeleteWaveformHandler {
@SuppressWarnings("unchecked")
@CanExecute
public Boolean canExecute(ESelectionService selectionService){
Object o = selectionService.getSelection();
return o instanceof IStructuredSelection && ((IStructuredSelection)o).getFirstElement() instanceof IWaveform;
if(o instanceof IStructuredSelection) {
IStructuredSelection sel = (IStructuredSelection) o;
if(sel.size()>0)
return sel.toList().stream().allMatch(e-> e instanceof TrackEntry);
else
return false;
} else
return false;
}
@Execute
public void execute(ESelectionService selectionService, MPart activePart) {
Object o = activePart.getObject();
Object sel = selectionService.getSelection();
if(o instanceof WaveformViewer && ((IStructuredSelection)sel).getFirstElement() instanceof IWaveform){
((WaveformViewer)o).removeStreamFromList((IWaveform) ((IStructuredSelection)sel).getFirstElement());
if(o instanceof WaveformViewer){
((WaveformViewer)o).removeSelectedStreamsFromList();
}
}
}

View File

@ -4,45 +4,43 @@ package com.minres.scviewer.e4.application.handlers;
import java.util.LinkedList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.core.runtime.preferences.ConfigurationScope;
import org.eclipse.e4.core.contexts.Active;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.di.extensions.Preference;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.model.application.ui.menu.MHandledItem;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.jface.preference.IPreferenceStore;
import org.osgi.service.prefs.BackingStoreException;
import com.minres.scviewer.e4.application.preferences.PreferenceConstants;
import com.opcoach.e4.preferences.ScopedPreferenceStore;
@SuppressWarnings("restriction")
public class EnableHover {
static final String TAG_NAME = "EnableHover"; //$NON-NLS-1$
@Inject
MApplication application;
@PostConstruct
public void initialize(EModelService modelService) {
@Inject
@Optional
public void reactOnShowHoverChange(EModelService modelService, @Preference(value = PreferenceConstants.SHOW_HOVER) Boolean hover) {
List<String> tags = new LinkedList<>();
tags.add(TAG_NAME);
List<MHandledItem> elements = modelService.findElements(application, null, MHandledItem.class, tags );
// cover initialization stuff, sync it with code
IPreferenceStore store = new ScopedPreferenceStore(ConfigurationScope.INSTANCE, PreferenceConstants.PREFERENCES_SCOPE);
boolean state = store.getBoolean(PreferenceConstants.SHOW_HOVER);
for( MHandledItem hi : elements ){
hi.setSelected(state);
hi.setSelected(hover);
}
}
@Execute
public void execute(@Active MPart part, @Active MWindow window, MHandledItem handledItem, EModelService modelService ) {
IPreferenceStore store = new ScopedPreferenceStore(ConfigurationScope.INSTANCE, PreferenceConstants.PREFERENCES_SCOPE);
store.setValue(PreferenceConstants.SHOW_HOVER, handledItem.isSelected());
public void execute(MHandledItem handledItem, @Preference(nodePath = PreferenceConstants.PREFERENCES_SCOPE) IEclipsePreferences prefs ) {
try {
prefs.putBoolean(PreferenceConstants.SHOW_HOVER, handledItem.isSelected());
prefs.flush();
} catch (BackingStoreException e) {}
}
}

View File

@ -26,14 +26,10 @@ import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.model.application.ui.menu.MToolControl;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.osgi.service.prefs.PreferencesService;
import com.minres.scviewer.e4.application.AppModelId;
import com.minres.scviewer.e4.application.Messages;
/**
* The Class StatusBarControl.
@ -58,9 +54,6 @@ public class StatusBarControl {
/** The monitor. */
private SyncedProgressMonitor monitor;
/** The progress bar. */
private ProgressBar progressBar;
/**
* Instantiates a new status bar control.
*
@ -84,9 +77,7 @@ public class StatusBarControl {
if (toolControl.getElementId().equals(AppModelId.TOOLCONTROL_ORG_ECLIPSE_UI_STATUSLINE)) { //$NON-NLS-1$
createStatusLine(parent, toolControl);
} else if (toolControl.getElementId().equals(AppModelId.TOOLCONTROL_ORG_ECLIPSE_UI_HEAPSTATUS)) { //$NON-NLS-1$
createHeapStatus(parent, toolControl);
} else if (toolControl.getElementId().equals(AppModelId.TOOLCONTROL_ORG_ECLIPSE_UI_PROGRESSBAR)) { //$NON-NLS-1$
createProgressBar(parent, toolControl);
new HeapStatus(parent, osgiPreverences.getSystemPreferences());
}
}
@ -101,36 +92,6 @@ public class StatusBarControl {
}
}
/**
* Creates the progress bar.
*
* @param parent the parent
* @param toolControl the tool control
*/
private void createProgressBar(Composite parent, MToolControl toolControl) {
new Label(parent, SWT.NONE);
progressBar = new ProgressBar(parent, SWT.SMOOTH);
progressBar.setBounds(100, 10, 200, 20);
new Label(parent, SWT.NONE);
monitor=new SyncedProgressMonitor(progressBar);
Job.getJobManager().setProgressProvider(new ProgressProvider() {
@Override
public IProgressMonitor createMonitor(Job job) {
return monitor.addJob(job);
}
});
}
/**
* Creates the heap status.
*
* @param parent the parent
* @param toolControl the tool control
*/
private void createHeapStatus(Composite parent, MToolControl toolControl) {
new HeapStatus(parent, osgiPreverences.getSystemPreferences());
}
/**
* Creates the status line.
*
@ -140,6 +101,14 @@ public class StatusBarControl {
private void createStatusLine(Composite parent, MToolControl toolControl) {
// IEclipseContext context = modelService.getContainingContext(toolControl);
manager.createControl(parent);
monitor=new SyncedProgressMonitor(manager.getProgressMonitor());
Job.getJobManager().setProgressProvider(new ProgressProvider() {
@Override
public IProgressMonitor createMonitor(Job job) {
return monitor.addJob(job);
}
});
}
/**
@ -160,25 +129,17 @@ public class StatusBarControl {
*/
private final class SyncedProgressMonitor extends NullProgressMonitor {
// thread-Safe via thread confinement of the UI-Thread
/** The running tasks. */
// (means access only via UI-Thread)
private long runningTasks = 0L;
/** The progress bar. */
private ProgressBar progressBar;
private IProgressMonitor progressBar;
/**
* Instantiates a new synced progress monitor.
*
* @param progressBar the progress bar
* @param iProgressMonitor the progress bar
*/
public SyncedProgressMonitor(ProgressBar progressBar) {
public SyncedProgressMonitor(IProgressMonitor iProgressMonitor) {
super();
this.progressBar = progressBar;
runningTasks=0;
progressBar.setSelection(0);
progressBar.setEnabled(false);
this.progressBar = iProgressMonitor;
}
/* (non-Javadoc)
@ -189,13 +150,41 @@ public class StatusBarControl {
sync.asyncExec(new Runnable() {
@Override
public void run() {
runningTasks++;
if(runningTasks == 1) { // --- no task is running at the moment ---
progressBar.setEnabled(true);
progressBar.setSelection(0);
}
progressBar.setMaximum(totalWork);
progressBar.setToolTipText(Messages.StatusBarControl_1 + runningTasks + Messages.StatusBarControl_2 + name);
progressBar.beginTask(name, totalWork);
}
});
}
/**
* This implementation does nothing.
* Subclasses may override this method to do something
* with the name of the task.
*
* @see IProgressMonitor#setTaskName(String)
*/
@Override
public void setTaskName(String name) {
sync.asyncExec(new Runnable() {
@Override
public void run() {
progressBar.setTaskName(name);
}
});
}
/**
* This implementation does nothing.
* Subclasses may override this method to do interesting
* processing when a subtask begins.
*
* @see IProgressMonitor#subTask(String)
*/
@Override
public void subTask(String name) {
sync.asyncExec(new Runnable() {
@Override
public void run() {
progressBar.subTask(name);
}
});
}
@ -208,7 +197,16 @@ public class StatusBarControl {
sync.asyncExec(new Runnable() {
@Override
public void run() {
progressBar.setSelection(progressBar.getSelection() + work);
progressBar.worked(work);
}
});
}
@Override
public void done() {
sync.asyncExec(new Runnable() {
@Override
public void run() {
progressBar.done();
}
});
}
@ -228,14 +226,8 @@ public class StatusBarControl {
@Override
public void run() {
if(event.getResult()==null) return;
if(runningTasks>0) runningTasks--;
if (runningTasks > 0){ // --- some tasks are still running ---
progressBar.setToolTipText(Messages.StatusBarControl_3 + runningTasks);
} else { // --- all tasks are done (a reset of selection could also be done) ---
progressBar.setToolTipText(Messages.StatusBarControl_4);
progressBar.setSelection(progressBar.getMaximum());
progressBar.setEnabled(false);
}
if(!event.getResult().isOK())
progressBar.done();
}
});
// clean-up

View File

@ -0,0 +1,229 @@
package com.minres.scviewer.e4.application.internal.status;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.StatusLineLayoutData;
import org.eclipse.jface.resource.JFaceColors;
/**
* Contribution item for the status line.
* @since 2.0
*/
public class StatusLineContributionItem extends ContributionItem {
/**
* Internal mouse listener to track double clicking the status line item.
* @since 3.0
*/
private class Listener extends MouseAdapter {
@Override
public void mouseDoubleClick(MouseEvent e) {
if (fActionHandler != null && fActionHandler.isEnabled())
fActionHandler.run();
}
}
/**
* Left and right margin used in CLabel.
* @since 2.1
*/
private static final int INDENT= 3;
/**
* Default number of characters that should fit into the item.
* @since 3.0
*/
static final int DEFAULT_WIDTH_IN_CHARS = 19;
/**
* Pre-computed label width hint.
* @since 2.1
*/
private int fFixedWidth= -1;
/**
* Pre-computed label height hint.
* @since 3.0
*/
private int fFixedHeight= -1;
/** The text */
private String fText;
/** The image */
private Image fImage;
/**
* The error text.
* @since 3.0
*/
private String fErrorText;
/**
* The error image.
* @since 3.0
*/
private Image fErrorImage;
/**
* The tool tip text.
* @since 3.0
*/
private String fToolTipText;
/**
* Number of characters that should fit into the item.
* @since 3.0
*/
private int fWidthInChars;
/** The status line label widget */
private CLabel fLabel;
/**
* The action handler.
* @since 3.0
*/
private IAction fActionHandler;
/**
* The mouse listener
* @since 3.0
*/
private MouseListener fMouseListener;
/**
* Creates a new item with the given attributes.
*
* @param id the item's id
* @param visible the visibility of this item
* @param widthInChars the width in characters
* @since 3.0
*/
public StatusLineContributionItem(String id, boolean visible, int widthInChars) {
super(id);
setVisible(visible);
fWidthInChars= widthInChars;
}
@Override
public void fill(Composite parent) {
Label sep= new Label(parent, SWT.SEPARATOR);
CLabel label=new CLabel(parent, SWT.SHADOW_NONE);
label.setText(getId());
fLabel= new CLabel(parent, SWT.SHADOW_IN);
fLabel.setAlignment(SWT.RIGHT);
fLabel.addDisposeListener(e -> fMouseListener = null);
if (fActionHandler != null) {
fMouseListener= new Listener();
fLabel.addMouseListener(fMouseListener);
}
StatusLineLayoutData data= new StatusLineLayoutData();
data.widthHint= getWidthHint(parent);
fLabel.setLayoutData(data);
data= new StatusLineLayoutData();
data.heightHint= getHeightHint(parent);
sep.setLayoutData(data);
updateMessageLabel();
}
public void setActionHandler(IAction actionHandler) {
if (fActionHandler != null && actionHandler == null && fMouseListener != null) {
if (!fLabel.isDisposed())
fLabel.removeMouseListener(fMouseListener);
fMouseListener= null;
}
fActionHandler= actionHandler;
if (fLabel != null && !fLabel.isDisposed() && fMouseListener == null && fActionHandler != null) {
fMouseListener= new Listener();
fLabel.addMouseListener(fMouseListener);
}
}
/**
* Returns the width hint for this label.
*
* @param control the root control of this label
* @return the width hint for this label
* @since 2.1
*/
private int getWidthHint(Composite control) {
if (fFixedWidth < 0) {
GC gc= new GC(control);
gc.setFont(control.getFont());
fFixedWidth = (int) gc.getFontMetrics().getAverageCharacterWidth() * fWidthInChars;
fFixedWidth += INDENT * 2;
gc.dispose();
}
return fFixedWidth;
}
/**
* Returns the height hint for this label.
*
* @param control the root control of this label
* @return the height hint for this label
* @since 3.0
*/
private int getHeightHint(Composite control) {
if (fFixedHeight < 0) {
GC gc= new GC(control);
gc.setFont(control.getFont());
fFixedHeight= gc.getFontMetrics().getHeight();
gc.dispose();
}
return fFixedHeight;
}
/**
* Updates the message label widget.
*
* @since 3.0
*/
private void updateMessageLabel() {
if (fLabel != null && !fLabel.isDisposed()) {
Display display= fLabel.getDisplay();
if ((fErrorText != null && !fErrorText.isEmpty()) || fErrorImage != null) {
fLabel.setForeground(JFaceColors.getErrorText(display));
fLabel.setText(fErrorText);
fLabel.setImage(fErrorImage);
if (fToolTipText != null)
fLabel.setToolTipText(fToolTipText);
else if (fErrorText.length() > fWidthInChars)
fLabel.setToolTipText(fErrorText);
else
fLabel.setToolTipText(null);
} else {
fLabel.setForeground(fLabel.getParent().getForeground());
fLabel.setText(fText);
fLabel.setImage(fImage);
if (fToolTipText != null)
fLabel.setToolTipText(fToolTipText);
else if (fText != null && fText.length() > fWidthInChars)
fLabel.setToolTipText(fText);
else
fLabel.setToolTipText(null);
}
}
}
public void setText(String message){
this.fText=message;
updateMessageLabel();
}
public void setErrorText(String message){
this.fErrorText=message;
updateMessageLabel();
}
}

View File

@ -0,0 +1,72 @@
package com.minres.scviewer.e4.application.internal.status;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
/**
* The Class TextContributionItem.
*/
class TextContributionItem extends ContributionItem {
/** The label string. */
final String labelString;
/** The text. */
CLabel label, text;
/** The content. */
private String content;
/**
* Instantiates a new text contribution item.
*
* @param labelString the label string
*/
public TextContributionItem(String labelString) {
super();
this.labelString = labelString;
content=""; //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Composite)
*/
@Override
public void fill(Composite parent) {
Composite box=new Composite(parent, SWT.NONE); //NONE
box.setLayout(new GridLayout(2, false));
label=new CLabel(box, SWT.SHADOW_NONE);
label.setText(labelString);
text=new CLabel(box, SWT.SHADOW_IN);
text.setAlignment(SWT.RIGHT);
text.setText(" ");
Point p = text.computeSize(SWT.DEFAULT, SWT.DEFAULT);
GridData layoutData=new GridData(SWT.DEFAULT, SWT.DEFAULT, true, false);
layoutData.minimumWidth=12*p.x;
text.setLayoutData(layoutData);
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.ContributionItem#isDynamic()
*/
@Override
public boolean isDynamic() {
return true;
}
/**
* Sets the text.
*
* @param message the new text
*/
public void setText(String message){
this.content=message;
if(text!=null && !text.isDisposed()) text.setText(content);
}
}

View File

@ -18,15 +18,8 @@ import org.eclipse.e4.ui.di.UIEventTopic;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import com.minres.scviewer.e4.application.Messages;
/**
@ -50,76 +43,9 @@ public class WaveStatusBarControl extends StatusBarControl {
@Inject
EModelService modelService;
/**
* The Class TextContributionItem.
*/
class TextContributionItem extends ContributionItem {
/** The label string. */
final String labelString;
/** The width. */
//final int width;
/** The text. */
CLabel label, text;
/** The content. */
private String content;
/**
* Instantiates a new text contribution item.
*
* @param labelString the label string
* @param width the width
*/
public TextContributionItem(String labelString /*, int width */) {
super();
this.labelString = labelString;
//this.width=width;
content=""; //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Composite)
*/
@Override
public void fill(Composite parent) {
Composite box=new Composite(parent, SWT.NONE); //NONE
box.setLayout(new GridLayout(2, false));
label=new CLabel(box, SWT.SHADOW_NONE);
label.setText(labelString);
text=new CLabel(box, SWT.SHADOW_IN);
text.setAlignment(SWT.RIGHT);
//GridData layoutData=new GridData(SWT.DEFAULT, SWT.DEFAULT, true, false);
GridData layoutData=new GridData(SWT.DEFAULT, SWT.DEFAULT, true, false);
layoutData.minimumWidth=70;
//layoutData.minimumWidth=width;
text.setLayoutData(layoutData);
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.ContributionItem#isDynamic()
*/
@Override
public boolean isDynamic() {
return true;
}
/**
* Sets the text.
*
* @param message the new text
*/
public void setText(String message){
this.content=message;
if(text!=null && !text.isDisposed()) text.setText(content);
}
}
/** The zoom contribution. */
TextContributionItem cursorContribution, markerContribution, markerDiffContribution, zoomContribution;
StatusLineContributionItem cursorContribution, markerContribution, markerDiffContribution, zoomContribution;
/**
* Instantiates a new wave status bar control.
@ -130,10 +56,10 @@ public class WaveStatusBarControl extends StatusBarControl {
public WaveStatusBarControl(UISynchronize sync) {
super(sync);
cursorContribution = new TextContributionItem(Messages.WaveStatusBarControl_5 /*, 150 */); //150
markerContribution = new TextContributionItem(Messages.WaveStatusBarControl_6 /*, 150 */); //150
markerDiffContribution = new TextContributionItem(Messages.WaveStatusBarControl_7 /*, 150 */); //150
zoomContribution = new TextContributionItem(Messages.WaveStatusBarControl_8 /*, 60 */); //60
cursorContribution = new StatusLineContributionItem(Messages.WaveStatusBarControl_5, true, 20);
markerContribution = new StatusLineContributionItem(Messages.WaveStatusBarControl_6, true, 20);
markerDiffContribution = new StatusLineContributionItem(Messages.WaveStatusBarControl_7, true, 20);
zoomContribution = new StatusLineContributionItem(Messages.WaveStatusBarControl_8, true, 8);
manager.appendToGroup(StatusLineManager.BEGIN_GROUP,cursorContribution);
manager.appendToGroup(StatusLineManager.BEGIN_GROUP,markerContribution);
manager.appendToGroup(StatusLineManager.BEGIN_GROUP,markerDiffContribution);

View File

@ -35,6 +35,7 @@ TransactionDetails_20=Time
TransactionDetails_21=End time
TransactionDetails_3=Value
TransactionDetails_4=Relation
WaveformPreferencesPage_description=Default Waveform Window Settings
WaveformPreferencesPage_1=Color for
WaveformViewer_13=Database Load Status
WaveformViewer_14=Database Load Cancelled
@ -55,3 +56,27 @@ WaveStatusBarControl_5=C:
WaveStatusBarControl_6=M:
WaveStatusBarControl_7=C-M:
WaveStatusBarControl_8=Z:
line=Track line
line_highlite=higlighted Track line
track_bg_even=even Track Background
track_bg_odd=odd Track Background
track_bg_highlite=highlighted Track Background
tx_bg=Transaction Background
tx_bg_highlite=highlighted Transaction Background
tx_border=Transaction Border
signal0=Signal Value '0'
signal1=Signal Value '1'
signalz=Signal Value 'Z'
signalx=Signal Value 'X'
signalu=Signal Value 'U'
signal_text=Signal text
signal_real=Signal real Value
signal_nan=Signal NaN Value
cursor=Cursor
cursor_drag=dragged Cursor
cursor_text=Cursor Text
marker=Marker
marker_text=Marker TExt
rel_arrow=Relation arrow
rel_arrow_highlite=highlighted Relation arrorw

View File

@ -18,7 +18,6 @@ import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;
import java.util.Vector;
import java.util.function.Function;
import java.util.regex.PatternSyntaxException;
import java.util.stream.Collectors;
@ -38,7 +37,6 @@ import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IElementComparer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
@ -152,15 +150,11 @@ public class TransactionDetails {
@Override
public void treeCollapsed(TreeExpansionEvent event) {
Object o = event.getElement();
TreePath[] paths = treeViewer.getExpandedTreePaths();
treeViewer.getSelection();
}
@Override
public void treeExpanded(TreeExpansionEvent event) {
Object o = event.getElement();
TreePath[] paths = treeViewer.getExpandedTreePaths();
treeViewer.getSelection();
}

View File

@ -31,21 +31,18 @@ import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.core.internal.preferences.InstancePreferences;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.core.runtime.jobs.JobGroup;
import org.eclipse.core.runtime.preferences.ConfigurationScope;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.di.extensions.Preference;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.di.PersistState;
@ -56,9 +53,7 @@ import org.eclipse.e4.ui.services.EMenuService;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
@ -84,7 +79,7 @@ import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Widget;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
import com.minres.scviewer.database.DataType;
import com.minres.scviewer.database.ITx;
@ -95,16 +90,16 @@ import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.IWaveformDbFactory;
import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.swt.Constants;
import com.minres.scviewer.database.swt.ToolTipContentProvider;
import com.minres.scviewer.database.swt.ToolTipHelpTextProvider;
import com.minres.scviewer.database.swt.WaveformViewerFactory;
import com.minres.scviewer.database.ui.GotoDirection;
import com.minres.scviewer.database.ui.ICursor;
import com.minres.scviewer.database.ui.IWaveformViewer;
import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.TrackEntry.ValueDisplay;
import com.minres.scviewer.database.ui.TrackEntry.WaveDisplay;
import com.minres.scviewer.database.ui.swt.Constants;
import com.minres.scviewer.database.ui.swt.ToolTipContentProvider;
import com.minres.scviewer.database.ui.swt.ToolTipHelpTextProvider;
import com.minres.scviewer.database.ui.swt.WaveformViewFactory;
import com.minres.scviewer.database.ui.WaveformColors;
import com.minres.scviewer.e4.application.Messages;
import com.minres.scviewer.e4.application.internal.status.WaveStatusBarControl;
@ -112,7 +107,6 @@ import com.minres.scviewer.e4.application.internal.util.FileMonitor;
import com.minres.scviewer.e4.application.internal.util.IFileChangeListener;
import com.minres.scviewer.e4.application.internal.util.IModificationChecker;
import com.minres.scviewer.e4.application.preferences.PreferenceConstants;
import com.opcoach.e4.preferences.ScopedPreferenceStore;
/**
* The Class WaveformViewerPart.
@ -170,10 +164,10 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
private static int disposeListenerNumber = 0;
/** The factory. */
WaveformViewerFactory factory = new WaveformViewerFactory();
WaveformViewFactory factory = new WaveformViewFactory();
/** The waveform pane. */
private IWaveformViewer waveformPane;
private IWaveformView waveformPane;
/** get UISynchronize injected as field */
@Inject UISynchronize sync;
@ -194,7 +188,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
@Inject
EPartService ePartService;
IPreferenceStore store = new ScopedPreferenceStore(ConfigurationScope.INSTANCE, PreferenceConstants.PREFERENCES_SCOPE);
IEclipsePreferences store = null;
@Inject @Optional DesignBrowser designBrowser;
@ -211,7 +205,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
private Composite myParent;
/** The files to load. */
ArrayList<File> filesToLoad;
ArrayList<File> filesToLoad = new ArrayList<>();
/** The persisted state. */
Map<String, String> persistedState;
@ -223,7 +217,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
private Object detailsSettings;
/** The navigation relation type. */
private RelationType navigationRelationType=IWaveformViewer.NEXT_PREV_IN_STREAM ;
private RelationType navigationRelationType=IWaveformView.NEXT_PREV_IN_STREAM ;
/** The file monitor. */
FileMonitor fileMonitor = new FileMonitor();
@ -231,6 +225,8 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
/** The file checker. */
IModificationChecker fileChecker;
private Boolean showHover;
/**
* Creates the composite.
*
@ -239,11 +235,13 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
* @param dbFactory the db factory
*/
@PostConstruct
public void createComposite(MPart part, Composite parent, IWaveformDbFactory dbFactory) {
public void createComposite(MPart part, Composite parent, IWaveformDbFactory dbFactory, @Preference(nodePath = PreferenceConstants.PREFERENCES_SCOPE) IEclipsePreferences prefs, @Preference(value = PreferenceConstants.SHOW_HOVER) Boolean hover) {
disposeListenerNumber += 1;
myPart = part;
myParent = parent;
store=prefs;
showHover=hover;
database = dbFactory.getDatabase();
database.addPropertyChangeListener(new PropertyChangeListener() {
@Override
@ -260,11 +258,11 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
});
waveformPane = factory.createPanel(parent);
waveformPane.setMaxTime(0);
setupColors();
//set selection to empty selection when opening a new waveformPane
selectionService.setSelection(new StructuredSelection());
waveformPane.addPropertyChangeListener(IWaveformViewer.CURSOR_PROPERTY, new PropertyChangeListener() {
waveformPane.addPropertyChangeListener(IWaveformView.CURSOR_PROPERTY, new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
Long time = (Long) evt.getNewValue();
@ -274,7 +272,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
}
});
waveformPane.addPropertyChangeListener(IWaveformViewer.MARKER_PROPERTY, new PropertyChangeListener() {
waveformPane.addPropertyChangeListener(IWaveformView.MARKER_PROPERTY, new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
Long time = (Long) evt.getNewValue();
@ -348,8 +346,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
});
zoomLevel = waveformPane.getZoomLevels();
setupColors();
checkForUpdates = store.getBoolean(PreferenceConstants.DATABASE_RELOAD);
checkForUpdates = store.getBoolean(PreferenceConstants.DATABASE_RELOAD, true);
filesToLoad = new ArrayList<File>();
persistedState = part.getPersistedState();
Integer files = persistedState.containsKey(DATABASE_FILE + "S") //$NON-NLS-1$
@ -378,23 +375,6 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
}
}
});
store.addPropertyChangeListener(new IPropertyChangeListener() {
@Override
public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
if (PreferenceConstants.DATABASE_RELOAD.equals(event.getProperty())) {
checkForUpdates = (Boolean)event.getNewValue();
fileChecker = null;
if (checkForUpdates)
fileChecker = fileMonitor.addFileChangeListener(WaveformViewer.this, filesToLoad,
FILE_CHECK_INTERVAL);
else
fileMonitor.removeFileChangeListener(WaveformViewer.this);
} else if (!PreferenceConstants.SHOW_HOVER.equals(event.getProperty())){
setupColors();
}
}
});
waveformPane.addDisposeListener(this);
waveformPane.getWaveformControl().setData(Constants.HELP_PROVIDER_TAG, new ToolTipHelpTextProvider() {
@ -406,7 +386,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
waveformPane.getWaveformControl().setData(Constants.CONTENT_PROVIDER_TAG, new ToolTipContentProvider() {
@Override
public boolean createContent(Composite parent, Point pt) {
if(!store.getBoolean(PreferenceConstants.SHOW_HOVER)) return false;
if(!showHover) return false;
List<Object> res = waveformPane.getElementsAt(pt);
if(res.size()>0)
if(res.get(0) instanceof ITx) {
@ -476,8 +456,6 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
final Font font = new Font(Display.getCurrent(), "Terminal", 10, SWT.NORMAL);
final Label label = new Label(parent, SWT.NONE);
//label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
//label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
label.setText(te.waveform.getFullName());
label.setFont(font);
GridData labelGridData = new GridData();
@ -491,35 +469,49 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
});
}
@Inject
@Optional
public void reactOnPrefsChange(@Preference(nodePath = PreferenceConstants.PREFERENCES_SCOPE) IEclipsePreferences prefs) {
prefs.addPreferenceChangeListener(this);
}
@Inject
@Optional
public void reactOnShowHoverChange(@Preference(nodePath = PreferenceConstants.PREFERENCES_SCOPE, value = PreferenceConstants.SHOW_HOVER) Boolean hover) {
showHover=hover;
}
@Inject
@Optional
public void reactOnReloadDatabaseChange(@Preference(nodePath = PreferenceConstants.PREFERENCES_SCOPE, value = PreferenceConstants.DATABASE_RELOAD) Boolean checkForUpdates) {
if (checkForUpdates) {
fileChecker = fileMonitor.addFileChangeListener(WaveformViewer.this, filesToLoad, FILE_CHECK_INTERVAL);
} else {
fileMonitor.removeFileChangeListener(WaveformViewer.this);
fileChecker = null;
}
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener#preferenceChange(org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent)
*/
@Override
public void preferenceChange(PreferenceChangeEvent event) {
InstancePreferences pref = (InstancePreferences)event.getSource();
if (PreferenceConstants.DATABASE_RELOAD.equals(event.getKey())) {
checkForUpdates = pref.getBoolean(PreferenceConstants.DATABASE_RELOAD, true);
fileChecker = null;
if (checkForUpdates)
fileChecker = fileMonitor.addFileChangeListener(WaveformViewer.this, filesToLoad,
FILE_CHECK_INTERVAL);
else
fileMonitor.removeFileChangeListener(this);
} else if (!PreferenceConstants.SHOW_HOVER.equals(event.getKey())){
if (!PreferenceConstants.DATABASE_RELOAD.equals(event.getKey()) && !PreferenceConstants.SHOW_HOVER.equals(event.getKey())){
setupColors();
}
try {
pref.flush();
} catch (BackingStoreException e) { }
}
/**
* Setup colors.
*/
protected void setupColors() {
Preferences defaultPrefs= store.parent().parent().node("/"+DefaultScope.SCOPE+"/"+PreferenceConstants.PREFERENCES_SCOPE);
HashMap<WaveformColors, RGB> colorPref = new HashMap<>();
for (WaveformColors c : WaveformColors.values()) {
String prefValue = store.getString(c.name() + "_COLOR"); //$NON-NLS-1$
String key = c.name() + "_COLOR";
String prefValue = store.get(key, defaultPrefs.get(key, "")); //$NON-NLS-1$
RGB rgb = StringConverter.asRGB(prefValue);
colorPref.put(c, rgb);
}
@ -535,9 +527,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
@Override
protected IStatus run(IProgressMonitor monitor) {
monitor.setTaskName(Messages.WaveformViewer_16+file.getName());
boolean res = database.load(file);
monitor.done();
database.addPropertyChangeListener(waveformPane);
return res?Status.OK_STATUS:Status.CANCEL_STATUS;
}
@ -549,15 +539,14 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
*/
protected void loadDatabase(final Map<String, String> state) {
fileMonitor.removeFileChangeListener(this);
MultiStatus fStatus= new MultiStatus("blah", IStatus.OK, Messages.WaveformViewer_13, null);
Job job = new Job(Messages.WaveformViewer_15) {
@Override
protected IStatus run(IProgressMonitor monitor) {
SubMonitor subMonitor = SubMonitor.convert(monitor, filesToLoad.size());
IProgressMonitor progressGroup = getJobManager().createProgressGroup();
JobGroup jobGroup = new JobGroup(Messages.WaveformViewer_15, filesToLoad.size(), filesToLoad.size());
filesToLoad.forEach((final File file) -> {
Job job = new DbLoadJob(Messages.WaveformViewer_16 + file.getName(), file);
job.setProgressGroup(subMonitor, 1);
job.setProgressGroup(progressGroup, 1);
job.setJobGroup(jobGroup);
job.schedule();
});
@ -569,34 +558,28 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
if (monitor.isCanceled())
throw new OperationCanceledException(Messages.WaveformViewer_14);
fStatus.addAll(jobGroup.getResult());
return fStatus;
}
};
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
IStatus result = event.getResult();
IStatus result = jobGroup.getResult();
if( (!result.isMultiStatus() && result.getCode() != Status.OK_STATUS.getCode() ) ||
(result.isMultiStatus() && result.getChildren().length > 0 && result.getChildren()[0].getCode() != Status.OK_STATUS.getCode() ) ){
(result.isMultiStatus() && result.getChildren().length > 0 && result.getChildren()[0].getCode() != Status.OK_STATUS.getCode() ) ){
// kill editor and pop up warning for user
sync.asyncExec(() -> {
final Display display = myParent.getDisplay();
MessageDialog.openWarning(display.getActiveShell(), "Error loading database", "Database cannot be loaded. Aborting...");
ePartService.hidePart(myPart, true);
ePartService.hidePart(myPart, true);
});
return;
}
sync.asyncExec(()->{
waveformPane.setMaxTime(database.getMaxTime());
if (state != null)
restoreWaveformViewerState(state);
fileChecker = null;
if (checkForUpdates)
fileChecker = fileMonitor.addFileChangeListener(WaveformViewer.this, filesToLoad, FILE_CHECK_INTERVAL);
});
} else
sync.asyncExec(()->{
waveformPane.setMaxTime(database.getMaxTime());
if (state != null)
restoreWaveformViewerState(state);
fileChecker = null;
if (checkForUpdates)
fileChecker = fileMonitor.addFileChangeListener(WaveformViewer.this, filesToLoad, FILE_CHECK_INTERVAL);
});
return result;
}
});
};
job.setSystem(true);
job.schedule(1000L); // let the UI initialize so that we have a progress monitor
}
@ -1022,55 +1005,13 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
setFocus();
}
/**
* Removes the stream from list.
*
* @param stream the stream
*/
public void removeStreamFromList(IWaveform stream) {
TrackEntry trackEntry = waveformPane.getEntryForStream(stream);
List<TrackEntry> streams = waveformPane.getStreamList();
ISelection sel = waveformPane.getSelection();
TrackEntry newSelection=null;
if(sel instanceof IStructuredSelection && ((IStructuredSelection) sel).size()==2) {
Iterator<?> it = ((IStructuredSelection)sel).iterator();
it.next();
int idx = streams.indexOf(it.next());
if(idx==streams.size()-1) {
//last stream gets deleted, no more selection
if(idx==0) {
newSelection=null;
}
//more than 1 stream left, last gets deleted, selection jumps to new last stream
else {
newSelection=streams.get(idx-1);
}
}
//more than 1 stream left, any stream but the last gets deleted, selection jumps to the next stream
else {
newSelection=streams.get(idx+1);
}
}
waveformPane.setSelection(new StructuredSelection());
streams.remove(trackEntry);
if(newSelection!=null) {
Object[] o = {newSelection};
waveformPane.setSelection(new StructuredSelection(o));
}
public void removeSelectedStreamsFromList() {
waveformPane.deleteSelectedTracks();
}
/**
* Removes the streams from list.
*
* @param iWaveforms the i waveforms
*/
public void removeStreamsFromList(IWaveform[] iWaveforms) {
for (IWaveform stream : iWaveforms)
removeStreamFromList(stream);
public void removeStreamFromList(ISelection sel) {
waveformPane.deleteSelectedTracks();
}
/**
* Move selected.
*
@ -1232,7 +1173,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
*/
public List<RelationType> getAllRelationTypes() {
List<RelationType> res =new ArrayList<>();
res.add(IWaveformViewer.NEXT_PREV_IN_STREAM);
res.add(IWaveformView.NEXT_PREV_IN_STREAM);
res.addAll(database.getAllRelationTypes());
return res;
}
@ -1244,7 +1185,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
*/
public List<RelationType> getSelectionRelationTypes() {
List<RelationType> res =new ArrayList<>();
res.add(IWaveformViewer.NEXT_PREV_IN_STREAM);
res.add(IWaveformView.NEXT_PREV_IN_STREAM);
ISelection selection = waveformPane.getSelection();
if(selection instanceof IStructuredSelection && !selection.isEmpty()){
IStructuredSelection sel=(IStructuredSelection) selection;

View File

@ -12,14 +12,14 @@ package com.minres.scviewer.e4.application.preferences;
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.wb.swt.SWTResourceManager;
import org.osgi.framework.FrameworkUtil;
import com.minres.scviewer.database.ui.WaveformColors;
import com.opcoach.e4.preferences.ScopedPreferenceStore;
/**
* The Class DefaultValuesInitializer.
@ -27,7 +27,7 @@ import com.opcoach.e4.preferences.ScopedPreferenceStore;
public class DefaultValuesInitializer extends AbstractPreferenceInitializer {
/** The default colors. */
public final Color[] colors = new Color[WaveformColors.values().length];
public static final Color[] colors = new Color[WaveformColors.values().length];
/**
* Instantiates a new default values initializer.
@ -64,21 +64,12 @@ public class DefaultValuesInitializer extends AbstractPreferenceInitializer {
*/
@Override
public void initializeDefaultPreferences() {
// IEclipsePreferences node = DefaultScope.INSTANCE.getNode(PreferenceConstants.PREFERENCES_SCOPE);
// if (node != null)
// {
// node.putBoolean(PreferenceConstants.DATABASE_RELOAD, true);
// node.putBoolean(PreferenceConstants.SHOW_HOVER, true);
// for (WaveformColors c : WaveformColors.values()) {
// node.put(c.name()+"_COLOR", StringConverter.asString(colors[c.ordinal()].getRGB())); //$NON-NLS-1$
// }
// }
IPreferenceStore store = new ScopedPreferenceStore(DefaultScope.INSTANCE, PreferenceConstants.PREFERENCES_SCOPE);
store.setDefault(PreferenceConstants.DATABASE_RELOAD, true);
store.setDefault(PreferenceConstants.SHOW_HOVER, true);
IEclipsePreferences store = DefaultScope.INSTANCE.getNode(FrameworkUtil.getBundle(getClass()).getSymbolicName());
store.putBoolean(PreferenceConstants.DATABASE_RELOAD, true);
store.putBoolean(PreferenceConstants.SHOW_HOVER, true);
for (WaveformColors c : WaveformColors.values()) {
store.setDefault(c.name()+"_COLOR", StringConverter.asString(colors[c.ordinal()].getRGB())); //$NON-NLS-1$
store.put(c.name()+"_COLOR", StringConverter.asString(colors[c.ordinal()].getRGB())); //$NON-NLS-1$
}
}

View File

@ -1,18 +0,0 @@
package com.minres.scviewer.e4.application.preferences;
import org.eclipse.core.runtime.preferences.ConfigurationScope;
import org.eclipse.jface.preference.IPreferenceStore;
import com.opcoach.e4.preferences.IPreferenceStoreProvider;
import com.opcoach.e4.preferences.ScopedPreferenceStore;
public class PreferencesStoreProvider implements IPreferenceStoreProvider{
public PreferencesStoreProvider(){
}
@Override
public IPreferenceStore getPreferenceStore() {
return new ScopedPreferenceStore(ConfigurationScope.INSTANCE, PreferenceConstants.PREFERENCES_SCOPE);
}
}

View File

@ -10,6 +10,9 @@
*******************************************************************************/
package com.minres.scviewer.e4.application.preferences;
import java.lang.reflect.Field;
import java.util.HashMap;
import org.eclipse.jface.preference.ColorFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
@ -26,6 +29,7 @@ public class WaveformPreferencesPage extends FieldEditorPreferencePage {
*/
public WaveformPreferencesPage() {
super(GRID);
setDescription(Messages.WaveformPreferencesPage_description);
}
/* (non-Javadoc)
@ -33,9 +37,18 @@ public class WaveformPreferencesPage extends FieldEditorPreferencePage {
*/
@Override
protected void createFieldEditors() {
Field[] declaredFields = Messages.class.getDeclaredFields();
HashMap<String, String> staticFields = new HashMap<String, String>();
for (Field field : declaredFields) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
try {
staticFields.put(field.getName(), (String)field.get(null));
} catch (IllegalArgumentException | IllegalAccessException e) {}
}
}
for (WaveformColors c : WaveformColors.values()) {
addField(new ColorFieldEditor(c.name() + "_COLOR", Messages.WaveformPreferencesPage_1 + c.name().toLowerCase(), //$NON-NLS-1$
addField(new ColorFieldEditor(c.name() + "_COLOR",
Messages.WaveformPreferencesPage_1 + staticFields.get(c.name().toLowerCase()), //$NON-NLS-1$
getFieldEditorParent()));
}
}

View File

@ -68,7 +68,9 @@ public class TxDbContentProvider implements ITreeContentProvider {
*/
@Override
public Object[] getElements(Object inputElement) {
if(inputElement instanceof IHierNode){
if(inputElement instanceof IWaveformDb){
return new Object[]{};
}else if(inputElement instanceof IHierNode){
Collection<IHierNode> res = Collections2.filter(((IHierNode)inputElement).getChildNodes(), new Predicate<IHierNode>(){
@Override
public boolean apply(IHierNode arg0) {
@ -82,8 +84,6 @@ public class TxDbContentProvider implements ITreeContentProvider {
return res.toArray();
}else if(inputElement instanceof List<?>){
return ((List<?>)inputElement).toArray();
}else if(inputElement instanceof IWaveformDb){
return new Object[]{};
} else
return null;
}

View File

@ -6,7 +6,6 @@ Bundle-Version: 1.0.1.qualifier
Bundle-Activator: com.minres.scviewer.ui.TxEditorPlugin
Bundle-Vendor: MINRES Technologies GmbH
Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0",
com.minres.scviewer.database.ui;bundle-version="1.0.0",
com.minres.scviewer.database.ui.swt;bundle-version="1.0.0",
org.eclipse.core.runtime,
org.eclipse.core.resources,

View File

@ -48,10 +48,10 @@ import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.IWaveformDbFactory;
import com.minres.scviewer.database.swt.WaveformViewerFactory;
import com.minres.scviewer.database.ui.GotoDirection;
import com.minres.scviewer.database.ui.IWaveformViewer;
import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.swt.WaveformViewFactory;
import com.minres.scviewer.ui.views.TxOutlinePage;
public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPageContributor {
@ -78,7 +78,7 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage
public static final String WAVE_ACTION_ID = "com.minres.scviewer.ui.action.AddToWave";
private IWaveformViewer txDisplay;
private IWaveformView txDisplay;
/** This is the root of the editor's model. */
private IWaveformDb database;
@ -112,10 +112,10 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage
}
}
});
WaveformViewerFactory factory = new WaveformViewerFactory();
WaveformViewFactory factory = new WaveformViewFactory();
txDisplay = factory.createPanel(parent);
txDisplay.setMaxTime(0);
txDisplay.addPropertyChangeListener(IWaveformViewer.CURSOR_PROPERTY, new PropertyChangeListener() {
txDisplay.addPropertyChangeListener(IWaveformView.CURSOR_PROPERTY, new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
Long time = (Long) evt.getNewValue();

10
pom.xml
View File

@ -13,13 +13,13 @@
<module>plugins/com.minres.scviewer.database.text</module>
<module>plugins/com.minres.scviewer.database.vcd</module>
<module>tests/com.minres.scviewer.database.test</module>
<module>plugins/com.minres.scviewer.database.ui</module>
<module>plugins/com.minres.scviewer.database.ui.swt</module>
<module>plugins/com.minres.scviewer.e4.application</module>
<module>plugins/com.minres.scviewer.ui</module>
<module>features/com.minres.scviewer.database.feature</module>
<module>features/com.minres.scviewer.ui.feature</module>
<module>features/com.minres.scviewer.feature</module>
<module>features/com.minres.scviewer.e4.platform.feature</module>
<module>features/com.minres.scviewer.e4.feature</module>
<module>p2repositories//com.minres.scviewer.updateSite</module>
<module>com.minres.scviewer.e4.product</module>
@ -39,7 +39,7 @@
<version>${tycho-version}</version>
<extensions>true</extensions>
</plugin>
<!--
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-source-plugin</artifactId>
@ -55,7 +55,7 @@
</executions>
</plugin>
<plugin>
<plugin>
<groupId>org.eclipse.tycho.extras</groupId>
<artifactId>tycho-source-feature-plugin</artifactId>
<version>${tycho-version}</version>
@ -72,12 +72,12 @@
<configuration>
<excludes>
<!-- provide plug-ins not containing any source code -->
provide plug-ins not containing any source code
<plugin id="org.codehaus.groovy" />
</excludes>
</configuration>
</plugin>
-->
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-p2-plugin</artifactId>

View File

@ -72,6 +72,7 @@
<setEntry value="org.eclipse.equinox.app@default:default"/>
<setEntry value="org.eclipse.equinox.bidi@default:default"/>
<setEntry value="org.eclipse.equinox.common@2:true"/>
<setEntry value="org.eclipse.equinox.ds@1:true"/>
<setEntry value="org.eclipse.equinox.preferences@default:default"/>
<setEntry value="org.eclipse.equinox.registry@default:default"/>
<setEntry value="org.eclipse.equinox.util@default:default"/>