From 2054426bcfb685c7b8764cdf909026e21438e4d0 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Thu, 1 Jan 2015 23:17:32 +0100 Subject: [PATCH] Reworked UI & renamed plugins --- com.itjw.txviewer.database.text/.gitignore | 1 + .../org.eclipse.jdt.groovy.core.prefs | 2 + .../META-INF/MANIFEST.MF | 5 +- .../txviewer/database/text/Activator.groovy | 5 +- .../txviewer/database/text/TrAttrType.groovy | 10 +- .../database/text/TrAttrTypeFactory.groovy | 6 +- .../txviewer/database/text/TrAttribute.groovy | 17 +- .../txviewer/database/text/TrRelation.groovy | 36 ++ .../txviewer/database/text/TrStream.groovy | 35 +- .../txviewer/database/text/TrTextDb.groovy | 62 +-- .../database/text/TrTextDbFactory.groovy | 13 + .../txviewer/database/text/Transaction.groovy | 108 ++--- com.itjw.txviewer.database/.gitignore | 1 + .../META-INF/MANIFEST.MF | 3 +- .../itjw/txviewer/database/EventTime.class | Bin 2349 -> 0 bytes .../itjw/txviewer/database/ITrAttrType.class | Bin 189 -> 0 bytes .../itjw/txviewer/database/ITrAttribute.class | Bin 220 -> 0 bytes .../com/itjw/txviewer/database/ITrDb.class | Bin 494 -> 0 bytes .../itjw/txviewer/database/ITrGenerator.class | Bin 404 -> 0 bytes .../itjw/txviewer/database/ITrHierNode.class | Bin 479 -> 0 bytes .../itjw/txviewer/database/ITrStream.class | Bin 568 -> 0 bytes .../itjw/txviewer/database/ITransaction.class | Bin 721 -> 0 bytes .../database/InputFormatException.class | Bin 406 -> 0 bytes .../itjw/txviewer/database/RelationType.class | Bin 1284 -> 0 bytes .../com/itjw/txviewer/database/EventTime.java | 5 + .../itjw/txviewer/database/ITrAttrType.java | 4 +- .../src/com/itjw/txviewer/database/ITrDb.java | 2 + .../itjw/txviewer/database/ITrRelation.java | 10 + .../itjw/txviewer/database/ITransaction.java | 15 +- .../database/ITransactionDbFactory.java | 7 + .../itjw/txviewer/database/RelationType.java | 19 +- com.itjw.txviewer.feature/feature.xml | 2 +- .../txviewer/graph/TrHierNodeSelection.class | Bin 2088 -> 0 bytes .../txviewer/graph/TransactionSelection.class | Bin 2651 -> 0 bytes .../itjw/txviewer/graph/TxEditorPart$1.class | Bin 1036 -> 0 bytes .../itjw/txviewer/graph/TxEditorPart.class | Bin 7137 -> 0 bytes .../itjw/txviewer/graph/TxEditorPlugin.class | Bin 3710 -> 0 bytes .../itjw/txviewer/graph/TxOutlinePage$1.class | Bin 948 -> 0 bytes .../itjw/txviewer/graph/TxOutlinePage.class | Bin 6376 -> 0 bytes .../txviewer/graph/actions/AddToWave.class | Bin 482 -> 0 bytes .../graph/actions/TxActionFactory$1.class | Bin 3082 -> 0 bytes .../graph/actions/TxActionFactory$2.class | Bin 2300 -> 0 bytes .../graph/actions/TxActionFactory.class | Bin 2607 -> 0 bytes .../txviewer/graph/data/ITrDbFacade.class | Bin 3933 -> 0 bytes .../graph/data/ITrHierNodeFacade.class | Bin 4473 -> 0 bytes .../txviewer/graph/data/ITrStreamFacade.class | Bin 3855 -> 0 bytes .../graph/data/ITransactionFacade.class | Bin 2087 -> 0 bytes .../graph/data/ITransactionProperties.class | Bin 3910 -> 0 bytes .../txviewer/graph/ui/swt/ListPane$1.class | Bin 858 -> 0 bytes .../txviewer/graph/ui/swt/ListPane$2.class | Bin 1058 -> 0 bytes .../itjw/txviewer/graph/ui/swt/ListPane.class | Bin 8072 -> 0 bytes .../txviewer/graph/ui/swt/NameListPane.class | Bin 947 -> 0 bytes .../graph/ui/swt/SWTImageCanvas$1.class | Bin 863 -> 0 bytes .../graph/ui/swt/SWTImageCanvas$2.class | Bin 1046 -> 0 bytes .../graph/ui/swt/SWTImageCanvas$3.class | Bin 1069 -> 0 bytes .../graph/ui/swt/SWTImageCanvas$4.class | Bin 1069 -> 0 bytes .../graph/ui/swt/SWTImageCanvas.class | Bin 9430 -> 0 bytes .../txviewer/graph/ui/swt/TxDisplay$1.class | Bin 2098 -> 0 bytes .../txviewer/graph/ui/swt/TxDisplay$2.class | Bin 1455 -> 0 bytes .../txviewer/graph/ui/swt/TxDisplay$3.class | Bin 1455 -> 0 bytes .../txviewer/graph/ui/swt/TxDisplay$4.class | Bin 1303 -> 0 bytes .../txviewer/graph/ui/swt/TxDisplay$5.class | Bin 906 -> 0 bytes .../txviewer/graph/ui/swt/TxDisplay.class | Bin 7649 -> 0 bytes .../txviewer/graph/ui/swt/ValueListPane.class | Bin 1322 -> 0 bytes .../graph/ui/swt/WaveImageCanvas.class | Bin 10440 -> 0 bytes .../com/itjw/txviewer/graph/util/Pair.class | Bin 2138 -> 0 bytes .../graph/views/SelectionPropertiesView.class | Bin 840 -> 0 bytes .../graph/views/SelectionTableView$1.class | Bin 989 -> 0 bytes .../graph/views/SelectionTableView.class | Bin 4562 -> 0 bytes .../txviewer/graph/views/TxDbView$1.class | Bin 910 -> 0 bytes .../txviewer/graph/views/TxDbView$2.class | Bin 759 -> 0 bytes .../txviewer/graph/views/TxDbView$3.class | Bin 759 -> 0 bytes .../txviewer/graph/views/TxDbView$4.class | Bin 1431 -> 0 bytes .../txviewer/graph/views/TxDbView$5.class | Bin 976 -> 0 bytes .../graph/views/TxDbView$NameSorter.class | Bin 562 -> 0 bytes .../graph/views/TxDbView$TreeObject.class | Bin 1424 -> 0 bytes .../graph/views/TxDbView$TreeParent.class | Bin 1727 -> 0 bytes .../views/TxDbView$ViewContentProvider.class | Bin 2829 -> 0 bytes .../views/TxDbView$ViewLabelProvider.class | Bin 1464 -> 0 bytes .../itjw/txviewer/graph/views/TxDbView.class | Bin 7037 -> 0 bytes .../provider/TxDbTreeContentProvider.class | Bin 1673 -> 0 bytes .../provider/TxDbTreeLabelProvider.class | Bin 2180 -> 0 bytes .../views/sections/AttributeProperty$1.class | Bin 3890 -> 0 bytes .../views/sections/AttributeProperty$2.class | Bin 2548 -> 0 bytes .../views/sections/AttributeProperty$3.class | Bin 1684 -> 0 bytes .../views/sections/AttributeProperty.class | Bin 6955 -> 0 bytes .../views/sections/RelatedProperty$1.class | Bin 3702 -> 0 bytes .../views/sections/RelatedProperty$2.class | Bin 1947 -> 0 bytes .../views/sections/RelatedProperty$3.class | Bin 1113 -> 0 bytes .../views/sections/RelatedProperty.class | Bin 8262 -> 0 bytes com.itjw.txviewer.graph/plugin.xml | 100 ---- .../txviewer/graph/TrHierNodeSelection.java | 71 --- .../txviewer/graph/TransactionSelection.java | 77 --- .../txviewer/graph/actions/AddToWave.java | 25 - .../graph/actions/TxActionFactory.java | 113 ----- .../itjw/txviewer/graph/data/ITrDbFacade.java | 96 ---- .../graph/data/ITrHierNodeFacade.java | 160 ------- .../txviewer/graph/data/ITrStreamFacade.java | 112 ----- .../graph/data/ITransactionFacade.java | 80 ---- .../itjw/txviewer/graph/ui/swt/ListPane.java | 172 ------- .../txviewer/graph/ui/swt/NameListPane.java | 33 -- .../txviewer/graph/ui/swt/SWTImageCanvas.java | 386 --------------- .../itjw/txviewer/graph/ui/swt/TxDisplay.java | 180 ------- .../txviewer/graph/ui/swt/ValueListPane.java | 40 -- .../graph/ui/swt/WaveImageCanvas.java | 223 --------- .../com/itjw/txviewer/graph/util/Pair.java | 66 --- .../itjw/txviewer/graph/views/TxDbView.java | 304 ------------ .../.classpath | 2 +- com.itjw.txviewer.ui/.gitignore | 1 + .../.project | 2 +- .../org.eclipse.jdt.groovy.core.prefs | 2 + .../META-INF/MANIFEST.MF | 12 +- .../build.properties | 3 +- .../contexts.xml | 0 .../icons/sample.gif | Bin com.itjw.txviewer.ui/plugin.xml | 110 +++++ .../res/images/database.png | Bin .../res/images/folder.png | Bin .../res/images/stream.png | Bin .../ui/TxEditorActionBarContributor.java | 11 + .../com/itjw/txviewer/ui/TxEditorInput.java | 32 ++ .../txviewer/ui/TxEditorInputFactory.java | 99 ++++ .../com/itjw/txviewer/ui}/TxEditorPart.java | 146 +++--- .../com/itjw/txviewer/ui}/TxEditorPlugin.java | 21 +- .../txviewer/ui/adapter/AdapterFactory.java | 24 + .../adapter/ITransactionPropertySource.java | 58 +-- .../src/com/itjw/txviewer/ui/swt/Ruler.java | 99 ++++ .../src/com/itjw/txviewer/ui/swt/Track.java | 203 ++++++++ .../com/itjw/txviewer/ui/swt/Transaction.java | 75 +++ .../com/itjw/txviewer/ui/swt/TxDisplay.java | 390 +++++++++++++++ .../ui}/views/SelectionTableView.java | 2 +- .../ui/views/TransactionPropertySheet.java | 12 +- .../txviewer/ui/views}/TxOutlinePage.java | 89 +++- .../provider/TxDbTreeContentProvider.java | 2 +- .../views/provider/TxDbTreeLabelProvider.java | 4 +- .../ui}/views/sections/AttributeProperty.java | 75 +-- .../ui}/views/sections/RelatedProperty.java | 135 ++++-- .../eclipse/wb/swt/SWTResourceManager.java | 447 ++++++++++++++++++ com.itjw.txviewer.ui/swing2swt.jar | Bin 0 -> 33195 bytes com.itjw.txviewer.updateSite/.project | 17 + com.itjw.txviewer.updateSite/index.html | 60 +++ com.itjw.txviewer.updateSite/site.xml | 7 + com.itjw.txviewer.updateSite/web/site.css | 12 + com.itjw.txviewer.updateSite/web/site.xsl | 214 +++++++++ 144 files changed, 2335 insertions(+), 2637 deletions(-) create mode 100644 com.itjw.txviewer.database.text/.gitignore create mode 100644 com.itjw.txviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrRelation.groovy create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrTextDbFactory.groovy create mode 100644 com.itjw.txviewer.database/.gitignore delete mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/EventTime.class delete mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrAttrType.class delete mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrAttribute.class delete mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrDb.class delete mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrGenerator.class delete mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrHierNode.class delete mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrStream.class delete mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITransaction.class delete mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/InputFormatException.class delete mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/RelationType.class create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrRelation.java create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITransactionDbFactory.java delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TrHierNodeSelection.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TransactionSelection.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxEditorPart$1.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxEditorPart.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxEditorPlugin.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxOutlinePage$1.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxOutlinePage.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/AddToWave.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/TxActionFactory$1.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/TxActionFactory$2.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/TxActionFactory.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrDbFacade.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrHierNodeFacade.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrStreamFacade.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITransactionFacade.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITransactionProperties.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ListPane$1.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ListPane$2.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ListPane.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/NameListPane.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$1.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$2.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$3.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$4.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$1.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$2.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$3.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$4.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$5.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ValueListPane.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/WaveImageCanvas.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/util/Pair.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionPropertiesView.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionTableView$1.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionTableView.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$1.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$2.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$3.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$4.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$5.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$NameSorter.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$TreeObject.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$TreeParent.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$ViewContentProvider.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$ViewLabelProvider.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$1.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$2.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$3.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$1.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$2.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$3.class delete mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty.class delete mode 100644 com.itjw.txviewer.graph/plugin.xml delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TrHierNodeSelection.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TransactionSelection.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/AddToWave.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/TxActionFactory.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrDbFacade.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrHierNodeFacade.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrStreamFacade.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionFacade.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ListPane.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/NameListPane.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/TxDisplay.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ValueListPane.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/WaveImageCanvas.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/util/Pair.java delete mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/TxDbView.java rename {com.itjw.txviewer.graph => com.itjw.txviewer.ui}/.classpath (83%) create mode 100644 com.itjw.txviewer.ui/.gitignore rename {com.itjw.txviewer.graph => com.itjw.txviewer.ui}/.project (94%) create mode 100644 com.itjw.txviewer.ui/.settings/org.eclipse.jdt.groovy.core.prefs rename {com.itjw.txviewer.graph => com.itjw.txviewer.ui}/META-INF/MANIFEST.MF (59%) rename {com.itjw.txviewer.graph => com.itjw.txviewer.ui}/build.properties (75%) rename {com.itjw.txviewer.graph => com.itjw.txviewer.ui}/contexts.xml (100%) rename {com.itjw.txviewer.graph => com.itjw.txviewer.ui}/icons/sample.gif (100%) create mode 100644 com.itjw.txviewer.ui/plugin.xml rename {com.itjw.txviewer.graph => com.itjw.txviewer.ui}/res/images/database.png (100%) rename {com.itjw.txviewer.graph => com.itjw.txviewer.ui}/res/images/folder.png (100%) rename {com.itjw.txviewer.graph => com.itjw.txviewer.ui}/res/images/stream.png (100%) create mode 100644 com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorActionBarContributor.java create mode 100644 com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorInput.java create mode 100644 com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorInputFactory.java rename {com.itjw.txviewer.graph/src/com/itjw/txviewer/graph => com.itjw.txviewer.ui/src/com/itjw/txviewer/ui}/TxEditorPart.java (53%) rename {com.itjw.txviewer.graph/src/com/itjw/txviewer/graph => com.itjw.txviewer.ui/src/com/itjw/txviewer/ui}/TxEditorPlugin.java (88%) create mode 100644 com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/adapter/AdapterFactory.java rename com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionProperties.java => com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/adapter/ITransactionPropertySource.java (56%) create mode 100644 com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Ruler.java create mode 100644 com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Track.java create mode 100644 com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Transaction.java create mode 100644 com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/TxDisplay.java rename {com.itjw.txviewer.graph/src/com/itjw/txviewer/graph => com.itjw.txviewer.ui/src/com/itjw/txviewer/ui}/views/SelectionTableView.java (98%) rename com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionPropertiesView.java => com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/TransactionPropertySheet.java (74%) rename {com.itjw.txviewer.graph/src/com/itjw/txviewer/graph => com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views}/TxOutlinePage.java (58%) rename {com.itjw.txviewer.graph/src/com/itjw/txviewer/graph => com.itjw.txviewer.ui/src/com/itjw/txviewer/ui}/views/provider/TxDbTreeContentProvider.java (96%) rename {com.itjw.txviewer.graph/src/com/itjw/txviewer/graph => com.itjw.txviewer.ui/src/com/itjw/txviewer/ui}/views/provider/TxDbTreeLabelProvider.java (95%) rename {com.itjw.txviewer.graph/src/com/itjw/txviewer/graph => com.itjw.txviewer.ui/src/com/itjw/txviewer/ui}/views/sections/AttributeProperty.java (81%) rename {com.itjw.txviewer.graph/src/com/itjw/txviewer/graph => com.itjw.txviewer.ui/src/com/itjw/txviewer/ui}/views/sections/RelatedProperty.java (62%) create mode 100644 com.itjw.txviewer.ui/src/org/eclipse/wb/swt/SWTResourceManager.java create mode 100644 com.itjw.txviewer.ui/swing2swt.jar create mode 100644 com.itjw.txviewer.updateSite/.project create mode 100644 com.itjw.txviewer.updateSite/index.html create mode 100644 com.itjw.txviewer.updateSite/site.xml create mode 100644 com.itjw.txviewer.updateSite/web/site.css create mode 100644 com.itjw.txviewer.updateSite/web/site.xsl diff --git a/com.itjw.txviewer.database.text/.gitignore b/com.itjw.txviewer.database.text/.gitignore new file mode 100644 index 0000000..5e56e04 --- /dev/null +++ b/com.itjw.txviewer.database.text/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/com.itjw.txviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs b/com.itjw.txviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs new file mode 100644 index 0000000..a7f72ec --- /dev/null +++ b/com.itjw.txviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +groovy.compiler.level=23 diff --git a/com.itjw.txviewer.database.text/META-INF/MANIFEST.MF b/com.itjw.txviewer.database.text/META-INF/MANIFEST.MF index 83a6192..71e863d 100644 --- a/com.itjw.txviewer.database.text/META-INF/MANIFEST.MF +++ b/com.itjw.txviewer.database.text/META-INF/MANIFEST.MF @@ -5,9 +5,8 @@ Bundle-SymbolicName: com.itjw.txviewer.database.text Bundle-Version: 1.0.0.qualifier Bundle-Activator: com.itjw.txviewer.database.text.Activator Bundle-Vendor: ITJW -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Import-Package: com.itjw.txviewer.database, org.osgi.framework;version="1.3.0" Require-Bundle: com.itjw.txviewer.database;bundle-version="1.0.0", - org.codehaus.groovy;bundle-version="1.8.6", - org.eclipse.ui.views;bundle-version="3.6.0" + org.codehaus.groovy;bundle-version="1.8.6" diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Activator.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Activator.groovy index fa88304..2668eff 100644 --- a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Activator.groovy +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Activator.groovy @@ -13,9 +13,12 @@ package com.itjw.txviewer.database.text; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; + import java.util.Dictionary import java.util.Hashtable + import com.itjw.txviewer.database.ITrDb; +import com.itjw.txviewer.database.ITransactionDbFactory; public class Activator implements BundleActivator { @@ -33,7 +36,7 @@ public class Activator implements BundleActivator { Activator.context = bundleContext; Dictionary dict = new Hashtable(); dict.putAt(Constants.SERVICE_RANKING, 1); - context.registerService(ITrDb.class, new TrTextDb(), dict); + context.registerService(ITransactionDbFactory.class, new TrTextDbFactory(), dict); } /* diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrType.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrType.groovy index c2d41b8..93d87d4 100644 --- a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrType.groovy +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrType.groovy @@ -14,14 +14,16 @@ import com.itjw.txviewer.database.ITrAttrType; class TrAttrType implements ITrAttrType { String name - String type + String dataType + ITrAttrType.AttributeType type - static TrAttrType getAttrType(String name, String type){ - TrAttrTypeFactory.instance.getAttrType(name, type) + static TrAttrType getAttrType(String name, String dataType, ITrAttrType.AttributeType type){ + TrAttrTypeFactory.instance.getAttrType(name, dataType, type) } - TrAttrType(String name, String type){ + TrAttrType(String name, String dataType, ITrAttrType.AttributeType type){ this.name=name + this.dataType=dataType this.type=type } } diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrTypeFactory.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrTypeFactory.groovy index 9e5b836..6a97e75 100644 --- a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrTypeFactory.groovy +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrTypeFactory.groovy @@ -22,13 +22,13 @@ class TrAttrTypeFactory { TrAttrTypeFactory.metaClass.constructor = {-> instance } } - ITrAttrType getAttrType(String name, String type){ - def key = name+":"+type + ITrAttrType getAttrType(String name, String dataType, ITrAttrType.AttributeType type){ + def key = name+":"+dataType ITrAttrType res if(attributes.containsKey(key)){ res=attributes[key] } else { - res=new TrAttrType(name, type) + res=new TrAttrType(name, dataType, type) attributes[key]=res } return res diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttribute.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttribute.groovy index 08c0710..d6d04e1 100644 --- a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttribute.groovy +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttribute.groovy @@ -10,16 +10,18 @@ *******************************************************************************/ package com.itjw.txviewer.database.text +import com.itjw.txviewer.database.ITrAttrType; import com.itjw.txviewer.database.ITrAttribute class TrAttribute implements ITrAttribute{ TrAttrType attributeType + def value - TrAttribute(String name, String type, value){ - attributeType = TrAttrTypeFactory.instance.getAttrType(name, type) - switch(type){ + TrAttribute(String name, String dataType, ITrAttrType.AttributeType type, value){ + attributeType = TrAttrTypeFactory.instance.getAttrType(name, dataType, type) + switch(dataType){ case "STRING": case "ENUMERATION": this.value=value[1..-2] @@ -34,7 +36,7 @@ class TrAttribute implements ITrAttribute{ } TrAttribute(TrAttrType other, value){ - this(other.name, other.type, value) + this(other.name, other.dataType, other.type, value) } @Override @@ -43,8 +45,13 @@ class TrAttribute implements ITrAttribute{ } @Override - public String getType() { + public ITrAttrType.AttributeType getType() { return attributeType.getType(); } + @Override + public String getDataType() { + return attributeType.getDataType(); + } + } diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrRelation.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrRelation.groovy new file mode 100644 index 0000000..b7e27e6 --- /dev/null +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrRelation.groovy @@ -0,0 +1,36 @@ +package com.itjw.txviewer.database.text + +import com.itjw.txviewer.database.ITrRelation +import com.itjw.txviewer.database.ITransaction; +import com.itjw.txviewer.database.RelationType; + +class TrRelation implements ITrRelation { + Transaction source + + Transaction target + + RelationType relationType + + + public TrRelation(RelationType relationType, Transaction source, Transaction target) { + this.source = source; + this.target = target; + this.relationType = relationType; + } + + @Override + public RelationType getRelationType() { + return relationType; + } + + @Override + public ITransaction getSource() { + return source; + } + + @Override + public ITransaction getTarget() { + return target; + } + +} diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrStream.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrStream.groovy index c223d83..a629c04 100644 --- a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrStream.groovy +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrStream.groovy @@ -21,19 +21,27 @@ import com.itjw.txviewer.database.ITrStream import com.itjw.txviewer.database.ITransaction class TrStream extends TrHierNode implements ITrStream { + Long id; - TrTextDb database - String name; - String fullName; - String kind; - def generators = []; - def childs = [] - private allTransactions; + TrTextDb database + + String name; + + String fullName; + + String kind; + + def generators = []; + + def childs = [] + + private allTransactions; + public TrHierNode(String name){ this.name=name } - + @Override public List getChildNodes() { return childs.sort{it.name}; @@ -63,11 +71,11 @@ class TrStream extends TrHierNode implements ITrStream { getTransactions().each{Transaction tx -> def rowIdx = 0 for(rowIdx=0; rowendtime.size()tx.beginTime.value; rowIdx++); - if(rowendtime.size<=rowIdx){ - rowendtime< stream.fullName == name } + } + public List getAllStreams() { return new LinkedList(streams); } @@ -90,14 +99,14 @@ public class TrTextDb extends TrHierNode implements ITrDb{ streamsById[id]=stream } else if ((matcher = line =~ /^scv_tr_generator\s+\(ID\s+(\d+),\s+name\s+"([^"]+)",\s+scv_tr_stream\s+(\d+),$/)) { def id = Integer.parseInt(matcher[0][1]) - TrStream stream=streamsById[Integer.parseInt(matcher[0][3])] + ITrStream stream=streamsById[Integer.parseInt(matcher[0][3])] generator=new TrGenerator(id, stream, matcher[0][2]) stream.generators< - def sortedTx = gen.transactions.sort{it.beginTime} - if(sortedTx.size()>1) - for(int i=1;i def hier = stream.fullName.split(/\./) diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrTextDbFactory.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrTextDbFactory.groovy new file mode 100644 index 0000000..fd8706c --- /dev/null +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrTextDbFactory.groovy @@ -0,0 +1,13 @@ +package com.itjw.txviewer.database.text + +import com.itjw.txviewer.database.ITrDb +import com.itjw.txviewer.database.ITransactionDbFactory; + +class TrTextDbFactory implements ITransactionDbFactory { + + @Override + public ITrDb createDatabase() { + return new TrTextDb(); + } + +} diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Transaction.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Transaction.groovy index 9d0ea30..58646cd 100644 --- a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Transaction.groovy +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Transaction.groovy @@ -10,95 +10,43 @@ *******************************************************************************/ package com.itjw.txviewer.database.text +import java.util.Collection; import java.util.Set -import com.itjw.txviewer.database.* -import org.eclipse.ui.views.properties.IPropertyDescriptor -import org.eclipse.ui.views.properties.IPropertySource -class Transaction implements IPropertySource, ITransaction { - Long id - TrGenerator generator - EventTime beginTime - EventTime endTime - ArrayList begin_attrs = new ArrayList() - ArrayList end_attrs = new ArrayList() - ArrayList attributes = new ArrayList() - Transaction prev, next - def pred =[] - def succ =[] - def parent =[] - def child =[] +import com.itjw.txviewer.database.* + +class Transaction implements ITransaction { - Transaction(int id, TrGenerator generator, EventTime begin){ + Long id + + TrGenerator generator + + TrStream stream + + EventTime beginTime + + EventTime endTime + + ArrayList attributes = new ArrayList() + + def incomingRelations =[] + + def outgoingRelations =[] + + Transaction(int id, TrStream stream, TrGenerator generator, EventTime begin){ this.id=id this.generator=generator this.beginTime=begin } - - @Override - List getBeginAttrs() { - return begin_attrs - } @Override - List getEndAttrs() { - return end_attrs + public Collection getIncomingRelations() { + return incomingRelations; + } + + @Override + public Collection getOutgoingRelations() { + return outgoingRelations; } - List getAttributes(){ - return attributes - } - - @Override - public Set getNextInRelationship(RelationType rel) { - switch(rel){ - case RelationType.PREDECESSOR: - return pred - break - case RelationType.SUCCESSOR: - return succ - break - case RelationType.PREVIOUS: - return [prev] - break - case RelationType.NEXT: - return[next] - break - case RelationType.PARENT: - return parent - break - case RelationType.CHILD: - return child - break - } - } - - @Override - public Object getEditableValue() { - // TODO Auto-generated method stub - return null; - } - - @Override - public IPropertyDescriptor[] getPropertyDescriptors() { - return null; - } - - @Override - public Object getPropertyValue(Object id) { - return null; - } - - @Override - public boolean isPropertySet(Object id) { - return false; - } - - @Override - public void resetPropertyValue(Object id) { - } - - @Override - public void setPropertyValue(Object id, Object value) { - } } diff --git a/com.itjw.txviewer.database/.gitignore b/com.itjw.txviewer.database/.gitignore new file mode 100644 index 0000000..5e56e04 --- /dev/null +++ b/com.itjw.txviewer.database/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/com.itjw.txviewer.database/META-INF/MANIFEST.MF b/com.itjw.txviewer.database/META-INF/MANIFEST.MF index aa871f2..cb39807 100644 --- a/com.itjw.txviewer.database/META-INF/MANIFEST.MF +++ b/com.itjw.txviewer.database/META-INF/MANIFEST.MF @@ -4,7 +4,6 @@ Bundle-Name: Transaction Database Bundle-SymbolicName: com.itjw.txviewer.database Bundle-Version: 1.0.0.qualifier Bundle-Vendor: ITJW -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ActivationPolicy: lazy Export-Package: com.itjw.txviewer.database -Require-Bundle: org.eclipse.ui.views diff --git a/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/EventTime.class b/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/EventTime.class deleted file mode 100644 index 996c14db9974525c9b7b53d9f437ab6798a81013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2349 zcma)7OK%%h6#lN?F_T9fH>FK!-1HIKY3shBI7E51YOJIUaT+Ml!Z@BLlh`w6JWgQ8 z0B??*yr4P&iTG`zB76D?;n2wxQdN9 zLIP)(?0Ug;S2qgoXX~c1VK{}V?&=l2X%ud+8yKy`ejLrDh0(?v(|^ltAaCZ8crpau@Yl%ZQC%`tl1_2XD-lW8=@C8=e(i zm&Xh#3B*QB%XCKt&Shuzvd`Goaxq|+UB{#+wl-7}_T+-ubo;FR0;qHzer%54$F6RPmCpSn~s*} zC~iGN0@HNVmE*-f-}Rsav$!9}z5R$jZ@NZZ!yMivJHv5^z-ygp7v?A$mlzDaUW|hb zkL`)WgErAJYgNNZ;DJE@lx+>UnKjGa$ZV|WZpO7URXej`x+|F^=JB4?+x!2+kP4i~ z2O2)aN7S_5Xc$&i;Nn5ecxAFah++bdxf4m5=@Sh)DxA1$dqBB++1x9U#U!eD5(oR< ztElZKtzlULjy7Z;xSeHJUs{{h8%nKmz^fY8P!ou&g}nbnk}Dlhh6}ViY=K<%aQe=1 zfKl6BG2~E!o$%f$#oV-%qNAY>i&8AxEoaHNV@lC>?Y@mJNnWg9HkU2kZ8_QuF{H$`EmVR}b;;mkEB8@@%GF}AE;4Ce9ryJ*(PyRZOAyyK|;-p`ppll$T z{}s6(cqv5KKuiT3QwcToJL)GCa>f1N5g%Sc27f(d|M*gTzl!f;PLS*lpad=|>H?Qg z@H1T{XbCZqPb1mJ<(D%J1d!}x68r~rP<-bB@n;TKDxXiTQ`Ag{N5L@x#<3KHB)WjU~w?tY&(X5&@?d z<@~xhgFg0ufE^shWn9MpL2Fn0p6 zzBK<%uoHaI_`SXDtEpc?luAisqW(KfVoi;CIDcYrPBR+)Rs_Ko3sny(-Z#l3Y}jPW=B4d#^WYEgM~N?~ zcoA|~cIPoOyEFUs{qYF^w{YP@N5EBVbEzp?OWLe7uF=Uvk&0A_a<*_!kq@4LL8ewp z8daq7Ey^$^A9e*?w`-p@x>uW^fL@C9qBaYiGYEpwyhS)!VL>%>ETGT2M`J>AsPa<4 zkfqH_D$+*IbxBOx4|Q57svLXY{UhAB-Nga7-s1;0@{Co9fXiTehqiK7EGznDjNUoN zWE10(v@J>>P6Wu79F2BrU9RX)C7>G{R8GK7(D;S6axqS|sY`0=zNzzZw@l&H<)8An le;@Yvz*(Wk(*vG%;E-`2ju;=;EZzq^8Nw+e0cQ>8{09{oh{FH? diff --git a/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrGenerator.class b/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrGenerator.class deleted file mode 100644 index d15efb48dfcdfbe02fae384f96a8c7e953d75107..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmaiw%TB^j5QhJQKm{*=@g2mCCvl6ql#n#KC@(OSNpqU^G&!Au&*s7h@S%)Djffjv z%_Q^9H<$O1*EaySm_+CpT%}cMo#b09FB`{O4t7mKE2`NpmSN7G14$JkbPdKiZO9hn zGyA;CITeFm#ccxSa=bDY$Z2SqbJ#U%- diff --git a/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrHierNode.class b/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrHierNode.class deleted file mode 100644 index 9214e2078dcebbfd2440f2853f1302c4c26959ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcma)(&rZTX5XQenr2?WA^ZQ>ksdlyM)x0jVas$hx0Nid zPGofe3$|uD%9Je)&m8>$M&AE?8$Pg9dzP0bpovac%iVGHuJWfTAaKB60yNp=BQ#N& e?QG&PT6Nvt#12mCx{FipJL9efT+YtxtoIB16@=IT diff --git a/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrStream.class b/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrStream.class deleted file mode 100644 index bd07ac1dbae29ab634ef079edf96374c0e0112d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 568 zcmb7>O-{ow5QWEuHnh+m+5#6qsNGL`(k3rpq)r`V+P~d-1~9zj7}B|91@?DCVBcxrg&8Y z)$}r?bxGcxxD3g!Pxyn>(h4*--wG{IW!zIa64dooq6HR~w!8U`ZGh`PavJ-^EqM(o zFt9@BB0^;}MgHHhnXVltuQFPF(A0EU{VR1s u7@an?+@anaIDo3ZF7)dA5RU4*4+ElxM73Z<`tjC#Oz#OyNn>zQ6Q^I|R-Ix1 diff --git a/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITransaction.class b/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITransaction.class deleted file mode 100644 index 03917c97607572cb382eba6e8302fe17caab8160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721 zcmbVK+fKqj5S>N2g9?g%f*2E<_-NHc6Eq}56X6GzGO0_-mTaehzvhD<;71u}OR0nh zNPL=|%sF#rX3zJ}=NAB6!&wn>0?xf~;wT!=9a_v3&e1p{NpdJ7bh-m0btFAfp)SI{ zfTOXTNhgrncV35M^hiM7N9v9QG}{-wziKbkzAK={#b?xLB!x!6C1bYBW#E+jh`!PT zH9-OG?c~l3HCZGxD=gd5qb0A-Nz&$l$V6*{#-swLry^oTxvzXJDK;#0x7s8F-0qm# zc2>if(7oqg)unnWXXUdx%eOdx!3A~o8wS!|HhNc60XOY!A}j3RV~TEi=w!S;+VSz< z4&lL@JR)Hr^dQHuI%3z1PIt;a{-jtEqN$_bxjdUNi0JpiPbdLpw9RM YM(5zrx@#kEY~)Qi&hRJvY9-9mUtOTir~m)} diff --git a/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/InputFormatException.class b/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/InputFormatException.class deleted file mode 100644 index 67458419bbe678ba72427a86317e72e1a0de03c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406 zcmb7AyH3ME5S(@F80A4ifC9QyJPJ;v1DS|*XoaxQ!rUJ~er(Ck~2J84`blR^dM^yA>O`+iNR zo@=As1)*|y6cPNsov0cr*leJNI-xbvM%@S?7Wg9Z{u)!WrL7lO|5wYe#aQuws)4HU^ XxM~2JXfrm}et<1>nDHwaJ?wk~!IEWG diff --git a/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/RelationType.class b/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/RelationType.class deleted file mode 100644 index c4e81c398d836780e4d2c437e0ed5266e926f8f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1284 zcmb7@TTc@~7>3`WhutnKl%iD*iXuo`kO~SOS_q`9v9YwIOB**{ZOe*FdLY{^*!W}o z3tBE98j08bDC0L{v3p}ud(m&6+4+w1&d*<8F9ED#Q^F9#LbX{>+V0V5(*1B^Tc?(j zJTP6eVz#Vg(W;rQ-E8c4jx7m(hLI!l#7x%A#$i%xwCfDRdqr(W%V@e@C^E!z0|rYm zg!EG8%1@>!!h7shemaKDl51AY zTG@1L&SF!6593s}``&I*r6*>sZP8*W79V^J3Larq!U{v!(_W|LT6GnV@q{kKbR4r& zZ60@MzTP1eDo0k;O=UfEx!R(^Fi4`H!aIfyuUl_+gKL7f`Ao$co-?d@BV}r4tCjMk z{~NmB3YR0PO3|Bbr)s^l`6$P{`d#K{x$Nx2hUvB)`tA+M{nG=BYBRO9LbvFncO-31 za8&?gNf5%47K9}k2ulhOmM$L%Px7lLPd{m91fvuuO!SGE|2}>LGa_TYb41P%6>!Th zU_!uDK)|$sJ3#?60`5ryW(Ca20_MZP?-bA1MN~KZT}Nl zub*Mz3#A`Ioc{ + public static final double NS = 1000000.0; + public static final double MS = 1000000000.0; + private long value; // unit is femto seconds public EventTime(Long value, String unit){ @@ -51,6 +54,8 @@ public class EventTime implements Comparable{ this.value=value*1000000000; else if("ms".compareToIgnoreCase(unit)==0) this.value=value*1000000000000L; + else if("s".compareToIgnoreCase(unit)==0) + this.value=value*1000000000000000L; else { System.err.print("Don't know what to do with "+unit+"\n"); } diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrAttrType.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrAttrType.java index e509ee4..1efbc1e 100644 --- a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrAttrType.java +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrAttrType.java @@ -11,6 +11,8 @@ package com.itjw.txviewer.database; public interface ITrAttrType { + enum AttributeType {UNSPECIFIED, BEGIN, END}; public String getName(); - public String getType(); + public String getDataType(); + public AttributeType getType(); } diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrDb.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrDb.java index de6813a..4b6e22c 100644 --- a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrDb.java +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrDb.java @@ -18,6 +18,8 @@ public interface ITrDb extends ITrHierNode { public EventTime getMaxTime(); + public ITrStream getStreamByName(String name); + public List getAllStreams(); public void load(InputStream inp) throws InputFormatException; diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrRelation.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrRelation.java new file mode 100644 index 0000000..5b28b80 --- /dev/null +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrRelation.java @@ -0,0 +1,10 @@ +package com.itjw.txviewer.database; + +public interface ITrRelation { + + RelationType getRelationType(); + + ITransaction getSource(); + + ITransaction getTarget(); +} diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITransaction.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITransaction.java index dd9d892..d41dbf5 100644 --- a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITransaction.java +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITransaction.java @@ -10,16 +10,25 @@ *******************************************************************************/ package com.itjw.txviewer.database; +import java.util.Collection; import java.util.List; import java.util.Set; public interface ITransaction { + public Long getId(); + + public ITrStream getStream(); + public ITrGenerator getGenerator(); + public EventTime getBeginTime(); + public EventTime getEndTime(); - public List getBeginAttrs(); - public List getEndAttrs(); + public List getAttributes(); - public Set getNextInRelationship(RelationType rel); + + public Collection getIncomingRelations(); + + public Collection getOutgoingRelations(); } diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITransactionDbFactory.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITransactionDbFactory.java new file mode 100644 index 0000000..85cc103 --- /dev/null +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITransactionDbFactory.java @@ -0,0 +1,7 @@ +package com.itjw.txviewer.database; + +public interface ITransactionDbFactory { + + ITrDb createDatabase(); + +} diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/RelationType.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/RelationType.java index aa7a572..2187490 100644 --- a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/RelationType.java +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/RelationType.java @@ -10,6 +10,21 @@ *******************************************************************************/ package com.itjw.txviewer.database; -public enum RelationType { - PREDECESSOR, SUCCESSOR, PREVIOUS, NEXT, PARENT, CHILD; +public class RelationType { + + private String name; + + public RelationType(String name) { + super(); + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } diff --git a/com.itjw.txviewer.feature/feature.xml b/com.itjw.txviewer.feature/feature.xml index 191bbd7..fd70436 100644 --- a/com.itjw.txviewer.feature/feature.xml +++ b/com.itjw.txviewer.feature/feature.xml @@ -46,7 +46,7 @@ unpack="false"/> rN9v7>3{Jfl65^0wQ=mfo%~M6_22Z9AcA-KWb{kU&D5+gWGPiovL^#UV}e0 z(HJ!G0=y{WH?vDyN^2q^-DPKHpYMI&Z>IhI=f^Jq*RhsBgkjq8Dz;SH?`-w{trYKs zZudu>1SA4}nHcqLH~u5gs}stLpxhPL@zZo9l%wx4co(?kM&46~kJwuR%$T3y)N zuec-ZfL6D21?4v!)$m2BNn+@)?@BW36%_Xk5 zoogvy=MFE4g$D%eTa;C)9x&WU|L^OWB13G2f=D8Yl!XBdF+|guVgkbqBQ5RAzR!2G zfh3M0)enZ_77{ozfD@QVV4PvFwOFsSa1y78#Y-hxn+|-oMZ1vMWJu*@RctgWTf%?F zw_FNjIPW>!EplJ#=WsBlUduYeOiy>MSek91Tw+x+#xU3OwH}$0@lbE8Z91s6&e213 zD^t{oOX|jg5u7bC%hJ>nkoymF8#V%b45i|6~kycbFfdEH*eu4ZV`xH(cR2- zS;ufhD&ceG`J{D^WD?AUcfHybc~|(iPH!AG||1E{)-?v{$RExulu9U?jIpSxr+`)6~=fQ^gMQeis3GlE_nS>f6bk>aC{wET+Rw ztqZR?rH~Msx^Z!FTbOjh&_12WB31BhWVt1L z2Ty!MA7BRP1ZJ2%@xVs`>l`Vv;!8Vu@R4*bYwfl6KHLBN`^R4ZKEPK75&{LgS+`t& z?}g=m|J-$6IG(lZ$<{OLu_qgCY5Q)ovE|ep{bC>`klB;ZrB#!SUF*@#9v2LZ3M@6f zUCXg+ZmaEBd*4diu>!cZRo?Qwj_r3mry3y%jI|F@30cvY9p9~46}RoLa(T<$ZAf)U zV7_O0E%=Uwu)5A8qib%%_16VfvXx<~s?wKMIi{^7ZCQ0zbK3%`VzcU`k;J5labyIN z+1$2)DS^}7@HRY8?yDHnIEBeE2)tv$z=?63!K{II1tz+i)jkt*I7=*9t#WU+KlI!a zfys*7a2|H*JC65Q?$oGxs?xM&ZCiS-`VJ>k{xi2tuZPNu35%?zGpPoZ2`mpiH_R4F z4xP^~df^GK)mLRWGndQFg_$AkC z`XyOx4N_wl=@ocB$szx$9s3$Bb3vh{NlKhSE2i3&*9OGL8X_$N;*W*dfJmtOw zpJ(&0Fp>Wgr@ncG)4yRl|0|}i9$+ScuYb`8-{Uxi6vtVPXE4d`$NqZW1EYzahLm4Hq3$cr}bKvigGa*%!t#BY+vlNeY*$wsLug%fymc} zAou!fM*gng!_eO%pUV4;iv9pM1%ARv>SgjJ=K>c;_4=~r2=bH(qgU>*VkfwPmCjKm z>=uJofI20~1FR+R8rOg3OhT7O0CzJ6Hxa@Kb%(htsJuHGZG~70Egghc6zD}-jUlBY zBzCzlo*o1WRMO(H+#ZO)9x)i1_J(FqZBSemGb zFZ=+0DC6m68e%XmH@R(3dw$Q;)AQr!x9>{OVJ$K}uH4CpyVIePBWZcZihh?L zobJWS8QT)pRq1SjVa3=Emr#DT6McC#f+#SkzrnGX; z8S1skQtF2cg@%b`5e%0?Okui&JT8X_Fw2my`2%xJrRCc}?^xOcahynog{Fx_awx3w z>v6E)?J`WJT-_$Sp&jTW<+^)AsU5>=t$DsC>B#YsiaXM!JUg*dKP+My*8*H+D4&R- z;EB*3-u{p}*$Z(UH^{OX5NfHJZ7aiDR%zFER*K%v3~n(j?#A(fITAxz8Ig8HdhrtO zpb}t(;mQSxA?{+8A?SNnq6uF+`&!6v^P49|cVoyhjNlEUFbX^k%c*szlq&Y%tf)g~NLOAK$uwk^bCZX>7ci9`J z*C#nAv)hHQw3fD!h%}WcD%3G~>U~x&`?jH(Uj>+xb^HyRqyCmnj=kB=M29n0dL+7L%b5wscQdQ3jBlVu;0QM} z9JS*~C+*qMtP@RhAsXCMCvbMj9!b%QrZaBZ&iIb)MSW{%$WBCKYt(g>UKkq~v2A~q zHEb_;Q+~!7%95`@Rjfy#xo?BD$%-be)NpiwYpLNbfrGfu^R1LWXeG0DJsPzh5vfOH zQjdtzBNEg@puykL<9O+$H6{@5n@V?T=WX_Bg4|xRtWQ{!-STXKqbr=7T%~52o+0iJ zd49&WM*AGk7iiH+WPK+Y?Q>Ea?Sy>KT@3@yaLV$t8ItX-xM^txX4*lLrDR8|kWsG{ zw-R>OG7>etu~d8{lrkEL; zs-qGOy~&Gq7j5S8x}{Fa@s|lyx3v!n)GT)sb_ms&XW~%IHE@K$AsZyEHyw=m#JEi+Qg|KMp``EKP%}DSxLRL z!b&BQ61OL}m4|+jeK)MP;&xPP7mexDbdiD6wJ|EDwbIa*4n4!faxm8zbf|Xau@zjo z*3E1jvKd(tH*#B72&bV}8s{tlcRKi)p8blHl<+9$+&(D7Bxb_IK_Q%jegl2e@o6$U z?4(Sbi_j8hfYv{s@mmV; zG7U_u#T%Ih==^*VVl~+0B&6#X6&q7KT30788Y??Mr!(oW9@#0Xa!ir^DhD#P*SOK) zHLvK1G`U8TTqTI>DP=5`&XRa*v1EndRqHB2RO1p8Z^D}m3<(@rYKdMaY3rn*PBg+o z!i0_W8h&z_#jFH=aW`W}Gq&euGjSHtnB3K6U}QfypR5i&L%K4AFsyUyMiVnIvk{|k z4Wy`1x!a42nTa$m6_{%!5|j0M`3TFgEo&J4PJc0Zs(e0VTPZJEc^7Td2oG5U(u_f~ zRMO7GCTtdHBt~V5rem1}=g=&QkK;y_^>pcDW*x!UDd zZi(AzS!4@RDK7c<3N>4Coq=m<%5uwOQ@%55vkYbI{23GP!CV%|G&>@Hz_;QX*JPLt z4ZK$%x<8Lf827rFQOnQM5~y`Fy62b0K>(@@gqrmVo<|pLtK>fJ6*TLj3OS_!t_q^? zTycPD;*~7Gtp_Q^`>nL<0}R|IaCp#sCDGY{58@639}<`q=qbkt;!zVH#z)w%*cqaE zb{=G_v~^{F#TxrDfra64tMqB>dW)7wL|V`H*pap-bQ*0PWuudfw1&eWd>o%N@CgE8 z60iYUChn4$GL-X@sSvhF=YMK)b1^#d@)WeXe<~0EA_J+5)AAlpK_2-&MkqhA?(1(1|AStT#;G2 zFqudl<&;twMhrYCu5rx9{-!|7q>ay{BfFYPjXsT1QfH$n2@M1|JjaXgt*y1njX(%o#csLFvyms~y89y(byOXfJ{ zrWI2x{SV`;>;Zc6!}mD0W^)%(IyvE+7 z%Hg&Pr*~R6CI2w-OS~lUqvT=AUO3J323}!vl(9$MO|~{;Z^q4i)R-N7?G@ge5~Y** zMoo>u;GC+LS7<$r69xW_|M0_zSDDgFC=c zx&~dOe=3gQlgZOOg9SL2SHcJjbM$VagmVAs;c>K0pi`i~vw87uELleeCr#iD)gYJC z)^&urp?eq3+=&$r;A}puk}twLuwnuORVeU3j1+-hYI+tW9zX{Nyu~=52p?3kv}%4i zS;!gdZ~>(W;Urv$i>QB%9E7xdLTV%Bv%(#_aB;_DuqF_vkQ8c|syjQeLCUa)2HBx+ zCy=ayeCV72TZ;*7;bZ>b1TGgC$J@4{sXyGg3s-MLeShaTuDOqlYq63O>h73ci7&Z^R`WDx|@ea5sg{D{0|G=A-5{L=1TQNT|wyFmS8>kxd-F%fac9Rk?hXr@q~MKa5(j6odR$5rWQa6R3D}}f<^^n~2%jchfzRZz*1?k! zH=;nUPQ4gYBs8d43Ui>k2lsMSg7ifGOTo$xUJ>9uc~J8BEI!9yfzKb9_f-{nvz^KD z&d_U;_kxb*`|pOi8#^SD$G3Mh?^2Hw@^SZe38zQ4bD#Eci}Kesgzi@Q=voHgbvT04 zlJuoE)q=dK7T_^FPHxg$bjZvZy#FG;l;gje6s6JT5Q0xUg&73u9s>2tJMn~kQ(&p% z^af^!8yWjI1=O08V;VpU$m zpG@QA_KGKeil33bPR>79yn_~MEw#{&0Fi=)elb1sK2Y&6t8h;1%O&2ZZ=~aK?7bb$ zbWtla+um{fdhIqGEFX7c?>a*J_wp5=SB&G2((XZ&KSW48OjJM0GVmBbFF&rhYLrLv z_K)Dt_zU^wP~I|=_kYFTa*}MN95T%>>{xe7?IS1ER4?0xS#xXWFJ@95$KS867V~G< z+_~@NG7+@vpTLoLlI-^=*4p(8^Q;%*pLm6gng|dngieeUa351xol1$XLNF)3sw>;S z@&-Dcr=)@E1AH|&WZebB$Y3B9g1SD>vp%P;z-xIW4@B)*QhRO+YFYy!`;wf=x+#H_ zp+U;Vpx9T42QA$5Owum|$Tj4JYY;+6{0mWyD|6(Q$Y+uZ$uc}4Y6M5R;z)Q=(b8Eu Wl%rKet8tg87qT6ZW5N<%`S)M-GGUYe diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxEditorPlugin.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxEditorPlugin.class deleted file mode 100644 index 99bdb466cb70507dd03f6cee97bb4b9572104152..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3710 zcmb7GX?Gjd8Gf#}v6M-O9I|4-kdWGP;z^xA0EH~J<3yk=WHC*fHjJffdF-)9j7GN8 zmbSEoVrbcSXj$3y+fE=X$)e(N>J3U2RbB>_{=k-JmXtNY_UjW41qAU+*N4X=xXv zACuBmUmS0MF^KMT?)-2UmSmwGCEE`epqp#s zIdXR$a7s>aP@uhkU_zi{)GNp&+HsGGyKr}c(fNUiJJBa_iwefc>fEIC&)Jg-R!`2$ z+wO$zJBp4LJA!GaBGAbwDo|r$i*O|6eo`^=4Cl> zm>vc!fej5u*LM`IADS4%E`@8aiQCYd#J$*W;66sW!EtJGM&<((_u~P9?xGAvUAsb1 z8~O)g0o03`Br}hdp2OPov_QbkXHh)tb+5XiBs6cVA9etIb~N}W1zbG4>^riI!Yw9?-HBSP#vWjmNAn5nAkhCkQjeQ5_$2UB2Q z3#H8}Dhok4v7CG*OaYqwb4ng6mx{`^Uz#|F^GW;)zcKJ@X6EVvnpnV7tR&`goT-IM z>MQAP(dIBhyPA&QBu%4U6;8|T{n`JaOOGv;;0I~y)ay`^qJbct(bTo zf7H1|Sba^fnyhF@e!;|xilwvYOIcF7UN-THTItANw)MhmCSF$yi2}##F?Gzqn*w*l z(cCCKi8t`JO8a*>UBdZLyGt}39+UG_wv1Z) ztF_nOTBmN+Oj+nsUuaJ0!6`7XirK8DrJ7S_P`eH3@urk3G0_c4ul28{;VF4+lxOvv zSN(?5sXoH>ZE8q$BRYw8^73P1D>~6d%1~D!bdyfR=p^YiF82ez9mMlC!LDX zJ)}3p=vzr|jM1A&Z^o9o{;f!=@vE_LEa~^1=;K>e8m|ug-cITOu?n@CzKR`b@db8% zMyd_{{9dOm+lvnDqb>JhfNN%W8fh(CsA133ySdZBogpprIj$(5Y)=nf#h&y(F`Qn; z@Cx>=;K6G+`~}88LE?l`HvSoz5`^B1<781vx6vpCs}m1#=MZ-ebFLmC;86{rFBBaC zpb|WcM=0fXa^!G=s!x)iH|C25j(2i{6YmCu<6LRuv7}Joi1PIHRzFO89wC67R=O!X zU00fnlqPTnXQ@MZatGh)(?MIW@E!V4WdzvPl<$Frf|(~;K8p@M7pMQ(5fPhPK~!0eJS4ZZlS*07mw{~dl$$pTN~nMlJo45G4Z>9&9H z8{7{+sx~Y>d-?3=li_oS&!c?ue5%X%!rs6zD_~? z$5y^eLH*ZP*6&w;id@FK%A7F2(kuYL!5+*qt><_L^_Xo>;4tUv8M>`NN6q6hjd?O= z?ovJUOZbZ}JC$W?kl54CPb!sKN6X*G2a)|2-zx5%>CZ9VaAlYbPieVfA$8UZ=|g-J zF(0Jsl=HgMgH7cahWcqb{FxZCt~#Yx16dWg^+k}OL0_FR&X-QHEQ%*=lNL8SyQbIwEa(6bb8%G;E+I5=#EhG?# z13!Qtg?L_aDF?I%%l5P1%y>M%e*gFh;3akflmwndb|$r(E~Ps^)3l^i#;KZ5EboSv$Pq>7xjMjrLaEP6U~ zWGEF_a}%94UodH}5bHj-yw*m$Hv*kj!JhU|pwhKtszTsOhyd#~lu-{+MMI$6@)zno ze%Ob_Y((imjS>>r=-EgmLzQa3Ull7}ut2*Qb#spe*Ju3XgOOdhfjybnWv=}H2KAL; zi_`t~u!h^X8{m$>b|Hg8+{1l=brnUF<<5R8YE!SMCV^n~SD^p5VqF5Y6T3(wI@Gzh z7qax+hlq`OXQISr+QfZw6FUyEg(m-4l#+7PwZ^43;c&GsaAr#}Dm0D-_E5gnYHix#ny6 ziSK@k4c>>`(Pwg diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxOutlinePage.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxOutlinePage.class deleted file mode 100644 index 0404d0d287c10e7dbbb3c691b039277944203a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6376 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 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/AddToWave.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/AddToWave.class deleted file mode 100644 index 8759b402eb8793987da05866176dd980aa8fef96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 482 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 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrHierNodeFacade.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrHierNodeFacade.class deleted file mode 100644 index 333e7f41c5b2fa95ebf78faa05ecb4132e379ef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4473 zcmbVOYj+dZ72Q{|86l6cBVv^lFitRz^#G9oA;c7L3~t=Wh9E~&&?X&AgFHl*#Asyf zwrK(+edOIXX$x(kZ~EW^U8~rOdbOorlGXmDc9rfsbM>(0V$v@&bMM^q+Gn40?mz$Y z=f47Y5;ryY1a@UhGYQK%cOl`-&06LK(@x}Vqdc9+8IF+{o3x*^Onah~Ge?cAkux>4 z33Q(`W{pI_DCQH#r_PyKN5eXSfmTgY$CObqoAqc22qa2&K4E4HR+&GmRzg~?B+7QF zY}$@xRuW?;yzlu`scL6UfzA^rkDoYpax(Ms#PIkrfl#vHM9Q(PVt$B+MoPtsV-%gV zQK*^$bPBXh7&8=qs4hPGVlpXJ1kf!IaHDfi_{-Ufz+;};Dbpxc5;Y%2rWvZ4s+P+o z+o72bs{xC^VDiBNr{KD>VVgxqVD~CA_k*3X8x=b9N6kvsw#rV)roT^}Nj@-?4MFM3 zL91vvhXi5|?0+OpI7di@ApF>>;}P@<_y;3t4SfQAZa(eQl{6$mf$XH4x=!xxa$@H``GXsG?wF^&ldi#f;ASq`=0j)oHg{r9g!Vr?2T8cqtt zTTd>pKJTp8@`88)lajYD3PjdomnTRrONdVC_#!f_5hIuTADllOB-77G?Vptxd|Ag! zc$svWHYyWtxU8?!)L_eO_jnvzo(m?ttw=Ty+vR03U#^wL;nn0m1rNx(lw)LH88^zR z*dAd-%e$jYw^=lq;sI6LtF?mKDFURyV!L&-?M{-hLcz=%g<(5ionenWHkUQaj#VlK zF^#RVcNBD-MP5J@1h#t--PZ)Ubk?%XisQQ?mVA z?C;H(wZg7a6G;c~9riRisQYBslPccU@s8}29qg(jhGXVS_Iv>E@tADMeX@UQ_&{LK zS{~M~84ZBg#H4)l#@;n&Y-^+}%g|Xmvr?B#RPD4%RIOl|E>uI!<3wR2r|u7R{780` zb>{i1QK-n~aX>zv5b#;-F`ZVWraWb`O$%Jp@gY9a@UvytHV@n&uHzRveu-aEW5F!u zooRQVkFfz|tF|0IjDoGF#pUkStu@lAf{=HJ_E~v569{^DyHQKd^l-~nbC)a)JjxjS z@Nw4gl8G%?4;fVlZ?Hb-TyJPvcj1z}Jn&zeygImV4r}*K((>I!S+-g}H*=NdIUnEQ z=pwd6m#{6vk4JB#KN`D@fj{z(4}*M$cn;XX=T>xMfER$r5s`A9G@`Bzxt3Php=cwf zY*>`?^X%qTZA9a@5pNg@GfYsmXDCWTF*+M}jrDnI>c%!JV^l3~By@$Bc_ftCy?hJm z3P%5gfjihOaEmK1oOSM>-L6*MJEgR;rm=@R5}Xm9mf&qEoQp!;hdv45%w ziH^E+9o(0B67t%j6s~aT=~kDXS=A+8Flg;C6l*ZxI-WJc0UIFwn$k)#*ou)rOR z2u$3--koM1;eg)y!5?;u}@8b9(QVU3*x`A$PiA;PEr{$UgUlO=_?;kM< zRGXXkUUCjNi~x?HAHz(>vz+Qj@jTa)yxK?(cxg$i$OD+bS70#WesW}rZ15q=QxazH zUyffUclN`7kGXBrAT%n~IQ(%B+iM#d+SQg`+w#t^AUFl7MCRxvs+T$HiG6~OB}@~H zbAKZk{jmkSBD3Xh;%|ykP12Jzy*kyDwVry`dN6~c^3M-J%W`%pTP3a}=wYS*{1tS% zpYfdws5XpkaCw?ziJIhP-Zd2UBt)Mh-K$LZYb^2C*-I|6_go_TF0&Hebp7#IcSQNKky-vOzDJLC5YX@Q%U6SO zh@0&H%GrW~u{Rdd7x05C2t*fffE^A2WX*x!G1Xbn^Qr$SBLxv@BuT6lLaqdKcHn;~zthFW~3b(B5{_f3qIG*IGWL z&5xQw-Bh=;N!eM?X8vok$O|<9@o$7R4m5$^u#CL4?xR*&AEME@yykbcDFjhhEtG13 f8~CkKaoBZi6&2T-ylYiK0sPKow!rUQFaGdfie(I* diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrStreamFacade.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrStreamFacade.class deleted file mode 100644 index fc40d4c4983d485ec23acb97c934d3b251ebbac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3855 zcmbVOYf}?f7=8``0$~wFrM6fLYLNgnRIS=ZsmL|TO%hS0EiPdRiy?`d4T8Pfi@o1( zwtt~BwVevuP948>rhln3ojzxGvk4?M)elKFXW#dEpZ9+L`scU101n^>FUkZuqRGX8 zZZ2F2n9EDLc11G+F+)ww2WC}M4TK^_*fcbCv0sg0{cs84C>6>2CqGCn=pKOGtG9tn5%L_(t@VS&ndO^?l+0wN?(9n(zP7lGDR|Iq(oL|f%O z^rRZJpkOPu3DoEjBkLiNO5kKAiBvbFC$y2w;*4fQ)S0*@ol8d5_=IZc^1pLfZqDmz zM!5*^ekK%EG_EK7|C;kZrlR?M^v!w{r!sL?S zWGNF4u_AcuJhZvko;I1e>aZS5sAk4s(H_rIaRrVQ2}OPZxbVR) z%k;Af4&fO#1WiW_HIY`Mrp}Ij7;IPD!9K3wIf=cM*u&~F2Sqev7&2v%WdTpCKP02p zt)L6f3p7w_%t)p*!(8dr(osWC*-<#!>Yo})8nJ*Djq526sf-?w(=i=L+2XpE4ulF- zgK|>zDd@)lIXJTGp$|VCuT$7m>bstV)RQAr8 zz`oYJ!W^Ah(4uBA@5HG)|3noynk(&gmHH6{XTh;hlh({0)zo51V?|(lKANlR!+Bir zVp3qU)dW@8dg)zs@R-YzSb%fXemN3f7&>VeON@&i^Mvg?RN@NxJ;wk<%}9@gETT;kkqDJ7Ui^1up~RHJgr~Vd|1X+FBr8gxr~JptPjml@G@TEh+C2?Tqe7r zHIz@(5#wa^;57vcxFk@f%jsDdYws@}(w)!ng%_XS|4QV_EBF%E zZCh4?C1;s+>rc1YlQGgsL*{5*?3`Y!!neHoa5)H_5aDFTh-&@1ym)NeaIf1h(}QLP z!oyDm%CHk&RPni*SH&{;_+do(T*oJFDZbfkT_Oq2->SA>vE?2rZd%gY`CVz9??MBg z6S~WI*TH3Jr_qfP>682C<3=Ey*W(wWjJC5e1kVf3z33Fk+@S`q+l_m zV}(d3iXw6E7We9ez>gNwT>11BMc@i_5Po5S$dnJW{CfXHFHsPHN0!fPvGAQvvZeRfHU64*xm6l7-&f zUhi8){06q$MaE#>0o(dEuH2NJ@oJ9KCd=XT?8`|sa$U;)vb&?%E$C*vjyGsRT4g^s z^6^bK>H+?f^;|*EuWbzY#k_!5xTX9y-l59+er>#kYa3f^mOg5Ej4EA5mDco-hTp|? z2kQu3mqcpYR`K2)yf3hdPk-WpJp$|jqURB+bqRfiuU!ys1?gt}Hyhh>F^`GIW#Yki NoMV#74a?N`{{oS8i{k(Q diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITransactionFacade.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITransactionFacade.class deleted file mode 100644 index 481922f3bbc21422998b1893e0fc3b67238ee0be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2087 zcmbW1YflqF6o%g^mrA<`MGErQ&F17!IQ}WS4v50w|7a z41|Ag){U>HX6$47 z4BW&00J9>B(%z=qXGk~3tQ`tlX-l8+&_F*PFeE6HHM^kKb%a9(2K90~E&J$YrChp< zT0#{iOJ-hrin49nl0}=Vic5ztoM&7!n7c2!eNqT~(QZwZ~8_;2US z60hm9n)ow=G(An_>Wb1OO1Tho@OZxF1Xa;cx~}9_OWgC$v#OJOHja5}9rY5fNK>~D z&n&x6S-46H&s={Sj8C?lifd8pAT>^hOY|Rds5%oUfd#zOYBU()Tz3Z@X(|*bz3!Ic z)`tyVu8J@boSc)one>Fa*@TuC21wmah*2%XY1FJ`P8~8qV>*()?KI2LeoU{9e8u&V z(Jx4SqFD?#=zE>KfnM_LBj0}9q}i>&8r?L~zl2X^L?i81nKSgy^xnv4q|R`M;gn_p zv(?`j^jSIvO$b;_%a&GjRDThA!-RAsfkYck7zh)_BMGGMXu_i~VJeb9GNoM8e#V)o zY(~PQ*+>!zyD@1zOq!1*Q6p$fdJ-lrN0La3HPVcq-4e}p1ts-skDlRaEcDzt9~G2N zvQ|1t%;Gs+Hp2_dRWE(VFIW($EBg_~cPzZ8!dyCKx`LYOsxpsOY@h?1b?8(Lox(C! Q2)XKeu?`x(@*iaFH}vqu;Q#;t diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITransactionProperties.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITransactionProperties.class deleted file mode 100644 index bb75f33b156e8fe604b5979c42c6fe6bd91564ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3910 zcmbVO`*##q9sk_jO=go!NEk{=3R)@(d3GrTXbD1jEOhGmC4(svX!XV2~k;2lm;-iF|UF58xppgNZe!Qpm|4W`kyFl~}%qwgRYplzQ<4@?=4`wcEX0yxqf~@wQi{qoTbHvKog{`hVOROJKh$jnK zZzoy~>o|g=1Weg}ksu&UQW}yR0c$0s-m{HriM|s$oREJ4TTKL7hPI52EDFe&RSu{p*0(9Wd*5c{gjm(V`9Rp)?0<_a$48Y=9n+l8YI1% zg9p}hW|iy>AEZC+qpq2G;iOp#`cE3D=6KLR+rx;crE_J5rTNe5ct#-7Y+bCF`Enc1 z;aLsmiPQU>r#e1~=M|j#la*K83C!x8z3g(I1D+fV_!3*@_EzK}R056y!vA-11r5onF=rwXQiQz7}GRl{fLT0=waRL5)BM&}CFWnQtLTeF~b z$25Fi;lbs1;*pA-&st6#UsO=c>Kpj7477c1cpYEW@in~3hGyI&Y`WzWJjkvHUDfe* ze1p|7OC|P@!eAJxwK9aD>XQQN!=mC_I=(H|;%?DDloBuKcw0&wr&6!L;@9_dd|z@9 zr(a%YNWy-gXbW|-hXLl;BtX`F zg48q2b{k%%<-jVpXZZQjko87@U9NTfsKqNv;ku47d_pquTOGfXY2BQ+3ONC~mZ>;? zRSd^s2sO!IRxG(aYO{jRgU*$#Yg}C+;ifrxHnHRU*V=JgUJskY&#=G?z6u`|sNoR? z5#|3T{zc^d!MA2NS|Gu-aUFrq{kqV;gZuTNy@8nAAEK>oc$m8`pBr0Amw&CEH$**owgox|_^WspQ8(lZ(beox zc6d5;|1{8{@L_y}6ndjNX{(9c7yI7B_P=BLHhLx&(U-oB{s}`j1{aYyIbiInVyJ(h zipS4-^bX?y=_7+aeXve9jDw`_k9EiVlkS)t_4W5x@#LRztcv4z@bpb=7hB?J%yV=v z+PNNJScB+50-Ldup+1HkeBAHm-xC%kEw?bCaHHSo2$Lo~k`X3lg!DcxEa0{NJGj6+PFFFrfKFdYL1E+?whb6gn97zW zHL!Duo55RnQDJ}6H4Jq(-NI)S?%?(Pv4PuoW5W2tBEHleyM?bPRPk07->l+03uqJ4 zcWGS&-cfk_-akBG`1yVs216Plz)oQUGqQ#G*p4&I{3vrZh9?<*5@*Tr49;T$S!Vnq zp5^uM9Ij%L?fg6zxqhD~0??;eIi@J6fvkRvpD=+*yo8?;t`X{q;%E3dzlHkh3LC+v zT_qT=;TJ(&wvxl=|7D$DRzAP1q*nXTvcWL!;t>rOHr_>xhAa1Is+p~(Axa_%bn6vh z=RF1*@#z#)_!Wlz>SCI%NxyCCBS3%cRp@Wf3G?5)gQnQ^=yje&J%~yWfK5#^UdZAk zAh6s< diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ListPane$1.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ListPane$1.class deleted file mode 100644 index 70830c52ce7226119457e973a92e36fb88305729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcma)4ZEMp|6n;)ymo8>oojTujN{8(x#`#I8h*BpAQHG9w66G#Aw0ERQ$h~c+|4L94 zKllUuQR2B-{i2`^BK#|G7U_&%PR55^9;m~V3F}cF zt8}1B?c#Z|;Vwbck zGo1{%TKTvTfaTu*^g1|xs!frq_cAmgc%Efk_ETjH8*Iwj>heEQtL1hlUQJ#PP025d z_dsHo@wazA%jXM%k5$c@%T*^NxHo7?90AZxt+!a?pe4iuyw7wjr(}O zg_){epR_=JF2lu6KQ!3riI4>n^)ogdfIq`JfEJi`%+7RwNkk`loRQ=((5}P zJ45Pf#yv&RLP20>K^bj4!#3CVM1|DSA<0pTTt-n(V7)Y-!N?<6kiy)}{_d-b+6iP@ z{y6N?TV*s{zU<6Bb8c4o!0Wnxq`dwi>4D!fE%036XkM1fQZ)QgzyX@-*GYbSy04lMQvJrC@36ndK3QXn zcLc|EkmI$@F~)iut2_$a!P<=SZbr#g&XB2|Vf`Er&#`qCMOeW}jM|9N*%=DRVh1IL YB~fN{0u@wwOtHed*o%|05<}Pe_C0I~Ss@0uO-oCQ#&Oirw6sl|ZfVnfNz;8v*K|$Wpq%^v%t+Q~9Dco>{za?+s)<< z+eyblNN{B;Gt}n95^g%{c&%e@e8|aV+d5Mt=~ULuv0JU6X?8bf)Jd|}VcSjSbV4WT zWCZoSd%O2`_H`XPC|KNm!XCBT5_WQ^tv8o(lSA!-d7Y_bHfJYu{dOYn)S*EzpN)<^ z((5FgSk8$HYSW4Qked`VcURM-Z+vgu&80Gjy`G%cio4l#!agO4RvlDSzi)hx-vY@4oy0Uy>nes8 z0qxPwyW(~_=VUmzK2gLrD_H0Qn$NijZx6M(*BwgQxqODwTsy0IyZ?RMv6I}VOe*bU za;G|nxgAbPj`p3LqjtNSbaOiehnp*es?_JbqubIi2z937P8dO~Hh3Sdpl!aFHM&~* zEnF#B;u(;q@2*V7KBZ!Zu?CGgS(6~x+|pkU!Bqy!ahZkYIn0?hk;>=V_N6i--Ci+_ z^=Pc;qt##oHVVv$ouRoMaNMEcoItv?vCZIWZEWxxkGk>PaF|PNHh4d_5csT<^XH=( zRM*Mx(%#Y^##UT!;W`TY-fY_71K1`A(--$RgLXba(W1>QRpFoI5emz81A}>5+G#K! z3oP6qST)t$KDE?7?0-C)YpV*l{Q0IjmqQWvK9L9k$=#0J`XjM5fOf zr?|_SD|@!|2ZdCn1G)`*K%Ouhuq#139wDR9WSYJ0KP!XQy^uEM<_!UH)Rb?bykoOe&uw+0J3Svqr1& zb|7nzD~+c!IsSMHqonEC=vSl8F!ETf_IS!*Ar|T9kUs7<_z3P1T;^HAn0+eSJDeKx znRmCHA@zltkEs}W+-LAn+)pl4yG&)=)2U?6POuY=fR;I1l9F+k=OPwo@Q{TE=b(y; z&IS*wSYe9Q?`GZO2~t@ej~YCtBB*QhlT+Q8CxGhpgu!AgvGCL!vlq>2f5wgbtPsYN zct-8yS@S9{;4lQY_=Pbh}CCV1DGdlj*Z*8k+E=XbSyy#?|j)Whgi7(txWI_iVj2 z|FJXPUe@PIsfr*l$SkEY;g~^EzEx>JANB~F1X|S}JhErkz~C@VwW8aMS(TE!j^v8K z(4}OUwruvV_YDy}en;I@ z##PwgGx&Wa{s#KZv>bAZoSi6(wWb2_i)SQ$p;3?1DmT2O_B5lB(|Z}>PWIU8qRlPJ zdKtAkil6Vrl{3C+@aOmoAEM4-HxZ|iDPOeQRv}Jlk(t}@R|bEr&f{g;sVu4RZ}ImQ z{*L_reW;+Ea2xyszU2#0N>@0VdsJ*bg za0o8va?@!gefXpk*A`Cy@Ayv(|G^Yzu6Bd}!hdrYc_7NzJb4I~Uo=x!vA(?l-@*S` z_+RqD^gN|jga5~Oxw}a(LAp4XDn@z>Q{>5N8pi34ZC!mCU!{F^jHwy(H4!5LVQQu7 zdd^);*LGJY+_|P|pF6pe8Y8uus%UbjjG#-_8L5{rw{wuWwe7DexVe&(OV;F*PSwqx zQyykd%s#{znJ4oZ_8A7e6Vh}LXsKLq=25EDks*LPBMXfzlEqYH*v=mGHi3tTV{{K$ zs=?tNEiE^4nZ~|ap9WReh!O9^5zeP6rqk=5Cf|o*xeN)hl0Hicm)wVDlgrRUyW-%+JwUKLNGa~^lvUIj0)?GSwi;-(}Y6HQf<3qo-oAjVn9Y;Ub*GpV_EtPj| zRanZ4F>jF}Bf~=4(-T0CoAfR1QYR*V9S;>cc~fYFW&XKW%=ezmSK}TmXk`+e1Ag8Z#uso)z348h%c#ZGj(nzo}J?+G2FY17rT=H663 z6La>t>c{g`2fYp6q(bsGrYp&t+|GoZ%{tl8l|1kS`Ky722!C}f*Yo}+z#E)^-Y$7% z-YxMBJ=1${o`Lxe=sC%I^Ky>kF89h2juIXQSMa%#oz8OZIzXO}wg%5*Rdf<-2F_#c z1lCPrJxeVIHwGsV)yJmj#saR1ei7GBpgp=_0y`$rF%adjUE4yDP_%&E1?-E27T;LF zO_Mmp(Km0aiSXYfjtsC{-?0hwPvDqeu`te>3EWX^Ubyr;?wmj@5{lFmFv$7dLi@tn z0!|c=EPh$uSB6672cnCDIFGRjjF*U$Ee4n)u6Yys!=vw$yfnK!iRCnoUbo8FH76rZo7h0kkIi_P5Qt+a*f zuo~B+k++o1*oHQ=V+(fho@gg;0Xul#bpvnLcHty;;}kma2yYXg#$J3H`|t(!_!7GC z4sOKPa1*|PZhVVZf#2Z~EPz82#$j28n`I4-$kphRcHAPn&@cOOlws{w>E|_?jbq~C zHn|J8%YCrrVI~95@iy%(N_oV$CrqHgFIpD2X$h@OOJAg=1`v@C;{s&}GLyIkllW%e z2RE)L;Ma@w8{Wd#R^$r!T}3nqMf82d62zy0H+su4LNt>^GsWBGw5LVXU!$Z2(PfCH z1k2g;5AjFTVl~Tuj6dOgf9lOD4Q&1fntU;38z-n?!_$<3+y7?++d^;e4DL9G1(DFo z&E2g9{Nb9a;P9nitlC7^K$t#0$V-y$YL!o7MplU(1B4} z!5EHW9Cy%ahH)BqvHmpf#{Ik?d<^&CDctL!v&C1fh|Y5UA!~)Kq~c9DDXTo3I{4?X z)p7-K>fxz%jkm{&QzJrCG~pWEQxQw91RAEuPa#$?tDzOrltX&5DdM<+04t96q%;nk zmvu@tt6oOk!lmaB3QovXN;nhJ5(!xovcW^8Z9?83356zPYiooaH`uzWCjBzz6NYwW zkaK9zVx3PdtwG}0R*-Ge$VADmzyoC3Gi1#NaRna2I^IQYq91L+qx84Oh|=S@6Hm-Q z!!Fy3?dhxc>~;|YEh#QR&UvfskexIRMdOg7vD8DuLWjk)-I7M=V~VW`(v0c=t7ViG zQ^cvFjl-pb819nYK5{t0ZUIiSsr4=CoRp3MS%fM7|MSvSkZ!H#?+|~7`8%?3X+dsL z7y_P)%%`}tUqbK)b-6!dS=CK4Ajh~~K+k8zb>E?KI`W2SL2m0-;|l}|@*&SN z^@~fz)FaO#ti^M%^h>)GWRM+5gC65fZ^&}b0-opd1ro@M+=Q2Ct{?X#TH~)(l&A*n zazaj0k_EU%5}u)-#IUDNFlN-+R zF8wvy{aMDH*F8CWPTX47Y^yvaPjmfwXpv{+S>mt&SINgbJ6F(&%y+TaVh*{CqVexp zpon@;!c?V>@#6KO?CTUA_OB@sly85vUgdM%(h6}vp7)+F$cub0=5nv{t^d8@zrF`x C+>!SH diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/NameListPane.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/NameListPane.class deleted file mode 100644 index f5edf1955c5995883fc0f7140794a62f1e9654e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 947 zcmb7CO;6iE5Pd@u3?@KH11x(IZ!-yn6rlWod>%|(n@jM zH)qx;8TI5)j+D3SU&<>fLKz2w6FLq&7pr*UV2!Z<(1!1WYT_x@2@5<>FAu|FAB1-2 z9s)uwvxac^f1?tX82h8*u}!IV4jcTg6_I2P$+adGeLb@#tw?lZeHaQSrE0&Ol_#R7X~ z#dhK1;oGDBL}t{JdM<6V9iS#~w=h{uNv@`r$|#zXb~f%6+L8s+V!v*sHRXs`B!W}6$RC#Ph*A*()6D$r^T{!QDVC$YOX3bBLB0WJwV zSc$a=SA2tY`(7u*gy)dIkcMBsR!)bf_Fwe{!eKEp3B6RFmh-h3!uE4#&TU@9#qjEJSQwBKd_C5bmUu!bGTv|&OyF95XFQsTS{J2=F@CmTN z{!P{%v+X_M{{7GV`-LQjRMG(8j;%0n>~JQh0Qr@f&Jt%p^HN|HughOrtOnPKHrYHRp= zp|tHNW2KfU!>S!9Q+YzIJ4^L$5%h)9%D!Z1R+q%qx(tON>B}M*uKMt>Rze=@K8h$a zSv4-bms4UTvkt@lLgk;H`aK_p(pfS|L-|@c$+rG>>|IvrE&GNpRsGyM7&T>F&OY`9$Z#i5^JlVYDRF1v;6v@_hm_MGL_oW-wSz;9gO t=2z_e%k!N29cMh-8LvO*alHGe5K|rp#GAt*j%Y8C?p4&Yjx6g;$6xiE6FvX{ diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$3.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$3.class deleted file mode 100644 index b6e596b1b75eca4ea2e1274dd46082c5efdf1a98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1069 zcmb7DU2hUW6g>m9TW|%eTECSlwR}X^wl5|a6D8F&L0_o!dAfT8(=5BVGk|}~q(-okemwM)IhlIq!$i@P60e`g(ZCxk zPfv~4JvuxX%09JaG?BWx=O8Dr9VdN{{7{WFrCv0l$Y`%iA^Aqd(ThNi3?%}qW}tNS z3G;N8B5HByGZiWGTwu4hWNf`BkZZ>QIJz$vvA<3RKQ9&2F@JlqS`3a9dz=5&O4O*H7Xwd?}Lx?xN!0p1`A}=I3G) z_XXCZ?~~Tm9f5btPVui5oF&J75?D#K$C^CnzbMLCZv_h7c%1n3O4*@b{!`$OPvk_h zIQAnyjJ1mTZ^#Vdz(w6Er)U*Yb||$bjS9;x%Wq4R%T{x|%kbx5jqQ2f zJ>|2t6dKJ>{QC^|W9n0~w)BR}!F!bX>~f5?Ucx%BoF}f#QC`ncN{v$#ny0w>9k;&V q&LWgX5hjJ&NTEw}D4>J~s4`dm9Th~;?i_C|6*Z5d3ZuIyOI32cYaz$MRDV@-({O(}@A+a;g8ScSpMz8uFC39QCL zr7KUEr<01P#i7qtpyC$-&1%ZnT2CO?4*Qgczy${@ShbPGMF$oN0@6iswzCzCgX&`B&q1O(R>iULG5` zZsD51)_;XKxPhD8vpJyM!SbeQY{O&1vZzle>-)(DD?eTGO}?OWefKN9;KR} zgH7BQSd*SdT34C^@6t~3uN9mn$9)o5NwmkBJm~1)TJbJCn&@cZf@W;n; zDp?%6f#-)>1%rKxhhg7A%_yf}6nRF^vT*i-fTFf9wI+=+%Pq@qOO#4RbG*y&XJL)) zdEPzav$5Fq#wY%LhVwD;DH>aH!{y)vB|bYGW2~33&MW7MD+`o23zTC06n5hjSHI)d t7u;EfdXEA=Bv2a(ba4R%6!8ER2FqfLp)+`hZC-Oc=_=|8sYu9q`wMnvADsXI diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas.class deleted file mode 100644 index 8f9b27a89035bf1e51cf095a0822be955fbe2ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9430 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 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$1.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$1.class deleted file mode 100644 index ef0c34863ded7b6ffaec0f073c90990e6ac8f3e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2098 zcmbVNZF5sa6n?fTToSfW5l}!8Y{4XjUdo$j@TG(lE+!aA2!jKR+nY7rlH8lQyGhG0 z^0N*GMrZt}GyWxK9M9gwk`x0enc3WZIp^$ip7XMQ{qyVZ0M4W4V2UB@hb>o`^$pi- zc9qaIlXdk+uT+ ziz<+}JFQh2RmEykG8`y|zG&7&r0jaIIc;GxoSFFc`6Ytww5;#<+6<@D#n;hOuvFzT zwG=C{%bT-yXa~2xjjLH);rI-n6Tw=Vd?$)1n=7&@ zW0n~%j=z5#e|=xBa(n@*`u~#q0>gLXZEf#M6NIf|A}Lx!G5eZh8P^y%Wy+8T>2zkK ze%F5xzI6LtQM=xjWE}VF90jb94I*RfgdsDUW@AlcYDwJ0Ee9U8yW#p7)gb5{-*h5b z-@1e28x*Nl3Z-)O0fYM*$p52F{fbfhn;X%xjsBIICCQnJ5&n~sXb<{hsuFf0U#=+I zLHBJv4U6ldE2zm90>2q*6*NlHtc7)3)K!LXlo5N^hN=_u+RcZpHYpgH8(Rj|%|cz7 zFe;14whlv@abUoCuaJy+#fh-XLj`PRS)?e`$s?H1}!YO z1T46tu`>m7aD`gX4NAwGsNojArv$NJ5BC8Lz!Ef+aGT(MOJ@!ef1@y)BvWNtPT>yj S(s!DaD!50p6bV{i>GvI2p9&! zx>U)#L{aROBS)we>B(@7VIkE!EL~xU<^8INgJHmz4O%VwDGnLU{$*~4vFt%|fG9=D0b#|1!6^Y6jm}Hnbo%=Yb*$9a?yef>f2-4WWN8OvbT6k6dJrH^4x22Me4I!{e6bT zF6vJq85ni(?3wbP9?4FlQS?4N1qQR^?*@)|A@vXppG^4T4sUUqlXcH=eI>oxh6w9^ zRS(e$gMYT6k2@&uH<|+O}t@Bxtnz>BGfFNA-M@)klwkLGs7RTBf!3n3=gx^!FLo$0%k*`=T92xDAZb z+9HhhUceZ=87|_|Q5KgXHOute0WN>X#3631W)5I}!PMj-W;^BrnfHEYA47}~uP}s7 xn&j7*!kdUC(aChgLOHR72gEakaXiGMh-sOSeRzx~^o~(P4y$CD6r~l??-w73l(zr? diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$3.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$3.class deleted file mode 100644 index 93f44a17b6e3bf8c9b35506d4e2a5ff9719e8462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1455 zcmb_cZBG+H5PlXaM~@Q_Ur<3USfnj4ryz4y=!id7Jilq zqVa?Avp>o>d!-m5rZut2^=4=1ndjM^nfvkc>o))^cxGULA>;TBTZVgWJ3MGf(H4PS z3wX0`?@L>?L%VeFQmUrQ50k3~VhrO%BB)gfM^LXRCZCg!U?7CJ+Ja+C<2C| zur5{dK2a3<<;W6hLwYiN#;}y?AC@jN#BzRB#KACP;R1$C4C0~%1EUOsDIG9Yke+z6 z-`EvFiSN3CVWQwW+%5A!>h*~;re!lM_RXGLCE25GS*?k%a|@zMhfWoG-PD%8xoo-| z$2D9xFv&327sSF1+@zc8P%Q@<- zd#FEyWMI_A^XJNcb|gEEM$w1#9-)Isb6xqL4taPwdm7yPO^B~OrA(*~1`HCNW*cF~r*V{#%NDr)) z_dF5gT&|Q*NYH2x(ua$UkL&p+Yk(dD!{m>XwN7j8F*6IF= z+9HhhUcv;u87||>NfwtPHOuV65w3p6)G=;tW{zNf!OZkA<~!yRnGb$vpFoTdWsIOg xll%@d*ojyYolGYzloJoJMm!^!#3MY8nAQn7fG2oL?-)g7u}PLmQCcDWegQf`l-&RT diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$4.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$4.class deleted file mode 100644 index 53a01fff241738eac8b4188d6a6087a97831cf93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1303 zcmb7EYflqF6g>l#rOOJ44^&VK7HP|4QH!Eg6Gcp#R728QVvLVvJ81`(on~jC@Uu)1 zjUSAk{ZYm{TR?@F)=hTz&YgSixpN=$#^LnRUN7h9X_ zJgRu>0cRK~N#6^qUL?%=K$$RMGt73)p3YO)gDp|3bKTAYuhF41rB0bzF_|l5t4UnI zMGK=0Q(ZwET*76_RGX3^b%LqAqujMPsDg!YhKb|84~@!xB!l3I7uguYRR`CQVsMTQ zLnVzfShO*Tw1w*onQrUpU8`e7yDB1tsfUdW#HpS#Cu>e{D!yfQ9rJPejt?y>(9Av$eL-^B?fu2aSkiBEH|43(7f=^%v5$(YC_9s)r)lD zuYhTui)%9au+BrjVYbW0kr@o97=}Dr4m_o}LW)MHmo5l4JZ$EOq#k-L^pieG(h{wW z#?H-rqR(eIA7h&#qly__Hh0?#`baLVQvrh z7fg)rW4bNQ8S%IG5hMul1_O9Y6Y~xecptN*+MW(r$R`$XlXwO&O4r=&m?=-l9xUPx R{S#zy7xzfA$;w1X&o8e{UrYc1 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$5.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$5.class deleted file mode 100644 index 407c4ce17dfab0f264fb54b1c82534e8ff4f9877..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 906 zcmb7C+invv5Is&pw%IK067Kg~fNg*pAyone@e)9a6hNX?dEv#`n2n>2H?nt=@=r*B z#7#W#0elo_0 zLUB9G`S$J;Whbe4*WC0_VF*WJDtIb%!e91BGR{3z85)1RuL`Y2Ka~vCe5h>m9@XeA zTck~>M@p;wF~i+xdD!|6L#2}qWDN{Q19({RQN~(;8bXG0Yd2 zi$%I4jB@tES#h)(?krusxk4AHV54sZ_V8CFCbOFM7YoB#RtVH{tJ zsqBtLB0EA)g>Cz|h|3->F>D;d@BlKv71zkBkpm-U4E|PDm{>kjZqTdyBH3^{piV#4 zahh4BljkxYW`h7XaFZdhGT)LZiAH6bVLj?)CgCzp)x=6ZdMjed_cUmEcR#T0W*2m| zmZp;mYo#SF)NtBIz{1cCn*?2=U4u{FI^7{_k2&Ui^B0GHj|SNR zVVw6kPSDA465%4tLpt4Cz4aNvcbxi)3kTDDAmGP;($p7e%D76v60YGoofT3>6SwH* J2)dNC{s7cO=w<)_ diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay.class deleted file mode 100644 index 442991ad57b21b0c28467a4c3300c25b6b518e2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7649 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 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/WaveImageCanvas.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/WaveImageCanvas.class deleted file mode 100644 index 8395223d74755094c252038243be6dfecbd8877f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10440 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 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/util/Pair.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/util/Pair.class deleted file mode 100644 index bb0a4fa1a11613aba31eecae99d9343aa2f5251e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2138 zcma)6U2hvz5Ir~kcAS3LPFm_f6G9SyH7-qoHgQ9oLLlG(!c`<9fxK}RdxL9-^}2;8 zeg^6fK)mz;B$`SfA$Z9H|AtpoAIR_65&Q}jC^Py=M>b7y%D0CgGS@_7X>=6747Y>XEMxkl6>V*&Y4$PXP5cu4( zJAB8>XZKbWA{DFNGMuh$D){b|=m~brTD!F`=7yL>t7SQB3XAFC{9#XKhnQ&sFnlIA69}<_F#Td!~KQ*lUtdyxguC%^kzG z#P*zir(tyz=E~142-#1aM)>-$hmw1KdQq!bBTTqqbQ+?><-a9*uEsEp7b#Y@Hg$#7 zmO@nQidVvkieuEi*ftJ5?m_d*uF)j>$q~iO>j@Fw8JPUsB{#0yehr8afXG5k=c=mn=!nG*V%pJ z@X(ZDxHgLL5CiY1)i7=;jOAwpYDJ(}!&3;o!~O%|4%ub|;LRAa$WeXWbi6{JR<8%0 zM+DLtcZ9>8e&onPb1s82qwcU0wbw4mmzj?+zvpA1p5$ny-L-4xrX`aZk%lZur4@?B z(#n7ikIlvi-`a2(W_bgAyys*5@j}oFxmK7quSMUEBFyzTV)W~X37li(H?$@HeD*2- zxhIHc^G}fckuD#m_>9BvJre{>GHDW*=$X-JxQrKQ5x_fMR&wwduAGWW^`nG{j*2o$ z$vxmx$b9ROS<3!|_%SBrb%d9`hu>G^I;mYr&vhp?U7c>Es*joJce$Q(IbBAAoEDH8 z;JM`SOwc>y7HxqAd6_HCGv;!VDB(HB|2X^?*VQwAbJjUYa;ZF$e|jXVx!<84VK?_1 z)V46q^Zy;LYVIYmjt| z%~6)Hna46ku3-^nr12@me1_bBw7#Y81Hh)?N}!5T~d=6^x{llan8To;K)SdPDOgxjJ+)XI0mK6$m2lolKiUI__t2;zc@6e)sAsZxoX`7pj?!Lal+$O%vK^{|@T~J+mA42r zRkX*sHa5z*s@WL;Rc~Gm)?PW+`?@_g;TT#gmq3ZicTVtMp+`d)~GCLEn%Cm$I}VjUc+B| z4X1kzkIoJT%4*|!t6~QY4|fUm%Pc;2agTQ<-%p~H$Gs8!mFP`>#8<(S;VtIOL)e+$ zCr`cF)e{rTSIRAR>mPR&x-!rJ-w59*P~soo2EQI_f+ex6Jp6*CPg8f5U*`tusPXGx z09amSt&D3}W{V3xV6qa+l}G2O6V9>8_qFvIcRsSQgg-=UQ=-ia@QjGVu!nu7BHW+i GAN&LdP1`B} diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionTableView$1.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionTableView$1.class deleted file mode 100644 index c8a229304acef40c4d916854ad9aced97b24a139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 989 zcmb7C+iuf95Iq}*ni$i%0b1@&A)s6e+g2bU1@RJrsFW6@pzyqLmv~dxj&_}fAL0X$ zxJW$k0elo<)&z?n@eoU^-5JlBIdf)y{QUMEz&`G|C^77Z=_yy)c*e8$XG+eb<|8d8 z5x0ineHqIzQ)%)>3}ZPUUwzL-nIRa9Gr?n#jQFeJm||S4Fl?uK#AO((iIIG&_(6g1 zDU-=WYKE08Ql`F3rF+ZP?hyK^N>uiY;c;Vmcyqu|?xx4G0)~q|T%7mdV9iGb0fW=9 z0c$;#$fN1$Q0lyChH5VjMLZB%SrO*WvTcLm(b6pHd(=i?{s`NRNJDwd@UqeSSG~8X zJ{ig+j9v?!bryb)--%G>Lz3G3rE{k_@NgB^U0h?>T~=TpH?Tp{m?)hUqhs()I@O_^ z5DSK_1s-Q3MRN@I7oz{mnrikl5uO~1$y{HrpVxe$V#%;skSX@?pnm12 z<}vHmm;bToCaPrngt6XBxJ)<06>QA22&&?cui9>Xg8zXM(beAhf=!#vfz7s>N9+)X x2W0a+W9>I;o{{jliCcMeq5STc^NndX{hpcj+$Elz}=O+lZw_-!DV30XzTz diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionTableView.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionTableView.class deleted file mode 100644 index e37dbfb1da1ee0542e4103399dfb454862353c12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4562 zcmb7HiCY|J9e%%sbYPhrkS2JviQdaqPKSNmWi1fFN2 z38ujMUOOxM^V6f!)c^^!^g1akGibTCLbiBV?@!ns&AoDU0&BeqXSR%w!0}iJZiU{E z<4%prY-&O!Kv(E>IEc$Q(+>mN1X?Gp87rQ#vg7fj@7me%?!28zOScI-u+zXb0xzmc zp|Ca+*J2lQZe02&Z9gLgu8y_$RtxQlB8CnF?E)LB-Y4 zBuk*HrpPwzRe_8PY^r1l{Gfvk*e?*-7K@?{FE;TKT+gJkaygkz3+$=IQlU762JJtH zn+)6-vOloR#LZx~Dg=5mmd7w}3?ZNoDc}~|W`Nneei;D$%EU_*f(H5ft!deSZUND* zY(8S*s0P<}0&AkoyqB3cu3h%1&&jf){3Fs!xpq!93In$b?5&JgbprTqKIP|KnJ%YP z6B6h((T9Fo;X8+2*Sc3h+CEYNM==h{f)gfQfmaGNs>DqAa+)r0j@2MmDRxre+Lh+$ z?vPOJp~8wJ22Bi=uuw0RwqX;el)nv1n>sY`s>{giv)ri)nIpK{#H(=+J00;o;-vD^ z1WaHjL$sP%C919_j9}D63QU(qvJZ@n5p>;;66)QUiSg3AUYQ;DCz@bm%D|++w&#*= zB7K%M_nazFIS;Mmi{Rl~}8jhaye#wMpMfP4!th-E$4Ro>5*2 zT`;q}iixAz`TZsgG(>S4Z#3{g&GafUR?I;YZ^9XsnbJ>Wb9u%w)Q3u~OAm}Un^=RZ zl!k{)ycKU_q!@Wsz^;?wM6Ak3Z`O~`+G&z_@gfmh$XUG8z&lo107_Hc#JlkBV!fy{ zmF%Hd)sn3S>>4|$<&8B;S%LIE6OD)(c)vi~N?>&iOQjRV!`K_ed3@NwhXl5-Laxd= z*bhv61RrIQ63UVcMj>o>kdZ;Il!(~nm70gR9;g>;{4TfG;vf)cPPx+ZrJ9aq#5rXu ztqOxOopU^*p{1Y21vOlaOY318-LQ#4l@06}d)IpkQJFj|IanNq|+1!;N@FlTu{t#E;_}29~N)sV1?BZ{i8AA+)(X z2uhwk7lJDoiurXxCD~IZzK!n$NqRJG`)a>q-o;L}4=Ve*}(Bg?jzRIBfWznb_1*0JFx^=Le1tFX0}Ny`m=uj(8E zW+Kav6up{B58K)J>iET0kBDmEyo;z&p|9+Q`pPc>UJX+6yM({%`P4%W!E1BJ0ycCk zp=FpiSI?vMl4f~6f7fZjJ4o1$4P3Whz%w&o!V9s5Ph7sSH4rFnBHbFEouRO{;m$>D z7kCWUEnrW}z5)*HF5rd&4)Lz#Fn>X{?a?-@EVQ58MyEW_CbQ| zBTqejyqm!+?^4)?Io!*;*HU*I>i>lp+CI}E(e;C{y2?7t{1qW0AQMkM(Z zAyaF|qqwiLfH&~^pt>*MEd{*2Iy%Q0>I639c5UtEfVFIGE8c_mY6VbwX~ yKPgrHZK-AcAL;J`{<17LC`B8sn53+!3fWtVvLpB#rA6>}{DW8ZVba1Y|NaNf?D~%Y diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$1.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$1.class deleted file mode 100644 index 8b66bc38bfc70b656419b564f399c9c24453f2bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 910 zcma)4+iuf95IviOx;8FJ3zYk{0n$WbDNjg6NL2u-k^>Tr^1gN#dxNuE*_$T6g#-fe zzz6UL2)+d|Yr+c;$PcTX8SgoBd}hA=`tlXPW8Cx5VCW@g#+98exLuwqxsU}<3vrTh zmy~?Gd>&6I>h5`HF?6QlRPbErl)sLrGO-@k819=QXsrW)=kRMgR9` zB(z9nvA;VBa2Z!UTp?TQc@*Lrt~0EQB#~w1?wi_9)mFve&HhMacu*6?5FD9#k;s?I z*}L&~mmaz$B9~t1BsZnf=}6kl9EaF((`jeMyc-&A<?!_tl$CSF64_^mlAg9ume?&*K8!3>UGz zVmVl``27zE2cL22Uy>ix`e#M5U6J}L5+~&bZW2usw}`YslJC&nqQTxpw`#|#wiNyb D>C)-h diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$2.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$2.class deleted file mode 100644 index d09631a988bc188ed1185d6d8e76f8053a11c8ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 759 zcma)4%We}f6g@YSc9Q9|O~d=yfFe{<3Dc~Q3P`AcgcR7c%HDBI;xO@4_N2{kA+-W^ z(GTFG5Z6&&EDnj7J z(emwR$X>S}qfXe)-9%`WnPacT?6Xu_NL85JiZ`VptQJ$_yU&?;P>p$?YhD^_ir0kQ z%0*9yg!(}~)=d!BQmkM#L4@@bF*XR%P5^8UjMbkO^O1H(a+GO8dyp%c4W%<7{++Cc zmI=Lz4R`z8a^x1afg6OatHC>a9lg|QQRs1kTeuVBHsMJ%1ybC_Jwih&rM>U&5nff+ zVK9>?Qe@Ij#9`r#o$QCflf!)Blzwl*%+B1MB=1)VdR#2L~8m|})&Ntb6!EwkWz1?%(z9IcuVm3prJRz(Q z(Be4dnvmT>n=RoQHvVEM&w6J_+SkA1=07Y{LzANautd1eTs1tvL$-B(fNeY~Z=v!w Gc7Fk%VYILS diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$3.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$3.class deleted file mode 100644 index 49a25ca44eeb58256b775b4262fd556fbee946e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 759 zcma)4%We}f6g@XdJIQp?rs4f;ilVBd5-#lqseptENJxQAtLz=eBu*!u%AU0OtxByx zEcgIE3UNIJ2_Y7UIFE^^Mh^=Ch%8$8wlzLc5~-`)t9htyWN)y$Y`gb-o7BYC@^awSDX-* zC`OCpglj@}9c{LR8(95|r8w(dB5vROirfFNP=W?E|HD$nL*}aB5gxOx@dIpNv$%zd H+t~dDuFSO2 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$4.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$4.class deleted file mode 100644 index fa1d8a86b40a4352d956c432ee58f890df724d11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1431 zcma)6YflqF6g`&~TDA++LV5V2YN>qyTM(Z-lxIRx)CAJRkK657wrqEs-7OIRm5CPA z#Q51CWxUfCYCuh!Y-i@~opbK&Id^{k`uZKfB6dRPBcu(drkQ^AMDtINO>rVzt>WtS zLrpF`?cj8)RODH5DTE+l+HotIFf6m~39b5GH-x4ezUkQ7dTSsI_=l#K%rkJIH{@mB zvtrt&zedRQyeU&81UH?s7z81rq8|ea0vJ*e!Z0C_mI)&T(-yBAwUTfT^pYhAv4Ugh zR#A6Nx$XpmvSdQG$AXhfTynr|*b3s92w|L%>g}j1CNV__>xLmbFS$r~+xvkF*FSw* zFBZuaLW(5ZWd*lzCxqLCWH0$D?qZstR)oJVEYZ<0ozDD+ZTB*BIfQ$J`F|7b?)z@T z@EfiuUv7#Zfd?v*m|=mKcgJ)+f7=o@Vf%zJrmpJ8x@PHiMSD}Ka!pM0kTB5=GpcD< zHX5c?7H$|B!qk@2U_s~DnZ{9~EPUQ3$_d9#C`chET`^0Dr~kligDhu?3g(dyK_f)F z6m4b|3t*MPzSGXWT3-i4axAHMj3?}6ym zp70NyvWhL)kdc~xB-(cbx0BRh(r3udHZj-4qb8o7<5`z0#t5J|A~cRTO|WAoTbzkDZih318LVKHS>xP` eYk0{O2Jnij>BBlUcntEJO>FZ_;VfA%|9%723wt*J diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$5.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$5.class deleted file mode 100644 index ec987b536631c59f094c86d9b4483a12bd1cb289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 976 zcma)5ZEF)j5Pl{}d(Gu)W7Yav6E)T(m98iSAtFdxp&0dpCEqujHQDrfS8gw9|CZnz ze((qQqr}-u#A++#V40n{nP;Avd+x{2Z{GntM$6M^=l`d#Q9*trIKucH(g_ z)a}rygO0JOj℘OoztS9&z{1eC=CY^UOpheNNb%yQtA66xwlL7eQDK;9E^m$1??k$y8i?CE4*GF8HACss1-%EUN-7A!c*gyx)tYuik@)c-R)LDW0{-_xlz z?M`%*wi;a@*Kotbb;8DcOA2rkw+Ks8DQ#`-3E|cJt2&39RH=z0@gg%VAGcBUP$5*# zj`3G&fIHcGlW{~?&~6;U!*d!;^=8GH;R*h`c$_Hx(zp+@{9A=vPJaB!b|V$W)AXnG7bs?hmjdd@&i4MNsb?tPiX*|SXw%nZ>~Tw8R@uwD$r#R#0@2N7;jeb%A`t5-M#SQfD?9km;#GKmxUP3g`V>01mjvJnv9c ztF}>#_&Qi+U1D^J93Q|vZa%Ykf%n8#4i%Qgl>3S*V=u)nHc(6bo2lHwHfxuC0z23P Fz5wSmlj;Bf diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$TreeObject.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$TreeObject.class deleted file mode 100644 index 9d1f8afe92af870845d31df3fda9675f10979f06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1424 zcmbVLU2hUW6g{)hrQo(8w)NXqixp_?^dt7A+QiftsibWzlK8mL30;I;GP|_(Uuj}B z@xdS9k22obUFZgQ03UYle4TU8xqIi&-(SB0Y+*YAjbXFyw7KOqFSvJkZix#ac|)3= zGp-gcuUx*VRcV&1NFk1DO;Ps}h%;oG=DEpRrrqGZU7caskqs{DEvw@SUU#J6vTJ)* zTkz8BQ?uilwU%Ir+h&_WwtUTT;z`SH>@w&bQwrN-*e*{X?AQk>xOZl`xebQ=m~e%8 zY1x*y$M9-w(6I7Cm3-|xry>c4n+9&cNFjz>24*nF5X%>;>SVz{0@DoXvSo|IZo4LA zB`8X^?9|Ox)s&W6hnsO_XTn+pzk_@w8p1pDD?OJl3@c_xy21-8$FMW5cfS$BdIz4C z3?z{vI?C6hdqElh=l@N6PS6S|D%Mj2_wj%sMZ|vl2uYjyh?V`8>AJg7bA9)*&*BUH ziJ{9xcj9zqUA(naFV6HDd|fpogHf_=A$?xqCa})1GM*3OjXsgh$zE2kZazn_z!H@p zM&A^Tnra(*wVEn5kjbb9qqR=wGnl0@O{@2G9;28pu3jNi{E2LF?F#eXeBf;wXZ_=M zL{g&p0q)S=0)YsEySPVD%~UFlD5>}%F{jArY^wMj^IvJALD8w~K-s4;f(s!H!$Ulx z9i?iIZmSf!Qnh$3CgtxQk-y`J5WO!%_r0pbkMShriV9gA6!KxDkmV6Bejqmp{x}l6 rf@fjo9g50@#s-m}BI>oidJTCLd`wZHu!=Q`S(-6C2dDW4#Vz0;0$)AB diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$TreeParent.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$TreeParent.class deleted file mode 100644 index 8cb88c6200552c23472732965ea6b1d81e04606e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1727 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 DRmXWj diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView.class deleted file mode 100644 index e198e532b5e2efc2429822de3bc61afd0197a8de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7037 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 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.class deleted file mode 100644 index 2d695fc14caf48642d1a07af36c2b8a4bfaac0fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2180 zcmb7E+j1L45IrL~URzpUkev%oa2%8}{wmW>UvV~{WfZ!2k{j9Fc3wX&TD zK7@bZ!Bi!LKotcqJn&JeoY`H)ax5p|VRyQxXHIvY?w)0|75m>CXo0jsn zcP(#kN6B63S`F9kJhZgZwK{HlN7cDm*(+8nu9PLaDxJ-6*T9It^tQcYTaMjoSof>j zvgR2W6-c+;h9zr`>U5>G{lKnCA5pqpYwZw*z__Ejo@~)Xu#%6~^OR$ixSglDtQsxb z>$y^(_==WLU-2-(pNRc*|Zyyr$@VCBeE$Wps5V~AqL#1y6toD`Tj$m5>t+K;sV7-lgu4uLZ!42+E-9>ZC@ zXW*Pb>bN>o_Ll3)YrC6Huc2Bd=5byiUSmX_^dl6wnGR_2Yf$!F)oSE3Z^}!@alu3! z<`^cla?!+uRwlJ_*~BDFfvJ*e$&FsKD&2}*bx2sE)UMgimhCF7hnpkbL&fS9O2=jK zHr+(3<95B?uav;8^r0kP*G2tH`OH=v7Ook%DlmCa18q0i^fy>D`Vcrd$XU?0`OFV& z4JT|Af$RU@yMR$w-A=p9cK8^d8u&zDey~N4HkgTzFfA}q_Uzh^>vkt(bV_ymW73hX z_lPAK67i6_GY3ODvMF1hF4n8Vsk@&;9byjJ!^R&aXVJv6=591F5u+i! zVcpkf@(^`Llg=AhAVy!2 zdn70|gw)IcX(1_bl<>8QZ%_^{Z`e)3%%+DN6^NDFJ+~%TlpdG4p%3R3T^3y6phfwe zzz8DxMW8&+w>g3sKTf7Eb140l^T^fU8NM<6ze7#=_kmpYDH7Q~G5h^foO*)O*~GiQ zW9|tSvWfS7A(>5F@`co|K3JOnIgIk3r1P_cyofWn#E??R;xaO{m~=vD>N&0gAK=5# zZIR(c^oi_aoX$PNl?c8&z}3O)dvV^-IH!WMA&$nqiCaVxy7NOs$JcctkFoGCVtV-v zx49$(Eg5L3Kub~64x`YCB$xtll`qycoa2yZabrjVd7e3e=;Xu%eJ$cn==m3&pCda`z#|mq`I^bVdTvwPr t!rVft%y^v6H*h};r4WV^%l(bgGi(ZIcY~Cz55UG=!p1^afr@|r+ZTx@`xyWL diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$1.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$1.class deleted file mode 100644 index 686d28fc08ef2fbf05489b19e9f18e518ba5eb40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3890 zcmcIm-*X$)75=U*YaL~sICkQoCN3^bh-`;!LR(7hgf?-LVo-vMgA)R@T}e06I`Xc% zyNctqA^d9j(b5*$0^xy9XWHR~2bdwEff**egc)8sedt?X`XBTUV48kscO}b}GGq$% zkKMcXo_o%@-#Ono_mh9W{~>@o@v4Cyg{h*qWI5sDvK5{?>*!_eTV>y_RV?`ktUwn- z$8!VgU>N#Np&sfv->YdqT-mYDKuTe7(LQTiRog9F4-^(DZ6K|%$MegUE>@jdpsmHz zc2P(Av>#Zr$9=75JU7&CNL^>0lJ*r+6-Qpf`AA(obgGuf9kpxI3hU;bvTKKRUn>+k zCHBWtkq`6q(k)N73FVz2+@J3}Wyuchf=&16Q0s8h_wZN2sM$W<3)VVxuN_okhvwS! zC$l$iqSIS3nGP#XuwyR+(#6-Ci->61@3>BQkHUf6|E^|yf$^B}N_rg>Hk;UhjT!V} z#Ka)BD)i>Y7Yt+-Hg&`*gIh2nySAG!&~M<&YorpWG8m1ezG7lMOofek$JNK`O9ky8 zw+mH9c_{A{?dpQC)bjMXKD*A6KiLn9--mSBaWmM5uNk;g;qJ~Xy}5&#_&UC! z&~F!uI*77p>GQ<@hN&Z*5x&@NU`KV~h+VWxdOCw|;#&spR5dOZ%{+Xk518&>m9R!n>c2br;fbDo*Q?3@+MXH0w-hxyH56WLrF z>*6}qEry*!V)c6_?!_$Obwcgip~pHkvc|vJWS&0WkD~_iJiw}t%~cb}@BsaE^*MU9 zxv8N&tqgo$VOJ-FU2B!((TrF;ZsH-3vqr@Zjz!7|!l{0oq{|QLqUV=%Ng{O0#3N0x zTNN+p$74k4up5c|(8P~KWIf}-sU#ZdxG^Z)_SsyaO|M#-6^;pwBN*C`$aPmQC+q!H z(p>t>TG6D4lOW-_c}+co|D6m9Jt4y|-X&AJV#OnktSu=kwPsoQJk5fcJ0IG`Gi(b{ zkup$I82hY(!cdi*pymb4*YynAOvR~|*l-lKbjj24QyEs&x{0$`jw7=wzpI=4Bi&Fp zbX700r?E#A#hmoEE`kQmv)?lMb5RFWxV@W&P6LvR7fn2Y3rr?%Pf{qh83-YtHt`I8 zM)PO%N)*&hO$J2Wo>QdHvv}UXb3}EOK3p*I0)9czLhqpO+baUoco*NBwf%5xRg7K~ z{ytBAaYIj56f*N(-7o4Rjx?K*78#m%n>}Kled(}Uta<@26i0Pf@k%Cshu^dQ6n$-n z(H+M3ss!@%+8z=tht{%FA_{>u<1I1HEF9Bos8e^6`&BKzO*uNScpWL|lEpmYtLe#n zMN2HodRn@&IqSOGpQ+kGpaYCCEqeLi$0wxUa=ebC9%T4rXKj5C3=T>ckEFmZzKJVC z{95479=^vWCNE=n;yrAc_yD&&{2sn^8QVA<en-$t}uo;W^ zDrdwN^1?Wj z2T#c2yu$0(|1or;P5Z-Nxb{cewEy6X)-IT*BFuek=h$V0Jw~yHE%-6A@QHN5z8|vv z)p3&5;V~>TB6ZHLaC9C|<0p6-KP8SA(7@yP02lEw$A80<_&c7$KPmAqlJZm1ax;Fe zvUpbQ~OuN1CHvUI#~T8fALCQ)QSN4m0E=^K21k zkf!xyL_5v7DlJIX#PUm&cRBM%thyh@3AGz?UO+WAT<|KroDR1fL}p0}T0jN(+Q61D|4(!Qd+f|3YH$1XqRX zLz5q2?h;HP3{5}&wtBl|Z$qU2RU-Ww2Jw1ib0pr?vN@F46iX~VgH-<{vn@W=LB7Sv zfbh0~r>-!oAo}Ct5kvEbHoXHay#x4VbQUFTE>TzDK2bMHpL3V6RkTiCMXrGtuj0TJ z{EEsu-2W5Z|1-AX%{DWmEii_@% diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$2.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$2.class deleted file mode 100644 index 7a6ba3dc215fcc62e6339b50719b68e7fb345c79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2548 zcmbVN-%}e^6#gzrNeEj=u?4l*(w4Rf5f-s1CA73nDGi1c4MmGTZ#I{(xY>=n8%SS$ zcKS}A`rPRQ&L~u?we{CH`r!ZLIF9FLHvtNY0+Zc)&+hroch33l*#b_FenG6Z7sh4zeYifpBn z7j`WjhK`J-abu3#x=hbE24z|dWBX>)J49)<*`j1Ei;V8L!j#n-j%EI(zS~M$cS=gu zVWR;t^#2hkYu%}X*CfDjHkNs||H&S;UBuYk5Y7 z!?9fv`Y7B^wHCO`^PFU#p0yi?rWJ9#te{^4hlp~PmxQ#b3I^-8+1q6i#t=omna!mq zvlCY%IE8ZxhVdF{TYOUC28rp&E+vo8hcQC3rPA2aX;eWHV}ztxrptAc+>UN_OD%Fc zM}WfA1a&72Ix|5@JcLUOU7P*!DsZKu8+1&=xWdphSdCyDSLJb-c!rH%+xVPJZBoH? zq=^HiJI9R*wQhSIy>XF@;0;WNkRhFK#?4q}Q9%|r7+T8Qc7!ziL$oQ0@TP*dkRx@t z)^$;>H||JmYM0JQ{x=oO;cY4_FPDW`poz7$KJ`R)=*F)Eksikxil)`1mo^Kc%D^bw zAg4LW5Z~p*?)rr!QZKel3WQwUt&QXrg~0(wF!WO5XiS)jY4%#c^BdyQjFx^Rx==4#BX)jUOrgL-c&SYbcOitjW7n>a?ra_8*r~5A26Hjq!72(7>POs5AzKUw%3F6uA;5|h8ze0jx zt^0tt9+2zidzkBZg`UuE9j~t9qW4zE>+3jw7l-`a1=_9RbSgt6q&C{htm%+ z^$;`bm|e#^YYpofTO&q+T3biaM(amZ^>3(N-%>9gQzgH{2|PgzPiabjk8}6|=kX&Z z@e?%sj8E|kKErRd8uWSDH9B#p(TO{_g?Z{kH_CVy?@_$>DN;L{qkp0+gm~+~u|G(A t3?JY_zfq00*9dyL^V5xiBu9B4uLpa=ddHd>I?62ESihC+PqO z7$&u8a2ds_Z6#lSAR@^{&k$d($fQ$N*2zQ~h6AptZ0;(>QQmJLMY1xl66J0)+{*9Y z%+wk~x}@te1BOE(0t{!7!bpe=Mj29hFECP8iM-co)udS!wOBHYm31WIHDQ#e2h6lj zi(!7>(d1?+t&tYhYN4h(ZdF&Cy30_=m-nu0MI@pjO>t^1i<3AN;2Vay{Z=-_X`Epg z7EvUv&0S-t{h#{o5_*5)EMGNJuJxv`n8i7a2RP4=+nMT4`4AUyks)kISCw&pS{d^B zsXe?cf0Qf+$T7@(+0k;S^=NJY4Iijc}DO?S44cDm|PLm;(G(MN@ zb4m6){1D)KhNHW95Ah@B7=pGBC{8HG{1$fu6MoK9tp=g<@-9W(isQ{`W60P~#h=_o zYqN1%N>3oGIuSjrh;|P(0e;%E=buy=vQ^zNkz7(9fhTtCrWv0)m3J|TVr{8d73rF~ z9^x(*84gF(2q#NAaYn}k(+As8WxI}dRh@ccc}ch0WWmYewxl|0upis~ZK$N>PSk3$ z&M6lND?AxN|zJbdZk!cD=o%p&!p)63T$-LuNzv+L-b~lCGJ7G%@OT6 z*}|2-5f=Wz;XisZM?A0h$7{dD7||i=ciOY mMa+}4TckG(_71rKw@LbEqKB}6J9MULEtRlDH=m>rnVt`HALUa3 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty.class deleted file mode 100644 index 25eaffa4fcd54e150342e0bc5a820ba04cfdea58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6955 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 r`-n1I%ozn`eIZKy5DI_wnk&hPd15~A(iXpzaM diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$1.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$1.class deleted file mode 100644 index 6ed303daf917819716a0294cdaad9469bd967b72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3702 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 PvB&P>e*T=upXKErP+2;1 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty.class deleted file mode 100644 index 773b9077be3bac799c5ae3c3d973c77c3d7edcb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8262 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TrHierNodeSelection.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TrHierNodeSelection.java deleted file mode 100644 index 72c0842..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TrHierNodeSelection.java +++ /dev/null @@ -1,71 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import org.eclipse.jface.viewers.IStructuredSelection; - -import com.itjw.txviewer.graph.data.ITrHierNodeFacade; - -public class TrHierNodeSelection implements IStructuredSelection { - - List selection = new ArrayList(); - - public TrHierNodeSelection(ITrHierNodeFacade node){ - selection.add(node); - } - - public TrHierNodeSelection(List nodes){ - selection.addAll(nodes); - } - - public void add(ITrHierNodeFacade node){ - selection.add(node); - } - - public void addAll(List nodes){ - selection.addAll(nodes); - } - - @Override - public boolean isEmpty() { - return selection.size()==0; - } - - @Override - public Object getFirstElement() { - return selection.get(0); - } - - @Override - public Iterator iterator() { - return selection.iterator(); - } - - @Override - public int size() { - return selection.size(); - } - - @Override - public Object[] toArray() { - // TODO Auto-generated method stub - return selection.toArray(); - } - - @Override - public List toList() { - return selection; - } - -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TransactionSelection.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TransactionSelection.java deleted file mode 100644 index 78376a4..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TransactionSelection.java +++ /dev/null @@ -1,77 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import org.eclipse.jface.viewers.IStructuredSelection; - -import com.itjw.txviewer.graph.data.ITrStreamFacade; -import com.itjw.txviewer.graph.data.ITransactionFacade; - -public class TransactionSelection implements IStructuredSelection { - - List selection = new ArrayList(); - - public TransactionSelection(ITransactionFacade node){ - selection.add(node); - } - - public TransactionSelection(List nodes){ - selection.addAll(nodes); - } - - public TransactionSelection(ITransactionFacade currentSelection, ITrStreamFacade currentStreamSelection) { - selection.add(currentSelection); - if(currentStreamSelection!=null) - selection.add(currentStreamSelection); - } - - public void add(ITransactionFacade node){ - selection.add(node); - } - - public void addAll(List nodes){ - selection.addAll(nodes); - } - - @Override - public boolean isEmpty() { - return selection.size()==0; - } - - @Override - public ITransactionFacade getFirstElement() { - return (ITransactionFacade)selection.get(0); - } - - @Override - public Iterator iterator() { - return selection.iterator(); - } - - @Override - public int size() { - return selection.size(); - } - - @Override - public Object[] toArray() { - return selection.toArray(); - } - - @Override - public List toList() { - return selection; - } - -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/AddToWave.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/AddToWave.java deleted file mode 100644 index 932b540..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/AddToWave.java +++ /dev/null @@ -1,25 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.actions; - -import org.eclipse.jface.action.Action; - -public class AddToWave extends Action { - - public AddToWave() { - super("Add to wave"); - // TODO Auto-generated constructor stub - } - - public static final String ID = "com.itjw.txviewer.graph.action.AddToWave"; - - -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/TxActionFactory.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/TxActionFactory.java deleted file mode 100644 index 1d5362a..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/TxActionFactory.java +++ /dev/null @@ -1,113 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.actions; - -import java.util.LinkedList; - -import org.eclipse.jface.action.Action; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.PlatformUI; - -import com.itjw.txviewer.database.ITrHierNode; -import com.itjw.txviewer.database.ITrStream; -import com.itjw.txviewer.database.ITransaction; -import com.itjw.txviewer.graph.TransactionSelection; -import com.itjw.txviewer.graph.TxEditorPlugin; -import com.itjw.txviewer.graph.data.ITransactionFacade; - -public class TxActionFactory { - public static final int ADD_TO_WAVE = 0; - public static final int ADD_ALL_TO_WAVE = 1; - public static final int REMOVE_FROM_WAVE = 2; - public static final int REMOVE_ALL_FROM_WAVE = 3; - public static final int JUMP_TO_TX = 4; - private static TxActionFactory instance; - - private TxActionFactory(){} - - public static TxActionFactory getInstance() { - if(instance == null) instance=new TxActionFactory(); - return instance; - } - - public static Action getAction(int actionId, boolean enabled){ - switch(actionId){ - case ADD_TO_WAVE: - return getInstance().makeStreamAction("Add to Wave", ISharedImages.IMG_OBJ_ADD, enabled, false); - case ADD_ALL_TO_WAVE: - return getInstance().makeStreamAction("Add all to Wave", ISharedImages.IMG_OBJ_ADD, true, false); - case REMOVE_FROM_WAVE: - return getInstance().makeStreamAction("Remove from Wave", ISharedImages.IMG_TOOL_DELETE, enabled, true); - case REMOVE_ALL_FROM_WAVE: - return getInstance().makeStreamAction("Remove all from Wave", ISharedImages.IMG_TOOL_DELETE, true, true); - case JUMP_TO_TX: - return getInstance().makeTransactionAction("Jump to Transaction", ISharedImages.IMG_OBJ_ADD, true); - } - return null; - } - - private Action makeStreamAction(String text, String imgDescriptor, boolean enabled, final boolean remove) { - Action action = new Action() { - public void run() { - ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection(); - for(Object obj :((IStructuredSelection) selection).toArray()){ - if(obj instanceof ITrStream){ - if(remove) - TxEditorPlugin.getDefault().getOpenEditorPart().removeStreamFromList((ITrStream) obj); - else - TxEditorPlugin.getDefault().getOpenEditorPart().addStreamToList((ITrStream) obj); - } else if(obj instanceof ITrHierNode){ - LinkedList queue = new LinkedList(); - LinkedList streams = new LinkedList(); - queue.add((ITrHierNode)obj); - while(queue.size()>0){ - ITrHierNode n = queue.poll(); - if(n instanceof ITrStream) streams.add((ITrStream) n); - queue.addAll(n.getChildNodes()); - } - if(remove) - TxEditorPlugin.getDefault().getOpenEditorPart().removeStreamsFromList(streams.toArray(new ITrStream[]{})); - else - TxEditorPlugin.getDefault().getOpenEditorPart().addStreamsToList(streams.toArray(new ITrStream[]{})); - } - } - } - }; - action.setText(text); - action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(imgDescriptor)); - action.setEnabled(enabled); - return action; - } - - private Action makeTransactionAction(String text, String imgDescriptor, boolean enabled) { - Action action = new Action() { - public void run() { - ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection(); - for(Object obj :((IStructuredSelection) selection).toArray()){ - ISelection sel=null; - if(obj instanceof ITransactionFacade){ - sel = new TransactionSelection((ITransactionFacade) obj); - } else if(obj instanceof ITransaction){ - sel = new TransactionSelection(new ITransactionFacade( (ITransaction) obj)); - } - if(sel!=null) - TxEditorPlugin.getDefault().getOpenEditorPart().setSelection(sel); - } - } - }; - action.setText(text); - action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(imgDescriptor)); - action.setEnabled(enabled); - return action; - } -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrDbFacade.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrDbFacade.java deleted file mode 100644 index 18f24e7..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrDbFacade.java +++ /dev/null @@ -1,96 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.data; - -import java.io.InputStream; -import java.util.Arrays; -import java.util.List; - -import org.eclipse.ui.views.properties.IPropertyDescriptor; -import org.eclipse.ui.views.properties.PropertyDescriptor; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceReference; - -import com.itjw.txviewer.database.EventTime; -import com.itjw.txviewer.database.ITrDb; -import com.itjw.txviewer.database.ITrStream; -import com.itjw.txviewer.database.InputFormatException; - -public class ITrDbFacade extends ITrHierNodeFacade implements ITrDb { - - protected final static String PROPERTY_DURATION = "DURATIONS"; - protected final static String PROPERTY_STREAMS = "NR_OF_STREAMS"; - - public static final String DATABASE = "DATABASE"; - - public ITrDbFacade() { - super(null); - } - - private ITrDb getDb(){ - return (ITrDb)iTrHierNode; - } - - @Override - public EventTime getMaxTime() { - return getDb().getMaxTime(); - } - - @Override - public List getAllStreams() { - return getDb().getAllStreams(); - } - - @Override - public void load(InputStream input) throws InputFormatException { - BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); - ServiceReference serviceReference = context.getServiceReference(ITrDb.class.getName()); - ITrDb iTrDb = (ITrDb) context.getService(serviceReference); - iTrDb.load(input); - iTrHierNode=iTrDb; - firePropertyChange(DATABASE, null, getDb()); - } - - @Override - public void clear() { - firePropertyChange(DATABASE, getDb(), null); - getDb().clear(); - } - - @Override - public IPropertyDescriptor[] getPropertyDescriptors() { - if (propertyDescriptors == null) { - super.getPropertyDescriptors(); - // Create a descriptor and set a category - PropertyDescriptor nrDescriptor = new PropertyDescriptor(PROPERTY_DURATION, "Duration"); - nrDescriptor.setCategory("Hier Node"); - PropertyDescriptor streamsDescriptor = new PropertyDescriptor(PROPERTY_STREAMS, "Stream count"); - nrDescriptor.setCategory("Hier Node"); - IPropertyDescriptor[] result = Arrays.copyOf(propertyDescriptors, propertyDescriptors.length + 2); - System.arraycopy(new IPropertyDescriptor[] {nrDescriptor, streamsDescriptor}, 0, result, propertyDescriptors.length, 2); - propertyDescriptors = result; - } - return propertyDescriptors; - } - - @Override - public Object getPropertyValue(Object id) { - if (id.equals(PROPERTY_DURATION)) { - return getMaxTime().getValueNS(); - } else if (id.equals(PROPERTY_STREAMS)) { - return getAllStreams().size(); - } else { - return super.getPropertyValue(id); - } - } - -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrHierNodeFacade.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrHierNodeFacade.java deleted file mode 100644 index 75f3930..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrHierNodeFacade.java +++ /dev/null @@ -1,160 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.data; - -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.ui.views.properties.IPropertyDescriptor; -import org.eclipse.ui.views.properties.IPropertySource; -import org.eclipse.ui.views.properties.PropertyDescriptor; - -import com.itjw.txviewer.database.ITrHierNode; -import com.itjw.txviewer.database.ITrStream; - -public class ITrHierNodeFacade implements ITrHierNode, IPropertySource { - protected final static String PROPERTY_NAME = "Name"; - protected final static String PROPERTY_FULLNAME = "HierName"; - - private transient PropertyChangeSupport pcs = new PropertyChangeSupport(this); - - protected ITrHierNode iTrHierNode; - - protected ITrHierNodeFacade parent; - - protected IPropertyDescriptor[] propertyDescriptors; - - public ITrHierNodeFacade(ITrHierNode iTrHierNode) { - this.iTrHierNode = iTrHierNode; - } - - public ITrHierNodeFacade(ITrHierNode iTrHierNode, ITrHierNodeFacade parent) { - this.iTrHierNode = iTrHierNode; - this.parent=parent; - } - - @Override - public String getFullName() { - return iTrHierNode.getFullName(); - } - - @Override - public void setName(String name) { - iTrHierNode.setName(name); - } - - @Override - public String getName() { - return iTrHierNode.getName(); - } - - @Override - public List getChildNodes() { - ArrayList res = new ArrayList(); - for(ITrHierNode node:iTrHierNode.getChildNodes()){ - if(node instanceof ITrStream){ - res.add(new ITrStreamFacade((ITrStream)node)); - } else { - res.add(new ITrHierNodeFacade(node)); - } - } - return res; - } - - /** - * Attach a non-null PropertyChangeListener to this object. - * - * @param l - * a non-null PropertyChangeListener instance - * @throws IllegalArgumentException - * if the parameter is null - */ - public synchronized void addPropertyChangeListener(PropertyChangeListener l) { - if (l == null) { - throw new IllegalArgumentException(); - } - pcs.addPropertyChangeListener(l); - } - /** - * Report a property change to registered listeners (for example edit - * parts). - * - * @param property - * the programmatic name of the property that changed - * @param oldValue - * the old value of this property - * @param newValue - * the new value of this property - */ - protected void firePropertyChange(String property, Object oldValue, Object newValue) { - if (pcs.hasListeners(property)) { - pcs.firePropertyChange(property, oldValue, newValue); - } - } - - /** - * Remove a PropertyChangeListener from this component. - * - * @param l - * a PropertyChangeListener instance - */ - public synchronized void removePropertyChangeListener(PropertyChangeListener l) { - if (l != null) { - pcs.removePropertyChangeListener(l); - } - } - - // IPropertySource methods - @Override - public Object getEditableValue() { - return null; - } - - @Override - public IPropertyDescriptor[] getPropertyDescriptors() { - if (propertyDescriptors == null) { - // Create a descriptor and set a category - PropertyDescriptor nameDescriptor = new PropertyDescriptor(PROPERTY_NAME, "Name"); - nameDescriptor.setCategory("Hier Node"); - PropertyDescriptor fullnameDescriptor = new PropertyDescriptor(PROPERTY_FULLNAME, "Full name"); - fullnameDescriptor.setCategory("Hier Node"); - propertyDescriptors = new IPropertyDescriptor[] {nameDescriptor, fullnameDescriptor}; - } - return propertyDescriptors; - } - - @Override - public Object getPropertyValue(Object id) { - if (id.equals(PROPERTY_NAME)) { - return getName(); - } else if(id.equals(PROPERTY_FULLNAME)){ - return getFullName(); - } else - return null; - } - - @Override - public boolean isPropertySet(Object id) { - String curName = (String)getPropertyValue(id); - return curName!=null && curName.length()>0; - } - - @Override - public void resetPropertyValue(Object id) { - } - - @Override - public void setPropertyValue(Object id, Object value) { - } - -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrStreamFacade.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrStreamFacade.java deleted file mode 100644 index 92c757b..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrStreamFacade.java +++ /dev/null @@ -1,112 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.data; - -import java.util.Arrays; -import java.util.List; - -import org.eclipse.ui.views.properties.IPropertyDescriptor; -import org.eclipse.ui.views.properties.PropertyDescriptor; - -import com.itjw.txviewer.database.ITrDb; -import com.itjw.txviewer.database.ITrGenerator; -import com.itjw.txviewer.database.ITrStream; -import com.itjw.txviewer.database.ITransaction; - -public class ITrStreamFacade extends ITrHierNodeFacade implements ITrStream { - - protected final static String PROPERTY_NUMBER = "NR_OF_TRANSACTIONS"; - private int height; - - private ITrStream getStream(){ - return (ITrStream)iTrHierNode; - } - - public ITrStreamFacade(ITrStream iTrStream) { - super(iTrStream); - } - - public ITrStreamFacade(ITrStream iTrStream, ITrHierNodeFacade parent) { - super(iTrStream, parent); - } - - @Override - public Long getId() { - return getStream().getId(); - } - - @Override - public String getKind() { - return getStream().getKind(); - } - - @Override - public ITrDb getDb() { - // TODO Auto-generated method stub - return getStream().getDb(); - } - - @Override - public List getGenerators() { - return getStream().getGenerators(); - } - - @Override - public List getTransactions() { - return getStream().getTransactions(); - } - - @Override - public int getMaxConcurrrentTx() { - return getStream().getMaxConcurrrentTx(); - } - - @Override - public IPropertyDescriptor[] getPropertyDescriptors() { - if (propertyDescriptors == null) { - super.getPropertyDescriptors(); - // Create a descriptor and set a category - PropertyDescriptor nrDescriptor = new PropertyDescriptor(PROPERTY_NUMBER, "# of transactions"); - nrDescriptor.setCategory("Stream"); - IPropertyDescriptor[] result = Arrays.copyOf(propertyDescriptors, propertyDescriptors.length + 1); - System.arraycopy(new IPropertyDescriptor[] {nrDescriptor}, 0, result, propertyDescriptors.length, 1); - propertyDescriptors = result; - } - return propertyDescriptors; - } - - @Override - public Object getPropertyValue(Object id) { - if (id.equals(PROPERTY_NUMBER)) { - return getStream().getTransactions().size(); - } else { - return super.getPropertyValue(id); - } - } - - public int getHeight() { - return height; - } - - public void setHeight(int height) { - this.height = height; - } - - - public double getMaxTimeNS() { - return getDb().getMaxTime().getValueNS(); - } - - public String getValueAtCursor(int i) { - return "-"; - } - -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionFacade.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionFacade.java deleted file mode 100644 index d38ca4e..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionFacade.java +++ /dev/null @@ -1,80 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.data; - -import java.util.List; -import java.util.Set; - -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.ui.views.properties.IPropertySource; - -import com.itjw.txviewer.database.EventTime; -import com.itjw.txviewer.database.ITrAttribute; -import com.itjw.txviewer.database.ITrGenerator; -import com.itjw.txviewer.database.ITransaction; -import com.itjw.txviewer.database.RelationType; - -public class ITransactionFacade implements ITransaction, IAdaptable { - - protected ITransaction iTransaction; - - public ITransactionFacade(ITransaction iTransaction) { - this.iTransaction = iTransaction; - } - - @Override - public Long getId() { - return iTransaction.getId(); - } - - @Override - public ITrGenerator getGenerator() { - return iTransaction.getGenerator(); - } - - @Override - public EventTime getBeginTime() { - return iTransaction.getBeginTime(); - } - - @Override - public EventTime getEndTime() { - return iTransaction.getEndTime(); - } - - @Override - public List getBeginAttrs() { - return iTransaction.getBeginAttrs(); - } - - @Override - public List getEndAttrs() { - return iTransaction.getEndAttrs(); - } - - @Override - public List getAttributes() { - return iTransaction.getAttributes(); - } - - @Override - public Set getNextInRelationship(RelationType rel) { - return iTransaction.getNextInRelationship(rel); - } - - @SuppressWarnings("rawtypes") - @Override - public Object getAdapter(Class adapter) { - if (adapter == IPropertySource.class) - return new ITransactionProperties(this); - return null; - } -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ListPane.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ListPane.java deleted file mode 100644 index 04c8f83..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ListPane.java +++ /dev/null @@ -1,172 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.ui.swt; - -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.events.ControlAdapter; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.ScrollBar; -import com.itjw.txviewer.graph.TxEditorPlugin; -import com.itjw.txviewer.graph.data.ITrStreamFacade; - -public abstract class ListPane extends Composite implements PaintListener { - - public static final String SELECTION= "StreamSelected"; - - private TxEditorPlugin plugin; - private TxDisplay display; - ScrolledComposite scroll; - Composite frame; - private MouseAdapter mouseLabelListener; - private List listeners = new ArrayList(); - - public ListPane(Composite parent, TxDisplay txDisplay) { - super(parent, SWT.NONE); - FormLayout fl = new FormLayout(); - fl.marginHeight = 0; - fl.marginWidth = 0; - this.setLayout(fl); - plugin=TxEditorPlugin.getDefault(); - display=txDisplay; - - Label header=new Label(this, SWT.NONE); - header.setText(getHeaderValue()); - header.setAlignment(SWT.CENTER); - FormData fh = new FormData(); - fh.top=fh.left=new FormAttachment(0); - fh.right=new FormAttachment(100); - fh.bottom=new FormAttachment(0, WaveImageCanvas.rulerHeight); - header.setLayoutData(fh); - header.setBackground(plugin.getColor(TxEditorPlugin.headerBgColor)); - header.setForeground(plugin.getColor(TxEditorPlugin.headerFgColor)); - - scroll=new ScrolledComposite(this, SWT.H_SCROLL | SWT.V_SCROLL); - FormData fd = new FormData(); - fd.top=new FormAttachment(0); - fd.bottom=new FormAttachment(100); - fd.left=new FormAttachment(0); - fd.right=new FormAttachment(100); - scroll.setLayoutData(fd); - scroll.setAlwaysShowScrollBars(true); - scroll.getHorizontalBar().setVisible(true); - scroll.getVerticalBar().setVisible(false); - frame = new Composite(scroll, SWT.NONE); - - GridLayout gl = new GridLayout(1, false); - gl.marginHeight = 0; - gl.marginWidth = 0; - gl.verticalSpacing = 0; - frame.setLayout(gl); - scroll.setContent(frame); - scroll.setExpandVertical(true); - scroll.setExpandHorizontal(true); - scroll.addControlListener(new ControlAdapter() { - public void controlResized(ControlEvent e) { - updateSize(); - } - }); - scroll.pack(); - mouseLabelListener = new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - fireStreamSelected(e.widget.getData()); - } - }; - } - - public void scrollToY(int y){ - if (scroll.getContent() == null) return; - Point location = scroll.getContent().getLocation (); - ScrollBar vBar = scroll.getVerticalBar (); - vBar.setSelection(y); - scroll.getContent().setLocation (location.x, -y); - } - - public void streamListChanged() { - for(Control ctrl:frame.getChildren()) ctrl.dispose(); - int trackIdx=0; - for(ITrStreamFacade str: display.getTxEditor().getStreamList()){ - Label l = new Label(frame, SWT.NONE); - l.setText(getLabelValue(str)); - l.setData(str); - formatLabel(l, str, trackIdx++); - l.addMouseListener(mouseLabelListener); - } - frame.pack(true); - frame.layout(true); - updateSize(); - } - - protected void formatLabel(Label l, ITrStreamFacade str, int trackIdx){ -// GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false); - GridData gd = new GridData(); - gd.verticalIndent=trackIdx==0?WaveImageCanvas.rulerHeight:0; - gd.verticalAlignment = SWT.CENTER; - gd.horizontalAlignment = SWT.FILL; - gd.heightHint=str.getHeight(); - gd.grabExcessHorizontalSpace=true; - l.setLayoutData(gd); - l.setBackground(trackIdx%2==0?plugin.getColor(TxEditorPlugin.trackBgLightColor):plugin.getColor(TxEditorPlugin.trackBgDarkColor)); - l.setSize(0,str.getHeight()); - } - - public void paintControl(PaintEvent e){ - e.gc.setBackground(new Color(null, 255, 255, 255)); - e.gc.fillRectangle(e.x, e.y, e.width, 20); - } - - private void updateSize() { - Rectangle r = getClientArea(); - Point p = frame.computeSize(SWT.DEFAULT, SWT.DEFAULT); - scroll.setMinSize(frame.computeSize(r.width>p.x?r.width:p.x, SWT.DEFAULT)); - scroll.getVerticalBar().setVisible(false); - } - - public void addLabelClickListener(PropertyChangeListener listener){ - listeners.add(listener); - } - - public void removePropertyChangeListener(PropertyChangeListener listener) { - listeners.remove(listener); - } - - protected void fireStreamSelected(Object newValue) { - PropertyChangeEvent event = new PropertyChangeEvent(this, SELECTION, null, newValue); - for (int i = 0; i < listeners.size(); i++) - listeners.get(i).propertyChange(event); - } - - abstract String getHeaderValue(); - - abstract String getLabelValue(ITrStreamFacade str); - -} \ No newline at end of file diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/NameListPane.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/NameListPane.java deleted file mode 100644 index 5a717af..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/NameListPane.java +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.ui.swt; - -import org.eclipse.swt.widgets.Composite; - -import com.itjw.txviewer.graph.data.ITrStreamFacade; - -public class NameListPane extends ListPane { - - public NameListPane(Composite parent, TxDisplay txDisplay) { - super(parent, txDisplay); - } - - @Override - String getLabelValue(ITrStreamFacade str) { - return str.getFullName(); - } - - @Override - String getHeaderValue() { - return "Name"; - } - -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas.java deleted file mode 100644 index 94059fa..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas.java +++ /dev/null @@ -1,386 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.ui.swt; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; - -import org.eclipse.swt.events.ControlAdapter; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.ScrollBar; - -public class SWTImageCanvas extends Canvas { - /* zooming rates in x and y direction are equal.*/ - final float ZOOMIN_RATE = 1.1f; /* zoomin rate */ - final float ZOOMOUT_RATE = 0.9f; /* zoomout rate */ - protected Image sourceImage; /* original image */ - private Image screenImage; /* screen image */ - private AffineTransform transform = new AffineTransform(); - protected boolean center; - - - /** - * Constructor for ScrollableCanvas. - * @param parent the parent of this control. - * @param style the style of this control. - */ - public SWTImageCanvas(final Composite parent, int style) { - super( parent, style ); - center=true; - addControlListener(new ControlAdapter() { /* resize listener. */ - public void controlResized(ControlEvent event) { - syncScrollBars(); - } - }); - addPaintListener(new PaintListener() { /* paint listener. */ - public void paintControl(final PaintEvent event) { - paint(event.gc); - } - }); - initScrollBars(); - } - - /** - * Dispose the garbage here - */ - public void dispose() { - if (sourceImage != null && !sourceImage.isDisposed()) { - sourceImage.dispose(); - } - if (screenImage != null && !screenImage.isDisposed()) { - screenImage.dispose(); - } - } - - /* Paint function */ - private void paint(GC gc) { - Rectangle clientRect = getClientArea(); /* Canvas' painting area */ - if (sourceImage != null) { - Rectangle imageRect = inverseTransformRect(transform, clientRect); - int gap = 2; /* find a better start point to render */ - imageRect.x -= gap; imageRect.y -= gap; - imageRect.width += 2 * gap; imageRect.height += 2 * gap; - - Rectangle imageBound = sourceImage.getBounds(); - imageRect = imageRect.intersection(imageBound); - Rectangle destRect = transformRect(transform, imageRect); - - if (screenImage != null) screenImage.dispose(); - screenImage = new Image(getDisplay(), clientRect.width, clientRect.height); - GC newGC = new GC(screenImage); - newGC.setClipping(clientRect); - newGC.drawImage(sourceImage, - imageRect.x, imageRect.y, imageRect.width, imageRect.height, - destRect.x, destRect.y, destRect.width, destRect.height); - newGC.dispose(); - - gc.drawImage(screenImage, 0, 0); - - postImagePaint(gc); - } else { - gc.setClipping(clientRect); - gc.fillRectangle(clientRect); - initScrollBars(); - } - } - - protected void postImagePaint(GC gc){ - // do nothing, to be overridden by childs - } - - /* Initalize the scrollbar and register listeners. */ - private void initScrollBars() { - ScrollBar horizontal = getHorizontalBar(); - horizontal.setEnabled(false); - horizontal.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent event) { - scrollHorizontally((ScrollBar) event.widget); - } - }); - ScrollBar vertical = getVerticalBar(); - vertical.setEnabled(false); - vertical.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent event) { - scrollVertically((ScrollBar) event.widget); - } - }); - } - - /* Scroll horizontally */ - private void scrollHorizontally(ScrollBar scrollBar) { - if (sourceImage == null) return; - - AffineTransform af = transform; - double tx = af.getTranslateX(); - double select = -scrollBar.getSelection(); - af.preConcatenate(AffineTransform.getTranslateInstance(select - tx, 0)); - transform = af; - syncScrollBars(); - } - - /* Scroll vertically */ - private void scrollVertically(ScrollBar scrollBar) { - if (sourceImage == null) return; - - AffineTransform af = transform; - double ty = af.getTranslateY(); - double select = -scrollBar.getSelection(); - af.preConcatenate(AffineTransform.getTranslateInstance(0, select - ty)); - transform = af; - syncScrollBars(); - } - - public void scrollToY(int y){ - ScrollBar vBar = getVerticalBar(); - vBar.setSelection(y); - scrollVertically(vBar); - } - - public void scrollToX(int x){ - ScrollBar hBar = getHorizontalBar(); - hBar.setSelection(x); - scrollHorizontally(hBar); - } - - /** - * Source image getter. - * @return sourceImage. - */ - public Image getSourceImage() { - return sourceImage; - } - - /** - * Source image setter. - * @return sourceImage. - */ - public void setSourceImage(Image sourceImage) { - if(this.sourceImage!=null) this.sourceImage.dispose(); - this.sourceImage=sourceImage; - } - - public AffineTransform getTransform() { - return transform; - } - - /** - * Synchronize the scrollbar with the image. If the transform is out - * of range, it will correct it. This function considers only following - * factors : transform, image size, client area. - */ - public void syncScrollBars() { - if (sourceImage == null) { - redraw(); - return; - } - - AffineTransform af = transform; - double sx = af.getScaleX(), sy = af.getScaleY(); - double tx = af.getTranslateX(), ty = af.getTranslateY(); - if (tx > 0) tx = 0; - if (ty > 0) ty = 0; - - ScrollBar horizontal = getHorizontalBar(); - horizontal.setIncrement((int) (getClientArea().width / 100)); - horizontal.setPageIncrement(getClientArea().width); - Rectangle imageBound = sourceImage.getBounds(); - int cw = getClientArea().width, ch = getClientArea().height; - if (imageBound.width * sx > cw) { /* image is wider than client area */ - horizontal.setMaximum((int) (imageBound.width * sx)); - horizontal.setEnabled(true); - if (((int) - tx) > horizontal.getMaximum() - cw) - tx = -horizontal.getMaximum() + cw; - } else { /* image is narrower than client area */ - horizontal.setEnabled(false); - tx = center?((cw - imageBound.width * sx) / 2):0; //center or put left if too small. - } - horizontal.setSelection((int) (-tx)); - horizontal.setThumb((int) (getClientArea().width)); - - ScrollBar vertical = getVerticalBar(); - vertical.setIncrement((int) (getClientArea().height / 100)); - vertical.setPageIncrement((int) (getClientArea().height)); - if (imageBound.height * sy > ch) { /* image is higher than client area */ - vertical.setMaximum((int) (imageBound.height * sy)); - vertical.setEnabled(true); - if (((int) - ty) > vertical.getMaximum() - ch) - ty = -vertical.getMaximum() + ch; - } else { /* image is less higher than client area */ - vertical.setEnabled(false); - ty = center?((ch - imageBound.height * sy) / 2):0; //center or put top if too small. - } - vertical.setSelection((int) (-ty)); - vertical.setThumb((int) (getClientArea().height)); - - /* update transform. */ - af = AffineTransform.getScaleInstance(sx, sy); - af.preConcatenate(AffineTransform.getTranslateInstance(tx, ty)); - transform = af; - - redraw(); - } - - /** - * Fit the image onto the canvas - */ - public void fitCanvas() { - if (sourceImage == null) return; - Rectangle imageBound = sourceImage.getBounds(); - Rectangle destRect = getClientArea(); - double sx = (double) destRect.width / (double) imageBound.width; - double sy = (double) destRect.height / (double) imageBound.height; - double s = Math.min(sx, sy); - double dx = 0.5 * destRect.width; - double dy = 0.5 * destRect.height; - centerZoom(dx, dy, s, new AffineTransform()); - } - - /** - * Show the image with the original size - */ - public void resetTransform() { - if (sourceImage == null) return; - transform = new AffineTransform(); - syncScrollBars(); - } - - /** - * Perform a zooming operation centered on the given point - * (dx, dy) and using the given scale factor. - * The given AffineTransform instance is preconcatenated. - * @param dx center x - * @param dy center y - * @param scale zoom rate - * @param af original affinetransform - */ - public void centerZoom(double dx, double dy, double scale, AffineTransform af) { - af.preConcatenate(AffineTransform.getTranslateInstance(-dx, -dy)); - af.preConcatenate(AffineTransform.getScaleInstance(scale, scale)); - af.preConcatenate(AffineTransform.getTranslateInstance(dx, dy)); - transform = af; - syncScrollBars(); - } - - /** - * Zoom in around the center of client Area. - */ - public void zoomIn() { - if (sourceImage == null) return; - Rectangle rect = getClientArea(); - int w = rect.width, h = rect.height; - double dx = ((double) w) / 2; - double dy = ((double) h) / 2; - centerZoom(dx, dy, ZOOMIN_RATE, transform); - } - - /** - * Zoom out around the center of client Area. - */ - public void zoomOut() { - if (sourceImage == null) return; - Rectangle rect = getClientArea(); - int w = rect.width, h = rect.height; - double dx = ((double) w) / 2; - double dy = ((double) h) / 2; - centerZoom(dx, dy, ZOOMOUT_RATE, transform); - } - - /** - * Given an arbitrary rectangle, get the rectangle with the given transform. - * The result rectangle is positive width and positive height. - * @param af AffineTransform - * @param src source rectangle - * @return rectangle after transform with positive width and height - */ - protected static Rectangle transformRect(AffineTransform af, Rectangle src){ - Rectangle dest= new Rectangle(0,0,0,0); - src=absRect(src); - Point p1=new Point(src.x,src.y); - p1=transformPoint(af,p1); - dest.x=p1.x; dest.y=p1.y; - dest.width=(int)(src.width*af.getScaleX()); - dest.height=(int)(src.height*af.getScaleY()); - return dest; - } - - /** - * Given an arbitrary rectangle, get the rectangle with the inverse given transform. - * The result rectangle is positive width and positive height. - * @param af AffineTransform - * @param src source rectangle - * @return rectangle after transform with positive width and height - */ - protected static Rectangle inverseTransformRect(AffineTransform af, Rectangle src){ - Rectangle dest= new Rectangle(0,0,0,0); - src=absRect(src); - Point p1=new Point(src.x,src.y); - p1=inverseTransformPoint(af,p1); - dest.x=p1.x; dest.y=p1.y; - dest.width=(int)(src.width/af.getScaleX()); - dest.height=(int)(src.height/af.getScaleY()); - return dest; - } - /** - * Given an arbitrary point, get the point with the given transform. - * @param af affine transform - * @param pt point to be transformed - * @return point after tranform - */ - protected static Point transformPoint(AffineTransform af, Point pt) { - Point2D src = new Point2D.Float(pt.x, pt.y); - Point2D dest= af.transform(src, null); - Point point=new Point((int)Math.floor(dest.getX()), (int)Math.floor(dest.getY())); - return point; - } - - /** - * Given an arbitrary point, get the point with the inverse given transform. - * @param af AffineTransform - * @param pt source point - * @return point after transform - */ - protected static Point inverseTransformPoint(AffineTransform af, Point pt){ - Point2D src=new Point2D.Float(pt.x,pt.y); - try{ - Point2D dest= af.inverseTransform(src, null); - return new Point((int)Math.floor(dest.getX()), (int)Math.floor(dest.getY())); - }catch (Exception e){ - e.printStackTrace(); - return new Point(0,0); - } - } - - /** - * Given arbitrary rectangle, return a rectangle with upper-left - * start and positive width and height. - * @param src source rectangle - * @return result rectangle with positive width and height - */ - protected static Rectangle absRect(Rectangle src){ - Rectangle dest= new Rectangle(0,0,0,0); - if(src.width<0) { dest.x=src.x+src.width+1; dest.width=-src.width; } - else{ dest.x=src.x; dest.width=src.width; } - if(src.height<0) { dest.y=src.y+src.height+1; dest.height=-src.height; } - else{ dest.y=src.y; dest.height=src.height; } - return dest; - } - -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/TxDisplay.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/TxDisplay.java deleted file mode 100644 index cb32baf..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/TxDisplay.java +++ /dev/null @@ -1,180 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.ui.swt; - -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; - -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.SashForm; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.ScrollBar; -import org.eclipse.ui.IWorkbenchPartSite; - -import com.itjw.txviewer.database.ITrStream; -import com.itjw.txviewer.database.ITransaction; -import com.itjw.txviewer.graph.TrHierNodeSelection; -import com.itjw.txviewer.graph.TransactionSelection; -import com.itjw.txviewer.graph.TxEditorPart; -import com.itjw.txviewer.graph.data.ITrDbFacade; -import com.itjw.txviewer.graph.data.ITrStreamFacade; -import com.itjw.txviewer.graph.data.ITransactionFacade; - -public class TxDisplay implements PropertyChangeListener, ISelectionProvider{ - - private TxEditorPart txEditor; - private SashForm sashFormTop; - private ListPane txNamePane; - private ListPane txValuePane; - private WaveImageCanvas waveImageCanvas; - - private ListenerList listeners = new ListenerList(); - private ITrStreamFacade currentStreamSelection; - private ITransactionFacade currentSelection; - - public TxDisplay(Composite parent, TxEditorPart txEditorPart, IWorkbenchPartSite site) { - txEditor = txEditorPart; - sashFormTop = new SashForm(parent, SWT.HORIZONTAL+SWT.BORDER); - sashFormTop.setLayoutData(new GridData(GridData.FILL_BOTH)); - final SashForm sashFormLeft = new SashForm(sashFormTop, SWT.HORIZONTAL); - txNamePane = new NameListPane(sashFormLeft, this); - txNamePane.addLabelClickListener(this); - txValuePane = new ValueListPane(sashFormLeft, this); - txValuePane.addLabelClickListener(this); - waveImageCanvas = new WaveImageCanvas(sashFormTop, SWT.DOUBLE_BUFFERED|SWT.H_SCROLL|SWT.V_SCROLL); - waveImageCanvas.addMouseListener(new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - currentSelection = waveImageCanvas.getTransactionAtPos(new Point(e.x, e.y)); - waveImageCanvas.setCurrentSelection(currentSelection); - if(currentSelection!=null || currentStreamSelection!=null) - setSelection(getSelection()); - else - setSelection(StructuredSelection.EMPTY); - } - }); - txNamePane.scroll.getVerticalBar().addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - int y = ((ScrollBar) e.widget).getSelection(); - txValuePane.scrollToY(y); - waveImageCanvas.scrollToY(y); - } - }); - txValuePane.scroll.getVerticalBar().addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - int y = ((ScrollBar) e.widget).getSelection(); - txNamePane.scrollToY(y); - waveImageCanvas.scrollToY(y); - } - }); - waveImageCanvas.getVerticalBar().addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - int y = ((ScrollBar) e.widget).getSelection(); - txNamePane.scrollToY(y); - txValuePane.scrollToY(y); - } - }); - - sashFormTop.setWeights(new int[] {30, 70}); - sashFormLeft.setWeights(new int[] {75, 25}); - - if(txEditor.getModel()!= null) - streamListChanged(); - } - - public TxEditorPart getTxEditor() { - return txEditor; - } - - public void streamListChanged() { - waveImageCanvas.setWaveformList(getTxEditor().getStreamList()); - txNamePane.streamListChanged(); - txValuePane.streamListChanged(); - sashFormTop.redraw(); - } - - public void addSelectionListener(SelectionListener listener) { - waveImageCanvas.addSelectionListener(listener); - } - - @Override - public void propertyChange(PropertyChangeEvent pce) { - if(pce.getPropertyName().equals(ITrDbFacade.DATABASE)){ - streamListChanged(); - }else if(pce.getPropertyName().equals(ListPane.SELECTION)){ - currentSelection=null; - ITrStream str = (ITrStream)pce.getNewValue(); - if(str instanceof ITrStreamFacade) - currentStreamSelection=(ITrStreamFacade)str; - else - currentStreamSelection=new ITrStreamFacade(str); - if(currentStreamSelection!=null) - setSelection(getSelection()); - else - setSelection(StructuredSelection.EMPTY); - } - - } - - @Override - public void addSelectionChangedListener(ISelectionChangedListener listener) { - listeners.add(listener); - } - - @Override - public ISelection getSelection() { - if(currentSelection!=null) - return new TransactionSelection(currentSelection); - else if(currentStreamSelection!=null) - return new TrHierNodeSelection(currentStreamSelection); - else - return null; - } - - @Override - public void removeSelectionChangedListener(ISelectionChangedListener listener) { - listeners.remove(listener); - } - - @Override - public void setSelection(ISelection selection) { - if(selection instanceof TransactionSelection){ - ITransaction tr =((TransactionSelection)selection).getFirstElement(); - currentSelection = (tr instanceof ITransactionFacade)?(ITransactionFacade)tr:new ITransactionFacade(tr); - } - Object[] list = listeners.getListeners(); - for (int i = 0; i < list.length; i++) { - ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); - } - if(waveImageCanvas.getCurrentSelection()!=currentSelection) - waveImageCanvas.setCurrentSelection(currentSelection); - waveImageCanvas.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - waveImageCanvas.redraw(); - } - }); - } - -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ValueListPane.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ValueListPane.java deleted file mode 100644 index 1ab6f92..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ValueListPane.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.ui.swt; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; - -import com.itjw.txviewer.graph.data.ITrStreamFacade; - -public class ValueListPane extends ListPane { - - public ValueListPane(Composite parent, TxDisplay txDisplay) { - super(parent, txDisplay); - } - - @Override - String getLabelValue(ITrStreamFacade str) { - return str.getValueAtCursor(0); - } - - @Override - String getHeaderValue() { - return "Value"; - } - - protected void formatLabel(Label l, ITrStreamFacade str, int trackIdx){ - super.formatLabel(l, str, trackIdx); - l.setAlignment(SWT.CENTER); - } - -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/WaveImageCanvas.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/WaveImageCanvas.java deleted file mode 100644 index 101fda0..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/WaveImageCanvas.java +++ /dev/null @@ -1,223 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.ui.swt; - -import java.util.Iterator; -import java.util.LinkedList; -import java.util.TreeMap; -import java.util.Vector; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.TypedListener; - -import com.itjw.txviewer.database.ITransaction; -import com.itjw.txviewer.graph.TxEditorPlugin; -import com.itjw.txviewer.graph.data.ITrStreamFacade; -import com.itjw.txviewer.graph.data.ITransactionFacade; - -public class WaveImageCanvas extends SWTImageCanvas{ - - static final int rulerHeight = 20; - static final int rulerTickMinor = 10; - static final int rulerTickMajor = 100; - static final int trackHeight = 50; - static final int trackInset =2; - static final int txHeight = trackHeight-2*trackInset; - - private TxEditorPlugin plugin; - private Rectangle size = new Rectangle(0,0,0,0); - private TreeMap loc2str; - private TreeMap strId2bb; - - private ITransactionFacade currentSelection; - - public WaveImageCanvas(final Composite parent) { - this(parent, SWT.NONE); - } - - public WaveImageCanvas(final Composite parent, int style) { - super(parent, style | SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_BACKGROUND); - plugin=TxEditorPlugin.getDefault(); - loc2str=new TreeMap(); - strId2bb=new TreeMap(); - center=false; - } - - public void setWaveformList(LinkedList linkedList){ - double maxTime=1.0; - int height=rulerHeight; - for(ITrStreamFacade str:linkedList){ - maxTime = Math.max(maxTime, str.getDb().getMaxTime().getValueNS()); - int strHeight=str.getMaxConcurrrentTx(); - str.setHeight(strHeight*trackHeight); - height+=str.getHeight(); - } - size = new Rectangle(0,0,(int) Math.ceil(maxTime),height); - Image buffer = new Image(getDisplay(), size); - GC gc = new GC(buffer); - gc.setAntialias(SWT.ON); - int trackOffset=rulerHeight; - int trackIdx=0; - Vector rowendtime = new Vector(); - loc2str.clear(); - strId2bb.clear(); - for(ITrStreamFacade str:linkedList){ - loc2str.put(trackOffset, str); - rowendtime.clear(); - rowendtime.add(0); - drawTrack(gc, new Rectangle(0, trackOffset, size.width, trackHeight), trackIdx); - for(ITransaction tx: str.getTransactions()){ - int rowIdx=0; - Integer beginTime = (int)(tx.getBeginTime().getValueNS()); - Integer endTime = (int)(tx.getEndTime().getValueNS()); - for(rowIdx=0; rowendtime.size()beginTime; rowIdx++); - if(rowendtime.size()<=rowIdx){ - rowendtime.add(endTime!=null?endTime:beginTime+1); - drawTrack(gc, new Rectangle(0, trackOffset+rowIdx*trackHeight, size.width, trackHeight), trackIdx); - } else { - rowendtime.set(rowIdx, endTime!=null?endTime:beginTime+1); - } - int width = endTime!=null?endTime-beginTime:1; - Rectangle bb = new Rectangle(beginTime, trackOffset+rowIdx*trackHeight+trackInset, width, txHeight); - strId2bb.put(tx.getId(), bb); - drawTx(gc, bb); - } - trackOffset+=rowendtime.size()*trackHeight; - trackIdx++; - } - gc.dispose(); - setSourceImage(buffer); - redraw(); - syncScrollBars(); - } - - private void drawTx(GC gc, Rectangle bb){ - gc.setForeground(plugin.getColor(TxEditorPlugin.lineColor)); - gc.setFillRule(SWT.FILL_EVEN_ODD); - gc.setBackground(plugin.getColor(TxEditorPlugin.txBgColor)); - gc.setLineWidth(1); - gc.setLineStyle(SWT.LINE_SOLID); - if(bb.width<8){ - gc.fillRectangle(bb); - gc.drawRectangle(bb); - } else { - gc.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, 4, 4); - gc.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, 4, 4); - } - } - - private void drawHighliteTx(GC gc, Rectangle bb){ - gc.setForeground(plugin.getColor(TxEditorPlugin.highliteLineColor)); - gc.setFillRule(SWT.FILL_EVEN_ODD); - gc.setBackground(plugin.getColor(TxEditorPlugin.txHighliteBgColor)); - gc.setLineWidth(1); - gc.setLineStyle(SWT.LINE_SOLID); - if(bb.width<10){ - gc.fillRectangle(bb); - gc.drawRectangle(bb); - } else { - gc.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5); - gc.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5); - } - } - - private void drawTrack(GC gc, Rectangle bb, int trackIdx){ - gc.setForeground(plugin.getColor(TxEditorPlugin.lineColor)); - gc.setFillRule(SWT.FILL_EVEN_ODD); - gc.setBackground(trackIdx%2==0? - plugin.getColor(TxEditorPlugin.trackBgLightColor): - plugin.getColor(TxEditorPlugin.trackBgDarkColor)); - gc.setLineWidth(1); - gc.setLineStyle(SWT.LINE_SOLID); - gc.fillRectangle(bb); - gc.drawLine(bb.x, bb.y+bb.height/2, bb.width, bb.y+bb.height/2); - } - - protected void postImagePaint(GC gc){ - Rectangle imageRect = inverseTransformRect(getTransform(), getClientArea()); - if(currentSelection!=null){ - Rectangle bb = strId2bb.get(currentSelection.getId()); - if(bb != null) { - drawHighliteTx(gc, new Rectangle(bb.x-imageRect.x, bb.y-imageRect.y, bb.width, bb.height)); - } else - System.err.print("No bounding box for transaction "+currentSelection.getId()+" found!"); - } - drawRuler(gc, imageRect); - } - - private void drawRuler(GC gc, Rectangle clientRect) { - int startMinorIncr = ((int)(clientRect.x/rulerTickMinor))*rulerTickMinor; - gc.setBackground(getDisplay().getSystemColor (SWT.COLOR_WIDGET_BACKGROUND)); - gc.fillRectangle(new Rectangle(-clientRect.x, 0, clientRect.width, rulerHeight)); - gc.setBackground(plugin.getColor(TxEditorPlugin.headerBgColor)); - gc.fillRectangle(new Rectangle(-clientRect.x, 0, clientRect.width, rulerHeight-1)); - gc.setForeground(plugin.getColor(TxEditorPlugin.headerFgColor)); - gc.drawLine(-clientRect.x, rulerHeight-2, clientRect.width+clientRect.x, rulerHeight-2); - for(int x=startMinorIncr; x<(clientRect.x+clientRect.width); x+=rulerTickMinor){ - if((x%rulerTickMajor)==0){ - gc.drawLine(x-clientRect.x, 10, x-clientRect.x, rulerHeight-2); - gc.drawText(Integer.toString(x), x-clientRect.x, 0); - }else{ - gc.drawLine(x-clientRect.x, 15, x-clientRect.x, rulerHeight-2); - } - } - } - - private ITransaction getTrAtTime(ITrStreamFacade str, double t){ - ITransaction res=null; - Iterator iter = str.getTransactions().iterator(); - while(iter.hasNext()){ - res = iter.next(); - if(res.getEndTime().getValueNS()>=t) break; - } - if(res!=null && res.getBeginTime().getValueNS()-10 { - private A first; - private B second; - - public Pair(A first, B second) { - super(); - this.first = first; - this.second = second; - } - - public int hashCode() { - int hashFirst = first != null ? first.hashCode() : 0; - int hashSecond = second != null ? second.hashCode() : 0; - - return (hashFirst + hashSecond) * hashSecond + hashFirst; - } - - @SuppressWarnings("unchecked") - public boolean equals(Object other) { - if (other instanceof Pair) { - Pair otherPair = (Pair)other; - return - (( this.first == otherPair.first || - ( this.first != null && otherPair.first != null && - this.first.equals(otherPair.first))) && - ( this.second == otherPair.second || - ( this.second != null && otherPair.second != null && - this.second.equals(otherPair.second))) ); - } - - return false; - } - - public String toString() - { - return "(" + first + ", " + second + ")"; - } - - public A getFirst() { - return first; - } - - public void setFirst(A first) { - this.first = first; - } - - public B getSecond() { - return second; - } - - public void setSecond(B second) { - this.second = second; - } -} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/TxDbView.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/TxDbView.java deleted file mode 100644 index 91e0f13..0000000 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/TxDbView.java +++ /dev/null @@ -1,304 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 IT Just working. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IT Just working - initial API and implementation - *******************************************************************************/ -package com.itjw.txviewer.graph.views; - -import java.util.ArrayList; - -import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.part.*; -import org.eclipse.jface.viewers.*; -import org.eclipse.swt.graphics.Image; -import org.eclipse.jface.action.*; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.ui.*; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.SWT; -import org.eclipse.core.runtime.IAdaptable; - - -/** - * This sample class demonstrates how to plug-in a new - * workbench view. The view shows data obtained from the - * model. The sample creates a dummy model on the fly, - * but a real implementation would connect to the model - * available either in this or another plug-in (e.g. the workspace). - * The view is connected to the model using a content provider. - *

- * The view uses a label provider to define how model - * objects should be presented in the view. Each - * view can present the same model objects using - * different labels and icons, if needed. Alternatively, - * a single label provider can be shared between views - * in order to ensure that objects of the same type are - * presented in the same way everywhere. - *

- */ - -public class TxDbView extends ViewPart { - - /** - * The ID of the view as specified by the extension. - */ - public static final String ID = "com.itjw.txviewer.graph.views.TxDbView"; - - private TreeViewer viewer; - private DrillDownAdapter drillDownAdapter; - private Action action1; - private Action action2; - private Action doubleClickAction; - - /* - * The content provider class is responsible for - * providing objects to the view. It can wrap - * existing objects in adapters or simply return - * objects as-is. These objects may be sensitive - * to the current input of the view, or ignore - * it and always show the same content - * (like Task List, for example). - */ - - class TreeObject implements IAdaptable { - private String name; - private TreeParent parent; - - public TreeObject(String name) { - this.name = name; - } - public String getName() { - return name; - } - public void setParent(TreeParent parent) { - this.parent = parent; - } - public TreeParent getParent() { - return parent; - } - public String toString() { - return getName(); - } - @SuppressWarnings("rawtypes") - public Object getAdapter(Class key) { - return null; - } - } - - class TreeParent extends TreeObject { - private ArrayList children; - public TreeParent(String name) { - super(name); - children = new ArrayList(); - } - public void addChild(TreeObject child) { - children.add(child); - child.setParent(this); - } - public void removeChild(TreeObject child) { - children.remove(child); - child.setParent(null); - } - public TreeObject [] getChildren() { - return children.toArray(new TreeObject[children.size()]); - } - public boolean hasChildren() { - return children.size()>0; - } - } - - class ViewContentProvider implements IStructuredContentProvider, - ITreeContentProvider { - private TreeParent invisibleRoot; - - public void inputChanged(Viewer v, Object oldInput, Object newInput) { - } - public void dispose() { - } - public Object[] getElements(Object parent) { - if (parent.equals(getViewSite())) { - if (invisibleRoot==null) initialize(); - return getChildren(invisibleRoot); - } - return getChildren(parent); - } - public Object getParent(Object child) { - if (child instanceof TreeObject) { - return ((TreeObject)child).getParent(); - } - return null; - } - public Object [] getChildren(Object parent) { - if (parent instanceof TreeParent) { - return ((TreeParent)parent).getChildren(); - } - return new Object[0]; - } - public boolean hasChildren(Object parent) { - if (parent instanceof TreeParent) - return ((TreeParent)parent).hasChildren(); - return false; - } -/* - * We will set up a dummy model to initialize tree heararchy. - * In a real code, you will connect to a real model and - * expose its hierarchy. - */ - private void initialize() { - TreeObject to1 = new TreeObject("Leaf 1"); - TreeObject to2 = new TreeObject("Leaf 2"); - TreeObject to3 = new TreeObject("Leaf 3"); - TreeParent p1 = new TreeParent("Parent 1"); - p1.addChild(to1); - p1.addChild(to2); - p1.addChild(to3); - - TreeObject to4 = new TreeObject("Leaf 4"); - TreeParent p2 = new TreeParent("Parent 2"); - p2.addChild(to4); - - TreeParent root = new TreeParent("Root"); - root.addChild(p1); - root.addChild(p2); - - invisibleRoot = new TreeParent(""); - invisibleRoot.addChild(root); - } - } - class ViewLabelProvider extends LabelProvider { - - public String getText(Object obj) { - return obj.toString(); - } - public Image getImage(Object obj) { - String imageKey = ISharedImages.IMG_OBJ_ELEMENT; - if (obj instanceof TreeParent) - imageKey = ISharedImages.IMG_OBJ_FOLDER; - return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey); - } - } - class NameSorter extends ViewerSorter { - } - - /** - * The constructor. - */ - public TxDbView() { - } - - /** - * This is a callback that will allow us - * to create the viewer and initialize it. - */ - public void createPartControl(Composite parent) { - viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); - drillDownAdapter = new DrillDownAdapter(viewer); - viewer.setContentProvider(new ViewContentProvider()); - viewer.setLabelProvider(new ViewLabelProvider()); - viewer.setSorter(new NameSorter()); - viewer.setInput(getViewSite()); - - // Create the help context id for the viewer's control - PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "com.itjw.txviewer.graph.viewer"); - makeActions(); - hookContextMenu(); - hookDoubleClickAction(); - contributeToActionBars(); - } - - private void hookContextMenu() { - MenuManager menuMgr = new MenuManager("#PopupMenu"); - menuMgr.setRemoveAllWhenShown(true); - menuMgr.addMenuListener(new IMenuListener() { - public void menuAboutToShow(IMenuManager manager) { - TxDbView.this.fillContextMenu(manager); - } - }); - Menu menu = menuMgr.createContextMenu(viewer.getControl()); - viewer.getControl().setMenu(menu); - getSite().registerContextMenu(menuMgr, viewer); - } - - private void contributeToActionBars() { - IActionBars bars = getViewSite().getActionBars(); - fillLocalPullDown(bars.getMenuManager()); - fillLocalToolBar(bars.getToolBarManager()); - } - - private void fillLocalPullDown(IMenuManager manager) { - manager.add(action1); - manager.add(new Separator()); - manager.add(action2); - } - - private void fillContextMenu(IMenuManager manager) { - manager.add(action1); - manager.add(action2); - manager.add(new Separator()); - drillDownAdapter.addNavigationActions(manager); - // Other plug-ins can contribute there actions here - manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - } - - private void fillLocalToolBar(IToolBarManager manager) { - manager.add(action1); - manager.add(action2); - manager.add(new Separator()); - drillDownAdapter.addNavigationActions(manager); - } - - private void makeActions() { - action1 = new Action() { - public void run() { - showMessage("Action 1 executed"); - } - }; - action1.setText("Action 1"); - action1.setToolTipText("Action 1 tooltip"); - action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages(). - getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); - - action2 = new Action() { - public void run() { - showMessage("Action 2 executed"); - } - }; - action2.setText("Action 2"); - action2.setToolTipText("Action 2 tooltip"); - action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages(). - getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); - doubleClickAction = new Action() { - public void run() { - ISelection selection = viewer.getSelection(); - Object obj = ((IStructuredSelection)selection).getFirstElement(); - showMessage("Double-click detected on "+obj.toString()); - } - }; - } - - private void hookDoubleClickAction() { - viewer.addDoubleClickListener(new IDoubleClickListener() { - public void doubleClick(DoubleClickEvent event) { - doubleClickAction.run(); - } - }); - } - private void showMessage(String message) { - MessageDialog.openInformation( - viewer.getControl().getShell(), - "Transaction Database View", - message); - } - - /** - * Passing the focus request to the viewer's control. - */ - public void setFocus() { - viewer.getControl().setFocus(); - } -} \ No newline at end of file diff --git a/com.itjw.txviewer.graph/.classpath b/com.itjw.txviewer.ui/.classpath similarity index 83% rename from com.itjw.txviewer.graph/.classpath rename to com.itjw.txviewer.ui/.classpath index 8586d88..a8ac72c 100644 --- a/com.itjw.txviewer.graph/.classpath +++ b/com.itjw.txviewer.ui/.classpath @@ -3,6 +3,6 @@ - + diff --git a/com.itjw.txviewer.ui/.gitignore b/com.itjw.txviewer.ui/.gitignore new file mode 100644 index 0000000..5e56e04 --- /dev/null +++ b/com.itjw.txviewer.ui/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/com.itjw.txviewer.graph/.project b/com.itjw.txviewer.ui/.project similarity index 94% rename from com.itjw.txviewer.graph/.project rename to com.itjw.txviewer.ui/.project index 28dd19b..a9813dd 100644 --- a/com.itjw.txviewer.graph/.project +++ b/com.itjw.txviewer.ui/.project @@ -1,6 +1,6 @@ - com.itjw.txviewer.graph + com.itjw.txviewer.ui diff --git a/com.itjw.txviewer.ui/.settings/org.eclipse.jdt.groovy.core.prefs b/com.itjw.txviewer.ui/.settings/org.eclipse.jdt.groovy.core.prefs new file mode 100644 index 0000000..a7f72ec --- /dev/null +++ b/com.itjw.txviewer.ui/.settings/org.eclipse.jdt.groovy.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +groovy.compiler.level=23 diff --git a/com.itjw.txviewer.graph/META-INF/MANIFEST.MF b/com.itjw.txviewer.ui/META-INF/MANIFEST.MF similarity index 59% rename from com.itjw.txviewer.graph/META-INF/MANIFEST.MF rename to com.itjw.txviewer.ui/META-INF/MANIFEST.MF index 6d500d7..578261a 100644 --- a/com.itjw.txviewer.graph/META-INF/MANIFEST.MF +++ b/com.itjw.txviewer.ui/META-INF/MANIFEST.MF @@ -1,9 +1,9 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Graph -Bundle-SymbolicName: com.itjw.txviewer.graph; singleton:=true +Bundle-SymbolicName: com.itjw.txviewer.ui;singleton:=true Bundle-Version: 1.0.0.qualifier -Bundle-Activator: com.itjw.txviewer.graph.TxEditorPlugin +Bundle-Activator: com.itjw.txviewer.ui.TxEditorPlugin Bundle-Vendor: ITJW Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, @@ -12,8 +12,12 @@ Require-Bundle: org.eclipse.ui, org.eclipse.ui.editors, org.eclipse.ui.ide, org.eclipse.gef, - org.eclipse.ui.views.properties.tabbed -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 + org.eclipse.ui.views.properties.tabbed, + org.eclipse.swt, + org.eclipse.osgi +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ActivationPolicy: lazy Import-Package: com.itjw.txviewer.database, org.eclipse.ui.views.contentoutline +Bundle-ClassPath: ., + swing2swt.jar diff --git a/com.itjw.txviewer.graph/build.properties b/com.itjw.txviewer.ui/build.properties similarity index 75% rename from com.itjw.txviewer.graph/build.properties rename to com.itjw.txviewer.ui/build.properties index c4166fb..02d6e35 100644 --- a/com.itjw.txviewer.graph/build.properties +++ b/com.itjw.txviewer.ui/build.properties @@ -5,4 +5,5 @@ bin.includes = plugin.xml,\ .,\ icons/,\ contexts.xml,\ - res/ + res/,\ + swing2swt.jar diff --git a/com.itjw.txviewer.graph/contexts.xml b/com.itjw.txviewer.ui/contexts.xml similarity index 100% rename from com.itjw.txviewer.graph/contexts.xml rename to com.itjw.txviewer.ui/contexts.xml diff --git a/com.itjw.txviewer.graph/icons/sample.gif b/com.itjw.txviewer.ui/icons/sample.gif similarity index 100% rename from com.itjw.txviewer.graph/icons/sample.gif rename to com.itjw.txviewer.ui/icons/sample.gif diff --git a/com.itjw.txviewer.ui/plugin.xml b/com.itjw.txviewer.ui/plugin.xml new file mode 100644 index 0000000..6d036a9 --- /dev/null +++ b/com.itjw.txviewer.ui/plugin.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/com.itjw.txviewer.graph/res/images/database.png b/com.itjw.txviewer.ui/res/images/database.png similarity index 100% rename from com.itjw.txviewer.graph/res/images/database.png rename to com.itjw.txviewer.ui/res/images/database.png diff --git a/com.itjw.txviewer.graph/res/images/folder.png b/com.itjw.txviewer.ui/res/images/folder.png similarity index 100% rename from com.itjw.txviewer.graph/res/images/folder.png rename to com.itjw.txviewer.ui/res/images/folder.png diff --git a/com.itjw.txviewer.graph/res/images/stream.png b/com.itjw.txviewer.ui/res/images/stream.png similarity index 100% rename from com.itjw.txviewer.graph/res/images/stream.png rename to com.itjw.txviewer.ui/res/images/stream.png diff --git a/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorActionBarContributor.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorActionBarContributor.java new file mode 100644 index 0000000..0871350 --- /dev/null +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorActionBarContributor.java @@ -0,0 +1,11 @@ +package com.itjw.txviewer.ui; + +import org.eclipse.ui.part.EditorActionBarContributor; + +public class TxEditorActionBarContributor extends EditorActionBarContributor { + + public TxEditorActionBarContributor() { + // TODO Auto-generated constructor stub + } + +} diff --git a/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorInput.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorInput.java new file mode 100644 index 0000000..916bf09 --- /dev/null +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorInput.java @@ -0,0 +1,32 @@ +package com.itjw.txviewer.ui; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.ui.IMemento; +import org.eclipse.ui.part.FileEditorInput; + +public class TxEditorInput extends FileEditorInput { + + private ArrayList streamNames; + + public TxEditorInput(IFile file) { + super(file); + streamNames=new ArrayList(); + } + + public String getFactoryId(){ + return TxEditorInputFactory.getFactoryId(); + } + + public void saveState(IMemento memento) { + TxEditorInputFactory.saveState(memento, this); + } + + public List getStreamNames() { + return streamNames; + } + +} diff --git a/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorInputFactory.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorInputFactory.java new file mode 100644 index 0000000..ce41a44 --- /dev/null +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorInputFactory.java @@ -0,0 +1,99 @@ +package com.itjw.txviewer.ui; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.Path; +import org.eclipse.ui.IElementFactory; +import org.eclipse.ui.IMemento; + +public class TxEditorInputFactory implements IElementFactory { + + /** + * Factory id. The workbench plug-in registers a factory by this name + * with the "org.eclipse.ui.elementFactories" extension point. + */ + private static final String ID_FACTORY = "com.itjw.txviewer.ui.TxEditorInputFactory"; //$NON-NLS-1$ + + /** + * Tag for the IFile.fullPath of the file resource. + */ + private static final String TAG_PATH = "path"; //$NON-NLS-1$ + + private static final String STREAMLIST_PATH = "stream_list"; //$NON-NLS-1$ + + /** + * Creates a new factory. + */ + public TxEditorInputFactory() { + } + + /* (non-Javadoc) + * Method declared on IElementFactory. + */ + @SuppressWarnings("unchecked") + public IAdaptable createElement(IMemento memento) { + // Get the file name. + String fileName = memento.getString(TAG_PATH); + if (fileName == null) { + return null; + } + + // Get a handle to the IFile...which can be a handle + // to a resource that does not exist in workspace + IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fileName)); + if (file != null) { + TxEditorInput tei = new TxEditorInput(file); + String listData = memento.getString(STREAMLIST_PATH); + if (listData != null) { + try { + ByteArrayInputStream bais = new ByteArrayInputStream(javax.xml.bind.DatatypeConverter.parseHexBinary(listData)); + ObjectInputStream ois = new ObjectInputStream(bais); + Object obj = ois.readObject(); + if(obj instanceof List) + tei.getStreamNames().addAll((List)obj); + } catch (Exception e) { + } + } + return tei; + } + return null; + } + + /** + * Returns the element factory id for this class. + * + * @return the element factory id + */ + public static String getFactoryId() { + return ID_FACTORY; + } + + /** + * Saves the state of the given file editor input into the given memento. + * + * @param memento the storage area for element state + * @param input the file editor input + */ + public static void saveState(IMemento memento, TxEditorInput input) { + IFile file = input.getFile(); + memento.putString(TAG_PATH, file.getFullPath().toString()); + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(input.getStreamNames()); + memento.putString(STREAMLIST_PATH, javax.xml.bind.DatatypeConverter.printHexBinary(baos.toByteArray())); + } catch (IOException e) { + } + } +} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPart.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorPart.java similarity index 53% rename from com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPart.java rename to com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorPart.java index d3cda33..520880b 100644 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPart.java +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorPart.java @@ -8,16 +8,14 @@ * Contributors: * IT Just working - initial API and implementation *******************************************************************************/ -package com.itjw.txviewer.graph; +package com.itjw.txviewer.ui; -import java.util.LinkedList; +import java.util.List; import org.eclipse.core.resources.IFile; -import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.gef.ui.actions.ActionRegistry; -import org.eclipse.gef.ui.parts.SelectionSynchronizer; import org.eclipse.jface.action.Action; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; @@ -26,38 +24,36 @@ import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.PartInitException; +import org.eclipse.ui.ide.FileStoreEditorInput; import org.eclipse.ui.part.EditorPart; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.eclipse.ui.views.properties.IPropertySheetPage; import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; import com.itjw.txviewer.database.ITrDb; import com.itjw.txviewer.database.ITrStream; -import com.itjw.txviewer.database.InputFormatException; -import com.itjw.txviewer.graph.actions.AddToWave; -import com.itjw.txviewer.graph.data.ITrDbFacade; -import com.itjw.txviewer.graph.data.ITrStreamFacade; -import com.itjw.txviewer.graph.ui.swt.TxDisplay; +import com.itjw.txviewer.database.ITransactionDbFactory; +import com.itjw.txviewer.ui.swt.TxDisplay; +import com.itjw.txviewer.ui.views.TxOutlinePage; public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPageContributor { - public static final String ID = "com.itjw.txviewer.graph.TxEditorPart"; //$NON-NLS-1$ + public static final String ID = "com.itjw.txviewer.ui.TxEditorPart"; //$NON-NLS-1$ + + public static final String WAVE_ACTION_ID = "com.itjw.txviewer.ui.action.AddToWave"; private TxDisplay txDisplay; - + /** This is the root of the editor's model. */ private ITrDb database; - private LinkedList streamList; - - private SelectionSynchronizer synchronizer; - - private ActionRegistry actionRegistry; + private Composite myParent; public TxEditorPart() { - streamList = new LinkedList(); - } /** @@ -66,9 +62,10 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage */ @Override public void createPartControl(Composite parent) { + myParent=parent; /** Add handlers for global actions (delete, etc) */ IActionBars actionBars = getEditorSite().getActionBars(); - actionBars.setGlobalActionHandler(AddToWave.ID, new Action() { + actionBars.setGlobalActionHandler(WAVE_ACTION_ID, new Action() { @Override public void runWithEvent(Event event) { System.out.println("AddToWave with event"); @@ -80,9 +77,16 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage } }); - txDisplay = new TxDisplay(parent, this, getSite()); - TxEditorPlugin.getDefault().editorOpened(this); + txDisplay = new TxDisplay(parent); getSite().setSelectionProvider(txDisplay); + if(getEditorInput()!=null && ((TxEditorInput) getEditorInput()).getStreamNames().size()>0){ + if(MessageDialog.openConfirm(parent.getShell(), "Confirm", "Do you want the restore last state of the wave form?")) + for(String streamName:((TxEditorInput) getEditorInput()).getStreamNames()){ + ITrStream stream = database.getStreamByName(streamName); + if(stream!=null) + txDisplay.addStream(stream); + } + } } @@ -93,41 +97,52 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage */ protected void setInput(IEditorInput input) { super.setInput(input); - try { - IFile file = ((IFileEditorInput) input).getFile(); - database = new ITrDbFacade(); - if(txDisplay !=null) database.addPropertyChangeListener(txDisplay); - database.load(file.getContents()); - setPartName(((IFileEditorInput) input).getFile().getName()); -// for(ITrStream stream: database.getAllStreams()) -// streamList.add(new TxStreamAdapter(stream)); - } catch (InputFormatException e) { - handleLoadException(e); - } catch (CoreException e) { - e.printStackTrace(); + if(input instanceof IFileEditorInput){ + if(!(input instanceof TxEditorInput)) + super.setInput(new TxEditorInput(((IFileEditorInput)input).getFile())); + try { + IFile file = ((IFileEditorInput) input).getFile(); + getTrDatabase(); + database.load(file.getContents()); + setPartName(((IFileEditorInput) input).getFile().getName()); + } catch (Exception e) { + handleLoadException(e); + } + } else if(input instanceof FileStoreEditorInput){ + try { + getTrDatabase(); + database.load(((FileStoreEditorInput) input).getURI().toURL().openStream()); + setPartName(((FileStoreEditorInput) input).getName()); + } catch (Exception e) { + handleLoadException(e); + } } } + protected void getTrDatabase() { + BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); + ServiceReference serviceReference = context.getServiceReference(ITransactionDbFactory.class.getName()); + database = ((ITransactionDbFactory) context.getService(serviceReference)).createDatabase(); + if(txDisplay !=null) database.addPropertyChangeListener(txDisplay); + } + private void handleLoadException(Exception e) { System.err.println("** Load failed. Using default model. **"); e.printStackTrace(); database = null; } - @Override public void setFocus() { - // Set the focus + myParent.setFocus(); } @Override public void doSave(IProgressMonitor monitor) { - // Do the Save operation } @Override public void doSaveAs() { - // Do the Save As operation } @SuppressWarnings("rawtypes") @@ -140,24 +155,10 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage return super.getAdapter(type); } - public SelectionSynchronizer getSelectionSynchronizer() { - if (synchronizer == null) - synchronizer = new SelectionSynchronizer(); - return synchronizer; - } - - public ActionRegistry getActionRegistry() { - if (actionRegistry == null) - actionRegistry = new ActionRegistry(); - return actionRegistry; - } - public ITrDb getModel() { return database; } - - @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { @@ -176,37 +177,48 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage return false; } - public LinkedList getStreamList() { - return streamList; - } - public ITrDb getDatabase() { return database; } public void addStreamToList(ITrStream stream){ - if(stream instanceof ITrStreamFacade) - streamList.add((ITrStreamFacade)stream); - else - streamList.add(new ITrStreamFacade(stream)); - txDisplay.streamListChanged(); + if(getEditorInput() instanceof TxEditorInput && !((TxEditorInput) getEditorInput()).getStreamNames().contains(stream.getFullName())){ + ((TxEditorInput) getEditorInput()).getStreamNames().add(stream.getFullName()); + txDisplay.addStream(stream); + } else + txDisplay.addStream(stream); + } public void addStreamsToList(ITrStream[] streams){ - for(ITrStream stream: streams) addStreamToList(stream); - txDisplay.streamListChanged(); + for(ITrStream stream:streams) + addStreamToList(stream); } public void removeStreamFromList(ITrStream stream){ - txDisplay.streamListChanged(); + if(getEditorInput() instanceof TxEditorInput && ((TxEditorInput) getEditorInput()).getStreamNames().contains(stream.getFullName())){ + ((TxEditorInput) getEditorInput()).getStreamNames().remove(stream.getFullName()); + txDisplay.removeStream(stream); + } else + txDisplay.removeStream(stream); } public void removeStreamsFromList(ITrStream[] streams){ - txDisplay.streamListChanged(); + for(ITrStream stream:streams) + removeStreamFromList(stream); } - public void setSelection(ISelection selection){ - txDisplay.setSelection(selection); + public List getStreamList(){ + return txDisplay.getStreamList(); + } + + public void setSelection(final ISelection selection){ + myParent.getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + txDisplay.setSelection(selection); + } + }); } @Override diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPlugin.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorPlugin.java similarity index 88% rename from com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPlugin.java rename to com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorPlugin.java index 4364eff..ae33433 100644 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPlugin.java +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/TxEditorPlugin.java @@ -8,7 +8,7 @@ * Contributors: * IT Just working - initial API and implementation *******************************************************************************/ -package com.itjw.txviewer.graph; +package com.itjw.txviewer.ui; import java.io.File; import java.util.MissingResourceException; @@ -19,6 +19,7 @@ import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.eclipse.wb.swt.SWTResourceManager; import org.osgi.framework.BundleContext; /** @@ -36,7 +37,7 @@ public class TxEditorPlugin extends AbstractUIPlugin { public static final int headerFgColor=7; // The plug-in ID - public static final String PLUGIN_ID = "com.itjw.txviewer.graph"; //$NON-NLS-1$ + public static final String PLUGIN_ID = "com.itjw.txviewer.ui"; //$NON-NLS-1$ // The shared instance private static TxEditorPlugin plugin; @@ -72,6 +73,7 @@ public class TxEditorPlugin extends AbstractUIPlugin { */ public void stop(BundleContext context) throws Exception { plugin = null; + SWTResourceManager.dispose(); super.stop(context); } @@ -112,13 +114,13 @@ public class TxEditorPlugin extends AbstractUIPlugin { case txHighliteBgColor: return ColorConstants.darkGreen; case trackBgLightColor: - return new Color(null, 220, 220, 220); + return SWTResourceManager.getColor(220, 220, 220); case trackBgDarkColor: - return new Color(null, 200, 200, 200); + return SWTResourceManager.getColor(200, 200, 200); case headerBgColor: - return new Color(null, 255, 255, 255); + return SWTResourceManager.getColor(255, 255, 255); case headerFgColor: - return new Color(null, 55, 55, 55); + return SWTResourceManager.getColor(55, 55, 55); default: break; } @@ -129,11 +131,4 @@ public class TxEditorPlugin extends AbstractUIPlugin { return resourceBundle; } - public void editorOpened(TxEditorPart txEditorPart) { - openedTxEditorPart=txEditorPart; - } - - public TxEditorPart getOpenEditorPart(){ - return openedTxEditorPart; - } } diff --git a/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/adapter/AdapterFactory.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/adapter/AdapterFactory.java new file mode 100644 index 0000000..5b44154 --- /dev/null +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/adapter/AdapterFactory.java @@ -0,0 +1,24 @@ +package com.itjw.txviewer.ui.adapter; + +import org.eclipse.core.runtime.IAdapterFactory; +import org.eclipse.ui.views.properties.IPropertySource; + +import com.itjw.txviewer.database.ITransaction; + +public class AdapterFactory implements IAdapterFactory { + + @SuppressWarnings("rawtypes") + @Override + public Object getAdapter(Object adaptableObject, Class adapterType) { + if (adapterType == IPropertySource.class) + return new ITransactionPropertySource((ITransaction) adaptableObject); + return null; + } + + @SuppressWarnings("rawtypes") + @Override + public Class[] getAdapterList() { + return new Class[]{IPropertySource.class}; + } + +} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionProperties.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/adapter/ITransactionPropertySource.java similarity index 56% rename from com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionProperties.java rename to com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/adapter/ITransactionPropertySource.java index 774b4bd..699ec03 100644 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionProperties.java +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/adapter/ITransactionPropertySource.java @@ -8,29 +8,28 @@ * Contributors: * IT Just working - initial API and implementation *******************************************************************************/ -package com.itjw.txviewer.graph.data; +package com.itjw.txviewer.ui.adapter; import java.util.ArrayList; -import java.util.List; import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.ui.views.properties.IPropertySource; import org.eclipse.ui.views.properties.PropertyDescriptor; -import com.itjw.txviewer.database.ITrAttribute; import com.itjw.txviewer.database.ITransaction; -public class ITransactionProperties implements IPropertySource { +public class ITransactionPropertySource implements IPropertySource { private ITransaction iTransaction; public final static String PROPERTY_ID = "ID"; public final static String PROPERTY_BEGINTIME = "BEGINTIME"; public final static String PROPERTY_ENDTIME = "ENDTIME"; + public final static String PROPERTY_NAME = "NAME"; protected IPropertyDescriptor[] propertyDescriptors; - public ITransactionProperties(ITransaction iTransaction) { + public ITransactionPropertySource(ITransaction iTransaction) { this.iTransaction=iTransaction; } @@ -42,33 +41,21 @@ public class ITransactionProperties implements IPropertySource { @Override public IPropertyDescriptor[] getPropertyDescriptors() { if (propertyDescriptors == null) { - ArrayList idDescriptor=new ArrayList(); + ArrayList descriptor=new ArrayList(); // Create a descriptor and set a category - PropertyDescriptor nameDescriptor = new PropertyDescriptor(PROPERTY_ID, "Id"); - nameDescriptor.setCategory("Attributes"); - idDescriptor.add(nameDescriptor); + PropertyDescriptor idDescriptor = new PropertyDescriptor(PROPERTY_ID, "Id"); + idDescriptor.setCategory("Attributes"); + descriptor.add(idDescriptor); PropertyDescriptor begTimeDescriptor = new PropertyDescriptor(PROPERTY_BEGINTIME, "Begin time"); begTimeDescriptor.setCategory("Attributes"); - idDescriptor.add(begTimeDescriptor); + descriptor.add(begTimeDescriptor); PropertyDescriptor endTimeDescriptor = new PropertyDescriptor(PROPERTY_ENDTIME, "End time"); endTimeDescriptor.setCategory("Attributes"); - idDescriptor.add(endTimeDescriptor); -// for(ITrAttribute attr:iTransaction.getBeginAttrs()){ -// PropertyDescriptor descr = new PropertyDescriptor("BEGIN_"+attr.getName(), attr.getName()); -// descr.setCategory("Begin attributes"); -// idDescriptor.add(descr); -// } -// for(ITrAttribute attr:iTransaction.getEndAttrs()){ -// PropertyDescriptor descr = new PropertyDescriptor("END_"+attr.getName(), attr.getName()); -// descr.setCategory("End attributes"); -// idDescriptor.add(descr); -// } -// for(ITrAttribute attr:iTransaction.getAttributes()){ -// PropertyDescriptor descr = new PropertyDescriptor("REC_"+attr.getName(), attr.getName()); -// descr.setCategory("Recorded attributes"); -// idDescriptor.add(descr); -// } - propertyDescriptors = idDescriptor.toArray(new IPropertyDescriptor[idDescriptor.size()]); + descriptor.add(endTimeDescriptor); + PropertyDescriptor nameDescriptor = new PropertyDescriptor(PROPERTY_NAME, "Name"); + nameDescriptor.setCategory("Attributes"); + descriptor.add(nameDescriptor); + propertyDescriptors = descriptor.toArray(new IPropertyDescriptor[descriptor.size()]); } return propertyDescriptors; } @@ -81,21 +68,8 @@ public class ITransactionProperties implements IPropertySource { return iTransaction.getBeginTime();//.getValueNS(); } else if(id.equals(PROPERTY_ENDTIME)){ return iTransaction.getEndTime();//.getValueNS(); - } else if(id instanceof String){ - String strId=(String)id; - List set; - if(strId.startsWith("BEGIN_")){ - set=iTransaction.getBeginAttrs(); - } else if(strId.startsWith("END_")){ - set=iTransaction.getEndAttrs(); - } else { - set=iTransaction.getAttributes(); - } - for(ITrAttribute attr:set){ - if(strId.endsWith("_"+attr.getName())){ - return attr.getValue(); - } - } + } else if(id.equals(PROPERTY_NAME)){ + return iTransaction.getGenerator().getName(); } return null; } diff --git a/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Ruler.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Ruler.java new file mode 100644 index 0000000..fdaf19d --- /dev/null +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Ruler.java @@ -0,0 +1,99 @@ +package com.itjw.txviewer.ui.swt; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Composite; + +import com.itjw.txviewer.ui.TxEditorPlugin; + +public class Ruler extends Composite { + + static final int height = 20; + static final int rulerTickMinor = 10; + static final int rulerTickMajor = 100; + + private int length; + private int start; + + private TxEditorPlugin plugin; + private Color headerBgColor; + private Color headerFgColor; + + Ruler(Composite parent, int style, int lenght) { + super(parent, style | SWT.DOUBLE_BUFFERED); + this.length=lenght; + headerBgColor=getDisplay().getSystemColor(SWT.COLOR_WHITE); + headerFgColor=getDisplay().getSystemColor(SWT.COLOR_BLACK); + plugin=TxEditorPlugin.getDefault(); + if(plugin!=null){ + headerBgColor=plugin.getColor(TxEditorPlugin.headerBgColor); + headerFgColor=plugin.getColor(TxEditorPlugin.headerFgColor); + } + addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + Ruler.this.widgetDisposed(e); + } + }); + addPaintListener(new PaintListener() { + public void paintControl(PaintEvent e) { + Ruler.this.paintControl(e); + } + }); + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + layout(true); + redraw(); + } + + protected void widgetDisposed(DisposeEvent e) { + } + + void paintControl(PaintEvent e) { + GC gc = e.gc; + int startMinorIncr = start; + int modulo = start % rulerTickMinor; + startMinorIncr+=rulerTickMinor-modulo; + int bottom=height - 2; + int end=start+e.width; + + gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); + gc.fillRectangle(new Rectangle(0, 0, e.width, height)); + gc.setBackground(headerBgColor); + gc.fillRectangle(new Rectangle(0, 0, e.width, height - 1)); + gc.setForeground(headerFgColor); + gc.drawLine(0, bottom, e.width, bottom); + + for (int tick = startMinorIncr; tick < end; tick += rulerTickMinor) { + int x0 = tick-start; + if ((tick % rulerTickMajor) == 0) { + gc.drawLine(x0, 10, x0, bottom); + gc.drawText(Integer.toString(tick), x0, 0); + } else { + gc.drawLine(x0, 15, x0, bottom); + } + } + } + + @Override + public Point computeSize(int wHint, int hHint, boolean changed) { + return new Point(0, height); + } + + public void setStartPoint(int start) { + this.start=start; + redraw(); + } +} diff --git a/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Track.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Track.java new file mode 100644 index 0000000..4740b2e --- /dev/null +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Track.java @@ -0,0 +1,203 @@ +package com.itjw.txviewer.ui.swt; + +import java.util.HashMap; +import java.util.List; +import java.util.Vector; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Layout; + +import com.itjw.txviewer.database.EventTime; +import com.itjw.txviewer.database.ITransaction; +import com.itjw.txviewer.ui.TxEditorPlugin; + +public class Track extends Composite implements MouseListener { + + static final int trackHeight = 50; + static final int trackInset = 2; + static final int txHeight = trackHeight - 2 * trackInset; + + static double zoomFactor = EventTime.NS; + private Color lineColor; + private Color trackBgColor; + + private ITransaction highlightedTx=null; + + private HashMap transactionMap = new HashMap(); + + class TrackLayoutData { + protected int x, y; + TrackLayoutData(int x, int y){ + this.x=x; + this.y=y; + } + public int getX() { + return x; + } + public int getY() { + return y; + } + + } + + class TrackLayout extends Layout { + Point extent; // the cached sizes + + protected Point computeSize(Composite composite, int wHint, int hHint, boolean changed) { + if (changed || extent == null) { + extent=new Point(0, 0); + for(Control child:composite.getChildren()){ + Point cExtent = child.computeSize(SWT.DEFAULT, SWT.DEFAULT, false); + TrackLayoutData dat = (TrackLayoutData) child.getLayoutData(); + extent.x=Math.max(extent.x, dat.x+cExtent.x); + extent.y=Math.max(extent.y, dat.y+cExtent.y); + } + } + return extent; + } + + protected void layout(Composite composite, boolean changed) { + if(extent==null){ + extent=new Point(0, 0); + changed=true; + } + for(Control child:composite.getChildren()){ + Point cExtent = child.computeSize(SWT.DEFAULT, SWT.DEFAULT, false); + TrackLayoutData dat = (TrackLayoutData) child.getLayoutData(); + if(changed){ + extent.x=Math.max(extent.x, dat.x+cExtent.x); + extent.y=Math.max(extent.y, dat.y+cExtent.y); + } + child.setBounds(dat.x, dat.y, cExtent.x, cExtent.y); + } + } + } + + Track(Composite parent, int style) { + super(parent, style); + setLayout(new TrackLayout()); + addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + Track.this.widgetDisposed(e); + } + }); + addPaintListener(new PaintListener() { + public void paintControl(PaintEvent e) { + Track.this.paintControl(e); + } + }); + TxEditorPlugin plugin=TxEditorPlugin.getDefault(); + lineColor=plugin.getColor(TxEditorPlugin.lineColor); + trackBgColor=plugin.getColor(TxEditorPlugin.trackBgLightColor); + } + + + protected void widgetDisposed(DisposeEvent e) { + } + + void paintControl(PaintEvent e) { + GC gc = e.gc; + gc.setForeground(lineColor); + gc.setFillRule(SWT.FILL_EVEN_ODD); + gc.setBackground(trackBgColor); + gc.setLineWidth(1); + gc.setLineStyle(SWT.LINE_SOLID); + gc.fillRectangle(new Rectangle(e.x, e.y, e.width, e.height)); + for(int offset=e.y+trackHeight/2; offset transactions) { + Vector rowendtime = new Vector(); + for (ITransaction tx : transactions) { + int rowIdx = 0; + for (ITransaction lastTx : rowendtime) { + if((lastTx.getEndTime().getValue()-lastTx.getBeginTime().getValue())>0){ + if (lastTx.getEndTime().compareTo(tx.getBeginTime())<=0 ) + break; + } else { + if (lastTx.getEndTime().compareTo(tx.getBeginTime())<0 ) + break; + } + rowIdx++; + } + if (rowendtime.size() <= rowIdx) { + rowendtime.add(tx); + } else { + rowendtime.set(rowIdx, tx); + } + int width = (int) ((tx.getEndTime().getValue()-tx.getBeginTime().getValue())/zoomFactor); + if(width==0) width=1; + Transaction t = new Transaction(this, SWT.NONE, width); + t.setLayoutData(new Track.TrackLayoutData((int) (tx.getBeginTime().getValue()/zoomFactor), rowIdx*trackHeight)); + t.setData(tx); + t.addMouseListener(this); + transactionMap.put(tx, t); + } + layout(true,true); + } + + + @Override + public void mouseDoubleClick(MouseEvent e) { + Event event = new Event(); + event.type = SWT.MouseDoubleClick; + event.display=e.display; + event.data = e.widget; + event.button=e.button; + event.time=e.time; + this.notifyListeners(SWT.MouseDoubleClick, event); + } + + + @Override + public void mouseDown(MouseEvent e) { + Event event = new Event(); + event.type = SWT.MouseDown; + event.display=e.display; + event.data = e.widget; + event.button=e.button; + event.time=e.time; + this.notifyListeners(SWT.MouseDown, event); + } + + + @Override + public void mouseUp(MouseEvent e) { + Event event = new Event(); + event.type = SWT.MouseUp; + event.display=e.display; + event.data = e.widget; + event.button=e.button; + event.time=e.time; + this.notifyListeners(SWT.MouseUp, event); + } + + public Transaction highlightTransaction(ITransaction tx){ + if(highlightedTx!=null){ + transactionMap.get(highlightedTx).highlight(false); + highlightedTx=null; + } + if(tx!=null && transactionMap.containsKey(tx)){ + Transaction trans = transactionMap.get(tx); + trans.highlight(true); + highlightedTx=tx; + return trans; + } + return null; + } +} diff --git a/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Transaction.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Transaction.java new file mode 100644 index 0000000..1ff4c86 --- /dev/null +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/Transaction.java @@ -0,0 +1,75 @@ +package com.itjw.txviewer.ui.swt; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Composite; + +import com.itjw.txviewer.ui.TxEditorPlugin; + +public class Transaction extends Composite { + + public static int height = 50; + public static Color lineColor; + public static Color txBgColor; + public static Color highliteLineColor; + public static Color txHighliteBgColor; + private int length; + private boolean highlighted=false; + + Transaction(Composite parent, int style, int lenght) { + super(parent, style); + this.length=lenght; + addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + Transaction.this.widgetDisposed(e); + } + }); + addPaintListener(new PaintListener() { + public void paintControl(PaintEvent e) { + Transaction.this.paintControl(e); + } + }); + TxEditorPlugin plugin=TxEditorPlugin.getDefault(); + lineColor=plugin.getColor(TxEditorPlugin.lineColor); + txBgColor=plugin.getColor(TxEditorPlugin.txBgColor); + highliteLineColor=plugin.getColor(TxEditorPlugin.highliteLineColor); + txHighliteBgColor=plugin.getColor(TxEditorPlugin.txHighliteBgColor); + } + + protected void widgetDisposed(DisposeEvent e) { + } + + void paintControl(PaintEvent e) { + GC gc = e.gc; + gc.setForeground(highlighted?highliteLineColor:lineColor); + gc.setFillRule(SWT.FILL_EVEN_ODD); + gc.setBackground(highlighted?txHighliteBgColor:txBgColor); + gc.setLineWidth(1); + gc.setLineStyle(SWT.LINE_SOLID); + Rectangle bb = new Rectangle(0, 0, length-1, height-1); + if(bb.width<8){ + gc.fillRectangle(bb); + gc.drawRectangle(bb); + } else { + gc.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, 4, 4); + gc.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, 4, 4); + } + } + + @Override + public Point computeSize(int wHint, int hHint, boolean changed) { + return new Point(length, height); + } + + public void highlight(boolean highlight) { + highlighted=highlight; + redraw(); + } +} diff --git a/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/TxDisplay.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/TxDisplay.java new file mode 100644 index 0000000..d19eb55 --- /dev/null +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/swt/TxDisplay.java @@ -0,0 +1,390 @@ +/******************************************************************************* + * Copyright (c) 2012 IT Just working. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IT Just working - initial API and implementation + *******************************************************************************/ +package com.itjw.txviewer.ui.swt; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; + +import org.eclipse.core.runtime.ListenerList; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CLabel; +import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.events.ControlAdapter; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowData; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.ScrollBar; +import org.eclipse.wb.swt.SWTResourceManager; + +import swing2swt.layout.BorderLayout; + +import com.itjw.txviewer.database.ITrStream; +import com.itjw.txviewer.database.ITransaction; + +public class TxDisplay implements PropertyChangeListener, ISelectionProvider, MouseListener{ + + private ListenerList listeners = new ListenerList(); + private ITrStream currentStreamSelection; + private ITransaction currentSelection; + private ScrolledComposite valueListScrolled; + private ScrolledComposite nameListScrolled; + private Composite nameList; + private Composite valueList; + private ScrolledComposite trackListScrolled; + private Composite trackList; + private Composite top; + private ArrayList streams=new ArrayList(); + private Composite trackPane; + private Ruler ruler; + private HashMap trackMap = new HashMap(); + + public TxDisplay(Composite parent) { + top = new Composite(parent, SWT.NONE); + top.setLayout(new FillLayout(SWT.HORIZONTAL)); + + SashForm topSash = new SashForm(top, SWT.SMOOTH); + topSash.setBackground(topSash.getDisplay().getSystemColor( SWT.COLOR_GRAY)); + + Composite composite = new Composite(topSash, SWT.NONE); + composite.setLayout(new FillLayout(SWT.HORIZONTAL)); + + SashForm leftSash = new SashForm(composite, SWT.SMOOTH); + leftSash.setBackground(leftSash.getDisplay().getSystemColor( SWT.COLOR_GRAY)); +// leftSash.addControlListener(new ControlAdapter() { +// public void controlResized(ControlEvent e) { +// recalculateNameBounds(); +// recalculateValueBounds(); +// } +// }); + Composite namePane = createTextPane(leftSash, "Name"); + namePane.setBackground(namePane.getDisplay().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND)); + namePane.addControlListener(new ControlAdapter() { + public void controlResized(ControlEvent e) { + recalculateNameBounds(); + } + }); + + nameListScrolled = new ScrolledComposite(namePane, SWT.H_SCROLL | SWT.V_SCROLL); + nameListScrolled.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true, 1, 1)); + nameListScrolled.setExpandHorizontal(true); + nameListScrolled.setExpandVertical(true); + nameList = new Composite(nameListScrolled, SWT.NONE); + nameList.setLayout(createScrolledLayoutData(false)); + + nameListScrolled.setContent(nameList); + + Composite valuePane = createTextPane(leftSash, "Value"); + valuePane.setBackground(valuePane.getDisplay().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND)); + valuePane.addControlListener(new ControlAdapter() { + public void controlResized(ControlEvent e) { + recalculateValueBounds(); + } + }); + valueListScrolled = new ScrolledComposite(valuePane, SWT.H_SCROLL | SWT.V_SCROLL); + valueListScrolled.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true, 1, 1)); + valueListScrolled.setExpandHorizontal(true); + valueListScrolled.setExpandVertical(true); + valueList = new Composite(valueListScrolled, SWT.NONE); + valueList.setLayout(createScrolledLayoutData(true)); + valueListScrolled.setContent(valueList); + + + trackPane = new Composite(topSash, SWT.NONE); + trackPane.setLayout(new BorderLayout(0, 0)); + ruler = new Ruler(trackPane, SWT.NONE, 0); + ruler.setLayoutData(BorderLayout.NORTH); + + trackListScrolled = new ScrolledComposite(trackPane, SWT.H_SCROLL | SWT.V_SCROLL); + trackListScrolled.setExpandVertical(true); + trackListScrolled.setExpandHorizontal(true); + trackList = new Composite(trackListScrolled, SWT.NONE); + trackList.setLayout(createScrolledLayoutData(false)); + trackListScrolled.setContent(trackList); + nameListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + int y = ((ScrollBar) e.widget).getSelection(); + valueListScrolled.setOrigin(valueListScrolled.getOrigin().x, y); + trackListScrolled.setOrigin(trackListScrolled.getOrigin().x, y); + } + }); + valueListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + int y = ((ScrollBar) e.widget).getSelection(); + nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); + trackListScrolled.setOrigin(trackListScrolled.getOrigin().x, y); + } + }); + trackListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + int y = ((ScrollBar) e.widget).getSelection(); + nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); + valueListScrolled.setOrigin(valueListScrolled.getOrigin().x, y); + } + }); + trackListScrolled.getHorizontalBar().addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + int x = ((ScrollBar) e.widget).getSelection(); + ruler.setStartPoint(x); + } + }); + + topSash.setWeights(new int[] {30, 70}); + leftSash.setWeights(new int[] {75, 25}); + + top.layout(true, true); + streamListChanged(); + } + + protected RowLayout createScrolledLayoutData(boolean center) { + RowLayout nameListLayout = new RowLayout(SWT.VERTICAL); + nameListLayout.spacing = 4; + nameListLayout.marginTop = 0; + nameListLayout.marginRight = 0; + nameListLayout.marginLeft = 0; + nameListLayout.marginBottom = 0; + nameListLayout.fill = true; + nameListLayout.wrap = false; + nameListLayout.center=center; + return nameListLayout; + } + + private Composite createTextPane(SashForm leftSash, String text) { + Composite namePane = new Composite(leftSash, SWT.NONE); + GridLayout gl_namePane = new GridLayout(1, false); + gl_namePane.verticalSpacing = 0; + gl_namePane.marginWidth = 0; + gl_namePane.horizontalSpacing = 0; + gl_namePane.marginHeight = 0; + namePane.setLayout(gl_namePane); + + CLabel nameLabel = new CLabel(namePane, SWT.NONE); + GridData gd_nameLabel = new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1); + gd_nameLabel.heightHint = Ruler.height-2; + nameLabel.setLayoutData(gd_nameLabel); + nameLabel.setText(text); + + Label nameSep = new Label(namePane, SWT.SEPARATOR | SWT.HORIZONTAL); + nameSep.setBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY)); + nameSep.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK)); + GridData gd_nameSep = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + gd_nameSep.heightHint = 2; + nameSep.setLayoutData(gd_nameSep); + return namePane; + } + + public void streamListChanged() { + LinkedListtoAdd = new LinkedList(); + toAdd.addAll(streams); + for(Control child:trackList.getChildren()){ + Track track = (Track) child; + Control c = (Control)track.getData("NAMEWIDGET"); + ITrStream stream=(ITrStream) track.getData("STREAM"); + if(!streams.contains(stream)){ + track.setVisible(false); + c.setVisible(false); + }else{ + toAdd.remove(stream); + track.setVisible(true); + c.setVisible(true); + } + } + for(ITrStream stream: toAdd){ + Track track = new Track(trackList,SWT.NONE); + track.setTransactions(stream.getTransactions()); + track.setData("STREAM", stream); + track.addMouseListener(this); + Point trackSize = track.computeSize(SWT.DEFAULT,SWT.DEFAULT); + + Label trackName = new Label(nameList, SWT.NONE); + trackName.setText(stream.getFullName()); + RowData trackNamelayoutData = new RowData(SWT.DEFAULT, trackSize.y); + trackName.setLayoutData(trackNamelayoutData); + track.setData("NAMEWIDGET", trackName); + + Label trackValue = new Label(valueList, SWT.NONE); + trackValue.setText("-"); + RowData trackValuelayoutData = new RowData(SWT.DEFAULT, trackSize.y); + trackValue.setLayoutData(trackValuelayoutData); + track.setData("VALUEWIDGET", trackValue); + trackMap.put(stream, track); + } + recalculateNameBounds(); + recalculateValueBounds(); + Point trackSize=trackList.computeSize(SWT.DEFAULT, SWT.DEFAULT); + trackListScrolled.setMinSize(trackSize); + top.layout(true, true); + } + + protected void recalculateValueBounds() { + if(streams.size()>0){ + Rectangle bounds = valueListScrolled.getParent().getBounds(); + Point size = valueList.computeSize(SWT.DEFAULT, SWT.DEFAULT); +// System.out.println("Value calc: "+bounds+" / "+size); + int corr = (int) (2.35*valueListScrolled.getHorizontalBar().getSize().y); + valueListScrolled.setMinSize(Math.max(bounds.width, size.x), Math.max(bounds.height-corr, size.y)); + valueListScrolled.setAlwaysShowScrollBars(true); + valueListScrolled.getVerticalBar().setVisible(false); + } + } + + protected void recalculateNameBounds() { + if(streams.size()>0){ + Rectangle bounds = nameListScrolled.getParent().getBounds(); + Point size = nameList.computeSize(SWT.DEFAULT, SWT.DEFAULT); +// System.out.println("Name calc: "+bounds+" / "+size); + int corr = (int) (2.35*valueListScrolled.getHorizontalBar().getSize().y); + nameListScrolled.setMinSize(Math.max(bounds.width, size.x), Math.max(bounds.height-corr, size.y)); + nameListScrolled.setAlwaysShowScrollBars(true); + nameListScrolled.getVerticalBar().setVisible(false); + } + } + + @Override + public void propertyChange(PropertyChangeEvent pce) { + currentSelection=null; + ITrStream str = (ITrStream)pce.getNewValue(); + if(str instanceof ITrStream) + currentStreamSelection=(ITrStream)str; + if(currentStreamSelection!=null) + setSelection(getSelection()); + else + setSelection(StructuredSelection.EMPTY); + } + + @Override + public void addSelectionChangedListener(ISelectionChangedListener listener) { + listeners.add(listener); + } + + @Override + public ISelection getSelection() { + if(currentSelection!=null) + return new StructuredSelection(currentSelection); + else if(currentStreamSelection!=null) + return new StructuredSelection(currentStreamSelection); + else + return null; + } + + @Override + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + listeners.remove(listener); + } + + @Override + public void setSelection(ISelection selection) { + if(selection instanceof IStructuredSelection){ + Object sel =((IStructuredSelection)selection).getFirstElement(); + if(sel instanceof ITransaction && currentSelection!=sel){ + if(currentSelection!=null){ + ITrStream stream = currentSelection.getGenerator().getStream(); + if(trackMap.containsKey(stream)) trackMap.get(stream).highlightTransaction(null); + } + currentSelection=(ITransaction) sel; + ITrStream stream = currentSelection.getGenerator().getStream(); + if(trackMap.containsKey(stream)){ + Transaction trans = trackMap.get(stream).highlightTransaction(currentSelection); + trackListScrolled.showControl(trans); + } + Object[] list = listeners.getListeners(); + for (int i = 0; i < list.length; i++) { + ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); + } + } + } + } + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + if(e.data!=null){ + StructuredSelection sel = new StructuredSelection(((Transaction)e.data).getData()); + setSelection(sel); + }else{ + StructuredSelection sel = new StructuredSelection(new Object[]{ ((Track)e.widget).getData()}); + setSelection(sel); + } + } + + @Override + public void mouseUp(MouseEvent e) { + } + + public boolean addStream(ITrStream paramE){ + boolean res = streams.add(paramE); + streamListChanged(); + return res; + } + + public boolean addAllStreams(ITrStream[] streams) { + boolean res = this.streams.addAll(Arrays.asList(streams)); + streamListChanged(); + return res; + } + + public boolean addAllStreams(Collection paramCollection){ + boolean res = streams.addAll(paramCollection); + streamListChanged(); + return res; + } + + public boolean removeStream(ITrStream paramObject){ + boolean res = streams.remove(paramObject); + streamListChanged(); + return res; + } + + public boolean removeAllStreams(Collection paramCollection){ + boolean res = streams.removeAll(paramCollection); + streamListChanged(); + return res; + } + + public List getStreamList(){ + return Collections.unmodifiableList(streams); + } + + public boolean removeAllStreams(ITrStream[] streams) { + boolean res = this.streams.removeAll(Arrays.asList(streams)); + streamListChanged(); + return res; + } + +} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionTableView.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/SelectionTableView.java similarity index 98% rename from com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionTableView.java rename to com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/SelectionTableView.java index c4b2344..bbb2e0b 100644 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionTableView.java +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/SelectionTableView.java @@ -8,7 +8,7 @@ * Contributors: * IT Just working - initial API and implementation *******************************************************************************/ -package com.itjw.txviewer.graph.views; +package com.itjw.txviewer.ui.views; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionPropertiesView.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/TransactionPropertySheet.java similarity index 74% rename from com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionPropertiesView.java rename to com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/TransactionPropertySheet.java index 8dddcf0..fea67e5 100644 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionPropertiesView.java +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/TransactionPropertySheet.java @@ -8,14 +8,20 @@ * Contributors: * IT Just working - initial API and implementation *******************************************************************************/ -package com.itjw.txviewer.graph.views; +package com.itjw.txviewer.ui.views; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.views.properties.PropertySheet; -public class SelectionPropertiesView extends PropertySheet { +public class TransactionPropertySheet extends PropertySheet { + + + public TransactionPropertySheet() { + super(); + } + @Override protected boolean isImportant(IWorkbenchPart part) { - return part.getSite().getId().equals("com.itjw.txviewer.graph.TxEditorPart"); + return part.getSite().getId().equals("com.itjw.txviewer.ui.TxEditorPart"); } } diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxOutlinePage.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/TxOutlinePage.java similarity index 58% rename from com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxOutlinePage.java rename to com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/TxOutlinePage.java index 6166943..f862136 100644 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxOutlinePage.java +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/TxOutlinePage.java @@ -8,8 +8,11 @@ * Contributors: * IT Just working - initial API and implementation *******************************************************************************/ -package com.itjw.txviewer.graph; +package com.itjw.txviewer.ui.views; +import java.util.LinkedList; + +import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; @@ -24,23 +27,31 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IActionBars; import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.part.IPageSite; import org.eclipse.ui.views.contentoutline.ContentOutline; import org.eclipse.ui.views.contentoutline.ContentOutlinePage; +import com.itjw.txviewer.database.ITrHierNode; import com.itjw.txviewer.database.ITrStream; -import com.itjw.txviewer.graph.actions.TxActionFactory; -import com.itjw.txviewer.graph.data.ITrHierNodeFacade; -import com.itjw.txviewer.graph.views.provider.TxDbTreeContentProvider; -import com.itjw.txviewer.graph.views.provider.TxDbTreeLabelProvider; +import com.itjw.txviewer.database.ITransaction; +import com.itjw.txviewer.ui.TxEditorPart; +import com.itjw.txviewer.ui.views.provider.TxDbTreeContentProvider; +import com.itjw.txviewer.ui.views.provider.TxDbTreeLabelProvider; /** * Creates an outline pagebook for this editor. */ public class TxOutlinePage extends ContentOutlinePage implements ISelectionListener, ISelectionProvider { + public static final int ADD_TO_WAVE = 0; + public static final int ADD_ALL_TO_WAVE = 1; + public static final int REMOVE_FROM_WAVE = 2; + public static final int REMOVE_ALL_FROM_WAVE = 3; + private TxEditorPart editor; public TxOutlinePage(TxEditorPart editor) { @@ -72,7 +83,7 @@ public class TxOutlinePage extends ContentOutlinePage implements ISelectionList }); Menu menu = menuMgr.createContextMenu(contentOutlineViewer.getControl()); contentOutlineViewer.getTree().setMenu(menu); - getSite().registerContextMenu("com.itjw.txviewer.graph.outline.contextmenu", menuMgr, contentOutlineViewer); + getSite().registerContextMenu("com.itjw.txviewer.ui.outline.contextmenu", menuMgr, contentOutlineViewer); // add me as selection listener getSite().getPage().addSelectionListener((ISelectionListener) this); //getSite().getPage().addSelectionListener("SampleViewId",(ISelectionListener)this); @@ -104,30 +115,32 @@ public class TxOutlinePage extends ContentOutlinePage implements ISelectionList public void init(IPageSite pageSite) { super.init(pageSite); IActionBars bars = pageSite.getActionBars(); - String id = ActionFactory.PASTE.getId(); - bars.setGlobalActionHandler(id, editor.getActionRegistry().getAction(id)); - id = ActionFactory.DELETE.getId(); - bars.setGlobalActionHandler(id, editor.getActionRegistry().getAction(id)); } private void fillContextMenu(IMenuManager menuMgr) { // initalize the context menu getTreeViewer().getSelection(); ISelection selection = getTreeViewer().getSelection(); - Object obj = ((IStructuredSelection) selection).getFirstElement(); - menuMgr.add(TxActionFactory.getAction(TxActionFactory.ADD_TO_WAVE, obj instanceof ITrStream)); - menuMgr.add(TxActionFactory.getAction(TxActionFactory.ADD_ALL_TO_WAVE, true)); - menuMgr.add(TxActionFactory.getAction(TxActionFactory.REMOVE_FROM_WAVE, obj instanceof ITrStream)); - menuMgr.add(TxActionFactory.getAction(TxActionFactory.REMOVE_ALL_FROM_WAVE, true)); + if(selection instanceof IStructuredSelection){ + IStructuredSelection sel = (IStructuredSelection) selection; + Object obj = sel.getFirstElement(); + menuMgr.add(makeStreamAction("Add to Wave", ISharedImages.IMG_OBJ_ADD, sel, obj instanceof ITrStream, false)); + menuMgr.add(makeStreamAction("Add all to Wave", ISharedImages.IMG_OBJ_ADD, sel, true, false)); + menuMgr.add(makeStreamAction("Remove from Wave", ISharedImages.IMG_TOOL_DELETE, sel, obj instanceof ITrStream,true)); + menuMgr.add(makeStreamAction("Remove all from Wave", ISharedImages.IMG_TOOL_DELETE, sel, true, true)); + } } //ISelectionListener methods @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { - if(!(part instanceof ContentOutline) && selection instanceof TrHierNodeSelection){ - System.out.println("Something selected"); - } +// if(!(part instanceof ContentOutline) && selection instanceof IStructuredSelection){ +// if(((IStructuredSelection)selection).getFirstElement() instanceof ITransaction){ +// System.out.println("Transaction with id "+((ITransaction)((IStructuredSelection)selection).getFirstElement()).getId() +" selected"); +// } else if(((IStructuredSelection)selection).getFirstElement() != null) +// System.out.println("Something else selected"); +// } } /** @@ -155,10 +168,46 @@ public class TxOutlinePage extends ContentOutlinePage implements ISelectionList ISelection selection = anEvent.getSelection(); if (!selection.isEmpty()) { Object tmp = ((IStructuredSelection) selection).getFirstElement(); - if (tmp instanceof ITrHierNodeFacade) { - fireSelectionChanged(new TrHierNodeSelection((ITrHierNodeFacade) tmp)); + if (tmp instanceof ITrHierNode) { + fireSelectionChanged(new StructuredSelection((ITrHierNode) tmp)); } } } + private Action makeStreamAction(String text, String imgDescriptor, final IStructuredSelection selection, boolean enabled, final boolean remove) { + Action action = new Action() { + public void run() { + if(selection!=null) + for(Object obj :selection.toArray()){ + if(obj instanceof ITrStream){ + if(remove) + editor.removeStreamFromList((ITrStream) obj); + else + editor.addStreamToList((ITrStream) obj); + } else if(obj instanceof ITrHierNode){ + LinkedList queue = new LinkedList(); + LinkedList streams = new LinkedList(); + queue.add((ITrHierNode)obj); + while(queue.size()>0){ + ITrHierNode n = queue.poll(); + if(n instanceof ITrStream) streams.add((ITrStream) n); + queue.addAll(n.getChildNodes()); + } + if(remove) + editor.removeStreamsFromList(streams.toArray(new ITrStream[]{})); + else + editor.addStreamsToList(streams.toArray(new ITrStream[]{})); + } + } + } + }; + action.setText(text); + action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(imgDescriptor)); + if(selection.getFirstElement() instanceof ITrStream && editor.getStreamList().contains(selection.getFirstElement())) + action.setEnabled(false); + else + action.setEnabled(true); + return action; + } + } diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/provider/TxDbTreeContentProvider.java similarity index 96% rename from com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.java rename to com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/provider/TxDbTreeContentProvider.java index 3bee0b1..dfbd3bf 100644 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.java +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/provider/TxDbTreeContentProvider.java @@ -8,7 +8,7 @@ * Contributors: * IT Just working - initial API and implementation *******************************************************************************/ -package com.itjw.txviewer.graph.views.provider; +package com.itjw.txviewer.ui.views.provider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/provider/TxDbTreeLabelProvider.java similarity index 95% rename from com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.java rename to com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/provider/TxDbTreeLabelProvider.java index 18a205d..467dfa0 100644 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.java +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/provider/TxDbTreeLabelProvider.java @@ -8,7 +8,7 @@ * Contributors: * IT Just working - initial API and implementation *******************************************************************************/ -package com.itjw.txviewer.graph.views.provider; +package com.itjw.txviewer.ui.views.provider; import java.util.ArrayList; import java.util.List; @@ -20,7 +20,7 @@ import org.eclipse.swt.graphics.Image; import com.itjw.txviewer.database.ITrDb; import com.itjw.txviewer.database.ITrHierNode; import com.itjw.txviewer.database.ITrStream; -import com.itjw.txviewer.graph.TxEditorPlugin; +import com.itjw.txviewer.ui.TxEditorPlugin; public class TxDbTreeLabelProvider implements ILabelProvider { diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/AttributeProperty.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/sections/AttributeProperty.java similarity index 81% rename from com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/AttributeProperty.java rename to com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/sections/AttributeProperty.java index c9b5e37..e67dff0 100644 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/AttributeProperty.java +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/sections/AttributeProperty.java @@ -8,9 +8,10 @@ * Contributors: * IT Just working - initial API and implementation *******************************************************************************/ -package com.itjw.txviewer.graph.views.sections; +package com.itjw.txviewer.ui.views.sections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.TreeMap; @@ -42,8 +43,9 @@ import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; +import com.itjw.txviewer.database.ITrAttrType; import com.itjw.txviewer.database.ITrAttribute; -import com.itjw.txviewer.graph.data.ITransactionFacade; +import com.itjw.txviewer.database.ITransaction; public class AttributeProperty extends AbstractPropertySection implements ISelectionProvider { @@ -51,7 +53,7 @@ public class AttributeProperty extends AbstractPropertySection implements ISelec private ListenerList listeners = new ListenerList(); - private ITransactionFacade iTr; + private ITransaction iTr; private ISelection currentSelection; @@ -107,33 +109,37 @@ public class AttributeProperty extends AbstractPropertySection implements ISelec @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - if (newInput instanceof String) { + if (newInput instanceof ITransaction) { + List attributes = ((ITransaction)newInput).getAttributes(); hier.clear(); parents.clear(); + String location="Begin"; - List txSet = iTr.getBeginAttrs(); - if (txSet != null && txSet.size() > 0) { - hier.put(location, txSet); - for (ITrAttribute tr : txSet) - if (tr != null) - parents.put(tr, location); - } - location="Recorded"; - txSet = iTr.getAttributes(); - if (txSet != null && txSet.size() > 0) { - hier.put(location, txSet); - for (ITrAttribute tr : txSet) - if (tr != null) - parents.put(tr, location); - } + List childs=new LinkedList(); + for (ITrAttribute attr : attributes) + if (attr != null && attr.getType()==ITrAttrType.AttributeType.BEGIN){ + childs.add(attr); + parents.put(attr, location); + } + if(childs.size()>0) hier.put(location, childs); + + location="Transaction"; + childs=new LinkedList(); + for (ITrAttribute attr : attributes) + if (attr != null && attr.getType()==ITrAttrType.AttributeType.UNSPECIFIED){ + childs.add(attr); + parents.put(attr, location); + } + if(childs.size()>0) hier.put(location, childs); + location="End"; - txSet = iTr.getEndAttrs(); - if (txSet != null && txSet.size() > 0) { - hier.put(location, txSet); - for (ITrAttribute tr : txSet) - if (tr != null) - parents.put(tr, location); - } + childs=new LinkedList(); + for (ITrAttribute attr : attributes) + if (attr != null && attr.getType()==ITrAttrType.AttributeType.END){ + childs.add(attr); + parents.put(attr, location); + } + if(childs.size()>0) hier.put(location, childs); } } @@ -191,12 +197,13 @@ public class AttributeProperty extends AbstractPropertySection implements ISelec if (columnIndex == 1 ) return attr.getName(); else if (columnIndex == 2 ) - return attr.getType(); + return attr.getDataType(); else if (columnIndex == 3){ - if("UNSIGNED".equals(attr.getType()) && - (attr.getName().contains("addr")||attr.getName().contains("data"))) - return "0x"+Long.toHexString(Long.parseLong(attr.getValue().toString())); - else + if("UNSIGNED".equals(attr.getType()) && (attr.getName().contains("addr")||attr.getName().contains("data"))) + try { + return "0x"+Long.toHexString(Long.parseLong(attr.getValue().toString())); + } catch(NumberFormatException e) { + } return attr.getValue().toString(); } } @@ -228,12 +235,12 @@ public class AttributeProperty extends AbstractPropertySection implements ISelec currentSelection = null; Assert.isTrue(selection instanceof IStructuredSelection); Object input = ((IStructuredSelection) selection).getFirstElement(); - Assert.isTrue(input instanceof ITransactionFacade); - iTr = (ITransactionFacade) input; + Assert.isTrue(input instanceof ITransaction); + iTr = (ITransaction) input; } public void refresh() { - treeViewer.setInput("All"); + treeViewer.setInput(iTr); } @Override diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/RelatedProperty.java b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/sections/RelatedProperty.java similarity index 62% rename from com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/RelatedProperty.java rename to com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/sections/RelatedProperty.java index 0732578..b7ec901 100644 --- a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/RelatedProperty.java +++ b/com.itjw.txviewer.ui/src/com/itjw/txviewer/ui/views/sections/RelatedProperty.java @@ -8,14 +8,16 @@ * Contributors: * IT Just working - initial API and implementation *******************************************************************************/ -package com.itjw.txviewer.graph.views.sections; +package com.itjw.txviewer.ui.views.sections; +import java.util.Collection; import java.util.HashMap; import java.util.Set; import java.util.TreeMap; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.ListenerList; +import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; @@ -27,6 +29,7 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; @@ -38,23 +41,25 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; +import org.eclipse.ui.IEditorReference; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; +import com.itjw.txviewer.database.ITrRelation; import com.itjw.txviewer.database.ITransaction; import com.itjw.txviewer.database.RelationType; -import com.itjw.txviewer.graph.TransactionSelection; -import com.itjw.txviewer.graph.actions.TxActionFactory; -import com.itjw.txviewer.graph.data.ITransactionFacade; public class RelatedProperty extends AbstractPropertySection implements ISelectionProvider, ISelectionChangedListener { - private final String[] titles = { "Relation", "Tx Id" }; + private final String[] titles = { "Relation type", "Relation Name", "Tx Id" }; private ListenerList listeners = new ListenerList(); - private ITransactionFacade iTr; + private ITransaction iTr; private ISelection currentSelection; @@ -75,10 +80,14 @@ public class RelatedProperty extends AbstractPropertySection implements ISelecti column1.setAlignment(SWT.LEFT); column1.setText(titles[0]); column1.setWidth(150); - TreeColumn column2 = new TreeColumn(tree, SWT.RIGHT); + TreeColumn column2 = new TreeColumn(tree, SWT.LEFT); column2.setAlignment(SWT.LEFT); column2.setText(titles[1]); column2.setWidth(150); + TreeColumn column3 = new TreeColumn(tree, SWT.RIGHT); + column3.setAlignment(SWT.LEFT); + column3.setText(titles[2]); + column3.setWidth(150); Object layoutData = parent.getLayoutData(); if (layoutData instanceof GridData) { @@ -96,25 +105,27 @@ public class RelatedProperty extends AbstractPropertySection implements ISelecti treeViewer.setAutoExpandLevel(2); treeViewer.setContentProvider(new ITreeContentProvider() { - TreeMap> hier = new TreeMap>(); - HashMap parents = new HashMap(); + TreeMap> hier = new TreeMap>(); + HashMap parents = new HashMap(); @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - if (newInput instanceof RelationType[]) { + if (newInput instanceof ITransaction) { hier.clear(); parents.clear(); - for (RelationType rel : (RelationType[]) newInput) { - Set txSet = iTr.getNextInRelationship(rel); - if (txSet != null && txSet.size() > 0) { - boolean hasChilds=false; - for (ITransaction tr : txSet) - if (tr != null){ - parents.put(tr, rel); - hasChilds=true; - } - if(hasChilds) hier.put(rel, txSet); - } + String relName = "incoming"; + Collection relSet = ((ITransaction)newInput).getIncomingRelations(); + if (relSet != null && relSet.size() > 0) { + hier.put(relName, relSet); + for (ITrRelation rel : relSet) + parents.put(rel, relName); + } + relName = "outgoing"; + relSet = ((ITransaction)newInput).getOutgoingRelations(); + if (relSet != null && relSet.size() > 0) { + hier.put(relName, relSet); + for (ITrRelation rel : relSet) + parents.put(rel, relName); } } } @@ -143,8 +154,8 @@ public class RelatedProperty extends AbstractPropertySection implements ISelecti @Override public Object[] getChildren(Object parentElement) { - if (parentElement instanceof RelationType) - return hier.get((RelationType) parentElement).toArray(); + if (parentElement instanceof String) + return hier.get((String) parentElement).toArray(); else return null; } @@ -166,10 +177,17 @@ public class RelatedProperty extends AbstractPropertySection implements ISelecti @Override public String getColumnText(Object element, int columnIndex) { - if (columnIndex == 0 && element instanceof RelationType) + if (columnIndex == 0 && element instanceof String) return element.toString(); - else if (columnIndex == 1 && element instanceof ITransaction) - return ((ITransaction) element).getId().toString(); + else if (columnIndex == 1 && element instanceof ITrRelation) + return ((ITrRelation) element).getRelationType().getName(); + else if (columnIndex == 2 && element instanceof ITrRelation){ + ITrRelation rel = (ITrRelation) element; + if(rel.getTarget()==iTr) + return ((ITrRelation) element).getSource().getId().toString(); + else + return ((ITrRelation) element).getTarget().getId().toString(); + } else return null; } @@ -184,23 +202,42 @@ public class RelatedProperty extends AbstractPropertySection implements ISelecti menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager mgr) { - fillContextMenu(mgr); + ISelection selection = treeViewer.getSelection(); + if (selection instanceof IStructuredSelection) { + Object obj = ((IStructuredSelection) selection).getFirstElement(); + mgr.add(makeTransactionAction(obj, iTr)); + } } }); Menu menu = menuMgr.createContextMenu(treeViewer.getControl()); treeViewer.getControl().setMenu(menu); - aTabbedPropertySheetPage.getSite().setSelectionProvider(this); - getPart().getSite().setSelectionProvider(this); - +// aTabbedPropertySheetPage.getSite().setSelectionProvider(this); +// if(getPart()!=null){ +// getPart().getSite().setSelectionProvider(this); +// } } - private void fillContextMenu(IMenuManager menuMgr) { - // initalize the context menu - ISelection selection = treeViewer.getSelection(); - if (selection instanceof IStructuredSelection) { - Object obj = ((IStructuredSelection) selection).getFirstElement(); - menuMgr.add(TxActionFactory.getAction(TxActionFactory.JUMP_TO_TX, obj instanceof ITransaction)); - } + private Action makeTransactionAction(final Object obj, final ITransaction transaction) { + Action action = new Action() { + public void run() { + if(obj instanceof ITrRelation){ + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + ITransaction targetTransaction = ((ITrRelation)obj).getSource()==transaction? + ((ITrRelation)obj).getTarget():((ITrRelation)obj).getSource(); + for(IEditorReference editorRef: page.getEditorReferences()){ + IWorkbenchPart part =editorRef.getPart(false); + if(editorRef.getPage().isPartVisible(part)){ + part.getSite().getSelectionProvider().setSelection(new StructuredSelection(targetTransaction)); + part.setFocus(); + } + } + } + } + }; + action.setText("Jump to Transaction"); + action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_ADD)); + action.setEnabled(true); + return action; } public void setInput(IWorkbenchPart part, ISelection selection) { @@ -208,12 +245,12 @@ public class RelatedProperty extends AbstractPropertySection implements ISelecti currentSelection = null; Assert.isTrue(selection instanceof IStructuredSelection); Object input = ((IStructuredSelection) selection).getFirstElement(); - Assert.isTrue(input instanceof ITransactionFacade); - iTr = (ITransactionFacade) input; + Assert.isTrue(input instanceof ITransaction); + iTr = (ITransaction) input; } public void refresh() { - treeViewer.setInput(RelationType.values()); + treeViewer.setInput(iTr); } public void aboutToBeShown() { @@ -245,16 +282,14 @@ public class RelatedProperty extends AbstractPropertySection implements ISelecti @Override public void selectionChanged(SelectionChangedEvent event) { - ISelection selection = event.getSelection(); - if(selection instanceof IStructuredSelection){ - IStructuredSelection treeSelection =(IStructuredSelection)selection; - Object elem = treeSelection.getFirstElement(); - if(elem instanceof ITransactionFacade){ - currentSelection = new TransactionSelection((ITransactionFacade)elem); - } else if(elem instanceof ITransaction){ - currentSelection = new TransactionSelection(new ITransactionFacade((ITransaction)elem)); - } - } +// ISelection selection = event.getSelection(); +// if(selection instanceof IStructuredSelection){ +// IStructuredSelection treeSelection =(IStructuredSelection)selection; +// Object elem = treeSelection.getFirstElement(); +// if(elem instanceof ITransaction){ +// currentSelection = new StructuredSelection(elem); +// } +// } } } diff --git a/com.itjw.txviewer.ui/src/org/eclipse/wb/swt/SWTResourceManager.java b/com.itjw.txviewer.ui/src/org/eclipse/wb/swt/SWTResourceManager.java new file mode 100644 index 0000000..429964e --- /dev/null +++ b/com.itjw.txviewer.ui/src/org/eclipse/wb/swt/SWTResourceManager.java @@ -0,0 +1,447 @@ +/******************************************************************************* + * Copyright (c) 2011 Google, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Google, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.wb.swt; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Cursor; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Display; + +/** + * Utility class for managing OS resources associated with SWT controls such as colors, fonts, images, etc. + *

+ * !!! IMPORTANT !!! Application code must explicitly invoke the dispose() method to release the + * operating system resources managed by cached objects when those objects and OS resources are no longer + * needed (e.g. on application shutdown) + *

+ * This class may be freely distributed as part of any application or plugin. + *

+ * @author scheglov_ke + * @author Dan Rubel + */ +public class SWTResourceManager { + //////////////////////////////////////////////////////////////////////////// + // + // Color + // + //////////////////////////////////////////////////////////////////////////// + private static Map m_colorMap = new HashMap(); + /** + * Returns the system {@link Color} matching the specific ID. + * + * @param systemColorID + * the ID value for the color + * @return the system {@link Color} matching the specific ID + */ + public static Color getColor(int systemColorID) { + Display display = Display.getCurrent(); + return display.getSystemColor(systemColorID); + } + /** + * Returns a {@link Color} given its red, green and blue component values. + * + * @param r + * the red component of the color + * @param g + * the green component of the color + * @param b + * the blue component of the color + * @return the {@link Color} matching the given red, green and blue component values + */ + public static Color getColor(int r, int g, int b) { + return getColor(new RGB(r, g, b)); + } + /** + * Returns a {@link Color} given its RGB value. + * + * @param rgb + * the {@link RGB} value of the color + * @return the {@link Color} matching the RGB value + */ + public static Color getColor(RGB rgb) { + Color color = m_colorMap.get(rgb); + if (color == null) { + Display display = Display.getCurrent(); + color = new Color(display, rgb); + m_colorMap.put(rgb, color); + } + return color; + } + /** + * Dispose of all the cached {@link Color}'s. + */ + public static void disposeColors() { + for (Color color : m_colorMap.values()) { + color.dispose(); + } + m_colorMap.clear(); + } + //////////////////////////////////////////////////////////////////////////// + // + // Image + // + //////////////////////////////////////////////////////////////////////////// + /** + * Maps image paths to images. + */ + private static Map m_imageMap = new HashMap(); + /** + * Returns an {@link Image} encoded by the specified {@link InputStream}. + * + * @param stream + * the {@link InputStream} encoding the image data + * @return the {@link Image} encoded by the specified input stream + */ + protected static Image getImage(InputStream stream) throws IOException { + try { + Display display = Display.getCurrent(); + ImageData data = new ImageData(stream); + if (data.transparentPixel > 0) { + return new Image(display, data, data.getTransparencyMask()); + } + return new Image(display, data); + } finally { + stream.close(); + } + } + /** + * Returns an {@link Image} stored in the file at the specified path. + * + * @param path + * the path to the image file + * @return the {@link Image} stored in the file at the specified path + */ + public static Image getImage(String path) { + Image image = m_imageMap.get(path); + if (image == null) { + try { + image = getImage(new FileInputStream(path)); + m_imageMap.put(path, image); + } catch (Exception e) { + image = getMissingImage(); + m_imageMap.put(path, image); + } + } + return image; + } + /** + * Returns an {@link Image} stored in the file at the specified path relative to the specified class. + * + * @param clazz + * the {@link Class} relative to which to find the image + * @param path + * the path to the image file, if starts with '/' + * @return the {@link Image} stored in the file at the specified path + */ + public static Image getImage(Class clazz, String path) { + String key = clazz.getName() + '|' + path; + Image image = m_imageMap.get(key); + if (image == null) { + try { + image = getImage(clazz.getResourceAsStream(path)); + m_imageMap.put(key, image); + } catch (Exception e) { + image = getMissingImage(); + m_imageMap.put(key, image); + } + } + return image; + } + private static final int MISSING_IMAGE_SIZE = 10; + /** + * @return the small {@link Image} that can be used as placeholder for missing image. + */ + private static Image getMissingImage() { + Image image = new Image(Display.getCurrent(), MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE); + // + GC gc = new GC(image); + gc.setBackground(getColor(SWT.COLOR_RED)); + gc.fillRectangle(0, 0, MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE); + gc.dispose(); + // + return image; + } + /** + * Style constant for placing decorator image in top left corner of base image. + */ + public static final int TOP_LEFT = 1; + /** + * Style constant for placing decorator image in top right corner of base image. + */ + public static final int TOP_RIGHT = 2; + /** + * Style constant for placing decorator image in bottom left corner of base image. + */ + public static final int BOTTOM_LEFT = 3; + /** + * Style constant for placing decorator image in bottom right corner of base image. + */ + public static final int BOTTOM_RIGHT = 4; + /** + * Internal value. + */ + protected static final int LAST_CORNER_KEY = 5; + /** + * Maps images to decorated images. + */ + @SuppressWarnings("unchecked") + private static Map>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY]; + /** + * Returns an {@link Image} composed of a base image decorated by another image. + * + * @param baseImage + * the base {@link Image} that should be decorated + * @param decorator + * the {@link Image} to decorate the base image + * @return {@link Image} The resulting decorated image + */ + public static Image decorateImage(Image baseImage, Image decorator) { + return decorateImage(baseImage, decorator, BOTTOM_RIGHT); + } + /** + * Returns an {@link Image} composed of a base image decorated by another image. + * + * @param baseImage + * the base {@link Image} that should be decorated + * @param decorator + * the {@link Image} to decorate the base image + * @param corner + * the corner to place decorator image + * @return the resulting decorated {@link Image} + */ + public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) { + if (corner <= 0 || corner >= LAST_CORNER_KEY) { + throw new IllegalArgumentException("Wrong decorate corner"); + } + Map> cornerDecoratedImageMap = m_decoratedImageMap[corner]; + if (cornerDecoratedImageMap == null) { + cornerDecoratedImageMap = new HashMap>(); + m_decoratedImageMap[corner] = cornerDecoratedImageMap; + } + Map decoratedMap = cornerDecoratedImageMap.get(baseImage); + if (decoratedMap == null) { + decoratedMap = new HashMap(); + cornerDecoratedImageMap.put(baseImage, decoratedMap); + } + // + Image result = decoratedMap.get(decorator); + if (result == null) { + Rectangle bib = baseImage.getBounds(); + Rectangle dib = decorator.getBounds(); + // + result = new Image(Display.getCurrent(), bib.width, bib.height); + // + GC gc = new GC(result); + gc.drawImage(baseImage, 0, 0); + if (corner == TOP_LEFT) { + gc.drawImage(decorator, 0, 0); + } else if (corner == TOP_RIGHT) { + gc.drawImage(decorator, bib.width - dib.width, 0); + } else if (corner == BOTTOM_LEFT) { + gc.drawImage(decorator, 0, bib.height - dib.height); + } else if (corner == BOTTOM_RIGHT) { + gc.drawImage(decorator, bib.width - dib.width, bib.height - dib.height); + } + gc.dispose(); + // + decoratedMap.put(decorator, result); + } + return result; + } + /** + * Dispose all of the cached {@link Image}'s. + */ + public static void disposeImages() { + // dispose loaded images + { + for (Image image : m_imageMap.values()) { + image.dispose(); + } + m_imageMap.clear(); + } + // dispose decorated images + for (int i = 0; i < m_decoratedImageMap.length; i++) { + Map> cornerDecoratedImageMap = m_decoratedImageMap[i]; + if (cornerDecoratedImageMap != null) { + for (Map decoratedMap : cornerDecoratedImageMap.values()) { + for (Image image : decoratedMap.values()) { + image.dispose(); + } + decoratedMap.clear(); + } + cornerDecoratedImageMap.clear(); + } + } + } + //////////////////////////////////////////////////////////////////////////// + // + // Font + // + //////////////////////////////////////////////////////////////////////////// + /** + * Maps font names to fonts. + */ + private static Map m_fontMap = new HashMap(); + /** + * Maps fonts to their bold versions. + */ + private static Map m_fontToBoldFontMap = new HashMap(); + /** + * Returns a {@link Font} based on its name, height and style. + * + * @param name + * the name of the font + * @param height + * the height of the font + * @param style + * the style of the font + * @return {@link Font} The font matching the name, height and style + */ + public static Font getFont(String name, int height, int style) { + return getFont(name, height, style, false, false); + } + /** + * Returns a {@link Font} based on its name, height and style. Windows-specific strikeout and underline + * flags are also supported. + * + * @param name + * the name of the font + * @param size + * the size of the font + * @param style + * the style of the font + * @param strikeout + * the strikeout flag (warning: Windows only) + * @param underline + * the underline flag (warning: Windows only) + * @return {@link Font} The font matching the name, height, style, strikeout and underline + */ + public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) { + String fontName = name + '|' + size + '|' + style + '|' + strikeout + '|' + underline; + Font font = m_fontMap.get(fontName); + if (font == null) { + FontData fontData = new FontData(name, size, style); + if (strikeout || underline) { + try { + Class logFontClass = Class.forName("org.eclipse.swt.internal.win32.LOGFONT"); //$NON-NLS-1$ + Object logFont = FontData.class.getField("data").get(fontData); //$NON-NLS-1$ + if (logFont != null && logFontClass != null) { + if (strikeout) { + logFontClass.getField("lfStrikeOut").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$ + } + if (underline) { + logFontClass.getField("lfUnderline").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$ + } + } + } catch (Throwable e) { + System.err.println("Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + font = new Font(Display.getCurrent(), fontData); + m_fontMap.put(fontName, font); + } + return font; + } + /** + * Returns a bold version of the given {@link Font}. + * + * @param baseFont + * the {@link Font} for which a bold version is desired + * @return the bold version of the given {@link Font} + */ + public static Font getBoldFont(Font baseFont) { + Font font = m_fontToBoldFontMap.get(baseFont); + if (font == null) { + FontData fontDatas[] = baseFont.getFontData(); + FontData data = fontDatas[0]; + font = new Font(Display.getCurrent(), data.getName(), data.getHeight(), SWT.BOLD); + m_fontToBoldFontMap.put(baseFont, font); + } + return font; + } + /** + * Dispose all of the cached {@link Font}'s. + */ + public static void disposeFonts() { + // clear fonts + for (Font font : m_fontMap.values()) { + font.dispose(); + } + m_fontMap.clear(); + // clear bold fonts + for (Font font : m_fontToBoldFontMap.values()) { + font.dispose(); + } + m_fontToBoldFontMap.clear(); + } + //////////////////////////////////////////////////////////////////////////// + // + // Cursor + // + //////////////////////////////////////////////////////////////////////////// + /** + * Maps IDs to cursors. + */ + private static Map m_idToCursorMap = new HashMap(); + /** + * Returns the system cursor matching the specific ID. + * + * @param id + * int The ID value for the cursor + * @return Cursor The system cursor matching the specific ID + */ + public static Cursor getCursor(int id) { + Integer key = Integer.valueOf(id); + Cursor cursor = m_idToCursorMap.get(key); + if (cursor == null) { + cursor = new Cursor(Display.getDefault(), id); + m_idToCursorMap.put(key, cursor); + } + return cursor; + } + /** + * Dispose all of the cached cursors. + */ + public static void disposeCursors() { + for (Cursor cursor : m_idToCursorMap.values()) { + cursor.dispose(); + } + m_idToCursorMap.clear(); + } + //////////////////////////////////////////////////////////////////////////// + // + // General + // + //////////////////////////////////////////////////////////////////////////// + /** + * Dispose of cached objects and their underlying OS resources. This should only be called when the cached + * objects are no longer needed (e.g. on application shutdown). + */ + public static void dispose() { + disposeColors(); + disposeImages(); + disposeFonts(); + disposeCursors(); + } +} \ No newline at end of file diff --git a/com.itjw.txviewer.ui/swing2swt.jar b/com.itjw.txviewer.ui/swing2swt.jar new file mode 100644 index 0000000000000000000000000000000000000000..ee261b5df113af861dffbd10f1fabe79fb68fabf GIT binary patch literal 33195 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 literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.updateSite/.project b/com.itjw.txviewer.updateSite/.project new file mode 100644 index 0000000..6c15ff0 --- /dev/null +++ b/com.itjw.txviewer.updateSite/.project @@ -0,0 +1,17 @@ + + + com.itjw.txviewer.updateSite + + + + + + org.eclipse.pde.UpdateSiteBuilder + + + + + + org.eclipse.pde.UpdateSiteNature + + diff --git a/com.itjw.txviewer.updateSite/index.html b/com.itjw.txviewer.updateSite/index.html new file mode 100644 index 0000000..5808011 --- /dev/null +++ b/com.itjw.txviewer.updateSite/index.html @@ -0,0 +1,60 @@ + + +com.itjw.txviewer.updateSite + + + + + + +

+ + diff --git a/com.itjw.txviewer.updateSite/site.xml b/com.itjw.txviewer.updateSite/site.xml new file mode 100644 index 0000000..2ed993d --- /dev/null +++ b/com.itjw.txviewer.updateSite/site.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/com.itjw.txviewer.updateSite/web/site.css b/com.itjw.txviewer.updateSite/web/site.css new file mode 100644 index 0000000..62c6f9f --- /dev/null +++ b/com.itjw.txviewer.updateSite/web/site.css @@ -0,0 +1,12 @@ + diff --git a/com.itjw.txviewer.updateSite/web/site.xsl b/com.itjw.txviewer.updateSite/web/site.xsl new file mode 100644 index 0000000..f459714 --- /dev/null +++ b/com.itjw.txviewer.updateSite/web/site.xsl @@ -0,0 +1,214 @@ + + + + + + + + com.itjw.txviewer.updateSite + + + +

com.itjw.txviewer.updateSite

+

+ + + + + + + + + + + + + + + + dark-row + + + light-row + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dark-row + + + light-row + + + + + + + + + + + + + + + dark-row + + + light-row + + + + + + + + +
+ + + +
+ + + +
+
+ ( - ) +
+
+ + - + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
Operating Systems:
Windows Systems:
Languages:
Architecture:
+


+ Uncategorized +
+ + + +
+
+ ( - ) +
+
+ + - + +
+

+
+ + + + + + + + + + + + + + + + + + + + + +
Operating Systems:
Windows Systems:
Languages:
Architecture:
+
+ + + +
+
+ ( - ) +
+
+ + - + +
+

+
+ + + + + + + + + + + + + + + + + + + + + +
Operating Systems:
Windows Systems:
Languages:
Architecture:
+
+ + +
+
+