From d62e0f63a74baafb7f30c53ce5b3cb5b545c7b6c Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 17 Jun 2012 19:53:05 +0200 Subject: [PATCH] Initial version --- com.itjw.txviewer.database.text/.classpath | 9 + com.itjw.txviewer.database.text/.project | 29 ++ .../.settings/org.eclipse.jdt.core.prefs | 7 + .../.settings/org.eclipse.pde.core.prefs | 3 + .../META-INF/MANIFEST.MF | 13 + .../build.properties | 4 + .../txviewer/database/text/Activator.groovy | 37 ++ .../txviewer/database/text/TrAttrType.groovy | 17 + .../database/text/TrAttrTypeFactory.groovy | 26 ++ .../txviewer/database/text/TrAttribute.groovy | 40 ++ .../txviewer/database/text/TrGenerator.groovy | 40 ++ .../txviewer/database/text/TrHierNode.groovy | 44 ++ .../txviewer/database/text/TrStream.groovy | 72 ++++ .../txviewer/database/text/TrTextDb.groovy | 201 ++++++++++ .../txviewer/database/text/Transaction.groovy | 93 +++++ com.itjw.txviewer.database/.classpath | 7 + com.itjw.txviewer.database/.project | 28 ++ .../.settings/org.eclipse.jdt.core.prefs | 7 + .../.settings/org.eclipse.pde.core.prefs | 3 + .../META-INF/MANIFEST.MF | 10 + .../itjw/txviewer/database/EventTime.class | Bin 0 -> 2349 bytes .../itjw/txviewer/database/ITrAttrType.class | Bin 0 -> 189 bytes .../itjw/txviewer/database/ITrAttribute.class | Bin 0 -> 220 bytes .../com/itjw/txviewer/database/ITrDb.class | Bin 0 -> 494 bytes .../itjw/txviewer/database/ITrGenerator.class | Bin 0 -> 404 bytes .../itjw/txviewer/database/ITrHierNode.class | Bin 0 -> 479 bytes .../itjw/txviewer/database/ITrStream.class | Bin 0 -> 568 bytes .../itjw/txviewer/database/ITransaction.class | Bin 0 -> 721 bytes .../database/InputFormatException.class | Bin 0 -> 406 bytes .../itjw/txviewer/database/RelationType.class | Bin 0 -> 1284 bytes com.itjw.txviewer.database/build.properties | 4 + .../com/itjw/txviewer/database/EventTime.java | 57 +++ .../itjw/txviewer/database/ITrAttrType.java | 6 + .../itjw/txviewer/database/ITrAttribute.java | 5 + .../src/com/itjw/txviewer/database/ITrDb.java | 17 + .../itjw/txviewer/database/ITrGenerator.java | 11 + .../itjw/txviewer/database/ITrHierNode.java | 32 ++ .../com/itjw/txviewer/database/ITrStream.java | 19 + .../itjw/txviewer/database/ITransaction.java | 15 + .../database/InputFormatException.java | 10 + .../itjw/txviewer/database/RelationType.java | 5 + com.itjw.txviewer.feature/.project | 17 + com.itjw.txviewer.feature/build.properties | 1 + com.itjw.txviewer.feature/feature.xml | 55 +++ com.itjw.txviewer.feature/txviewer.product | 35 ++ com.itjw.txviewer.graph/.classpath | 8 + com.itjw.txviewer.graph/.project | 29 ++ .../.settings/org.eclipse.jdt.core.prefs | 7 + com.itjw.txviewer.graph/META-INF/MANIFEST.MF | 19 + .../txviewer/graph/TrHierNodeSelection.class | Bin 0 -> 2088 bytes .../txviewer/graph/TransactionSelection.class | Bin 0 -> 2651 bytes .../itjw/txviewer/graph/TxEditorPart$1.class | Bin 0 -> 1036 bytes .../itjw/txviewer/graph/TxEditorPart.class | Bin 0 -> 7137 bytes .../itjw/txviewer/graph/TxEditorPlugin.class | Bin 0 -> 3710 bytes .../itjw/txviewer/graph/TxOutlinePage$1.class | Bin 0 -> 948 bytes .../itjw/txviewer/graph/TxOutlinePage.class | Bin 0 -> 6376 bytes .../txviewer/graph/actions/AddToWave.class | Bin 0 -> 482 bytes .../graph/actions/TxActionFactory$1.class | Bin 0 -> 3082 bytes .../graph/actions/TxActionFactory$2.class | Bin 0 -> 2300 bytes .../graph/actions/TxActionFactory.class | Bin 0 -> 2607 bytes .../txviewer/graph/data/ITrDbFacade.class | Bin 0 -> 3933 bytes .../graph/data/ITrHierNodeFacade.class | Bin 0 -> 4473 bytes .../txviewer/graph/data/ITrStreamFacade.class | Bin 0 -> 3855 bytes .../graph/data/ITransactionFacade.class | Bin 0 -> 2087 bytes .../graph/data/ITransactionProperties.class | Bin 0 -> 3910 bytes .../txviewer/graph/ui/swt/ListPane$1.class | Bin 0 -> 858 bytes .../txviewer/graph/ui/swt/ListPane$2.class | Bin 0 -> 1058 bytes .../itjw/txviewer/graph/ui/swt/ListPane.class | Bin 0 -> 8072 bytes .../txviewer/graph/ui/swt/NameListPane.class | Bin 0 -> 947 bytes .../graph/ui/swt/SWTImageCanvas$1.class | Bin 0 -> 863 bytes .../graph/ui/swt/SWTImageCanvas$2.class | Bin 0 -> 1046 bytes .../graph/ui/swt/SWTImageCanvas$3.class | Bin 0 -> 1069 bytes .../graph/ui/swt/SWTImageCanvas$4.class | Bin 0 -> 1069 bytes .../graph/ui/swt/SWTImageCanvas.class | Bin 0 -> 9430 bytes .../txviewer/graph/ui/swt/TxDisplay$1.class | Bin 0 -> 2098 bytes .../txviewer/graph/ui/swt/TxDisplay$2.class | Bin 0 -> 1455 bytes .../txviewer/graph/ui/swt/TxDisplay$3.class | Bin 0 -> 1455 bytes .../txviewer/graph/ui/swt/TxDisplay$4.class | Bin 0 -> 1303 bytes .../txviewer/graph/ui/swt/TxDisplay$5.class | Bin 0 -> 906 bytes .../txviewer/graph/ui/swt/TxDisplay.class | Bin 0 -> 7649 bytes .../txviewer/graph/ui/swt/ValueListPane.class | Bin 0 -> 1322 bytes .../graph/ui/swt/WaveImageCanvas.class | Bin 0 -> 10440 bytes .../com/itjw/txviewer/graph/util/Pair.class | Bin 0 -> 2138 bytes .../graph/views/SelectionPropertiesView.class | Bin 0 -> 840 bytes .../graph/views/SelectionTableView$1.class | Bin 0 -> 989 bytes .../graph/views/SelectionTableView.class | Bin 0 -> 4562 bytes .../txviewer/graph/views/TxDbView$1.class | Bin 0 -> 910 bytes .../txviewer/graph/views/TxDbView$2.class | Bin 0 -> 759 bytes .../txviewer/graph/views/TxDbView$3.class | Bin 0 -> 759 bytes .../txviewer/graph/views/TxDbView$4.class | Bin 0 -> 1431 bytes .../txviewer/graph/views/TxDbView$5.class | Bin 0 -> 976 bytes .../graph/views/TxDbView$NameSorter.class | Bin 0 -> 562 bytes .../graph/views/TxDbView$TreeObject.class | Bin 0 -> 1424 bytes .../graph/views/TxDbView$TreeParent.class | Bin 0 -> 1727 bytes .../views/TxDbView$ViewContentProvider.class | Bin 0 -> 2829 bytes .../views/TxDbView$ViewLabelProvider.class | Bin 0 -> 1464 bytes .../itjw/txviewer/graph/views/TxDbView.class | Bin 0 -> 7037 bytes .../provider/TxDbTreeContentProvider.class | Bin 0 -> 1673 bytes .../provider/TxDbTreeLabelProvider.class | Bin 0 -> 2180 bytes .../views/sections/AttributeProperty$1.class | Bin 0 -> 3890 bytes .../views/sections/AttributeProperty$2.class | Bin 0 -> 2548 bytes .../views/sections/AttributeProperty$3.class | Bin 0 -> 1684 bytes .../views/sections/AttributeProperty.class | Bin 0 -> 6955 bytes .../views/sections/RelatedProperty$1.class | Bin 0 -> 3702 bytes .../views/sections/RelatedProperty$2.class | Bin 0 -> 1947 bytes .../views/sections/RelatedProperty$3.class | Bin 0 -> 1113 bytes .../views/sections/RelatedProperty.class | Bin 0 -> 8262 bytes com.itjw.txviewer.graph/build.properties | 8 + com.itjw.txviewer.graph/contexts.xml | 12 + com.itjw.txviewer.graph/icons/sample.gif | Bin 0 -> 983 bytes com.itjw.txviewer.graph/plugin.xml | 100 +++++ .../res/images/database.png | Bin 0 -> 390 bytes com.itjw.txviewer.graph/res/images/folder.png | Bin 0 -> 537 bytes com.itjw.txviewer.graph/res/images/stream.png | Bin 0 -> 444 bytes .../txviewer/graph/TrHierNodeSelection.java | 61 +++ .../txviewer/graph/TransactionSelection.java | 67 ++++ .../com/itjw/txviewer/graph/TxEditorPart.java | 207 ++++++++++ .../itjw/txviewer/graph/TxEditorPlugin.java | 129 ++++++ .../itjw/txviewer/graph/TxOutlinePage.java | 154 +++++++ .../txviewer/graph/actions/AddToWave.java | 15 + .../graph/actions/TxActionFactory.java | 103 +++++ .../itjw/txviewer/graph/data/ITrDbFacade.java | 86 ++++ .../graph/data/ITrHierNodeFacade.java | 150 +++++++ .../txviewer/graph/data/ITrStreamFacade.java | 102 +++++ .../graph/data/ITransactionFacade.java | 70 ++++ .../graph/data/ITransactionProperties.java | 107 +++++ .../itjw/txviewer/graph/ui/swt/ListPane.java | 162 ++++++++ .../txviewer/graph/ui/swt/NameListPane.java | 23 ++ .../txviewer/graph/ui/swt/SWTImageCanvas.java | 376 ++++++++++++++++++ .../itjw/txviewer/graph/ui/swt/TxDisplay.java | 170 ++++++++ .../txviewer/graph/ui/swt/ValueListPane.java | 30 ++ .../graph/ui/swt/WaveImageCanvas.java | 213 ++++++++++ .../com/itjw/txviewer/graph/util/Pair.java | 56 +++ .../graph/views/SelectionPropertiesView.java | 11 + .../graph/views/SelectionTableView.java | 99 +++++ .../itjw/txviewer/graph/views/TxDbView.java | 294 ++++++++++++++ .../provider/TxDbTreeContentProvider.java | 45 +++ .../views/provider/TxDbTreeLabelProvider.java | 72 ++++ .../views/sections/AttributeProperty.java | 252 ++++++++++++ .../graph/views/sections/RelatedProperty.java | 250 ++++++++++++ 140 files changed, 4466 insertions(+) create mode 100644 com.itjw.txviewer.database.text/.classpath create mode 100644 com.itjw.txviewer.database.text/.project create mode 100644 com.itjw.txviewer.database.text/.settings/org.eclipse.jdt.core.prefs create mode 100644 com.itjw.txviewer.database.text/.settings/org.eclipse.pde.core.prefs create mode 100644 com.itjw.txviewer.database.text/META-INF/MANIFEST.MF create mode 100644 com.itjw.txviewer.database.text/build.properties create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Activator.groovy create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrType.groovy create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrTypeFactory.groovy create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttribute.groovy create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrGenerator.groovy create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrHierNode.groovy create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrStream.groovy create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrTextDb.groovy create mode 100644 com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Transaction.groovy create mode 100644 com.itjw.txviewer.database/.classpath create mode 100644 com.itjw.txviewer.database/.project create mode 100644 com.itjw.txviewer.database/.settings/org.eclipse.jdt.core.prefs create mode 100644 com.itjw.txviewer.database/.settings/org.eclipse.pde.core.prefs create mode 100644 com.itjw.txviewer.database/META-INF/MANIFEST.MF create mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/EventTime.class create mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrAttrType.class create mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrAttribute.class create mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrDb.class create mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrGenerator.class create mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrHierNode.class create mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrStream.class create mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITransaction.class create mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/InputFormatException.class create mode 100644 com.itjw.txviewer.database/bin/com/itjw/txviewer/database/RelationType.class create mode 100644 com.itjw.txviewer.database/build.properties create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/EventTime.java create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrAttrType.java create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrAttribute.java create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrDb.java create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrGenerator.java create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrHierNode.java create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrStream.java create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITransaction.java create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/InputFormatException.java create mode 100644 com.itjw.txviewer.database/src/com/itjw/txviewer/database/RelationType.java create mode 100644 com.itjw.txviewer.feature/.project create mode 100644 com.itjw.txviewer.feature/build.properties create mode 100644 com.itjw.txviewer.feature/feature.xml create mode 100644 com.itjw.txviewer.feature/txviewer.product create mode 100644 com.itjw.txviewer.graph/.classpath create mode 100644 com.itjw.txviewer.graph/.project create mode 100644 com.itjw.txviewer.graph/.settings/org.eclipse.jdt.core.prefs create mode 100644 com.itjw.txviewer.graph/META-INF/MANIFEST.MF create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TrHierNodeSelection.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TransactionSelection.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxEditorPart$1.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxEditorPart.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxEditorPlugin.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxOutlinePage$1.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxOutlinePage.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/AddToWave.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/TxActionFactory$1.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/TxActionFactory$2.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/TxActionFactory.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrDbFacade.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrHierNodeFacade.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrStreamFacade.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITransactionFacade.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITransactionProperties.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ListPane$1.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ListPane$2.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ListPane.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/NameListPane.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$1.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$2.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$3.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$4.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$1.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$2.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$3.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$4.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$5.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ValueListPane.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/WaveImageCanvas.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/util/Pair.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionPropertiesView.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionTableView$1.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionTableView.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$1.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$2.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$3.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$4.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$5.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$NameSorter.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$TreeObject.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$TreeParent.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$ViewContentProvider.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$ViewLabelProvider.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$1.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$2.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$3.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$1.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$2.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$3.class create mode 100644 com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty.class create mode 100644 com.itjw.txviewer.graph/build.properties create mode 100644 com.itjw.txviewer.graph/contexts.xml create mode 100644 com.itjw.txviewer.graph/icons/sample.gif create mode 100644 com.itjw.txviewer.graph/plugin.xml create mode 100755 com.itjw.txviewer.graph/res/images/database.png create mode 100755 com.itjw.txviewer.graph/res/images/folder.png create mode 100755 com.itjw.txviewer.graph/res/images/stream.png create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TrHierNodeSelection.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TransactionSelection.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPart.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPlugin.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxOutlinePage.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/AddToWave.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/TxActionFactory.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrDbFacade.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrHierNodeFacade.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrStreamFacade.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionFacade.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionProperties.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ListPane.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/NameListPane.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/TxDisplay.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ValueListPane.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/WaveImageCanvas.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/util/Pair.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionPropertiesView.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionTableView.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/TxDbView.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/AttributeProperty.java create mode 100644 com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/RelatedProperty.java diff --git a/com.itjw.txviewer.database.text/.classpath b/com.itjw.txviewer.database.text/.classpath new file mode 100644 index 0000000..4519f55 --- /dev/null +++ b/com.itjw.txviewer.database.text/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/com.itjw.txviewer.database.text/.project b/com.itjw.txviewer.database.text/.project new file mode 100644 index 0000000..ee5281e --- /dev/null +++ b/com.itjw.txviewer.database.text/.project @@ -0,0 +1,29 @@ + + + com.itjw.txviewer.database.text + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.groovy.core.groovyNature + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/com.itjw.txviewer.database.text/.settings/org.eclipse.jdt.core.prefs b/com.itjw.txviewer.database.text/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..c537b63 --- /dev/null +++ b/com.itjw.txviewer.database.text/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/com.itjw.txviewer.database.text/.settings/org.eclipse.pde.core.prefs b/com.itjw.txviewer.database.text/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 0000000..f29e940 --- /dev/null +++ b/com.itjw.txviewer.database.text/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/com.itjw.txviewer.database.text/META-INF/MANIFEST.MF b/com.itjw.txviewer.database.text/META-INF/MANIFEST.MF new file mode 100644 index 0000000..83a6192 --- /dev/null +++ b/com.itjw.txviewer.database.text/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Textual transaction database +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 +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" diff --git a/com.itjw.txviewer.database.text/build.properties b/com.itjw.txviewer.database.text/build.properties new file mode 100644 index 0000000..34d2e4d --- /dev/null +++ b/com.itjw.txviewer.database.text/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . 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 new file mode 100644 index 0000000..5ae8b1a --- /dev/null +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/Activator.groovy @@ -0,0 +1,37 @@ +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; + +public class Activator implements BundleActivator { + + private static BundleContext context; + + static BundleContext getContext() { + return context; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext bundleContext) throws Exception { + Activator.context = bundleContext; + Dictionary dict = new Hashtable(); + dict.putAt(Constants.SERVICE_RANKING, 1); + context.registerService(ITrDb.class, new TrTextDb(), dict); + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext bundleContext) throws Exception { + Activator.context = null; + } + +} 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 new file mode 100644 index 0000000..0dfb150 --- /dev/null +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrType.groovy @@ -0,0 +1,17 @@ +package com.itjw.txviewer.database.text + +import com.itjw.txviewer.database.ITrAttrType; + +class TrAttrType implements ITrAttrType { + String name + String type + + static TrAttrType getAttrType(String name, String type){ + TrAttrTypeFactory.instance.getAttrType(name, type) + } + + TrAttrType(String name, String type){ + this.name=name + 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 new file mode 100644 index 0000000..1133206 --- /dev/null +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttrTypeFactory.groovy @@ -0,0 +1,26 @@ +package com.itjw.txviewer.database.text + +import com.itjw.txviewer.database.ITrAttrType +import com.itjw.txviewer.database.ITrAttribute + +class TrAttrTypeFactory { + private static final instance = new TrAttrTypeFactory() + + def attributes = [:] + + private TrAttrTypeFactory() { + TrAttrTypeFactory.metaClass.constructor = {-> instance } + } + + ITrAttrType getAttrType(String name, String type){ + def key = name+":"+type + ITrAttrType res + if(attributes.containsKey(key)){ + res=attributes[key] + } else { + res=new TrAttrType(name, 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 new file mode 100644 index 0000000..6dddab1 --- /dev/null +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrAttribute.groovy @@ -0,0 +1,40 @@ +package com.itjw.txviewer.database.text + +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){ + case "STRING": + case "ENUMERATION": + this.value=value[1..-2] + break; + default: + this.value=value + } + } + + TrAttribute(TrAttrType other){ + attributeType=other + } + + TrAttribute(TrAttrType other, value){ + this(other.name, other.type, value) + } + + @Override + public String getName() { + return attributeType.getName(); + } + + @Override + public String getType() { + return attributeType.getType(); + } + +} diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrGenerator.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrGenerator.groovy new file mode 100644 index 0000000..4471602 --- /dev/null +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrGenerator.groovy @@ -0,0 +1,40 @@ +package com.itjw.txviewer.database.text + +import java.util.ArrayList; +import java.util.List; + +import com.itjw.txviewer.database.ITrAttrType +import com.itjw.txviewer.database.ITrAttribute; +import com.itjw.txviewer.database.ITrGenerator; +import com.itjw.txviewer.database.ITrStream; +import com.itjw.txviewer.database.ITransaction; + +class TrGenerator implements ITrGenerator{ + Long id + TrStream stream + String name + Boolean active = false + ArrayList transactions=[] + + ArrayList begin_attrs = [] + int begin_attrs_idx = 0 + ArrayList end_attrs= [] + int end_attrs_idx = 0 + + TrGenerator(int id, TrStream stream, name){ + this.id=id + this.stream=stream + this.name=name + } + + ITrStream getStream(){ + return stream; + } + + List getTransactions(){ + return transactions + } + + Boolean isActive() {return active}; + +} diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrHierNode.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrHierNode.groovy new file mode 100644 index 0000000..8ae68d1 --- /dev/null +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrHierNode.groovy @@ -0,0 +1,44 @@ +package com.itjw.txviewer.database.text; + +import java.beans.PropertyChangeListener; +import java.util.List; +import java.util.Map; + +import com.itjw.txviewer.database.ITrHierNode; + +class TrHierNode implements ITrHierNode { + + String name + def childs = [] + + public TrHierNode(){ + } + + public TrHierNode(String name){ + this.name=name + } + + @Override + public List getChildNodes() { + return childs.sort{it.name} + } + + @Override + public String getFullName() { + // TODO Auto-generated method stub + return name; + } + + @Override + public void addPropertyChangeListener(PropertyChangeListener l) { + // TODO Auto-generated method stub + + } + + @Override + public void removePropertyChangeListener(PropertyChangeListener l) { + // TODO Auto-generated method stub + + } + +} 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 new file mode 100644 index 0000000..f74944a --- /dev/null +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrStream.groovy @@ -0,0 +1,72 @@ +package com.itjw.txviewer.database.text + +import java.beans.PropertyChangeListener; +import java.util.List; +import java.util.Map; + +import com.itjw.txviewer.database.ITrDb +import com.itjw.txviewer.database.ITrGenerator +import com.itjw.txviewer.database.ITrHierNode +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; + + public TrHierNode(String name){ + this.name=name + } + + @Override + public List getChildNodes() { + return childs.sort{it.name}; + } + + + TrStream(int id, TrTextDb db, String name, String kind){ + this.id=id + this.database=db + this.name=name + this.fullName=name + this.kind=kind + } + + List getGenerators(){ + return generators as List + } + + @Override + public ITrDb getDb() { + return database; + } + + @Override + public int getMaxConcurrrentTx() { + def rowendtime = [0] + getTransactions().each{Transaction tx -> + def rowIdx = 0 + for(rowIdx=0; rowendtime.size()tx.beginTime.value; rowIdx++); + if(rowendtime.size<=rowIdx){ + rowendtime< getTransactions() { + if(!allTransactions) + allTransactions=generators.transactions.flatten().sort{it.beginTime.value} + return allTransactions + } + +} diff --git a/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrTextDb.groovy b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrTextDb.groovy new file mode 100644 index 0000000..ff6f537 --- /dev/null +++ b/com.itjw.txviewer.database.text/src/com/itjw/txviewer/database/text/TrTextDb.groovy @@ -0,0 +1,201 @@ +package com.itjw.txviewer.database.text; + +import java.io.InputStream; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import com.itjw.txviewer.database.ITrDb; +import com.itjw.txviewer.database.ITrGenerator; +import com.itjw.txviewer.database.ITrHierNode; +import com.itjw.txviewer.database.ITrStream; +import com.itjw.txviewer.database.InputFormatException; +import com.itjw.txviewer.database.EventTime + +public class TrTextDb extends TrHierNode implements ITrDb{ + + private EventTime maxTime; + def streams = [] + def childs = [] + + public String getFullName() { + return getName(); + } + + @Override + public EventTime getMaxTime() { + return maxTime; + } + + public List getAllStreams() { + return new LinkedList(streams); + } + + public List getChildNodes() { + return childs.sort{it.name}; + } + + public Map getGeneratorsById() { + TreeMap res = new TreeMap(); + streams.each{TrStream stream -> stream.generators.each{res.put(it.id, id)} } + return res; + } + + void clear(){ + streams = [] + maxTime=new EventTime(0, "ns") + } + + void load(InputStream inp) throws InputFormatException { + parseInput(inp) + } + + void parseFromTextFile(filename){ + def file = new File(filename); + this.databaseName = filname; + parseInput(file) + } + + private def parseInput(input){ + def streamsById = [:] + def generatorsById = [:] + def transactionsById = [:] + TrGenerator generator + Transaction transaction + boolean endTransaction=false + def matcher + input.eachLine { line -> + def tokens = line.split(/\s+/) + switch(tokens[0]){ + case "scv_tr_stream": + case "scv_tr_generator": + case "begin_attribute": + case "end_attribute": + if ((matcher = line =~ /^scv_tr_stream\s+\(ID (\d+),\s+name\s+"([^"]+)",\s+kind\s+"([^"]+)"\)$/)) { + def id = Integer.parseInt(matcher[0][1]) + def stream = new TrStream(id, this, matcher[0][2], matcher[0][3]) + streams<transaction.beginTime?maxTime:transaction.beginTime + endTransaction=false + break + case "tx_end"://matcher = line =~ /^tx_end\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/ + def id = Integer.parseInt(tokens[1]) + transaction = transactionsById[id] + assert Integer.parseInt(tokens[2])==transaction.generator.id + transaction.endTime = new EventTime(Integer.parseInt(tokens[3]), tokens[4]) + transaction.generator.end_attrs_idx=0; + maxTime = maxTime>transaction.endTime?maxTime:transaction.endTime + endTransaction=true + break + case "tx_record_attribute"://matcher = line =~ /^tx_record_attribute\s+(\d+)\s+"([^"]+)"\s+(\S+)\s*=\s*(.+)$/ + def id = Integer.parseInt(tokens[1]) + transactionsById[id].attributes.add(new TrAttribute(tokens[2][1..-2], tokens[3], tokens[5..-1].join(' '))) + break + case "a"://matcher = line =~ /^a\s+(.+)$/ + if(endTransaction){ + transaction.end_attrs << new TrAttribute(transaction.generator.end_attrs[0], tokens[1]) + } else { + transaction.begin_attrs << new TrAttribute(transaction.generator.begin_attrs[0], tokens[1]) + } + break + case "tx_relation"://matcher = line =~ /^tx_relation\s+\"(\S+)\"\s+(\d+)\s+(\d+)$/ + Transaction tr1= transactionsById[Integer.parseInt(tokens[2])] + Transaction tr2= transactionsById[Integer.parseInt(tokens[3])] + switch(tokens[1][1..-2]){ + case "CHILD": + tr1.child< + def sortedTx = gen.transactions.sort{it.beginTime} + if(sortedTx.size()>1) + for(int i=1;i + def hier = stream.fullName.split(/\./) + ITrHierNode node = this + hier.each { name -> + def n1 = node.childNodes.find{it.name == name} + if(name == hier[-1]){ //leaf + if(n1!=null) { + if(n1 instanceof TrHierNode){ + node.childNodes.remove(n1) + stream.childNodes.addAll(n1.childNodes) + } else { + throw new InputFormatException() + } + } + stream.name=name + node.childNodes< begin_attrs = new ArrayList() + ArrayList end_attrs = new ArrayList() + ArrayList attributes = new ArrayList() + Transaction prev, next + def pred =[] + def succ =[] + def parent =[] + def child =[] + + Transaction(int id, 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 + } + + 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/.classpath b/com.itjw.txviewer.database/.classpath new file mode 100644 index 0000000..ad32c83 --- /dev/null +++ b/com.itjw.txviewer.database/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/com.itjw.txviewer.database/.project b/com.itjw.txviewer.database/.project new file mode 100644 index 0000000..10e4470 --- /dev/null +++ b/com.itjw.txviewer.database/.project @@ -0,0 +1,28 @@ + + + com.itjw.txviewer.database + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/com.itjw.txviewer.database/.settings/org.eclipse.jdt.core.prefs b/com.itjw.txviewer.database/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..c537b63 --- /dev/null +++ b/com.itjw.txviewer.database/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/com.itjw.txviewer.database/.settings/org.eclipse.pde.core.prefs b/com.itjw.txviewer.database/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 0000000..f29e940 --- /dev/null +++ b/com.itjw.txviewer.database/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/com.itjw.txviewer.database/META-INF/MANIFEST.MF b/com.itjw.txviewer.database/META-INF/MANIFEST.MF new file mode 100644 index 0000000..aa871f2 --- /dev/null +++ b/com.itjw.txviewer.database/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +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-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 new file mode 100644 index 0000000000000000000000000000000000000000..1b5427a2cebb626c472c01d4eab83af8178d4e95 GIT binary patch literal 2349 zcma)7OH&+G7(I8M&Dgw#M@&e<1d}i`1V%|r)Io|@Qh|bi8G=Slv|$=(GSfZw^nmVM zXcn$rrQD|2X!$6eSXyPdPE~gPi2Mr6b8k1$Bv=Ji(=+$n`+eUz-*;~F^xr@J0x*i5 zBq9Rm*PLp>^0syg-sjtvxnsJ8vf&x4M%^r2-!^S;*{YgJ!~{CFjBTS(G3<@P;_8;U z<|UC3=srNFoodZ+jn#@N5V=(n5HkX;(~e#D4BJ~VDh)F+Ir7z)tPY-7C?zJJJv04P zd|PfaWKJM4X4#fEE^r|`e~^9Nu{VmLb;)xrBDocT*tAnNQ;4ERM<;p(qS@R^3a{c+ z5+?=P4kyvkhtmQr6(&@q)cLs-Ii1zfkBop;H+{YWz1g{=i?+{Owt1^jT{YchUvqli zSu-jthHJ@n0LHvct1fVH{y2Ruvdf`rN;2g&*baeoXeSU)rW*m%7Shk_Xh#PH6D*O6 zSq}8YvNJi(B3_rEKx!{Y4vD>*k=ozTF@#H@%>{18vU9l=4R3N>>-7|_;q4^eI%EZ( ziH>(b@?8{33z*B!?1t^Q<}_U-&=Vfx-q>a}yvwY$dR!U+h(6aaNx%+(_NfUC*9kOy zp!n!1G|UpHD&YA)k2}zU1uQ0U>oB7)>YiEEv4r=i&U9Te@LOj&g(aHCBL~x{7L%aD z69?w-sZBMkO4)QZ+!5%TaqK}a^T2j?GCP}wm+_oT*~#o!-ex9++jw94?SubONC)1= zhdMsO$Mm#OtC@CLVECwJyfoQ>L{Y zst|JUVj4Rh&G916kw=uDIG-nxr1w~nK8+y7wH{ix663Ywp5)$%G@o5uEhENQpe_Fd z-T9#=PF!l@%+D&vIf<)Xji*}B%Gd#789xHA;XGIJOgkMCDp&f-a1&P_;T5&og_|Dpf%bfVH^wcN+r_=~ zLw%m4Bt_|zZcJ5whefXG37_Xr3=SJ_R2B7&*B2BO@Tagk*FVvDo)K<;(XieNAQdEjh3+X8;bHA(V&&q8;rMqGOWvYC*jm ftI2vT`Juldn)pnn4HFhBtvnJzT|GTC)c5v(()!Je literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrAttrType.class b/com.itjw.txviewer.database/bin/com/itjw/txviewer/database/ITrAttrType.class new file mode 100644 index 0000000000000000000000000000000000000000..94fb32aad1d1fc75510ac2f711b6c273441b349f GIT binary patch literal 189 zcmX^0Z`VEs1_mPrE_MbcMh3Oy{9OIalB{z5l8Um-)bi9K{glL##H7UHRDI8oBFB=F zqL9jhRCWdyMh1bb#Ii*FoW#6zegCAa)Z`LI2KMyS62HXUR7M674NV_}d~iuoW?s5A zL;=VEMh33n{L-T2RJY6=AV&bnY(0=RHbw?U24BR+)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? literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..d15efb48dfcdfbe02fae384f96a8c7e953d75107 GIT binary patch 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%- literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..9214e2078dcebbfd2440f2853f1302c4c26959ad GIT binary patch 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..bd07ac1dbae29ab634ef079edf96374c0e0112d4 GIT binary patch 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..03917c97607572cb382eba6e8302fe17caab8160 GIT binary patch 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)} literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..25c91f4483f756036680091b3d8c545226631448 GIT binary patch literal 406 zcmb7AJx>Bb5Pbt2nBx#cEwrQZqi`dw#s(!~E;cIt-m$?Yce~_n5BOVFCKmnxP5e7{ z#yMiFY;4}lo0)yHZ{EIMUIFy6+dzdNVw(!>W=r8#3$2za6BFrVBy%N3W?s0V%~I*E zR|RERB6LF=^8(3hnEw=O?osE2 z)9{~8&ItaUEwWe*bt%60m)(=nDSF^f^3e$U@KER2U{=8fXRLxIW55-$=74wnjMme7 Zq|I1901I>&gLUp<3teV>O2!Iyz5&2+WlR77 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..3400ad8db8d9d5edeb7a4fe0557a6e4b91931ace GIT binary patch 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`IocH^87&mti&<4-h_quAjw*0A1-k)VQjE+xVe7kK&u Q?B9Mvcp)OBkQR31H=kV^Pyhe` literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.database/build.properties b/com.itjw.txviewer.database/build.properties new file mode 100644 index 0000000..34d2e4d --- /dev/null +++ b/com.itjw.txviewer.database/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/EventTime.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/EventTime.java new file mode 100644 index 0000000..4f6f07f --- /dev/null +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/EventTime.java @@ -0,0 +1,57 @@ +package com.itjw.txviewer.database; + +public class EventTime implements Comparable{ + 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){ + setValue(value, unit); + } + + public long getValue(){ + return(value); + } + + public double getScaledValue(double scale){ + return value/scale; + } + + public double getValueNS(){ + return getScaledValue(NS); + } + + public double getValueMS(){ + return getScaledValue(MS); + } + + public void setValue(long value){ + this.value=value; + } + + public void setValue(long value, String unit){ + this.value=value; + if("fs".compareToIgnoreCase(unit)==0) + this.value=value; + else if("ps".compareToIgnoreCase(unit)==0) + this.value=value*1000; + else if("ns".compareToIgnoreCase(unit)==0) + this.value=value*1000000; + else if("us".compareToIgnoreCase(unit)==0) + this.value=value*1000000000; + else if("ms".compareToIgnoreCase(unit)==0) + this.value=value*1000000000000L; + else { + System.err.print("Don't know what to do with "+unit+"\n"); + } + } + + public String toString(){ + return value/1000000 +"ns"; + } + + @Override + public int compareTo(EventTime other) { + return this.value getAllStreams(); + + public void load(InputStream inp) throws InputFormatException; + + public void clear(); + +} diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrGenerator.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrGenerator.java new file mode 100644 index 0000000..adb52f8 --- /dev/null +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrGenerator.java @@ -0,0 +1,11 @@ +package com.itjw.txviewer.database; + +import java.util.List; + +public interface ITrGenerator { + public Long getId(); + public ITrStream getStream(); + public String getName(); +// public Boolean isActive(); + public List getTransactions(); +} diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrHierNode.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrHierNode.java new file mode 100644 index 0000000..fca7e85 --- /dev/null +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrHierNode.java @@ -0,0 +1,32 @@ +package com.itjw.txviewer.database; + +import java.beans.PropertyChangeListener; +import java.util.List; + +public interface ITrHierNode { + /** + * Attach a non-null PropertyChangeListener to this object. + * + * @param l + * a non-null PropertyChangeListener instance + * @throws IllegalArgumentException + * if the parameter is null + */ + public void addPropertyChangeListener(PropertyChangeListener l); + /** + * Remove a PropertyChangeListener from this component. + * + * @param l + * a PropertyChangeListener instance + */ + public void removePropertyChangeListener(PropertyChangeListener l) ; + + public String getFullName(); + + public String getName(); + + public void setName(String name); + + public List getChildNodes(); + +} diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrStream.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrStream.java new file mode 100644 index 0000000..f41d4b9 --- /dev/null +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITrStream.java @@ -0,0 +1,19 @@ +package com.itjw.txviewer.database; + +import java.util.List; + +public interface ITrStream extends ITrHierNode { + + public Long getId(); + + public String getKind(); + + public ITrDb getDb(); + + public List getGenerators(); + + public List getTransactions(); + + public int getMaxConcurrrentTx(); + +} 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 new file mode 100644 index 0000000..7ff6e48 --- /dev/null +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/ITransaction.java @@ -0,0 +1,15 @@ +package com.itjw.txviewer.database; + +import java.util.List; +import java.util.Set; + +public interface ITransaction { + public Long getId(); + public ITrGenerator getGenerator(); + public EventTime getBeginTime(); + public EventTime getEndTime(); + public List getBeginAttrs(); + public List getEndAttrs(); + public List getAttributes(); + public Set getNextInRelationship(RelationType rel); +} diff --git a/com.itjw.txviewer.database/src/com/itjw/txviewer/database/InputFormatException.java b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/InputFormatException.java new file mode 100644 index 0000000..26dbcf3 --- /dev/null +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/InputFormatException.java @@ -0,0 +1,10 @@ +package com.itjw.txviewer.database; + +public class InputFormatException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 8676129878197783368L; + +} 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 new file mode 100644 index 0000000..28cbd39 --- /dev/null +++ b/com.itjw.txviewer.database/src/com/itjw/txviewer/database/RelationType.java @@ -0,0 +1,5 @@ +package com.itjw.txviewer.database; + +public enum RelationType { + PREDECESSOR, SUCCESSOR, PREVIOUS, NEXT, PARENT, CHILD; +} diff --git a/com.itjw.txviewer.feature/.project b/com.itjw.txviewer.feature/.project new file mode 100644 index 0000000..78f8e93 --- /dev/null +++ b/com.itjw.txviewer.feature/.project @@ -0,0 +1,17 @@ + + + com.itjw.txviewer.feature + + + + + + org.eclipse.pde.FeatureBuilder + + + + + + org.eclipse.pde.FeatureNature + + diff --git a/com.itjw.txviewer.feature/build.properties b/com.itjw.txviewer.feature/build.properties new file mode 100644 index 0000000..64f93a9 --- /dev/null +++ b/com.itjw.txviewer.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/com.itjw.txviewer.feature/feature.xml b/com.itjw.txviewer.feature/feature.xml new file mode 100644 index 0000000..191bbd7 --- /dev/null +++ b/com.itjw.txviewer.feature/feature.xml @@ -0,0 +1,55 @@ + + + + + A viewer for SystemC Verification Library transactions + + + + [Enter Copyright Description here.] + + + + [Enter License Description here.] + + + + + + + + + + + + + + + + + + + + + + + diff --git a/com.itjw.txviewer.feature/txviewer.product b/com.itjw.txviewer.feature/txviewer.product new file mode 100644 index 0000000..4ffad07 --- /dev/null +++ b/com.itjw.txviewer.feature/txviewer.product @@ -0,0 +1,35 @@ + + + + + + + + + + -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/com.itjw.txviewer.graph/.classpath b/com.itjw.txviewer.graph/.classpath new file mode 100644 index 0000000..8586d88 --- /dev/null +++ b/com.itjw.txviewer.graph/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/com.itjw.txviewer.graph/.project b/com.itjw.txviewer.graph/.project new file mode 100644 index 0000000..28dd19b --- /dev/null +++ b/com.itjw.txviewer.graph/.project @@ -0,0 +1,29 @@ + + + com.itjw.txviewer.graph + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.groovy.core.groovyNature + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/com.itjw.txviewer.graph/.settings/org.eclipse.jdt.core.prefs b/com.itjw.txviewer.graph/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..c537b63 --- /dev/null +++ b/com.itjw.txviewer.graph/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/com.itjw.txviewer.graph/META-INF/MANIFEST.MF b/com.itjw.txviewer.graph/META-INF/MANIFEST.MF new file mode 100644 index 0000000..6d500d7 --- /dev/null +++ b/com.itjw.txviewer.graph/META-INF/MANIFEST.MF @@ -0,0 +1,19 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Graph +Bundle-SymbolicName: com.itjw.txviewer.graph; singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: com.itjw.txviewer.graph.TxEditorPlugin +Bundle-Vendor: ITJW +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime, + org.eclipse.jface.text, + org.eclipse.core.resources, + org.eclipse.ui.editors, + org.eclipse.ui.ide, + org.eclipse.gef, + org.eclipse.ui.views.properties.tabbed +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-ActivationPolicy: lazy +Import-Package: com.itjw.txviewer.database, + org.eclipse.ui.views.contentoutline diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TrHierNodeSelection.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TrHierNodeSelection.class new file mode 100644 index 0000000000000000000000000000000000000000..f153fed80eb7207407b1433c7e15dc61ea28fca6 GIT binary patch literal 2088 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 VRt>GjU7}IQc0`T|i+SbWe*x)9Uorpy literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..ee18b660d4205af5573be9071b8011340a49807d GIT binary patch literal 3710 zcmb7GX?Gjd8Gf#}v6M-O93Tq@3<;?%2T$q*0w@iM?Kn|U7P6=f(57SQS{{3>5i=v( z6k3)p5W2FIed$h5KLrC$4xGd1p8kgZiv9rTbMK6#QKB}k?9u3b@4fH)y!-vtul&?T_Do5Gceir%Cc zLLf8eROVbKl!eA=wLpxSaOHTslsM6?7N~b&qEg^$*c3&io8yHk+h1t%dkJJt+GXh{ zr1UkJ(=9Lt(VZ@wKbAjvF+U|RP?)!uY|FK)73*y1JJm|AA3FrL(syIZcVi9TjcMNr z^hK@_7%r^Ozd38`YT1Ar(b)d>#?bPtad1$rjEvP`2J_n5c~cc&PgZX^6ugq{ z7H!{Abj<7t=bS*Gmr+(g?intqT=9a6W6k>ZqFna;1uHU)xe&^gFsBr!kFJztEp(V3 z1}uRsEk`$36s~WY7{wliYoCeRFqp=DIAGv@M!I$4)Xcmrg(e=rg97~(8BV%(Ku}wT zM-l5de9OQ=8rTw`mrNYO!vY4+pCoXBo7;}Z@lWFjCJjsoY}4mE1j)n{jxv!b zs1ebz;RKLaQjD#GfSj`Tn2FnQhXGd6-7QTgoFHHtHnO7WE8;Fi?&bCyhk(_&BCsow zXa7wwb7te&ki~Ywt~Ej)gkDVr=TQ@)H@u{ns!`i z;t6bH&;nVreVaJa_&$DM;9^^*MUqU|n4!m)R8u=O%koPij#iI9+)(nR9ZDTcf&Cqn zwyOx1!)RhTr65WHn*2jb9;;O=%C=`roWuDvevIb~Jj={nKR^@9c%GHSTuvV9ppyEk zx?6NPjL@F8?Keo%xK~Bfa_4aVf9TSqjBVj1ylmi-z+FjHW#3*NFI##~W8MZPet}== zTq3NYHdt*|v?Tx9#BbD*-ij|}Rq1-g#H)(aQ+mqQjMq*4PBBttj@M&qn}Ih4?nt7! zUV0jD;BA%m?{KtLf(cWS0Abg3^ir}W?y7+J?`R?||=DKl)`hV*z-%9WV-hNOAJ>uGpO9vkIZJ?B-w z;dE+_aDAH^Q{9M8qMf|_nAnb9^pP^uRS5m0QwcgvdP9O%`!^=&O{8y1(3?qT67&G+ zEeZN&(zhh&TS;%lwx<5=NUQOyv2ZNu_njExTU8pb4*cFp>L9TS#m!#9uB`YByFVt? zg<*bg(w2>&2U*%OiV^b6Xg4`Zwot>KyYJ=i9#Ugk=F8+LpX|(zUcuh%Cm7GJVtftz z*YMC)9R3W`A0c%@DVzS7hf;(-h~qq>leAbbeO$SZEBAA*9w6WcHGrW=bPRw> z@NGOoDYx@P0Vk;XB+v84{DgtyycKHjuaY1D8uju~@-fD3Ek%9V8 zaK6q!{Wm$A52!yyuHs!~PLy9+765P&dwD0=Po)n)vIr_T42Qv7KpBg4nMY%Sgt?cR zp}&L=blIsa+kn*GZhkVE%qCj?A$}j*Z}F|--kbdt(=As<$*`>DMupVdETli+kMZF{ zbe(cuUv{*u9HUS_O@}{|K-Skp)`ve~NGtv`{u0Yd0@-~nkY_sr`72d-;iLZm2)=$# literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxOutlinePage$1.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/TxOutlinePage$1.class new file mode 100644 index 0000000000000000000000000000000000000000..9b8413d53a09702a78541877cf5747348d071c64 GIT binary patch literal 948 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..87cee637d9b22933e3e80e11a17ab0c1a228a2a3 GIT binary patch literal 482 zcma)2%T5A85UgI1#pR_aK2G8dG}%c^JZVe_#>9kpf#7*q#%0K|LzV&jEl(yM`~W}7 z*bB(TiDLntejHZHBy~Oeip^ZcTm39zA5RSA>Us zLap)FL^@gN=vY0?Cj*uAtw>dl9zTHTIj#=4Dz0fb MM2!*Qh@*q!AH6wuF#rGn literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/TxActionFactory$1.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/TxActionFactory$1.class new file mode 100644 index 0000000000000000000000000000000000000000..34002865cdcdd82a44c9d131f0e0b3d658ffdbb4 GIT binary patch literal 3082 zcmbVO-E$LF6#w0(&9>=6OTQ#SrAmP|6qfQ)uz^4+EyN~JNol3{wM}l@O*h%FyGdI_ zMMXt)#%CTF$EVKtrXzvk$l!x7zVQe6>Z?3EYCSibgpg$TFiki2-aY4c&i$Q_dw=`) z?mYl|@s)%chW@CLP&7NfsMt#xjW2RjnKRYYyrM>J%}83x#L`f1G)fDGx!m0^p_XBb zVa_Q$s%t5WEAd%1%JT|}BhBEp=QXQ)4_OF3rwKoUC!^}!CQld{&cLP#?XZ^A>;S`o zp67;}?ww?)9X4XT0SxP8)WI!AO)@0Zd*H$b84YM*aPZ@78$la z$%Z3DmbPJsgzaVdKs$J3$q|*&gI^SCOmi*BtFQn zy;9sM(}|^#m_~&;uBYd;q>RHjLghm=pWw4ORXHCwUp8ILXlFRJ^nIQPW6-G>feERx9~Rvi!Z1!Yq}{ zYXYoEjl~?K2}9sW2vw!A6zG)3&C}E;B%CI1a)C?RnyyeoSl}^%;z1Z2#N%}tXAz-7 zCNmY;k?|7lgm_d}hu(V55aMb650)>l=ofUDdlBU&D zm%7i63ssV!ltzd4ToS}(EP&i=FAc5rD7HSbT$xc-z?|Sxf*S&^xfoo_i7rEfRp=`e z=Eu5YdG!|LL>o3{;-bA*goL5)Vw$Iks}AR7SsswCWaVmFY3 zP8Cj+V^vKZepciFVF&&fL_S~wU|qykqYGg*l{@7md_X1qq*hoUQ^FN$?^V)B!p9V^ za)PNxMU1o=<)fN7VB5-W8M}o%)$m9%svDM;oC|Y%-iS%~oI$C~mnYs>WPE|^QVjtERbG+%|yb z7ID`QEA-z054~@s(Gi*pxhCJvTabO5Z(+UfHk!ZB3AWPHlT#qJ=)%@UbD0!L9PQ|! zUxpXZ;y~4`BcKLadw2&MSMd_VD!RqP#}L|iAA44@m*M}3tKIL_L>sRpxLl$q+B#U=%u03$fZ*t6eCD+fwf!KY_ zWudKLW3~0fRTt}Qul;t-FSx3O;OcCSq5U*IfIbXh9}Z#=hv+yMq~7X>N{3^dD7O&6 z`#6d#bkJSL5N_f)zN7gMI6-`k-~mqJ55oA9GzI4Y5kNf5bKZ*Ik-|k{y$^R`5?T$R zUWSb{$yxN5p^-$$U0B2t1$~*cJBm`5ic;^9)Ma`XfoBan;FiE7a*WaQLtu?=X!#`x zALSS2nt!lOLYTgPW3z;@zaVd4BQML8MOJ-6&^5S;!xkwWzO4+({8 AbN~PV literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/TxActionFactory$2.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/actions/TxActionFactory$2.class new file mode 100644 index 0000000000000000000000000000000000000000..e2ae0c6c1fb310982b707e92a8a77b27f5f6f72d GIT binary patch literal 2300 zcmb7F-B%Mw6#oqgnG#k+kt((*t*IuEvKlB=VreNtO`8a9_z-MuCz~NGgk8G30j#h6 zCw%OaulAuL^&F3V=|lgh(mPp*aT6%yoXpPLuiw3Q?!EKRzkj|0kb=R{!f?Z|*LBld z-O|17O;c`3M=v>IV?`H+XWEvl&u))bcT+^Loky`0N0{NV?UZzBl+6uS>Z{AbkoyX{ zFU=6~R!lc`oe;7ogh-R}ZPPNnF^1vziM12+4B-j8DBHl$uAvo?C_*@;fun;V6juVL zv!*5QRn`mAnH7byWH_6(4N;yKj;YT3#IOp2Vd$hz#8MPQ$f;OSbmKh7y9_<`8LOE3 zOj&r#wzEE$(QpAh3|dKg3%0XXke0E+&>K%=11gysJKc`=(97|Dqun<`8ZO~7!v(Ud zE@e~J)E7*vXm2rGISRuUBBT#+h2z7(ol^vFkbF@MF?__(MR<8xmes1sOJ~zGD7~>J zP(dlex`qTtoS`omdQetFKL-4y)mRMi0E%CkeqFnIrY4!@_?Tg^9waF0ITgdJII>t% zYDW^fhU>V&z&(51al|8r?s(!sc2#T&y)3MfK3!O)$jSZ?gML`y7lkME%&a3Um%57D zjG9XnCC4WW$-|WD#A_}^F^o@DVc$HmRSv;RC+0au8Ll-#Dvg4m-mdpDN>k&uLi>!| zY}S}fwFo7O&oR#N1;f=wD1Y3{Zci3X8Za~EO3Ab|e2EE$D3#J3xhyJWkD;IL_ITQ9 zg*T~T3STjtAsf>h(%LsK95SWKCoQ9FyQWpjNpHn2ay&euRs8;Fc!o6m1hUn= zF4kmSV;np_cjI-*$a@Zfr5h3#%cGOd8tEwN8JwjrB^n*R6*fdNoM?|< z;M^`QGVG#HEms+`1Fw+KHzw)afA9fERu5bd*5n3Dn{iF2N7T%hHlRkqv-f#%3yMnIdg^D>BL zT+(q7o#dXd%5rYEv@V^rxn87|P{Pic#f<4#O0G?6?xt0tLkiN3*ZJIw44#`&EB$p% z$Hxc-Il4rTF1luJJ8ACJEVa@^H8=tTk@(tR!gdOV%oVMjiZr%1%$%%+(Wt78E1-TI zS8z3eTPkSze6MTwE}MHYfCwkz$*0-Wli4i8q;!XL+(DG_DVf`H(RHL*Ix-lKB#yIy zOIEosetKr@14sohtP+D%%wqAF&RvxjvSjbc-VMht)kuy~Rgp}mQi<$zED=k`0=Ta- zrK+kR8q_}%xH!98+EK7+$1GQv#Y}5;wl8#ii7|mLb+(4JqXRzsumir|=}gS3)p%aO zFUu-dI1+1qe8o&XXQK9x1Tle0m6J~d9z@QaR%?TqAf_?n2MhK3doo7HQ#>Q!PS zpcVAAtmGVPhuu)%@mcP8=RnmmbY#Weby$xl5Ll7Z_*Tbv_?{N%ut47#WU6aNEyj6%}Pa9(8o5Q?v56O;o~n8 zUEMnfP;PCIgOuAEWSw$*gZvTY3k`Ayf~sv3%SSX`9z^bLj$4PSDFtn_(}<%hHh(h z!3d39(T-N`g+{cx@PKLu`23YPCV0*B@eTCzZv?m4%OZG=A*>*ZJcd2e-QFQKFizK~ zX9Ew(g%!0Lf6561z^0cc)k|X8fVUMB8 zrD3vtL^e7-UBIU2W!^J2osOU+}con*PlAg?pPImRiE rL2^)ubH9pPXBn-tjMiC3Yb=8`ZW_6lxwi>6cK8i(G{LWWtm@}K+(~YP literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrDbFacade.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/data/ITrDbFacade.class new file mode 100644 index 0000000000000000000000000000000000000000..929466847d58229be7acb47f148caeeebcce21cc GIT binary patch literal 3933 zcmbVOX;&N98Gf#i7gF5+jX7T5du63p^0N05*b0P1_VViDRx_D5Q99n&?qw_ z3~8Hm-8rRVhYxicdWkqkZkfS9@SzR&x-`~ByC{`NM2 zA#5m!2qcU4vTk`dZt33Yie=t19lhij)$97A;Td|i;A9pijH0nZWv*|*1Iwz2rykV>udfBLy^t|U-mC}en z=a^k_J)`2y8ReQ8M~A?Hx=LQ4Ya1tDm>o|~<>NR=rQGbb>4|IMkw83?E~GD}^W$+G z5@^3*RV;5*pe@-qClDPYdlhZy(a?<}0{zL!y&b5#JR;Q(OD)Nas^T?pj$_uzQ;aAlcVKZFfjV4nW|9hWFy6K!;Uu>Li)) zeU$5xw5ZbJl(AZ{mgz@wZ?oeoX2p||BPvZlpy56o>p%==G`tU|m;_>_%VlQLG?wXl zf^dFiBBWta=tJOTohe`d;alx)ZjuYc1xDN0-Gf)~X;0eZw zfER0(MOj~GL(duj`zBl91oDi{lSnIgN}%_yLK-e&jP7h(Vb^))su$GWUDZM<`ZJEF z6-=-jb^_wNs^Jo{0t$h1^iSaMu5g5H-hpQ@rC_pkJOV#LTN-khW>g87H=Px$XwI5T zreju$1b@6SG9h-$(7aofL3#!s)G!Oq6xjr!fDhTi{U-gewEdI>mEhOpWetNkEBoVF z4IjchyI{$3%o)e7nvSl-Mor+s#y)7So_c4@#c_+H zMb7_|a)nEXH4QJ|V_YFFCz#=xCEHnJaWw)qsDDC0<0}U|cYdwnsdx#WQt-+8Wb{XU z+Hs6ESHq|A87|+VU0s`A66i}_Z7%36v$QioLgos}3O+CJ$bKPekv|n*#FrI(sZJ=k zT&%gCxvb$U_$u8uBt6NB+qu!r(0aC+P&O+YPpddPbs#XjZ+SImkTu-x2K%uQs@*Z& zTA4lFnfHw1%_*ZAULxdtuA}((A%Qb3D7P3!a%Fu>!?*Drroeo@W|Y|!yRsU(+jm7y zt1~LThaV{TJ{Q0q%W?Y(py7x3Q7}1uUOA3Y-mWq#euAGV`01|jXY3m9MH+sNUvNCF z$a|eEh@NDok$52G-z^3@@N4{5!EXc(?!G~2_#J-FmG4?FaE#JoR>dFjX9a&^WOoWF z%VkzF9cl75heR^lXej(hOKtdzhOgrr0uhThh{pS97#+Hpw`)$(oUr63?rOL#pOxl# z^C1oX#rS&+3gUb|z{__8D&Mt+_fGWUP{Vtd|J;oPHSVFtFm(j~x2MDg4!_}JyobLk z&w+bs;XWMYlNLx3?OtDox3Cali2o%*JoP4yzk}Fq|GUI!_s>r>=*L5SK@U!a`op2V zn%cnqTR1K7ZiM?A5Y%l1-onVS&$pHeeF>O^Nd3)7$(BgmokY@!6eX93e5|+l9OKE8 zsdWr(;@lQ^lb;$$#MY77!UrPA4GeB!CIWhVKH3}Y-$EgRRB!YSj;9h`LOQdKIT_G4 z$Y7jcn!q*PNn^b(9?e2l8!$!M9C(AvJg>kd(y`L@>po1fF0VN9pfVq?l$@FCv98 z#xldFam-_a@ww#FPX!c1`bYWYYj~Lsq!{N{_!ObWF}#X0@n0iy4C3EZ7P2=(KVPJf z?1P8;6Y4s?`8p1=9KO4b*EjLw+x>}7|E!B=zudyF1UB)9+o}Eyys<<2h@a9ac4v-p loyKv@kie`@@JN6i5~LOU6>rkABojsCa1WpF@Hv9@{{p^*0>A(O literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..27902373ea2583a8527634b16ae8621812a1c2eb GIT binary patch literal 4473 zcmbVOX?GLn6@FgHW`sP(j)+y#fH7bkYXOk}0b;^Z2RBY+L$IS%&?FtpgFHl*l+nn> zT>~^-k}heRE~IVfP8UAVbBcYaPh0vWIqhF+Pw8`KMvE;MlYWurUGDbWd!PIM^FM$7 zD}X0(Q$s*uZ>}_(vYdtLGAd@X9t|OdRLRb#%v`}L^RQ~A#BwE7wo7Hx zb}X}!8a?BEFHDrGcFt7jJahK+nNw#cv#*Yy96O~DNjIFBaBQoXAL6CqQnBI~MJHnv zs%8kC3T@-YEX5zHi;ujRPK$~Vx)nlhbncB{Iag8G>8YJEjbbHL^I>>~p_&uba=BzX zG}B= zDq7Alg~S8FiL{$`sqV-b+^4;;=% zO@Zg%9vwZ1vIg>|Gg2)Syz+W@FxC{1UymJV$KyKoBBh{JOvk&rB6R;|EF*Uh>g>w> z#JK1dq(%!OB1cDb91=C1+#8;;3e(b&j5boUTXn2LDs5GyJU32Q`J&-eZ9;Xl<-*Z5 z;$EvyhmH+tIL^9r^Xlq9Y1_tv7zyJTwuxV#(D4+8I`9leG_Wf-H7?6N9iPOr>@v$S zZG#1?5MANVsJ~AQ&mpbhc}CRGP&?HzhH-(#yu{X73AJB48qO&6-@gxuwQ0<1IIECs zy}7dcyt^Ldh4BI=rEXtTh^<#$o*-*kAbLs1r;ufj7}L}Lqvp?rS?T9R`^N=?mvy{? zS6MDIMrGU$m;H5)8f?jSk5^+WbHRkS6ElxwYVd@Z?;PzS8L3CGC2HfEIl zW_yGYtz<_@w^=lq;sL+6*P?>jEdr#$BHg;#b|=YbpS^SDC5BFA)Em74MilQgaHzK(bCeGNZb@oe+J4dXg~q2rhM6*U&jV&0i? z2l^-pC|9**_%I4mPm9alty}A)(+@)45bbmFI#URHZ@UpoW_q;cskv8L13MT)5CP5_ zJ~FWt8zE73@C6%y&h@6Ibr-J4JXnYA< zZzI_-6lIuTS9^x~XlMtW-RTfSA1D|;IIxg+2V^R|G~AsP~Qa3Fw&qha?bLF|)FNOaVl>%fz4 zUX(mre1)rAI^62gzBOIq1B2F%y6!*iy7n&uBpJyp<5+eHC(>S!Cl&5sSYiAI4(z!D zR`Ff5k0t+()7KD9EaQc2@-9v3$~nETY;lw#lv2 zb8OM`tjm{OLvc^CZYYX*w>+d}E@8oqA&SrPE9inl<5K#ZY`*ccexRL+58Q&306)Ll z<^@{GGeD~;xX!xG&eg#we39Amiap7HX_tUn-6lm>nb#%(Uzx&}@P;pWoh>W_?Vj|m?oVbn4A}V&hY`aqU(j(p6u*cguyqbH(GMH%PjdNwilu`LB}x-fY6Rw~lWweoP0w;wG(b z>g4xNko7Ik(6Yd^CC<$K^e(QCB|m_kT*S}cM|<1N;LUpY9<{thn{PLTx}|Psi*IKm z$^6%>A}`bs)V~qcIM5V+!#48LdXQSBKU9OcJo0;|DFjtlt$fuAH}G3u#c|iMHB`LY U`be$wb;z z6Xt{(&uCSspPhSNT52VnRYG$ZEgOc|HFu} z%6pkfH5fs`Rx}9I=n*5EA(2YpWG#tQH>4-DaAt8vGa~9tT$9NqqiTFYHFSCJJS;co z^)#zo1o*!jL-@+$dO|n51^lHr*;VNBPx#=$4h4^5r$9$3FE%rr&$|=>*5|q^b2lW=HpaMg)Y&+GL zQ}s}in)Xp(eg&IQSAz<4C}_oA0WTfS=n1+staD+V1Dqws7|;@$p_)m9x^u~8Og$bL($gk8S3R!B5~`UoDB2TQDz3rtBBjU|fD7N% zZH0bD!C^ejfnex}p(fI5)YLiA4}B zdK7fyIe|u6jT*_6W|%8MEgd!VlwE~mZT_jDq!9~f(YT)ClFH}-xgFDilx?nS=|HH^ zwM%Y_J_Y?4AP2{GJ@k=>1D3NIQg8~rUYrp)Sc+UBw<-(^Y}wtMoNG4os_w&SjL6v; z71-OBC(MzV1ubfJ@EMSA9g zil`SH9-EMT)~uvWZBfB2DEVqt(vz$N+VhjjQYs`A3duF8B#fM_1P+&!RAJZTW;e8S zCeEExJ8r7cOT%i)IVv{i$=5mx1zL;H%ilH*V;>fg^dhk?XZxLk6fQHUb~&TQIg{(U z=(zhY)F6$F7bLYQ*G0K46fDWfDo^WIH6NC7)eBZ_ORi&~1ofdA3SP!5TyabC2$#)n zYzyTRb2iA(7TZ4D2d%?i4&Yk~6x8x5u3I-fW^cwwCk@%7b+vP5tqR}r(}#zH&-%YeKY2DtjhNho+RR-xTb}Mn)Gyxdphmsw{fw(^OkKT+v~AZxQi12oTMyz zsNr7fF-WQO@w=&?cLNwi$RcP9YS?N0cD|oOj1>3NW1e zCSJbjRz1Kwspkr2er;pHC-Mqj;Y#^!yhE4u^V)O^*EWvW1?D)F$Eea}RB3Gw8TegX zcd(8!bxEYQeHHKB!TSQM`1B_}uvdV+K&JBu)w+bf!q+YcPX(D~{WlxOGMdN4<1+E! OJMJ;bEr4ndi7z(2_WS4v50w{rN z3kz;6?leSa~45OJVdu4YR z;ww%;B+-O+11WScG-a|otzhUh(268OdtTaNvvRO2-0dLB&b(vs(hhf}o>v#+YEOC$ z6A_0uEHH)MToh`fKqqFh`9GD;J9aUbLNjg~=)o;24w=0Yws5&}T!s;{Zd{(4v5)C9 za0hn-%(5s-dz-4ykZFurI~2CkmOkU5f%|yCkfc!7?1Em`5e^y{(93PK?4y^Ia;X@# zgeppw%)ImzW!t(Xi#Askmkysl&$wnVcS%l~EO#qP+*x&5;{5Y-_DmM zUejeY@n;5UdWzcB6{Sm*av|p6@_fw+>Y~9+UCXVMxaXZ`RVVjc0(10q)JwP`P5pd$ zX4!Sh!c|gu=EmD#e6r2_3NM`O@{)d+uc&! z`tX{Ut0GJWC$CHWnDm5SvvDmi^pm=q5Tjm5&?v5DPA_DV#&jh8+i12<`!T&b{1w-S zN4_BaiDog}p#OF9294slNxoh52f71mnsw7m(=?UQN7}72r~SERen$EXy$q*h88BOD z59sw-ItEP$SWL?{ns6^n=!+zfXrl@JVZuNpf%F|scoZgNA_*i@$~EI>ob_w`S3QQq zq_Id63A-_AEKHh=B+*0AnDit}nu#Ql7HgzwKf6Vm>kdlk+a5W?(^%-b=X_MqI;mRg zq%ec$RBVP9n5`Cl$8T5=s5AEw#&^uWr^Z}7Wx9i!>bi0nEm%Q2R_oB|8aj<7EE96Y N_hRidT=g$x?KdE1#Z>?R literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..1cd0551b39a560f34fd58bf191ce5b6054e7b41e GIT binary patch literal 3910 zcmbVO`*Rc575=Uydu4l#%@Q0ONJ~OX?7p8K8eJnsGH zfBy6r06XwU4H1Q%+0ty%b}wE|x>x3G>$2q}^Nv}bN#;z~Os2;jvsf{+u3ajgc1mT- zac!%jA*RrM(VR1r1+$n>o|?XBWnB%e3dxd_Pg>c6U9MQks+|;*m1McGHJJ{~%#W3- zPS#S;?a&zteVLVj1j@8YgJC$s3LU4)2(t zhJk_Fyj) zxMI0SOxMbnoOy+fVT+CZ0{j^r`#|QRW-hl(FJQIrTpZ8xoWoY$E^c-0S?2mdg?Or% z^JZe@kdDJR!i1^VFER<3CTR^Rwt%$=Y1C{pT4L{*j^jwPBHWTkvqBRAdO@nmH-?}txbb4LUoVCJ=yVfkQl@X+!_0v{V&J)9ABI#)6*#eY`EM?+gUy2Oz*T%g!%NK6 zX5SI3IzEY)S%bD~IVLX$cD_2P-pT1ePEuaMXEc18(3%$Nt2$oAHi9c!S9ryKcFlk` zfNA)g!o$n&#KTp)kh7dPzM!DU>g)KDG_<`Pcnx3C@l||{1x>$4S#--gc)+e~x~AhB z_$H%cmdmUmg`se&*254=RbLdGJ}f4_t>Zg#THG!9ixT1m9dAg8<2338Sa5w`#}9;q zIB|KEA%y)<$B*!1f}JrdqvXbGXy@3bZOPuy$&GubrQ$l0+EI30W?QJ5y&NFNCKF`s zCrE=~mfP?$EBjZuJ;TqJ=3cJ_*p+(4k6FB;6mIAk$A^W9-|2Wux^-*8D&{58wQSY# zqhdG~U8wI2dc~64quwj{Jm_Ajy2jNN+T1cH&n8x!|5`h0%j;ot_!$BS8L*adRKP5z?x_MR$wJ-I*gYAFE%pD{q7tx=&gMmpyH-;9GJUM9WsA1Q@ zU=2^7_2gZ~e#%FOeECpAZWsqB-xuqR`76CKS?V7csNuOkW2A)1AEIAJME zn$qB$%bX0|#)}I3TCQVPZ_90bO5rYE+ZP+WgV!gG&oAPOy|LT)vO*1Cui;xYe0KpI zBKjUrmkn)>F;nx`Uql+0rlX~0K&jkIA7oopFXPW=^O|-;rL~n2{>ZPbS0Zh@-^PbBB zlKUDiZwg#)V@lohTo#aVsC(!k7@qewejl8=n=4{XHOt;FRm(H&m%D11R)J}SKj59f c#6fNs04q$`A#^KEi1)V`nh1Yu9*V{P0#aJqzyJUM literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..048ec452f8c865bf68338128664a827d63c1c3a9 GIT binary patch literal 858 zcma)4+iuf95IviOIyG*a7ASWpC{>ddVagLy5CVlFAsJM)A@5szlx*eL*6t=L{1p-i z!~-9|Mv_H-WFvzekf>2RcFF%G9H zG;A*?W>kfTv;+lu60y`Bo3UD1w zfu@XOGNrtNXW6dQPryIUr#hxr$_cRYd$A8s5}e4=oV9&N9;dR2oADTfDY9|Bs^8a=T-%#;=Da=a<=g z!m-QvyL+Gc^98}jvS!WY$`ir3BeXaU7~`_**kCJg36~cv&)GVb=I$r>UvcG6jsbUk mS8{Bg*DW|0fg8BV=sIpOzJ}Yl!?wYzyNi45`F!TO^79LXF4=ql literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ListPane$2.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/ListPane$2.class new file mode 100644 index 0000000000000000000000000000000000000000..e5318d187bffb7dae0eedc025f03baa29bc0196c GIT binary patch literal 1058 zcma)*Z*LMo5XPS^*b}@KtZn^YsbG6R?HOK~U`!0H#)N7UDw^n<H@ox9{rdgmCx9AU3kwWoFC4m34<@cY9!oJ1vD=Gz z)OSbHRTJ$trP7By5T%-hG($0rd#><&87YzMi?Il_au33h5-++u(jsP9)P1Q+Pl(=} z6JMvGXEKobIm3=KcT~B}kZy!skpaUs8&|NHMG8wcEG#pm9OIB{%0Rps4Lc$};vHWw ztTaQ9`)wXevz{8$=Fkk)d6SoFbZBd6F8(fJ*m9cxtIfWtQ@z~IU>&zC++^6i)ZNBy z+@ZouWVa_YLt!Sv*^YAGCm!`I?qS2ieTI#T@P9pRJV1d?PuM-KIm4<`ZVvdEyFL$k z?%U2lc$#nzQL<2E*q&2H8;`I>_5Cbk(bBQt!mU$u!{Lhbr<7MyO0IH(Z1n_dr?`8H&5NjySjMLWwVt4JQxuTH bHXMSbP$u*ODyY(!CWUvfn>&hp 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..b29dd7fbf5eeb1918c57d586d52331b785a1acdd GIT binary patch literal 947 zcmb7CTTc@~6#fpqEGz}2RupeQe4tQZ65q@kAH+10YzPSr@6&cthU}%8ou%-v^hFaN z`~m(bx4xfsGCQTyAMLE zeFp)dl37DI_`gvJ%Z&X|@z|zNJCB$At|gIwn&xJpy4pSD>g~rka00OfX60WDw&Xql zTaU9N&fUJZ+u8ey`Oh5A!Ds8Uceaj2UchEqh6a{6;|45ag+W~O0INlH6A!1bZ`iy3 zTIUN|pExK%9V@ua0j`w=zX5A_if6_7bF5Ec_Sw6RO7q3vAguzVQ65i02pa{}<}Z5s B@d^L{ literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$1.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas$1.class new file mode 100644 index 0000000000000000000000000000000000000000..7ca9218ae7e92b3c255313fe1adc21ce583bcac8 GIT binary patch literal 863 zcmb7C+iuf95Iviub!$u-3Y0q(6u>D0lRhB@As{MJq`*T{h3Bm^a<+2T(e5Sz{tAhU z!~-9|M)=S@R7Dv{!pVv&{|E(^E1I$*K=D5{TpeziB)0Bz9WE5IeXW;F7?@ zl~{{##Wz^D?{zvzc@FtYY54VP<#c#z|5aZg927H?(kta@Isf|tJUWqc$@CrQG%u{u z*=us+V&u8q6}bO*iwiZ%s9cT7lmU)9JEh;ODP%+KQ7iPd;)B+ zf0MN*YYx15PeS4ZW9(7+EP9XElt~es5Rt-6vSmIC{m!6T7|Q-u{Mr2-e~P4{4Jy+ z5C?t$KMFBkasVO~@9mGD-@XHAqTwOOz{6z3l^xEw{Ww)}CQ}}zVm#mz z#m&s}iw~FWk%(j<^i-Hi(?fxwJQP#GW1%B{)*H&udRS$sBx%HD7^|_78CFiEwuYYz zrENzUE454+R_#EU$}?)+S*mx7pf8nH_7y|3x+J#NWhewmUlze|(}#z(67pF0QAC*` zUv&lR9i`>_$*3pOOVNuZ!$v0wMcfssa`8M_a1UU3zT6cmO?rSocC!c)ZPO%XIIMQA zo7t(GU#r$F;vOD&xX-Zn-*O)h@rWT8g$z3j?3uJGH2iJQD&aA9Jv?DJUP=cadw9yQ zCc;pfOvtlk)wuRvPKlMwIt=>@m4ABb_k0*i7s(_Ir+;9+vTz^4&A^8#XezNb`x8)Gu*-UoaObL#jjt%Z(QN- sSM2=Db4>kCGM?>>*Prt^-hEVvDUSo<&EXJ7v=>PCD(YEBmUX7%FY5&pAOHXW literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..83491c6aa800257bc2fc7b8c1ff25422b0668c40 GIT binary patch literal 1069 zcmb7DU2hUW6g>m9TX1D*)%vZ}Qp-nlZTn(^F;P-Y6Y2|XNawu0XC8^(YU4D>hcJT0j<8ZCEG@WUI!(X{(UljfZCx zpUAU-1UA}{Cxfnxl{wFiIa7eZ-f}5a4!D5gRP}sHW=)}m9Th|tRni9&jERzJnowV;^m)46z%i+!?9R-cd(XKaXMX(r`VBw>bqg5*&yR+lN=~O<@?oNAO0n0E zyHA*>y%bTCL!YZqB`*XTl_g`VU4dLH>QNp7mmI8M)kYSV9aty`WGlv@*j6FE9S=_^ zK9VN^32d|@Uj|(nD|4P3bEW`+r^}__?r{Nysp|D9nKgxa0<}u}Uya*0jciuCd2Hf_ zh3f)4{}tlkCT?-hW|RWu3rw>c?H#8{H7(o`*jmK??bPw(C8R4?vubusy)`^1^-1+&U!0gccO9Z(`#jhe&tVrKR%Tc z$>P`#{UFjR>>pAxhw*w6t@DYHEEPtZdra?qEs@P<6VY73u|o8 z^X?g+jm56jKk@G~oR6tb(b&=(E(ak>e0Dg-Sl6+^E9Z%;bCfr8lw$1+cKr<3zT@^6 s++Bnkp@8=()Mg4@oI?RcY{O-+EOr<=gNNAVHOG^#pq7$~l$^J}0Bf=ze*gdg literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..e687a665d13bd7a93b3764221bee9dd93ae523b4 GIT binary patch literal 9430 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 o+rxj5bUo3yR+kX$*7rrOmAV*R1J5MN@umAu6 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..0713e0d10d70bcf61e034214fd18096926f02c25 GIT binary patch literal 2098 zcmbVN|8o;X6#r~fI1;x|5m7-AXvHLj9tBkN3Q|L=rwK+A!r-Xm_Ohm1lDo|9CM|!F zKkHy%WX2zL#(&8f$G4YIl42k=Gn?Bl@4fxJ&-=1}{qx)J04|~KV1^+dL~U1@t!>xr z^pxC|vD=JAXVdK}S8p4)wsTYIPD|WhTyZeVun@&fR|YNB(J~Q`JsBG9mZPqgYYovc zGG;hvHkDqyNajn^+V@CnRfWo2XSk4^UM*K=m@PyNnFhm490zbPgB0dC92{myWv#%G zk_zRmZhJ$3`a{*AX;@1E4v3Q@NEmdBw zp22av?%*|s?6mA~ynz!8heQxaoiO|DemHuOLw7_^`fbsa1rhdy_8h#)aB8nFNn)r# zyOl_VCXG`#?ci;OGkXO`b0Tq?;|$I+upJt{Rb1qFC)v55!AZPpgOz1CkoA2_PafwT zEHNyz=@gClPdMg3=ZXdV)A6N6Z%JCsSB7(Ivg>D>EHdkd! zCM+{tnSB2w{sz9Ra$Eyd{gdRr%<#=*TYLM`6k)5HSc>*Y%x-Y3;S&Zn}-Al*S%)ULlPnZ*4jM-l5}gUHxDVaScA*+dh$dK#bMa|b@PyV3d?*C6QKz;t8T z*u8_}3zVo zK@aaf4a-}iC#cC5!=M#u6*kM#Y(@=R)HQ}^oDqB1wrUXb+AT!w4k;MvO)P`jPO+g( z6jwxSyfM&}2>zWYzPBO6VACE~ts&d(xgUlyF0_Q!QsXqe3n_Z>*!;YG9B4K}!@(ii zPt)uwt?f=Gzw|5pJp}(bkvU@bk`p4Eq~>YONyqNKjHC3WO2Dz9l|EUvRz&^*8KLnA zuRg}fyGsx77LA36IM+w+5!~U~;B&c;4~DZpF*lfbf8dy%+0n^h(jvM%alG}nkJ^(ZXOVCipErRCjirX~Hkf8OIe*XfB1Y-aI literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$2.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/ui/swt/TxDisplay$2.class new file mode 100644 index 0000000000000000000000000000000000000000..c41b0ed003eb2eaa9f2ee96456e99268385d99f8 GIT binary patch literal 1455 zcmb_cZBG+H5PlY_M~@Q_Ur<3USfnj4rxg_~kZ3L1q#Bae5);2H*G;>4y=!id0zbDTJ^&5aJ)(s3WWE{U~%W!AU4)@zq?1{jx z2fWp=ccrcNLc6m6LaLU_50Y5}F@`xmsN2GEWlM=DK(vJyD!VLP;e^unp4E6O6amBe zupw3Q9#NF~<;W3gReCa9XIM=24@*}WVtKzN;$RrIa1Q594B~SopVZ7u!+^zCJ>h-ZRre!lM^v#~klI)Q^S*we%a|@zIhfbAx-Bdx}TrORW z<0`Hhm|&Rg3u56qZqQA2C>auGm^wSk-ik!!3`{XhpU&M4Dm#Jiy3cuFViLD3+(v@I zIynrLG`hi}i5Vmf++j%dTTctKxXUoa9Y-jYTxNLtFIDYTf|69>Cig_nL<$)LX==|N z(z*}}^H^YrtLX3*{~a|@s+g|oLoQjcL4DhmP3HUmDSL~zMX|~2BG0`xSEN3x)jwcZ z>Y@G=l7Ued&z&j%>5=R-8bu$_Q)Dp9{%+ui4XKA<f-)s>e6uG}vtg>II$wL)v{F*Ea@=%HOtKWA+CJKYP);o4A@K}j0*~-GVp<{O0G{9}y<-%S!x~v8MQMff`vnX2l!X8Q literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..704bf4a3a12fa2dc41349ff873d8383c040af00b GIT binary patch literal 1455 zcmb_cZBG+H5PlY_M~@Q_Ur<3USfnj4ryzH!_sAjSkAAAI2Z;kT);&W{kUYozz{=!N(T%Vq$jra z>$@T-@m*Iij23){yJa3oy*_cqv}}gCp4pR2BzveOD^(G;Z$VV((5XVVo7&Jfmra-B zxQ-hJ#u%o1f>^kTTXa)xN`}NaruL4qcOp?)0}~9BXLEOgica9W?h7867{?t8cadPQ zP7gyRjczb+VhTwE_ZU*W*3-f??lTN<#}P^;ml@vvOI5p-pdeMa%{`GdkwV5mn%c9A zv<}3=Ean*EDmr}0e@6|J%BRcvkP8-UP~UcBlllIC%HH8kk+1Wr$Z@a96{%m;>X#T6 zx~M;cWMI_AGv~^Gb|l-4M$w1#H+pf@C9arz|3f|$7+l;(+ z%iR&K>S(vN_e!XC;O%FN77`58GHSZq4@6t>*nscyP%F2}1MX`f!{vt8);wYu&@G{| z3q(=rm7_$cXCf5(1;bpfcUZp8kXVroo&>{?g9{k2(T|G`EDSUB=ZwKfMTGqA&h{pc zYTjnR8AdD8_ky|?39~*@CQR52vputCixl>7M>LvTceB77bm&~=yiBc{%$4%>B(CAQ zg)xSyo*)ix;3j3NOUaNv!_?hT?nWF`$-)Ff=Cto)qpBatAb9CTHpX$=!5yR-oRh;) zN#hKbZA>C-;Vwh2*Lpgb!aasT&-b}f*+qu+|EcPEC8!9c*SwIIY~)a|kf-)MC$wXT zgBi>+BvpL)ntV?Ulq=`!=8*Fa+&{xEGBE0v=`(3Q-TK{vlJ!2lWd^${cOsv^7N*&T zPbO)8%iHy+A6G*^kV=HjH(a-5!!+v>gFM?f$CX-<+ie19UixQdYI~~E*PO(WD#7X(YC%p8%_N3VrJ(kDq;qP5Z3 zg_%$E`3&b{Y%^kX@eU*0JEUms5XNXPVU+$1mvQCDOF))}Wpd^KSHENY5VxKe4q$&l zX5tXjU2)EczrBwlL5M1bP@{=iM+WtnCEfLO#6mu?fcwNVgfY729>z>XLiS-1kLaHu Pi^q6El1)}7LVA7yo4a2c literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..40bf5ecbd808cc57e8e4f3722127c8117c010a07 GIT binary patch literal 906 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 aziCGqYsKu5H{?z3)vJjo<%p#HMZW?1Td2JN literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..a1471dae44bee2151799f30222103608ddc5809f GIT binary patch literal 2138 zcma)6U2hvj6g}f_JDap|+yt7?4@y$oacxMTg~SbU3W0zFh*Xh?1oFmN>W|x?00&%m< zLw8ySRsunsH!y}tqNX#uaVSg~2qPl13kKqdD4Z+XP3wcsy?x8MYwkBlC|Pb*&Bm_j z*kb$6kXyHp6t0z@nGmv{K8^5oyNj~;?CnLZVvR7dx_ML=B_97R(R10r9A2PUS=!VY zR$B@Qv3L9wj_wPUN`U(=2^9tTelqIdta$9X}GN& z*Rh*5g;Y8-kbLc3jpByFOux$7z0t872bL2K#nKrTK1OC&B3?D{8g8=s zX1i@kGu#+Oc!+_2)M^Z`D+F>^1ZqW~n8Q;D-NXI^;WpW31mH~rSu9e0&2s%jpH{CM zokxVz8Lx$7N4?0AiDq9$q({AGC2F@^vR`^W&i!2<19c}Sc3K^$YHixmnQ1Ajo?j;KK_+E9zM>+PoG$JAoMIV=(B~5#yL(k#4*M(&L_c5W0;}mir$9j@H{O7_{Ymk4i4brsi@grln~KT z2}UWo2ONdWw?3JC_9rAyFfN~CT>2iNV3G5bcBOpR?b*4?Tz$6kh&w|b*9ni)1g6Mg z0h0qf^FGfh%#yhzZGoCz@@Vot-3?ildPH(MnR;;n1TXpPsBN(+&!Z zQjo!P&oH&~B)ZJhtuc9JT*9ZM{u$-;OH=8Urh>HB2?jn!hWoYTX?_8T63KdPmOc?b zj?hyqN1+zfUzDxn2Kn+$=2+@C{|j=TB=b-3vPe9}a`M(O-Vhx!FLHj2wI3L$+ekVQ zOuF#X$)5N5Nt^UN!bM>nB{I={y5VKLM6V!(<+QV~*#X$_5UhAK>>a$-gMHhB-J>mO zhAkUsIc-T5w5g(iJezyzx{+gVk*QCc4HV0(9GbAH*R>so*l=1F>jICiA h1D99JxJk0N{zZoVM~s#s*PZ`iyhl+1yzkee{0|KVZ9V`1 literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionPropertiesView.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/SelectionPropertiesView.class new file mode 100644 index 0000000000000000000000000000000000000000..e7b65bd84a6a1e9ef419b341249adef1bd8cc34d GIT binary patch literal 840 zcmbVK$!-%t5Pjv?nZzE*LK3!w;E-huVp>8%9E`Z2AX%~?k|RgrHXgUeZN}3>Pdf?! z#Dxne9QXh}3Q_HtMUn72W+3G>fYrtAyC zT+rwe$}e?aRxyV~9~I0Kmf9+lug9aFG{;ddm4wx{j-#|28RhJ$vup>dAUtdTSLIDY zO%<(Cu8oZ{u4*S}U+JTDqRqRW%;LdOWNfqXwuTkl@UTkQnhEu>hIN9MNZV1C>)#6+ zv&kK-S;I}-_Hc_(pGoh)KJMTyp~5LzeZm?i7)Ga&NTVzf9cxsUG#9W%*yZVjZm;35 zy@r#$hR5fJePy+Ay;ZS|x`+FO<*O_{cJP3ACf|>vl*hdu{FUfUZ^&1{li@Aq%tP3o z-6v1I+RtR~~-B!l%i1m8JW3vc}TC z1hBrwRvFi^#2y!X$YdqfD~~R)Ot`=X-`D16-22GR68;b^PKY)x!BZj*!!Guiim*Sy GAN&LXXWJG4 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..986504d5ff8e4eb2a33dc665499c3fc8863f330a GIT binary patch literal 989 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 JizvFW`wN69w~qh- literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..d8ac196697e3fc37618ca5b0773867db9e9d3e2e GIT binary patch literal 759 zcma)4O>Yx15Pg$PyUBLjrUA+~O;LnOD&f*zkP1ksfP@sdw94IaOyaQdR`#aN-$J4S zao`8^MrkPzaq2YWvJ=6UAXmp{M%0I-jTF=~VzmCuAJrstwqoEd$toftcLIuRl8 z;$-o9IAE`P5Tj1m%H3FKm6=no#q^_8T1Zux+=^GFAuJaYs`yIW|YF_A3f}6M<;}+pjH3d@K!CgW_Dy6;eJ|(=U ztV4e)&!ott9gE|_89P1s*|6z%6kGX2Nj|Xh)`~X|nE^ndo HHgqyTM!lHp*$0kq9%|ge%x-yvSqv5>~4YhuS~R{ zCdSYHDC3>BPy=e(WIHo=@0@dI&$;vS*Vpd==CK{Z03l;IbRDpqu{UI;$ zo@LWE{Z&G~?@iefA-LgGLXT%907WJ_}AQaLEC;X)8!zJcJvBbbm)xaT61Sux=Q_^HTGKxBVZuc=gkF z^kR`*A*4vcT~crxcSE>CNcEGi;vOamYE}4q!V+B#Gnwpv*mf>5mqNHtnEf}=&Ytf! z4ZrD%%EhKAl6a^hg(((@dACj1^S3Nf7q(9rW9piIq-&OLSG70g8rQ@$j|k(vFr%7w zb-ig?72$@FB}{BOO%`;9ooO55Hv!p zN6}$cF$Y#D>^q(8%k_0JB*%h^CwR(U)*B6BR|qqIBfG-iJp}8PMnM|txr!HHgPogX zj2@dy#GCvCbvVcFnLxhDJN@+aZals%{E8e-d&9W{J@L(IxdmUPQDEXQMg zc7=c7R8(xrhK$zrL(#b-xYg7h+ZOJIrF)+6*bhv{R}#fyvX6N-z)uKajz@U5$ZHu< za{15vcMA1mJ7-kJ+HVMh6hVyFD({ieYl!nmxQ>x7$_E77EQQ=BC}$XJ;Z`yK1IaIV zK-iVRZ%Dt3XHJouZegZ{$1OZN!(xvs&Iq6=qNE~0!|a%mHfOSf+vSX63d>kw)&%$B dDqeDh0leaB2C#;89)tX516w>(I7`;czu&;^dj$Xh literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..b1cfb91ecace92b25af56689414181349c06c07f GIT binary patch literal 976 zcma)5ZBG+H5PqgD9K9Y=LF&7pR&0x5jfTXe#>5m%h($k0`hB}y+bzc(xxE(tmWgli zgFnC@Wt_d%h=NHk+04$|%rno-J@@11x9>=> zbF4Tx-RXAtR^9ecAe4u4EJY}zzIfXmYL$AJCv3$@UuYGYW2?pRy;M4@)`=B+JMpL+ z>Q-pfVcXbLM>-+QrvqcFkGXq$w)Rb~d2S+;z94MQTvYE63az-Oiy$lp@UY+`kEH-b zlnMEoOIT`~NWU2!b#-zenJQtq9V;1jWMZ5@4Hg__LSsh4)orF+>irp>AZqRZ@9E5% zcE>tOoAr*5Yq;UzI$>kBB?Y*NTZ9Fvl(x3|l<<1?Rb9YMs?@}hc$t}|k2_fRutr!r zKgM6F0q$n&O-2!6PP=gkk1l91(VG?Lh9~&%;!&dXE8{-M;%^mhIr;G?+l^EhTNCy7 zbvlT90cx({>L88}&tOf66N0^nRo4oowc28xwUFmC2P&7HB=~2@@hQURXo+vn*mn`X zvH1x>;|nf*$Z{^bSoVgiX$8yd2VCQ#E4adzIiNB{X|Z)ErN&1DUvc#_ZvO*AtMI9k k!Bi%xQy4D7J=|x2JgN+l!vk!vEwCaUqRux*)ivhl7nfW69RL6T literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$NameSorter.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/TxDbView$NameSorter.class new file mode 100644 index 0000000000000000000000000000000000000000..866675eeb033683d61f369089189afd3472ca9b1 GIT binary patch literal 562 zcma)3OHaZ;5dIdBN-cu;zIh-9C2@V-G+rm}?#Ciw)FL|7I$;u+7?KpTG|G FfG_28li&aV literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..c9c3e032ad25ec9fc08c52dfb81bda0617e06247 GIT binary patch literal 1424 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 Hp8)>>HOYAe literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..496046e6526696e612870cb4d50bf668b1ae9dc3 GIT binary patch literal 7037 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 T5XV-It2rlQ8^?7V!@z$5Md__+ literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.class new file mode 100644 index 0000000000000000000000000000000000000000..0664a08977bfac394633681973d9f840ee99fa3f GIT binary patch literal 1673 zcmb7ETTc@~7(LULZf~>*Qi`HnMCc9HD~d&fDH=%%l7M~C_^@rqcI&d+Y`1_v#TQ?B z@j(+W!3Tm*CjKU4{APDs2`v&Ic4y|B?>pzr`DXX$?{9|yZs5KI55t49u`R1seOI>j zc2vI0O}T0+jhZYLO}SwjJ8Ff3TYD>|EtB)Sp<7(HHr%)bAHzUh*->Oo(W~;)Qk|DA z34Vro!>r1@tf`GAm+P;TGPg0g*_2m%ATb0gilvm4CTEx`bjxb*it3e8j={gA>ZBnqqGGCI?FM~TO>HtP_n`bA zCrFS~QJW1z=#Qv+qh;l5WC^b@tR@Smn^Ck~&lOIZ*dvlEN{BN|oMlcB42cLN1jr?) ztHRSWHBb)>t+Fb#3$wZu(Z0@i-TiQtTaPrpO}ByUn@x77r(Sf&!WhP61XH-e&`${Y znyOXSsdI!em`phZElbtpg4(olVO+(mgc*jYt){aRK@usl+%g`Trt*eiIN6J?-3nJI zgHUaAnp~GK$1wA6GoPs36!OBzVv-~`6e?_=o7S6_QhvRrG~CM+B=`+Gg^+t$((MQx zf;%>nx|-5#s}o1+&Q3iKQFHG^kij_Je4|un80z7(ghhtXrqMFX{IM!7|JW&?@Vqb< zlZ5J}r;i?wxHhIWcG z_L^cR3!}#h=}+Po4&gkN3)W{u#>2+nCOOdBhAjQ(3Fmiwih67A9e4x;dN6xJ)2>ZS$fug6bub6{mV(qQj8rFeJ!%!Env4VsV;Yr{A|j zwct{DY|!I!r;mYoI$$2$bmiW{Z5Kl$u|mdZI`ah!YuO)=y!+_S9=?O*+lSBl-ewlf rb}Ua()6+Kmgj3joA9dmV)RMbcBw(RB4DT;QCEN=v3!`!r@?hx?>;P)c literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..58c2aa10d88d432c67ca88a33e8940d5a7305725 GIT binary patch literal 2180 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..fbc0284a91b5495f5466ec0d9c2d4271047d986d GIT binary patch literal 2548 zcmbVNTXz#x6#h;Vnlv5SQn{#9t_6}-7_6W`xQAOX6f~s@UQZ^6cIsp%&P>|!>a&aY z^2Fl72bZo@RLaf8k_TV>NiLVm?_?%vORFgD%FH=?W`FzJdw*xo?|(gh3Sb0w3LOGR zEU#wT;na*7&Q9BEM)~H1FYA-0-UMc#tkCw{z&sU(zFldA>Wc5xl^@<597!Q5&^INg zrRhj_!n|CW;@c^73hed#2~$~)T@REwbwgUJiKqO)ERM;Fqe`-(970XoRpkqGhLd(M zxSw=NFUu!Sl%uw5hsOnuWnUg9H!hGYcvaN}fwcxwNN12huYoS~2_&-mh2E0ws?kQR zqWoq$0{tb=lFqpFZJl0hOzN}*j=nUT!4am_R;#V7*q{j&7Cfg>bH~&y!B- z_1RSsh8S+8TB|aY6-n6_$Ncu8=|&E38rZ9WQ=~j9Yf9Tp1N&RHv72?3#t0){9W58n zkDfh~!A=}7a1ifM+v=-^bSS0`tCT!~n15+UCY}YUd4H zK#?4n?znUsY~AuYM&lx%!F#xrLWw$Gj9c>D2?L|JEYMY#exS7BAEI5<2=5#C0A;Ep z^e(8`R^v8gFRs!#&Ht)_aeT^=T!tLN{?GNcseJGn&+#U&X-m3TlM^f(kNaX};;K>8OGiL36Gmg(wm4z6 z8-X)rui;zjob3=~V_S=@0lrUz@=%|3EyoLZPA{o&(yOMxY8+ar>;LvuFmMBGRFCB= z8L9&1=X+YUH2)DK+f)6BJJdTLmUhRz+1!7K*o49_2}; z!YevuJ>!g`%Nbd4WDuwT+c?7${H=lL>(is0U%nK7UC7Yd&D9}v@E^zw4c~_`^Z-5g zxa+_=ZEHT!-gnT?y+I#seFf`zryQ{{Mmfm6MiGn7oz0i;HXS#{K#`+%-GoEQ+Jn&&zn<8BT+p5Vl_{! zAL7aa#uo6=eA_xN=E*40Z0iy9aD9(e|B?0jiM{xlmAsGbbkE`er}RS{z#|;SW1Pnm zSoj5B<0-zuvt|v3qU_q8xYh2&EnLHOc47c^e2h;R?^8zVMQ7ii*px!9d*7Bns6Bzt q@Oj**cH5f-Bi%)9|LuiskAfxe1%q@zqQZNUbQLDK(hAoS;NRchQhDzH literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$3.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/AttributeProperty$3.class new file mode 100644 index 0000000000000000000000000000000000000000..0b0b8c21ca998cfa186ff061693cec2f76670e91 GIT binary patch literal 1684 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..73f6c4acdbea74ef36e28472603c6a614d5ca761 GIT binary patch literal 3702 zcmbVOTXPge6#hE9$t0TzgoFeZj6_Ar1sFw*xQi%8(A5NyU?SjccDC7_u$ftAW^=*2 z;N3T$VwI`#$rm5AN}^~Lg)cn#5Bx8d@$1>iW>Q%&1(%tf?moBgeCM40>)+pR062uN zH8cqvw%i%R4yNafV1Cw?bJ8=4o>?gw>ccmDX$7|H_{M2jHUn8W<+&B<1q*v0(U27A zoHl1oqii}wZc<43#KeJGg*_iBv z4DKjLH%-Sk!`QP&`By-zm>!+>*Sq6dD57Gvt8)yWnc6)S}XD+-Z8fuZvad~3{E1=X;Q{R+`$ zt1L}V!7`kJ0ahS6FtU;To1uWt2Jomrt7%!%56N`#?upPKnwk$PCROtFS~_7`W<$1}?i-??7B-E?TGF<9J@f39@xf@9M6O z7m%ZJhq17TRyD*~q~RrjeH&q_M-|6ckz-uPNxV!~$zb+~fm)n#l^a(g&*O)b->>L6 zjS2R?lIbhB!}!lBPL8vM)W(It{r_Ja1j;QJa;m6Q)rLUCjd957uXTRIf15tnYyFuIGj|_yS~M6jzn!Hv)+!WLeH|M3Nd-1bKIZgBqBEHrhB94pf1M8d=zAKyiCc$2_W} zA;oKs9=IKhW_ZJ|aSad(8991%=6A14mcK zKx9H$m}BZ{_kd_oAT{AuJxiXj)j--F=3wobbWrh;ygcq$W!JZz;fCb3ye9tz*v1_)SY2A*=@4xs;z2A7qv?5VrEO<2+Vw577S90 zuhk3NL`f>di!!U`ww`kw>5Z06-rgznYNZle4$}-O<^p=6rYx zob%hb)5WhzN;dJ`KQw#|-9x{kXXp>?Jo_tlUBhnv?BmZp*U(!|q_v*rLzyIZyMM#MbaEMwWm?m%w=k7%y^f5)62=oFZR+D0&W-jT@Ibo# zI-V1_i5D}ebm|tml1Xw#3Jn#y33o9V=0xahkbc z#1R_m*Q>-@A+&@kBBwB4B6_b8oBh;t4(Dk-!@JHd@+FA53O6PZ@=B z?Ucn+1+J9QvO>st850_$h6MjX@b>_)!pnjl-_TGDw=}SqX&e;Tvw~fXg_~B;f@EBp z)&!&8!KdQRaQMx&HFC6sAzq3RLevQ{jf;_>#qbjp?j9OmMtOYyEu{9}SVD91$Hb3Z zPJ~%Vg&0-o!)&Ooza~;gv>O$o$DV->T!P2b3Jq4kKiHW+L}@Glow>|31ZMd?$G~{hXp8*OV{epZ@?~TfI#H literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$2.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$2.class new file mode 100644 index 0000000000000000000000000000000000000000..23becc226c3105b94f9593b7f5b41e7206cd2c28 GIT binary patch literal 1947 zcmbVN&u<$=6#m9`vx#F8Q$os*00Ba4XKA+tQc7KDB?}}=E>tAyf!lcZ)tRu~v34du zdghKeaG-FYATCH8!hs?Qn69J{Gnh%N7rnR(y5@0;&E|NYPJe*jp+bq^(h z%b^|w%5Lukc7IpV9;HD)mBX#Ty_mpIXq8S(@G-^GQgk!bLrU$Pl{F6)f%>-Gl|d|% ze(+Imo7Z}n5;(8Zen4TYhK7Re+cKmKjZzbIHf1lSuIy3FP`fIkRA9<(DYJ5slj)u; zn-*hSRf)3i3A7p~1!>+AsI+xNGZ1*91`pF!lrdk!4C(^qhFdV-RSA8#Gw4y8Q4u)Z z)uD`U$y7ON#bCuz61Z~0TvpbY(p*Xdy-QtXEG15-^+xv*%1(%S7}Rn(PsbyOwf~R6 zoRv8Q&kkSUT%-Ho$+yNvHf*YreyjP3fJZS6D6vkbVzs4 z>X>Wk_N4n=u6rtCmL_QH0h>fwYE97DQAHOkOs2>Le9S$H0v3sHhuv&ri^$$|bX~dB zItiCsJC??f!7?|4GXG9N)a$M%aP#!|H-jpV&hpb`l=ur&SN&g5Tm2PtKl57&Pr9*e z#zlXQ)BIlJ7&rP97WgjkG!_e#b$)j!;wX43Tl_^9xL5$?fiCn6p5d#&vv`iLE|Kee zFFTm>PZ^j?AjkMJ!&uH|i_P73&tr*W+|vtqk*@+TpCG^!86ER}4{CFnc zJch~3c%|6;GtR{^@t3~Fy#E(oy^Cr8K3+Rms@%gF9%$Z0-TxEK-{1?}M{pnxczHR~ ze38`#zGX@7F`4g};`dx{Ka5G>k0kI%68QX=_$F`r7ROdlsylJlaj8gXByF}&ezv)^ kKaSy+M!4hB=D20N&B!Ho%RAW)S8x^A_{q7*$;_XB0TeLT?f?J) literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$3.class b/com.itjw.txviewer.graph/bin/com/itjw/txviewer/graph/views/sections/RelatedProperty$3.class new file mode 100644 index 0000000000000000000000000000000000000000..c340266b02ae49364d6bb1d8ce090520aee99716 GIT binary patch literal 1113 zcmbVL+invv5Is&p(}blBrIh}v2y91YB()z-rT=iGX-ZbcR*eTT z3!HQmd2LcB-&3MI_4lk9ll33#TV<34YD0CTWTMhoz6*zZwu}XVbz@^mQKH9=xH6S+bOUN#MntTX6lXtRhMq@_s)H=azqGt^<{@W0mob)OTsV~_GJpF5w{Q;5R?N%7EN~fXGnAbfN~QS)!RB{dISq2mPk+uq)^gCw3?!p+3%41jh&v2gV9NJ+ QF0se%<6-`s$e-oqA4TChQ~&?~ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..e71a4c53831fe796693e90cec661e33f9fd8de9d GIT binary patch literal 8262 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 literal 0 HcmV?d00001 diff --git a/com.itjw.txviewer.graph/build.properties b/com.itjw.txviewer.graph/build.properties new file mode 100644 index 0000000..c4166fb --- /dev/null +++ b/com.itjw.txviewer.graph/build.properties @@ -0,0 +1,8 @@ +source.. = src/ +output.. = bin/ +bin.includes = plugin.xml,\ + META-INF/,\ + .,\ + icons/,\ + contexts.xml,\ + res/ diff --git a/com.itjw.txviewer.graph/contexts.xml b/com.itjw.txviewer.graph/contexts.xml new file mode 100644 index 0000000..64aff45 --- /dev/null +++ b/com.itjw.txviewer.graph/contexts.xml @@ -0,0 +1,12 @@ + + + This is the context help for the sample view with a tree viewer. It was generated by a PDE template. + + + + + + + + + diff --git a/com.itjw.txviewer.graph/icons/sample.gif b/com.itjw.txviewer.graph/icons/sample.gif new file mode 100644 index 0000000000000000000000000000000000000000..34fb3c9d8cb7d489681b7f7aee4bdcd7eaf53610 GIT binary patch literal 983 zcmZ?wbhEHb6krfw_|CxKYUg-n!?izO{@9*?jxd%4aX0yzy`dymabz zw#(eg=y~&N&n)dZv2xzduG}5lraiApo3(c4*{Ylg5#|$JO_EEZ<^|a2`Z*=9ns7DV zy=TR&gYw*7f%auV?ip3tvjRPmcdoho{K?x$_vR?C#t5&<;~V}S*>OMCr>h}%%bLZ9 zmo3`hYEwTICo-TTCZwgTsC&VjZRgJ1eE#fBa^%9R zmmfWS@;bnyJ27HWY}kxYzv(Hl>yu;FCPlAEh+34Muq-8Rb6C)<8qA3{r2e5 z`$vyngh#H=FWlqqvnapfc5%(!sQ4v?r7J61-&eJNEN^;KTK}T7{#i-gJh%G*9vcYdwv_*~xdw!Gz4Va?T!sXyyF@8?w<>X`X=#j%uHV4GRvj@+tE@ zQ%F!a)GKcn^~8abN>4la1UNXVL;{ZWi)lEwyeatDu%Lr6;aASiLrXXW zQm# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/com.itjw.txviewer.graph/res/images/database.png b/com.itjw.txviewer.graph/res/images/database.png new file mode 100755 index 0000000000000000000000000000000000000000..3d09261a26eb97c6dedc1d3504cbc2cf915eb642 GIT binary patch literal 390 zcmV;10eSw3P);1k*-!zk~CMF9Bv_3(^PCOq;x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE;FMW7!p}f{NG3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zWF_A89qTKGV%LqLqA&{k|D2>yV7qLmg~*x1@cbjz3zP!z2FhV16<-TNNz zuIz$fLNt0{xWmll%$dUkM1*+|PHJ2ZGvdmC35A3UoF6R(-~DS$BH+@Xy#VYsLyQ>z zxq>v8$ny|FSR~0W2u4ic`k5mcbEIiLksz4Y#KyE{9LLn}_oq&%6$}Oga?Zh83$3-^ zU4V1$eaMkz85m>bTh*c{3ch%tltQ=L4Q7$u>-Ff*JP6K)r(~Ul_41v6uR1rSij#*! zl14&E?hS3Iagod#Oo#p}d7WbijUO{Mqc5?@<$>unxw*22 z?bQuGkPsSMOgEm)qR1=cLLyZOm>T65_V?)|o0p=i_uUiST44Cz-W mqJp!8r`H!$*8T4x&4Leh&Epbde3h>N0000 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 new file mode 100644 index 0000000..6680bcb --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TransactionSelection.java @@ -0,0 +1,67 @@ +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/TxEditorPart.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPart.java new file mode 100644 index 0000000..56f90a9 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPart.java @@ -0,0 +1,207 @@ +package com.itjw.txviewer.graph; + +import java.util.LinkedList; + +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.viewers.ISelection; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.IFileEditorInput; +import org.eclipse.ui.PartInitException; +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 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; + +public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPageContributor { + + public static final String ID = "com.itjw.txviewer.graph.TxEditorPart"; //$NON-NLS-1$ + + private TxDisplay txDisplay; + + /** This is the root of the editor's model. */ + private ITrDb database; + + private LinkedList streamList; + + private SelectionSynchronizer synchronizer; + + private ActionRegistry actionRegistry; + + public TxEditorPart() { + streamList = new LinkedList(); + + } + + /** + * Create contents of the editor part. + * @param parent + */ + @Override + public void createPartControl(Composite parent) { + /** Add handlers for global actions (delete, etc) */ + IActionBars actionBars = getEditorSite().getActionBars(); + actionBars.setGlobalActionHandler(AddToWave.ID, new Action() { + @Override + public void runWithEvent(Event event) { + System.out.println("AddToWave with event"); + } + + @Override + public void run() { + System.out.println("AddToWave"); + } + }); + + txDisplay = new TxDisplay(parent, this, getSite()); + TxEditorPlugin.getDefault().editorOpened(this); + getSite().setSelectionProvider(txDisplay); + } + + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput) + */ + 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(); + } + } + + private void handleLoadException(Exception e) { + System.err.println("** Load failed. Using default model. **"); + e.printStackTrace(); + database = null; + } + + + @Override + public void setFocus() { + // Set the focus + } + + @Override + public void doSave(IProgressMonitor monitor) { + // Do the Save operation + } + + @Override + public void doSaveAs() { + // Do the Save As operation + } + + @SuppressWarnings("rawtypes") + @Override + public Object getAdapter(Class type) { + if (type == IContentOutlinePage.class) // outline page + return new TxOutlinePage(this); + else if (type == IPropertySheetPage.class) // use tabbed property sheet instead of standard one + return new TabbedPropertySheetPage(this); + 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 { + // Initialize the editor part + setSite(site); + setInput(input); + } + + @Override + public boolean isDirty() { + return false; + } + + @Override + public boolean isSaveAsAllowed() { + 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(); + } + + public void addStreamsToList(ITrStream[] streams){ + for(ITrStream stream: streams) addStreamToList(stream); + txDisplay.streamListChanged(); + } + + public void removeStreamFromList(ITrStream stream){ + txDisplay.streamListChanged(); + } + + public void removeStreamsFromList(ITrStream[] streams){ + txDisplay.streamListChanged(); + } + + public void setSelection(ISelection selection){ + txDisplay.setSelection(selection); + } + + @Override + public String getContributorId() { + return getSite().getId(); + } + +} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPlugin.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPlugin.java new file mode 100644 index 0000000..2c7b22f --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxEditorPlugin.java @@ -0,0 +1,129 @@ +package com.itjw.txviewer.graph; + +import java.io.File; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +import org.eclipse.draw2d.ColorConstants; +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.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class TxEditorPlugin extends AbstractUIPlugin { + + public static final int lineColor=0; + public static final int txBgColor=1; + public static final int highliteLineColor=2; + public static final int txHighliteBgColor=3; + public static final int trackBgLightColor=4; + public static final int trackBgDarkColor=5; + public static final int headerBgColor=6; + public static final int headerFgColor=7; + + // The plug-in ID + public static final String PLUGIN_ID = "com.itjw.txviewer.graph"; //$NON-NLS-1$ + + // The shared instance + private static TxEditorPlugin plugin; + + private ResourceBundle resourceBundle; + + private TxEditorPart openedTxEditorPart; + + /** + * The constructor + */ + public TxEditorPlugin() { + openedTxEditorPart=null; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + try { + resourceBundle = ResourceBundle.getBundle(plugin.getClass().getName()); + } catch (MissingResourceException x) { + resourceBundle = null; + } + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static TxEditorPlugin getDefault() { + return plugin; + } + + /** + * Returns an image descriptor for the image file at the given + * plug-in relative path + * + * @param path the path + * @return the image descriptor + */ + public static ImageDescriptor getImageDescriptor(String path) { + String fullpath = File.separator+"res"+File.separator+"images"+File.separator+path; + return imageDescriptorFromPlugin(PLUGIN_ID, fullpath); + } + + public static Image createImage(String name) { + ImageDescriptor id=getImageDescriptor(name+".png"); + return id.createImage(); + } + + public Color getColor(int idx){ + switch (idx) { + case lineColor: + return ColorConstants.red; + case txBgColor: + return ColorConstants.green; + case highliteLineColor: + return ColorConstants.cyan; + case txHighliteBgColor: + return ColorConstants.darkGreen; + case trackBgLightColor: + return new Color(null, 220, 220, 220); + case trackBgDarkColor: + return new Color(null, 200, 200, 200); + case headerBgColor: + return new Color(null, 255, 255, 255); + case headerFgColor: + return new Color(null, 55, 55, 55); + default: + break; + } + return ColorConstants.black; + } + + public ResourceBundle getResourceBundle() { + return resourceBundle; + } + + public void editorOpened(TxEditorPart txEditorPart) { + openedTxEditorPart=txEditorPart; + } + + public TxEditorPart getOpenEditorPart(){ + return openedTxEditorPart; + } +} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxOutlinePage.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxOutlinePage.java new file mode 100644 index 0000000..df006cf --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/TxOutlinePage.java @@ -0,0 +1,154 @@ +package com.itjw.txviewer.graph; + +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.ISelection; +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.jface.viewers.TreeViewer; +import org.eclipse.swt.widgets.Composite; +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.IWorkbenchPart; +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.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; + +/** + * Creates an outline pagebook for this editor. + */ +public class TxOutlinePage extends ContentOutlinePage implements ISelectionListener, ISelectionProvider { + + private TxEditorPart editor; + + public TxOutlinePage(TxEditorPart editor) { + this.editor = editor; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite + * ) + */ + public void createControl(Composite parent) { + super.createControl(parent); + TreeViewer contentOutlineViewer = getTreeViewer(); + contentOutlineViewer.addSelectionChangedListener(this); + // Set up the tree viewer + contentOutlineViewer.setContentProvider(new TxDbTreeContentProvider()); + contentOutlineViewer.setLabelProvider(new TxDbTreeLabelProvider()); + contentOutlineViewer.setInput(editor.getDatabase()); + // initialize context menu depending on the the selectec item + MenuManager menuMgr = new MenuManager(); + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + fillContextMenu(manager); + } + }); + Menu menu = menuMgr.createContextMenu(contentOutlineViewer.getControl()); + contentOutlineViewer.getTree().setMenu(menu); + getSite().registerContextMenu("com.itjw.txviewer.graph.outline.contextmenu", menuMgr, contentOutlineViewer); + // add me as selection listener + getSite().getPage().addSelectionListener((ISelectionListener) this); + //getSite().getPage().addSelectionListener("SampleViewId",(ISelectionListener)this); + getSite().setSelectionProvider(this); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.part.IPage#dispose() + */ + public void dispose() { + // dispose + super.dispose(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.part.IPage#getControl() + */ + public Control getControl() { + return getTreeViewer().getControl(); + } + + /** + * @see org.eclipse.ui.part.IPageBookViewPage#init(org.eclipse.ui.part.IPageSite) + */ + 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)); + } + + + //ISelectionListener methods + @Override + public void selectionChanged(IWorkbenchPart part, ISelection selection) { + if(!(part instanceof ContentOutline) && selection instanceof TrHierNodeSelection){ + System.out.println("Something selected"); + } + } + + /** + * Returns the current selection for this provider. + * + * @return the current selection + */ + public ISelection getSelection() { + if (getTreeViewer() == null) { + return StructuredSelection.EMPTY; + } + return getTreeViewer().getSelection(); + } + + public void setSelection(ISelection selection){ + if (getTreeViewer() != null) { + getTreeViewer().setSelection(selection); + } + } + /** + * @see org.eclipse.jface.viewers.ISelectionProvider#selectionChanged(SelectionChangedEvent) + */ + public void selectionChanged(SelectionChangedEvent anEvent) { + // translate the tree selection + ISelection selection = anEvent.getSelection(); + if (!selection.isEmpty()) { + Object tmp = ((IStructuredSelection) selection).getFirstElement(); + if (tmp instanceof ITrHierNodeFacade) { + fireSelectionChanged(new TrHierNodeSelection((ITrHierNodeFacade) tmp)); + } + } + } + +} 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 new file mode 100644 index 0000000..3a8e89f --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/AddToWave.java @@ -0,0 +1,15 @@ +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 new file mode 100644 index 0000000..c11047b --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/actions/TxActionFactory.java @@ -0,0 +1,103 @@ +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 new file mode 100644 index 0000000..757e333 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrDbFacade.java @@ -0,0 +1,86 @@ +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 new file mode 100644 index 0000000..83a994a --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrHierNodeFacade.java @@ -0,0 +1,150 @@ +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 new file mode 100644 index 0000000..678bf81 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITrStreamFacade.java @@ -0,0 +1,102 @@ +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 new file mode 100644 index 0000000..89d9913 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionFacade.java @@ -0,0 +1,70 @@ +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/data/ITransactionProperties.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionProperties.java new file mode 100644 index 0000000..6a38495 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/data/ITransactionProperties.java @@ -0,0 +1,107 @@ +package com.itjw.txviewer.graph.data; + +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 { + + private ITransaction iTransaction; + + public final static String PROPERTY_ID = "ID"; + public final static String PROPERTY_BEGINTIME = "BEGINTIME"; + public final static String PROPERTY_ENDTIME = "ENDTIME"; + + protected IPropertyDescriptor[] propertyDescriptors; + + public ITransactionProperties(ITransaction iTransaction) { + this.iTransaction=iTransaction; + } + + @Override + public Object getEditableValue() { + return null; + } + + @Override + public IPropertyDescriptor[] getPropertyDescriptors() { + if (propertyDescriptors == null) { + ArrayList idDescriptor=new ArrayList(); + // Create a descriptor and set a category + PropertyDescriptor nameDescriptor = new PropertyDescriptor(PROPERTY_ID, "Id"); + nameDescriptor.setCategory("Attributes"); + idDescriptor.add(nameDescriptor); + PropertyDescriptor begTimeDescriptor = new PropertyDescriptor(PROPERTY_BEGINTIME, "Begin time"); + begTimeDescriptor.setCategory("Attributes"); + idDescriptor.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()]); + } + return propertyDescriptors; + } + + @Override + public Object getPropertyValue(Object id) { + if (id.equals(PROPERTY_ID)) { + return iTransaction.getId(); + } else if(id.equals(PROPERTY_BEGINTIME)){ + 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(); + } + } + } + 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/ui/swt/ListPane.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ListPane.java new file mode 100644 index 0000000..6c7d00e --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ListPane.java @@ -0,0 +1,162 @@ +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 new file mode 100644 index 0000000..271d355 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/NameListPane.java @@ -0,0 +1,23 @@ +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 new file mode 100644 index 0000000..2780f4b --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/SWTImageCanvas.java @@ -0,0 +1,376 @@ +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 new file mode 100644 index 0000000..920f51a --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/TxDisplay.java @@ -0,0 +1,170 @@ +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 new file mode 100644 index 0000000..3d2b279 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/ValueListPane.java @@ -0,0 +1,30 @@ +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 new file mode 100644 index 0000000..fb110f0 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/ui/swt/WaveImageCanvas.java @@ -0,0 +1,213 @@ +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/SelectionPropertiesView.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionPropertiesView.java new file mode 100644 index 0000000..3979847 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionPropertiesView.java @@ -0,0 +1,11 @@ +package com.itjw.txviewer.graph.views; + +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.views.properties.PropertySheet; + +public class SelectionPropertiesView extends PropertySheet { + @Override + protected boolean isImportant(IWorkbenchPart part) { + return part.getSite().getId().equals("com.itjw.txviewer.graph.TxEditorPart"); + } +} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionTableView.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionTableView.java new file mode 100644 index 0000000..759c44d --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/SelectionTableView.java @@ -0,0 +1,99 @@ +package com.itjw.txviewer.graph.views; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IMarkSelection; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.text.TextViewer; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.model.WorkbenchLabelProvider; +import org.eclipse.ui.part.PageBook; +import org.eclipse.ui.part.ViewPart; + +/** + * This view simply mirrors the current selection in the workbench window. + * It works for both, element and text selection. + */ +public class SelectionTableView extends ViewPart { + + private PageBook pagebook; + private TableViewer tableviewer; + private TextViewer textviewer; + + // the listener we register with the selection service + private ISelectionListener listener = new ISelectionListener() { + public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection) { + // we ignore our own selections + if (sourcepart != SelectionTableView.this) { + showSelection(sourcepart, selection); + } + } + }; + + /** + * Shows the given selection in this view. + */ + public void showSelection(IWorkbenchPart sourcepart, ISelection selection) { + setContentDescription(sourcepart.getTitle() + " (" + selection.getClass().getName() + ")"); + if (selection instanceof IStructuredSelection) { + IStructuredSelection ss = (IStructuredSelection) selection; + showItems(ss.toArray()); + } + if (selection instanceof ITextSelection) { + ITextSelection ts = (ITextSelection) selection; + showText(ts.getText()); + } + if (selection instanceof IMarkSelection) { + IMarkSelection ms = (IMarkSelection) selection; + try { + showText(ms.getDocument().get(ms.getOffset(), ms.getLength())); + } catch (BadLocationException ble) { } + } + } + + private void showItems(Object[] items) { + tableviewer.setInput(items); + pagebook.showPage(tableviewer.getControl()); + } + + private void showText(String text) { + textviewer.setDocument(new Document(text)); + pagebook.showPage(textviewer.getControl()); + } + + public void createPartControl(Composite parent) { + // the PageBook allows simple switching between two viewers + pagebook = new PageBook(parent, SWT.NONE); + + tableviewer = new TableViewer(pagebook, SWT.NONE); + tableviewer.setLabelProvider(new WorkbenchLabelProvider()); + tableviewer.setContentProvider(new ArrayContentProvider()); + + // we're cooperative and also provide our selection + // at least for the tableviewer + getSite().setSelectionProvider(tableviewer); + + textviewer = new TextViewer(pagebook, SWT.H_SCROLL | SWT.V_SCROLL); + textviewer.setEditable(false); + + getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(listener); + } + + public void setFocus() { + pagebook.setFocus(); + } + + public void dispose() { + // important: We need do unregister our listener when the view is disposed + getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(listener); + super.dispose(); + } + +} 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 new file mode 100644 index 0000000..6ef6ed5 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/TxDbView.java @@ -0,0 +1,294 @@ +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/src/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.java new file mode 100644 index 0000000..a6ca6c6 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeContentProvider.java @@ -0,0 +1,45 @@ +package com.itjw.txviewer.graph.views.provider; + +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.Viewer; + +import com.itjw.txviewer.database.ITrDb; +import com.itjw.txviewer.database.ITrHierNode; + +public class TxDbTreeContentProvider implements ITreeContentProvider { + + private ITrDb database; + + @Override + public void dispose() { } + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + database=(ITrDb)newInput; + } + + @Override + public Object[] getElements(Object inputElement) { + return database.getChildNodes().toArray(); + } + + @Override + public Object[] getChildren(Object parentElement) { + if(parentElement instanceof ITrHierNode){ + return ((ITrHierNode)parentElement).getChildNodes().toArray(); + } + return null; + } + + @Override + public Object getParent(Object element) { + return null; + } + + @Override + public boolean hasChildren(Object element) { + Object[] obj = getChildren(element); + return obj == null ? false : obj.length > 0; + } + +} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.java new file mode 100644 index 0000000..23e6783 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/provider/TxDbTreeLabelProvider.java @@ -0,0 +1,72 @@ +package com.itjw.txviewer.graph.views.provider; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ILabelProviderListener; +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; + +public class TxDbTreeLabelProvider implements ILabelProvider { + + private List listeners = new ArrayList(); + + private Image database; + private Image stream; + private Image folder; + + + public TxDbTreeLabelProvider() { + super(); + database=TxEditorPlugin.createImage("database"); + stream=TxEditorPlugin.createImage("stream"); + folder=TxEditorPlugin.createImage("folder"); + } + + @Override + public void addListener(ILabelProviderListener listener) { + listeners.add(listener); + } + + @Override + public void dispose() { + if(database!=null) database.dispose(); + if(stream!=null) stream.dispose(); + if(folder!=null) folder.dispose(); + } + + @Override + public boolean isLabelProperty(Object element, String property) { + return false; + } + + @Override + public void removeListener(ILabelProviderListener listener) { + listeners.remove(listener); + } + + @Override + public Image getImage(Object element) { + if(element instanceof ITrDb){ + return database; + }else if(element instanceof ITrStream){ + return stream; + }else if(element instanceof ITrHierNode){ + return folder; + } else + return null; + } + + @Override + public String getText(Object element) { + return ((ITrHierNode)element).getName(); + } + +} + + diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/AttributeProperty.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/AttributeProperty.java new file mode 100644 index 0000000..a09c282 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/AttributeProperty.java @@ -0,0 +1,252 @@ +package com.itjw.txviewer.graph.views.sections; + +import java.util.HashMap; +import java.util.List; +import java.util.TreeMap; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.ListenerList; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.ILabelProviderListener; +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.ITableLabelProvider; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.GridData; +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.IWorkbenchPart; +import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection; +import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; + +import com.itjw.txviewer.database.ITrAttribute; +import com.itjw.txviewer.graph.data.ITransactionFacade; + +public class AttributeProperty extends AbstractPropertySection implements ISelectionProvider { + + private final String[] titles = { "Location", "Name", "Type", "Value" }; + + private ListenerList listeners = new ListenerList(); + + private ITransactionFacade iTr; + + private ISelection currentSelection; + + private TreeViewer treeViewer; + + public AttributeProperty() { + } + + public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) { + super.createControls(parent, aTabbedPropertySheetPage); + Composite composite = getWidgetFactory().createFlatFormComposite(parent); + Tree tree = new Tree(composite, SWT.BORDER | SWT.FULL_SELECTION); + tree.setHeaderVisible(true); + treeViewer = new TreeViewer(tree); + + TreeColumn column1 = new TreeColumn(tree, SWT.LEFT); + tree.setLinesVisible(true); + column1.setAlignment(SWT.LEFT); + column1.setText(titles[0]); + column1.setWidth(75); + TreeColumn column2 = new TreeColumn(tree, SWT.RIGHT); + column2.setAlignment(SWT.LEFT); + column2.setText(titles[1]); + column2.setWidth(150); + TreeColumn column3 = new TreeColumn(tree, SWT.LEFT); + tree.setLinesVisible(true); + column3.setAlignment(SWT.LEFT); + column3.setText(titles[2]); + column3.setWidth(100); + TreeColumn column4 = new TreeColumn(tree, SWT.RIGHT); + column4.setAlignment(SWT.LEFT); + column4.setText(titles[3]); + column4.setWidth(150); + + Object layoutData = parent.getLayoutData(); + if (layoutData instanceof GridData) { + GridData gridData = (GridData) layoutData; + gridData.grabExcessVerticalSpace = true; + gridData.verticalAlignment = SWT.FILL; + } + + FormData formData = new FormData(); + formData.left = new FormAttachment(0); + formData.top = new FormAttachment(0); + formData.right = new FormAttachment(100); + formData.bottom = new FormAttachment(100); + tree.setLayoutData(formData); + + treeViewer.setAutoExpandLevel(2); + treeViewer.setContentProvider(new ITreeContentProvider() { + TreeMap> hier = new TreeMap>(); + HashMap parents = new HashMap(); + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + if (newInput instanceof String) { + 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); + } + 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); + } + } + } + + @Override + public void dispose() { } + + @Override + public boolean hasChildren(Object element) { + Object[] childs = getChildren(element); + return childs != null && childs.length > 0; + } + + @Override + public Object getParent(Object element) { + if (element instanceof ITrAttribute) + return parents.get(element); + else + return null; + } + + @Override + public Object[] getElements(Object inputElement) { + return hier.keySet().toArray(); + } + + @Override + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof String) + return hier.get((String) parentElement).toArray(); + else + return null; + } + }); + treeViewer.setLabelProvider(new ITableLabelProvider() { + @Override + public void removeListener(ILabelProviderListener listener) { } + + @Override + public boolean isLabelProperty(Object element, String property) { + return false; + } + + @Override + public void dispose() { } + + @Override + public void addListener(ILabelProviderListener listener) { } + + @Override + public String getColumnText(Object element, int columnIndex) { + if (columnIndex == 0 && element instanceof String) + return element.toString(); + else if(element instanceof ITrAttribute){ + ITrAttribute attr = (ITrAttribute)element; + if (columnIndex == 1 ) + return attr.getName(); + else if (columnIndex == 2 ) + return attr.getType(); + 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 + return attr.getValue().toString(); + } + } + return null; + } + @Override + public Image getColumnImage(Object element, int columnIndex) { + return null; + } + }); + + MenuManager menuMgr = new MenuManager("#PopUp"); //$NON-NLS-1$ + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager mgr) { + ISelection selection = treeViewer.getSelection(); + if (selection instanceof IStructuredSelection) { + System.out.println(((IStructuredSelection)selection).getFirstElement().toString()); + } + } + }); + Menu menu = menuMgr.createContextMenu(treeViewer.getControl()); + treeViewer.getControl().setMenu(menu); + aTabbedPropertySheetPage.getSite().setSelectionProvider(this); + } + + public void setInput(IWorkbenchPart part, ISelection selection) { + super.setInput(part, selection); + currentSelection = null; + Assert.isTrue(selection instanceof IStructuredSelection); + Object input = ((IStructuredSelection) selection).getFirstElement(); + Assert.isTrue(input instanceof ITransactionFacade); + iTr = (ITransactionFacade) input; + } + + public void refresh() { + treeViewer.setInput("All"); + } + + @Override + public void addSelectionChangedListener(ISelectionChangedListener listener) { + listeners.add(listener); + } + + @Override + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + listeners.remove(listener); + } + + public ISelection getSelection() { + return currentSelection != null ? currentSelection : super.getSelection(); + } + + @Override + public void setSelection(ISelection selection) { + currentSelection = selection; + Object[] list = listeners.getListeners(); + for (int i = 0; i < list.length; i++) { + ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); + } + } + +} diff --git a/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/RelatedProperty.java b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/RelatedProperty.java new file mode 100644 index 0000000..585bda7 --- /dev/null +++ b/com.itjw.txviewer.graph/src/com/itjw/txviewer/graph/views/sections/RelatedProperty.java @@ -0,0 +1,250 @@ +package com.itjw.txviewer.graph.views.sections; + +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.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.ILabelProviderListener; +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.ITableLabelProvider; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.GridData; +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.IWorkbenchPart; +import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection; +import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; + +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 ListenerList listeners = new ListenerList(); + + private ITransactionFacade iTr; + + private ISelection currentSelection; + + private TreeViewer treeViewer; + + public RelatedProperty() { + } + + public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) { + super.createControls(parent, aTabbedPropertySheetPage); + Composite composite = getWidgetFactory().createFlatFormComposite(parent); + Tree tree = new Tree(composite, SWT.BORDER | SWT.FULL_SELECTION); + tree.setHeaderVisible(true); + treeViewer = new TreeViewer(tree); + + TreeColumn column1 = new TreeColumn(tree, SWT.LEFT); + tree.setLinesVisible(true); + column1.setAlignment(SWT.LEFT); + column1.setText(titles[0]); + column1.setWidth(150); + TreeColumn column2 = new TreeColumn(tree, SWT.RIGHT); + column2.setAlignment(SWT.LEFT); + column2.setText(titles[1]); + column2.setWidth(150); + + Object layoutData = parent.getLayoutData(); + if (layoutData instanceof GridData) { + GridData gridData = (GridData) layoutData; + gridData.grabExcessVerticalSpace = true; + gridData.verticalAlignment = SWT.FILL; + } + + FormData formData = new FormData(); + formData.left = new FormAttachment(0); + formData.top = new FormAttachment(0); + formData.right = new FormAttachment(100); + formData.bottom = new FormAttachment(100); + tree.setLayoutData(formData); + + treeViewer.setAutoExpandLevel(2); + treeViewer.setContentProvider(new ITreeContentProvider() { + TreeMap> hier = new TreeMap>(); + HashMap parents = new HashMap(); + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + if (newInput instanceof RelationType[]) { + 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); + } + } + } + } + + @Override + public void dispose() { } + + @Override + public boolean hasChildren(Object element) { + Object[] childs = getChildren(element); + return childs != null && childs.length > 0; + } + + @Override + public Object getParent(Object element) { + if (element instanceof ITransaction) + return parents.get(element); + else + return null; + } + + @Override + public Object[] getElements(Object inputElement) { + return hier.keySet().toArray(); + } + + @Override + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof RelationType) + return hier.get((RelationType) parentElement).toArray(); + else + return null; + } + }); + treeViewer.setLabelProvider(new ITableLabelProvider() { + @Override + public void removeListener(ILabelProviderListener listener) { } + + @Override + public boolean isLabelProperty(Object element, String property) { + return false; + } + + @Override + public void dispose() { } + + @Override + public void addListener(ILabelProviderListener listener) { } + + @Override + public String getColumnText(Object element, int columnIndex) { + if (columnIndex == 0 && element instanceof RelationType) + return element.toString(); + else if (columnIndex == 1 && element instanceof ITransaction) + return ((ITransaction) element).getId().toString(); + else + return null; + } + + @Override + public Image getColumnImage(Object element, int columnIndex) { + return null; + } + }); + treeViewer.addSelectionChangedListener(this); + MenuManager menuMgr = new MenuManager("#PopUp"); //$NON-NLS-1$ + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager mgr) { + fillContextMenu(mgr); + } + }); + Menu menu = menuMgr.createContextMenu(treeViewer.getControl()); + treeViewer.getControl().setMenu(menu); + aTabbedPropertySheetPage.getSite().setSelectionProvider(this); + 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)); + } + } + + public void setInput(IWorkbenchPart part, ISelection selection) { + super.setInput(part, selection); + currentSelection = null; + Assert.isTrue(selection instanceof IStructuredSelection); + Object input = ((IStructuredSelection) selection).getFirstElement(); + Assert.isTrue(input instanceof ITransactionFacade); + iTr = (ITransactionFacade) input; + } + + public void refresh() { + treeViewer.setInput(RelationType.values()); + } + + public void aboutToBeShown() { + treeViewer.expandAll(); + } + + @Override + public void addSelectionChangedListener(ISelectionChangedListener listener) { + listeners.add(listener); + } + + @Override + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + listeners.remove(listener); + } + + public ISelection getSelection() { + return currentSelection != null ? currentSelection : super.getSelection(); + } + + @Override + public void setSelection(ISelection selection) { + currentSelection = selection; + Object[] list = listeners.getListeners(); + for (int i = 0; i < list.length; i++) { + ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); + } + } + + @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)); + } + } + } + +}