From 5e4034b5cba89460a62fa958fc78c2b85acb3d5f Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Tue, 7 Oct 2014 09:18:33 +0200 Subject: Repackage to org.cristalise --- bin/eclipse/Cristal Kernel GUI.launch | 2 +- pom.xml | 16 +- src/main/java/com/c2kernel/gui/Console.java | 289 ---------- .../java/com/c2kernel/gui/DomainKeyConsumer.java | 16 - .../java/com/c2kernel/gui/DomainKeyListener.java | 27 - .../java/com/c2kernel/gui/DynamicTreeBuilder.java | 191 ------- src/main/java/com/c2kernel/gui/ImageLoader.java | 73 --- src/main/java/com/c2kernel/gui/ItemDetails.java | 232 -------- src/main/java/com/c2kernel/gui/ItemFinder.java | 222 -------- src/main/java/com/c2kernel/gui/ItemTabManager.java | 83 --- src/main/java/com/c2kernel/gui/LoginBox.java | 325 ----------- src/main/java/com/c2kernel/gui/Main.java | 70 --- src/main/java/com/c2kernel/gui/MainFrame.java | 308 ----------- src/main/java/com/c2kernel/gui/MenuBuilder.java | 281 ---------- .../java/com/c2kernel/gui/ProgressReporter.java | 52 -- src/main/java/com/c2kernel/gui/TreeBrowser.java | 230 -------- .../gui/collection/AggregationMemberRenderer.java | 131 ----- .../c2kernel/gui/collection/CollectionFrame.java | 41 -- .../com/c2kernel/gui/collection/PropertyPanel.java | 37 -- .../gui/collection/SelectedMemberPanel.java | 165 ------ .../gui/graph/controller/AutoScrollController.java | 41 -- .../gui/graph/controller/DeletionController.java | 98 ---- .../controller/EdgeConstructionController.java | 261 --------- .../c2kernel/gui/graph/controller/ElasticBand.java | 18 - .../controller/MultiSelectionDragController.java | 574 ------------------- .../c2kernel/gui/graph/controller/Selection.java | 36 -- .../graph/controller/StartVertexController.java | 81 --- .../controller/VertexConstructionController.java | 53 -- .../gui/graph/event/ElasticBandResizedEvent.java | 8 - .../gui/graph/event/ElasticBandSetEvent.java | 8 - .../gui/graph/event/SelectionChangedEvent.java | 10 - .../gui/graph/event/SelectionMovedEvent.java | 9 - .../graph/view/DefaultDirectedEdgeRenderer.java | 75 --- .../gui/graph/view/DefaultVertexRenderer.java | 60 -- .../gui/graph/view/DirectedEdgeRenderer.java | 11 - .../gui/graph/view/EditorModeListener.java | 8 - .../com/c2kernel/gui/graph/view/EditorPanel.java | 105 ---- .../com/c2kernel/gui/graph/view/EditorToolBar.java | 347 ------------ .../com/c2kernel/gui/graph/view/GraphPanel.java | 611 -------------------- .../com/c2kernel/gui/graph/view/PropertyTable.java | 41 -- .../gui/graph/view/PropertyTableModel.java | 159 ------ .../gui/graph/view/SelectedVertexPanel.java | 27 - .../gui/graph/view/VertexPropertyPanel.java | 266 --------- .../c2kernel/gui/graph/view/VertexRenderer.java | 11 - .../gui/lifecycle/chooser/ActivityChooser.java | 194 ------- .../gui/lifecycle/chooser/LDAPEntryChooser.java | 70 --- .../gui/lifecycle/chooser/LDAPFileChooser.java | 119 ---- .../gui/lifecycle/chooser/WorkflowDialogue.java | 20 - .../lifecycle/desc/ActivitySlotDefRenderer.java | 71 --- .../lifecycle/desc/CompActDefOutcomeHandler.java | 241 -------- .../lifecycle/desc/ElemActDefOutcomeHandler.java | 227 -------- .../gui/lifecycle/desc/SplitJoinDefRenderer.java | 138 ----- .../gui/lifecycle/desc/WfDefGraphPanel.java | 59 -- .../lifecycle/desc/WfDirectedEdgeDefRenderer.java | 134 ----- .../gui/lifecycle/desc/WfEdgeDefFactory.java | 30 - .../gui/lifecycle/desc/WfVertexDefFactory.java | 96 ---- .../gui/lifecycle/desc/WfVertexDefRenderer.java | 30 - .../gui/lifecycle/instance/ActivityRenderer.java | 110 ---- .../gui/lifecycle/instance/FindActDefPanel.java | 72 --- .../gui/lifecycle/instance/SplitJoinRenderer.java | 142 ----- .../gui/lifecycle/instance/TransitionPanel.java | 214 ------- .../lifecycle/instance/WfDirectedEdgeRenderer.java | 130 ----- .../gui/lifecycle/instance/WfEdgeFactory.java | 35 -- .../gui/lifecycle/instance/WfGraphPanel.java | 59 -- .../gui/lifecycle/instance/WfVertexFactory.java | 92 ---- .../gui/lifecycle/instance/WfVertexRenderer.java | 23 - .../java/com/c2kernel/gui/tabs/CloseTabIcon.java | 70 --- .../java/com/c2kernel/gui/tabs/CollectionPane.java | 122 ---- .../com/c2kernel/gui/tabs/DomainPathAdmin.java | 175 ------ .../java/com/c2kernel/gui/tabs/ExecutionPane.java | 207 ------- .../java/com/c2kernel/gui/tabs/HistoryPane.java | 303 ---------- .../java/com/c2kernel/gui/tabs/ItemTabPane.java | 194 ------- .../gui/tabs/JTabbedPaneWithCloseIcons.java | 96 ---- .../java/com/c2kernel/gui/tabs/JobListPane.java | 311 ----------- .../java/com/c2kernel/gui/tabs/PropertiesPane.java | 200 ------- .../java/com/c2kernel/gui/tabs/ViewpointPane.java | 529 ------------------ .../java/com/c2kernel/gui/tabs/WorkflowPane.java | 280 ---------- .../gui/tabs/collection/AggregationView.java | 90 --- .../tabs/collection/CollectionHistoryWindow.java | 187 ------- .../collection/CollectionMemberPropertyPanel.java | 182 ------ .../gui/tabs/collection/CollectionView.java | 50 -- .../gui/tabs/collection/DependencyView.java | 72 --- .../c2kernel/gui/tabs/execution/ActivityItem.java | 56 -- .../gui/tabs/execution/ActivityViewer.java | 345 ------------ .../gui/tabs/execution/DefaultExecutor.java | 37 -- .../com/c2kernel/gui/tabs/execution/Executor.java | 22 - .../c2kernel/gui/tabs/execution/RequestButton.java | 43 -- .../gui/tabs/outcome/BasicOutcomeEditor.java | 113 ---- .../gui/tabs/outcome/InvalidOutcomeException.java | 11 - .../gui/tabs/outcome/InvalidSchemaException.java | 11 - .../gui/tabs/outcome/OutcomeException.java | 11 - .../c2kernel/gui/tabs/outcome/OutcomeHandler.java | 16 - .../outcome/OutcomeNotInitialisedException.java | 11 - .../gui/tabs/outcome/form/AttributeList.java | 160 ------ .../gui/tabs/outcome/form/CardinalException.java | 14 - .../c2kernel/gui/tabs/outcome/form/DataRecord.java | 252 --------- .../c2kernel/gui/tabs/outcome/form/Dimension.java | 396 ------------- .../gui/tabs/outcome/form/DimensionInstance.java | 33 -- .../gui/tabs/outcome/form/DimensionTableModel.java | 332 ----------- .../com/c2kernel/gui/tabs/outcome/form/Field.java | 142 ----- .../c2kernel/gui/tabs/outcome/form/HelpPane.java | 55 -- .../tabs/outcome/form/MultiLinePasteAdapter.java | 142 ----- .../gui/tabs/outcome/form/OutcomeEditor.java | 215 -------- .../gui/tabs/outcome/form/OutcomePanel.java | 348 ------------ .../gui/tabs/outcome/form/OutcomeStructure.java | 283 ---------- .../gui/tabs/outcome/form/StructuralException.java | 12 - .../tabs/outcome/form/field/ArrayEditField.java | 173 ------ .../tabs/outcome/form/field/ArrayTableModel.java | 113 ---- .../tabs/outcome/form/field/BooleanEditField.java | 75 --- .../gui/tabs/outcome/form/field/ComboField.java | 144 ----- .../tabs/outcome/form/field/DecimalEditField.java | 119 ---- .../tabs/outcome/form/field/ImageEditField.java | 112 ---- .../tabs/outcome/form/field/IntegerEditField.java | 119 ---- .../gui/tabs/outcome/form/field/ListOfValues.java | 31 -- .../outcome/form/field/LongStringEditField.java | 40 -- .../tabs/outcome/form/field/StringEditField.java | 257 --------- src/main/java/com/c2kernel/gui/tree/Node.java | 251 --------- src/main/java/com/c2kernel/gui/tree/NodeAgent.java | 32 -- .../java/com/c2kernel/gui/tree/NodeCollection.java | 143 ----- .../java/com/c2kernel/gui/tree/NodeContext.java | 65 --- src/main/java/com/c2kernel/gui/tree/NodeItem.java | 240 -------- src/main/java/com/c2kernel/gui/tree/NodeRole.java | 33 -- .../java/com/c2kernel/gui/tree/NodeSubscriber.java | 13 - .../com/c2kernel/gui/tree/NodeTransferHandler.java | 73 --- src/main/java/org/cristalise/gui/Console.java | 290 ++++++++++ .../java/org/cristalise/gui/DomainKeyConsumer.java | 16 + .../java/org/cristalise/gui/DomainKeyListener.java | 27 + .../org/cristalise/gui/DynamicTreeBuilder.java | 192 +++++++ src/main/java/org/cristalise/gui/ImageLoader.java | 74 +++ src/main/java/org/cristalise/gui/ItemDetails.java | 233 ++++++++ src/main/java/org/cristalise/gui/ItemFinder.java | 223 ++++++++ .../java/org/cristalise/gui/ItemTabManager.java | 84 +++ src/main/java/org/cristalise/gui/LoginBox.java | 326 +++++++++++ src/main/java/org/cristalise/gui/Main.java | 71 +++ src/main/java/org/cristalise/gui/MainFrame.java | 308 +++++++++++ src/main/java/org/cristalise/gui/MenuBuilder.java | 282 ++++++++++ .../java/org/cristalise/gui/ProgressReporter.java | 52 ++ src/main/java/org/cristalise/gui/TreeBrowser.java | 231 ++++++++ .../gui/collection/AggregationMemberRenderer.java | 133 +++++ .../cristalise/gui/collection/CollectionFrame.java | 42 ++ .../cristalise/gui/collection/PropertyPanel.java | 38 ++ .../gui/collection/SelectedMemberPanel.java | 166 ++++++ .../gui/graph/controller/AutoScrollController.java | 42 ++ .../gui/graph/controller/DeletionController.java | 99 ++++ .../controller/EdgeConstructionController.java | 262 +++++++++ .../gui/graph/controller/ElasticBand.java | 18 + .../controller/MultiSelectionDragController.java | 575 +++++++++++++++++++ .../cristalise/gui/graph/controller/Selection.java | 36 ++ .../graph/controller/StartVertexController.java | 82 +++ .../controller/VertexConstructionController.java | 54 ++ .../gui/graph/event/ElasticBandResizedEvent.java | 8 + .../gui/graph/event/ElasticBandSetEvent.java | 8 + .../gui/graph/event/SelectionChangedEvent.java | 11 + .../gui/graph/event/SelectionMovedEvent.java | 9 + .../graph/view/DefaultDirectedEdgeRenderer.java | 76 +++ .../gui/graph/view/DefaultVertexRenderer.java | 61 ++ .../gui/graph/view/DirectedEdgeRenderer.java | 12 + .../gui/graph/view/EditorModeListener.java | 8 + .../org/cristalise/gui/graph/view/EditorPanel.java | 106 ++++ .../cristalise/gui/graph/view/EditorToolBar.java | 348 ++++++++++++ .../org/cristalise/gui/graph/view/GraphPanel.java | 612 +++++++++++++++++++++ .../cristalise/gui/graph/view/PropertyTable.java | 41 ++ .../gui/graph/view/PropertyTableModel.java | 160 ++++++ .../gui/graph/view/SelectedVertexPanel.java | 28 + .../gui/graph/view/VertexPropertyPanel.java | 267 +++++++++ .../cristalise/gui/graph/view/VertexRenderer.java | 12 + .../gui/lifecycle/chooser/ActivityChooser.java | 195 +++++++ .../gui/lifecycle/chooser/LDAPEntryChooser.java | 71 +++ .../gui/lifecycle/chooser/LDAPFileChooser.java | 120 ++++ .../gui/lifecycle/chooser/WorkflowDialogue.java | 20 + .../lifecycle/desc/ActivitySlotDefRenderer.java | 72 +++ .../lifecycle/desc/CompActDefOutcomeHandler.java | 242 ++++++++ .../lifecycle/desc/ElemActDefOutcomeHandler.java | 228 ++++++++ .../gui/lifecycle/desc/SplitJoinDefRenderer.java | 139 +++++ .../gui/lifecycle/desc/WfDefGraphPanel.java | 60 ++ .../lifecycle/desc/WfDirectedEdgeDefRenderer.java | 135 +++++ .../gui/lifecycle/desc/WfEdgeDefFactory.java | 30 + .../gui/lifecycle/desc/WfVertexDefFactory.java | 97 ++++ .../gui/lifecycle/desc/WfVertexDefRenderer.java | 31 ++ .../gui/lifecycle/instance/ActivityRenderer.java | 111 ++++ .../gui/lifecycle/instance/FindActDefPanel.java | 73 +++ .../gui/lifecycle/instance/SplitJoinRenderer.java | 143 +++++ .../gui/lifecycle/instance/TransitionPanel.java | 215 ++++++++ .../lifecycle/instance/WfDirectedEdgeRenderer.java | 131 +++++ .../gui/lifecycle/instance/WfEdgeFactory.java | 35 ++ .../gui/lifecycle/instance/WfGraphPanel.java | 60 ++ .../gui/lifecycle/instance/WfVertexFactory.java | 93 ++++ .../gui/lifecycle/instance/WfVertexRenderer.java | 24 + .../java/org/cristalise/gui/tabs/CloseTabIcon.java | 70 +++ .../org/cristalise/gui/tabs/CollectionPane.java | 123 +++++ .../org/cristalise/gui/tabs/DomainPathAdmin.java | 176 ++++++ .../org/cristalise/gui/tabs/ExecutionPane.java | 208 +++++++ .../java/org/cristalise/gui/tabs/HistoryPane.java | 304 ++++++++++ .../java/org/cristalise/gui/tabs/ItemTabPane.java | 195 +++++++ .../gui/tabs/JTabbedPaneWithCloseIcons.java | 97 ++++ .../java/org/cristalise/gui/tabs/JobListPane.java | 312 +++++++++++ .../org/cristalise/gui/tabs/PropertiesPane.java | 201 +++++++ .../org/cristalise/gui/tabs/ViewpointPane.java | 530 ++++++++++++++++++ .../java/org/cristalise/gui/tabs/WorkflowPane.java | 281 ++++++++++ .../gui/tabs/collection/AggregationView.java | 91 +++ .../tabs/collection/CollectionHistoryWindow.java | 188 +++++++ .../collection/CollectionMemberPropertyPanel.java | 183 ++++++ .../gui/tabs/collection/CollectionView.java | 51 ++ .../gui/tabs/collection/DependencyView.java | 73 +++ .../gui/tabs/execution/ActivityItem.java | 57 ++ .../gui/tabs/execution/ActivityViewer.java | 346 ++++++++++++ .../gui/tabs/execution/DefaultExecutor.java | 38 ++ .../cristalise/gui/tabs/execution/Executor.java | 23 + .../gui/tabs/execution/RequestButton.java | 44 ++ .../gui/tabs/outcome/BasicOutcomeEditor.java | 114 ++++ .../gui/tabs/outcome/InvalidOutcomeException.java | 11 + .../gui/tabs/outcome/InvalidSchemaException.java | 11 + .../gui/tabs/outcome/OutcomeException.java | 11 + .../gui/tabs/outcome/OutcomeHandler.java | 16 + .../outcome/OutcomeNotInitialisedException.java | 11 + .../gui/tabs/outcome/form/AttributeList.java | 160 ++++++ .../gui/tabs/outcome/form/CardinalException.java | 14 + .../gui/tabs/outcome/form/DataRecord.java | 252 +++++++++ .../gui/tabs/outcome/form/Dimension.java | 396 +++++++++++++ .../gui/tabs/outcome/form/DimensionInstance.java | 33 ++ .../gui/tabs/outcome/form/DimensionTableModel.java | 332 +++++++++++ .../cristalise/gui/tabs/outcome/form/Field.java | 142 +++++ .../cristalise/gui/tabs/outcome/form/HelpPane.java | 56 ++ .../tabs/outcome/form/MultiLinePasteAdapter.java | 143 +++++ .../gui/tabs/outcome/form/OutcomeEditor.java | 216 ++++++++ .../gui/tabs/outcome/form/OutcomePanel.java | 348 ++++++++++++ .../gui/tabs/outcome/form/OutcomeStructure.java | 283 ++++++++++ .../gui/tabs/outcome/form/StructuralException.java | 12 + .../tabs/outcome/form/field/ArrayEditField.java | 173 ++++++ .../tabs/outcome/form/field/ArrayTableModel.java | 113 ++++ .../tabs/outcome/form/field/BooleanEditField.java | 76 +++ .../gui/tabs/outcome/form/field/ComboField.java | 144 +++++ .../tabs/outcome/form/field/DecimalEditField.java | 119 ++++ .../tabs/outcome/form/field/ImageEditField.java | 112 ++++ .../tabs/outcome/form/field/IntegerEditField.java | 119 ++++ .../gui/tabs/outcome/form/field/ListOfValues.java | 31 ++ .../outcome/form/field/LongStringEditField.java | 41 ++ .../tabs/outcome/form/field/StringEditField.java | 257 +++++++++ src/main/java/org/cristalise/gui/tree/Node.java | 252 +++++++++ .../java/org/cristalise/gui/tree/NodeAgent.java | 33 ++ .../org/cristalise/gui/tree/NodeCollection.java | 144 +++++ .../java/org/cristalise/gui/tree/NodeContext.java | 66 +++ .../java/org/cristalise/gui/tree/NodeItem.java | 241 ++++++++ .../java/org/cristalise/gui/tree/NodeRole.java | 34 ++ .../org/cristalise/gui/tree/NodeSubscriber.java | 13 + .../cristalise/gui/tree/NodeTransferHandler.java | 74 +++ src/main/resources/module.xml | 8 +- 247 files changed, 16255 insertions(+), 16171 deletions(-) delete mode 100644 src/main/java/com/c2kernel/gui/Console.java delete mode 100644 src/main/java/com/c2kernel/gui/DomainKeyConsumer.java delete mode 100644 src/main/java/com/c2kernel/gui/DomainKeyListener.java delete mode 100644 src/main/java/com/c2kernel/gui/DynamicTreeBuilder.java delete mode 100644 src/main/java/com/c2kernel/gui/ImageLoader.java delete mode 100644 src/main/java/com/c2kernel/gui/ItemDetails.java delete mode 100644 src/main/java/com/c2kernel/gui/ItemFinder.java delete mode 100644 src/main/java/com/c2kernel/gui/ItemTabManager.java delete mode 100644 src/main/java/com/c2kernel/gui/LoginBox.java delete mode 100644 src/main/java/com/c2kernel/gui/Main.java delete mode 100644 src/main/java/com/c2kernel/gui/MainFrame.java delete mode 100644 src/main/java/com/c2kernel/gui/MenuBuilder.java delete mode 100644 src/main/java/com/c2kernel/gui/ProgressReporter.java delete mode 100644 src/main/java/com/c2kernel/gui/TreeBrowser.java delete mode 100644 src/main/java/com/c2kernel/gui/collection/AggregationMemberRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/collection/CollectionFrame.java delete mode 100644 src/main/java/com/c2kernel/gui/collection/PropertyPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/collection/SelectedMemberPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/controller/AutoScrollController.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/controller/DeletionController.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/controller/EdgeConstructionController.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/controller/ElasticBand.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/controller/MultiSelectionDragController.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/controller/Selection.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/controller/StartVertexController.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/controller/VertexConstructionController.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/event/ElasticBandResizedEvent.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/event/ElasticBandSetEvent.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/event/SelectionChangedEvent.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/event/SelectionMovedEvent.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/DefaultDirectedEdgeRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/DefaultVertexRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/DirectedEdgeRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/EditorModeListener.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/EditorPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/EditorToolBar.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/GraphPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/PropertyTable.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/PropertyTableModel.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/SelectedVertexPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/VertexPropertyPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/graph/view/VertexRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/chooser/ActivityChooser.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/chooser/LDAPEntryChooser.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/chooser/LDAPFileChooser.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/chooser/WorkflowDialogue.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/desc/ActivitySlotDefRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/desc/CompActDefOutcomeHandler.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/desc/ElemActDefOutcomeHandler.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/desc/SplitJoinDefRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/desc/WfDefGraphPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/desc/WfDirectedEdgeDefRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/desc/WfEdgeDefFactory.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/desc/WfVertexDefFactory.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/desc/WfVertexDefRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/instance/ActivityRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/instance/FindActDefPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/instance/SplitJoinRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/instance/TransitionPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/instance/WfDirectedEdgeRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/instance/WfEdgeFactory.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/instance/WfGraphPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/instance/WfVertexFactory.java delete mode 100644 src/main/java/com/c2kernel/gui/lifecycle/instance/WfVertexRenderer.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/CloseTabIcon.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/CollectionPane.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/DomainPathAdmin.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/ExecutionPane.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/HistoryPane.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/ItemTabPane.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/JTabbedPaneWithCloseIcons.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/JobListPane.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/PropertiesPane.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/ViewpointPane.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/WorkflowPane.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/collection/AggregationView.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/collection/CollectionHistoryWindow.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/collection/CollectionMemberPropertyPanel.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/collection/CollectionView.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/collection/DependencyView.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/execution/ActivityItem.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/execution/ActivityViewer.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/execution/DefaultExecutor.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/execution/Executor.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/execution/RequestButton.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/BasicOutcomeEditor.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/InvalidOutcomeException.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/InvalidSchemaException.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeException.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeHandler.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeNotInitialisedException.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/AttributeList.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/CardinalException.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/DataRecord.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/Dimension.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/DimensionInstance.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/DimensionTableModel.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/Field.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/HelpPane.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/MultiLinePasteAdapter.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomeEditor.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomePanel.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomeStructure.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/StructuralException.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ArrayEditField.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ArrayTableModel.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/field/BooleanEditField.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ComboField.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/field/DecimalEditField.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ImageEditField.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/field/IntegerEditField.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ListOfValues.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/field/LongStringEditField.java delete mode 100644 src/main/java/com/c2kernel/gui/tabs/outcome/form/field/StringEditField.java delete mode 100644 src/main/java/com/c2kernel/gui/tree/Node.java delete mode 100644 src/main/java/com/c2kernel/gui/tree/NodeAgent.java delete mode 100644 src/main/java/com/c2kernel/gui/tree/NodeCollection.java delete mode 100644 src/main/java/com/c2kernel/gui/tree/NodeContext.java delete mode 100644 src/main/java/com/c2kernel/gui/tree/NodeItem.java delete mode 100644 src/main/java/com/c2kernel/gui/tree/NodeRole.java delete mode 100644 src/main/java/com/c2kernel/gui/tree/NodeSubscriber.java delete mode 100644 src/main/java/com/c2kernel/gui/tree/NodeTransferHandler.java create mode 100644 src/main/java/org/cristalise/gui/Console.java create mode 100644 src/main/java/org/cristalise/gui/DomainKeyConsumer.java create mode 100644 src/main/java/org/cristalise/gui/DomainKeyListener.java create mode 100644 src/main/java/org/cristalise/gui/DynamicTreeBuilder.java create mode 100644 src/main/java/org/cristalise/gui/ImageLoader.java create mode 100644 src/main/java/org/cristalise/gui/ItemDetails.java create mode 100644 src/main/java/org/cristalise/gui/ItemFinder.java create mode 100644 src/main/java/org/cristalise/gui/ItemTabManager.java create mode 100644 src/main/java/org/cristalise/gui/LoginBox.java create mode 100644 src/main/java/org/cristalise/gui/Main.java create mode 100644 src/main/java/org/cristalise/gui/MainFrame.java create mode 100644 src/main/java/org/cristalise/gui/MenuBuilder.java create mode 100644 src/main/java/org/cristalise/gui/ProgressReporter.java create mode 100644 src/main/java/org/cristalise/gui/TreeBrowser.java create mode 100644 src/main/java/org/cristalise/gui/collection/AggregationMemberRenderer.java create mode 100644 src/main/java/org/cristalise/gui/collection/CollectionFrame.java create mode 100644 src/main/java/org/cristalise/gui/collection/PropertyPanel.java create mode 100644 src/main/java/org/cristalise/gui/collection/SelectedMemberPanel.java create mode 100644 src/main/java/org/cristalise/gui/graph/controller/AutoScrollController.java create mode 100644 src/main/java/org/cristalise/gui/graph/controller/DeletionController.java create mode 100644 src/main/java/org/cristalise/gui/graph/controller/EdgeConstructionController.java create mode 100644 src/main/java/org/cristalise/gui/graph/controller/ElasticBand.java create mode 100644 src/main/java/org/cristalise/gui/graph/controller/MultiSelectionDragController.java create mode 100644 src/main/java/org/cristalise/gui/graph/controller/Selection.java create mode 100644 src/main/java/org/cristalise/gui/graph/controller/StartVertexController.java create mode 100644 src/main/java/org/cristalise/gui/graph/controller/VertexConstructionController.java create mode 100644 src/main/java/org/cristalise/gui/graph/event/ElasticBandResizedEvent.java create mode 100644 src/main/java/org/cristalise/gui/graph/event/ElasticBandSetEvent.java create mode 100644 src/main/java/org/cristalise/gui/graph/event/SelectionChangedEvent.java create mode 100644 src/main/java/org/cristalise/gui/graph/event/SelectionMovedEvent.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/DefaultDirectedEdgeRenderer.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/DefaultVertexRenderer.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/DirectedEdgeRenderer.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/EditorModeListener.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/EditorPanel.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/EditorToolBar.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/GraphPanel.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/PropertyTable.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/PropertyTableModel.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/SelectedVertexPanel.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/VertexPropertyPanel.java create mode 100644 src/main/java/org/cristalise/gui/graph/view/VertexRenderer.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/chooser/ActivityChooser.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/chooser/LDAPEntryChooser.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/chooser/LDAPFileChooser.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/chooser/WorkflowDialogue.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/desc/ActivitySlotDefRenderer.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/desc/CompActDefOutcomeHandler.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/desc/ElemActDefOutcomeHandler.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/desc/SplitJoinDefRenderer.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/desc/WfDefGraphPanel.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/desc/WfDirectedEdgeDefRenderer.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/desc/WfEdgeDefFactory.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/desc/WfVertexDefFactory.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/desc/WfVertexDefRenderer.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/instance/ActivityRenderer.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/instance/FindActDefPanel.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/instance/SplitJoinRenderer.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/instance/TransitionPanel.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/instance/WfDirectedEdgeRenderer.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/instance/WfEdgeFactory.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/instance/WfGraphPanel.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/instance/WfVertexFactory.java create mode 100644 src/main/java/org/cristalise/gui/lifecycle/instance/WfVertexRenderer.java create mode 100644 src/main/java/org/cristalise/gui/tabs/CloseTabIcon.java create mode 100644 src/main/java/org/cristalise/gui/tabs/CollectionPane.java create mode 100644 src/main/java/org/cristalise/gui/tabs/DomainPathAdmin.java create mode 100644 src/main/java/org/cristalise/gui/tabs/ExecutionPane.java create mode 100644 src/main/java/org/cristalise/gui/tabs/HistoryPane.java create mode 100644 src/main/java/org/cristalise/gui/tabs/ItemTabPane.java create mode 100644 src/main/java/org/cristalise/gui/tabs/JTabbedPaneWithCloseIcons.java create mode 100644 src/main/java/org/cristalise/gui/tabs/JobListPane.java create mode 100644 src/main/java/org/cristalise/gui/tabs/PropertiesPane.java create mode 100644 src/main/java/org/cristalise/gui/tabs/ViewpointPane.java create mode 100644 src/main/java/org/cristalise/gui/tabs/WorkflowPane.java create mode 100644 src/main/java/org/cristalise/gui/tabs/collection/AggregationView.java create mode 100644 src/main/java/org/cristalise/gui/tabs/collection/CollectionHistoryWindow.java create mode 100644 src/main/java/org/cristalise/gui/tabs/collection/CollectionMemberPropertyPanel.java create mode 100644 src/main/java/org/cristalise/gui/tabs/collection/CollectionView.java create mode 100644 src/main/java/org/cristalise/gui/tabs/collection/DependencyView.java create mode 100644 src/main/java/org/cristalise/gui/tabs/execution/ActivityItem.java create mode 100644 src/main/java/org/cristalise/gui/tabs/execution/ActivityViewer.java create mode 100644 src/main/java/org/cristalise/gui/tabs/execution/DefaultExecutor.java create mode 100644 src/main/java/org/cristalise/gui/tabs/execution/Executor.java create mode 100644 src/main/java/org/cristalise/gui/tabs/execution/RequestButton.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/BasicOutcomeEditor.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/InvalidOutcomeException.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/InvalidSchemaException.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/OutcomeException.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/OutcomeHandler.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/OutcomeNotInitialisedException.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/AttributeList.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/CardinalException.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/DataRecord.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/Dimension.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/DimensionInstance.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/DimensionTableModel.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/Field.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/HelpPane.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/MultiLinePasteAdapter.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomeEditor.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomePanel.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomeStructure.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/StructuralException.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/field/ArrayEditField.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/field/ArrayTableModel.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/field/BooleanEditField.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/field/ComboField.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/field/DecimalEditField.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/field/ImageEditField.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/field/IntegerEditField.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/field/ListOfValues.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/field/LongStringEditField.java create mode 100644 src/main/java/org/cristalise/gui/tabs/outcome/form/field/StringEditField.java create mode 100644 src/main/java/org/cristalise/gui/tree/Node.java create mode 100644 src/main/java/org/cristalise/gui/tree/NodeAgent.java create mode 100644 src/main/java/org/cristalise/gui/tree/NodeCollection.java create mode 100644 src/main/java/org/cristalise/gui/tree/NodeContext.java create mode 100644 src/main/java/org/cristalise/gui/tree/NodeItem.java create mode 100644 src/main/java/org/cristalise/gui/tree/NodeRole.java create mode 100644 src/main/java/org/cristalise/gui/tree/NodeSubscriber.java create mode 100644 src/main/java/org/cristalise/gui/tree/NodeTransferHandler.java diff --git a/bin/eclipse/Cristal Kernel GUI.launch b/bin/eclipse/Cristal Kernel GUI.launch index e63b995..123d430 100644 --- a/bin/eclipse/Cristal Kernel GUI.launch +++ b/bin/eclipse/Cristal Kernel GUI.launch @@ -8,7 +8,7 @@ - + diff --git a/pom.xml b/pom.xml index cde36ef..065f4f2 100644 --- a/pom.xml +++ b/pom.xml @@ -1,24 +1,24 @@ 4.0.0 - cristal - cristal-gui + org.cristalise + cristalise-gui 3.0-SNAPSHOT - cristal-gui - CRISTAL Kernel GUI + cristalise-gui + Cristal-ise default GUI UTF-8 - cristal - cristal-kernel + org.cristalise + cristalise-kernel - cristal - cristal-kernel + org.cristalise + cristalise-kernel 3.0-SNAPSHOT diff --git a/src/main/java/com/c2kernel/gui/Console.java b/src/main/java/com/c2kernel/gui/Console.java deleted file mode 100644 index ae3a2cc..0000000 --- a/src/main/java/com/c2kernel/gui/Console.java +++ /dev/null @@ -1,289 +0,0 @@ -package com.c2kernel.gui; - -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.io.BufferedReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.InterruptedIOException; -import java.io.PrintWriter; -import java.net.Socket; -import java.util.Properties; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; - -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.FileStringUtility; -import com.c2kernel.utils.Logger; - -/************************************************************************** - * - * $Revision: 1.10 $ - * $Date: 2005/10/05 07:39:37 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class Console extends JFrame { - JTextArea output; - JScrollPane scroll; - JTextField input; - JButton sendButton; - JButton toFileButton; - FileWriter logFile; - ConsoleConnection connection; - JFileChooser scriptLoader = new JFileChooser(); - static int bufferSize = Gateway.getProperties().getInt("Console.bufferSize", 200); - - public Console(String host, int port) { - super("Cristal Console - "+host); - GridBagLayout gridbag = new GridBagLayout(); - getContentPane().setLayout(gridbag); - output = new JTextArea("Type 'help' for help. . .\n"); - output.setEditable(false); - input = new JTextField(); - setSize(400, 600); - sendButton = new JButton("Send"); - sendButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - submit(); - } - }); - JButton clearButton = new JButton("Clear"); - clearButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - synchronized (output) { - output.setText(""); - } - } - }); - toFileButton = new JButton("Save"); - toFileButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (logFile == null) { - int returnValue = scriptLoader.showSaveDialog(null); - switch (returnValue) - { - case JFileChooser.APPROVE_OPTION : - try { - logFile = new FileWriter(scriptLoader.getSelectedFile()); - print ("Starting writing log to "+scriptLoader.getSelectedFile().getAbsolutePath()); - } catch (Exception ex) { - print(ex.getClass().getName()+": "+ex.getMessage()); - Logger.error(ex); - } - toFileButton.setText("Stop"); - case JFileChooser.CANCEL_OPTION : - case JFileChooser.ERROR_OPTION : - default : - } - } - else { - try { - logFile.close(); - } catch (Exception ex) { - logFile = null; - print(ex.getClass().getName()+": "+ex.getMessage()); - } - logFile = null; - toFileButton.setText("Save"); - } - } - }); - - - input.addKeyListener(new EnterListener(this)); - - scroll = new JScrollPane(output); - GridBagConstraints c = new GridBagConstraints(); - c.gridx=0; c.gridy=0; - c.fill=GridBagConstraints.BOTH; - c.weightx=1.0;c.weighty=1.0; - gridbag.setConstraints(scroll, c); - getContentPane().add(scroll); - - Box inputBox = Box.createHorizontalBox(); - inputBox.add(input); - inputBox.add(Box.createHorizontalStrut(5)); - inputBox.add(sendButton); - inputBox.add(clearButton); - inputBox.add(toFileButton); - c.gridy=1; c.fill=GridBagConstraints.HORIZONTAL; - c.weighty=0; - gridbag.setConstraints(inputBox, c); - getContentPane().add(inputBox); - - try { - // TODO: merge module script utilities together and prepend with namespace - Properties utilProps = FileStringUtility.loadConfigFile( Gateway.getResource().findTextResource("ScriptUtils.conf") ); - - Box utilBox = Box.createHorizontalBox(); - for (Object name2 : utilProps.keySet()) { - String name = (String) name2; - String value = utilProps.getProperty(name); - JButton newUtil = new JButton(name); - newUtil.setActionCommand(value); - newUtil.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - processUtil(e.getActionCommand()); - } - }); - utilBox.add(newUtil); - utilBox.add(Box.createHorizontalStrut(5)); - } - - c.gridy++; - gridbag.setConstraints(utilBox, c); - getContentPane().add(utilBox); - } catch (Exception ex) { // no domain utils - } - - - validate(); - connection = new ConsoleConnection(host, port, this); - new Thread(connection).start(); - addWindowListener(new java.awt.event.WindowAdapter() { - @Override - public void windowClosing(java.awt.event.WindowEvent evt) { - if (connection!=null) connection.shutdown(); - dispose(); - } - }); - } - - @Override - public void setVisible(boolean visible) { - super.setVisible(visible); - if (visible) input.requestFocus(); - } - - public void processUtil(String command) { - int replace; - String text = input.getText(); - while ((replace = command.indexOf("%s")) > -1) { - command = command.substring(0, replace)+text+command.substring(replace+2); - } - connection.sendCommand(command); - } - - public void submit() { - connection.sendCommand(input.getText()); - input.setText(""); - } - - public void print(String line) { - synchronized (output) { - String currentText = output.getText()+line+"\n"; - while (output.getLineCount() > bufferSize) { - currentText = currentText.substring(currentText.indexOf("\n")+1); - output.setText(currentText); - } - output.setText(currentText); - output.setCaretPosition(output.getText().length()); - if (logFile != null) try { - logFile.write(line+"\n"); - } catch (IOException ex) { - logFile = null; - print("Error writing to file."); - } - } - } - - @Override - public void disable() { - synchronized (output) { - output.append("Lost connection"); - } - output.setEnabled(false); - input.setEnabled(false); - sendButton.setEnabled(false); - } - - private class EnterListener extends KeyAdapter - { - Console parent; - public EnterListener(Console parent) { - this.parent = parent; - } - @Override - public void keyPressed(KeyEvent e) { - if (e.getKeyCode()==10) { - parent.submit(); - } - } - }; - - private class ConsoleConnection implements Runnable { - String host; int port; Console parent; boolean keepConnected = true; - Socket conn; PrintWriter consoleOutput; BufferedReader consoleInput; - - - public ConsoleConnection(String host, int port, Console parent) { - Thread.currentThread().setName("Console Client to "+host+":"+port); - this.host = host; - this.port = port; - this.parent = parent; - } - - @Override - public void run() { - connect(); - while (keepConnected) { - try { - String line = consoleInput.readLine(); - if (line == null) { - parent.disable(); - keepConnected = false; - } - else - parent.print(line); - } catch (InterruptedIOException ex) { // timeout - ignore - } catch (IOException ex) { // error reading - parent.disable(); - keepConnected = false; - } - } - - try { - conn.close(); - } catch (IOException ex) { } - } - - public void sendCommand(String command) { - consoleOutput.println(command); - } - - public void shutdown() { - keepConnected = false; - } - - public void connect() { - parent.print("Connecting to "+host+":"+port); - try { - conn = new Socket(host, port); - conn.setKeepAlive(true); - conn.setSoTimeout(500); - consoleOutput = new PrintWriter(conn.getOutputStream(), true); - consoleInput = new BufferedReader(new InputStreamReader(conn.getInputStream())); - } catch (Exception ex) { - - } - } - } -} diff --git a/src/main/java/com/c2kernel/gui/DomainKeyConsumer.java b/src/main/java/com/c2kernel/gui/DomainKeyConsumer.java deleted file mode 100644 index 18847cc..0000000 --- a/src/main/java/com/c2kernel/gui/DomainKeyConsumer.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.c2kernel.gui; - -import com.c2kernel.lookup.DomainPath; - -/** - * Things that can be told when a barcode etc is entered - * @version $Revision: 1.2 $ $Date: 2003/03/13 16:42:38 $ - * @author $Author: abranson $ - */ - -public interface DomainKeyConsumer { - public void push(DomainPath key); - - public void push(String name); - -} diff --git a/src/main/java/com/c2kernel/gui/DomainKeyListener.java b/src/main/java/com/c2kernel/gui/DomainKeyListener.java deleted file mode 100644 index 95c7e3a..0000000 --- a/src/main/java/com/c2kernel/gui/DomainKeyListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.c2kernel.gui; - -import java.io.IOException; - -import javax.swing.ImageIcon; - -/** - * Interface for external key input classes (e.g. barcode scanner) - * @version $Revision: 1.5 $ $Date: 2004/10/20 14:10:21 $ - * @author $Author: abranson $ - */ - -public interface DomainKeyListener { - public void init(); - - public boolean enable() throws IOException; - - public void setConsumer(ItemFinder consumer); - - public void disable(); - - // return 25x25 icon for enable/disable button - public ImageIcon getIcon(); - - // tooltip for the button - public String getDescription(); -} diff --git a/src/main/java/com/c2kernel/gui/DynamicTreeBuilder.java b/src/main/java/com/c2kernel/gui/DynamicTreeBuilder.java deleted file mode 100644 index 3f6e933..0000000 --- a/src/main/java/com/c2kernel/gui/DynamicTreeBuilder.java +++ /dev/null @@ -1,191 +0,0 @@ -package com.c2kernel.gui; - -import javax.swing.ImageIcon; -import javax.swing.JTree; -import javax.swing.SwingUtilities; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; - -import com.c2kernel.gui.tree.Node; -import com.c2kernel.gui.tree.NodeItem; -import com.c2kernel.gui.tree.NodeSubscriber; -import com.c2kernel.lookup.Path; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -/** - * Installed as the user object on a single child node of a new node known to be composite. - *

Shows 'Loading . . .' when the branch is opened, but a TreeExpansionListener attempts to fire this thread off in the first child node. - *
When started, this thread will retrieve all of the real child nodes and add them to its parent while removing itself (hopefully for garbage collection) - * - * @version $Revision: 1.24 $ $Date: 2004/12/15 12:12:06 $ - * @author $Author: abranson $ - */ - -public class DynamicTreeBuilder extends Node implements NodeSubscriber { - private DefaultTreeModel treeModel; - private final DefaultMutableTreeNode parent; - public short state = IDLE; - public static final short IDLE = 0; - public static final short LOADING = 1; - public static final short PARTIAL = 2; - public static final short FINISHED = 3; - private final DefaultMutableTreeNode loading; - private static ImageIcon loadIcon = ImageLoader.findImage("loading.gif"); - private static ImageIcon pauseIcon = ImageLoader.findImage("reload.gif"); - - /** - * The newly created DynamicTreeBuilder records its parent node - the one for which it will build child nodes for. - * @param nodeClicked The Parent Tree Node that will be populated. - * @see NodeItem - * @see TreeDisplay*/ - public DynamicTreeBuilder(DefaultMutableTreeNode parent, ItemTabManager desktop) { - super(desktop); - this.parent = parent; - loading = new DefaultMutableTreeNode(this); - } - - /** - * Before the tree builder can execute, it needs to be given references to the tree and NodeFactory needed to create the new nodes. - * @param myNodeFactory The NodeFactory that can be queried for new NodeItems. - * @param parentTree The JTree in which this node is currently contained. - */ - public void buildInfo(JTree parentTree) { - this.treeModel = (DefaultTreeModel)parentTree.getModel(); - } - - public void start() { - // find the clicked tree node - Node parentNode = (Node)parent.getUserObject(); - Logger.msg(2, "DynamicTreeBuilder.start() - Filling in children of '"+parentNode.toString()+"'"); - if (state == IDLE) - parentNode.subscribeNode(this); - else - parentNode.loadMore(); - state = LOADING; - } - - /** - * Used by the JTree to find the text representation of the node. - */ - @Override - public String toString() { - switch (state) { - case IDLE: - return Language.translate("Initializing Tree Node Loader"); - case LOADING: - return Language.translate("Loading . . ."); - case PARTIAL: - return Language.translate("Double-click to load more"); - case FINISHED: - return Language.translate("Done"); - default: - return ""; - } - - } - - @Override - public ImageIcon getIcon() { - if (state == LOADING) - return loadIcon; - else - return pauseIcon; - } - - @Override - public DefaultMutableTreeNode getTreeNode() { - return loading; - } - - @Override - public void add(Node newNode) { - Logger.msg(2, "DynamicTreeBuilder.add() - Received item for tree. Name: "+newNode); - - // have we inserted the node yet? - SwingUtilities.invokeLater(new TreeAddThread(newNode)); - } - - class TreeAddThread implements Runnable { - Node newNode; - TreeAddThread(Node newNode) { - this.newNode = newNode; - } - @Override - public void run() { - boolean inserted = false; - DefaultMutableTreeNode newTreeNode = newNode.getTreeNode(); - // loop though all children unless we have done the insertion - for (int i=0; i= 0) { - // if the next string is 'greater than' ours, insert the node before - treeModel.insertNodeInto(newTreeNode, parent, i); - inserted = true; - break; - } - - } - // if we haven't inserted yet, it must go at the end. - - if (!inserted) - treeModel.insertNodeInto(newTreeNode, parent, parent.getChildCount()); - } - - } - - class TreeRemoveThread implements Runnable { - DefaultMutableTreeNode oldNode; - TreeRemoveThread(DefaultMutableTreeNode oldNode) { - this.oldNode = oldNode; - } - - @Override - public void run() { - treeModel.removeNodeFromParent(oldNode); - } - } - - @Override - public void end(boolean more) { - if (more) { - state = PARTIAL; - } - else { - state = FINISHED; - synchronized(treeModel) { - if (loading.getParent() != null) - SwingUtilities.invokeLater(new TreeRemoveThread(loading)); - } - } - } - - @Override - public void remove(Path path) { - synchronized (treeModel) { - for (int i=0; i imgCache = new Hashtable(); - static public final ImageIcon nullImg = new ImageIcon(new byte[] { 0 }); - static private final ArrayList reportedMissingIcons = new ArrayList(); - - /** - * Gets an image from the resource directories - * - * @param resName - filename after resources/images - * @return - */ - static public ImageIcon findImage(String resName) { - try { - for (String ns : Gateway.getResource().getModuleBaseURLs().keySet()) { - try { - return getImage(ns, resName); - } catch (ObjectNotFoundException ex) { } - } - return getImage(null, resName); - } catch (ObjectNotFoundException ex) { - if (!reportedMissingIcons.contains(resName)) { - Logger.warning("Image '"+resName+"' not found. Using null icon"); - reportedMissingIcons.add(resName); - } - return nullImg; - } - } - - static public ImageIcon getImage(String ns, String resName) throws ObjectNotFoundException { - if (resName == null) - return nullImg; - - if (imgCache.containsKey(ns+'/'+resName)) { - return imgCache.get(ns+'/'+resName); - } - - URL imgLocation = null; - if (ns == null) - try { - imgLocation = Gateway.getResource().getKernelResourceURL("images/"+resName); - } catch (MalformedURLException ex) { } - else - try { - imgLocation = Gateway.getResource().getModuleResourceURL(ns, "images/"+resName); - } catch (MalformedURLException ex) { } - - if (imgLocation!= null) { - ImageIcon newImg = new ImageIcon(imgLocation); - - if (newImg.getIconHeight() > -1) { - imgCache.put(ns+'/'+resName, newImg); - Logger.msg(3, "Loaded "+resName+" "+newImg.getIconWidth()+"x"+newImg.getIconHeight()); - return newImg; - } - } - throw new ObjectNotFoundException(); - } - -} diff --git a/src/main/java/com/c2kernel/gui/ItemDetails.java b/src/main/java/com/c2kernel/gui/ItemDetails.java deleted file mode 100644 index cc8b8d3..0000000 --- a/src/main/java/com/c2kernel/gui/ItemDetails.java +++ /dev/null @@ -1,232 +0,0 @@ -package com.c2kernel.gui; - -import java.awt.BorderLayout; -import java.awt.Font; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.event.ActionEvent; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; - -import javax.swing.ImageIcon; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTabbedPane; -import javax.swing.SwingConstants; -import javax.swing.event.ChangeListener; - -import com.c2kernel.gui.tabs.ItemTabPane; -import com.c2kernel.gui.tree.NodeItem; -import com.c2kernel.lookup.ItemPath; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -/** - * The tab pane for each viewed item - * @version $Revision: 1.38 $ $Date: 2005/06/27 15:16:14 $ - * @author $Author: abranson $ - */ -public class ItemDetails extends JPanel implements ChangeListener, Runnable { - protected JTabbedPane myTabbedPane = new JTabbedPane(SwingConstants.BOTTOM); - protected JPanel itemTitlePanel; - private ItemTabManager desktopManager; - protected NodeItem myItem; - protected HashMap childPanes = new HashMap(); - protected String startTab; - protected String startCommand = null; - protected boolean initialized = false; - - public ItemDetails(NodeItem thisItem) { - super(); - startTab = MainFrame.getPref("DefaultStartTab", "Properties"); - myItem = thisItem; - } - - @Override - public void run() { - Thread.currentThread().setName("Entity Pane Builder"); - ItemTabPane componentToAdd = null; - setLayout(new BorderLayout()); - itemTitlePanel = getItemTitlePanel(); - add(itemTitlePanel, BorderLayout.NORTH); - add(myTabbedPane); - - // decide which tabs to create - ArrayList requiredTabs = myItem.getTabs(); - - for (Object name2 : requiredTabs) { - String tabName = (String)name2; - if (tabName != null) { - //create class instances and initialise - Class myClass = null; - //look up the required TabbedPane - try { - myClass = Class.forName(this.getClass().getPackage().getName() + ".tabs." + tabName + "Pane"); - Logger.msg(2, "ItemDetails. - Creating ItemTabPane instance: " + - this.getClass().getPackage().getName() + ".tabs." + tabName + "Pane"); - componentToAdd = (ItemTabPane)myClass.newInstance(); - } catch (ClassNotFoundException e) { - Logger.msg(2, "ItemDetails. - No specialist tab found for " + tabName + ". Using default."); - } catch (InstantiationException e) { - Logger.msg(0, "ItemDetails. - Instantiation Error! " + e); - } catch (IllegalAccessException e) { - Logger.msg(0, "ItemDetails. - Illegal Method Access Error! Class was probably not a ItemTabPane: " + e); - } - if (componentToAdd == null) componentToAdd = new ItemTabPane(tabName, null); - componentToAdd.setParent(this); - - //adds the component to the panel - childPanes.put(componentToAdd, new Boolean(false)); - - int placement = myTabbedPane.getTabCount(); - if (tabName.equals("Properties")) // must be first - placement = 0; - myTabbedPane.insertTab(componentToAdd.getTabName(), null, componentToAdd, null, placement); - } - } - initialized = true; - if (!(requiredTabs.contains(startTab))) { - startTab = "Properties"; - startCommand = null; - } - runCommand(Language.translate(startTab), startCommand); - myTabbedPane.setVisible(true); - myTabbedPane.addChangeListener(this); - validate(); - MainFrame.progress.stopBouncing("Done"); - - } - - @Override - public void stateChanged(javax.swing.event.ChangeEvent p1) { - initialisePane((ItemTabPane)myTabbedPane.getSelectedComponent()); - } - - public void initialisePane(ItemTabPane pane) { - Boolean isInit = childPanes.get(pane); - if (isInit.booleanValue() == false) { - Logger.msg(4,"Initialising "+pane.getTabName()); - pane.initForItem(myItem); - childPanes.put(pane, new Boolean(true)); - validate(); - } - } - - public ItemTabManager getDesktopManager() { - return desktopManager; - } - - public void setDesktopManager(ItemTabManager newDesktopManager) { - desktopManager = newDesktopManager; - } - - public JPanel getItemTitlePanel() { - JPanel titlePanel = new JPanel(); - JComponent current; - // Use gridbag layout for title - GridBagLayout gridbag = new GridBagLayout(); - GridBagConstraints c = new GridBagConstraints(); - titlePanel.setLayout(gridbag); - // Place Item Icon - c.gridx = 0; - c.gridy = 0; - c.gridheight = GridBagConstraints.REMAINDER; - c.anchor = GridBagConstraints.NORTH; - c.ipadx = 5; - c.ipady = 5; - ImageIcon icon = ImageLoader.findImage("typeicons/"+myItem.getIconName()+"_32.png"); - if (icon==ImageLoader.nullImg) icon = ImageLoader.findImage("typeicons/item_32.png"); - current = new JLabel(icon); - gridbag.setConstraints(current, c); - titlePanel.add(current); - // Place Name/ID Label - current = new JLabel(myItem.getName() + " (" + myItem.getItemPath().getUUID().toString() + ")"); - c.gridx = 1; c.gridy = 0; c.gridheight = 1; - c.anchor = GridBagConstraints.NORTH; c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1.0; c.ipadx = 2; c.ipady = 2; - current.setFont(new Font("Helvetica", Font.PLAIN, 18)); - gridbag.setConstraints(current, c); - titlePanel.add(current); - // Place Type Label - current = new JLabel(myItem.getType()); - c.gridx = 1; c.gridy = 2; c.gridheight = 1; - c.anchor = GridBagConstraints.CENTER; c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1.0; - current.setFont(new Font("Helvetica", Font.PLAIN, 12)); - gridbag.setConstraints(current, c); - titlePanel.add(current); - return titlePanel; - } - - public void discardTabs() { - myTabbedPane.removeChangeListener(this); - myTabbedPane.removeAll(); - for (Iterator iter = childPanes.keySet().iterator(); iter.hasNext();) { - ItemTabPane element = iter.next(); - element.destroy(); - iter.remove(); - } - } - - public ItemPath getItemPath() - { - return myItem.getItemPath(); - } - - public void closeTab() { - desktopManager.remove(myItem.getItemPath()); - Logger.msg(5,"Remove master Tab :"+myItem.getType()+ " SysKey "+myItem.getItemPath()); - myItem.getItem().dumpSubscriptions(5); - } - - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("close")) - closeTab(); - } - - public void runCommand(String tab, String command) { - if (initialized) { - int tabIndex = findTab(tab); - Logger.msg(3, "Running command "+tab+" "+command+" ("+tabIndex+")"); - if (tabIndex == -1) { - Logger.error("Tab "+tab+" not found for command "+command); - return; - } - ItemTabPane startPane = (ItemTabPane)myTabbedPane.getComponentAt(tabIndex); - myTabbedPane.setSelectedIndex(tabIndex); - initialisePane(startPane); - if (command!= null) startPane.runCommand(command); - } - else - { - Logger.msg(3, "Storing command "+tab+" "+command+" until initialised."); - startTab = tab; - startCommand = command; - } - } - - protected int findTab(String tabName) { - for (int i=0; i< myTabbedPane.getTabCount(); i++) { - ItemTabPane thisPane = (ItemTabPane)myTabbedPane.getComponentAt(i); - if (thisPane.getTabName().equals(tabName)) - return i; - } - return -1; - } - - - public void refresh() - { - } - /** - * - */ - @Override - protected void finalize() throws Throwable { - Logger.msg(7, "EntityDetails "+myItem.getItemPath()+" reaped"); - super.finalize(); - } - -} \ No newline at end of file diff --git a/src/main/java/com/c2kernel/gui/ItemFinder.java b/src/main/java/com/c2kernel/gui/ItemFinder.java deleted file mode 100644 index 1b0a895..0000000 --- a/src/main/java/com/c2kernel/gui/ItemFinder.java +++ /dev/null @@ -1,222 +0,0 @@ -package com.c2kernel.gui; - -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.io.IOException; -import java.util.Iterator; -import java.util.StringTokenizer; - -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; -import javax.swing.JToggleButton; - -import com.c2kernel.lookup.DomainPath; -import com.c2kernel.lookup.Lookup; -import com.c2kernel.lookup.Path; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -public class ItemFinder extends Box implements Runnable { - JTextField inputField; - JButton findButton; - JButton findNextButton; - GridBagLayout gridbag = new GridBagLayout(); - Lookup lookup = Gateway.getLookup(); - DomainKeyConsumer defaultConsumer = null; - DomainKeyConsumer currentConsumer = null; - Iterator matches; - Path rootNode = MainFrame.userNode.getPath(); - - static protected ImageIcon mFindIcon = null; - static protected ImageIcon mNextIcon = null; - static { - try - { - mNextIcon =ImageLoader.findImage("next.png"); - mFindIcon =ImageLoader.findImage("find.png"); - } - catch (Exception e) - { - Logger.error("Couldn't load images: " + e); - } - } - - public ItemFinder() { - super(BoxLayout.X_AXIS); - initPanel(); - } - - public void pushNewKey(String key) { - inputField.setText(key); - runSearch(); - } - - public void setDefaultConsumer(DomainKeyConsumer newConsumer) { - defaultConsumer = newConsumer; - currentConsumer = newConsumer; - } - - public void setConsumer(DomainKeyConsumer newConsumer, String label) { - currentConsumer = newConsumer; - findButton.setText(label); - } - - public void clearConsumer(DomainKeyConsumer oldConsumer) { - if (currentConsumer == oldConsumer) { - currentConsumer = defaultConsumer; - findButton.setText(""); - } - } - - private void initPanel() { - - JLabel search = new JLabel(" "+Language.translate("Search")+":"); - add(search); - add(Box.createHorizontalStrut(7)); - - inputField = new JTextField(20); - add(inputField); - add(Box.createHorizontalStrut(5)); - inputField.addActionListener( new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - pushNewKey(inputField.getText()); - } - }); - - findButton = new JButton(mFindIcon);//(Language.translate("Find")); - findButton.setMargin(new Insets(2, 5, 2, 5)); - findButton.addActionListener( new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - pushNewKey(inputField.getText()); - } - }); - add(findButton); - add(Box.createHorizontalStrut(5)); - - findNextButton = new JButton(mNextIcon);//(Language.translate("Next")); - findNextButton.setMargin(new Insets(2, 5, 2, 5)); - findNextButton.addActionListener( new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - nextMatch(); - } - }); - findNextButton.setEnabled(false); - add(findNextButton); - add(Box.createHorizontalStrut(15)); - - // create plugins - Logger.msg(6, "ItemFinder() - creating plugins"); - String requiredListeners = Gateway.getProperties().getString("DomainKeyListeners"); - if (requiredListeners != null) { - StringTokenizer tok = new StringTokenizer(requiredListeners, ","); - while (tok.hasMoreTokens()) { - String listenerName = tok.nextToken(); - Logger.msg(6, "ItemFinder() - creating a " + listenerName); - try { - Class listenerClass = Class.forName(listenerName); - DomainKeyListener newListener = (DomainKeyListener)listenerClass.newInstance(); - newListener.init(); newListener.setConsumer(this); - JToggleButton listenerButton = new JToggleButton(newListener.getIcon(), false); - listenerButton.addItemListener(new ListenerButtonListener(newListener, listenerButton)); - listenerButton.setMargin(new Insets(0, 2, 0, 2)); - listenerButton.setToolTipText("Enable "+newListener.getDescription()); - add(listenerButton); - add(Box.createHorizontalStrut(7)); - } catch (Exception e) { - Logger.error("ItemFinder() - could not create a "+listenerName+": "+e); - } - } - add(Box.createHorizontalGlue()); - } - } - - private void runSearch() { - Thread searcher = new Thread(this); - searcher.start(); - } - - @Override - public void run() { - Thread.currentThread().setName("Entity Search"); - String searchTerm = inputField.getText(); - if (searchTerm.length() == 0) return; // don't allow null searches - - findButton.setEnabled(false); findNextButton.setEnabled(false); - MainFrame.progress.startBouncing("Searching. Please Wait"); - findNextButton.setEnabled(false); - String term = inputField.getText(); -// The following block does property searching when the field contains a colon, but that returns EntityPaths, which the tree can't handle -// int colonPos = term.indexOf(':'); -// if (colonPos > 0) -// matches = lookup.search(rootNode,term.substring(0, colonPos), term.substring(colonPos+1)); -// else - matches = lookup.search(rootNode,term); - if (!matches.hasNext()) { - MainFrame.progress.stopBouncing("No results"); - currentConsumer.push(searchTerm); // for subscribers who don't care if it exists - findButton.setEnabled(true); - return; - } - MainFrame.progress.stopBouncing("Selecting first match."); - nextMatch(); - - } - - void nextMatch() { - findButton.setEnabled(false); findNextButton.setEnabled(false); - DomainPath nextMatch = (DomainPath)matches.next(); - try - { - currentConsumer.push(nextMatch); - } - catch (NullPointerException e) - { - //case the item searched is not found ! - } - findButton.setEnabled(true); - findNextButton.setToolTipText("Click to show next match"); - if (matches.hasNext()) findNextButton.setEnabled(true); - } - - private class ListenerButtonListener implements ItemListener { - private final DomainKeyListener listener; - private final JToggleButton listenerButton; - - public ListenerButtonListener(DomainKeyListener newListener, JToggleButton listenerButton) { - this.listener = newListener; - this.listenerButton = listenerButton; - } - - @Override - public void itemStateChanged(ItemEvent e) { - if (e.getStateChange() == ItemEvent.SELECTED) { - // Switch on - try { - if (!(listener.enable())) listenerButton.doClick(); // allow plugins to disable themselves - } catch (IOException ex) { - JOptionPane.showMessageDialog(null, ex.getMessage(), "Error initialising "+listener.getDescription(), JOptionPane.ERROR_MESSAGE); - listenerButton.doClick(); - } - listenerButton.setToolTipText("Disable "+listener.getDescription()); - } else { - // Switch off - listener.disable(); - listenerButton.setToolTipText("Enable "+listener.getDescription()); - } - } - } - -} diff --git a/src/main/java/com/c2kernel/gui/ItemTabManager.java b/src/main/java/com/c2kernel/gui/ItemTabManager.java deleted file mode 100644 index bb0dfd9..0000000 --- a/src/main/java/com/c2kernel/gui/ItemTabManager.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.c2kernel.gui; -import java.awt.GridLayout; -import java.util.ArrayList; -import java.util.HashMap; - -import javax.swing.BorderFactory; -import javax.swing.JPanel; - -import com.c2kernel.gui.tabs.JTabbedPaneWithCloseIcons; -import com.c2kernel.gui.tree.NodeItem; -import com.c2kernel.lookup.ItemPath; -import com.c2kernel.utils.Logger; - -/** - * Keeps - * - * @version $Revision: 1.12 $ $Date: 2005/09/12 14:56:19 $ - * @author $Author: abranson $ - */ - -public class ItemTabManager extends JPanel -{ - - protected HashMap openItems = new HashMap(); - protected JTabbedPaneWithCloseIcons tabbedPane = new JTabbedPaneWithCloseIcons(); - //JTabbedPane tabbedPane = new JTabbedPane(); - MenuBuilder myMenuBuilder; - - - public ItemTabManager() { - super(); - setLayout(new GridLayout(1,1)); - setBorder(BorderFactory.createLoweredBevelBorder()); - - add(tabbedPane); - } - - public ItemDetails add(NodeItem thisItem) { - - ItemDetails requestedDetails; - if (!openItems.containsKey(thisItem.getItemPath())) { - MainFrame.progress.startBouncing("Opening "+thisItem.getName()+". Please wait."); - Logger.msg(1, "ItemWindowManager.add() - Window for syskey "+thisItem.getItemPath()+" not found. Opening new one."); - requestedDetails = new ItemDetails(thisItem); - Thread itemLoader = new Thread(requestedDetails); - itemLoader.start(); - openItems.put(thisItem.getItemPath(), requestedDetails); - requestedDetails.setDesktopManager(this); - - // get currently selected item to set location - tabbedPane.addTab(thisItem.getName(), thisItem.getIcon(), requestedDetails, thisItem.getType()); - - } - else { //opened window but different nodeitem - requestedDetails = openItems.get(thisItem.getItemPath()); - } - tabbedPane.setSelectedComponent(requestedDetails); - return requestedDetails; - } - - public void setMenuBuilder(MenuBuilder myMenuBuilder) { - this.myMenuBuilder = myMenuBuilder; - } - - public void remove(ItemPath itemPath) { - if (!openItems.containsKey(itemPath)) return; - ItemDetails tabToClose = openItems.get(itemPath); - tabbedPane.remove(tabToClose); - tabToClose.discardTabs(); - openItems.remove(itemPath); - } - - public void closeAll(boolean keepOpen) { - ArrayList toRemove = new ArrayList(); - for (ItemPath element : openItems.keySet()) { - if (keepOpen && openItems.get(element).equals(tabbedPane.getSelectedComponent())) continue; - toRemove.add(element); - } - for (ItemPath element : toRemove) { - remove(element); - } - } -} diff --git a/src/main/java/com/c2kernel/gui/LoginBox.java b/src/main/java/com/c2kernel/gui/LoginBox.java deleted file mode 100644 index 14c63e9..0000000 --- a/src/main/java/com/c2kernel/gui/LoginBox.java +++ /dev/null @@ -1,325 +0,0 @@ -package com.c2kernel.gui; - -/** - *

Title:

- *

Description:

- *

Copyright: Copyright (c) 2003

- *

Company:

- * @author not attributable - * @version 1.0 - */ -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.KeyEvent; - -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JTextField; -import javax.swing.border.EmptyBorder; - -import com.c2kernel.entity.proxy.AgentProxy; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - - -//import com.borland.jbcl.layout.*; - -/** - *

Title:

- *

Description:

- *

Copyright: Copyright (c) 2003

- *

Company:

- * @author not attributable - * @version 1.0 - */ - -public class LoginBox extends JFrame { - - public String errorMessage=new String(""); - String title; - private int maxNumberLogon; - public boolean action = false; - public int loginAttemptNumber= 0; - JLabel passwordLabel = new JLabel(); - JTextField username = new JTextField(); - JButton OK = new JButton(); - JLabel errorLabel = new JLabel(); - JPasswordField password = new JPasswordField(); - JButton Cancel = new JButton(); - JLabel userLabel = new JLabel(); - ImageIcon imageMainHolder = new ImageIcon(); - JLabel pictureLabel = new JLabel(); - GridBagLayout gridBagLayout1 = new GridBagLayout(); - MainFrame mainFrameFather; - public static AgentProxy userAgent; - private boolean logged; - private boolean errorSet; - - public LoginBox(int attempt,String title,String lastUser,String bottomMessage, - javax.swing.ImageIcon imageHolder,MainFrame mainFrame) { - String iconFile = Gateway.getProperties().getString("AppIcon"); - if (iconFile != null) - this.setIconImage(ImageLoader.findImage(iconFile).getImage()); - this.errorLabel.setText(bottomMessage); - if (errorMessage.compareTo("")!=0) this.errorLabel.setText(errorMessage); - mainFrameFather=mainFrame; - imageMainHolder=imageHolder; - try { - jbInit(); - } - catch(Exception e) { - e.printStackTrace(); - } - if (attempt==0) maxNumberLogon=5; - else maxNumberLogon=attempt; - if (title == null) - this.title = "Cristal"; - else - this.title = title; - setTitle(Language.translate("Log in to ")+title); - username.setText(lastUser); - - } -//OK button pressed OR Enter Hit - private void loginClicked(){ - errorSet=false; - try { - if (this.getUser().length()>0 && this.getPassword().length()>0) - userAgent = Gateway.connect(this.getUser(), this.getPassword(), title); - logged = (userAgent != null); - Logger.msg(7, "AbstractMain::standardSetUp() - Gateway.connect() OK."); - } - catch (Exception ex) { - String message = ex.getMessage(); - int i = ex.getMessage().indexOf(' '); - if (i > -1 ) message = message.substring(i); - //Here us elanguage translate I guess :) - //if (message.length()>65 && message.substring(1,5).compareTo("User")==0) - // message = (message.substring(1,50)+ "... not found" ); - this.errorLabel.setText(message); - Logger.error(message); - logged= false; - errorSet=true; - } - if (!logged) { - Logger.msg("Login attempt "+loginAttemptNumber+" of "+maxNumberLogon+" failed"); - if (loginAttemptNumber>=maxNumberLogon) Logger.die("Login failure limit reached"); - if (!errorSet) this.errorLabel.setText(Language.translate("Please enter username & password")); -// int posx=xMov+120; -// int posy=yMov; -// if (posy<135) posy=135; -// float texstSize = errorLabel.getFont().getSize2D(); -// if (posx-xMov pluginClass = Class.forName(pluginName); - Executor domainExecutor = (Executor)pluginClass.newInstance(); - plugins.addItem(domainExecutor); - } catch (Exception ex) { - Logger.error("Could not load the executor plugin "+pluginName); - } - } - } - return plugins; - } - protected JSplitPane getSplitPanel() - { - // create the split pane, and add the Tree to it. - if (splitPane == null) - { - splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, treeBrowser, myDesktopManager); - splitPane.setDividerSize(5); - splitPanePos = Integer.parseInt(getPref("SplitPanePosition", "200")); - getSplitPanel().setDividerLocation(splitPanePos); - } - return splitPane; - } - - static public void exceptionDialog(Exception ex) - { - String className = ex.getClass().getSimpleName(); - String error = ex.getMessage(); - if (ex instanceof UserException) - error = error.substring(error.indexOf(' ') + 1); - JOptionPane.showMessageDialog(null, error, className, JOptionPane.ERROR_MESSAGE); - } - -} diff --git a/src/main/java/com/c2kernel/gui/MenuBuilder.java b/src/main/java/com/c2kernel/gui/MenuBuilder.java deleted file mode 100644 index 100d989..0000000 --- a/src/main/java/com/c2kernel/gui/MenuBuilder.java +++ /dev/null @@ -1,281 +0,0 @@ -package com.c2kernel.gui; -import java.awt.Dimension; -import java.awt.event.ActionListener; -import java.awt.event.ItemListener; -import java.util.HashMap; -import java.util.Iterator; - -import javax.swing.Box; -import javax.swing.ButtonGroup; -import javax.swing.Icon; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JLabel; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import javax.swing.UIManager.LookAndFeelInfo; -import javax.swing.event.HyperlinkEvent; -import javax.swing.event.HyperlinkListener; -import javax.swing.text.html.HTMLEditorKit; - -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.lookup.DomainPath; -import com.c2kernel.lookup.ItemPath; -import com.c2kernel.lookup.Path; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.process.Gateway; -import com.c2kernel.property.Property; -import com.c2kernel.utils.FileStringUtility; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; -/** - * @version $Revision: 1.47 $ $Date: 2006/03/03 13:52:21 $ - * @author $Author: abranson $ - */ -public class MenuBuilder extends JMenuBar implements ActionListener, ItemListener, HyperlinkListener -{ - - protected UIManager.LookAndFeelInfo[] availableViews = UIManager.getInstalledLookAndFeels(); - protected MainFrame myParentFrame; - protected JMenu fileMenu; - protected JMenu consoleMenu; - protected JMenu styleMenu; - protected JMenu prefMenu; - protected JMenu helpMenu; - protected HashMap availableMenus = new HashMap(); - - public MenuBuilder() - {} - - /** Creates new DynamicMenuBuilder */ - public MenuBuilder(MainFrame parentFrame) - { - myParentFrame = parentFrame; - fileMenu = new JMenu(Language.translate("File")); - consoleMenu = new JMenu(Language.translate("Console")); - styleMenu = new JMenu(Language.translate("Style")); - prefMenu = new JMenu("Preferences"); - helpMenu = new JMenu(Language.translate("Help")); - availableMenus.put("file", fileMenu); - availableMenus.put("console", consoleMenu); - availableMenus.put("preferences", prefMenu); - availableMenus.put("style", styleMenu); - availableMenus.put("help", helpMenu); - - addMenuItem(Language.translate("Close All"), "file", null, 0); - addMenuItem(Language.translate("Close Others"), "file", null, 0); - fileMenu.insertSeparator(2); - addMenuItem(Language.translate("Exit"), "file", null, 0); - - addMenuItem(Language.translate("Local console"), "console", null, 0); - consoleMenu.insertSeparator(5); - addServerConsoles(); - - ButtonGroup styleButtonGroup = new ButtonGroup(); - for (LookAndFeelInfo availableView : availableViews) - addMenuItem(availableView.getName(), "style", styleButtonGroup, 0); - - addMenuItem(Language.translate("Tree Browser"), "preferences", null, MainFrame.getPref("ShowTree", "true").equals("true")?2:1); - addMenuItem(Language.translate("Outcome Field Help"), "preferences", null, MainFrame.getPref("ShowHelp", "true").equals("true")?2:1); - addMenuItem(Language.translate("Graph Properties"), "preferences", null, MainFrame.getPref("ShowProps", "true").equals("true")?2:1); - addMenuItem(Language.translate("About"), "help", null, 0); - - add(fileMenu); - add(consoleMenu); - add(styleMenu); - add(prefMenu); - add(helpMenu); - } - /** - * - */ - private void addServerConsoles() { - Iterator servers = Gateway.getLookup().search(new DomainPath("/servers"), new Property("Type", "Server", false)); - while(servers.hasNext()) { - Path thisServerPath = (Path)servers.next(); - try { - ItemPath serverItemPath = thisServerPath.getItemPath(); - String serverName = ((Property)Gateway.getStorage().get(serverItemPath, ClusterStorage.PROPERTY+"/Name", null)).getValue(); - String portStr = ((Property)Gateway.getStorage().get(serverItemPath, ClusterStorage.PROPERTY+"/ConsolePort", null)).getValue(); - addMenuItem(serverName+":"+portStr, "console", null, 0); - } catch (Exception ex) { - Logger.error("Exception retrieving proxy server connection data for "+thisServerPath); - Logger.error(ex); - } - } - - } - - /** - * Adds a menu item to a menu. Adds an action listener to the menu item. - */ - public void addMenuItem(String itemName, String menuName, ButtonGroup bg, int checkBox) - { - //checks to see if the menu to add the item to exists - if (availableMenus.containsKey(menuName)) - { - JMenuItem myItem = new JMenuItem(itemName); - if (bg != null) - { - //if the menu item equals the current style, set it selected - myItem = new JRadioButtonMenuItem(itemName, UIManager.getLookAndFeel().getName().equals(itemName)); - bg.add(myItem); - } - if (checkBox != 0) - { - myItem = new JCheckBoxMenuItem(itemName, checkBox == 2); - } - myItem.addActionListener(this); - JMenu myMenu = availableMenus.get(menuName); - myMenu.add(myItem); - } - } - //checks to see if the event dispatched is one of the - //styles that belong to the UIManager - public int isStyleChange(String style) - { - for (int i = 0; i < availableViews.length; i++) - { - if (style.equals(availableViews[i].getName())) - return i; - } - return -1; - } - //listens for events performed on the menu items - @Override - public void actionPerformed(java.awt.event.ActionEvent e) - { - String s = e.getActionCommand(); - int i = isStyleChange(s); - if (s.equals("Close All") || s.equals("Close Others")) { - MainFrame.myDesktopManager.closeAll(s.equals("Close Others")); - } - else if (s.equals(Language.translate("Exit"))) - myParentFrame.exitForm(); - else if (s.equals(Language.translate("About"))) - showAboutWindow(); - else if (i >= 0) - { - try - { - UIManager.setLookAndFeel(availableViews[i].getClassName()); - SwingUtilities.updateComponentTreeUI(myParentFrame); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } - else if (s.equals(Language.translate("Tree Browser"))) - { - myParentFrame.toggleTree(); - } - else if (s.indexOf(":")>0) { // server console - try - { - String[] serverDetails = s.split(":"); - new Console(serverDetails[0], Integer.parseInt(serverDetails[1])).setVisible(true); - } - catch (Exception ex) - { - Logger.error(ex); - } - } - else if (s.equals(Language.translate("Local console"))) { - try - { - new Console("localhost", Logger.getConsolePort()).setVisible(true); - } - catch (Exception ex) - { - Logger.error(ex); - } - } - else if (s.equals(Language.translate("Outcome Field Help"))) { - MainFrame.setPref("ShowHelp", String.valueOf(!MainFrame.getPref("ShowHelp", "true").equals("true"))); - } - else if (s.equals(Language.translate("Graph Properties"))) { - MainFrame.setPref("ShowProps", String.valueOf(!MainFrame.getPref("ShowProps", "true").equals("true"))); - } - else - Logger.msg(1, "MenuBuilder.actionPerformed() - No action associated with the event received"); - } - //constructs an about dialog - public void showAboutWindow() - { - JOptionPane myPane = new JOptionPane(); - Box about = Box.createVerticalBox(); - - String aboutInfo; - try - { - aboutInfo = FileStringUtility.file2String(Gateway.getProperties().getString("about")); - } - catch (Exception e) - { - aboutInfo = Language.translate("Cristal 2 Itembrowser"); - } - JLabel title = new JLabel(aboutInfo); - about.add(title); - - about.add(new JLabel("Kernel version: "+Gateway.getKernelVersion())); - about.add(new JLabel("Modules loaded: "+Gateway.getModuleManager().getModuleVersions())); - // get license info - - StringBuffer lictxt = new StringBuffer(); - try { - lictxt.append(Gateway.getResource().getTextResource(null, "textFiles/license.html")); - } catch (ObjectNotFoundException e) { } // no kernel license found - for (String ns : Gateway.getResource().getModuleBaseURLs().keySet()) { - String domlictxt; - try { - domlictxt = Gateway.getResource().getTextResource(ns, "license.html"); - lictxt.append(domlictxt).append("\n"); - } catch (ObjectNotFoundException e) { } - - } - - - JEditorPane license = new JEditorPane(); - license.setEditable(false); - license.setEditorKit(new HTMLEditorKit()); - license.setContentType("text/html"); - license.addHyperlinkListener(this); - license.setText(lictxt.toString()); - JScrollPane scroll = new JScrollPane(license); - scroll.setPreferredSize(new Dimension(300,200)); - license.setCaretPosition(0); - - about.add(scroll); - myPane.setMessage(about); - myPane.setMessageType(JOptionPane.INFORMATION_MESSAGE); - JDialog dialog = myPane.createDialog(null, Language.translate("About")); - dialog.setResizable(false); - Icon icon = ImageLoader.findImage(Gateway.getProperties().getString("banner")); - myPane.setIcon(icon); - dialog.pack(); - dialog.setVisible(true); - } - - @Override -public void hyperlinkUpdate(HyperlinkEvent e) { - try { - if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) - Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler "+e.getURL().toString()); - } catch (Exception ex) { - MainFrame.exceptionDialog(ex); - } - } - - @Override - public void itemStateChanged(java.awt.event.ItemEvent e) - { - } -} diff --git a/src/main/java/com/c2kernel/gui/ProgressReporter.java b/src/main/java/com/c2kernel/gui/ProgressReporter.java deleted file mode 100644 index 8d7483e..0000000 --- a/src/main/java/com/c2kernel/gui/ProgressReporter.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.c2kernel.gui; - -import java.awt.Color; -import java.awt.Dimension; - -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JLabel; -import javax.swing.JProgressBar; - -public class ProgressReporter extends Box { - - JLabel status = new JLabel(); - JProgressBar progress = new JProgressBar(); - - /** - * - */ - public ProgressReporter() { - super(BoxLayout.X_AXIS); - status.setText("Cristal"); - //status.setBorder(BorderFactory.createLoweredBevelBorder()); - status.setForeground(Color.black); - status.setPreferredSize(new Dimension(400, progress.getPreferredSize().height)); - //progress.setBorder(BorderFactory.createLoweredBevelBorder()); - add(status); - //add(Box.createHorizontalGlue()); - progress.setPreferredSize(new Dimension(200, progress.getPreferredSize().height)); - add(progress); - } - - /** - * @param status - */ - public void startBouncing(String statusString) { - status.setText(statusString); - progress.setIndeterminate(true); - } - - /** - * @param status - */ - public void stopBouncing(String statusString) { - status.setText(statusString); - progress.setIndeterminate(false); - } - - public void setProgress(String statusString, int percent) { - progress.setIndeterminate(false); - progress.setValue(percent); - } -} diff --git a/src/main/java/com/c2kernel/gui/TreeBrowser.java b/src/main/java/com/c2kernel/gui/TreeBrowser.java deleted file mode 100644 index 288cb93..0000000 --- a/src/main/java/com/c2kernel/gui/TreeBrowser.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.c2kernel.gui; - -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Point; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import javax.swing.DropMode; -import javax.swing.ImageIcon; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.ToolTipManager; -import javax.swing.event.TreeExpansionEvent; -import javax.swing.event.TreeExpansionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; - -import com.c2kernel.gui.tree.Node; -import com.c2kernel.gui.tree.NodeItem; -import com.c2kernel.gui.tree.NodeTransferHandler; -import com.c2kernel.lookup.DomainPath; -import com.c2kernel.utils.Logger; - -/** - * Container for the tree browser - * @version $Revision: 1.31 $ $Date: 2006/01/17 07:49:44 $ - * @author $Author: abranson $ - */ - - // must put in top level list of loaded items, so we don't have duplicates -public class TreeBrowser extends JPanel implements DomainKeyConsumer -{ - private ItemTabManager desktop; - protected JTree tree; - private Node userRoot; - - public TreeBrowser(ItemTabManager target, Node userRoot) { - setLayout(new java.awt.BorderLayout()); - //record the desktop and node factory for our item frames - this.desktop = target; - this.userRoot = userRoot; - this.setPreferredSize(new Dimension(300, 500)); - tree = new JTree(new DefaultTreeModel(userRoot.getTreeNode())); - tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - tree.setToggleClickCount(3); // need three clicks to expand a branch - tree.addTreeExpansionListener( - new TreeExpansionListener() { - @Override - public void treeCollapsed(TreeExpansionEvent e) { - //REVISIT: possible reaping here if things are getting heavy - } - @Override - public void treeExpanded(TreeExpansionEvent e) { - TreePath p = e.getPath(); - // find the clicked tree node - DefaultMutableTreeNode nodeClicked = (DefaultMutableTreeNode)p.getLastPathComponent(); - // run the tree builder if it is there. - DefaultMutableTreeNode loadNode = (DefaultMutableTreeNode)nodeClicked.getFirstChild(); - if (loadNode.getUserObject() instanceof DynamicTreeBuilder) { - DynamicTreeBuilder loading = (DynamicTreeBuilder)loadNode.getUserObject(); - if (loading.state == DynamicTreeBuilder.IDLE) { - loading.buildInfo(tree); - loading.start(); - } - } - } - } - ); - - //Enable tool tips. - ToolTipManager.sharedInstance().registerComponent(tree); - tree.setCellRenderer(new ItemRenderer()); - tree.addMouseListener(new TreeMouseListener()); - tree.setDragEnabled(true); - tree.setDropMode(DropMode.ON); - tree.setTransferHandler(new NodeTransferHandler(this)); - JScrollPane myScrollPane = new JScrollPane(tree); - this.add(myScrollPane); - DefaultMutableTreeNode loadNode = (DefaultMutableTreeNode)userRoot.getTreeNode().getFirstChild(); - DynamicTreeBuilder loading = (DynamicTreeBuilder)loadNode.getUserObject(); - loading.buildInfo(tree); - loading.start(); - } - - @Override - public void push(DomainPath target) { - String[] components = target.getPath(); - Node currentNode = userRoot; - Object[] treePath = new Object[components.length+1]; - treePath[0] = currentNode.getTreeNode(); - for (int i=0; i 1) - { - for(int i=0; i bottomY) - { - bottomY = outline[i].y; - } - } - - return bottomY; - } - - public Image getImage(AggregationMember am) { - return ImageLoader.findImage("typeicons/"+am.getProperties().get("Type")+"_16.png").getImage(); - } -} diff --git a/src/main/java/com/c2kernel/gui/collection/CollectionFrame.java b/src/main/java/com/c2kernel/gui/collection/CollectionFrame.java deleted file mode 100644 index 76a964b..0000000 --- a/src/main/java/com/c2kernel/gui/collection/CollectionFrame.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.c2kernel.gui.collection; - -import java.awt.GridLayout; - -import javax.swing.JFrame; - -import com.c2kernel.collection.Aggregation; -import com.c2kernel.gui.tabs.CollectionPane; - - -/** - * @version $Revision: 1.10 $ $Date: 2003/04/06 15:06:36 $ - * @author $Author: abranson $ - */ - -public class CollectionFrame extends JFrame -{ - - private CollectionPane mCollectionPane = new CollectionPane(); - - public CollectionFrame() - { - createLayout(); - } - - public void setAggregation(Aggregation aggregation) - { - mCollectionPane.add(aggregation); - } - - - private void createLayout() - { - getContentPane().setLayout(new GridLayout(1, 1)); - - getContentPane().add(mCollectionPane); - - setSize(1000, 1000); - setVisible(true); - } -} diff --git a/src/main/java/com/c2kernel/gui/collection/PropertyPanel.java b/src/main/java/com/c2kernel/gui/collection/PropertyPanel.java deleted file mode 100644 index 38e3fd3..0000000 --- a/src/main/java/com/c2kernel/gui/collection/PropertyPanel.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.c2kernel.gui.collection; - -import com.c2kernel.collection.Aggregation; -import com.c2kernel.collection.AggregationMember; -import com.c2kernel.collection.CollectionMember; -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.view.VertexPropertyPanel; - -public class PropertyPanel extends VertexPropertyPanel { - - Aggregation mCollection; - - public PropertyPanel() { - super(); - } - - public void setCollection(Aggregation collection) { - mCollection = collection; - } - - @Override - public void setVertex(Vertex vert) { - try { - CollectionMember newMember = mCollection.getMember(vert.getID()); - if (newMember instanceof AggregationMember) { - super.setVertex((AggregationMember)newMember); - return; - } - else - clear(); - } catch (ObjectNotFoundException ex) { - clear(); - selObjClass.setText("No Collection Member object found"); - } - } -} diff --git a/src/main/java/com/c2kernel/gui/collection/SelectedMemberPanel.java b/src/main/java/com/c2kernel/gui/collection/SelectedMemberPanel.java deleted file mode 100644 index 20fdde5..0000000 --- a/src/main/java/com/c2kernel/gui/collection/SelectedMemberPanel.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.c2kernel.gui.collection; - -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.JToggleButton; - -import com.c2kernel.collection.AggregationMember; -import com.c2kernel.common.InvalidCollectionModification; -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.entity.proxy.ItemProxy; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.DomainKeyConsumer; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.graph.view.SelectedVertexPanel; -import com.c2kernel.lookup.DomainPath; -import com.c2kernel.lookup.ItemPath; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Language; - -/************************************************************************** - * - * $Revision: 1.10 $ - * $Date: 2005/05/12 10:12:52 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - - -public class SelectedMemberPanel extends SelectedVertexPanel implements DomainKeyConsumer { - - JLabel slotNumber = new JLabel(); - JTextField memberKey = new JTextField(14); - - JButton findButton = new JButton(Language.translate("Find")); - JToggleButton changeButton = new JToggleButton(Language.translate("Change")); - JButton removeButton = new JButton(Language.translate("Remove")); - - SelectedMemberPanel me; - AggregationMember selectedMember = null; - - public SelectedMemberPanel() { - me=this; - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - - JPanel attrs = new JPanel(new GridLayout(3,2)); - attrs.add(new JLabel(Language.translate("Slot Number:"))); - attrs.add(slotNumber); - attrs.add(new JLabel(Language.translate("Assigned Member:"))); - attrs.add(memberKey); - memberKey.setEditable(false); - - add(attrs); - add(Box.createVerticalStrut(10)); - - findButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent ae) { - String code = memberKey.getText(); - if (code == null || code.length() == 0) - code = memberKey.getText().replace('/',' '); - MainFrame.itemFinder.pushNewKey(code); - } - }); - - changeButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent ae) { - if (changeButton.getModel().isSelected()) { - MainFrame.itemFinder.setConsumer(me, "Assign"); - findButton.setEnabled(false); - } - else { - MainFrame.itemFinder.clearConsumer(me); - if (selectedMember.getItemPath() != null) findButton.setEnabled(true); - } - } - }); - - removeButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent ae) { - selectedMember.clearItem(); - selectedMember.getProperties().remove("Name"); - select(selectedMember); - } - }); - - Box buttonBox = Box.createHorizontalBox(); - buttonBox.add(findButton); - if (MainFrame.isAdmin) { - buttonBox.add(changeButton); - buttonBox.add(removeButton); - } - - setButtons(false); - add(buttonBox); - } - - @Override - public void select(Vertex vert) { - selectedMember = (AggregationMember)vert; - slotNumber.setText(String.valueOf(vert.getID())); - ItemPath memberPath = selectedMember.getItemPath(); - String name = "Empty"; - if (memberPath != null) - try { - ItemProxy member = Gateway.getProxyManager().getProxy(memberPath); - name = member.getName(); - } catch (Exception e) { } - memberKey.setText(name); - setButtons(true); - - revalidate(); - } - - @Override - public void clear() { - slotNumber.setText(""); - memberKey.setText(""); - setButtons(false); - revalidate(); - } - - public void setButtons(boolean state) { - findButton.setEnabled(state); - changeButton.getModel().setSelected(false); - changeButton.setEnabled(state); - removeButton.setEnabled(state); - MainFrame.itemFinder.clearConsumer(me); - } - /** - * - */ - @Override - public void push(DomainPath key) { - try { - selectedMember.assignItem(key.getItemPath()); - select(selectedMember); - } catch (InvalidCollectionModification ex) { - JOptionPane.showMessageDialog(null, "Item does not fit in this slot", "Error", JOptionPane.ERROR_MESSAGE); - } catch (ObjectNotFoundException e) { - JOptionPane.showMessageDialog(null, "Not an item - cannot assign", "Error", JOptionPane.ERROR_MESSAGE); - } - } - - /** - * - */ - @Override - public void push(String name) { - JOptionPane.showMessageDialog(null, "Item is not known in this centre", "Error", JOptionPane.ERROR_MESSAGE); - } - -} - diff --git a/src/main/java/com/c2kernel/gui/graph/controller/AutoScrollController.java b/src/main/java/com/c2kernel/gui/graph/controller/AutoScrollController.java deleted file mode 100644 index a09d6a2..0000000 --- a/src/main/java/com/c2kernel/gui/graph/controller/AutoScrollController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.c2kernel.gui.graph.controller; - -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionListener; - -import com.c2kernel.gui.graph.view.GraphPanel; - - -public class AutoScrollController implements MouseMotionListener -{ - private GraphPanel mGraphPanel = null; - - - public void setGraphPanel(GraphPanel graphPanel) - { - mGraphPanel = graphPanel; - mGraphPanel.addMouseMotionListener(this); - } - - - @Override - public void mouseDragged(MouseEvent me) - { - Point mousePoint = null; - - - if(mGraphPanel != null) - { - mousePoint = me.getPoint(); - mGraphPanel.scrollRectToVisible(new Rectangle(mousePoint.x, mousePoint.y, 1, 1)); - } - } - - - @Override - public void mouseMoved(MouseEvent me) - { - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/controller/DeletionController.java b/src/main/java/com/c2kernel/gui/graph/controller/DeletionController.java deleted file mode 100644 index d83a588..0000000 --- a/src/main/java/com/c2kernel/gui/graph/controller/DeletionController.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.c2kernel.gui.graph.controller; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.util.Observable; -import java.util.Observer; - -import javax.swing.JButton; - -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.event.SelectionChangedEvent; -import com.c2kernel.gui.graph.view.GraphPanel; - - -// The deletion controller is responsible for deleting the present -// selection within the graph. -// -// The controller listens to: -// * The graph model to determine if there is a selection -// * The delete button -// * The graph panel for the typing of the delete key -// -// The controller modifies: -// * The graph model to delete the current selection -// * The delete button to enable it only when there is a selection -public class DeletionController extends KeyAdapter implements Observer, ActionListener -{ - private GraphModelManager mGraphModelManager = null; - private GraphPanel mGraphPanel = null; - private JButton mDeleteButton = null; - - - public void setGraphModelManager(GraphModelManager graphModelManager) - { - mGraphModelManager = graphModelManager; - mGraphModelManager.addObserver(this); - } - - public void setGraphPanel(GraphPanel graphPanel) - { - mGraphPanel = graphPanel; - } - - - public void setDeleteButton(JButton deleteButton) - { - mDeleteButton = deleteButton; - mDeleteButton.addActionListener(this); - } - - - // Invoked by the graph model - @Override - public void update(Observable o, Object arg) - { - SelectionChangedEvent event = null; - DirectedEdge selectedEdge = null; - Vertex[] selectedVertices = null; - - - // If the selected edge has changed - if(arg instanceof SelectionChangedEvent && mDeleteButton != null && mGraphModelManager.isEditable()) - { - // Enable the button if a single edge or single vertex is selected - event = (SelectionChangedEvent)arg; - - selectedEdge = event.mSelection.mEdge; - selectedVertices = event.mSelection.mVertices; - mDeleteButton.setEnabled(selectedEdge != null || selectedVertices != null); - } - } - - - // Invoked by the graph panel - @Override - public void keyPressed(KeyEvent e) - { - if(e.getKeyCode() == KeyEvent.VK_DELETE && mGraphModelManager.isEditable()) - { - mGraphPanel.deleteSelection(); - } - } - - - // Invoked by the delete button - @Override - public void actionPerformed(ActionEvent ae) - { - if(mGraphModelManager != null && mGraphModelManager.isEditable()) - { - mGraphPanel.deleteSelection(); - } - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/controller/EdgeConstructionController.java b/src/main/java/com/c2kernel/gui/graph/controller/EdgeConstructionController.java deleted file mode 100644 index 87742f8..0000000 --- a/src/main/java/com/c2kernel/gui/graph/controller/EdgeConstructionController.java +++ /dev/null @@ -1,261 +0,0 @@ -package com.c2kernel.gui.graph.controller; - -import java.awt.Point; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.view.EditorModeListener; -import com.c2kernel.gui.graph.view.EditorToolBar; -import com.c2kernel.gui.graph.view.GraphPanel; - - -public class EdgeConstructionController extends MouseAdapter implements EditorModeListener -{ - private GraphModelManager mGraphModelManager = null; - private GraphPanel mGraphPanel = null; - private EditorToolBar mEditorToolBar = null; - - - /**********/ - /* States */ - /**********/ - private final Integer kOtherMode = new Integer(0); - private final Integer kWaitOrigin = new Integer(1); - private final Integer kWaitTerminus = new Integer(2); - - - /**********/ - /* Events */ - /**********/ - private final int kEdgeEntered = 0; - private final int kOtherEntered = 1; - private final int kPressOnVertex = 2; - private final int kDrag = 3; - private final int kReleaseOnTerminus = 4; - private final int kReleaseOnNothing = 5; - - - /***********/ - /* Actions */ - /***********/ - - private interface Action - { - public void doIt(Object data); - } - - - private Action mSetOriginVertex = new Action() - { - @Override - public void doIt(Object data) - { - if(mGraphModelManager != null) - { - mGraphModelManager.getModel().setNewEdgeOriginVertex((Vertex)data); - } - } - }; - - - private Action mSetEndPoint = new Action() - { - @Override - public void doIt(Object data) - { - if(mGraphModelManager != null) - { - Point mouse = (Point)data; - mGraphModelManager.getModel().setNewEdgeEndPoint(new GraphPoint(mouse.x, mouse.y)); - } - } - }; - - - private Action mClearEdge = new Action() - { - @Override - public void doIt(Object data) - { - if(mGraphModelManager != null) - { - mGraphModelManager.getModel().setNewEdgeOriginVertex(null); - mGraphModelManager.getModel().setNewEdgeEndPoint(null); - } - } - }; - - - private Action mCreateEdge = new Action() - { - @Override - public void doIt(Object data) - { - if((mGraphModelManager != null) && (mEditorToolBar != null) && mGraphModelManager.isEditable()) - { - mGraphModelManager.getModel().createDirectedEdge - ( - mGraphModelManager.getModel().getNewEdgeOriginVertex(), - (Vertex)data, - mEditorToolBar.getSelectedEdgeType() - ); - mGraphModelManager.getModel().setNewEdgeOriginVertex(null); - mGraphModelManager.getModel().setNewEdgeEndPoint(null); - } - } - }; - - - /***********************************/ - /* Finite State Transition Network */ - /***********************************/ - - private Object[][][] mFSTN = - {// OtherMode WaitOrigin WaitTerminus - /* EdgeEntered */ {{null, kWaitOrigin}, null , null }, - /* OtherEntered */ { null , {null , kOtherMode} , null }, - /* PressOnVertex */ { null , {mSetOriginVertex, kWaitTerminus}, null }, - /* Drag */ { null , null , {mSetEndPoint, null} }, - /* ReleaseOnTerminus */ { null , null , {mCreateEdge , kWaitOrigin}}, - /* ReleaseOnNothing */ { null , null , {mClearEdge , kWaitOrigin}} - }; - - - /*****************/ - /* Current state */ - /*****************/ - - private Integer mState = kOtherMode; - - - /**************************/ - /* Event processing logic */ - /**************************/ - - private void processEvent(int event, Object data) - { - Object[] transition = mFSTN[event][mState.intValue()]; - Action action = null; - Integer nextState = null; - - if(transition != null) - { - action = (Action)transition[0]; - nextState = (Integer)transition[1]; - - if(action != null) - { - action.doIt(data); - } - - if(nextState != null) - { - mState = nextState; - } - } - } - - - /********************/ - /* Public interface */ - /********************/ - - public void setGraphModelManager(GraphModelManager graphModelManager) - { - mGraphModelManager = graphModelManager; - } - - public void setGraphPanel(GraphPanel graphPanel) - { - mGraphPanel = graphPanel; - } - - - public void setEditorToolBar(EditorToolBar editorToolBar) - { - mEditorToolBar = editorToolBar; - mEditorToolBar.addEditorModeListener(this); - } - - - @Override - public void editorModeChanged(String idOfNewMode) - { - if(idOfNewMode.equals("Edge")) - { - processEvent(kEdgeEntered, null); - } - else - { - processEvent(kOtherEntered, null); - } - } - - - @Override - public void mousePressed(MouseEvent me) - { - Vertex vertex = null; - Point mousePoint = null; - - if(mGraphModelManager != null && mGraphPanel != null) - { - // Determine if there is a vertex under the mouse cursor - mousePoint = me.getPoint(); - vertex = mGraphPanel.getVertex(new GraphPoint(mousePoint.x, mousePoint.y)); - - // If the mouse has been pressed on a vertex - if(vertex != null) - { - processEvent(kPressOnVertex, vertex); - } - } - } - - - @Override - public void mouseReleased(MouseEvent me) - { - Vertex vertex = null; - Point mousePoint = null; - - if(mGraphModelManager != null && mGraphPanel != null) - { - // Determine if there is a vertex under the mouse cursor - mousePoint = me.getPoint(); - vertex = mGraphPanel.getVertex(new GraphPoint(mousePoint.x, mousePoint.y)); - - // If the mouse has been released on a vertex which is not the origin vertex - if((vertex != null) && (vertex != mGraphModelManager.getModel().getNewEdgeOriginVertex())) - { - processEvent(kReleaseOnTerminus, vertex); - } - else - { - processEvent(kReleaseOnNothing, null); - } - } - } - - - @Override - public void mouseExited(MouseEvent me) - { - } - - - @Override - public void mouseDragged(MouseEvent me) - { - processEvent(kDrag, me.getPoint()); - } - - - @Override - public void mouseMoved(MouseEvent me) - { - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/controller/ElasticBand.java b/src/main/java/com/c2kernel/gui/graph/controller/ElasticBand.java deleted file mode 100644 index b458ddf..0000000 --- a/src/main/java/com/c2kernel/gui/graph/controller/ElasticBand.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.c2kernel.gui.graph.controller; - -import com.c2kernel.graph.model.GraphPoint; - - - -public class ElasticBand -{ - public GraphPoint mFixedCorner = null; - public GraphPoint mMovingCorner = null; - - - public ElasticBand(GraphPoint fixedCorner, GraphPoint movingCorner) - { - mFixedCorner = fixedCorner; - mMovingCorner = movingCorner; - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/controller/MultiSelectionDragController.java b/src/main/java/com/c2kernel/gui/graph/controller/MultiSelectionDragController.java deleted file mode 100644 index ed9d6a1..0000000 --- a/src/main/java/com/c2kernel/gui/graph/controller/MultiSelectionDragController.java +++ /dev/null @@ -1,574 +0,0 @@ -package com.c2kernel.gui.graph.controller; - -import java.awt.Point; -import java.awt.event.InputEvent; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.graph.model.GraphableVertex; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.view.EditorModeListener; -import com.c2kernel.gui.graph.view.GraphPanel; - - -public class MultiSelectionDragController -extends MouseAdapter -implements EditorModeListener, KeyListener -{ - - private class ResizeInf - { - public int mMousePressedX = 0; - public int mMousePressedY = 0; - public Vertex mSelectedVertex = null; - public GraphPoint[] mOldOutline = null; - public int mCentreX = 0; - public int mCentreY = 0; - public int mOldHeight = 0; - public int mOldWidth = 0; - } - private ResizeInf mResizeInf = new ResizeInf(); - - private class DispForSelection - { - public int mXDisp = 0; - public int mYDisp = 0; - } - private DispForSelection mDispForSelection = null; - - private class VertexAndDisp - { - public Vertex mVertex = null; - public int mXDisp = 0; - public int mYDisp = 0; - } - - protected GraphModelManager mGraphModelManager = null; - private GraphPanel mGraphPanel = null; - - - /**********/ - /* States */ - /**********/ - protected final Integer kOtherMode = new Integer(0); - protected final Integer kWaiting = new Integer(1); - protected final Integer kResizing = new Integer(2); - protected final Integer kDraggingSelection = new Integer(3); - protected final Integer kStretching = new Integer(4); - - - /**********/ - /* Events */ - /**********/ - protected final int kSelectEntered = 0; - protected final int kOtherEntered = 1; - protected final int kPressOnEdge = 2; - protected final int kPressOnVertex = 3; - protected final int kPressOnSelection = 4; - protected final int kPressOnResizePad = 5; - protected final int kCTRLPressOnVertex = 6; - protected final int kCTRL_A = 7; - protected final int kPressOnNothing = 8; - protected final int kDrag = 9; - protected final int kRelease = 10; - protected final int kZoomIn = 11; - - /***********/ - /* Actions */ - /***********/ - - protected interface Action - { - public void doIt(Object data); - } - - - protected Action mStoreResizeInf = new Action() - { - @Override - public void doIt(Object data) - { - Point mousePoint = (Point)data; - GraphPoint centre = null; - - mResizeInf.mMousePressedX = mousePoint.x; - mResizeInf.mMousePressedY = mousePoint.y; - mResizeInf.mSelectedVertex = mGraphPanel.getSelection().mVertices[0]; - mResizeInf.mOldOutline = mResizeInf.mSelectedVertex.getOutlinePoints(); - centre = mResizeInf.mSelectedVertex.getCentrePoint(); - mResizeInf.mCentreX = centre.x; - mResizeInf.mCentreY = centre.y; - mResizeInf.mOldHeight = mResizeInf.mSelectedVertex.getHeight(); - mResizeInf.mOldWidth = mResizeInf.mSelectedVertex.getWidth(); - } - }; - - - protected Action mResizeVertex = new Action() - { - @Override - public void doIt(Object data) - { - Point mousePoint = (Point)data; - int resizeX = 0; - int resizeY = 0; - - - // Calculate how much the old outline should be resized - resizeX = mousePoint.x - mResizeInf.mMousePressedX; - resizeY = mousePoint.y - mResizeInf.mMousePressedY; - - // Clip the resize so that outline does not get any - // smaller than 10 x 10 pixels - if(resizeX < -mResizeInf.mOldWidth/2 + 10) - { - resizeX = -mResizeInf.mOldWidth/2 + 10; - } - - if(resizeY < -mResizeInf.mOldHeight/2 + 10) - { - resizeY = -mResizeInf.mOldHeight/2 + 10; - } - - if (mGraphModelManager.isEditable()) { - mResizeInf.mSelectedVertex.setOutlinePoints(newOutline(resizeX, resizeY)); - mGraphModelManager.forceNotify(); - } - } - - - private GraphPoint[] newOutline(int resizeX, int resizeY) - { - GraphPoint[] newOutline = new GraphPoint[mResizeInf.mOldOutline.length]; - int x = 0; - int y = 0; - int i = 0; - - - for(i=0; i mResizeInf.mCentreX) - { - x = mResizeInf.mOldOutline[i].x + resizeX; - } - else if(mResizeInf.mOldOutline[i].x < mResizeInf.mCentreX) - { - x = mResizeInf.mOldOutline[i].x - resizeX; - } - else - { - x = mResizeInf.mOldOutline[i].x; - } - - if(mResizeInf.mOldOutline[i].y > mResizeInf.mCentreY) - { - y = mResizeInf.mOldOutline[i].y + resizeY; - } - else if(mResizeInf.mOldOutline[i].y < mResizeInf.mCentreY) - { - y = mResizeInf.mOldOutline[i].y - resizeY; - } - else - { - y = mResizeInf.mOldOutline[i].y; - } - - newOutline[i] = new GraphPoint(x, y); - } - - return newOutline; - } - }; - - - protected Action mSelectEdge = new Action() - { - @Override - public void doIt(Object data) - { - Selection selection = new Selection((DirectedEdge)data, null, 0, 0, 0, 0); - - mGraphPanel.setSelection(selection); - } - }; - - - protected Action mSelectVertexAndStoreDisp = new Action() - { - @Override - public void doIt(Object data) - { - VertexAndDisp vertexAndDisp = (VertexAndDisp)data; - GraphPoint centrePoint = vertexAndDisp.mVertex.getCentrePoint(); - Selection selection = new Selection(null, - new Vertex[] {vertexAndDisp.mVertex}, - centrePoint.x, - centrePoint.y, - centrePoint.x, - centrePoint.y); - - mGraphPanel.setSelection(selection); - mDispForSelection = new DispForSelection(); - mDispForSelection.mXDisp = vertexAndDisp.mXDisp; - mDispForSelection.mYDisp = vertexAndDisp.mYDisp; - } - }; - - - protected Action mStoreDisp = new Action() - { - @Override - public void doIt(Object data) - { - mDispForSelection = (DispForSelection)data; - } - }; - - - protected Action mToggleVertex = new Action() - { - @Override - public void doIt(Object data) - { - Vertex vertex = (Vertex)data; - - if(mGraphPanel.inSelection(vertex)) - { - mGraphPanel.removeFromSelection(vertex); - } - else - { - mGraphPanel.addToSelection(vertex); - } - } - }; - - - protected Action mSelectAll = new Action() - { - @Override - public void doIt(Object data) - { - mGraphPanel.selectAll(); - } - }; - - - protected Action mCreateBand = new Action() - { - @Override - public void doIt(Object data) - { - Point mouse = (Point)data; - GraphPoint fixedCorner = new GraphPoint(mouse.x, mouse.y); - - mGraphPanel.setElasticBand(new ElasticBand(fixedCorner, fixedCorner)); - } - }; - - - protected Action mMoveSelection = new Action() - { - @Override - public void doIt(Object data) - { - Point mousePoint = (Point)data; - int topLeftX = mousePoint.x - mDispForSelection.mXDisp; - int topLeftY = mousePoint.y - mDispForSelection.mYDisp; - if (mGraphModelManager.isEditable()) { - mGraphPanel.moveAbsoluteSelection(topLeftX, topLeftY); - } - } - }; - - - protected Action mResizeBand = new Action() - { - @Override - public void doIt(Object data) - { - Point mouse = (Point)data; - mGraphPanel.resizeElasticBand(new GraphPoint(mouse.x, mouse.y)); - } - }; - - - protected Action mSelectContents = new Action() - { - @Override - public void doIt(Object data) - { - mGraphPanel.selectContentsOfElasticBand(); - } - }; - - protected Action mZoomIn = new Action() - { - @Override - public void doIt(Object data) // data is the clicked vertex - { - // Need to get child graph model out of the vertex before we can zoom in - if (data instanceof Vertex) { - Vertex zoomTo = (Vertex)data; - if (((GraphableVertex)zoomTo).getIsComposite()) mGraphModelManager.zoomIn(zoomTo); - } - } - }; - - /***********************************/ - /* Finite State Transition Network */ - /***********************************/ - - protected Object[][][] mFSTN = - {// OtherMode Waiting Resizing DraggingSelection Stretching - /* SelectEntered */ {{null, kWaiting}, null , null , null , null }, - /* OtherEntered */ { null , {null , kOtherMode }, null , null , null }, - /* PressOnEdge */ { null , {mSelectEdge , null }, null , null , null }, - /* PressOnVertex */ { null , {mSelectVertexAndStoreDisp, kDraggingSelection}, null , null , null }, - /* PressOnSelection */ { null , {mStoreDisp , kDraggingSelection}, null , null , null }, - /* PressOnResizePad */ { null , {mStoreResizeInf , kResizing }, null , null , null }, - /* CTRLPressOnVertex */ { null , {mToggleVertex , null }, null , null , null }, - /* CTRL_A */ { null , {mSelectAll , null }, null , null , null }, - /* PressOnNothing */ { null , {mCreateBand , kStretching }, null , null , null }, - /* Drag */ { null , null , {mResizeVertex, null }, {mMoveSelection, null }, {mResizeBand , null }}, - /* Release */ { null , null , {null , kWaiting}, {null , kWaiting}, {mSelectContents, kWaiting}}, - /* Double Click */ { null , {mZoomIn , null }, null , null , null }, - }; - - - /*****************/ - /* Current state */ - /*****************/ - - private Integer mState = kWaiting; - - /**************************/ - /* Event processing logic */ - /**************************/ - - protected void processEvent(int event, Object data) - { - Object[] transition = mFSTN[event][mState.intValue()]; - Action action = null; - Integer nextState = null; - - if(transition != null) - { - action = (Action)transition[0]; - nextState = (Integer)transition[1]; - - if(action != null) - { - action.doIt(data); - } - - if(nextState != null) - { - mState = nextState; - } - } - } - - - /********************/ - /* Public interface */ - /********************/ - - - public MultiSelectionDragController(GraphModelManager graphModelManager, - GraphPanel graphPanel) { - mGraphModelManager = graphModelManager; - mGraphPanel = graphPanel; - } - - @Override - public void editorModeChanged(String idOfNewMode) - { - if(idOfNewMode.equals("Select")) - { - processEvent(kSelectEntered, null); - } - else - { - processEvent(kOtherEntered, null); - } - } - - - @Override - public void mousePressed(MouseEvent me) - { - int modifiers = me.getModifiers(); - - if(mGraphModelManager != null) - { - if((modifiers & InputEvent.CTRL_MASK) == 0) - { - mousePressedWithoutCTRL(me.getPoint()); - } - else - { - mousePressedWithCTRL(me.getPoint()); - } - } - } - - @Override - public void mouseClicked(MouseEvent me) - { - if (me.getClickCount() == 2) { // want double click - Point clickedSpot = me.getPoint(); - GraphPoint mouseGPoint = new GraphPoint(clickedSpot.x, clickedSpot.y); - Vertex clicked = mGraphPanel.getVertex(mouseGPoint); - if (clicked != null) - processEvent(kZoomIn, clicked); - } - } - - private void mousePressedWithoutCTRL(Point mousePoint) - { - GraphPoint mouseGPoint = new GraphPoint(mousePoint.x, mousePoint.y); - DirectedEdge edge = mGraphPanel.getEdge(mouseGPoint); - Vertex vertex = mGraphPanel.getVertex(mouseGPoint); - GraphPoint vertexCentrePoint = null; - VertexAndDisp vertexAndDisp = null; - Selection selection = null; - DispForSelection dispForSelection = null; - - - // In order of priority: - // 1. Click on resize pad - // 2. Click on vertex - // 3. Click on edge - if(onResizePad(mouseGPoint)) - { - processEvent(kPressOnResizePad, mousePoint); - } - else if(vertex != null) - { - if(mGraphPanel.inSelection(vertex)) - { - selection = mGraphPanel.getSelection(); - dispForSelection = new DispForSelection(); - dispForSelection.mXDisp = mousePoint.x - selection.mTopLeftX; - dispForSelection.mYDisp = mousePoint.y - selection.mTopLeftY; - - processEvent(kPressOnSelection, dispForSelection); - } - else - { - vertexCentrePoint = vertex.getCentrePoint(); - - vertexAndDisp = new VertexAndDisp(); - vertexAndDisp.mVertex = vertex; - vertexAndDisp.mXDisp = mousePoint.x - vertexCentrePoint.x; - vertexAndDisp.mYDisp = mousePoint.y - vertexCentrePoint.y; - - processEvent(kPressOnVertex, vertexAndDisp); - } - } - // vertex == null - else - { - if(edge == null) - { - processEvent(kPressOnNothing, mousePoint); - } - else - { - processEvent(kPressOnEdge, edge); - } - } - } - - - private boolean onResizePad(GraphPoint mouseGPoint) - { - Selection selection = mGraphPanel.getSelection(); - GraphPoint vertexCentre = null; - int bottomRightX = 0; - int bottomRightY = 0; - - - if(selection.mVertices == null) return false; - - if(selection.mVertices.length == 1) - { - vertexCentre = selection.mVertices[0].getCentrePoint(); - if (vertexCentre == null) return false; - bottomRightX = vertexCentre.x + selection.mVertices[0].getWidth()/2; - bottomRightY = vertexCentre.y + selection.mVertices[0].getHeight()/2; - - return - ( - (mouseGPoint.x > bottomRightX) && - (mouseGPoint.x < bottomRightX + 10) && - (mouseGPoint.y > bottomRightY) && - (mouseGPoint.y < bottomRightY + 10) - ); - } - else - { - return false; - } - } - - - private void mousePressedWithCTRL(Point mousePoint) - { - Vertex vertex = mGraphPanel.getVertex(new GraphPoint(mousePoint.x, mousePoint.y)); - - if(vertex != null) - { - processEvent(kCTRLPressOnVertex, vertex); - } - } - - - @Override - public void mouseReleased(MouseEvent me) - { - processEvent(kRelease, null); - } - - - @Override - public void mouseMoved(MouseEvent me) - { - } - - - @Override - public void mouseDragged(MouseEvent e) - { - processEvent(kDrag, e.getPoint()); - } - - - @Override - public void keyPressed(KeyEvent e) - { - if((e.getKeyCode() == KeyEvent.VK_A) && e.isControlDown()) - { - processEvent(kCTRL_A, null); - } - } - - - @Override - public void keyReleased(KeyEvent e) - { - } - - - @Override - public void keyTyped(KeyEvent e) - { - } - -} diff --git a/src/main/java/com/c2kernel/gui/graph/controller/Selection.java b/src/main/java/com/c2kernel/gui/graph/controller/Selection.java deleted file mode 100644 index 3700e44..0000000 --- a/src/main/java/com/c2kernel/gui/graph/controller/Selection.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.c2kernel.gui.graph.controller; - -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.Vertex; - - - -public class Selection -{ - // Either a single edge can be selected or - // one or more vertices can be selected. - // It is impossible to select an edge and a - // vertex at the same time. - public DirectedEdge mEdge = null; - public Vertex[] mVertices = null; - public int mTopLeftX = 0; - public int mTopLeftY = 0; - public int mBottomRightX = 0; - public int mBottomRightY = 0; - - - public Selection(DirectedEdge edge, - Vertex[] vertices, - int topLeftX, - int topLeftY, - int bottomRightX, - int bottomRightY) - { - mEdge = edge; - mVertices = vertices; - mTopLeftX = topLeftX; - mTopLeftY = topLeftY; - mBottomRightX = bottomRightX; - mBottomRightY = bottomRightY; - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/controller/StartVertexController.java b/src/main/java/com/c2kernel/gui/graph/controller/StartVertexController.java deleted file mode 100644 index 41a53b3..0000000 --- a/src/main/java/com/c2kernel/gui/graph/controller/StartVertexController.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.c2kernel.gui.graph.controller; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Observable; -import java.util.Observer; - -import javax.swing.JButton; - -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.event.SelectionChangedEvent; - - -// The start vertex controller is responsible for selecting -// the vertex at the start of the graph. -// -// The controller listens to: -// * The graph model to determine if there is a single -// vertex selected -// * The start vertex button -// -// The controller modifies: -// * The graph model to select the start vertex -// * The start button to enable it only when there is a -// single vertex selected -public class StartVertexController implements Observer, ActionListener -{ - private GraphModelManager mGraphModelManager = null; - private JButton mStartButton = null; - private Vertex selectedVertex = null; - - - public void setGraphModelManager(GraphModelManager graphModelManager) - { - mGraphModelManager = graphModelManager; - mGraphModelManager.addObserver(this); - } - - - public void setStartButton(JButton startButton) - { - mStartButton = startButton; - mStartButton.addActionListener(this); - } - - - @Override - public void update(Observable o, Object arg) - { - SelectionChangedEvent event = null; - Vertex[] selectedVertices = null; - - // If the selected vertex has changed - if(arg instanceof SelectionChangedEvent && mStartButton != null) - { - event = (SelectionChangedEvent)arg; - selectedVertices = event.mSelection.mVertices; - - if(selectedVertices == null || selectedVertices.length != 1) - { - mStartButton.setEnabled(false); - } - else if (mGraphModelManager.isEditable()) - { - mStartButton.setEnabled(true); - selectedVertex = selectedVertices[0]; - } - } - } - - - @Override - public void actionPerformed(ActionEvent ae) - { - if(selectedVertex != null) - { - mGraphModelManager.getModel().setStartVertexId(selectedVertex.getID()); - } - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/controller/VertexConstructionController.java b/src/main/java/com/c2kernel/gui/graph/controller/VertexConstructionController.java deleted file mode 100644 index 849675e..0000000 --- a/src/main/java/com/c2kernel/gui/graph/controller/VertexConstructionController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.c2kernel.gui.graph.controller; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.graph.view.EditorModeListener; -import com.c2kernel.gui.graph.view.EditorToolBar; - - -public class VertexConstructionController extends MouseAdapter implements EditorModeListener -{ - private GraphModelManager mGraphModelManager = null; - private EditorToolBar mEditorToolBar = null; - private boolean mCreatingVertices = false; - - - public void setGraphModelManager(GraphModelManager graphModelManager) - { - mGraphModelManager = graphModelManager; - } - - - public void setEditorToolBar(EditorToolBar editorToolBar) - { - mEditorToolBar = editorToolBar; - mEditorToolBar.addEditorModeListener(this); - } - - - @Override - public void editorModeChanged(String idOfNewMode) - { - mCreatingVertices = idOfNewMode.equals("Vertex"); - } - - - @Override - public void mouseClicked(MouseEvent me) - { - if(mCreatingVertices && (mGraphModelManager != null) && (mEditorToolBar != null) && mGraphModelManager.isEditable()) - { - try { - mGraphModelManager.getModel().createVertex(new GraphPoint(me.getPoint().x, me.getPoint().y), mEditorToolBar.getSelectedVertexType()); - } catch (Exception e) { - MainFrame.exceptionDialog(e); - } - mEditorToolBar.enterSelectMode(); - } - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/event/ElasticBandResizedEvent.java b/src/main/java/com/c2kernel/gui/graph/event/ElasticBandResizedEvent.java deleted file mode 100644 index 2ddfd39..0000000 --- a/src/main/java/com/c2kernel/gui/graph/event/ElasticBandResizedEvent.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.c2kernel.gui.graph.event; - -import com.c2kernel.graph.event.GraphModelEvent; - - -public class ElasticBandResizedEvent extends GraphModelEvent -{ -} diff --git a/src/main/java/com/c2kernel/gui/graph/event/ElasticBandSetEvent.java b/src/main/java/com/c2kernel/gui/graph/event/ElasticBandSetEvent.java deleted file mode 100644 index 324ce80..0000000 --- a/src/main/java/com/c2kernel/gui/graph/event/ElasticBandSetEvent.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.c2kernel.gui.graph.event; - -import com.c2kernel.graph.event.GraphModelEvent; - - -public class ElasticBandSetEvent extends GraphModelEvent -{ -} diff --git a/src/main/java/com/c2kernel/gui/graph/event/SelectionChangedEvent.java b/src/main/java/com/c2kernel/gui/graph/event/SelectionChangedEvent.java deleted file mode 100644 index a6aecbb..0000000 --- a/src/main/java/com/c2kernel/gui/graph/event/SelectionChangedEvent.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.c2kernel.gui.graph.event; - -import com.c2kernel.graph.event.GraphModelEvent; -import com.c2kernel.gui.graph.controller.Selection; - - -public class SelectionChangedEvent extends GraphModelEvent -{ - public Selection mSelection = null; -} diff --git a/src/main/java/com/c2kernel/gui/graph/event/SelectionMovedEvent.java b/src/main/java/com/c2kernel/gui/graph/event/SelectionMovedEvent.java deleted file mode 100644 index ae1f840..0000000 --- a/src/main/java/com/c2kernel/gui/graph/event/SelectionMovedEvent.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.c2kernel.gui.graph.event; - -import com.c2kernel.graph.event.GraphModelEvent; - - - -public class SelectionMovedEvent extends GraphModelEvent -{ -} diff --git a/src/main/java/com/c2kernel/gui/graph/view/DefaultDirectedEdgeRenderer.java b/src/main/java/com/c2kernel/gui/graph/view/DefaultDirectedEdgeRenderer.java deleted file mode 100644 index e0d02c0..0000000 --- a/src/main/java/com/c2kernel/gui/graph/view/DefaultDirectedEdgeRenderer.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.c2kernel.gui.graph.view; - -import java.awt.Graphics2D; -import java.awt.Paint; -import java.awt.Shape; -import java.awt.geom.AffineTransform; -import java.awt.geom.GeneralPath; - -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.GraphPoint; - - -public class DefaultDirectedEdgeRenderer implements DirectedEdgeRenderer -{ - private GeneralPath mArrowTemplate = new GeneralPath(); - private Paint mLinePaint = null; - - - public DefaultDirectedEdgeRenderer(Paint linePaint) - { - mLinePaint = linePaint; - - mArrowTemplate.moveTo(-5, 5); - mArrowTemplate.lineTo( 0, 0); - mArrowTemplate.lineTo( 5, 5); - } - - - @Override - public void draw(Graphics2D g2d, DirectedEdge directedEdge) - { - GraphPoint originPoint = directedEdge.getOriginPoint(); - GraphPoint terminusPoint = directedEdge.getTerminusPoint(); - GraphPoint midPoint = new GraphPoint(); - AffineTransform transform = new AffineTransform(); - Shape arrow = null; - - g2d.setPaint(mLinePaint); - g2d.drawLine(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y); - - midPoint.x = originPoint.x + (terminusPoint.x - originPoint.x)/2; - midPoint.y = originPoint.y + (terminusPoint.y - originPoint.y)/2; - - transform.translate(midPoint.x, midPoint.y); - transform.rotate(calcArrowAngle(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y)); - - arrow = mArrowTemplate.createTransformedShape(transform); - - g2d.draw(arrow); - } - - - private static double calcArrowAngle(int originX, int originY, int terminusX, int terminusY) { - double width = terminusX - originX; - double height = terminusY - originY; - - if((width == 0) && (height > 0)) return Math.PI; - - if((width == 0) && (height < 0)) return 0; - - if((width > 0) && (height == 0)) return Math.PI/2.0; - - if((width < 0) && (height == 0)) return -1.0 * Math.PI/2.0; - - if((width > 0) && (height > 0)) return Math.PI/2.0 + Math.atan(Math.abs(height)/Math.abs(width)); - - if((width > 0) && (height < 0)) return Math.atan(Math.abs(width)/Math.abs(height)); - - if((width < 0) && (height < 0)) return -1.0 * Math.atan(Math.abs(width)/Math.abs(height)); - - if((width < 0) && (height > 0)) return -1.0 * (Math.PI/2.0 + Math.atan(Math.abs(height)/Math.abs(width))); - - return 0.0; - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/view/DefaultVertexRenderer.java b/src/main/java/com/c2kernel/gui/graph/view/DefaultVertexRenderer.java deleted file mode 100644 index c8804e2..0000000 --- a/src/main/java/com/c2kernel/gui/graph/view/DefaultVertexRenderer.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.c2kernel.gui.graph.view; - -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Paint; -import java.awt.Polygon; - -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.graph.model.Vertex; - - -public class DefaultVertexRenderer implements VertexRenderer -{ - private Paint mLinePaint = null; - private Paint mTextPaint = null; - private Paint mFillPaint = null; - - - public DefaultVertexRenderer(Paint linePaint, Paint textPaint, Paint fillPaint) - { - mLinePaint = linePaint; - mTextPaint = textPaint; - mFillPaint = fillPaint; - } - - - @Override - public void draw(Graphics2D g2d, Vertex vertex) - { - GraphPoint[] outlinePoints = vertex.getOutlinePoints(); - GraphPoint centrePoint = vertex.getCentrePoint(); - Polygon outline = new Polygon(); - - String vertexName = vertex.getName(); - FontMetrics metrics = g2d.getFontMetrics(); - int textWidth = metrics.stringWidth(vertexName); - int textHeight = metrics.getHeight(); - int textX = centrePoint.x - textWidth/2; - int textY = centrePoint.y + textHeight/3; - - int i = 0; - - - // Construct a shape in the outline of the vertex - for(i=0; i mListenerVector = new Vector(10, 10); - public EditorToolBar(boolean edgeCreationMode, // True if edges can be created - JButton[] otherButtons, GraphPanel graphP) - { - super(BoxLayout.X_AXIS); - mGraphPanel = graphP; - mEdgeCreationMode = edgeCreationMode; - mOtherButtons = otherButtons; - prepareModeButtons(); - mStartVertexController.setStartButton(mStartButton); - mDeletionController.setDeleteButton(mDeleteButton); - createLayout(); - createListeners(); - } - protected void prepareModeButtons() - { - // Set the tool tip texts - mVertexModeButton.setToolTipText(Language.translate("Create vertex")); - mSelectModeButton.setToolTipText(Language.translate("Multi-select and drag")); - mEdgeModeButton.setToolTipText(Language.translate("Create edge")); - mStartButton.setToolTipText(Language.translate("Select the start vertex of the graph")); - mDeleteButton.setToolTipText(Language.translate("Delete the selection")); - mPrintButton.setToolTipText(Language.translate("Print this graph")); - mCopyButton.setToolTipText(Language.translate("Copy an image of this graph to the clipboard")); - // Set the button margins to 0 - mVertexModeButton.setMargin(new Insets(0, 0, 0, 0)); - mSelectModeButton.setMargin(new Insets(0, 0, 0, 0)); - mEdgeModeButton.setMargin(new Insets(0, 0, 0, 0)); - // The initial mode is select mode - mSelectModeButton.setSelected(true); - // Add the mode buttons to the mode button group - mModeButtonGroup.add(mVertexModeButton); - mModeButtonGroup.add(mSelectModeButton); - mModeButtonGroup.add(mEdgeModeButton); - // Add the action listeners - mVertexModeButton.addActionListener(new ModeButtonListener("Vertex")); - mSelectModeButton.addActionListener(new ModeButtonListener("Select")); - mEdgeModeButton.addActionListener(new ModeButtonListener("Edge")); - } - public void enterSelectMode() - { - mSelectModeButton.setSelected(true); - notifyListeners("Select"); - } - public void updateVertexTypes(TypeNameAndConstructionInfo[] typeNameAndConstructionInfo) - { - int i = 0; - mVertexTypeBox.removeAllItems(); - for (i = 0; i < typeNameAndConstructionInfo.length; i++) - { - mVertexTypeBox.addItem(typeNameAndConstructionInfo[i]); - } - } - public void updateEdgeTypes(TypeNameAndConstructionInfo[] typeNameAndConstructionInfo) - { - int i = 0; - mEdgeTypeBox.removeAllItems(); - for (i = 0; i < typeNameAndConstructionInfo.length; i++) - { - mEdgeTypeBox.addItem(typeNameAndConstructionInfo[i]); - } - } - public TypeNameAndConstructionInfo getSelectedVertexType() - { - return (TypeNameAndConstructionInfo) mVertexTypeBox.getSelectedItem(); - } - public TypeNameAndConstructionInfo getSelectedEdgeType() - { - return (TypeNameAndConstructionInfo) mEdgeTypeBox.getSelectedItem(); - } - protected void createLayout() - { - int i = 0; - add(mSelectModeButton); - add(mVertexModeButton); - add(mVertexTypeBox); - add(Box.createHorizontalStrut(10)); - if (mEdgeCreationMode) - { - add(mEdgeModeButton); - add(mEdgeTypeBox); - } - add(Box.createGlue()); - mPrintButton.setEnabled(true); - mPrintButton.setMargin(new Insets(0, 0, 0, 0)); - add(mPrintButton); - mCopyButton.setEnabled(true); - mCopyButton.setMargin(new Insets(0, 0, 0, 0)); - add(mCopyButton); - mStartButton.setEnabled(false); - mStartButton.setMargin(new Insets(0, 0, 0, 0)); - mDeleteButton.setEnabled(false); - mDeleteButton.setMargin(new Insets(0, 0, 0, 0)); - add(mDeleteButton); - add(Box.createRigidArea(new Dimension(20, 0))); - add(mStartButton); - if (mOtherButtons != null) - { - for (i = 0; i < mOtherButtons.length; i++) - { - mOtherButtons[i].setMargin(new Insets(0, 0, 0, 0)); - add(mOtherButtons[i]); - } - } - } - protected void createListeners() - { - // The vertex mode button should be selected if the - // user select a vertex type from the vertex type box - mVertexTypeBox.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent ae) - { - mVertexModeButton.setSelected(true); - notifyListeners("Vertex"); - } - }); - // The edge mode button should be selected if the - // user select an edge type from the edge type box - mEdgeTypeBox.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent ae) - { - mEdgeModeButton.setSelected(true); - notifyListeners("Edge"); - } - }); - mPrintButton.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent ae) - { - PrinterJob _monJob = PrinterJob.getPrinterJob(); - if (_monJob.printDialog()) - _monJob.setPrintable(self()); - try - { - _monJob.print(); - } - catch (Exception ex) - { - } - } - }); - - try { - Class.forName("java.awt.datatransfer.DataFlavor").getDeclaredField("imageFlavor"); - mCopyButton.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent ae) - { - try - { - Image i = createImage(mGraphPanel.getWidth(),mGraphPanel.getHeight()); - Graphics g = i.getGraphics(); - mGraphPanel.paintComponent(g); - ImageTransferable it = new ImageTransferable(i, mGraphPanel.getWidth(), mGraphPanel.getHeight()); - Toolkit.getDefaultToolkit().getSystemClipboard().setContents(it, it); - } - catch (Exception e) - { - Logger.error(e); - } - } - }); - } catch (Exception ex) { //image clipboard transfer not supported - mCopyButton.setEnabled(false); - } - } - - protected class ImageTransferable implements Transferable, ClipboardOwner { - Image image; - int width,height; - DataFlavor javaImg; - public ImageTransferable(Image image, int width, int height) { - this.image = image; - this.width = width; - this.height = height; - try { - javaImg = new DataFlavor("image/x-java-image; class=java.awt.Image", "AWT Image"); - } catch (Exception ex){ } - } - @Override - public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { - if (!isDataFlavorSupported(flavor) || image == null) { - throw new UnsupportedFlavorException(flavor); - } - return image; - } - - @Override - public boolean isDataFlavorSupported(DataFlavor flavor) { - boolean result = in(flavor, getTransferDataFlavors()); - return result; - } - - @Override - public DataFlavor[] getTransferDataFlavors() { - return new DataFlavor[] { javaImg }; - } - protected boolean in(DataFlavor flavor, DataFlavor[] flavors) { - int f = 0; - while ((f < flavors.length) && !flavor.equals(flavors[f])) { - f++; - } - return f < flavors.length; - } - @Override - public void lostOwnership(Clipboard clipboard, Transferable contents) { - image = null; - } - } - - protected void notifyListeners(String newModeId) - { - int i = 0; - EditorModeListener listener = null; - for (i = 0; i < mListenerVector.size(); i++) - { - listener = mListenerVector.elementAt(i); - listener.editorModeChanged(newModeId); - } - } - public void setGraphModelManager(GraphModelManager graphModelManager) - { - mStartVertexController.setGraphModelManager(graphModelManager); - mDeletionController.setGraphModelManager(graphModelManager); - } - public void setGraphPanel(GraphPanel graphPanel) - { - graphPanel.addKeyListener(mDeletionController); - mDeletionController.setGraphPanel(graphPanel); - } - public void addEditorModeListener(EditorModeListener listener) - { - mListenerVector.add(listener); - } - public void removeEditorModeListener(EditorModeListener listener) - { - mListenerVector.remove(listener); - } - public void setGraphEditable(boolean editable) - { - mVertexModeButton.setEnabled(editable); - mEdgeModeButton.setEnabled(editable); - } - public EditorToolBar self() - { - return this; - } - @Override - public int print(Graphics g, PageFormat pf, int i) throws PrinterException - { - if (i >= 1) - { - return Printable.NO_SUCH_PAGE; - } - Graphics2D g2d = (Graphics2D) g; - double scalex = pf.getImageableWidth() / mGraphPanel.getWidth(); - double scaley = pf.getImageableHeight() / mGraphPanel.getHeight(); - double scale = Math.min(Math.min(scalex, scaley), 1); - g2d.translate(pf.getImageableX(), pf.getImageableY()); - g2d.scale(scale, scale); - mGraphPanel.printComponent(g2d); - return Printable.PAGE_EXISTS; - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/view/GraphPanel.java b/src/main/java/com/c2kernel/gui/graph/view/GraphPanel.java deleted file mode 100644 index ca309b1..0000000 --- a/src/main/java/com/c2kernel/gui/graph/view/GraphPanel.java +++ /dev/null @@ -1,611 +0,0 @@ -package com.c2kernel.gui.graph.view; -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Paint; -import java.awt.Polygon; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.Observable; -import java.util.Observer; -import java.util.Vector; - -import javax.swing.JPanel; - -import com.c2kernel.graph.event.EntireModelChangedEvent; -import com.c2kernel.graph.event.GraphModelResizedEvent; -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.ImageLoader; -import com.c2kernel.gui.graph.controller.ElasticBand; -import com.c2kernel.gui.graph.controller.Selection; -import com.c2kernel.gui.graph.event.ElasticBandResizedEvent; -import com.c2kernel.gui.graph.event.ElasticBandSetEvent; -import com.c2kernel.gui.graph.event.SelectionChangedEvent; -import com.c2kernel.gui.graph.event.SelectionMovedEvent; -public class GraphPanel extends JPanel implements Observer -{ - // There should always be a Selection object - protected Selection mSelection = new Selection(null, null, 0, 0, 0, 0); - private ElasticBand mElasticBand = null; - protected final Paint mSelectionPaint = Color.black; - protected final Paint mStartPaint = Color.green; - protected final Image mResizePadImg = ImageLoader.findImage("graph/resizepad.gif").getImage(); - protected final BasicStroke mDashed = - new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float[] { 5.0f }, 0.0f); - protected GraphModelManager mGraphModelManager = null; - protected VertexRenderer mVertexRenderer = null; - protected DirectedEdgeRenderer mDirectedEdgeRenderer = null; - private final SelectionChangedEvent mSelectionChangedEvent = new SelectionChangedEvent(); - private final SelectionMovedEvent mSelectionMovedEvent = new SelectionMovedEvent(); - private final ElasticBandResizedEvent mElasticBandResizedEvent = new ElasticBandResizedEvent(); - private final ElasticBandSetEvent mElasticBandSetEvent = new ElasticBandSetEvent(); - - public GraphPanel(DirectedEdgeRenderer eRenderer, VertexRenderer vRenderer) - { - mVertexRenderer = vRenderer; - mDirectedEdgeRenderer = eRenderer; - // Request the keyboard focus if the mouse - // is pressed on the graph panel - addMouseListener(new MouseAdapter() - { - @Override - public void mousePressed(MouseEvent me) - { - requestFocus(); - } - }); - } - public void setGraphModelManager(GraphModelManager graphModelManager) - { - mGraphModelManager = graphModelManager; - } - @Override - public void update(Observable o, Object arg) - { - if (arg instanceof EntireModelChangedEvent) - { - mSelection = new Selection(null, null, 0, 0, 0, 0); - } - if (arg instanceof GraphModelResizedEvent || arg instanceof EntireModelChangedEvent) - { - setPreferredSize(new Dimension(mGraphModelManager.getModel().getWidth(), mGraphModelManager.getModel().getHeight())); - revalidate(); - } - repaint(); - } - // Updates the top left and bottom right corners of the selection - private void updateSelectionCorners() { - Vertex vertex = mSelection.mVertices[0]; - GraphPoint centrePoint = vertex.getCentrePoint(); - if (centrePoint == null) return; - mSelection.mTopLeftX = centrePoint.x; - mSelection.mTopLeftY = centrePoint.y; - mSelection.mBottomRightX = centrePoint.x; - mSelection.mBottomRightY = centrePoint.y; - for (Vertex mVertice : mSelection.mVertices) { - vertex = mVertice; - centrePoint = vertex.getCentrePoint(); - if (centrePoint.x < mSelection.mTopLeftX) { - mSelection.mTopLeftX = centrePoint.x; - } - if (centrePoint.y < mSelection.mTopLeftY) { - mSelection.mTopLeftY = centrePoint.y; - } - if (centrePoint.x > mSelection.mBottomRightX) { - mSelection.mBottomRightX = centrePoint.x; - } - if (centrePoint.y > mSelection.mBottomRightY) { - mSelection.mBottomRightY = centrePoint.y; - } - } - } - - public void deleteSelection() { - int i = 0; - if (mSelection.mVertices != null) { - for (i = 0; i < mSelection.mVertices.length; i++) { - mGraphModelManager.getModel().removeVertex(mSelection.mVertices[i]); - } - } - else if (mSelection.mEdge != null) { - mGraphModelManager.getModel().removeEdge(mSelection.mEdge); - } - // Make sure nothing is selected - if ((mSelection.mEdge != null) || (mSelection.mVertices != null)) { - mSelection.mEdge = null; - mSelection.mVertices = null; - mSelectionChangedEvent.mSelection = mSelection; - mGraphModelManager.notifyObservers(mSelectionChangedEvent); - } - } - - public void selectAll() { - Vertex[] allVertices = mGraphModelManager.getModel().getVertices(); - if (allVertices.length > 0) { - mSelection.mEdge = null; - mSelection.mVertices = allVertices; - updateSelectionCorners(); - mSelectionChangedEvent.mSelection = mSelection; - mGraphModelManager.notifyObservers(mSelectionChangedEvent); - } - } - - public void selectContentsOfElasticBand() { - if (mElasticBand == null) return; - Polygon bandPolygon = new Polygon(); - Vertex[] allVertices = mGraphModelManager.getModel().getVertices(); - GraphPoint centrePoint = null; - Vector verticesInside = new Vector(10, 10); - int i = 0; - // Create a polygon representing the elastic band - bandPolygon.addPoint(mElasticBand.mFixedCorner.x, mElasticBand.mFixedCorner.y); - bandPolygon.addPoint(mElasticBand.mMovingCorner.x, mElasticBand.mFixedCorner.y); - bandPolygon.addPoint(mElasticBand.mMovingCorner.x, mElasticBand.mMovingCorner.y); - bandPolygon.addPoint(mElasticBand.mFixedCorner.x, mElasticBand.mMovingCorner.y); - // Create a vector of all of the vertices within the elastic band polygon - for (i = 0; i < allVertices.length; i++) { - centrePoint = allVertices[i].getCentrePoint(); - if (bandPolygon.contains(centrePoint.x, centrePoint.y)) { - verticesInside.add(allVertices[i]); - } - } - - // Select the vertices found within the elastic band polygon - if (verticesInside.size() == 0) { - mSelection.mTopLeftX = 0; - mSelection.mTopLeftY = 0; - mSelection.mBottomRightX = 0; - mSelection.mBottomRightY = 0; - mSelection.mEdge = null; - // select parent vertex if we have selected the 'paper' - if (mGraphModelManager.getModel().getContainingVertex() != null) - verticesInside.add(mGraphModelManager.getModel().getContainingVertex()); - else - mSelection.mVertices = null; - } - - if (verticesInside.size() > 0) { - mSelection.mEdge = null; - mSelection.mVertices = new Vertex[verticesInside.size()]; - for (i = 0; i < verticesInside.size(); i++) { - mSelection.mVertices[i] = verticesInside.elementAt(i); - } - updateSelectionCorners(); - } - // Remove the elastic band - mElasticBand = null; - mSelectionChangedEvent.mSelection = mSelection; - mGraphModelManager.notifyObservers(mSelectionChangedEvent); - } - - - - public void setSelectedVertexToBeStart() { - if (mSelection.mVertices != null) { - if (mSelection.mVertices.length == 1) { - mGraphModelManager.getModel().setStartVertexId(mSelection.mVertices[0].getID()); - } - } - } - - public Selection getSelection() { - return mSelection; - } - - public void setElasticBand(ElasticBand elasticBand) { - mElasticBand = elasticBand; - mGraphModelManager.notifyObservers(mElasticBandSetEvent); - } - - public void resizeElasticBand(GraphPoint movingCorner) { - mElasticBand.mMovingCorner = movingCorner; - mGraphModelManager.notifyObservers(mElasticBandResizedEvent); - } - - public boolean inSelection(Vertex v) { - int i = 0; - if (mSelection.mVertices == null) { - return false; - } - else { - for (i = 0; i < mSelection.mVertices.length; i++) { - if (mSelection.mVertices[i] == v) { - return true; - } - } - return false; - } - } - - // Only use this method to remove one vertex. - // If you wish to remove more, it would - // propably be more efficient to create a - // new Selection object. - public void removeFromSelection(Vertex v) { - Vertex[] vertices = null; - int i = 0; - int j = 0; - if (mSelection.mVertices.length == 1) { - mSelection.mVertices = null; - mSelection.mTopLeftX = 0; - mSelection.mTopLeftY = 0; - mSelection.mBottomRightX = 0; - mSelection.mBottomRightY = 0; - } - else { - vertices = new Vertex[mSelection.mVertices.length - 1]; - for (i = 0; i < mSelection.mVertices.length; i++) { - if (mSelection.mVertices[i] != v) { - vertices[j] = mSelection.mVertices[i]; - j++; - } - } - mSelection.mVertices = vertices; - updateSelectionCorners(); - } - mGraphModelManager.notifyObservers(mSelectionChangedEvent); - } - - // Only use this method to add one vertex. - // If you wish to add more, it would - // propably be more efficient to create a - // new Selection object. - public void addToSelection(Vertex v) { - Vertex[] vertices = new Vertex[mSelection.mVertices.length + 1]; - GraphPoint centrePoint = null; - int i = 0; - if (mSelection.mVertices == null) { - centrePoint = v.getCentrePoint(); - mSelection.mVertices = new Vertex[] { v }; - mSelection.mTopLeftX = centrePoint.x; - mSelection.mTopLeftY = centrePoint.y; - mSelection.mBottomRightX = centrePoint.x; - mSelection.mBottomRightY = centrePoint.y; - } - else { - for (i = 0; i < mSelection.mVertices.length; i++) { - vertices[i] = mSelection.mVertices[i]; - } - vertices[mSelection.mVertices.length] = v; - mSelection.mVertices = vertices; - updateSelectionCorners(); - } - mGraphModelManager.notifyObservers(mSelectionChangedEvent); - } - public void moveAbsoluteSelection(int newTopLeftX, int newTopLeftY) { - int selectionHeight = mSelection.mBottomRightY - mSelection.mTopLeftY; - int selectionWidth = mSelection.mBottomRightX - mSelection.mTopLeftX; - int bottomRightX = newTopLeftX + selectionWidth; - int bottomRightY = newTopLeftY + selectionHeight; - GraphPoint oldCentrePoint = null; - GraphPoint newCentrePoint = null; - int distXFromTopLeft = 0; - int distYFromTopLeft = 0; - int i = 0; - // Make sure the selection does not move - // outside the boundaries of the graph - if (newTopLeftX < 0) newTopLeftX = 0; - if (newTopLeftY < 0) newTopLeftY = 0; - int graphWidth = mGraphModelManager.getModel().getWidth(); - if (bottomRightX > graphWidth) newTopLeftX = graphWidth - selectionWidth; - int graphHeight = mGraphModelManager.getModel().getHeight(); - if (bottomRightY > graphHeight) newTopLeftY = graphHeight - selectionHeight; - // For each selected vertex - for (i = 0; i < mSelection.mVertices.length; i++) { - // Calculate the new centre point of the vertex. - // First calculate the distance of the centre point - // from the old top left hand corner of the selection, - // then move the point to the new top left hand - // corner plus the distance. - oldCentrePoint = mSelection.mVertices[i].getCentrePoint(); - distXFromTopLeft = oldCentrePoint.x - mSelection.mTopLeftX; - distYFromTopLeft = oldCentrePoint.y - mSelection.mTopLeftY; - newCentrePoint = new GraphPoint(newTopLeftX + distXFromTopLeft, newTopLeftY + distYFromTopLeft); - mGraphModelManager.getModel().moveAbsoluteVertex(mSelection.mVertices[i], newCentrePoint); - } - // Update the top left and bottom right corners - mSelection.mTopLeftX = newTopLeftX; - mSelection.mTopLeftY = newTopLeftY; - mSelection.mBottomRightX = newTopLeftX + selectionWidth; - mSelection.mBottomRightY = newTopLeftY + selectionHeight; - mGraphModelManager.notifyObservers(mSelectionMovedEvent); - } - - // If the specified point is within more than one vertex, - // then the smallest vertex is returned. - public Vertex getVertex(GraphPoint p) { - Object[] vertexObjs = mGraphModelManager.getModel().getVertices(); - Vertex vertex = null; - Vector vertexVector = new Vector(10, 10); - int numVerticesFound = 0; - Vertex smallestVertex = null; - int sizeOfSmallestVertex = 0; - int sizeOfVertex = 0; - int i = 0; - for (i = 0; i < vertexObjs.length; i++) { - vertex = (Vertex)vertexObjs[i]; - if (vertex.containsPoint(p)) { - vertexVector.add(vertex); - } - } - numVerticesFound = vertexVector.size(); - if (numVerticesFound == 0) { - return null; - } - else { - smallestVertex = vertexVector.elementAt(0); - sizeOfSmallestVertex = smallestVertex.getHeight() * smallestVertex.getWidth(); - // Determine the smallest vertex - for (i = 1; i < numVerticesFound; i++) { - vertex = vertexVector.elementAt(i); - sizeOfVertex = vertex.getHeight() * vertex.getWidth(); - if (sizeOfVertex < sizeOfSmallestVertex) { - smallestVertex = vertex; - sizeOfSmallestVertex = sizeOfVertex; - } - } - return smallestVertex; - } - } - - public DirectedEdge getEdge(GraphPoint p) { - Object[] edgeObjs = mGraphModelManager.getModel().getEdges(); - DirectedEdge edge = null; - int i = 0; - for (i = 0; i < edgeObjs.length; i++) { - edge = (DirectedEdge)edgeObjs[i]; - if (edge.containsPoint(p)) { - return edge; - } - } - return null; - } - - - public void setSelection(Selection s) { - // If the there is a change - if (selectionChanged(s)) { - mSelection = s; - mSelectionChangedEvent.mSelection = s; - mGraphModelManager.notifyObservers(mSelectionChangedEvent); - } - } - - private boolean selectionChanged(Selection newValue) { - int i = 0; - if (mSelection.mEdge != newValue.mEdge) { - return true; - } - if (mSelection.mVertices == null) { - if (newValue.mVertices == null) { - return false; - } - else { - return true; - } - } - else { - if (newValue.mVertices == null) { - return true; - } - else { - if (mSelection.mVertices.length != newValue.mVertices.length) { - return true; - } - for (i = 0; i < mSelection.mVertices.length; i++) { - if (mSelection.mVertices[i] != newValue.mVertices[i]) { - return true; - } - } - return false; - } - } - } - @Override - public void paintComponent(Graphics g) - { - Graphics2D g2d = (Graphics2D) g; - DirectedEdge[] edges = null; - Vertex[] vertices = null; - Vertex startVertex = null; - Vertex newEdgeOriginVertex = null; - GraphPoint newEdgeOriginPoint = null; - GraphPoint newEdgeEndPoint = null; - GraphPoint vertexCentre = null; - int i = 0; - super.paintComponent(g); - if (mGraphModelManager != null) - { - // Get the edges and vertices from the model - edges = mGraphModelManager.getModel().getEdges(); - vertices = mGraphModelManager.getModel().getVertices(); - //graphable = mGraphModelManager.getModel(). - // Draw the edges - for (i = 0; i < edges.length; i++) - { - mDirectedEdgeRenderer.draw(g2d, edges[i]); - } - // Draw the vertices - for (i = 0; i < vertices.length; i++) - { - mVertexRenderer.draw(g2d, vertices[i]); - } - g2d.setPaint(mStartPaint); - // Highlight the start vertex if there is one - startVertex = mGraphModelManager.getModel().getStartVertex(); - if (startVertex != null) - { - drawVertexHighlight(g2d, startVertex, 1); - } - g2d.setPaint(mSelectionPaint); - // Draw the outline of the selected - // vertices if there are any - if (mSelection.mVertices != null) - { - g2d.setStroke(mDashed); - for (i = 0; i < mSelection.mVertices.length; i++) - { - if (mSelection.mVertices[i] != mGraphModelManager.getModel().getContainingVertex()) - drawVertexHighlight(g2d, mSelection.mVertices[i], 5); - } - // Draw the resize pads if there is one and only one vertex selected - if (mSelection.mVertices.length == 1 && - mSelection.mVertices[0] != mGraphModelManager.getModel().getContainingVertex()) - { - vertexCentre = mSelection.mVertices[0].getCentrePoint(); - g2d.drawImage( - mResizePadImg, - vertexCentre.x + mSelection.mVertices[0].getWidth() / 2, - vertexCentre.y + mSelection.mVertices[0].getHeight() / 2, - this); - } - } - // Draw the outline of the selected - // edge if there is one - if (mSelection.mEdge != null) - { - drawEdgeHighlight(g2d, mSelection.mEdge); - } - // Draw the elastic band if there - // is one - if (mElasticBand != null) - { - g2d.drawLine( - mElasticBand.mFixedCorner.x, - mElasticBand.mFixedCorner.y, - mElasticBand.mMovingCorner.x, - mElasticBand.mFixedCorner.y); - g2d.drawLine( - mElasticBand.mMovingCorner.x, - mElasticBand.mFixedCorner.y, - mElasticBand.mMovingCorner.x, - mElasticBand.mMovingCorner.y); - g2d.drawLine( - mElasticBand.mMovingCorner.x, - mElasticBand.mMovingCorner.y, - mElasticBand.mFixedCorner.x, - mElasticBand.mMovingCorner.y); - g2d.drawLine( - mElasticBand.mFixedCorner.x, - mElasticBand.mMovingCorner.y, - mElasticBand.mFixedCorner.x, - mElasticBand.mFixedCorner.y); - } - // Draw the new edge under construction if there is one - newEdgeEndPoint = mGraphModelManager.getModel().getNewEdgeEndPoint(); - newEdgeOriginVertex = mGraphModelManager.getModel().getNewEdgeOriginVertex(); - if ((newEdgeEndPoint != null) && (newEdgeOriginVertex != null)) - { - newEdgeOriginPoint = newEdgeOriginVertex.getCentrePoint(); - g2d.setPaint(Color.black); - g2d.drawLine(newEdgeOriginPoint.x, newEdgeOriginPoint.y, newEdgeEndPoint.x, newEdgeEndPoint.y); - } - } - } - // Draws the highlight of the specified vertex the specified dist from its outline - protected void drawVertexHighlight(Graphics2D g2d, Vertex vertex, int dist) - { - GraphPoint[] outlinePoints = vertex.getOutlinePoints(); - GraphPoint centrePoint = vertex.getCentrePoint(); - int i = 0; - /* - * float dash1[] ={5.0f}; BasicStroke bs = new BasicStroke(5.0f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,10.0f, dash1,0.0f); - */ - for (i = 0; i < outlinePoints.length - 1; i++) - { - drawShiftedLine(dist, g2d, centrePoint, outlinePoints[i].x, outlinePoints[i].y, outlinePoints[i + 1].x, outlinePoints[i + 1].y); - } - drawShiftedLine( - dist, - g2d, - centrePoint, - outlinePoints[outlinePoints.length - 1].x, - outlinePoints[outlinePoints.length - 1].y, - outlinePoints[0].x, - outlinePoints[0].y); - } - // Draws the specifed line the specified distance away from the specified centre point - private static void drawShiftedLine(int dist, Graphics2D g2d, GraphPoint centrePoint, int x1, int y1, int x2, int y2) - { - if (x1 > centrePoint.x) - x1 += dist; - if (x1 < centrePoint.x) - x1 -= dist; - if (y1 > centrePoint.y) - y1 += dist; - if (y1 < centrePoint.y) - y1 -= dist; - if (x2 > centrePoint.x) - x2 += dist; - if (x2 < centrePoint.x) - x2 -= dist; - if (y2 > centrePoint.y) - y2 += dist; - if (y2 < centrePoint.y) - y2 -= dist; - g2d.drawLine(x1, y1, x2, y2); - } - // Draws the highlight of the specified edge - protected void drawEdgeHighlight(Graphics2D g2d, DirectedEdge edge) - { - GraphPoint originPoint = edge.getOriginPoint(); - GraphPoint terminusPoint = edge.getTerminusPoint(); - int midX = originPoint.x + (terminusPoint.x - originPoint.x) / 2; - int midY = originPoint.y + (terminusPoint.y - originPoint.y) / 2; - int minX = midX - 10; - int minY = midY - 10; - int maxX = midX + 10; - int maxY = midY + 10; - g2d.drawLine(minX, minY, maxX, minY); - g2d.drawLine(maxX, minY, maxX, maxY); - g2d.drawLine(maxX, maxY, minX, maxY); - g2d.drawLine(minX, maxY, minX, minY); - } - @Override - public void printComponent(Graphics g) - { - super.paintComponent(g); - Graphics2D g2d = (Graphics2D) g; - DirectedEdge[] edges = null; - Vertex[] vertices = null; - Vertex startVertex = null; - int i = 0; - g.setColor(Color.white); - g2d.fillRect(0,0,getWidth(),getHeight()); - if (mGraphModelManager != null) - { - // Get the edges and vertices from the model - edges = mGraphModelManager.getModel().getEdges(); - vertices = mGraphModelManager.getModel().getVertices(); - //graphable = mGraphModelManager.getModel(). - // Draw the edges - for (i = 0; i < edges.length; i++) - { - mDirectedEdgeRenderer.draw(g2d, edges[i]); - } - // Draw the vertices - for (i = 0; i < vertices.length; i++) - { - mVertexRenderer.draw(g2d, vertices[i]); - } - g2d.setPaint(mStartPaint); - // Highlight the start vertex if there is one - startVertex = mGraphModelManager.getModel().getStartVertex(); - if (startVertex != null) - { - drawVertexHighlight(g2d, startVertex, 1); - } - } - } - - protected void superPaint(Graphics g) - { - super.paintComponent(g); - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/view/PropertyTable.java b/src/main/java/com/c2kernel/gui/graph/view/PropertyTable.java deleted file mode 100644 index adf9fc9..0000000 --- a/src/main/java/com/c2kernel/gui/graph/view/PropertyTable.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.c2kernel.gui.graph.view; - -import javax.swing.JTable; -import javax.swing.table.TableCellEditor; -import javax.swing.table.TableCellRenderer; - - -public class PropertyTable extends JTable -{ - public PropertyTable(PropertyTableModel tableModel) - { - super(tableModel); - putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); - } - - - @Override - public TableCellRenderer getCellRenderer(int row, int column) { - - - return getDefaultRenderer(getCellClass(row, column)); - - } - - @Override -public TableCellEditor getCellEditor(int row, int column) { - - return getDefaultEditor(getCellClass(row, column)); - - } - - private Class getCellClass(int row, int column) { - Class cellClass = String.class; - - try { - cellClass = dataModel.getValueAt(row, column).getClass(); - } catch (NullPointerException ex) { } - - return cellClass; - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/view/PropertyTableModel.java b/src/main/java/com/c2kernel/gui/graph/view/PropertyTableModel.java deleted file mode 100644 index 616c302..0000000 --- a/src/main/java/com/c2kernel/gui/graph/view/PropertyTableModel.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.c2kernel.gui.graph.view; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; - -import javax.swing.JOptionPane; -import javax.swing.event.TableModelEvent; -import javax.swing.table.AbstractTableModel; - -import com.c2kernel.utils.CastorHashMap; -import com.c2kernel.utils.Language; - -/************************************************************************** - * - * $Revision: 1.4 $ - * $Date: 2005/08/02 07:50:10 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class PropertyTableModel extends AbstractTableModel { - - private final String[] mColumnNames = { Language.translate("Name"), Language.translate("Value"), Language.translate("Abstract") }; - public CastorHashMap sourceMap = new CastorHashMap(); - public ArrayList sortedNameList = new ArrayList(); - boolean isEditable = false; - - public PropertyTableModel() { - super(); - } - - @Override - public int getColumnCount() - { - return mColumnNames.length; - } - @Override - public String getColumnName(int col) - { - return mColumnNames[col]; - } - @Override - public int getRowCount() - { - synchronized (sourceMap) { - return sourceMap.size(); - } - } - @Override - public Object getValueAt(int rowIndex, int colIndex) - { - synchronized (sourceMap) { - String rowName = sortedNameList.get(rowIndex); - switch (colIndex) { - case 0: - return rowName; - case 1: - return sourceMap.get(rowName); - case 2: - return sourceMap.getAbstract().contains(rowName); - default: - return ""; - } - } - } - - @Override - public void setValueAt(Object value, int rowIndex, int colIndex) - { - synchronized (sourceMap) { - if (colIndex == 0) return; - String rowName = sortedNameList.get(rowIndex); - if (colIndex == 1) { - Class oldElement = sourceMap.get(rowName).getClass(); - if (oldElement == Double.class && value.getClass() == String.class) - try { - value = Double.valueOf((String)value); - } catch (Exception ex) { } - if (value.getClass() != oldElement) - JOptionPane.showMessageDialog(null, "This property should contain a "+oldElement.getName()+" not a "+value.getClass().getName(), "Incorrect datatype", JOptionPane.ERROR_MESSAGE); - else - sourceMap.put(rowName, value); - } - else if (colIndex == 2) { - Boolean boolVal = (Boolean)value; - if (boolVal) - sourceMap.getAbstract().add(rowName); - else - sourceMap.getAbstract().remove(rowName); - } - } - fireTableCellUpdated(rowIndex, colIndex); - } - - @Override - public Class getColumnClass(int columnIndex) { - switch (columnIndex) { - case 2: - return Boolean.class; - default: - return String.class; - } - } - - public void setMap(CastorHashMap props) { - synchronized (sourceMap) { - sourceMap = props; - sortedNameList = new ArrayList(props.size()); - for (String string : props.keySet()) - sortedNameList.add(string); - - Collections.sort(sortedNameList, new Comparator() { - @Override - public int compare(String o1, String o2) { - return (o1.compareToIgnoreCase(o2)); - } - }); - } - fireTableChanged(new TableModelEvent(this)); - } - - @Override - public boolean isCellEditable(int row, int col) - { - return col>0 && isEditable; - } - - /** - * @return Returns the isEditable. - */ - public boolean isEditable() { - return isEditable; - } - /** - * @param isEditable The isEditable to set. - */ - public void setEditable(boolean isEditable) { - this.isEditable = isEditable; - } - - /** - * @param text - * @param object - */ - public void addProperty(String text, Object object, boolean isAbstract) { - sourceMap.put(text, object, isAbstract); - setMap(sourceMap); - } - - /** - * @param object - */ - public void delProperty(Object propName) { - sourceMap.remove(propName); - setMap(sourceMap); - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/view/SelectedVertexPanel.java b/src/main/java/com/c2kernel/gui/graph/view/SelectedVertexPanel.java deleted file mode 100644 index 282ce09..0000000 --- a/src/main/java/com/c2kernel/gui/graph/view/SelectedVertexPanel.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.c2kernel.gui.graph.view; - -import javax.swing.JPanel; - -import com.c2kernel.graph.model.Vertex; - -/************************************************************************** - * - * $Revision: 1.1 $ - * $Date: 2005/05/12 10:12:52 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - - - -public abstract class SelectedVertexPanel extends JPanel { - - public SelectedVertexPanel() { - super(); - } - - public abstract void select(Vertex vert); - - public abstract void clear(); -} diff --git a/src/main/java/com/c2kernel/gui/graph/view/VertexPropertyPanel.java b/src/main/java/com/c2kernel/gui/graph/view/VertexPropertyPanel.java deleted file mode 100644 index d500201..0000000 --- a/src/main/java/com/c2kernel/gui/graph/view/VertexPropertyPanel.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.c2kernel.gui.graph.view; - -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.lang.reflect.Constructor; -import java.util.Observable; -import java.util.Observer; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; - -import com.c2kernel.graph.event.EntireModelChangedEvent; -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.GraphableEdge; -import com.c2kernel.graph.model.GraphableVertex; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.graph.event.SelectionChangedEvent; -import com.c2kernel.gui.tabs.ItemTabPane; -import com.c2kernel.utils.CastorHashMap; -import com.c2kernel.utils.Language; - -/************************************************************************** - * - * $Revision: 1.4 $ - * $Date: 2005/09/09 12:19:28 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class VertexPropertyPanel extends JPanel implements Observer, TableModelListener, ActionListener { - - private final PropertyTableModel mPropertyModel; - private final PropertyTable mPropertyTable; - private GraphModelManager mGraphModelManager; - private boolean isEditable = false; - GridBagLayout gridbag = new GridBagLayout(); - protected JLabel selObjName; - protected JLabel selObjClass; - JButton addPropButton; - JButton delPropButton; - Box newPropBox; - private JTextField newPropName; - private JComboBox newPropType; - private JCheckBox newPropAbstract; - String[] typeOptions = { "String", "Boolean", "Integer", "Float" }; - String[] typeInitVal = { "", "false", "0", "0.0"}; - SelectedVertexPanel mSelPanel; - - public VertexPropertyPanel() { - super(); - setLayout(gridbag); - mPropertyModel = new PropertyTableModel(); - mPropertyModel.addTableModelListener(this); - mPropertyTable = new PropertyTable(mPropertyModel); - } - - /** - * - */ - - @Override - public void update(Observable o, Object arg) { - Vertex[] selectedVertices = null; - DirectedEdge selectedEdge = null; - // If the selection has changed - if (arg instanceof SelectionChangedEvent) - { - SelectionChangedEvent event = (SelectionChangedEvent) arg; - selectedVertices = event.mSelection.mVertices; - if (selectedVertices != null) - { - if (selectedVertices.length == 1) - { - setVertex(selectedVertices[0]); - return; - } - } - selectedEdge = event.mSelection.mEdge; - if (selectedEdge != null) - { - setEdge(selectedEdge); - return; - } - } - if (arg instanceof SelectionChangedEvent || arg instanceof EntireModelChangedEvent){ - clear(); - } - } - - - @Override - public void tableChanged(TableModelEvent e) { - if (mGraphModelManager!=null) - mGraphModelManager.forceNotify(); - - } - - public void setVertex(Vertex vert) { - if (vert.getName().equals("domain")) - selObjName.setText("Domain Workflow"); - else - selObjName.setText(vert.getName()); - String className = vert.getClass().getName(); - selObjClass.setText(className.substring(className.lastIndexOf('.')+1)); - if (mSelPanel != null) mSelPanel.select(vert); - if (vert instanceof GraphableVertex) { - mPropertyModel.setMap(((GraphableVertex)vert).getProperties()); - addPropButton.setEnabled(isEditable); - delPropButton.setEnabled(isEditable); - } - } - - public void setEdge(DirectedEdge edge) { - selObjName.setText(edge.getName()); - String className = edge.getClass().getName(); - selObjClass.setText(className.substring(className.lastIndexOf('.')+1)); - if (edge instanceof GraphableEdge) { - mPropertyModel.setMap(((GraphableEdge)edge).getProperties()); - addPropButton.setEnabled(isEditable); - delPropButton.setEnabled(isEditable); - } - if (mSelPanel != null) mSelPanel.clear(); - } - - public void clear() { - selObjName.setText(""); - selObjClass.setText("Nothing Selected"); - mPropertyModel.setMap(new CastorHashMap()); - if (mSelPanel != null) mSelPanel.clear(); - addPropButton.setEnabled(false); - delPropButton.setEnabled(false); - } - - /** - * @param isEditable The isEditable to set. - */ - public void setEditable(boolean editable) { - mPropertyModel.setEditable(editable); - isEditable = editable; - newPropBox.setVisible(editable); - } - - public void setGraphModelManager(GraphModelManager manager) { - mGraphModelManager = manager; - manager.addObserver(this); - } - - public void createLayout(SelectedVertexPanel selPanel) - { - GridBagConstraints c = new GridBagConstraints(); - c.gridx = 0; - c.gridy = 0; - c.weightx = 1; - c.weighty = 0; - c.anchor = GridBagConstraints.NORTHWEST; - c.ipadx = 5; - c.ipady = 5; - - selObjName = new JLabel(); - selObjName.setFont(ItemTabPane.titleFont); - gridbag.setConstraints(selObjName, c); - add(selObjName); - - c.gridy++; - selObjClass = new JLabel(); - gridbag.setConstraints(selObjClass, c); - add(selObjClass); - - c.gridy++; - JLabel title = new JLabel("Properties"); - title.setFont(ItemTabPane.titleFont); - gridbag.setConstraints(title, c); - add(title); - - c.gridy++; - c.fill = GridBagConstraints.BOTH; - c.weighty = 2; - JScrollPane scroll = new JScrollPane(mPropertyTable); - gridbag.setConstraints(scroll, c); - add(scroll); - - newPropBox = Box.createHorizontalBox(); - newPropBox.add(new JLabel(Language.translate("New :"))); - newPropBox.add(Box.createHorizontalGlue()); - newPropName = new JTextField(15); - newPropBox.add(newPropName); - newPropType = new JComboBox(typeOptions); - newPropBox.add(newPropType); - newPropBox.add(Box.createHorizontalGlue()); - newPropAbstract = new JCheckBox(); - newPropBox.add(newPropAbstract); - newPropBox.add(Box.createHorizontalStrut(1)); - newPropBox.add(new JLabel("Abstract")); - newPropBox.add(Box.createHorizontalStrut(1)); - addPropButton = new JButton("Add"); - addPropButton.setMargin(new Insets(0, 0, 0, 0)); - delPropButton = new JButton("Del"); - delPropButton.setMargin(new Insets(0, 0, 0, 0)); - addPropButton.addActionListener(this); - delPropButton.addActionListener(this); - newPropBox.add(addPropButton); - newPropBox.add(delPropButton); - - c.gridy++; - c.weighty=0; - c.fill= GridBagConstraints.HORIZONTAL; - gridbag.setConstraints(newPropBox, c); - add(newPropBox); - - if (selPanel != null) { - c.gridy++; - mSelPanel = selPanel; - gridbag.setConstraints(mSelPanel, c); - add(mSelPanel); - } - } - - @Override - public void actionPerformed(ActionEvent e) { - if (e.getSource() == addPropButton) { - if (newPropName.getText().length() < 1) { - JOptionPane.showMessageDialog(this, "Enter a name for the new property", "Cannot add property", JOptionPane.ERROR_MESSAGE); - return; - } - if (mPropertyModel.sourceMap.containsKey(newPropName.getText())) { - JOptionPane.showMessageDialog(this, "Property '"+newPropName.getText()+"' already exists.", "Cannot add property", JOptionPane.ERROR_MESSAGE); - return; - } - if (mPropertyTable.getCellEditor() != null) - mPropertyTable.getCellEditor().stopCellEditing(); - - try { - Class newPropClass = Class.forName("java.lang."+typeOptions[newPropType.getSelectedIndex()]); - Class[] params = {String.class}; - Constructor init = newPropClass.getConstructor(params); - Object[] initParams = { typeInitVal[newPropType.getSelectedIndex()] }; - mPropertyModel.addProperty(newPropName.getText(), init.newInstance(initParams), newPropAbstract.isSelected()); - } catch (Exception ex) { - MainFrame.exceptionDialog(ex); - } - } - else if (e.getSource() == delPropButton) { - int selrow = mPropertyTable.getSelectedRow(); - if (selrow == -1) { - JOptionPane.showMessageDialog(this, "Select a property to remove", "Cannot delete property", JOptionPane.ERROR_MESSAGE); - return; - } - mPropertyModel.delProperty(mPropertyModel.sortedNameList.get(selrow)); - } - } -} diff --git a/src/main/java/com/c2kernel/gui/graph/view/VertexRenderer.java b/src/main/java/com/c2kernel/gui/graph/view/VertexRenderer.java deleted file mode 100644 index 9757b0f..0000000 --- a/src/main/java/com/c2kernel/gui/graph/view/VertexRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.c2kernel.gui.graph.view; - -import java.awt.Graphics2D; - -import com.c2kernel.graph.model.Vertex; - - -public interface VertexRenderer -{ - public void draw(Graphics2D g2d, Vertex vertex); -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/chooser/ActivityChooser.java b/src/main/java/com/c2kernel/gui/lifecycle/chooser/ActivityChooser.java deleted file mode 100644 index 32830f7..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/chooser/ActivityChooser.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Created on 1 sept. 2003 - * - * To change the template for this generated file go to Window>Preferences>Java>Code Generation>Code and Comments - */ -package com.c2kernel.gui.lifecycle.chooser; - -import java.awt.Container; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Image; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.HashMap; - -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import com.c2kernel.gui.ImageLoader; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -/** - * @author Developpement - * - * To change the template for this generated type comment go to - * Window>Preferences>Java>Code Generation>Code and Comments - */ -public class ActivityChooser extends JFrame -{ - private LDAPFileChooser mLDAPFileChooserActivity = null; - - private JButton mButtonOK = null; - - private JButton mButtonCancel = null; - - private JPanel mJPanelVertical = null; - - private JPanel mJPanelHorizontal = null; - - private String mMessage = "Choose or modify"; - - private WorkflowDialogue mParent = null; - - private JLabel label = null; - - HashMap mhashmap = null; - - public ActivityChooser(String message, String title, Image img, WorkflowDialogue parent, HashMap hashmap) - { - super(title); - mMessage = message; - img = ImageLoader.findImage("graph/newvertex_large.png").getImage(); - setIconImage(img); - mParent = parent; - mhashmap = hashmap; - initialize(); - } - - private JButton getJButtonOK() - { - if (mButtonOK == null) - mButtonOK = new JButton(Language.translate("OK")); - return mButtonOK; - } - - private JButton getJButtonCancel() - { - if (mButtonCancel == null) - mButtonCancel = new JButton(Language.translate("Cancel")); - return mButtonCancel; - } - - private LDAPFileChooser getLDAPFileChooserActivity() - { - if (mLDAPFileChooserActivity == null) - { - try - { - mLDAPFileChooserActivity = new LDAPFileChooser(LDAPFileChooser.ACTIVITY_CHOOSER); - mLDAPFileChooserActivity.setName("LDAPFileChooserRouting"); - mLDAPFileChooserActivity.setEditable(false); - //mLDAPFileChooserActivity.setBounds(125, 13, 400, 19); - } catch (Exception mExc) - { - Logger.error(mExc); - } - } - return mLDAPFileChooserActivity; - } - - private void initialize() - { - getJButtonOK().addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - Logger.debug(5, "mLDAPFileChooserActivity.getEntryName()" + mLDAPFileChooserActivity.getEntryName()); - setCursor(new Cursor(Cursor.WAIT_CURSOR)); - mParent.loadThisWorkflow(mLDAPFileChooserActivity.getEntryName(), mhashmap); - setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); - close(); - } - }); - getJButtonCancel().addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - close(); - } - }); - //getContentPane().add(getJPanelVertical()); - Container contentPane = getContentPane(); - contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); - contentPane.add(getJPanelVertical()); - contentPane.add(getJPanelHorizontal()); - contentPane.add(Box.createGlue()); - Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); - setLocation((d.width - getWidth()) / 2, (d.height - getHeight()) / 2); - setResizable(true); - pack(); - setSize(new Dimension(getWidth(), getJButtonCancel().getHeight() + getLDAPFileChooserActivity().getHeight() + label.getHeight() + 100)); - setVisible(true); - setVisible(true); - } - - private void close() - { - mParent = null; - this.setEnabled(false); - this.setVisible(false); - } - - private JPanel getJPanelVertical() - { - if (mJPanelVertical == null) - { - try - { - Logger.debug(8, "Panel button"); - mJPanelVertical = new JPanel(); - mJPanelVertical.setName("JPanelV"); - mJPanelVertical.setLayout(new BoxLayout(mJPanelVertical, BoxLayout.Y_AXIS)); - label = new JLabel(mMessage); - JPanel labelP = new JPanel(); - labelP.setLayout(new BoxLayout(labelP, BoxLayout.X_AXIS)); - labelP.add(label); - labelP.add(Box.createGlue()); - mJPanelVertical.add(labelP); - mJPanelVertical.add(Box.createRigidArea(new Dimension(0, 5))); - mJPanelVertical.add(getLDAPFileChooserActivity(), getLDAPFileChooserActivity().getName()); - //mJPanelVertical.add(Box.createRigidArea(new Dimension(0, - // 10))); - mJPanelVertical.add(Box.createGlue()); - mJPanelVertical.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - mJPanelVertical.setVisible(true); - } catch (java.lang.Throwable mExc) - { - //handleException(mExc); - } - } - return mJPanelVertical; - } - - private JPanel getJPanelHorizontal() - { - if (mJPanelHorizontal == null) - { - try - { - Logger.debug(8, "Panel button"); - mJPanelHorizontal = new JPanel(); - mJPanelHorizontal.setName("JPanelH"); - mJPanelHorizontal.setLayout(new BoxLayout(mJPanelHorizontal, BoxLayout.X_AXIS)); - mJPanelHorizontal.add(getJButtonOK(), getJButtonOK().getName()); - mJPanelHorizontal.add(Box.createRigidArea(new Dimension(10, 0))); - mJPanelHorizontal.add(getJButtonCancel(), getJButtonCancel().getName()); - mJPanelHorizontal.setVisible(true); - } catch (java.lang.Throwable mExc) - { - //handleException(mExc); - } - } - return mJPanelHorizontal; - } -} \ No newline at end of file diff --git a/src/main/java/com/c2kernel/gui/lifecycle/chooser/LDAPEntryChooser.java b/src/main/java/com/c2kernel/gui/lifecycle/chooser/LDAPEntryChooser.java deleted file mode 100644 index 7245618..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/chooser/LDAPEntryChooser.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.c2kernel.gui.lifecycle.chooser; -/** - * @version $Revision: 1.2 $ $Date: 2005/12/01 14:23:15 $ - * @author $Author: abranson $ - */ - -import java.awt.Dimension; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; - -import javax.swing.JComboBox; - -import com.c2kernel.gui.MainFrame; -import com.c2kernel.lookup.DomainPath; -import com.c2kernel.process.Gateway; - -public class LDAPEntryChooser extends JComboBox -{ - - DomainPath mDomainPath = null; - ArrayList allItems = new ArrayList(); - - public LDAPEntryChooser(DomainPath domPath, boolean editable) - { - super(); - setEditable(editable); - mDomainPath = domPath; - initialise(); - } - - private void initialise() - { - try - { - Iterator children = Gateway.getLookup().search(mDomainPath, "*"); - while (children.hasNext()) - { - DomainPath domPath = (DomainPath)children.next(); - allItems.add(domPath.getName()); - } - } - catch (Exception ex) - { - MainFrame.exceptionDialog(ex); - } - - Collections.sort(allItems); - addItem(""); - for (String element : allItems) { - addItem(element); - } - - } - - public void reload() - { - removeAllItems(); - initialise(); - } - - @Override - public synchronized Dimension getSize() - { - if (Gateway.getProperties().getInt("ResizeCombo") > 0) - return new Dimension(super.getSize().width<400?400:super.getSize().width,super.getSize().height); - return super.getSize(); - } - -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/chooser/LDAPFileChooser.java b/src/main/java/com/c2kernel/gui/lifecycle/chooser/LDAPFileChooser.java deleted file mode 100644 index 8901c17..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/chooser/LDAPFileChooser.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.c2kernel.gui.lifecycle.chooser; -import java.awt.Dimension; -import java.awt.event.ItemListener; - -import javax.swing.BoxLayout; -import javax.swing.JPanel; - -import com.c2kernel.lookup.DomainPath; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.utils.Logger; - -//import fr.agilium.gui.tabs.wfPropertiesViewer.JPanelTabbedProperties; -/** - * @version $Revision: 1.2 $ $Date: 2005/06/27 15:16:12 $ - * @author $Author: abranson $ - */ - -public class LDAPFileChooser extends JPanel -{ - public static String SCRIPT_CHOOSER = "Script"; - public static String SCHEMA_CHOOSER = "Schema"; - public static String ACTIVITY_CHOOSER = "Activity"; - private String chooserMode = null; - public LDAPEntryChooser mLec; - private boolean mEditable = false; - DomainPath domainPath; - String itemQuery = null; - boolean showversion = true; - - public LDAPFileChooser(String choose) - { - super(); - chooserMode = choose; - initialise(); - } - - private void initialise() - { - if (chooserMode.equals(SCHEMA_CHOOSER)) - { - itemQuery = ClusterStorage.VIEWPOINT + "/Schema/all"; - domainPath = new DomainPath("/desc/OutcomeDesc/"); - } - else if (chooserMode.equals(SCRIPT_CHOOSER)) - { - itemQuery = ClusterStorage.VIEWPOINT + "/Script/all"; - domainPath = new DomainPath("/desc/Script/"); - } - else if (chooserMode.equals(ACTIVITY_CHOOSER)) - { - domainPath = new DomainPath("/desc/ActivityDesc/"); - showversion = false; - } - else - return; - mLec = new LDAPEntryChooser(domainPath, mEditable); - - mLec.setPreferredSize(new Dimension(220, 19)); - mLec.setMaximumSize(new Dimension(3000, 22)); - mLec.setMinimumSize(new Dimension(50, 19)); - //mLec.getRenderer().getListCellRendererComponent(); - - BoxLayout blyt = new BoxLayout(this, BoxLayout.X_AXIS); - setLayout(blyt); - add(mLec); - mLec.setVisible(true); - this.validate(); - this.setVisible(true); - - } - - public String getEntryName() - { - return (String) mLec.getSelectedItem(); - } - - public void addItemListener(ItemListener il) - { - mLec.addItemListener(il); - } - public void setSelectedItem(String name, String version) - { - Logger.debug(5,"setSelectedItem " + name + " " + version); - if (name == null||name.equals("-1")) name=""; - mLec.setSelectedItem(name); - } - - public void reload() - { - mLec.reload(); - } - - public void removeAllItems() - { - mLec.removeAllItems(); - } - - /** - * @param b - */ - public void setEditable(boolean b) - { - mEditable = b; - mLec.setEditable(b); - } - - @Override - public void updateUI() - { - if (mLec!=null) mLec.updateUI(); - super.updateUI(); - } - - @Override - public void setEnabled(boolean enabled) - { - mLec.setEnabled(enabled); - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/chooser/WorkflowDialogue.java b/src/main/java/com/c2kernel/gui/lifecycle/chooser/WorkflowDialogue.java deleted file mode 100644 index 61b70b5..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/chooser/WorkflowDialogue.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Created on 2 sept. 2003 - * - * To change the template for this generated file go to - * Window>Preferences>Java>Code Generation>Code and Comments - */ -package com.c2kernel.gui.lifecycle.chooser; - -import java.util.HashMap; - -/** - * @author Developpement - * - * To change the template for this generated type comment go to - * Window>Preferences>Java>Code Generation>Code and Comments - */ -public interface WorkflowDialogue -{ - public void loadThisWorkflow(String name, HashMap mhashmap); -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/desc/ActivitySlotDefRenderer.java b/src/main/java/com/c2kernel/gui/lifecycle/desc/ActivitySlotDefRenderer.java deleted file mode 100644 index 56cb44d..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/desc/ActivitySlotDefRenderer.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.c2kernel.gui.lifecycle.desc; - -import java.awt.Color; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Paint; - -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.view.VertexRenderer; -import com.c2kernel.lifecycle.ActivitySlotDef; -import com.c2kernel.utils.Language; - -public class ActivitySlotDefRenderer implements VertexRenderer -{ - private Paint mInactivePaint = new Color(255, 255, 255); - private Paint mErrorPaint = new Color( 255, 50, 0 ); - private Paint mCompositePaint= new Color(200, 200, 255); - private Paint mTextPaint = Color.black; - - - @Override - public void draw( Graphics2D g2d, Vertex vertex) - { - ActivitySlotDef activitySlotDef = ( ActivitySlotDef )vertex; - boolean hasError = activitySlotDef.verify(); - boolean isComposite = false; - isComposite = activitySlotDef.getIsComposite(); - GraphPoint centrePoint = activitySlotDef.getCentrePoint(); - int vertexHeight = activitySlotDef.getHeight(); - int vertexWidth = activitySlotDef.getWidth(); - - String[] linesOfText = new String[2+(hasError?0:1)]; - FontMetrics metrics = g2d.getFontMetrics(); - int lineWidth = 0; - int lineHeight = metrics.getHeight(); - int linesHeight = lineHeight * linesOfText.length; - int linesStartY = centrePoint.y - linesHeight / 2 + lineHeight * 2 / 3; - int x = 0; - int y = 0; - int i = 0; - - linesOfText[0]="("+activitySlotDef.getActivityDef()+")"; - linesOfText[1]=(String)activitySlotDef.getProperties().get("Name"); - - if (!hasError)linesOfText[2]=Language.translate(activitySlotDef.getErrors()); - - g2d.setPaint( !hasError ? mErrorPaint : isComposite ? mCompositePaint : mInactivePaint ); - g2d.fill3DRect - ( - centrePoint.x - vertexWidth / 2, - centrePoint.y - vertexHeight / 2, - vertexWidth, - vertexHeight, - true - ); - - g2d.setPaint( mTextPaint ); - - // Draw the lines of text - for ( i = 0; i < linesOfText.length; i++ ) - { - if (linesOfText[i] == null) linesOfText[i] = ""; - lineWidth = metrics.stringWidth( linesOfText[ i ] ); - x = centrePoint.x - lineWidth / 2; - y = linesStartY + i * lineHeight; - g2d.drawString( linesOfText[ i ], x, y ); - } - } -} - diff --git a/src/main/java/com/c2kernel/gui/lifecycle/desc/CompActDefOutcomeHandler.java b/src/main/java/com/c2kernel/gui/lifecycle/desc/CompActDefOutcomeHandler.java deleted file mode 100644 index 87f4a9b..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/desc/CompActDefOutcomeHandler.java +++ /dev/null @@ -1,241 +0,0 @@ -package com.c2kernel.gui.lifecycle.desc; - -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JPanel; -import javax.swing.JSplitPane; - -import com.c2kernel.graph.layout.DefaultGraphLayoutGenerator; -import com.c2kernel.gui.ImageLoader; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.graph.view.EditorPanel; -import com.c2kernel.gui.graph.view.VertexPropertyPanel; -import com.c2kernel.gui.lifecycle.instance.FindActDefPanel; -import com.c2kernel.gui.tabs.outcome.InvalidOutcomeException; -import com.c2kernel.gui.tabs.outcome.InvalidSchemaException; -import com.c2kernel.gui.tabs.outcome.OutcomeException; -import com.c2kernel.gui.tabs.outcome.OutcomeHandler; -import com.c2kernel.gui.tabs.outcome.OutcomeNotInitialisedException; -import com.c2kernel.lifecycle.CompositeActivityDef; -import com.c2kernel.lifecycle.WfVertexDefOutlineCreator; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.FileStringUtility; -import com.c2kernel.utils.Logger; - -/************************************************************************** - * - * $Revision: 1.14 $ - * $Date: 2005/09/07 13:46:31 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class CompActDefOutcomeHandler - extends JPanel - implements OutcomeHandler { - - protected JButton mLoadButton = new JButton(ImageLoader.findImage("graph/load.png")); - protected JButton mLayoutButton = new JButton(ImageLoader.findImage("graph/autolayout.png")); - protected JButton[] mOtherToolBarButtons = { mLayoutButton, mLoadButton }; - - protected CompositeActivityDef mCompActDef = null; - protected WfEdgeDefFactory mWfEdgeDefFactory = new WfEdgeDefFactory(); - protected WfVertexDefFactory mWfVertexDefFactory = new WfVertexDefFactory(); - - protected EditorPanel mEditorPanel; - protected VertexPropertyPanel mPropertyPanel; - protected JSplitPane mSplitPane; - boolean unsaved; - - public CompActDefOutcomeHandler() { - super(); - mPropertyPanel = loadPropertyPanel(); - mPropertyPanel.createLayout(new FindActDefPanel()); - mEditorPanel = - new EditorPanel( - mWfEdgeDefFactory, - mWfVertexDefFactory, - new WfVertexDefOutlineCreator(), - true, - mOtherToolBarButtons, - new WfDefGraphPanel(new WfDirectedEdgeDefRenderer(), - new WfVertexDefRenderer())); - } - - protected void createLayout() - { - mLoadButton.setToolTipText("Load from local file"); - mLayoutButton.setToolTipText("Auto-Layout"); - - // Add the editor pane - GridBagLayout gridbag = new GridBagLayout(); - setLayout(gridbag); - GridBagConstraints c = new GridBagConstraints(); - c.gridx = 0; - c.gridy = 1; - c.fill = GridBagConstraints.BOTH; - c.weighty = 2.0; - c.weightx = 2.0; - mSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, mEditorPanel, mPropertyPanel); - mSplitPane.setDividerSize(5); - gridbag.setConstraints(mSplitPane, c); - add(mSplitPane); - revalidate(); - } - - protected void createListeners() - { - mLoadButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent ae) { - File selectedFile = null; - - int returnValue = MainFrame.xmlChooser.showOpenDialog(null); - - switch (returnValue) - { - case JFileChooser.APPROVE_OPTION : - selectedFile = MainFrame.xmlChooser.getSelectedFile(); - try { - String newWf = FileStringUtility.file2String(selectedFile); - setOutcome(newWf); - setUpGraphEditor(); - } catch (Exception e) { - MainFrame.exceptionDialog(e); - } - case JFileChooser.CANCEL_OPTION : - case JFileChooser.ERROR_OPTION : - - default : - } - } - }); - - mLayoutButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent ae) { - DefaultGraphLayoutGenerator.layoutGraph(mEditorPanel.mGraphModelManager.getModel()); - } - }); - } - - public void setUpGraphEditor() { - mEditorPanel.mGraphModelManager.setModel(mCompActDef.getChildrenGraphModel()); - // Give the editor panel the edge and vertex types - mEditorPanel.updateVertexTypes(mCompActDef.getVertexTypeNameAndConstructionInfo()); - mEditorPanel.updateEdgeTypes(mCompActDef.getEdgeTypeNameAndConstructionInfo()); - mEditorPanel.enterSelectMode(); - mWfVertexDefFactory.setCreationContext(mCompActDef); - } - - /** - * - */ - @Override - public void setOutcome(String outcome) throws InvalidOutcomeException { - try { - CompositeActivityDef newAct = (CompositeActivityDef)Gateway.getMarshaller().unmarshall(outcome); - if (mCompActDef != null) - newAct.setName(mCompActDef.getName()); - mCompActDef = newAct; - } catch (Exception ex) { - Logger.error(ex); - throw new InvalidOutcomeException(ex.getMessage()); - } - } - /** - * - */ - @Override - public void setDescription(String description) - throws InvalidSchemaException { - // ignore - always the same - } - /** - * - */ - @Override - public void setReadOnly(boolean readOnly) { - mLayoutButton.setEnabled(!readOnly); - mLoadButton.setEnabled(!readOnly); - mEditorPanel.setEditable(!readOnly); - mPropertyPanel.setEditable(!readOnly); - } - /** - * - */ - @Override - public JPanel getPanel() throws OutcomeNotInitialisedException { - return this; - } - /** - * - */ - @Override - public String getOutcome() throws OutcomeException { - if (!mCompActDef.verify()) - throw new OutcomeException(mCompActDef.getErrors()); - try { - return Gateway.getMarshaller().marshall(mCompActDef); - } catch (Exception ex) { - throw new OutcomeException(ex.getMessage()); - } - } - /** - * - */ - @Override - public void run() { - Thread.currentThread().setName("Composite Act Def Viewer"); - createLayout(); - createListeners(); - mPropertyPanel.setGraphModelManager(mEditorPanel.mGraphModelManager); - setUpGraphEditor(); - } - - public VertexPropertyPanel loadPropertyPanel() - { - String wfPanelClass = Gateway.getProperties().getString("WfPropertyPanel"); - if (wfPanelClass != null) { - try { - return (VertexPropertyPanel)Gateway.getProperties().getInstance("WfPropertyPanel"); - } catch (Exception ex) { - Logger.error("Could not load wf props panel:"+wfPanelClass); - Logger.error(ex); - } - } - return new VertexPropertyPanel(); - } - - @Override - public boolean isUnsaved() { - return unsaved; - } - - @Override - public void saved() { - unsaved = false; - } - - @Override - public void export(File targetFile) throws Exception { - //Make sure module structure is present - File parentDir = targetFile.getParentFile(); - FileStringUtility.createNewDir(parentDir.getAbsolutePath()+"/CA"); - FileStringUtility.createNewDir(parentDir.getAbsolutePath()+"/EA"); - FileStringUtility.createNewDir(parentDir.getAbsolutePath()+"/OD"); - FileStringUtility.createNewDir(parentDir.getAbsolutePath()+"/SC"); - BufferedWriter imports = new BufferedWriter(new FileWriter(new File(parentDir, mCompActDef.getActName()+"Imports.xml"))); - ElemActDefOutcomeHandler.exportAct(targetFile.getParentFile(), imports, mCompActDef); - imports.close(); - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/desc/ElemActDefOutcomeHandler.java b/src/main/java/com/c2kernel/gui/lifecycle/desc/ElemActDefOutcomeHandler.java deleted file mode 100644 index f02e2f7..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/desc/ElemActDefOutcomeHandler.java +++ /dev/null @@ -1,227 +0,0 @@ -package com.c2kernel.gui.lifecycle.desc; - -import java.io.BufferedWriter; -import java.io.File; - -import javax.swing.JOptionPane; -import javax.swing.JPanel; - -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.entity.agent.Job; -import com.c2kernel.entity.proxy.ItemProxy; -import com.c2kernel.graph.model.GraphableVertex; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.graph.view.VertexPropertyPanel; -import com.c2kernel.gui.tabs.outcome.InvalidOutcomeException; -import com.c2kernel.gui.tabs.outcome.InvalidSchemaException; -import com.c2kernel.gui.tabs.outcome.OutcomeException; -import com.c2kernel.gui.tabs.outcome.OutcomeHandler; -import com.c2kernel.gui.tabs.outcome.OutcomeNotInitialisedException; -import com.c2kernel.lifecycle.ActivityDef; -import com.c2kernel.lifecycle.ActivitySlotDef; -import com.c2kernel.lifecycle.CompositeActivityDef; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.persistency.outcome.Viewpoint; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.FileStringUtility; -import com.c2kernel.utils.LocalObjectLoader; -import com.c2kernel.utils.Logger; - -/************************************************************************** - * - * $Revision: 1.5 $ - * $Date: 2005/10/05 07:39:37 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class ElemActDefOutcomeHandler extends VertexPropertyPanel implements OutcomeHandler { - - ActivityDef act; - boolean unsaved; - public ElemActDefOutcomeHandler() { - super(); - createLayout(null); - } - - /** - * - */ - @Override - public void setOutcome(String outcome) throws InvalidOutcomeException { - try { - act = (ActivityDef)Gateway.getMarshaller().unmarshall(outcome); - setVertex(act); - } catch (Exception ex) { - Logger.error(ex); - throw new InvalidOutcomeException(); - } - } - - /** - * - */ - @Override - public void setDescription(String description) - throws InvalidSchemaException { - // ignore - } - - /** - * - */ - @Override - public void setReadOnly(boolean readOnly) { - setEditable(!readOnly); - - } - - /** - * - */ - @Override - public JPanel getPanel() throws OutcomeNotInitialisedException { - return this; - } - - /** - * - */ - @Override - public String getOutcome() throws OutcomeException { - try { - return Gateway.getMarshaller().marshall(act); - } catch (Exception ex) { - Logger.error(ex); - throw new OutcomeException(); - } - } - - /** - * - */ - @Override - public void run() { - validate(); - } - - @Override - public boolean isUnsaved() { - return unsaved; - } - - @Override - public void saved() { - unsaved = false; - } - - @Override - public void export(File targetFile) throws Exception { - exportAct(targetFile.getParentFile(), null, act); - } - - public static void exportAct(File dir, BufferedWriter imports, ActivityDef actDef) throws Exception { - - // Export associated schema - exportSchema((String)actDef.getProperties().get("SchemaType"), actDef.getProperties().get("SchemaVersion"), imports, new File(dir, "OD")); - // Export associated script - exportScript((String)actDef.getProperties().get("ScriptName"), actDef.getProperties().get("ScriptVersion"), imports, new File(dir, "SC")); - - //Export child act if composite - if (actDef instanceof CompositeActivityDef) { - CompositeActivityDef compActDef = (CompositeActivityDef)actDef; - for (int i=0; iboot/CA/"+compActDef.getActName()+".xml\n"); - } - } - else { - FileStringUtility.string2File(new File(new File(dir, "EA"), actDef.getActName()+".xml"), Gateway.getMarshaller().marshall(actDef)); - if (imports!=null) imports.write("boot/EA/"+actDef.getActName()+".xml\n"); - } - } - - private static void resolveRealVersion(ActivitySlotDef childDef) throws ObjectNotFoundException { - String defName = childDef.getActName(); - ItemProxy actDefItem = LocalObjectLoader.loadLocalObjectDef("/desc/ActivityDesc/", defName); - String actType = actDefItem.getProperty("Complexity"); - Viewpoint last = actDefItem.getViewpoint( actType + "ActivityDef", "last"); - String[] viewpoints = actDefItem.getContents(ClusterStorage.VIEWPOINT+"/"+actType + "ActivityDef"); - for (String viewName : viewpoints) { - try { - Integer.parseInt(viewName); - } catch (NumberFormatException e) { - continue; // only count integer viewnames - } - Viewpoint thisView = actDefItem.getViewpoint(actType + "ActivityDef", viewName); - if (thisView.getEventId() == last.getEventId()) { - JOptionPane.showMessageDialog(null, defName+" defined as 'last'. Will use view "+viewName+" instead"); - childDef.getProperties().put("Version", viewName); - return; - } - } - JOptionPane.showMessageDialog(null, "Last view for "+defName+" has not been materialized. Executing CreateFromLast"); - try { - Job createJob = actDefItem.getJobByName("AssignNewActivityVersionFromLast", MainFrame.userAgent); - MainFrame.userAgent.execute(createJob); - } catch (Exception e) { - Logger.error(e); - throw new ObjectNotFoundException("Could not create new version of "+defName+" from last"); - } - resolveRealVersion(childDef); - } - - public static void exportScript(String name, Object version, BufferedWriter imports, File dir) { - if (name == null || name.length()==0 || name.contains(":")) return; - try { - int intVersion; - if (version instanceof String) intVersion = Integer.parseInt((String)version); - else if (version instanceof Integer) intVersion = ((Integer)version).intValue(); - else return; - - FileStringUtility.string2File(new File(dir, name+".xml"), - LocalObjectLoader.getScript(name, intVersion)); - if (imports!=null) imports.write("boot/SC/"+name+".xml\n"); - } catch (NumberFormatException ex) { - JOptionPane.showMessageDialog(null, "Invalid version number in script version:"+version); - } catch (Exception ex) { - Logger.error(ex); - JOptionPane.showMessageDialog(null, "Could not export script "+name+"_"+version, "Error", JOptionPane.ERROR_MESSAGE); - } - } - - public static void exportSchema(String name, Object version, BufferedWriter imports, File dir) { - if (name == null || name.length()==0) return; - try { - int intVersion; - if (version instanceof String) intVersion = Integer.parseInt((String)version); - else if (version instanceof Integer) intVersion = ((Integer)version).intValue(); - else return; - FileStringUtility.string2File(new File(dir, name+".xsd"), - LocalObjectLoader.getSchema(name, intVersion).schema); - if (imports!=null) imports.write("boot/OD/"+name+".xsd\n"); - } catch (NumberFormatException ex) { - JOptionPane.showMessageDialog(null, "Invalid version number in script version:"+version); - } catch (Exception ex) { - Logger.error(ex); - JOptionPane.showMessageDialog(null, "Could not export schema "+name+"_"+version, "Error", JOptionPane.ERROR_MESSAGE); - } - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/desc/SplitJoinDefRenderer.java b/src/main/java/com/c2kernel/gui/lifecycle/desc/SplitJoinDefRenderer.java deleted file mode 100644 index f756696..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/desc/SplitJoinDefRenderer.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.c2kernel.gui.lifecycle.desc; - -import java.awt.Color; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Paint; - -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.view.VertexRenderer; -import com.c2kernel.lifecycle.AndSplitDef; -import com.c2kernel.lifecycle.JoinDef; -import com.c2kernel.lifecycle.LoopDef; -import com.c2kernel.lifecycle.OrSplitDef; -import com.c2kernel.lifecycle.WfVertexDef; -import com.c2kernel.lifecycle.XOrSplitDef; -import com.c2kernel.utils.Language; - - -public class SplitJoinDefRenderer implements VertexRenderer -{ - private Paint mTextPaint = Color.black; - private Paint mBoxPaint = new Color( 204, 204, 204 ); - private Paint mErrorPaint = new Color( 255, 50, 0 ); - private boolean mTextOffsetsNotInitialised = true; - private int mTextYOffset = 0; - private String mAndText = "And"; - private int mAndTextXOffset = 0; - private String mOrText = "Or"; - private int mOrTextXOffset = 0; - private String mXOrText = "XOr"; - private int mXOrTextXOffset = 0; - private String mJoinText = "Join"; - private int mJoinTextXOffset = 0; - private String mLoopText = "Loop"; - private int mLoopTextXOffset = 0; - private String mRouteText = ""; - private int mRouteTextXOffset = 0; - private String mXXXText = "XXX"; - private int mXXXTextXOffset = 0; - - @Override - public void draw( Graphics2D g2d, Vertex vertex) - { - GraphPoint centrePoint = vertex.getCentrePoint(); - String text = null; - int textXOffset = 0; - int vertexHeight = vertex.getHeight(); - int vertexWidth = vertex.getWidth(); - boolean hasError = !((WfVertexDef)vertex).verify(); - - - if ( mTextOffsetsNotInitialised ) - { - initialiseTextOffsets( g2d ); - mTextOffsetsNotInitialised = false; - } - if ( vertex instanceof LoopDef ) - { - text = Language.translate(mLoopText); - textXOffset = mLoopTextXOffset; - } - else if ( vertex instanceof XOrSplitDef ) - { - text = Language.translate(mXOrText); - textXOffset = mXOrTextXOffset; - } - else if ( vertex instanceof OrSplitDef ) - { - text = Language.translate(mOrText); - textXOffset = mOrTextXOffset; - } - else if ( vertex instanceof AndSplitDef ) - { - text = Language.translate(mAndText); - textXOffset = mAndTextXOffset; - } - else if ( vertex instanceof JoinDef) - { - String type= (String)((JoinDef)vertex).getProperties().get("Type"); - if (type!=null && type.equals("Route")) - { - text = mRouteText; - textXOffset = mRouteTextXOffset; - } - else - { - text = Language.translate(mJoinText); - textXOffset = mJoinTextXOffset; - } - } - else - { - text = mXXXText; - textXOffset = mXXXTextXOffset; - } - - - g2d.setPaint( hasError ? mErrorPaint : mBoxPaint ); - g2d.fillRect - ( - centrePoint.x - vertexWidth / 2, - centrePoint.y - vertexHeight / 2, - vertexWidth, - vertexHeight - ); - g2d.setPaint( mTextPaint ); - g2d.drawRect - ( - centrePoint.x - vertexWidth / 2, - centrePoint.y - vertexHeight / 2, - vertexWidth, - vertexHeight - ); - g2d.drawString( text, centrePoint.x - textXOffset, centrePoint.y + mTextYOffset ); - if (hasError) { - g2d.setPaint( mErrorPaint ); - String errors = Language.translate(((WfVertexDef)vertex).getErrors()); - int errorWidth = g2d.getFontMetrics().stringWidth( errors ); - g2d.drawString( errors, centrePoint.x - ( errorWidth / 2), centrePoint.y + vertexHeight ); - } - } - - private void initialiseTextOffsets( Graphics2D g2d ) - { - FontMetrics metrics = g2d.getFontMetrics(); - - - mTextYOffset = metrics.getHeight() / 3; - mAndTextXOffset = metrics.stringWidth( Language.translate(mAndText) ) / 2; - mOrTextXOffset = metrics.stringWidth( Language.translate(mOrText) ) / 2; - mXOrTextXOffset = metrics.stringWidth( Language.translate(mXOrText) ) / 2; - mJoinTextXOffset = metrics.stringWidth( Language.translate(mJoinText) ) / 2; - mLoopTextXOffset = metrics.stringWidth( Language.translate(mJoinText) ) / 2; - mRouteTextXOffset = metrics.stringWidth( Language.translate(mRouteText) ) / 2; - } -} - diff --git a/src/main/java/com/c2kernel/gui/lifecycle/desc/WfDefGraphPanel.java b/src/main/java/com/c2kernel/gui/lifecycle/desc/WfDefGraphPanel.java deleted file mode 100644 index 7177a4d..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/desc/WfDefGraphPanel.java +++ /dev/null @@ -1,59 +0,0 @@ -/*Created on 21 nov. 2003 */ -package com.c2kernel.gui.lifecycle.desc; - -import java.awt.Graphics2D; - -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.gui.graph.view.DirectedEdgeRenderer; -import com.c2kernel.gui.graph.view.GraphPanel; -import com.c2kernel.gui.graph.view.VertexRenderer; -import com.c2kernel.lifecycle.NextDef; - -/** @author XSeb74*/ -public class WfDefGraphPanel extends GraphPanel -{ - public WfDefGraphPanel(DirectedEdgeRenderer d,VertexRenderer v) - { - super(d,v); - } - // Draws the highlight of the specified edge - @Override - protected void drawEdgeHighlight(Graphics2D g2d, DirectedEdge edge) - { - GraphPoint originPoint = edge.getOriginPoint(); - GraphPoint terminusPoint = edge.getTerminusPoint(); - GraphPoint midPoint = new GraphPoint(); - - if ("Straight".equals(((NextDef)edge).getProperties().get("Type")) || ((NextDef)edge).getProperties().get("Type") == null) - { - midPoint.x = originPoint.x + (terminusPoint.x - originPoint.x) / 2; - midPoint.y = originPoint.y + (terminusPoint.y - originPoint.y) / 2; - } - else if (("Broken +".equals(((NextDef)edge).getProperties().get("Type")))) - { - midPoint.x = (originPoint.x + terminusPoint.x) / 2; - midPoint.y = (originPoint.y + terminusPoint.y) / 2; - } - else if (("Broken -".equals(((NextDef)edge).getProperties().get("Type")))) - { - boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); - midPoint.x = arrowOnY ? terminusPoint.x : (originPoint.x + terminusPoint.x) / 2; - midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : originPoint.y; - } - else if (("Broken |".equals(((NextDef)edge).getProperties().get("Type")))) - { - boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); - midPoint.x = arrowOnY ? originPoint.x : (originPoint.x + terminusPoint.x) / 2; - midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : terminusPoint.y; - } - int minX = midPoint.x - 10; - int minY = midPoint.y - 10; - int maxX = midPoint.x + 10; - int maxY = midPoint.y + 10; - g2d.drawLine(minX, minY, maxX, minY); - g2d.drawLine(maxX, minY, maxX, maxY); - g2d.drawLine(maxX, maxY, minX, maxY); - g2d.drawLine(minX, maxY, minX, minY); - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/desc/WfDirectedEdgeDefRenderer.java b/src/main/java/com/c2kernel/gui/lifecycle/desc/WfDirectedEdgeDefRenderer.java deleted file mode 100644 index 695934b..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/desc/WfDirectedEdgeDefRenderer.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.c2kernel.gui.lifecycle.desc; -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.Shape; -import java.awt.geom.AffineTransform; -import java.awt.geom.GeneralPath; - -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.gui.graph.view.DirectedEdgeRenderer; -import com.c2kernel.lifecycle.NextDef; -public class WfDirectedEdgeDefRenderer implements DirectedEdgeRenderer -{ - private GeneralPath mArrowTemplate = new GeneralPath(); - public WfDirectedEdgeDefRenderer() - { - mArrowTemplate.moveTo(-5, 5); - mArrowTemplate.lineTo(0, 0); - mArrowTemplate.lineTo(5, 5); - } - @Override - public void draw(Graphics2D g2d, DirectedEdge directedEdge) - { - GraphPoint originPoint = directedEdge.getOriginPoint(); - GraphPoint terminusPoint = directedEdge.getTerminusPoint(); - GraphPoint midPoint = new GraphPoint(); - AffineTransform transform = new AffineTransform(); - Shape arrow = null; - NextDef nextDef = (NextDef) directedEdge; - boolean hasError = !nextDef.verify(); - String text = (String) nextDef.getProperties().get("Alias"); - g2d.setPaint(hasError ? Color.red : Color.black); - if (("Broken +".equals(nextDef.getProperties().get("Type")))) - { - g2d.drawLine(originPoint.x, originPoint.y, originPoint.x, (originPoint.y + terminusPoint.y) / 2); - g2d.drawLine(originPoint.x, (originPoint.y + terminusPoint.y) / 2, terminusPoint.x, (originPoint.y + terminusPoint.y) / 2); - g2d.drawLine(terminusPoint.x, (originPoint.y + terminusPoint.y) / 2, terminusPoint.x, terminusPoint.y); - midPoint.x = (originPoint.x + terminusPoint.x) / 2; - midPoint.y = (originPoint.y + terminusPoint.y) / 2; - transform.translate(midPoint.x, midPoint.y); - transform.rotate( - calcArrowAngle( - originPoint.x, - originPoint.x - terminusPoint.x > -5 - && originPoint.x - terminusPoint.x < 5 ? originPoint.y : (originPoint.y + terminusPoint.y) / 2, - terminusPoint.x, - originPoint.x - terminusPoint.x > -5 - && originPoint.x - terminusPoint.x < 5 ? terminusPoint.y : (originPoint.y + terminusPoint.y) / 2)); - } - else if (("Broken -".equals(nextDef.getProperties().get("Type")))) - { - g2d.drawLine(originPoint.x, originPoint.y, terminusPoint.x, originPoint.y); - g2d.drawLine(terminusPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y); - boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); - midPoint.x = arrowOnY ? terminusPoint.x : (originPoint.x + terminusPoint.x) / 2; - midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : originPoint.y; - transform.translate(midPoint.x, midPoint.y); - transform - .rotate( - calcArrowAngle( - arrowOnY ? terminusPoint.x : originPoint.x, - arrowOnY ? originPoint.y : originPoint.y, - arrowOnY ? terminusPoint.x : terminusPoint.x, - arrowOnY ? terminusPoint.y : originPoint.y)); - } - else if (("Broken |".equals(nextDef.getProperties().get("Type")))) - { - g2d.drawLine(originPoint.x, originPoint.y, originPoint.x, terminusPoint.y); - g2d.drawLine(originPoint.x, terminusPoint.y, terminusPoint.x, terminusPoint.y); - boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); - midPoint.x = arrowOnY ? originPoint.x : (originPoint.x + terminusPoint.x) / 2; - midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : terminusPoint.y; - transform.translate(midPoint.x, midPoint.y); - transform - .rotate( - calcArrowAngle( - arrowOnY ? terminusPoint.x : originPoint.x, - arrowOnY ? originPoint.y : originPoint.y, - arrowOnY ? terminusPoint.x : terminusPoint.x, - arrowOnY ? terminusPoint.y : originPoint.y)); - } - else - { - g2d.drawLine(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y); - midPoint.x = originPoint.x + (terminusPoint.x - originPoint.x) / 2; - midPoint.y = originPoint.y + (terminusPoint.y - originPoint.y) / 2; - transform.translate(midPoint.x, midPoint.y); - transform.rotate(calcArrowAngle(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y)); - } - - arrow = mArrowTemplate.createTransformedShape(transform); - g2d.draw(arrow); - if (text != null) - g2d.drawString(text, midPoint.x + 10, midPoint.y); - } - private static double calcArrowAngle(int originX, int originY, int terminusX, int terminusY) - { - double width = terminusX - originX; - double height = terminusY - originY; - if ((width == 0) && (height > 0)) - { - return Math.PI; - } - if ((width == 0) && (height < 0)) - { - return 0; - } - if ((width > 0) && (height == 0)) - { - return Math.PI / 2.0; - } - if ((width < 0) && (height == 0)) - { - return -1.0 * Math.PI / 2.0; - } - if ((width > 0) && (height > 0)) - { - return Math.PI / 2.0 + Math.atan(Math.abs(height) / Math.abs(width)); - } - if ((width > 0) && (height < 0)) - { - return Math.atan(Math.abs(width) / Math.abs(height)); - } - if ((width < 0) && (height < 0)) - { - return -1.0 * Math.atan(Math.abs(width) / Math.abs(height)); - } - if ((width < 0) && (height > 0)) - { - return -1.0 * (Math.PI / 2.0 + Math.atan(Math.abs(height) / Math.abs(width))); - } - return 0.0; - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/desc/WfEdgeDefFactory.java b/src/main/java/com/c2kernel/gui/lifecycle/desc/WfEdgeDefFactory.java deleted file mode 100644 index 082a4a2..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/desc/WfEdgeDefFactory.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.c2kernel.gui.lifecycle.desc; -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.EdgeFactory; -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.TypeNameAndConstructionInfo; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.lifecycle.NextDef; -import com.c2kernel.lifecycle.WfVertexDef; -public class WfEdgeDefFactory implements EdgeFactory -{ - @Override - public void create( - GraphModelManager graphModelManager, - Vertex origin, - Vertex terminus, - TypeNameAndConstructionInfo typeNameAndConstructionInfo) - { - if (validCreation(graphModelManager, origin, terminus)) - { - NextDef nextDef = new NextDef((WfVertexDef) origin, (WfVertexDef) terminus); - graphModelManager.getModel().addEdgeAndCreateId(nextDef, origin, terminus); - } - } - private static boolean validCreation(GraphModelManager graphModelManager, Vertex origin, Vertex terminus) - { - DirectedEdge[] connectingEdgesAToB = graphModelManager.getModel().getConnectingEdges(origin.getID(), terminus.getID()); - DirectedEdge[] connectingEdgesBToA = graphModelManager.getModel().getConnectingEdges(terminus.getID(), origin.getID()); - return (origin != terminus) && (connectingEdgesAToB.length == 0) && (connectingEdgesBToA.length == 0); - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/desc/WfVertexDefFactory.java b/src/main/java/com/c2kernel/gui/lifecycle/desc/WfVertexDefFactory.java deleted file mode 100644 index f08f916..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/desc/WfVertexDefFactory.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.c2kernel.gui.lifecycle.desc; -import java.util.HashMap; - -import javax.swing.JOptionPane; - -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.graph.model.TypeNameAndConstructionInfo; -import com.c2kernel.graph.model.VertexFactory; -import com.c2kernel.gui.ImageLoader; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.lifecycle.chooser.ActivityChooser; -import com.c2kernel.gui.lifecycle.chooser.WorkflowDialogue; -import com.c2kernel.lifecycle.ActivityDef; -import com.c2kernel.lifecycle.CompositeActivityDef; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.LocalObjectLoader; -import com.c2kernel.utils.Logger; -public class WfVertexDefFactory implements VertexFactory, WorkflowDialogue -{ - protected CompositeActivityDef mCompositeActivityDef = null; - @Override - public void create(GraphModelManager graphModelManager, GraphPoint location, TypeNameAndConstructionInfo typeNameAndConstructionInfo) - { - String vertexTypeId = null; - if (mCompositeActivityDef != null && typeNameAndConstructionInfo.mInfo instanceof String) - { - vertexTypeId = (String) typeNameAndConstructionInfo.mInfo; - if (vertexTypeId.equals("Atomic") || vertexTypeId.equals("Composite")) - { - // ask for a name - HashMap mhm = new HashMap(); - mhm.put("P1", vertexTypeId); - mhm.put("P2", location); - //************************************************ - ActivityChooser a = - new ActivityChooser( - Language.translate("Please enter a Type for the new activityDef"), - Language.translate("New " + vertexTypeId + " Activity"), - ImageLoader.findImage("graph/newvertex_large.png").getImage(), - this, - mhm); - a.setVisible(true); - } - else - mCompositeActivityDef.newChild("", vertexTypeId, location); - } - } - @Override - public void loadThisWorkflow(String newName, HashMap hashMap) - { - String vertexTypeId = (String) hashMap.get("P1"); - GraphPoint location = (GraphPoint) hashMap.get("P2"); - if (newName == null || newName.equals("")) - return; - Logger.debug(5, newName); - ActivityDef act = (ActivityDef) mCompositeActivityDef.search(mCompositeActivityDef.getID() + "/" + newName); - if (act != null) - { - String unicName = newName; - while (unicName == null - || unicName == "" - || mCompositeActivityDef.search(mCompositeActivityDef.getID() + "/" + unicName) != null) - unicName = - (String) JOptionPane.showInputDialog( - null, - Language.translate("Please type a Name"), - Language.translate("New " + vertexTypeId + " Activity"), - JOptionPane.QUESTION_MESSAGE, - ImageLoader.findImage("graph/newvertex_large.png"), - null, - null); - act = (ActivityDef) mCompositeActivityDef.search(mCompositeActivityDef.getID() + "/" + newName); - mCompositeActivityDef.addExistingActivityDef(unicName, act, location); - } - else - { - try - { - act = LocalObjectLoader.getActDef(newName, 0); - } - catch (Exception ex) - { - MainFrame.exceptionDialog(ex); - return; - } - mCompositeActivityDef.newChild(newName, vertexTypeId, location); - } - } - @Override - public void setCreationContext(Object newContext) - { - if (newContext != null && newContext instanceof CompositeActivityDef) - mCompositeActivityDef = (CompositeActivityDef) newContext; - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/desc/WfVertexDefRenderer.java b/src/main/java/com/c2kernel/gui/lifecycle/desc/WfVertexDefRenderer.java deleted file mode 100644 index 6ba6c49..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/desc/WfVertexDefRenderer.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.c2kernel.gui.lifecycle.desc; - -import java.awt.Graphics2D; - -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.view.VertexRenderer; -import com.c2kernel.lifecycle.ActivitySlotDef; -import com.c2kernel.lifecycle.AndSplitDef; -import com.c2kernel.lifecycle.JoinDef; - -public class WfVertexDefRenderer implements VertexRenderer -{ - protected ActivitySlotDefRenderer mActivitySlotDefRenderer = new ActivitySlotDefRenderer(); - protected SplitJoinDefRenderer mSplitJoinDefRenderer = new SplitJoinDefRenderer(); - - - @Override - public void draw( Graphics2D g2d, Vertex vertex) - { - if ( vertex instanceof ActivitySlotDef ) - { - mActivitySlotDefRenderer.draw( g2d, vertex); - } - else if ( ( vertex instanceof AndSplitDef ) || ( vertex instanceof JoinDef ) ) - { - mSplitJoinDefRenderer.draw( g2d, vertex); - } - } -} - diff --git a/src/main/java/com/c2kernel/gui/lifecycle/instance/ActivityRenderer.java b/src/main/java/com/c2kernel/gui/lifecycle/instance/ActivityRenderer.java deleted file mode 100644 index a13d610..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/instance/ActivityRenderer.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.c2kernel.gui.lifecycle.instance; -import java.awt.Color; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Paint; -import java.awt.Polygon; - -import com.c2kernel.common.GTimeStamp; -import com.c2kernel.common.InvalidDataException; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.view.VertexRenderer; -import com.c2kernel.lifecycle.instance.Activity; -import com.c2kernel.utils.DateUtility; -import com.c2kernel.utils.Language; -public class ActivityRenderer implements VertexRenderer -{ - private Paint mActivePaint = new Color(100, 255, 100); - private Paint mActiveCompPaint = new Color(100, 255, 255); - private Paint mInactivePaint = new Color(255, 255, 255); - private Paint mInactiveCompPaint = new Color(200, 200, 255); - private Paint mErrorPaint = new Color(255, 50, 0); - private Paint mTextPaint = Color.black; - @Override - public void draw(Graphics2D g2d, Vertex vertex) - { - Activity activity = (Activity) vertex; - boolean active = activity.getActive(); - boolean hasError = !activity.verify(); - boolean isComposite = activity.getIsComposite(); - GraphPoint centrePoint = activity.getCentrePoint(); - //String description = activity.getDescription(); - String[] linesOfText = new String[3]; - linesOfText[0] = "(" + activity.getType() + ")"; - linesOfText[1] = activity.getName(); - if (hasError) - linesOfText[2] = Language.translate(activity.getErrors()); - else - { - boolean showTime = activity.getActive() && ((Boolean) activity.getProperties().get("Show time")).booleanValue(); - String stateName = "Invalid State"; - try { - stateName = activity.getStateName(); - } catch (InvalidDataException ex) { } - - linesOfText[2] = - Language.translate(stateName) + (showTime ? " " + getWaitTime(activity.getStateDate()) : ""); - } - - FontMetrics metrics = g2d.getFontMetrics(); - int lineWidth = 0; - int lineHeight = metrics.getHeight(); - int linesHeight = lineHeight * linesOfText.length; - int linesStartY = centrePoint.y - linesHeight / 2 + lineHeight * 2 / 3; - int x = 0; - int y = 0; - int i = 0; - GraphPoint[] outline = vertex.getOutlinePoints(); - Paint actColour; - if (hasError) - actColour = mErrorPaint; - else if (active) - if (isComposite) - actColour = mActiveCompPaint; - else - actColour = mActivePaint; - else if (isComposite) - actColour = mInactiveCompPaint; - else - actColour = mInactivePaint; - g2d.setPaint(actColour); - //g2d.fill3DRect( centrePoint.x - mSize.width / 2, centrePoint.y - mSize.height / 2, mSize.width, mSize.height, true ); - g2d.fill(graphPointsToPolygon(outline)); - g2d.setPaint(mTextPaint); - for (i = 0; i < linesOfText.length; i++) - { - lineWidth = metrics.stringWidth(linesOfText[i]); - x = centrePoint.x - lineWidth / 2; - y = linesStartY + i * lineHeight; - g2d.drawString(linesOfText[i], x, y); - } - } - private static Polygon graphPointsToPolygon(GraphPoint[] points) - { - Polygon polygon = new Polygon(); - int i = 0; - for (i = 0; i < points.length; i++) - { - polygon.addPoint(points[i].x, points[i].y); - } - return polygon; - } - private static String getWaitTime(GTimeStamp date) - { - GTimeStamp now = new GTimeStamp(); - DateUtility.setToNow(now); - long diff = DateUtility.diff(now, date); - long secondes = diff % 60; - long minutes = (diff / 60) % 60; - long hours = (diff / 3600) % 24; - long days = (diff / 3600 / 24); - if (days > 0) - return days + " " + Language.translate("d") + " " + hours + " " + Language.translate("h"); - if (hours > 0) - return hours + " " + Language.translate("h") + " " + minutes + " " + Language.translate("min"); - if (minutes > 0) - return minutes + " " + Language.translate("min"); - return secondes + " " + Language.translate("sec"); - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/instance/FindActDefPanel.java b/src/main/java/com/c2kernel/gui/lifecycle/instance/FindActDefPanel.java deleted file mode 100644 index 233dbf2..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/instance/FindActDefPanel.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.c2kernel.gui.lifecycle.instance; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Iterator; - -import javax.swing.JButton; - -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.graph.view.SelectedVertexPanel; -import com.c2kernel.lifecycle.ActivitySlotDef; -import com.c2kernel.lookup.DomainPath; -import com.c2kernel.lookup.Path; -import com.c2kernel.process.Gateway; - -/************************************************************************** - * - * $Revision: 1.3 $ - * $Date: 2005/12/01 14:23:15 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class FindActDefPanel extends SelectedVertexPanel { - - JButton findButton; - ActivitySlotDef currentAct; - - public FindActDefPanel() { - super(); - findButton = new JButton("Open Definition"); - findButton.setEnabled(false); - add(findButton); - findButton.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - Iterator acts = Gateway.getLookup().search(new DomainPath("/desc/ActivityDesc/"), currentAct.getActivityDef()); - if (acts.hasNext()) MainFrame.treeBrowser.push((DomainPath)acts.next()); - } - }); - } - - /** - * - */ - - @Override - public void select(Vertex vert) { - if (vert instanceof ActivitySlotDef) { - findButton.setEnabled(true); - currentAct = (ActivitySlotDef)vert; - } - else - clear(); - - } - - /** - * - */ - - @Override - public void clear() { - findButton.setEnabled(false); - currentAct = null; - } - -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/instance/SplitJoinRenderer.java b/src/main/java/com/c2kernel/gui/lifecycle/instance/SplitJoinRenderer.java deleted file mode 100644 index 3152772..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/instance/SplitJoinRenderer.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.c2kernel.gui.lifecycle.instance; - -import java.awt.Color; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Paint; - -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.view.VertexRenderer; -import com.c2kernel.lifecycle.instance.AndSplit; -import com.c2kernel.lifecycle.instance.Join; -import com.c2kernel.lifecycle.instance.Loop; -import com.c2kernel.lifecycle.instance.OrSplit; -import com.c2kernel.lifecycle.instance.WfVertex; -import com.c2kernel.lifecycle.instance.XOrSplit; -import com.c2kernel.utils.Language; - -public class SplitJoinRenderer implements VertexRenderer -{ - private Paint mTextPaint = Color.black; - private Paint mBoxPaint = new Color( 204, 204, 204 ); - private Paint mErrorPaint = new Color( 255, 0, 0 ); - private boolean mTextOffsetsNotInitialised = true; - private int mTextYOffset = 0; - private String mAndText = "And"; - private int mAndTextXOffset = 0; - private String mOrText = "Or"; - private int mOrTextXOffset = 0; - private String mLoopText = "Loop"; - private int mLoopTextXOffset = 0; - private String mXOrText = "XOr"; - private int mXOrTextXOffset = 0; - private String mJoinText = "Join"; - private int mJoinTextXOffset = 0; - private String mRouteText = ""; - private int mRouteTextXOffset = 0; - private String mXXXText = "XXX"; - private int mXXXTextXOffset = 0; - - - @Override - public void draw( Graphics2D g2d, Vertex vertex) - { - GraphPoint centrePoint = vertex.getCentrePoint(); - String text = null; - int textXOffset = 0; - int vertexHeight = vertex.getHeight(); - int vertexWidth = vertex.getWidth(); - - - if ( mTextOffsetsNotInitialised ) - { - initialiseTextOffsets( g2d ); - mTextOffsetsNotInitialised = false; - } - if ( vertex instanceof AndSplit ) - { - text = Language.translate(mAndText); - textXOffset = mAndTextXOffset; - } - else if ( vertex instanceof OrSplit ) - { - text = Language.translate(mOrText); - textXOffset = mOrTextXOffset; - } - else if ( vertex instanceof Loop ) - { - text = Language.translate(mLoopText); - textXOffset = mLoopTextXOffset; - } - else if ( vertex instanceof XOrSplit ) - { - text = Language.translate(mXOrText); - textXOffset = mXOrTextXOffset; - } - else if ( vertex instanceof Join ) - { - text = Language.translate(mJoinText); - textXOffset = mJoinTextXOffset; - } - else if ( vertex instanceof Join) - { - String type= (String)((Join)vertex).getProperties().get("Type"); - if (type!=null && type.equals("Route")) - { - text = mRouteText; - textXOffset = mRouteTextXOffset; - } - else - { - text = Language.translate(mJoinText); - textXOffset = mJoinTextXOffset; - } - } - else - { - text = mXXXText; - textXOffset = mXXXTextXOffset; - } - - boolean hasErrors = ((WfVertex)vertex).verify(); - g2d.setPaint( hasErrors ? mBoxPaint : mErrorPaint ); - g2d.fillRect - ( - centrePoint.x - vertexWidth / 2, - centrePoint.y - vertexHeight / 2, - vertexWidth, - vertexHeight - ); - g2d.setPaint( mTextPaint ); - g2d.drawRect - ( - centrePoint.x - vertexWidth / 2, - centrePoint.y - vertexHeight / 2, - vertexWidth, - vertexHeight - ); - g2d.drawString( text, centrePoint.x - textXOffset, centrePoint.y + mTextYOffset ); - - if (!hasErrors) { - g2d.setPaint( mErrorPaint ); - String errors = Language.translate(((WfVertex)vertex).getErrors()); - int errorWidth = g2d.getFontMetrics().stringWidth( errors ); - g2d.drawString( errors, centrePoint.x - ( errorWidth / 2), centrePoint.y + vertexHeight ); - } - } - - private void initialiseTextOffsets( Graphics2D g2d ) - { - FontMetrics metrics = g2d.getFontMetrics(); - - - mTextYOffset = metrics.getHeight() / 3; - mAndTextXOffset = metrics.stringWidth( Language.translate(mAndText) ) / 2; - mOrTextXOffset = metrics.stringWidth( Language.translate(mOrText) ) / 2; - mXOrTextXOffset = metrics.stringWidth( Language.translate(mXOrText) ) / 2; - mJoinTextXOffset = metrics.stringWidth( Language.translate(mJoinText) ) / 2; - mLoopTextXOffset = metrics.stringWidth( Language.translate(mLoopText) ) / 2; - } -} - diff --git a/src/main/java/com/c2kernel/gui/lifecycle/instance/TransitionPanel.java b/src/main/java/com/c2kernel/gui/lifecycle/instance/TransitionPanel.java deleted file mode 100644 index f9a1a81..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/instance/TransitionPanel.java +++ /dev/null @@ -1,214 +0,0 @@ -package com.c2kernel.gui.lifecycle.instance; - -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Map; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; - -import com.c2kernel.common.InvalidDataException; -import com.c2kernel.entity.agent.Job; -import com.c2kernel.entity.proxy.ItemProxy; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.graph.view.SelectedVertexPanel; -import com.c2kernel.gui.tabs.ItemTabPane; -import com.c2kernel.gui.tabs.execution.Executor; -import com.c2kernel.lifecycle.instance.Activity; -import com.c2kernel.lifecycle.instance.stateMachine.State; -import com.c2kernel.lifecycle.instance.stateMachine.StateMachine; -import com.c2kernel.lifecycle.instance.stateMachine.Transition; -import com.c2kernel.utils.Logger; - -/************************************************************************** - * - * $Revision: 1.8 $ - * $Date: 2005/09/07 13:46:31 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class TransitionPanel extends SelectedVertexPanel implements ActionListener { - protected Activity mCurrentAct; - protected GridBagLayout gridbag; - protected GridBagConstraints c; - protected Box transBox; - protected JComboBox executors; - protected JComboBox states = new JComboBox(); - protected JCheckBox active = new JCheckBox(); - protected JLabel status = new JLabel(); - protected ItemProxy mItem; - - public TransitionPanel() { - super(); - gridbag = new GridBagLayout(); - setLayout(gridbag); - c = new GridBagConstraints(); - c.gridx=0; c.gridy=0; - c.weightx=1; c.weighty=0; - c.fill=GridBagConstraints.HORIZONTAL; - - JLabel title = new JLabel("Available Transitions"); - title.setFont(ItemTabPane.titleFont); - gridbag.setConstraints(title, c); - add(title); - - c.gridy++; - gridbag.setConstraints(status, c); - add(status); - c.gridy++; - - transBox = Box.createHorizontalBox(); - gridbag.setConstraints(transBox, c); - add(transBox); - - c.weightx=0; c.gridx++; - executors = MainFrame.getExecutionPlugins(); - if (executors.getItemCount() > 1) { - gridbag.setConstraints(executors, c); - add(executors); - } - - - - if (MainFrame.isAdmin) { - c.gridx=0; c.gridy++; - title = new JLabel("State Hacking"); - title.setFont(ItemTabPane.titleFont); - gridbag.setConstraints(title, c); - add(title); - Box hackBox = Box.createHorizontalBox(); - hackBox.add(states); - hackBox.add(Box.createHorizontalGlue()); - hackBox.add(new JLabel("Active:")); - hackBox.add(active); - c.gridy++; - gridbag.setConstraints(hackBox, c); - add(hackBox); - states.addActionListener(this); - active.addActionListener(this); - } - - clear(); - - } - /** - * - */ - @Override - public void select(Vertex vert) { - clear(); - if (!(vert instanceof Activity)) return; - mCurrentAct = (Activity)vert; - StateMachine sm; - try { - sm = mCurrentAct.getStateMachine(); - } catch (InvalidDataException e) { - status.setText("Invalid state machine."); - Logger.error(e); - return; - } - states.removeAllItems(); - int currentState; - try { - currentState = mCurrentAct.getState(); - } catch (InvalidDataException e) { - status.setText("Could not find activity state"); - Logger.error(e); - return; - } - for (State thisState : sm.getStates()) { - states.addItem(thisState); - if (currentState == thisState.getId()) - states.setSelectedItem(thisState); - } - states.setEnabled(true); - active.setSelected(mCurrentAct.active); - active.setEnabled(true); - Logger.msg(1, "Retrieving possible transitions for activity "+mCurrentAct.getName()); - Map transitions; - try { - transitions = mCurrentAct.getStateMachine().getPossibleTransitions(mCurrentAct, MainFrame.userAgent.getPath()); - } catch (Exception e) { - status.setText("Error loading possible transitions of activity. See log."); - Logger.error(e); - return; - } - - if (transitions.size() == 0) { - status.setText("None"); - return; - } - - for (Transition trans:transitions.keySet()) { - boolean hasOutcome = trans.hasOutcome(mCurrentAct.getProperties()); - if (!hasOutcome || (hasOutcome && !trans.getOutcome().isRequired())) { - JButton thisTrans = new JButton(trans.getName()); - thisTrans.setActionCommand("Trans:"+trans.getId()); - thisTrans.addActionListener(this); - transBox.add(thisTrans); - transBox.add(Box.createHorizontalGlue()); - } - status.setText(transitions.size()+" transitions possible."); - } - revalidate(); - } - - @Override - public void actionPerformed(ActionEvent e) { - if (e.getSource() == active && mCurrentAct != null) { - mCurrentAct.active = active.isSelected(); - return; - } - if (e.getSource() == states && mCurrentAct != null) { - mCurrentAct.setState(states.getSelectedIndex()); - return; - } - if (!e.getActionCommand().startsWith("Trans:")) return; - int transition = Integer.parseInt(e.getActionCommand().substring(6)); - Logger.msg("Requesting transition "+transition); - try { - StateMachine actSM = mCurrentAct.getStateMachine(); - Job thisJob = new Job(mCurrentAct, - mItem.getPath(), - actSM.getTransition(transition), - MainFrame.userAgent.getPath(), - "Admin"); - Executor selectedExecutor = (Executor)executors.getSelectedItem(); - selectedExecutor.execute(thisJob, status); - } catch (Exception ex) { - String className = ex.getClass().getName(); - className = className.substring(className.lastIndexOf('.')+1); - Logger.error(ex); - JOptionPane.showMessageDialog(null, ex.getMessage(), className, JOptionPane.ERROR_MESSAGE); - } - - } - - @Override - public void clear() { - mCurrentAct = null; - transBox.removeAll(); - status.setText("No activity selected"); - states.setEnabled(false); - active.setSelected(false); - active.setEnabled(false); - revalidate(); - } - - - /** - * @param item The mItem to set. - */ - public void setItem(ItemProxy item) { - mItem = item; - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/instance/WfDirectedEdgeRenderer.java b/src/main/java/com/c2kernel/gui/lifecycle/instance/WfDirectedEdgeRenderer.java deleted file mode 100644 index 484b2fc..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/instance/WfDirectedEdgeRenderer.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.c2kernel.gui.lifecycle.instance; -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.Shape; -import java.awt.geom.AffineTransform; -import java.awt.geom.GeneralPath; - -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.gui.graph.view.DirectedEdgeRenderer; -import com.c2kernel.lifecycle.instance.Next; -public class WfDirectedEdgeRenderer implements DirectedEdgeRenderer -{ - private GeneralPath mArrowTemplate = new GeneralPath(); - public WfDirectedEdgeRenderer() - { - mArrowTemplate.moveTo(-5, 5); - mArrowTemplate.lineTo(0, 0); - mArrowTemplate.lineTo(5, 5); - } - @Override - public void draw(Graphics2D g2d, DirectedEdge directedEdge) - { - GraphPoint originPoint = directedEdge.getOriginPoint(); - GraphPoint terminusPoint = directedEdge.getTerminusPoint(); - GraphPoint midPoint = new GraphPoint(); - AffineTransform transform = new AffineTransform(); - Shape arrow = null; - Next next = (Next) directedEdge; - String text = (String) next.getProperties().get("Alias"); - g2d.setPaint(Color.black); - if (("Broken +".equals(next.getProperties().get("Type")))) - { - g2d.drawLine(originPoint.x, originPoint.y, originPoint.x, (originPoint.y + terminusPoint.y) / 2); - g2d.drawLine(originPoint.x, (originPoint.y + terminusPoint.y) / 2, terminusPoint.x, (originPoint.y + terminusPoint.y) / 2); - g2d.drawLine(terminusPoint.x, (originPoint.y + terminusPoint.y) / 2, terminusPoint.x, terminusPoint.y); - midPoint.x = (originPoint.x + terminusPoint.x) / 2; - midPoint.y = (originPoint.y + terminusPoint.y) / 2; - transform.translate(midPoint.x, midPoint.y); - transform.rotate( - calcArrowAngle( - originPoint.x, - originPoint.x - terminusPoint.x > -5 - && originPoint.x - terminusPoint.x < 5 ? originPoint.y : (originPoint.y + terminusPoint.y) / 2, - terminusPoint.x, - originPoint.x - terminusPoint.x > -5 - && originPoint.x - terminusPoint.x < 5 ? terminusPoint.y : (originPoint.y + terminusPoint.y) / 2)); - } - else if (("Broken -".equals(next.getProperties().get("Type")))) - { - g2d.drawLine(originPoint.x, originPoint.y, terminusPoint.x, originPoint.y); - g2d.drawLine(terminusPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y); - boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); - midPoint.x = arrowOnY ? terminusPoint.x : (originPoint.x + terminusPoint.x) / 2; - midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : originPoint.y; - transform.translate(midPoint.x, midPoint.y); - transform.rotate( - calcArrowAngle( - arrowOnY ? terminusPoint.x : originPoint.x, - arrowOnY ? originPoint.y : originPoint.y, - arrowOnY ? terminusPoint.x : terminusPoint.x, - arrowOnY ? terminusPoint.y : originPoint.y)); - } - else if (("Broken |".equals(next.getProperties().get("Type")))) - { - g2d.drawLine(originPoint.x, originPoint.y, originPoint.x, terminusPoint.y); - g2d.drawLine(originPoint.x, terminusPoint.y, terminusPoint.x, terminusPoint.y); - boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); - midPoint.x = arrowOnY ? originPoint.x : (originPoint.x + terminusPoint.x) / 2; - midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : terminusPoint.y; - transform.translate(midPoint.x, midPoint.y); - transform.rotate( - calcArrowAngle( - arrowOnY ? terminusPoint.x : originPoint.x, - arrowOnY ? originPoint.y : originPoint.y, - arrowOnY ? terminusPoint.x : terminusPoint.x, - arrowOnY ? terminusPoint.y : originPoint.y)); - } - else - { - g2d.drawLine(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y); - midPoint.x = originPoint.x + (terminusPoint.x - originPoint.x) / 2; - midPoint.y = originPoint.y + (terminusPoint.y - originPoint.y) / 2; - transform.translate(midPoint.x, midPoint.y); - transform.rotate(calcArrowAngle(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y)); - } - arrow = mArrowTemplate.createTransformedShape(transform); - g2d.draw(arrow); - if (text != null) - g2d.drawString(text, midPoint.x + 10, midPoint.y); - } - private static double calcArrowAngle(int originX, int originY, int terminusX, int terminusY) - { - double width = terminusX - originX; - double height = terminusY - originY; - if ((width == 0) && (height > 0)) - { - return Math.PI; - } - if ((width == 0) && (height < 0)) - { - return 0; - } - if ((width > 0) && (height == 0)) - { - return Math.PI / 2.0; - } - if ((width < 0) && (height == 0)) - { - return -1.0 * Math.PI / 2.0; - } - if ((width > 0) && (height > 0)) - { - return Math.PI / 2.0 + Math.atan(Math.abs(height) / Math.abs(width)); - } - if ((width > 0) && (height < 0)) - { - return Math.atan(Math.abs(width) / Math.abs(height)); - } - if ((width < 0) && (height < 0)) - { - return -1.0 * Math.atan(Math.abs(width) / Math.abs(height)); - } - if ((width < 0) && (height > 0)) - { - return -1.0 * (Math.PI / 2.0 + Math.atan(Math.abs(height) / Math.abs(width))); - } - return 0.0; - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/instance/WfEdgeFactory.java b/src/main/java/com/c2kernel/gui/lifecycle/instance/WfEdgeFactory.java deleted file mode 100644 index 06f7462..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/instance/WfEdgeFactory.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.c2kernel.gui.lifecycle.instance; - -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.EdgeFactory; -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.TypeNameAndConstructionInfo; -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.lifecycle.instance.WfVertex; - -public class WfEdgeFactory implements EdgeFactory -{ - @Override - public void create - ( - GraphModelManager graphModelManager, - Vertex origin, - Vertex terminus, - TypeNameAndConstructionInfo typeNameAndConstructionInfo - ) - { - if ( validCreation( graphModelManager, origin, terminus ) ) - ((WfVertex)origin).addNext((WfVertex)terminus); - - } - - private static boolean validCreation( GraphModelManager graphModelManager, Vertex origin, Vertex terminus ) - { - DirectedEdge[] connectingEdgesAToB = graphModelManager.getModel().getConnectingEdges( origin.getID() , terminus.getID() ); - DirectedEdge[] connectingEdgesBToA = graphModelManager.getModel().getConnectingEdges( terminus.getID(), origin.getID() ); - - - return ( origin != terminus ) && ( connectingEdgesAToB.length == 0 ) && ( connectingEdgesBToA.length == 0 ); - } -} - diff --git a/src/main/java/com/c2kernel/gui/lifecycle/instance/WfGraphPanel.java b/src/main/java/com/c2kernel/gui/lifecycle/instance/WfGraphPanel.java deleted file mode 100644 index 91257cb..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/instance/WfGraphPanel.java +++ /dev/null @@ -1,59 +0,0 @@ -/*Created on 21 nov. 2003 */ -package com.c2kernel.gui.lifecycle.instance; - -import java.awt.Graphics2D; - -import com.c2kernel.graph.model.DirectedEdge; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.gui.graph.view.DirectedEdgeRenderer; -import com.c2kernel.gui.graph.view.GraphPanel; -import com.c2kernel.gui.graph.view.VertexRenderer; -import com.c2kernel.lifecycle.instance.Next; - -/** @author XSeb74*/ -public class WfGraphPanel extends GraphPanel -{ - public WfGraphPanel(DirectedEdgeRenderer d,VertexRenderer v) - { - super(d,v); - } - // Draws the highlight of the specified edge - @Override - protected void drawEdgeHighlight(Graphics2D g2d, DirectedEdge edge) - { - GraphPoint originPoint = edge.getOriginPoint(); - GraphPoint terminusPoint = edge.getTerminusPoint(); - GraphPoint midPoint = new GraphPoint(); - - if ("Straight".equals(((Next)edge).getProperties().get("Type")) || ((Next)edge).getProperties().get("Type") == null) - { - midPoint.x = originPoint.x + (terminusPoint.x - originPoint.x) / 2; - midPoint.y = originPoint.y + (terminusPoint.y - originPoint.y) / 2; - } - else if (("Broken +".equals(((Next)edge).getProperties().get("Type")))) - { - midPoint.x = (originPoint.x + terminusPoint.x) / 2; - midPoint.y = (originPoint.y + terminusPoint.y) / 2; - } - else if (("Broken -".equals(((Next)edge).getProperties().get("Type")))) - { - boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); - midPoint.x = arrowOnY ? terminusPoint.x : (originPoint.x + terminusPoint.x) / 2; - midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : originPoint.y; - } - else if (("Broken |".equals(((Next)edge).getProperties().get("Type")))) - { - boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); - midPoint.x = arrowOnY ? originPoint.x : (originPoint.x + terminusPoint.x) / 2; - midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : terminusPoint.y; - } - int minX = midPoint.x - 10; - int minY = midPoint.y - 10; - int maxX = midPoint.x + 10; - int maxY = midPoint.y + 10; - g2d.drawLine(minX, minY, maxX, minY); - g2d.drawLine(maxX, minY, maxX, maxY); - g2d.drawLine(maxX, maxY, minX, maxY); - g2d.drawLine(minX, maxY, minX, minY); - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/instance/WfVertexFactory.java b/src/main/java/com/c2kernel/gui/lifecycle/instance/WfVertexFactory.java deleted file mode 100644 index 91a0837..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/instance/WfVertexFactory.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.c2kernel.gui.lifecycle.instance; -import java.io.Serializable; -import java.util.HashMap; - -import javax.swing.JOptionPane; - -import com.c2kernel.graph.model.GraphModelManager; -import com.c2kernel.graph.model.GraphPoint; -import com.c2kernel.graph.model.TypeNameAndConstructionInfo; -import com.c2kernel.graph.model.VertexFactory; -import com.c2kernel.gui.ImageLoader; -import com.c2kernel.gui.lifecycle.chooser.ActivityChooser; -import com.c2kernel.gui.lifecycle.chooser.WorkflowDialogue; -import com.c2kernel.lifecycle.ActivityDef; -import com.c2kernel.lifecycle.instance.Activity; -import com.c2kernel.lifecycle.instance.CompositeActivity; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.LocalObjectLoader; -public class WfVertexFactory implements VertexFactory, WorkflowDialogue -{ - protected CompositeActivity mRootAct = null; - @Override - public void create(GraphModelManager graphModelManager, GraphPoint location, TypeNameAndConstructionInfo typeNameAndConstructionInfo) - { - String vertexTypeId = null; - if (mRootAct != null && typeNameAndConstructionInfo.mInfo instanceof String) - { - vertexTypeId = (String) typeNameAndConstructionInfo.mInfo; - if (vertexTypeId.equals("Atomic") || vertexTypeId.equals("Composite")) - { - HashMap mhm = new HashMap(); - mhm.put("P1", vertexTypeId); - mhm.put("P2", location); - //************************************************ - ActivityChooser a = - new ActivityChooser( - Language.translate("Please enter a Type for the new activity"), - Language.translate("New " + vertexTypeId + " Activity"), - ImageLoader.findImage("graph/newvertex_large.png").getImage(), - this, - mhm); - a.setVisible(true); - } - else - mRootAct.newChild(vertexTypeId, location); - } - } - @Override - public void setCreationContext(Object newContext) - { - if (newContext != null && newContext instanceof CompositeActivity) - mRootAct = (CompositeActivity) newContext; - } - @Override - public void loadThisWorkflow(String newName, HashMap hashMap) - { - String vertexTypeId = (String) hashMap.get("P1"); - GraphPoint location = (GraphPoint) hashMap.get("P2"); - if (newName == null) - return; - - - String unicName = newName; - while (mRootAct.search(mRootAct.getPath() + "/" + unicName) != null) - { - unicName = - (String) JOptionPane.showInputDialog( - null, - Language.translate("Activity name not unique. Please give another."), - Language.translate("New " + vertexTypeId + " Activity"), - JOptionPane.QUESTION_MESSAGE, - ImageLoader.findImage("graph/newvertex_large.png"), - null, - null); - if (newName.equals("")) - return; - } - Activity act = null; - try - { - ActivityDef actD = LocalObjectLoader.getActDef(newName, 0); - act = (Activity)actD.instantiate(unicName); - } - catch (Exception e) - { - } - if (act == null) - mRootAct.newChild(unicName, vertexTypeId, location); - else - mRootAct.newExistingChild(act, unicName, location); - } -} diff --git a/src/main/java/com/c2kernel/gui/lifecycle/instance/WfVertexRenderer.java b/src/main/java/com/c2kernel/gui/lifecycle/instance/WfVertexRenderer.java deleted file mode 100644 index 07a4e29..0000000 --- a/src/main/java/com/c2kernel/gui/lifecycle/instance/WfVertexRenderer.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.c2kernel.gui.lifecycle.instance; - -import java.awt.Graphics2D; - -import com.c2kernel.graph.model.Vertex; -import com.c2kernel.gui.graph.view.VertexRenderer; -import com.c2kernel.lifecycle.instance.Activity; -import com.c2kernel.lifecycle.instance.Join; -import com.c2kernel.lifecycle.instance.Split; - -public class WfVertexRenderer implements VertexRenderer -{ - protected ActivityRenderer mActivityRenderer = new ActivityRenderer(); - protected SplitJoinRenderer mSplitJoinRenderer = new SplitJoinRenderer(); - - @Override - public void draw( Graphics2D g2d, Vertex vertex) - { - if ( vertex instanceof Activity ) { mActivityRenderer.draw( g2d, vertex); } - else if ( ( vertex instanceof Split ) || ( vertex instanceof Join ) ) { mSplitJoinRenderer.draw( g2d, vertex ); } - } -} - diff --git a/src/main/java/com/c2kernel/gui/tabs/CloseTabIcon.java b/src/main/java/com/c2kernel/gui/tabs/CloseTabIcon.java deleted file mode 100644 index a117df4..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/CloseTabIcon.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.c2kernel.gui.tabs; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Graphics; -import java.awt.Rectangle; - -import javax.swing.Icon; - -/** - * @author Developpement - * - * To change this generated comment edit the template variable "typecomment": - * Window>Preferences>Java>Templates. - * To enable and disable the creation of type comments go to - * Window>Preferences>Java>Code Generation. - */ -/** * The class which generates the 'X' icon for the tabs. The constructor * accepts an icon which is extra to the 'X' icon, so you can have tabs * like in JBuilder. This value is null if no extra icon is required. */ -class CloseTabIcon implements Icon -{ - private int x_pos; - private int y_pos; - private int width; - private int height; - private Icon fileIcon; - public CloseTabIcon(Icon fileIcon) - { - this.fileIcon = fileIcon; - width = 16; - height = 16; - } - @Override - public void paintIcon(Component c, Graphics g, int x, int y) - { - this.x_pos = x; - this.y_pos = y; - Color col = g.getColor(); - g.setColor(Color.black); - int y_p = y + 2; - g.drawLine(x + 1, y_p, x + 12, y_p); - g.drawLine(x + 1, y_p + 13, x + 12, y_p + 13); - g.drawLine(x, y_p + 1, x, y_p + 12); - g.drawLine(x + 13, y_p + 1, x + 13, y_p + 12); - g.drawLine(x + 3, y_p + 3, x + 10, y_p + 10); - g.drawLine(x + 3, y_p + 4, x + 9, y_p + 10); - g.drawLine(x + 4, y_p + 3, x + 10, y_p + 9); - g.drawLine(x + 10, y_p + 3, x + 3, y_p + 10); - g.drawLine(x + 10, y_p + 4, x + 4, y_p + 10); - g.drawLine(x + 9, y_p + 3, x + 3, y_p + 9); - g.setColor(col); - if (fileIcon != null) - { - fileIcon.paintIcon(c, g, x + width, y_p); - } - } - @Override - public int getIconWidth() - { - return width + (fileIcon != null ? fileIcon.getIconWidth() : 0); - } - @Override - public int getIconHeight() - { - return height; - } - public Rectangle getBounds() - { - return new Rectangle(x_pos, y_pos, width, height); - } -} \ No newline at end of file diff --git a/src/main/java/com/c2kernel/gui/tabs/CollectionPane.java b/src/main/java/com/c2kernel/gui/tabs/CollectionPane.java deleted file mode 100644 index 9578497..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/CollectionPane.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.c2kernel.gui.tabs; -import java.awt.GridBagConstraints; -import java.util.StringTokenizer; - -import javax.swing.JTabbedPane; - -import com.c2kernel.collection.Aggregation; -import com.c2kernel.collection.Collection; -import com.c2kernel.collection.CollectionDescription; -import com.c2kernel.collection.CollectionMember; -import com.c2kernel.collection.Dependency; -import com.c2kernel.entity.proxy.MemberSubscription; -import com.c2kernel.entity.proxy.ProxyObserver; -import com.c2kernel.gui.tabs.collection.AggregationView; -import com.c2kernel.gui.tabs.collection.CollectionView; -import com.c2kernel.gui.tabs.collection.DependencyView; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Logger; -/** - * @version $Revision: 1.36 $ $Date: 2005/10/06 06:51:15 $ - * @author $Author: abranson $ - */ -public class CollectionPane extends ItemTabPane implements ProxyObserver> -{ - JTabbedPane collTabs; - - public CollectionPane() - { - super("Collection", "Item Collection"); - createLayout(); - } - - @Override - public void add(Collection contents) - { - Logger.msg(5, "Got "+contents.getName()+": "+contents.getClass().getName()); - Logger.msg(7, "Looking for existing "+contents.getName()); - CollectionView thisCollView = findTabForCollName(contents.getName()); - if (thisCollView == null){ - if (contents instanceof Aggregation) { - AggregationView thisAggView = new AggregationView(); - thisAggView.setItem(sourceItem.getItem()); - thisAggView.setCollection((Aggregation)contents); - thisCollView = thisAggView; - } - else if (contents instanceof Dependency) { - DependencyView thisDepView = new DependencyView(); - thisDepView.setItem(sourceItem.getItem()); - thisDepView.setCollection((Dependency)contents); - thisCollView = thisDepView; - } - else { - Logger.error("Collection type "+contents.getClass().getName()+" not known"); - return; - } - Logger.msg(3, "Adding new "+thisCollView.getClass().getName()); - collTabs.add(contents.getName()+(contents instanceof CollectionDescription?"*":""), thisCollView); - } - } - - @Override - public void remove(String id) - { - - } - - private CollectionView findTabForCollName(String collName) { - CollectionView thisCollView = null; - for (int i = 0; i < collTabs.getTabCount(); i++) { - String tabName = collTabs.getTitleAt(i); - if (tabName.equals(collName)) { - thisCollView = (CollectionView)collTabs.getComponentAt(i); - } - } - return thisCollView; - } - - protected void createLayout() - { - initPanel(); - // Add the collection tab pane - getGridBagConstraints(); - c.gridx = 0; - c.gridy = 1; - c.fill = GridBagConstraints.BOTH; - c.weighty = 2.0; - collTabs = new JTabbedPane(); - gridbag.setConstraints(collTabs, c); - add(collTabs); - } - - @Override - public void run() - { - Thread.currentThread().setName("Collection Loader"); - sourceItem.getItem().subscribe(new MemberSubscription>(this, ClusterStorage.COLLECTION, false)); - try { - String collNames = sourceItem.getItem().queryData(ClusterStorage.COLLECTION+"/all"); - StringTokenizer tok = new StringTokenizer(collNames, ","); - while (tok.hasMoreTokens()) { - Collection thisLastColl = (Collection) sourceItem.getItem().getObject(ClusterStorage.COLLECTION+"/"+tok.nextToken()+"/last"); - add(thisLastColl); - } - } catch (Exception e) { - Logger.error(e); - Logger.msg(2, "Error loading collections"); - } - } - - @Override - public void reload() - { - Gateway.getStorage().clearCache(sourceItem.getItemPath(), ClusterStorage.COLLECTION); - collTabs.removeAll(); - initForItem(sourceItem); - } - - @Override - public void control(String control, String msg) { - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/DomainPathAdmin.java b/src/main/java/com/c2kernel/gui/tabs/DomainPathAdmin.java deleted file mode 100644 index 5745731..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/DomainPathAdmin.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.c2kernel.gui.tabs; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.Iterator; - -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.table.AbstractTableModel; - -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.entity.proxy.ItemProxy; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.lookup.DomainPath; -import com.c2kernel.process.Gateway; - -/************************************************************************** - * - * $Revision: 1.3 $ - * $Date: 2004/10/21 08:02:21 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class DomainPathAdmin extends Box implements ActionListener { - - ItemProxy entity; - JTable table; - DomainPathTableModel model; - JButton addButton; - JButton removeButton; - - public DomainPathAdmin() { - super(BoxLayout.Y_AXIS); - - model = new DomainPathTableModel(this); - table = new JTable(model); - add(new JScrollPane(table)); - - add(Box.createVerticalGlue()); - Box buttonBox = Box.createHorizontalBox(); - addButton = new JButton("Add"); - buttonBox.add(addButton); - buttonBox.add(Box.createHorizontalGlue()); - removeButton = new JButton("Remove"); - buttonBox.add(removeButton); - buttonBox.add(Box.createHorizontalGlue()); - add(buttonBox); - - addButton.setActionCommand("add"); - addButton.addActionListener(this); - removeButton.setActionCommand("remove"); - removeButton.addActionListener(this); - } - - public void setEntity(ItemProxy entity) { - this.entity = entity; - model.loadPaths(); - } - - @Override -public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("add")) { - String newPath = JOptionPane.showInputDialog(this, "Enter new path,", "Add Domain Path", JOptionPane.PLAIN_MESSAGE); - addDomainPath(new DomainPath(newPath)); - model.loadPaths(); - } - else if (e.getActionCommand().equals("remove")) { - if (table.getSelectedRow() > -1) { - DomainPath oldPath = model.getPath(table.getSelectedRow()); - removeDomainPath(oldPath); - model.loadPaths(); - } - } - } - - public boolean removeDomainPath(DomainPath oldPath) { - return alterDomainPath(oldPath, "Remove"); - } - - public boolean addDomainPath(DomainPath newPath) { - return alterDomainPath(newPath, "Add"); - } - - public boolean alterDomainPath(DomainPath path, String action) { - - if (JOptionPane.showConfirmDialog(this, - action+" "+path+"?", - action+" Domain Path", - JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) - return false; - - String[] params = new String[1]; - params[0] = path.toString(); - try { - MainFrame.userAgent.execute(entity, action+"DomainPath", params); - } catch (Exception e) { - MainFrame.exceptionDialog(e); - return false; - } - return true; - } - - private class DomainPathTableModel extends AbstractTableModel { - ArrayList domPaths; - DomainPathAdmin parent; - public DomainPathTableModel(DomainPathAdmin parent) { - this.parent = parent; - domPaths = new ArrayList(); - } - - public void loadPaths() { - domPaths.clear(); - for (Iterator currentPaths = Gateway.getLookup().search(new DomainPath(), entity.getName()); currentPaths.hasNext();) { - DomainPath thisPath = (DomainPath)currentPaths.next(); - try { - if (thisPath.getItemPath().equals(entity.getPath())) domPaths.add(thisPath); - } catch (ObjectNotFoundException e) { } - } - fireTableDataChanged(); - } - - public DomainPath getPath(int rowIndex) { - return domPaths.get(rowIndex); - } - @Override - public void setValueAt(Object aValue, int rowIndex, int columnIndex) { - DomainPath oldPath = domPaths.get(rowIndex); - DomainPath newPath = new DomainPath((String)aValue); - boolean success = parent.addDomainPath(newPath); - if (success) - success = parent.removeDomainPath(oldPath); - if (success) { - oldPath.setPath(newPath); - fireTableDataChanged(); - } - } - - @Override - public Class getColumnClass(int columnIndex) { - return String.class; - } - - @Override - public int getColumnCount() { - return 1; - } - - @Override - public String getColumnName(int column) { - return "Path"; - } - - @Override - public int getRowCount() { - return domPaths.size(); - } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - return domPaths.get(rowIndex).toString(); - } - - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return true; - } - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/ExecutionPane.java b/src/main/java/com/c2kernel/gui/tabs/ExecutionPane.java deleted file mode 100644 index df51dba..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/ExecutionPane.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.c2kernel.gui.tabs; - -import java.awt.GridBagConstraints; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.util.ArrayList; -import java.util.Iterator; - -import javax.swing.Box; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import com.c2kernel.entity.agent.Job; -import com.c2kernel.entity.proxy.MemberSubscription; -import com.c2kernel.entity.proxy.ProxyObserver; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.tabs.execution.ActivityItem; -import com.c2kernel.gui.tabs.execution.ActivityViewer; -import com.c2kernel.lifecycle.instance.Workflow; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -public class ExecutionPane extends ItemTabPane implements ProxyObserver { - - ArrayList jobList = null; - Object jobLock = new Object(); - ActivityItem emptyAct = new ActivityItem(); - JLabel noActs = new JLabel(Language.translate("There are currently no activities that you can execute in this item.")); - JPanel view = new JPanel(new GridLayout(1, 1)); - ActivityViewer currentActView; - JComboBox activitySelector = new JComboBox(); - Box activityBox = Box.createHorizontalBox(); - String selAct = null; - ArrayList activities; - String autoRun = null; - boolean init = false; - boolean formIsActive = false; - public ExecutionPane() { - super("Execution", "Activity Execution"); - super.initPanel(); - // add view panel - c = new GridBagConstraints(); - c.gridx = 0; c.gridy = 1; c.weightx = 1.0; c.weighty = 2.0; - c.insets = new Insets(5, 5, 5, 5); - c.anchor = GridBagConstraints.CENTER; - c.fill = GridBagConstraints.BOTH; - gridbag.setConstraints(view, c); - - add(view); - // create activity selection box - activityBox.add(new JLabel(Language.translate("Select Activity") + ": ")); - activityBox.add(Box.createHorizontalStrut(5)); - activitySelector.setEditable(false); - activityBox.add(activitySelector); - activitySelector.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent selection) { - if (selection.getStateChange() == ItemEvent.SELECTED) { - selectActivity(selection.getItem()); - } - } - }); - } - @Override - public void run() { - Thread.currentThread().setName("Execution Pane Builder"); - sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.LIFECYCLE, false)); - loadJobList(); - init = true; - if (autoRun != null) { - runCommand(autoRun); - autoRun = null; - } - } - private void loadJobList() { - synchronized (jobLock) { - activitySelector.removeAllItems(); - view.removeAll(); - activities = new ArrayList(); - try { - jobList = (sourceItem.getItem()).getJobList(MainFrame.userAgent); - activitySelector.addItem(emptyAct); - for (Job thisJob : jobList) { - //Logger.msg(7, "ExecutionPane - loadJobList " + thisJob.hasOutcome() + "|" + thisJob.getSchemaName() + "|" + thisJob.getSchemaVersion() + "|"); - ActivityItem newAct = new ActivityItem(thisJob); - if (activities.contains(newAct)) { - int actIndex = activities.indexOf(newAct); - activities.get(actIndex).addJob(thisJob); - } else { - Logger.msg(2, "ExecutionPane - Adding activity " + thisJob.getStepPath()); - addActivity(newAct); - } - } - } catch (Exception e) { - Logger.error("Error fetching joblist"); - Logger.error(e); - } - - switch (activities.size()) { - case 0 : - view.add(noActs); - break; - case 1 : - currentActView = new ActivityViewer(activities.get(0), sourceItem.getItem(), this); - c.fill = GridBagConstraints.BOTH; - gridbag.setConstraints(view, c); - view.add(currentActView); - currentActView.init(); - break; - default : - c.fill = GridBagConstraints.HORIZONTAL; - gridbag.setConstraints(view, c); - view.add(activityBox); - } - } - revalidate(); - updateUI(); - } - @Override - public void reload() { - loadJobList(); - } - private void addActivity(ActivityItem newAct) { - if (activities.contains(newAct)) { - Logger.msg(6, "ExecutionPane.addActivity(): Already in " + newAct.getStepPath()); - int actIndex = activities.indexOf(newAct); - activitySelector.removeItemAt(actIndex); - activitySelector.insertItemAt(newAct, actIndex); - activities.set(actIndex, newAct); - } else { - Logger.msg(6, "ExecutionPane.addActivity(): New " + newAct.getStepPath()); - activities.add(newAct); - activitySelector.addItem(newAct); - } - } - private void selectActivity(Object selObj) { - if (selObj.equals(emptyAct)) - return; - view.removeAll(); - c.fill = GridBagConstraints.BOTH; - gridbag.setConstraints(view, c); - currentActView = new ActivityViewer((ActivityItem)selObj, sourceItem.getItem(), this); - view.add(currentActView); - revalidate(); - updateUI(); - currentActView.init(); - } - @Override - public void runCommand(String command) { - if (init) { - for (ActivityItem act : activities) { - if (act.name.equals(command)) { - selectActivity(act); - } - } - } else - autoRun = command; - } - /** - * when the workflow changes, reload this pane. - */ - @Override - public void add(Workflow contents) { - if (!formIsActive) - reload(); - else { // look to see if this form is now invalid - // get the new joblist - try { - jobList = (sourceItem.getItem()).getJobList(MainFrame.userAgent); - } catch (Exception ex) { - return; - } - // compare to currently editing jobs - ArrayList currentActJobs = currentActView.getActivity().getJobs(); - boolean allValid = true; - for (Iterator iter = currentActJobs.iterator(); iter.hasNext() && allValid;) { - Job thisJob = (Job)iter.next(); - boolean stillValid = false; - for (Job newJob : jobList) { - if (thisJob.equals(newJob)) { - stillValid = true; - break; - } - } - allValid &= stillValid; - } - if (!allValid) { // not all transitions are now valid - reload(); // refresh the execution pane - } - } - } - /** - * Not pertinent for this one - */ - @Override - public void remove(String id) { - } - @Override - public void control(String control, String msg) { - // TODO Auto-generated method stub - - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/HistoryPane.java b/src/main/java/com/c2kernel/gui/tabs/HistoryPane.java deleted file mode 100644 index ad10ad3..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/HistoryPane.java +++ /dev/null @@ -1,303 +0,0 @@ -/* - * StatusPane.java - * - * Created on March 20, 2001, 3:30 PM - */ - -package com.c2kernel.gui.tabs; - -/** - * @author abranson - * @version - */ -import java.awt.GridBagConstraints; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.table.AbstractTableModel; - -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.entity.proxy.ProxyObserver; -import com.c2kernel.entity.proxy.MemberSubscription; -import com.c2kernel.events.Event; -import com.c2kernel.events.History; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.lifecycle.instance.stateMachine.StateMachine; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.LocalObjectLoader; -import com.c2kernel.utils.Logger; - -/** - * Pane to display all work orders that this agent can execute, and activate - * them on request from the user. Subscribes to NodeItem for WorkOrder objects. - * @version $Revision: 1.22 $ $Date: 2005/04/26 06:48:13 $ - * @author $Author: abranson $ - */ -public class HistoryPane extends ItemTabPane implements ActionListener, ProxyObserver { - - History history; - HistoryTableModel model; - JTable eventTable; - JButton startButton = new JButton("<<"); - JButton prevButton = new JButton("<"); - JButton nextButton = new JButton(">"); - JButton endButton = new JButton(">>"); - public static final int SIZE = 30; - int currentSize = SIZE; - - public HistoryPane() { - super("History", "Event History"); - initPanel(); - - // add buttons - Box navBox = Box.createHorizontalBox(); - navBox.add(startButton); navBox.add(prevButton); - navBox.add(nextButton); navBox.add(endButton); - - // setup buttons - //startButton.setEnabled(false); nextButton.setEnabled(false); - //prevButton.setEnabled(false); endButton.setEnabled(false); - startButton.setActionCommand("start"); - startButton.addActionListener(this); - prevButton.setActionCommand("prev"); - prevButton.addActionListener(this); - nextButton.setActionCommand("next"); - nextButton.addActionListener(this); - endButton.setActionCommand("end"); - endButton.addActionListener(this); - getGridBagConstraints(); - c.gridx = 0; c.gridy = 1; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill=GridBagConstraints.NONE; - c.weightx=0; c.weighty=0; - gridbag.setConstraints(navBox, c); - add(navBox); - - - // Create table - eventTable = new JTable(); - JScrollPane eventScroll= new JScrollPane(eventTable); - c.weightx = 1.0; c.weighty = 1.0; - c.fill = GridBagConstraints.BOTH; c.gridy++; - gridbag.setConstraints(eventScroll, c); - add(eventScroll); - - // open viewpoint pane when outcome events are clicked on - eventTable.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { - Event selected = model.getEventForRow(eventTable.getSelectedRow()); - if (selected.getSchemaName()!=null && selected.getViewName()!=null) - parent.runCommand("Data Viewer", selected.getSchemaName()+":"+selected.getViewName()); - } - } - }); - - } - - @Override - public void reload() { - history.clear(); - jumpToEnd(); - } - - @Override - public void run() { - Thread.currentThread().setName("History Pane Builder"); - MainFrame.progress.startBouncing("Loading history"); - try { - history = (History)sourceItem.getItem().getObject(ClusterStorage.HISTORY); - sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.HISTORY, true)); - } catch (ObjectNotFoundException e) { - Logger.error(e); - } - model = new HistoryTableModel(); - eventTable.setModel(model); - jumpToEnd(); - } - - public void jumpToEnd() { - int lastEvent = history.getLastId(); - int firstEvent = 0; currentSize = SIZE; - if (lastEvent > currentSize) firstEvent = lastEvent - currentSize + 1; - if (lastEvent < currentSize) currentSize = lastEvent + 1; - Logger.msg(5, "HistoryPane.run() - init table start "+firstEvent+" for "+currentSize); - model.setView(firstEvent, currentSize); - } - - @Override - public void add(Event contents) { - jumpToEnd(); - } - - @Override - public void remove(String id) { - // don't have to deal with this normally - } - - @Override - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("end")) { - jumpToEnd(); - return; - } - - int lastEvent = history.getLastId(); - int startEvent = model.getStartId(); - if (e.getActionCommand().equals("start")) { - currentSize = SIZE; - startEvent = 0; - } - - else if (e.getActionCommand().equals("prev")) { - currentSize = SIZE; - startEvent-=currentSize; - if (startEvent<0) startEvent = 0; - } - else if (e.getActionCommand().equals("next")) { - currentSize = SIZE; - startEvent+=currentSize; - if (startEvent > lastEvent) - startEvent = lastEvent - currentSize +1; - } - else { // unknown action - return; - } - - model.setView(startEvent, currentSize); - } - - private class HistoryTableModel extends AbstractTableModel { - Event[] event; - StateMachine[] sm; - Integer[] ids; - int loaded = 0; - int startId = 0; - - public HistoryTableModel() { - event = new Event[0]; - ids = new Integer[0]; - } - - public int getStartId() { - return startId; - } - - public void setView(int startId, int size) { - event = new Event[size]; - ids = new Integer[size]; - sm = new StateMachine[size]; - this.startId = startId; - for (int i=0; i getColumnClass(int columnIndex) { - switch(columnIndex) { - case 0: - return Integer.class; - default: - return String.class; - } - } - - /** - * @see javax.swing.table.TableModel#getColumnCount() - */ - @Override - public int getColumnCount() { - return 8; - } - - /** - * @see javax.swing.table.TableModel#getColumnName(int) - */ - @Override - public String getColumnName(int columnIndex) { - switch(columnIndex) { - case 0: return Language.translate("ID"); - case 1: return Language.translate("Activity"); - case 2: return Language.translate("Transition"); - case 3: return Language.translate("Date"); - case 4: return Language.translate("Agent Name"); - case 5: return Language.translate("Agent Role"); - case 6: return Language.translate("Schema"); - case 7: return Language.translate("View"); - default: return ""; - } - } - - /** - * @see javax.swing.table.TableModel#getRowCount() - */ - @Override - public int getRowCount() { - return loaded; - } - - /** - * @see javax.swing.table.TableModel#getValueAt(int, int) - */ - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - if (event.length <= rowIndex || event[rowIndex] == null) - return ""; - try { - switch (columnIndex) { - case 0: return ids[rowIndex]; - case 1: return event[rowIndex].getStepName(); - case 2: return sm[rowIndex]==null?"Unknown": - sm[rowIndex].getTransition(event[rowIndex].getTransition()).getName(); - case 3: return event[rowIndex].getTimeString(); - case 4: return event[rowIndex].getAgentPath().getAgentName(); - case 5: return event[rowIndex].getAgentRole(); - case 6: return event[rowIndex].getSchemaName()+" v"+event[rowIndex].getSchemaVersion(); - case 7: return event[rowIndex].getViewName(); - default: return ""; - } - } catch (Exception e) { - return null; - } - } - - public Event getEventForRow(int rowIndex) { - return event[rowIndex]; - } - - /** - * @see javax.swing.table.TableModel#isCellEditable(int, int) - */ - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return false; - } - - } - - @Override - public void control(String control, String msg) { - if (control.equals(MemberSubscription.END)) - MainFrame.progress.stopBouncing("History loading complete."); - else - MainFrame.progress.stopBouncing("History: "+msg); - } - -} diff --git a/src/main/java/com/c2kernel/gui/tabs/ItemTabPane.java b/src/main/java/com/c2kernel/gui/tabs/ItemTabPane.java deleted file mode 100644 index 7fa17a0..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/ItemTabPane.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * TabbedPane.java - * - * Created on March 22, 2001, 11:39 AM - */ -package com.c2kernel.gui.tabs; -import java.awt.Color; -import java.awt.Cursor; -import java.awt.Font; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusEvent; - -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JToggleButton; -import javax.swing.SwingConstants; - -import com.c2kernel.entity.proxy.ProxyObserver; -import com.c2kernel.gui.ItemDetails; -import com.c2kernel.gui.ImageLoader; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.tabs.outcome.OutcomeHandler; -import com.c2kernel.gui.tabs.outcome.form.OutcomePanel; -import com.c2kernel.gui.tree.NodeItem; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; -/** - * Generic item details tabbed pane. - * - * @version $Revision: 1.31 $ $Date: 2005/06/08 16:47:44 $ - * @author $Author: abranson $ - */ -public class ItemTabPane extends JPanel implements Runnable { - - protected NodeItem sourceItem; - protected String titleText = null; - protected ImageIcon titleIcon = null; - private final String tabName; - protected GridBagLayout gridbag = new GridBagLayout(); - protected GridBagConstraints c = null; - public static Font titleFont = null; - public static Color headingColor = new Color(0, 0, 185); - protected ItemDetails parent; - protected static ImageIcon mReloadIcon = null; - protected Box titleBox; - static { - try { - mReloadIcon = ImageLoader.findImage("refresh.png"); - } catch (Exception e) { - Logger.warning("Couldn't load images: " + e); - } - } - - public void focusLost(FocusEvent e) - { - } - - public ItemTabPane(String tabName, String titleText) { - this.tabName = Language.translate(tabName); - this.titleText = - titleText == null ? null : Language.translate(titleText); - if (titleFont == null) - titleFont = - new Font("SansSerif", Font.BOLD, this.getFont().getSize() + 5); - Logger.msg(2, "ItemTabPane. - viewing " + tabName); - setLayout(gridbag); - } - public void setParent(ItemDetails parent) { - this.parent = parent; - } - public String getTabName() { - return tabName; - } - protected GridBagConstraints getGridBagConstraints() { - if (c == null) - c = new GridBagConstraints(); - return c; - } - protected void initPanel() { - getGridBagConstraints().gridx = 0; - getGridBagConstraints().gridy = 0; - getGridBagConstraints().anchor = GridBagConstraints.NORTHWEST; - getGridBagConstraints().fill = GridBagConstraints.HORIZONTAL; - getGridBagConstraints().ipadx = 5; - getGridBagConstraints().weightx = 1.0; - getGridBagConstraints().ipady = 5; - // Help panel - if (titleText == null) - titleText = tabName; - if (titleIcon == null) - titleIcon = ImageLoader.findImage("info_16.png"); - JLabel title = new JLabel(titleText, titleIcon, SwingConstants.LEFT); - title.setFont(titleFont); - title.setForeground(headingColor); - JButton refreshButton = new JButton(mReloadIcon); - refreshButton.setToolTipText(Language.translate("Refresh")); - refreshButton.setMargin(new Insets(0, 0, 0, 0)); - refreshButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - setCursor(new Cursor(Cursor.WAIT_CURSOR)); - reload(); - setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); - } - }); - String defaultStartTab = MainFrame.getPref("DefaultStartTab", "Properties"); - JToggleButton defaultStart = - new JToggleButton(ImageLoader.findImage("graph/start.png")); - defaultStart.setMargin(new Insets(0, 0, 0, 0)); - defaultStart.setToolTipText( - Language.translate("Select this tab to be the default one opened when you double click an item")); - defaultStart.setSelected(tabName.equals(defaultStartTab)); - defaultStart.setActionCommand(tabName); - defaultStart.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (((JToggleButton)e.getSource()).isSelected()) - MainFrame.setPref("DefaultStartTab", e.getActionCommand()); - } - }); - titleBox = Box.createHorizontalBox(); - titleBox.add(title); - titleBox.add(Box.createHorizontalGlue()); - titleBox.add(defaultStart); - titleBox.add(refreshButton); - gridbag.setConstraints(titleBox, c); - this.add(titleBox); - } - public void initForItem(NodeItem sourceItem) { - this.sourceItem = sourceItem; - Thread loader = new Thread(this); - loader.start(); - } - @Override - public void run() { - Thread.currentThread().setName("Default Entity Pane Builder"); - getGridBagConstraints(); - c.gridx = 0; - c.gridy = 1; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.ipadx = 5; - c.weightx = 1.0; - c.weighty = 1.0; - c.ipady = 5; - JLabel error = new JLabel("In Development"); - gridbag.setConstraints(error, c); - this.add(error); - } - public void reload() { - } - public void runCommand(String command) { - } - - public void destroy() { - if (sourceItem != null && this instanceof ProxyObserver) { - sourceItem.getItem().unsubscribe((ProxyObserver)this); - } - parent = null; - } - - @Override - protected void finalize() throws Throwable { - Logger.msg(7, "Reaping "+getClass().getName()); - } - - static public OutcomeHandler getOutcomeHandler(String schema, int version) { - String propName = "OutcomeHandler."+schema+"."+version; - if (Gateway.getProperties().containsKey(propName)) - try { - return (OutcomeHandler)Gateway.getProperties().getInstance(propName); - } catch (Exception ex) { - Logger.error("Error creating handler "+Gateway.getProperties().getString(propName)+". using default outcome editor"); - } - - propName = "OutcomeHandler.*"; - if (Gateway.getProperties().containsKey(propName)) - try { - return (OutcomeHandler)Gateway.getProperties().getInstance(propName); - } catch (Exception ex) { - Logger.error("Error creating handler "+Gateway.getProperties().getString(propName)+". using default outcome editor"); - } - return new OutcomePanel(); - } - -} diff --git a/src/main/java/com/c2kernel/gui/tabs/JTabbedPaneWithCloseIcons.java b/src/main/java/com/c2kernel/gui/tabs/JTabbedPaneWithCloseIcons.java deleted file mode 100644 index 638ed01..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/JTabbedPaneWithCloseIcons.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.c2kernel.gui.tabs; -import java.awt.Component; -import java.awt.Rectangle; -import java.awt.event.InputEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -import javax.swing.Icon; -import javax.swing.JTabbedPane; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import com.c2kernel.gui.ItemDetails; - -/** - * @author Developpement - * - * Allows a close icone in JTabbePane - */ -public class JTabbedPaneWithCloseIcons extends JTabbedPane implements MouseListener, ChangeListener -{ - /** - * - */ - public JTabbedPaneWithCloseIcons() - { - super(); - addMouseListener(this); - addChangeListener(this); - } - /** - * @see javax.swing.JTabbedPane#addTab(String, Icon, Component, String) - */ - @Override - public void addTab(String title, Icon arg2, Component component, String arg3) - { - super.addTab(title, new CloseTabIcon(arg2), component, arg3); - } - /** - * @see java.awt.event.MouseListener#mouseClicked(MouseEvent) - */ - @Override - public void mouseClicked(MouseEvent e) - { - int tabNumber = getUI().tabForCoordinate(this, e.getX(), e.getY()); - Component cp = null; - if (tabNumber < 0) - return; - Rectangle rect = ((CloseTabIcon) getIconAt(tabNumber)).getBounds(); - if (rect.contains(e.getX(), e.getY())||(e.getModifiers()& InputEvent.CTRL_MASK) != 0) - { //the tab is being closed - cp = this.getComponent(tabNumber); - //if (getComponentCount() != 1) - if (cp instanceof ItemDetails) - { - ((ItemDetails) cp).closeTab(); - remove(cp); - } - } - stateChanged(new ChangeEvent(this)); - } - /** - * @see java.awt.event.MouseListener#mouseEntered(MouseEvent) - */ - @Override - public void mouseEntered(MouseEvent e) - { - } - /** - * @see java.awt.event.MouseListener#mouseExited(MouseEvent) - */ - @Override - public void mouseExited(MouseEvent e) - { - } - /** - * @see java.awt.event.MouseListener#mousePressed(MouseEvent) - */ - @Override - public void mousePressed(MouseEvent e) - { - } - /** - * @see java.awt.event.MouseListener#mouseReleased(MouseEvent) - */ - @Override - public void mouseReleased(MouseEvent e) - { - } - @Override - public void stateChanged(ChangeEvent e) - { - if (getSelectedComponent()!= null) - ((ItemDetails) getSelectedComponent()).refresh(); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/JobListPane.java b/src/main/java/com/c2kernel/gui/tabs/JobListPane.java deleted file mode 100644 index 4893ae5..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/JobListPane.java +++ /dev/null @@ -1,311 +0,0 @@ -/* - * StatusPane.java - * - * Created on March 20, 2001, 3:30 PM - */ - -package com.c2kernel.gui.tabs; - -/** - * @author abranson - * @version - */ -import java.awt.GridBagConstraints; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.Iterator; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.table.AbstractTableModel; - -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.entity.agent.Job; -import com.c2kernel.entity.agent.JobList; -import com.c2kernel.entity.proxy.ProxyObserver; -import com.c2kernel.entity.proxy.MemberSubscription; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.process.Gateway; -import com.c2kernel.property.Property; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -/** - * Pane to display all work orders that this agent can execute, and activate - * them on request from the user. Subscribes to NodeItem for WorkOrder objects. - * @version $Revision: 1.4 $ $Date: 2004/10/21 08:02:21 $ - * @author $Author: abranson $ - */ -public class JobListPane extends ItemTabPane implements ActionListener, ProxyObserver { - - JobList joblist; - JoblistTableModel model; - JTable eventTable; - JButton startButton = new JButton("<<"); - JButton prevButton = new JButton("<"); - JButton nextButton = new JButton(">"); - JButton endButton = new JButton(">>"); - public static final int SIZE = 30; - int currentSize = SIZE; - - public JobListPane() { - super("Job List", "Agent Job List"); - initPanel(); - - // add buttons - Box navBox = Box.createHorizontalBox(); - navBox.add(startButton); navBox.add(prevButton); - navBox.add(nextButton); navBox.add(endButton); - - // setup buttons - //startButton.setEnabled(false); nextButton.setEnabled(false); - //prevButton.setEnabled(false); endButton.setEnabled(false); - startButton.setActionCommand("start"); - startButton.addActionListener(this); - prevButton.setActionCommand("prev"); - prevButton.addActionListener(this); - nextButton.setActionCommand("next"); - nextButton.addActionListener(this); - endButton.setActionCommand("end"); - endButton.addActionListener(this); - getGridBagConstraints(); - c.gridx = 0; c.gridy = 1; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill=GridBagConstraints.NONE; - c.weightx=0; c.weighty=0; - gridbag.setConstraints(navBox, c); - add(navBox); - - - // Create table - eventTable = new JTable(); - JScrollPane eventScroll= new JScrollPane(eventTable); - c.weightx = 1.0; c.weighty = 1.0; - c.fill = GridBagConstraints.BOTH; c.gridy++; - gridbag.setConstraints(eventScroll, c); - add(eventScroll); - - // detect double clicked jobs - eventTable.addMouseListener(new JobListMouseListener()); - } - - @Override - public void reload() { - joblist.clear(); - jumpToEnd(); - } - - @Override - public void run() { - Thread.currentThread().setName("Joblist Pane Builder"); - try { - joblist = (JobList)sourceItem.getItem().getObject(ClusterStorage.JOB); - sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.JOB, false)); - } catch (ObjectNotFoundException e) { - Logger.error(e); - } - model = new JoblistTableModel(joblist); - eventTable.setModel(model); - jumpToEnd(); - } - - - public void jumpToEnd() { - int lastEvent = joblist.getLastId(); - int firstEvent = 0; currentSize = SIZE; - if (lastEvent > currentSize) firstEvent = lastEvent - currentSize + 1; - if (lastEvent < currentSize) currentSize = lastEvent + 1; - Logger.msg(5, "JobListPane.run() - init table start "+firstEvent+" for "+currentSize); - model.setView(firstEvent, currentSize); - } - - @Override - public void add(Job contents) { - reload(); - } - - @Override - public void remove(String id) { - reload(); - } - - @Override - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("end")) { - jumpToEnd(); - return; - } - - int lastEvent = joblist.getLastId(); - int startEvent = model.getStartId(); - if (e.getActionCommand().equals("start")) { - currentSize = SIZE; - startEvent = 0; - } - - else if (e.getActionCommand().equals("prev")) { - currentSize = SIZE; - startEvent-=currentSize; - if (startEvent<0) startEvent = 0; - } - else if (e.getActionCommand().equals("next")) { - currentSize = SIZE; - startEvent+=currentSize; - if (startEvent > lastEvent) - startEvent = lastEvent - currentSize +1; - } - else { // unknown action - return; - } - - model.setView(startEvent, currentSize); - } - - private class JoblistTableModel extends AbstractTableModel { - Job[] job; - Integer[] ids; - String[] itemNames; - int loaded = 0; - int startId = 0; - - public JoblistTableModel(JobList joblist) { - job = new Job[0]; - ids = new Integer[0]; - } - - public int getStartId() { - return startId; - } - - public void setView(int startId, int size) { - job = new Job[size]; - ids = new Integer[size]; - itemNames = new String[size]; - this.startId = startId; - int count = 0; - for (Iterator i = joblist.keySet().iterator(); i.hasNext();) { - Integer thisJobId = new Integer((String)i.next()); - if (count >= startId) { - int idx = count-startId; - ids[idx] = thisJobId; - job[idx] = joblist.getJob(thisJobId.intValue()); - itemNames[idx] = "Item Not Found"; - try { - itemNames[idx] = ((Property)Gateway.getStorage().get(job[count-startId].getItemPath(), ClusterStorage.PROPERTY+"/Name", null)).getValue(); - } catch (Exception ex) { - Logger.error(ex); - } - - } - count++; - loaded = count-startId; - if (count > (startId + size)) break; - } - fireTableStructureChanged(); - } - /** - * @see javax.swing.table.TableModel#getColumnClass(int) - */ - @Override - public Class getColumnClass(int columnIndex) { - switch(columnIndex) { - case 0: - return Integer.class; - default: - return String.class; - } - } - - /** - * @see javax.swing.table.TableModel#getColumnCount() - */ - @Override - public int getColumnCount() { - return 4; - } - - /** - * @see javax.swing.table.TableModel#getColumnName(int) - */ - @Override - public String getColumnName(int columnIndex) { - switch(columnIndex) { - case 0: return Language.translate("ID"); - case 1: return Language.translate("Subject"); - case 2: return Language.translate("Activity"); - case 3: return Language.translate("Transition"); - default: return ""; - } - } - - /** - * @see javax.swing.table.TableModel#getRowCount() - */ - @Override - public int getRowCount() { - return loaded; - } - - /** - * @see javax.swing.table.TableModel#getValueAt(int, int) - */ - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - if (job.length <= rowIndex || job[rowIndex] == null) - return ""; - try { - switch (columnIndex) { - case 0: return ids[rowIndex]; - case 1: return itemNames[rowIndex]; - case 2: return job[rowIndex].getStepName(); - case 3: return job[rowIndex].getTransition().getName(); - default: return ""; - } - } catch (Exception e) { - return null; - } - } - - /** - * @see javax.swing.table.TableModel#isCellEditable(int, int) - */ - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return false; - } - - public Job getJobAtRow(int rowIndex) { - return job[rowIndex]; - } - - } - - private class JobListMouseListener extends MouseAdapter { - - @Override - public void mouseClicked(MouseEvent e) { - super.mouseClicked(e); - if (e.getClickCount() == 2) { - Job selectedJob = model.getJobAtRow(eventTable.getSelectedRow()); - try { - MainFrame.itemFinder.pushNewKey(selectedJob.getItemProxy().getName()); - } catch (Exception ex) { - Logger.error(ex); - JOptionPane.showMessageDialog(null, "No Item Found", "Job references an unknown item", JOptionPane.ERROR_MESSAGE); - } - } - } - } - - @Override - public void control(String control, String msg) { - // TODO Auto-generated method stub - - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/PropertiesPane.java b/src/main/java/com/c2kernel/gui/tabs/PropertiesPane.java deleted file mode 100644 index e9b882d..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/PropertiesPane.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * StatusPane.java - * - * Created on March 20, 2001, 3:30 PM - */ - -package com.c2kernel.gui.tabs; - -/** - * @author abranson - * @version - */ -import java.awt.GridBagConstraints; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.HashMap; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingConstants; - -import com.c2kernel.entity.proxy.MemberSubscription; -import com.c2kernel.entity.proxy.ProxyObserver; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.tree.NodeAgent; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.process.Gateway; -import com.c2kernel.property.Property; -import com.c2kernel.utils.Language; - -/** - * Pane to display all work orders that this agent can execute, and activate - * them on request from the user. Subscribes to NodeItem for Property objects. - * @version $Revision: 1.44 $ $Date: 2005/08/31 07:21:20 $ - * @author $Author: abranson $ - */ -public class PropertiesPane extends ItemTabPane implements ProxyObserver, ActionListener { - - Box propertyBox; - JButton eraseButton; - boolean subbed = false; - HashMap loadedProps = new HashMap(); - JLabel domTitle; - DomainPathAdmin domAdmin; - - public PropertiesPane() { - super("Properties", "Properties"); - initPanel(); - - // Create box container for properties - getGridBagConstraints(); - c.gridx = 0; c.gridy = 1; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.NONE; - c.weightx = 1.0; c.weighty = 2.0; - propertyBox = Box.createVerticalBox(); - gridbag.setConstraints(propertyBox, c); - add(propertyBox); - if (MainFrame.isAdmin) { // edit dompath - c.gridy++; - c.fill = GridBagConstraints.NONE; - c.weighty=0.0; - domTitle = new JLabel("Domain Paths", titleIcon, SwingConstants.LEFT); - domTitle.setFont(titleFont); - domTitle.setForeground(headingColor); - gridbag.setConstraints(domTitle, c); - add(domTitle); - - c.gridy++; - c.fill = GridBagConstraints.BOTH; - c.weighty=1.0; - domAdmin = new DomainPathAdmin(); - gridbag.setConstraints(domAdmin, c); - add(domAdmin); - - - if (Gateway.getProperties().getBoolean("EnableItemErase")) { - c.gridy++; - c.fill = GridBagConstraints.NONE; - eraseButton = new JButton(Language.translate("Erase!")); - eraseButton.addActionListener(this); - eraseButton.setActionCommand("Erase Item"); - gridbag.setConstraints(eraseButton, c); - add(eraseButton); - } - } - } - - @Override - public void reload() { - Gateway.getStorage().clearCache(sourceItem.getItemPath(), ClusterStorage.PROPERTY); - loadedProps = new HashMap(); - initForItem(sourceItem); - } - - @Override - public void run() { - Thread.currentThread().setName("Property Pane Builder"); - if (sourceItem instanceof NodeAgent) { - remove(domAdmin); - remove(domTitle); - eraseButton.setEnabled(false); - } - else if (domAdmin != null) - domAdmin.setEntity(sourceItem.getItem()); - propertyBox.removeAll(); - propertyBox.add(Box.createGlue()); - revalidate(); - sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.PROPERTY, true)); - - } - /** - * - */ - @Override - public void add(Property newProp) { - JLabel propLabel = loadedProps.get(newProp.getName()); - if (propLabel == null) { // new prop - JPanel summaryPanel = new JPanel(new GridLayout(0,2)); - summaryPanel.add(new JLabel(Language.translate(newProp.getName()) + ":")); - Box valueBox = Box.createHorizontalBox(); - propLabel = new JLabel(newProp.getValue()); - loadedProps.put(newProp.getName(), propLabel); - valueBox.add(propLabel); - if (MainFrame.isAdmin && newProp.isMutable()) { - JButton editButton = new JButton("..."); - editButton.setMargin(new Insets(0,0,0,0)); - editButton.setActionCommand(newProp.getName()); - editButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e){ - String oldVal = loadedProps.get(e.getActionCommand()).getText(); - String newVal = (String)JOptionPane.showInputDialog(null, "Enter new value for "+e.getActionCommand(), "Edit Property", - JOptionPane.QUESTION_MESSAGE, null, null, oldVal); - if (newVal!=null && !(newVal.equals(oldVal))) { - try { - (sourceItem.getItem()).setProperty(MainFrame.userAgent, e.getActionCommand(), newVal); - } catch (Exception ex) { - MainFrame.exceptionDialog(ex); - } - } - } - }); - valueBox.add(Box.createVerticalStrut(7)); - valueBox.add(editButton); - - } - summaryPanel.add(valueBox); - propertyBox.add(Box.createVerticalStrut(7)); - propertyBox.add(summaryPanel); - } - propLabel.setText(newProp.getValue()); - revalidate(); - } - - @Override - public void remove(String id) { - String propName = id.substring(id.lastIndexOf("/")+1); - JLabel propbox = loadedProps.get(propName); - if (propbox!= null) propbox.setText("DELETED"); - revalidate(); - } - - @Override - public void actionPerformed(ActionEvent e) { - String[] params; - String predefStep; - - if (JOptionPane.showConfirmDialog(this, - "Are you sure?", - e.getActionCommand(), - JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) - return; - - if (e.getActionCommand().equals("Erase Item")) { - params = new String[0]; - predefStep = "Erase"; - } - else - return; - - try { - MainFrame.userAgent.execute(sourceItem.getItem(), predefStep, params); - } catch (Exception ex) { - MainFrame.exceptionDialog(ex); - } - } - - @Override - public void control(String control, String msg) { - // TODO Auto-generated method stub - - } - -} diff --git a/src/main/java/com/c2kernel/gui/tabs/ViewpointPane.java b/src/main/java/com/c2kernel/gui/tabs/ViewpointPane.java deleted file mode 100644 index 7dea317..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/ViewpointPane.java +++ /dev/null @@ -1,529 +0,0 @@ - -package com.c2kernel.gui.tabs; -import java.awt.GridBagConstraints; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.StringTokenizer; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingConstants; - -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.entity.C2KLocalObject; -import com.c2kernel.entity.proxy.MemberSubscription; -import com.c2kernel.entity.proxy.ProxyObserver; -import com.c2kernel.events.Event; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.tabs.outcome.OutcomeException; -import com.c2kernel.gui.tabs.outcome.OutcomeHandler; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.persistency.outcome.Outcome; -import com.c2kernel.persistency.outcome.Viewpoint; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.LocalObjectLoader; -import com.c2kernel.utils.Logger; - -public class ViewpointPane extends ItemTabPane implements ItemListener, ActionListener, ProxyObserver { - - JComboBox schemas; - JComboBox views; - JComboBox events; - JLabel eventDetails; - JButton exportButton; - JButton viewButton; - - ArrayList schemaList; - ArrayList viewpointList; - ArrayList eventList; - String currentSchema = null; - Outcome currentOutcome = null; - OutcomeHandler thisOutcome; - boolean suspendSelection = false; - - JPanel dataView = new JPanel(new GridLayout(1,1)); - - public ViewpointPane() { - - super("Data Viewer", "Outcome Browser"); - initialize(); - } - - public void initialize() { - initPanel(); - - getGridBagConstraints(); - - c.gridx = 0; c.gridy = 1; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.ipadx = 5; c.weightx = 1.0; - c.ipady = 5; - - // Set up view box - - Box viewBox = Box.createHorizontalBox(); - - JLabel label = new JLabel(Language.translate("Outcome Type")+":", SwingConstants.LEFT); - viewBox.add(label); - viewBox.add(Box.createHorizontalStrut(7)); - - schemas = new JComboBox(); - viewBox.add(schemas); - viewBox.add(Box.createHorizontalGlue()); - schemas.addItemListener(this); - - label = new JLabel(Language.translate("View")+":", SwingConstants.LEFT); - viewBox.add(label); - viewBox.add(Box.createHorizontalStrut(7)); - - views = new JComboBox(); - viewBox.add(views); - viewBox.add(Box.createHorizontalGlue()); - views.addItemListener(this); - - gridbag.setConstraints(viewBox, c); - this.add(viewBox); - - // Set up event details box - c.gridy++; - Box eventBox = Box.createHorizontalBox(); - - label = new JLabel(Language.translate("Event")+":", SwingConstants.LEFT); - eventBox.add(label); - eventBox.add(Box.createHorizontalStrut(7)); - - events = new JComboBox(); - eventBox.add(events); - eventBox.add(Box.createHorizontalStrut(7)); - events.addItemListener(this); - - eventDetails = new JLabel(); - eventBox.add(eventDetails); - eventBox.add(Box.createHorizontalGlue()); - - if (MainFrame.isAdmin) { - viewButton = new JButton(Language.translate("Write View")); - viewButton.setMargin(new Insets(0, 0, 0, 0)); - viewButton.setActionCommand("setview"); - eventBox.add(viewButton); - eventBox.add(Box.createHorizontalStrut(14)); - viewButton.addActionListener(this); - } - - exportButton = new JButton(Language.translate("Export")); - exportButton.setMargin(new Insets(0, 0, 0, 0)); - exportButton.setActionCommand("export"); - exportButton.addActionListener(this); - eventBox.add(exportButton); - - gridbag.setConstraints(eventBox, c); - this.add(eventBox); - - // data pane - c.gridx = 0; c.gridy = 3; - c.anchor = GridBagConstraints.NORTHWEST; c.fill = GridBagConstraints.BOTH; - c.weighty = 1.0; c.weightx = 1.0; - gridbag.setConstraints(dataView, c); - this.add(dataView); - } - - @Override - public void reload() { - // reset boxes - schemas.removeAllItems(); - views.removeAllItems(); - events.removeAllItems(); - eventDetails.setText(""); - - clearView(); - - // reload - initForItem(sourceItem); - } - - @Override - public void run() { - Thread.currentThread().setName("Viewpoint Pane Builder"); - //Local object subscriptions - sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.VIEWPOINT, false)); - sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.OUTCOME, false)); - clearView(); - schemas.addItem("--"); - currentSchema = null; - schemaList = new ArrayList(); - try { - String outcomeTypes = sourceItem.getItem().queryData(ClusterStorage.VIEWPOINT+"/all"); - StringTokenizer tok = new StringTokenizer(outcomeTypes, ","); - while (tok.hasMoreTokens()) { - String thisType = tok.nextToken(); - schemas.addItem(thisType); - schemaList.add(thisType); - } - } catch (Exception e) { - Logger.msg(2, "No viewpoints found"); - } - } - - @Override - public void itemStateChanged(ItemEvent e) { - - Object selectedItem = e.getItem(); - if (e.getStateChange() == ItemEvent.DESELECTED) return; - if (suspendSelection) return; - if (e.getItem().equals("--")) return; - - if (e.getItemSelectable() == schemas) - switchSchema((String)selectedItem); - else if (e.getItemSelectable() == views) - switchView((Viewpoint)selectedItem); - else if (e.getItemSelectable() == events) - showEvent((EventItem)selectedItem); - } - - public void switchSchema(String schemaName) { - clearView(); - suspendSelection = true; - views.removeAllItems(); - events.removeAllItems(); - viewpointList = new ArrayList(); - eventList = new ArrayList(); - - currentSchema = schemaName; - - try { - // populate views - String viewNames = sourceItem.getItem().queryData(ClusterStorage.VIEWPOINT+"/"+schemaName+"/all"); - StringTokenizer tok = new StringTokenizer(viewNames, ","); - Viewpoint lastView = null; - while(tok.hasMoreTokens()) { - String viewName = tok.nextToken(); - Viewpoint thisView = (Viewpoint)sourceItem.getItem().getObject(ClusterStorage.VIEWPOINT+"/"+schemaName+"/"+viewName); - views.addItem(thisView); - if (lastView == null) lastView = thisView; - if (thisView.getName().equals("last")) //select - lastView = thisView; - viewpointList.add(thisView); - } - - String ocVersions = sourceItem.getItem().queryData(ClusterStorage.OUTCOME+"/"+schemaName+"/all"); - tok = new StringTokenizer(ocVersions, ","); - while(tok.hasMoreTokens()) { - int schemaVersion = Integer.parseInt(tok.nextToken()); - String ocEvents = sourceItem.getItem().queryData(ClusterStorage.OUTCOME+"/"+schemaName+"/"+schemaVersion+"/all"); - StringTokenizer tok2 = new StringTokenizer(ocEvents, ","); - while(tok2.hasMoreTokens()) { - int eventId = Integer.parseInt(tok2.nextToken()); - EventItem newEvent = new EventItem(eventId, schemaVersion); - for (Viewpoint thisView : viewpointList) { - if (thisView.getEventId() == eventId) - newEvent.addView(thisView.getName()); - } - eventList.add(newEvent); - } - Collections.sort(eventList, new Comparator() { - @Override - public int compare(EventItem o1, EventItem o2) { - return o1.compareTo(o2); - } - }); - for (EventItem eventItem : eventList) - events.addItem(eventItem); - } - - if (lastView != null) { - suspendSelection = false; - views.setSelectedItem(lastView); - switchView(lastView); - } - - } catch (Exception e) { - Logger.error(e); - JOptionPane.showMessageDialog(this, - "The data structures of this item are incorrect.\nPlease contact your administrator.", - "Viewpoint Error" , JOptionPane.ERROR_MESSAGE); - } - suspendSelection = false; - } - - public void switchView(Viewpoint newView) { - for (EventItem thisEvent : eventList) { - if (thisEvent.eventId == newView.getEventId()) { - suspendSelection = true; - events.setSelectedItem(thisEvent); - showEvent(thisEvent); - suspendSelection = false; - break; - } - } - } - - public void showEvent(EventItem thisEvent) { - eventDetails.setText(thisEvent.getEventDesc()); - try { - setView((Outcome)sourceItem.getItem().getObject( - ClusterStorage.OUTCOME+"/"+currentSchema+"/"+thisEvent.schemaVersion+"/"+thisEvent.eventId)); - } catch (Exception ex) { - Logger.error(ex); - JOptionPane.showMessageDialog(this, - "Could not retrieve requested outcome.\nPlease contact your administrator.", - "Viewpoint Error" , JOptionPane.ERROR_MESSAGE); - } - } - - public void setView(Outcome data) { - Logger.msg(6, "ViewpointPane: got outcome type: "+data.getSchemaType()+" version: "+data.getSchemaVersion()); - String schema; - currentOutcome = data; - dataView.removeAll(); - String error = null; - try { - schema = LocalObjectLoader.getSchema(data.getSchemaType(), data.getSchemaVersion()).schema; - thisOutcome = ItemTabPane.getOutcomeHandler(data.getSchemaType(), data.getSchemaVersion()); - thisOutcome.setDescription(schema); - thisOutcome.setOutcome(data.getData()); - thisOutcome.setReadOnly(true); - Thread builder = new Thread(thisOutcome); - builder.start(); - dataView.add(thisOutcome.getPanel()); - exportButton.setEnabled(true); - if (viewButton!=null) viewButton.setEnabled(true); - return; - } catch (ObjectNotFoundException ex) { - error = "Schema not found"; - } catch (OutcomeException ex) { - error = "Outcome was not valid. See log for details: "+ex.getMessage(); - Logger.error(ex); - } - - dataView.add(new JLabel(error)); - } - - public void clearView() { - dataView.removeAll(); - exportButton.setEnabled(false); - if (viewButton!=null) viewButton.setEnabled(false); - } - - @Override - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("export") && currentOutcome != null) - saveOutcomeToFile(); - if (e.getActionCommand().equals("setview") && currentOutcome != null) - overrideView(); - } - - private void saveOutcomeToFile() { - - MainFrame.xmlChooser.setSelectedFile(new File(currentOutcome.getSchemaType()+".xml")); - int returnVal = MainFrame.xmlChooser.showSaveDialog(this); - if (returnVal == JFileChooser.APPROVE_OPTION) { - File targetFile = MainFrame.xmlChooser.getSelectedFile(); - if (!(targetFile.getAbsolutePath().endsWith(".xml"))) - targetFile = new File(targetFile.getAbsolutePath()+".xml"); - - Logger.msg(2, "ViewpointPane.actionPerformed() - Exporting outcome to file " + targetFile.getName()); - try { - thisOutcome.export(targetFile); - } - catch (Exception ex) { - Logger.error(ex); - MainFrame.exceptionDialog(ex); - } - } - - } - - private void overrideView() { - - Viewpoint oldView = (Viewpoint)views.getSelectedItem(); - EventItem newEvent = (EventItem)events.getSelectedItem(); - - if (oldView.getEventId() == newEvent.eventId) { - JOptionPane.showMessageDialog(this, - "View '"+oldView.getName()+"' is already set to event "+newEvent.eventId, - "Viewpoint Already Set" , JOptionPane.ERROR_MESSAGE); - return; - } - - if (JOptionPane.showConfirmDialog(this, - "Are you sure you want to set the '"+oldView.getName()+ - "' view to event " + newEvent.eventId+ "?", - "Overwrite view", - JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) - return; - - oldView.setEventId(newEvent.eventId); - try { - String[] predefParams = new String[1]; - predefParams[0] = Gateway.getMarshaller().marshall(oldView); - MainFrame.userAgent.execute(sourceItem.getItem(), "AddC2KObject", predefParams); - } catch (Exception e) { - Logger.error(e); - MainFrame.exceptionDialog(e); - } - } - - @Override - public void runCommand(String command) { - String[] viewElements = command.split(":"); - if (viewElements.length!=2) return; - if (schemaList == null) run(); - schemas.setSelectedItem(viewElements[0]); - for (Viewpoint thisView : viewpointList) { - if (thisView.getName().equals(viewElements[1])) { - switchView(thisView); - return; - } - } - Logger.error("Viewpoint "+command+" not found in this item"); - } - - @Override - public void add(C2KLocalObject contents) { - if (contents instanceof Viewpoint) - addViewpoint((Viewpoint)contents); - else if (contents instanceof Outcome) - addOutcome((Outcome)contents); - - } - - public void addViewpoint(Viewpoint newView) { - String schemaName = newView.getSchemaName(); - Logger.msg(3, "Viewpoint "+newView.getName()+" now points to "+newView.getEventId()); - if (!(schemaList.contains(schemaName))) { - schemaList.add(schemaName); - schemas.addItem(schemaName); - return; - } - - - if (!(schemaName.equals(schemas.getSelectedItem()))) - return; - - for (EventItem thisEvent : eventList) { - if (thisEvent.eventId == newView.getEventId()) - thisEvent.addView(newView.getName()); - else - thisEvent.removeView(newView.getName()); - } - - boolean isSelected = false; - for (Viewpoint thisView : viewpointList) { - if (thisView.getName().equals(newView.getName())) { - isSelected = thisView.equals(views.getSelectedItem()); - views.removeItem(thisView); - viewpointList.remove(thisView); - break; - } - } - - views.addItem(newView); - viewpointList.add(newView); - if (isSelected) { - views.setSelectedItem(newView); - } - - } - - public void addOutcome(Outcome contents) { - if (!(contents.getSchemaType().equals(currentSchema))) // not interested - return; - Logger.msg(3, "Adding event "+contents.getID()); - EventItem newEvent = new EventItem(contents.getID(), contents.getSchemaVersion()); - eventList.add(newEvent); - events.addItem(newEvent); - } - - @Override - public void remove(String id) { - // we don't really remove viewpoints - } - - class EventItem implements Comparable { - public int eventId; - public int schemaVersion; - public ArrayList viewNames = new ArrayList(); - public String viewList = ""; - - public EventItem(int eventId, int schemaVersion) { - this.eventId = eventId; - this.schemaVersion = schemaVersion; - } - - public void addView(String viewName) { - if (!(viewNames.contains(viewName))) { - viewNames.add(viewName); - buildViewLabel(); - } - } - - public void removeView(String viewName) { - viewNames.remove(viewName); - buildViewLabel(); - } - - private void buildViewLabel() { - if (viewNames.size() == 0) { - viewList = ""; - return; - } - - StringBuffer newLabel = new StringBuffer(" ("); - for (Iterator iter = viewNames.iterator(); iter.hasNext();) { - String viewName = iter.next(); - newLabel.append(viewName); - if (iter.hasNext()) - newLabel.append(", "); - } - - viewList = newLabel.append(")").toString(); - } - - @Override - public String toString() { - return eventId+viewList; - - } - - public String getEventDesc() { - try { - Event myEvent = (Event)sourceItem.getItem().getObject(ClusterStorage.HISTORY+"/"+eventId); - return (Language.translate("Recorded on")+" "+myEvent.getTimeString()+" "+ - Language.translate("by")+" "+myEvent.getAgentPath().getAgentName()+" "+ - Language.translate("using schema v")+schemaVersion); - } catch (Exception ex) { - Logger.error(ex); - return ("Error retrieving event details"); - } - } - - @Override - public int compareTo(EventItem other) { - if (other.eventId < eventId) return 1; - if (other.eventId > eventId) return -1; - return 0; - } - } - - @Override - public void control(String control, String msg) { - // TODO Auto-generated method stub - - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/WorkflowPane.java b/src/main/java/com/c2kernel/gui/tabs/WorkflowPane.java deleted file mode 100644 index 1a38470..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/WorkflowPane.java +++ /dev/null @@ -1,280 +0,0 @@ -package com.c2kernel.gui.tabs; -import java.awt.Cursor; -import java.awt.GridBagConstraints; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JSplitPane; - -import com.c2kernel.entity.proxy.MemberSubscription; -import com.c2kernel.entity.proxy.ProxyObserver; -import com.c2kernel.graph.layout.DefaultGraphLayoutGenerator; -import com.c2kernel.graph.model.EdgeFactory; -import com.c2kernel.graph.model.VertexFactory; -import com.c2kernel.gui.ImageLoader; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.graph.controller.Selection; -import com.c2kernel.gui.graph.view.EditorPanel; -import com.c2kernel.gui.graph.view.VertexPropertyPanel; -import com.c2kernel.gui.lifecycle.instance.TransitionPanel; -import com.c2kernel.gui.lifecycle.instance.WfDirectedEdgeRenderer; -import com.c2kernel.gui.lifecycle.instance.WfEdgeFactory; -import com.c2kernel.gui.lifecycle.instance.WfGraphPanel; -import com.c2kernel.gui.lifecycle.instance.WfVertexFactory; -import com.c2kernel.gui.lifecycle.instance.WfVertexRenderer; -import com.c2kernel.lifecycle.instance.CompositeActivity; -import com.c2kernel.lifecycle.instance.WfVertexOutlineCreator; -import com.c2kernel.lifecycle.instance.Workflow; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.FileStringUtility; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; -public class WorkflowPane extends ItemTabPane implements ProxyObserver -{ - // Only for the purpose of loading and saving - protected Workflow mWorkflow = null; - boolean init = false; - TransitionPanel transPanel; - protected JButton mLoadButton = new JButton(ImageLoader.findImage("graph/load.png")); - protected JButton mSaveButton = new JButton(ImageLoader.findImage("graph/save.png")); - protected JButton mLayoutButton = new JButton(ImageLoader.findImage("graph/autolayout.png")); - protected JButton mZoomOutButton = new JButton(ImageLoader.findImage("graph/zoomout.png")); - protected JButton[] mOtherToolBarButtons; - // Workflow factories - protected EdgeFactory mWfEdgeFactory; - protected VertexFactory mWfVertexFactory; - // Graph editor panel - protected EditorPanel mEditorPanel; - // Objects to view/modify the properties of the selected activity - protected VertexPropertyPanel mPropertyPanel; - protected JSplitPane mSplitPane; - - // Graph editor panel - // Objects to view/modify the properties of the selected activity - public WorkflowPane() - { - super("Workflow", "Workflow Viewer"); - // Workflow factories - mWfEdgeFactory = new WfEdgeFactory(); - mWfVertexFactory = new WfVertexFactory(); - mZoomOutButton.setToolTipText(Language.translate("Zoom Out")); - mLayoutButton.setToolTipText(Language.translate("Auto Layout")); - mLoadButton.setToolTipText(Language.translate("Load")); - mSaveButton.setToolTipText(Language.translate("Save")); - mOtherToolBarButtons = new JButton[] { mZoomOutButton, mLayoutButton, mLoadButton, mSaveButton }; - - } - - protected void createListeners() - { - /** - * - */ - mLoadButton.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent ae) - { - loadWorkflow(); - } - }); - /** - * - */ - mSaveButton.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent ae) - { - setCursor(new Cursor(Cursor.WAIT_CURSOR)); - saveWorkflow(); - setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); - } - }); - /** - * - */ - mLayoutButton.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent ae) - { - DefaultGraphLayoutGenerator.layoutGraph(mEditorPanel.mGraphModelManager.getModel()); - } - }); - /** - * - */ - mZoomOutButton.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent ae) - { - mEditorPanel.mGraphModelManager.zoomOut(); - } - }); - } - /** - * Return a single ref on mEditorPanel - * - * @return EditorPanel - */ - public EditorPanel getEditorPanel() - { - if (mEditorPanel == null) - mEditorPanel = - new EditorPanel( - mWfEdgeFactory, - mWfVertexFactory, - new WfVertexOutlineCreator(), - true, - mOtherToolBarButtons, - new WfGraphPanel(new WfDirectedEdgeRenderer(), new WfVertexRenderer())); - return mEditorPanel; - } - public JSplitPane getJSplitPane() - { - if (mSplitPane == null) - { - mSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, getEditorPanel(), getPropertyPanel()); - mSplitPane.setDividerSize(5); - mSplitPane.setDividerLocation(800); - } - return mSplitPane; - } - @Override - public void add(Workflow contents) - { - mWorkflow = contents; - addActivity((CompositeActivity) mWorkflow.search("workflow/domain")); - } - @Override - public void remove(String id) - { - } - protected void addActivity(CompositeActivity cAct) - { - // Resolve any undefined references in the workflow - mEditorPanel.mGraphModelManager.replace(cAct.getChildrenGraphModel()); - // Give the editor panel the edge and vertex types - mEditorPanel.updateVertexTypes(cAct.getWf().getVertexTypeNameAndConstructionInfo()); - mEditorPanel.updateEdgeTypes(cAct.getWf().getEdgeTypeNameAndConstructionInfo()); - mEditorPanel.enterSelectMode(); - mWfVertexFactory.setCreationContext(cAct); - } - @Override - public void run() - { - Thread.currentThread().setName("Workflow Pane Builder"); - if (!init) - { - getEditorPanel(); - createLayout(); - createListeners(); - mPropertyPanel.setGraphModelManager(mEditorPanel.mGraphModelManager); - mEditorPanel.setEditable(MainFrame.isAdmin); - init = true; - } - sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.LIFECYCLE, true)); - transPanel.setItem(sourceItem.getItem()); - } - @Override - public void reload() - { - Gateway.getStorage().clearCache(sourceItem.getItemPath(), ClusterStorage.LIFECYCLE); - initForItem(sourceItem); - } - protected void createLayout() - { - initPanel(); - // Add the editor pane - getGridBagConstraints().gridx = 0; - getGridBagConstraints().gridy = 1; - getGridBagConstraints().fill = GridBagConstraints.BOTH; - getGridBagConstraints().weighty = 2.0; - gridbag.setConstraints(getJSplitPane(), getGridBagConstraints()); - add(getJSplitPane()); - validate(); - } - protected void loadWorkflow() - { - File selectedFile = null; - int returnValue = MainFrame.xmlChooser.showOpenDialog(null); - switch (returnValue) - { - case JFileChooser.APPROVE_OPTION : - selectedFile = MainFrame.xmlChooser.getSelectedFile(); - try - { - String newWf = FileStringUtility.file2String(selectedFile); - add((Workflow) Gateway.getMarshaller().unmarshall(newWf)); - } - catch (Exception e) - { - e.printStackTrace(); - } - case JFileChooser.CANCEL_OPTION : - case JFileChooser.ERROR_OPTION : - default : - } - } - protected void saveWorkflow() - { - try - { - CompositeActivity cact = (CompositeActivity)mWorkflow.getWf().search("workflow/domain"); - MainFrame.userAgent.execute( - sourceItem.getItem(), - "ReplaceDomainWorkflow", - new String[] { Gateway.getMarshaller().marshall(cact)}); - mEditorPanel.mGraphPanel.setSelection(new Selection(null,null,0,0,0,0)); - } - catch (Exception e) - { - Logger.error(e); - } - } - - public VertexPropertyPanel getPropertyPanel() - { - if (mPropertyPanel == null) { - setNewPropertyPanel(); - transPanel = new TransitionPanel(); - mPropertyPanel.createLayout(transPanel); - mPropertyPanel.setGraphModelManager(mEditorPanel.mGraphModelManager); - mPropertyPanel.setEditable(MainFrame.isAdmin); - } - return mPropertyPanel; - } - - public void setNewPropertyPanel() - { - String wfPanelClass = Gateway.getProperties().getProperty("WfPropertyPanel"); - if (wfPanelClass != null) - { - try - { - Class panelClass = Class.forName(wfPanelClass); - mPropertyPanel = (VertexPropertyPanel) panelClass.newInstance(); - return; - } - catch (Exception ex) - { - Logger.error("Could not load wf props panel:" + wfPanelClass); - Logger.error(ex); - } - } - mPropertyPanel = new VertexPropertyPanel(); - } - - @Override - public void control(String control, String msg) { - // TODO Auto-generated method stub - - } - -} diff --git a/src/main/java/com/c2kernel/gui/tabs/collection/AggregationView.java b/src/main/java/com/c2kernel/gui/tabs/collection/AggregationView.java deleted file mode 100644 index f18d986..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/collection/AggregationView.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.c2kernel.gui.tabs.collection; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import com.c2kernel.gui.ImageLoader; - -import javax.swing.JButton; -import javax.swing.JSplitPane; - -import com.c2kernel.collection.Aggregation; -import com.c2kernel.collection.AggregationMember; -import com.c2kernel.collection.AggregationVertexFactory; -import com.c2kernel.collection.AggregationVertexOutlineCreator; -import com.c2kernel.collection.Collection; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.collection.AggregationMemberRenderer; -import com.c2kernel.gui.collection.PropertyPanel; -import com.c2kernel.gui.collection.SelectedMemberPanel; -import com.c2kernel.gui.graph.view.EditorPanel; -import com.c2kernel.gui.graph.view.GraphPanel; -import com.c2kernel.utils.Language; -/** - * @version $Revision: 1.5 $ $Date: 2006/09/15 15:02:24 $ - * @author $Author: abranson $ - */ -public class AggregationView extends CollectionView -{ - protected JButton mSaveButton = new JButton(ImageLoader.findImage("graph/save.png")); - protected JButton mHistoryButton = new JButton(ImageLoader.findImage("graph/history.png")); - protected JButton[] mOtherToolBarButtons = { mSaveButton, mHistoryButton }; - // Graph editor panel - protected EditorPanel mEditorPanel; - // Objects to view/modify the properties of the selected activity - protected PropertyPanel mPropertyPanel; - protected JSplitPane mSplitPane; - private final AggregationVertexFactory mAggregationVertexFactory = new AggregationVertexFactory(); - private final AggregationMemberRenderer mAggregationMemberRenderer = new AggregationMemberRenderer(); - public AggregationView() - { - super(); - setLayout(new GridLayout(1,1)); - mPropertyPanel = new PropertyPanel(); - mEditorPanel = new EditorPanel(null, mAggregationVertexFactory, new AggregationVertexOutlineCreator(), false, mOtherToolBarButtons, new GraphPanel(null, mAggregationMemberRenderer)); - createLayout(); - createListeners(); - mPropertyPanel.setGraphModelManager(mEditorPanel.mGraphModelManager); - mPropertyPanel.createLayout(new SelectedMemberPanel()); - mEditorPanel.setEditable(MainFrame.isAdmin); - } - - @Override - public void setCollection(Collection contents) - { - thisColl = contents; - Aggregation agg = (Aggregation)thisColl; - mPropertyPanel.setCollection(agg); - mAggregationMemberRenderer.setAggregation(agg); - mEditorPanel.mGraphModelManager.setModel(agg.getLayout()); - mEditorPanel.updateVertexTypes(agg.getVertexTypeNameAndConstructionInfo()); - mEditorPanel.enterSelectMode(); - mAggregationVertexFactory.setCreationContext(agg); - } - public void createLayout() - { - mSaveButton.setToolTipText(Language.translate("Save Layout Changes")); - mSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, mEditorPanel, mPropertyPanel); - mSplitPane.setDividerSize(5); - add(mSplitPane); - } - - protected void createListeners() - { - mSaveButton.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent ae) - { - saveCollection(); - } - }); - mHistoryButton.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent ae) - { - new CollectionHistoryWindow(item, (Aggregation)thisColl); - } - }); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/collection/CollectionHistoryWindow.java b/src/main/java/com/c2kernel/gui/tabs/collection/CollectionHistoryWindow.java deleted file mode 100644 index b97fa3c..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/collection/CollectionHistoryWindow.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.c2kernel.gui.tabs.collection; - -import java.awt.HeadlessException; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; - -import javax.swing.JFrame; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.table.AbstractTableModel; - -import com.c2kernel.collection.Aggregation; -import com.c2kernel.collection.Collection; -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.entity.proxy.ItemProxy; -import com.c2kernel.entity.proxy.MemberSubscription; -import com.c2kernel.entity.proxy.ProxyObserver; -import com.c2kernel.events.Event; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.lifecycle.instance.predefined.PredefinedStep; -import com.c2kernel.lookup.ItemPath; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.persistency.outcome.Outcome; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -public class CollectionHistoryWindow extends JFrame { - - JTable historyTable; - HistoryTableModel historyModel; - - public CollectionHistoryWindow(ItemProxy item, Aggregation coll) throws HeadlessException { - super("Collection History"); - historyModel = new HistoryTableModel(item, coll); - historyTable = new JTable(historyModel); - this.getContentPane().add(new JScrollPane(historyTable)); - historyTable.addMouseListener(new HistoryTableListener(item)); - this.pack(); - super.toFront(); - this.validate(); - this.setVisible(true); - } - - private class HistoryTableModel extends AbstractTableModel implements ProxyObserver { - - ItemProxy item; - ArrayList collEvents; - ArrayList collEventData; - Aggregation coll; - public HistoryTableModel(ItemProxy item, Aggregation coll) { - this.item = item; - this.coll = coll; - collEvents = new ArrayList(); - collEventData = new ArrayList(); - item.subscribe(new MemberSubscription(this, ClusterStorage.HISTORY, true)); - } - @Override - public int getColumnCount() { - return 4; - } - - @Override - public String getColumnName(int columnIndex) { - switch(columnIndex) { - case 0: return Language.translate("Date"); - case 1: return Language.translate("Operation"); - case 2: return Language.translate("Slot"); - case 3: return Language.translate("Child"); - default: return ""; - } - } - @Override - public int getRowCount() { - return collEvents.size(); - } - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - Event ev = collEvents.get(rowIndex); - switch (columnIndex) { - case 0: - return ev.getTimeString(); - case 1: - if (ev.getStepName().equals("AssignItemToSlot")) - return "Item Assigned"; - else - return "Collection replaced"; - case 2: - if (ev.getStepName().equals("AssignItemToSlot")) - return ((String[])collEventData.get(rowIndex))[1]; - return ""; - case 3: - if (ev.getStepName().equals("AddC2KObject")) - return "Click to view"; - String name; - try { - ItemProxy childItem = Gateway.getProxyManager().getProxy(new ItemPath(((String[])collEventData.get(rowIndex))[2])); - name = childItem.getName(); - } catch (ObjectNotFoundException e) { - name = "Item deleted: "+((String[])collEventData.get(rowIndex))[2]; - } catch (Exception e) { - name = "Problem resolving Item key: "+((String[])collEventData.get(rowIndex))[2]; - } - return name; - default: - return ""; - } - } - public Object getEventData(int row) { - return collEventData.get(row); - } - @Override - public void add(Event thisEv) { - if (thisEv.getStepName().equals("AssignItemToSlot") || thisEv.getStepName().equals("AddC2KObject")) { - String[] params; - try { - Outcome oc = (Outcome)item.getObject(ClusterStorage.OUTCOME+"/PredefinedStepOutcome/0/"+thisEv.getID()); - params = PredefinedStep.getDataList(oc.getData()); - } catch (ObjectNotFoundException ex) { return; } - if (thisEv.getStepName().equals("AssignItemToSlot")) { - if (params[0].equals(coll.getName())) - collEventData.add(params); - else return; - } - else { - Object obj; - try { - obj = Gateway.getMarshaller().unmarshall(params[0]); - } catch (Exception e) { - Logger.error(e); - return; - } - if (obj instanceof Collection) - collEventData.add(obj); - else return; - - } - } - else return; - collEvents.add(thisEv); - fireTableRowsInserted(collEvents.size()-1, collEvents.size()-1); - } - @Override - public void remove(String id) { } - @Override - public void control(String control, String msg) { - } - } - - private class HistoryTableListener extends MouseAdapter { - - ItemProxy item; - public HistoryTableListener(ItemProxy item) { - this.item = item; - } - - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount()==2) { - int row = historyTable.getSelectedRow(); - Object data = historyModel.getEventData(row); - if (data instanceof Aggregation) { - showColl((Aggregation)data); - } - else { - String[] params = (String[])data; - try { - ItemProxy childItem = Gateway.getProxyManager().getProxy(new ItemPath(params[2])); - MainFrame.itemFinder.pushNewKey(childItem.getName()); - } catch (Exception ex) { } - } - } - } - public void showColl(Aggregation coll) { - JFrame newFrame = new JFrame(); - AggregationView newView = new AggregationView(); - newView.setCollection(coll); - newView.setItem(item); - newFrame.getContentPane().add(newView); - newFrame.pack(); - newFrame.toFront(); - newFrame.validate(); - newFrame.setVisible(true); - } - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/collection/CollectionMemberPropertyPanel.java b/src/main/java/com/c2kernel/gui/tabs/collection/CollectionMemberPropertyPanel.java deleted file mode 100644 index 478403c..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/collection/CollectionMemberPropertyPanel.java +++ /dev/null @@ -1,182 +0,0 @@ -package com.c2kernel.gui.tabs.collection; - -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.lang.reflect.Constructor; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; - -import com.c2kernel.collection.CollectionMember; -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.graph.view.PropertyTable; -import com.c2kernel.gui.graph.view.PropertyTableModel; -import com.c2kernel.gui.tabs.ItemTabPane; -import com.c2kernel.lookup.ItemPath; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.CastorHashMap; -import com.c2kernel.utils.Language; - -public class CollectionMemberPropertyPanel extends JPanel implements ActionListener { - - private final PropertyTableModel mPropertyModel; - private final PropertyTable mPropertyTable; - private boolean isEditable = false; - CollectionMember selectedCollMem; - GridBagLayout gridbag = new GridBagLayout(); - protected JLabel selObjSlot; - protected JLabel selObjMember; - JButton addPropButton; - JButton delPropButton; - Box newPropBox; - private JTextField newPropName; - private JComboBox newPropType; - String[] typeOptions = { "String", "Boolean", "Integer", "Float" }; - String[] typeInitVal = { "", "false", "0", "0.0"}; - - public CollectionMemberPropertyPanel() { - super(); - setLayout(gridbag); - mPropertyModel = new PropertyTableModel(); - mPropertyTable = new PropertyTable(mPropertyModel); - createLayout(); - } - - public void setMember(CollectionMember cm) { - selectedCollMem = cm; - String newMemberName; - try { - ItemPath path = cm.getItemPath(); - if (path == null) newMemberName = "No member"; - else newMemberName = Gateway.getProxyManager().getProxy(path).getProperty("Name"); - } catch (ObjectNotFoundException e) { - newMemberName = "Item or Item name property not found"; - } - - selObjSlot.setText(newMemberName); - selObjMember.setText("Slot "+cm.getID()); - mPropertyModel.setMap(cm.getProperties()); - addPropButton.setEnabled(isEditable); - delPropButton.setEnabled(isEditable); - } - - public void createLayout() - { - GridBagConstraints c = new GridBagConstraints(); - c.gridx = 0; - c.gridy = 0; - c.weightx = 1; - c.weighty = 0; - c.anchor = GridBagConstraints.NORTHWEST; - c.ipadx = 5; - c.ipady = 5; - - selObjSlot = new JLabel(); - selObjSlot.setFont(ItemTabPane.titleFont); - gridbag.setConstraints(selObjSlot, c); - add(selObjSlot); - - c.gridy++; - selObjMember = new JLabel(); - gridbag.setConstraints(selObjMember, c); - add(selObjMember); - - c.gridy++; - JLabel title = new JLabel("Properties"); - title.setFont(ItemTabPane.titleFont); - gridbag.setConstraints(title, c); - add(title); - - c.gridy++; - c.fill = GridBagConstraints.BOTH; - c.weighty = 2; - JScrollPane scroll = new JScrollPane(mPropertyTable); - gridbag.setConstraints(scroll, c); - add(scroll); - - newPropBox = Box.createHorizontalBox(); - newPropBox.add(new JLabel(Language.translate("New :"))); - newPropBox.add(Box.createHorizontalGlue()); - newPropName = new JTextField(15); - newPropBox.add(newPropName); - newPropType = new JComboBox(typeOptions); - newPropBox.add(newPropType); - newPropBox.add(Box.createHorizontalStrut(1)); - addPropButton = new JButton("Add"); - addPropButton.setMargin(new Insets(0, 0, 0, 0)); - delPropButton = new JButton("Del"); - delPropButton.setMargin(new Insets(0, 0, 0, 0)); - addPropButton.addActionListener(this); - delPropButton.addActionListener(this); - newPropBox.add(addPropButton); - newPropBox.add(delPropButton); - - c.gridy++; - c.weighty=0; - c.fill= GridBagConstraints.HORIZONTAL; - gridbag.setConstraints(newPropBox, c); - add(newPropBox); - } - - public void clear() { - selObjSlot.setText(""); - selObjMember.setText("Nothing Selected"); - mPropertyModel.setMap(new CastorHashMap()); - addPropButton.setEnabled(false); - delPropButton.setEnabled(false); - } - - /** - * @param isEditable The isEditable to set. - */ - public void setEditable(boolean editable) { - mPropertyModel.setEditable(editable); - isEditable = editable; - newPropBox.setVisible(editable); - } - - @Override - public void actionPerformed(ActionEvent e) { - if (e.getSource() == addPropButton) { - if (newPropName.getText().length() < 1) { - JOptionPane.showMessageDialog(this, "Enter a name for the new property", "Cannot add property", JOptionPane.ERROR_MESSAGE); - return; - } - if (mPropertyModel.sourceMap.containsKey(newPropName.getText())) { - JOptionPane.showMessageDialog(this, "Property '"+newPropName.getText()+"' already exists.", "Cannot add property", JOptionPane.ERROR_MESSAGE); - return; - } - if (mPropertyTable.getCellEditor() != null) - mPropertyTable.getCellEditor().stopCellEditing(); - - try { - Class newPropClass = Class.forName("java.lang."+typeOptions[newPropType.getSelectedIndex()]); - Class[] params = {String.class}; - Constructor init = newPropClass.getConstructor(params); - Object[] initParams = { typeInitVal[newPropType.getSelectedIndex()] }; - mPropertyModel.addProperty(newPropName.getText(), init.newInstance(initParams), false); - } catch (Exception ex) { - MainFrame.exceptionDialog(ex); - } - } - else if (e.getSource() == delPropButton) { - int selrow = mPropertyTable.getSelectedRow(); - if (selrow == -1) { - JOptionPane.showMessageDialog(this, "Select a property to remove", "Cannot delete property", JOptionPane.ERROR_MESSAGE); - return; - } - mPropertyModel.delProperty(mPropertyModel.sortedNameList.get(selrow)); - } - } - -} diff --git a/src/main/java/com/c2kernel/gui/tabs/collection/CollectionView.java b/src/main/java/com/c2kernel/gui/tabs/collection/CollectionView.java deleted file mode 100644 index f9f7d50..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/collection/CollectionView.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.c2kernel.gui.tabs.collection; - -import javax.swing.JPanel; - -import com.c2kernel.collection.Collection; -import com.c2kernel.collection.CollectionMember; -import com.c2kernel.entity.proxy.ItemProxy; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Logger; - -/************************************************************************** - * - * $Revision: 1.1 $ - * $Date: 2004/08/10 07:56:08 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - - -public abstract class CollectionView extends JPanel { - - protected Collection thisColl; - protected ItemProxy item; - - public CollectionView() { - super(); - } - - public void setItem(ItemProxy item) { - this.item = item; - } - - public abstract void setCollection(Collection coll); - - protected void saveCollection() - { - try - { - String[] params = new String[1]; - params[0] = Gateway.getMarshaller().marshall(thisColl); - MainFrame.userAgent.execute(item, "AddC2KObject", params); - } - catch (Exception e) - { - Logger.error(e); - } - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/collection/DependencyView.java b/src/main/java/com/c2kernel/gui/tabs/collection/DependencyView.java deleted file mode 100644 index a53f562..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/collection/DependencyView.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.c2kernel.gui.tabs.collection; -import java.awt.GridLayout; - -import javax.swing.JSplitPane; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; - -import com.c2kernel.collection.Collection; -import com.c2kernel.collection.DependencyMember; -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.TreeBrowser; -import com.c2kernel.gui.tree.Node; -import com.c2kernel.gui.tree.NodeCollection; -import com.c2kernel.gui.tree.NodeItem; -/** - * @version $Revision: 1.2 $ $Date: 2005/06/02 12:17:22 $ - * @author $Author: abranson $ - */ -public class DependencyView extends CollectionView -{ - TreeBrowser tree; - CollectionMemberPropertyPanel propPanel; - JSplitPane split; - - public DependencyView() - { - super(); - setLayout(new GridLayout(1, 1)); - createLayout(); - } - - @Override - public void setCollection(Collection contents) - { - thisColl = contents; - NodeCollection collNode = new NodeCollection(item, thisColl.getName(), null); - tree = new TreeBrowser(MainFrame.myDesktopManager, collNode); - tree.getTree().addTreeSelectionListener(new TreeSelectionListener() { - @Override - public void valueChanged(TreeSelectionEvent e) { - if (e.getPath() == null) { - propPanel.clear(); - } - else { - Node selectedNode = (Node)((DefaultMutableTreeNode)e.getPath().getLastPathComponent()).getUserObject(); - if (selectedNode instanceof NodeItem) { - NodeItem thisItem = (NodeItem)selectedNode; - if (thisItem.getParentCollection() != null) { - try { - propPanel.setMember(thisItem.getParentCollection().getMember(thisItem.getSlotNo())); - return; - } catch (ObjectNotFoundException e1) { } - } - propPanel.clear(); - } - } - } - }); - split.setLeftComponent(tree); - } - public void createLayout() - { - propPanel = new CollectionMemberPropertyPanel(); - split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); - split.setRightComponent(propPanel); - add(split); - - } - -} diff --git a/src/main/java/com/c2kernel/gui/tabs/execution/ActivityItem.java b/src/main/java/com/c2kernel/gui/tabs/execution/ActivityItem.java deleted file mode 100644 index bacdd52..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/execution/ActivityItem.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.c2kernel.gui.tabs.execution; -import java.util.ArrayList; - -import com.c2kernel.entity.agent.Job; - -public class ActivityItem { - public String stepPath; - public int state; - public String stateName; - public String name; - ArrayList jobs = new ArrayList(); - - public ActivityItem() { - stepPath = ""; - state = -1; - name = "--"; - } - - public ActivityItem(Job thisJob) { - stepPath = thisJob.getStepPath(); - state = thisJob.getTransition().getOriginStateId(); - stateName = thisJob.getOriginStateName(); - name = thisJob.getStepName(); - jobs.add(thisJob); - } - - public void addJob(Job newJob) { - jobs.add(newJob); - } - - public ArrayList getJobs() { - return jobs; - } - - public String getStepPath() { - return stepPath; - } - - @Override - public String toString() { - return name+(state>-1?" ("+stateName+")":""); - } - - @Override - public boolean equals(Object other) { - if (other instanceof ActivityItem) - return hashCode() == ((ActivityItem)other).hashCode(); - return false; - } - - @Override - public int hashCode() { - return stepPath.hashCode(); - } - -} diff --git a/src/main/java/com/c2kernel/gui/tabs/execution/ActivityViewer.java b/src/main/java/com/c2kernel/gui/tabs/execution/ActivityViewer.java deleted file mode 100644 index 9405937..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/execution/ActivityViewer.java +++ /dev/null @@ -1,345 +0,0 @@ -package com.c2kernel.gui.tabs.execution; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.util.ArrayList; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import com.c2kernel.common.InvalidDataException; -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.entity.agent.Job; -import com.c2kernel.entity.proxy.ItemProxy; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.tabs.ItemTabPane; -import com.c2kernel.gui.tabs.ExecutionPane; -import com.c2kernel.gui.tabs.outcome.InvalidOutcomeException; -import com.c2kernel.gui.tabs.outcome.InvalidSchemaException; -import com.c2kernel.gui.tabs.outcome.OutcomeHandler; -import com.c2kernel.utils.FileStringUtility; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.LocalObjectLoader; -import com.c2kernel.utils.Logger; - -public class ActivityViewer extends JPanel implements Runnable { - - ItemProxy item; - Box outcomeButtons = Box.createHorizontalBox(); - OutcomeHandler outcomePanel; - OutcomeHandler errorPanel; - JPanel outcomeView = new JPanel(new GridLayout(1,1)); - JPanel errorView = new JPanel(new GridLayout(2,1)); - ActivityItem thisAct; - ArrayList requestButtons = new ArrayList(); - JLabel noOutcome = new JLabel(Language.translate("No outcome data is required for this activity")); - ExecutionPane parent; - JLabel status; - JComboBox executors; - JButton saveButton = new JButton("Save"); - JButton loadButton = new JButton("Load"); - GridBagLayout gridbag = new GridBagLayout(); - Job executingJob = null; - static JFileChooser chooser = new JFileChooser(); - static { - chooser.addChoosableFileFilter( - new javax.swing.filechooser.FileFilter() { - @Override - public String getDescription() { - return "XML Files"; - } - @Override - public boolean accept(File f) { - if (f.isDirectory() || (f.isFile() && f.getName().endsWith(".xml"))) { - return true; - } - return false; - } - }); - } - - public ActivityViewer (ActivityItem newAct, ItemProxy item, ExecutionPane parent){ - thisAct = newAct; - this.item = item; - this.parent = parent; - setLayout(gridbag); - - GridBagConstraints c = new GridBagConstraints(); - c.gridx=0; c.gridy=1; c.weightx=1.0; c.weighty=0.0; - c.insets = new Insets(5,5,5,5); - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.HORIZONTAL; - -// activity title - JLabel actTitle = new JLabel(Language.translate("Activity")+": "+newAct.name); - actTitle.setFont(ItemTabPane.titleFont); - gridbag.setConstraints(actTitle, c); - add(actTitle); - - Job firstJob = (thisAct.getJobs().get(0)); -// desc - String desc = firstJob.getDescription(); - if (desc != null && desc.length() > 0) { - Box descBox = Box.createHorizontalBox(); - - String chopDesc = null; - if(desc.length() >= 40) chopDesc = desc.substring(0,40); - else chopDesc = desc; - - descBox.add(new JLabel("Description: "+chopDesc)); - if (desc.length()>chopDesc.length()) { - descBox.add(new JLabel(" ...")); - descBox.add(Box.createHorizontalStrut(7)); - JButton descButton = new JButton("View"); - descButton.setMargin(new Insets(0,0,0,0)); - descButton.setActionCommand(desc); - descButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - JTextArea descArea = new JTextArea(e.getActionCommand()); - descArea.setLineWrap(true); - descArea.setWrapStyleWord(true); - JScrollPane descScroll = new JScrollPane(descArea); - descScroll.setPreferredSize(new Dimension(400,150)); - JOptionPane.showMessageDialog(null, descScroll, "Activity Description", JOptionPane.PLAIN_MESSAGE); - } - }); - descBox.add(descButton); - } - - c.gridy++; - gridbag.setConstraints(descBox, c); - add(descBox); - } - - -// agentid - String roleName = firstJob.getAgentRole(); - if (roleName!= null && roleName.length()>0) { - c.gridy++; - JLabel role = new JLabel(Language.translate("Agent Role")+": "+roleName); - gridbag.setConstraints(role, c); - add(role); - } - - c.gridy++; - c.anchor = GridBagConstraints.EAST; - gridbag.setConstraints(outcomeButtons, c); - add(outcomeButtons); - - executors = MainFrame.getExecutionPlugins(); - if (executors.getItemCount() > 1) { - c.gridx++; - gridbag.setConstraints(executors, c); - add(executors); - c.gridx--; - } - - c.gridy++; - - status = new JLabel(Language.translate("Waiting for request")); - status.setFont(ItemTabPane.titleFont); - gridbag.setConstraints(status, c); - add(status); - - c.gridx++; - Box fileBox = Box.createHorizontalBox(); - fileBox.add(saveButton); fileBox.add(Box.createHorizontalGlue()); fileBox.add(loadButton); - gridbag.setConstraints(fileBox, c); - add(fileBox); - saveButton.setEnabled(false); - loadButton.setEnabled(false); - c.gridx--; - c.gridwidth = 2; - for (Object name2 : thisAct.getJobs()) { - Job thisJob = (Job)name2; - RequestButton newButton = new RequestButton(thisJob, this); - requestButtons.add(newButton); - outcomeButtons.add(newButton); - outcomeButtons.add(Box.createHorizontalStrut(5)); - newButton.setEnabled(false); - - if (thisJob.hasOutcome()) { - - String schemaName; - int schemaVersion; - try { - schemaName = thisJob.getSchemaName(); - schemaVersion = thisJob.getSchemaVersion(); - } catch (Exception e) { - newButton.setToolTipText("Could not load schema for this job."); - continue; - } - - if(!schemaName.equals("Errors") && outcomePanel == null) { - try { - outcomePanel = getOutcomeHandler(thisJob); - outcomeView = outcomePanel.getPanel(); - newButton.setEnabled(true); - } catch (ObjectNotFoundException ex) { - outcomeView.add(new JLabel(Language.translate("Schema not found:")+" "+schemaName+" v"+schemaVersion)); - } catch (Exception ex) { - outcomeView.add(new JLabel(Language.translate("ERROR loading outcome editor: ") - +ex.getClass().getName()+" ("+ex.getMessage()+")")); - Logger.error(ex); - } - } - if (schemaName.equals("Errors")) { - try { - errorPanel = getOutcomeHandler(thisJob); - errorView.add(errorPanel.getPanel()); - newButton.setEnabled(true); - } catch (Exception ex) { - errorView.add(new JLabel(Language.translate("ERROR loading error editor: ") - +ex.getClass().getName()+" ("+ex.getMessage()+")")); - - } - } - } - else - newButton.setEnabled(true); - } - if (outcomePanel == null) - outcomeView.add(noOutcome); - else - enableLoadSaveButtons(); - - - c.gridy++; c.weighty=1.0; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.BOTH; - gridbag.setConstraints(outcomeView, c); - add(outcomeView); - - } - - public OutcomeHandler getOutcomeHandler(Job thisJob) throws ObjectNotFoundException, InvalidSchemaException, InvalidOutcomeException, InvalidDataException { - String schema; - OutcomeHandler thisForm; - schema = LocalObjectLoader.getSchema(thisJob.getSchemaName(), thisJob.getSchemaVersion()).schema; - thisForm = ItemTabPane.getOutcomeHandler(thisJob.getSchemaName(), thisJob.getSchemaVersion()); - thisForm.setReadOnly(false); - thisForm.setDescription(schema); - String outcomeString = thisJob.getOutcomeString(); - if ( outcomeString!= null && outcomeString.length() > 0) - thisForm.setOutcome(outcomeString); - return thisForm; - } - - public void enableLoadSaveButtons() { - saveButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - String output; - try { - output = outcomePanel.getOutcome(); - int returnVal = chooser.showSaveDialog(null); - if (returnVal == JFileChooser.APPROVE_OPTION) { - File targetFile = chooser.getSelectedFile(); - if (!(targetFile.getAbsolutePath().endsWith(".xml"))) - targetFile = new File(targetFile.getAbsolutePath()+".xml"); - - Logger.msg(2, "ExecutionPane - Exporting outcome to file " + targetFile.getName()); - FileStringUtility.string2File(targetFile, output); - } - } catch (Exception ex) { - Logger.error(ex); - MainFrame.exceptionDialog(ex); - } - } - }); - saveButton.setEnabled(true); - - loadButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - try { - int returnVal = chooser.showOpenDialog(null); - if (returnVal == JFileChooser.APPROVE_OPTION) { - File targetFile = chooser.getSelectedFile(); - - Logger.msg(2, "ViewpointPane.actionPerformed() - Reading outcome from file " + targetFile.getName()); - String outcome = FileStringUtility.file2String(targetFile); - outcomePanel.setOutcome(outcome); - new Thread(outcomePanel).start(); - } - } catch (Exception ex) { - Logger.error(ex); - MainFrame.exceptionDialog(ex); - } - } - }); - loadButton.setEnabled(true); - } - - public void init() { - if (outcomePanel != null) - new Thread(outcomePanel).start(); - if (errorPanel != null) - new Thread(errorPanel).start(); - } - - public void execute(Job thisJob) { - try { - if (thisJob.hasOutcome()) - if (!thisJob.getSchemaName().equals("Errors")) - thisJob.setOutcome(outcomePanel.getOutcome()); - else { - Box errorBox = Box.createVerticalBox(); - errorBox.add(new JLabel("Please give details of the error:")); - errorBox.add(errorView); - int result = JOptionPane.showConfirmDialog(this, errorBox, "Send Error", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE); - if (result != JOptionPane.OK_OPTION) - return; - thisJob.setOutcome(errorPanel.getOutcome()); - } - executingJob = thisJob; - new Thread(this).start(); - } catch (Exception ex) { - MainFrame.exceptionDialog(ex); - } - - } - - /** - * Submits the job to the database - */ - @Override - public void run() { - Thread.currentThread().setName("Activity Execution"); - enableAllButtons(false); - try { - Executor selectedExecutor = (Executor)executors.getSelectedItem(); - selectedExecutor.execute(executingJob, status); - } catch (Exception e) { - Logger.error(e); - MainFrame.progress.stopBouncing(Language.translate("Error during execution")); - status.setText(Language.translate("Error during execution: "+e.getClass().getSimpleName())); - MainFrame.exceptionDialog(e); - } - enableAllButtons(true); - } - - private void enableAllButtons(boolean enabled) { - - for (RequestButton thisButton : requestButtons) { - thisButton.setEnabled(enabled); - } - } - - public ActivityItem getActivity() { - return thisAct; - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/execution/DefaultExecutor.java b/src/main/java/com/c2kernel/gui/tabs/execution/DefaultExecutor.java deleted file mode 100644 index 848d1d3..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/execution/DefaultExecutor.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.c2kernel.gui.tabs.execution; - -import javax.swing.JLabel; - -import com.c2kernel.entity.agent.Job; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.utils.Language; - -/************************************************************************** - * - * $Revision: 1.2 $ - * $Date: 2003/11/04 14:31:30 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class DefaultExecutor implements Executor { - - public DefaultExecutor() { - super(); - } - - @Override - public void execute(Job job, JLabel status) throws Exception { - status.setText(Language.translate("Submitting...")); - MainFrame.progress.startBouncing("Requesting, please wait."); - MainFrame.userAgent.execute(job); - MainFrame.progress.stopBouncing("Execution complete."); - status.setText("Waiting for joblist update."); - } - - @Override - public String toString() { - return "Normal"; - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/execution/Executor.java b/src/main/java/com/c2kernel/gui/tabs/execution/Executor.java deleted file mode 100644 index 6fbde17..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/execution/Executor.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.c2kernel.gui.tabs.execution; - -import javax.swing.JLabel; - -import com.c2kernel.entity.agent.Job; - -/************************************************************************** - * - * $Revision: 1.1 $ - * $Date: 2003/09/25 10:28:02 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public interface Executor { - - @Override - public String toString(); - - public void execute(Job job, JLabel status) throws Exception; -} diff --git a/src/main/java/com/c2kernel/gui/tabs/execution/RequestButton.java b/src/main/java/com/c2kernel/gui/tabs/execution/RequestButton.java deleted file mode 100644 index 440bb58..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/execution/RequestButton.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.c2kernel.gui.tabs.execution; -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JButton; - -import com.c2kernel.entity.agent.Job; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.utils.Logger; -/** - * Each job gets a RequestButton - */ - - public class RequestButton extends JButton implements ActionListener { - - Job myJob; - ActivityViewer parent; - - public RequestButton(Job myJob, ActivityViewer parent) { - super(); - this.myJob = myJob; - this.parent = parent; - String label = myJob.getTransition().getName(); - if (myJob.hasOutcome()) { - setBackground(Color.white); - try { - if (myJob.getSchemaName().equals("Errors")) setBackground(Color.pink); - } catch (Exception e) { - Logger.error(e); - MainFrame.exceptionDialog(e); - setEnabled(false); - } - } - super.setText(label); - addActionListener(this); - } - - @Override - public void actionPerformed(ActionEvent event) { - parent.execute(myJob); - } - } diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/BasicOutcomeEditor.java b/src/main/java/com/c2kernel/gui/tabs/outcome/BasicOutcomeEditor.java deleted file mode 100644 index 62312e9..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/BasicOutcomeEditor.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.c2kernel.gui.tabs.outcome; - -import java.awt.Font; -import java.awt.GridLayout; -import java.io.File; - -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.text.PlainDocument; - -import com.c2kernel.utils.FileStringUtility; - -/************************************************************************** - * - * $Revision: 1.4 $ - * $Date: 2005/09/07 13:46:31 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - - - -public class BasicOutcomeEditor extends JPanel implements OutcomeHandler { - - PlainDocument doc; - JTextArea textarea; - boolean unsaved; - - public BasicOutcomeEditor() { - super(); - this.setLayout(new GridLayout(1,1)); - doc = new PlainDocument(); - textarea = new JTextArea(doc); - textarea.setTabSize(2); - textarea.setFont(Font.decode("monospaced")); - add(new JScrollPane(textarea)); - doc.addDocumentListener(new DocumentListener() { - @Override - public void changedUpdate(DocumentEvent e) { unsaved = true; } - @Override - public void insertUpdate(DocumentEvent e) { unsaved = true; } - @Override - public void removeUpdate(DocumentEvent e) { unsaved = true; } - - }); - } - - @Override - public void setOutcome(String outcome) throws InvalidOutcomeException { - try { - doc.insertString(0, outcome, null); - unsaved = false; - } catch (Exception ex) { - throw new InvalidOutcomeException(ex.getMessage()); - } - } - - @Override - public void setDescription(String description) throws InvalidSchemaException { } - - @Override - public void setReadOnly(boolean readOnly) { - textarea.setEditable(!readOnly); - } - - - @Override - public JPanel getPanel() throws OutcomeNotInitialisedException { - return this; - } - - /** - * - */ - - @Override - public String getOutcome() throws OutcomeException { - if (doc.getLength()==0) return null; - try { - return doc.getText(0, doc.getLength()); - } catch (Exception ex) { - throw new OutcomeException(ex.getMessage()); - } - } - - /** - * - */ - - @Override - public void run() { - } - - - @Override - public boolean isUnsaved() { - return unsaved; - } - - @Override - public void saved() { - unsaved = false; - } - - @Override - public void export(File targetFile) throws Exception { - FileStringUtility.string2File(targetFile, getOutcome()); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/InvalidOutcomeException.java b/src/main/java/com/c2kernel/gui/tabs/outcome/InvalidOutcomeException.java deleted file mode 100644 index bab9050..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/InvalidOutcomeException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.c2kernel.gui.tabs.outcome; - -public class InvalidOutcomeException extends OutcomeException { - - public InvalidOutcomeException() { - super(); - } - public InvalidOutcomeException(String ex) { - super(ex); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/InvalidSchemaException.java b/src/main/java/com/c2kernel/gui/tabs/outcome/InvalidSchemaException.java deleted file mode 100644 index 5edbcbf..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/InvalidSchemaException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.c2kernel.gui.tabs.outcome; - -public class InvalidSchemaException extends OutcomeException { - - public InvalidSchemaException() { - super(); - } - public InvalidSchemaException(String ex) { - super(ex); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeException.java b/src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeException.java deleted file mode 100644 index fd608d0..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.c2kernel.gui.tabs.outcome; - -public class OutcomeException extends Exception { - - public OutcomeException() { - super(); - } - public OutcomeException(String ex) { - super(ex); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeHandler.java b/src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeHandler.java deleted file mode 100644 index 0d6dc74..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.c2kernel.gui.tabs.outcome; -import java.io.File; - -import javax.swing.JPanel; - -public interface OutcomeHandler extends Runnable { - - public void setOutcome(String outcome) throws InvalidOutcomeException; - public void setDescription(String description) throws InvalidSchemaException; - public void setReadOnly(boolean readOnly); - public JPanel getPanel() throws OutcomeNotInitialisedException; - public boolean isUnsaved(); - public void saved(); - public String getOutcome() throws OutcomeException; - public void export(File targetFile) throws Exception; -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeNotInitialisedException.java b/src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeNotInitialisedException.java deleted file mode 100644 index 7b54f33..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/OutcomeNotInitialisedException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.c2kernel.gui.tabs.outcome; - -public class OutcomeNotInitialisedException extends OutcomeException { - - public OutcomeNotInitialisedException() { - super(); - } - public OutcomeNotInitialisedException(String ex) { - super(ex); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/AttributeList.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/AttributeList.java deleted file mode 100644 index 7d15452..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/AttributeList.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; - -import java.awt.Font; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.Iterator; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.SwingConstants; - -import org.exolab.castor.xml.schema.AttributeDecl; -import org.exolab.castor.xml.schema.ComplexType; -import org.exolab.castor.xml.schema.ElementDecl; -import org.w3c.dom.Attr; -import org.w3c.dom.Element; - -import com.c2kernel.gui.tabs.outcome.form.field.StringEditField; -import com.c2kernel.utils.Logger; - -public class AttributeList extends JPanel { - - ArrayList attrSet = new ArrayList(); - ElementDecl model; - Element myElement; - boolean readOnly; - static Font labelFont; - - public AttributeList(ElementDecl model, boolean readOnly, HelpPane helpPane) { - super(); - AttributeDecl thisDecl; - this.model = model; - this.readOnly = readOnly; - - // set up panel - GridBagLayout gridbag = new java.awt.GridBagLayout(); - setLayout(gridbag); - if (labelFont == null) - labelFont = this.getFont().deriveFont((float)(this.getFont().getSize()-3.0)); - // retrieve attributes - if (!model.getType().isComplexType()) { - // simple types have no attributes - return; - } - - ComplexType content = (ComplexType)model.getType(); - - // place on panel - - GridBagConstraints c = new GridBagConstraints(); - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1.0; c.weighty = 1.0; c.gridx = 0; - c.ipadx = 5; c.ipady = 0; - - for (Enumeration fields = content.getAttributeDecls(); fields.hasMoreElements();) { - c.gridy = 0; - thisDecl = (AttributeDecl)fields.nextElement(); - Logger.msg(8, "Includes Attribute "+thisDecl.getName()); - - // Add Label - JLabel heading = new JLabel(thisDecl.getName()); - heading.setFont(labelFont); - heading.setVerticalAlignment(SwingConstants.BOTTOM); - gridbag.setConstraints(heading, c); - this.add(heading); - - // read help - String helpText; - String doc = OutcomeStructure.extractHelp(thisDecl); - if (doc.length() > 0) - helpText = doc.toString(); - else - helpText = "No help is available for this attribute"; - - - c.gridy++; - - // Add entry - try { - StringEditField entry = StringEditField.getEditField(thisDecl); - entry.setHelp(helpPane, helpText); - attrSet.add(entry); - if (readOnly) entry.setEditable(false); - gridbag.setConstraints(entry.getControl(), c); - this.add(entry.getControl()); - } catch (StructuralException e) { - JLabel entry = new JLabel("Error"); - entry.setToolTipText(e.getMessage()); - gridbag.setConstraints(entry, c); - this.add(entry); - } - - - c.gridx++; - } - } - - public void setInstance(Element data) throws StructuralException { - this.myElement = data; - for (StringEditField thisField : attrSet) { - Logger.msg(8, "Populating Attribute "+thisField.getName()); - Attr thisAttr = myElement.getAttributeNode(thisField.getName()); - if (thisAttr == null) - thisAttr = newAttribute(myElement, (AttributeDecl)thisField.getModel()); - thisField.setData(thisAttr); - } - } - - public Attr newAttribute(Element parent, AttributeDecl attr) { - - parent.setAttribute(attr.getName(), attr.getFixedValue()!=null?attr.getFixedValue():attr.getDefaultValue()); - return parent.getAttributeNode(attr.getName()); - } - - public String validateAttributes() { - if (model.getType().isComplexType()) { - ComplexType content = (ComplexType)model.getType(); - for (Enumeration fields = content.getAttributeDecls(); fields.hasMoreElements();) { - AttributeDecl thisDecl = (AttributeDecl)fields.nextElement(); - String attrVal = myElement.getAttribute(thisDecl.getName()); - if (attrVal.length() == 0 && thisDecl.isOptional()) { - myElement.removeAttribute(thisDecl.getName()); - } - } - } - return null; - } - - public void initNew(Element parent) { - AttributeDecl thisDecl; - StringEditField thisField; - Attr thisAttr; - this.myElement = parent; - - if (model.getType().isSimpleType()) return; // no attributes in simple types - - ComplexType content = (ComplexType)model.getType(); - - for (Iterator e = attrSet.iterator(); e.hasNext();) { - thisField = e.next(); - - thisDecl = content.getAttributeDecl(thisField.getName()); - // HACK: if we don't resolve the reference, the type will be null - if (thisDecl.isReference()) thisDecl = thisDecl.getReference(); - thisAttr = newAttribute(myElement, thisDecl); - // add into parent - fill in field - try { - thisField.setData(thisAttr); - } catch (Exception ex) { } // impossible name mismatch - } - } - @Override - public void grabFocus() { - if (attrSet.size() > 0) - attrSet.get(0).grabFocus(); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/CardinalException.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/CardinalException.java deleted file mode 100644 index bb6d039..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/CardinalException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; - -import com.c2kernel.gui.tabs.outcome.OutcomeException; - -public class CardinalException extends OutcomeException { - - public CardinalException() { - super(); - } - - public CardinalException(String ex) { - super(ex); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/DataRecord.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/DataRecord.java deleted file mode 100644 index 3bfe3fd..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/DataRecord.java +++ /dev/null @@ -1,252 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; -import java.awt.FlowLayout; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; - -import javax.swing.JLabel; -import javax.swing.JTabbedPane; -import javax.swing.SwingUtilities; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import org.exolab.castor.xml.schema.ComplexType; -import org.exolab.castor.xml.schema.ElementDecl; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; - -import com.c2kernel.gui.tabs.outcome.OutcomeException; -import com.c2kernel.utils.Logger; - -public class DataRecord extends OutcomeStructure implements ChangeListener { - - AttributeList myAttributes; - JTabbedPane DRPanel = null; - boolean deferred; - Document parentDoc; - GridBagConstraints position; - GridBagLayout gridbag; - - public DataRecord(ElementDecl model, boolean readOnly, HelpPane help, boolean deferred) throws OutcomeException { - super(model, readOnly, help); - this.deferred = deferred; - if (!deferred) setupPanel(); - } - - public synchronized void activate() { - deferred = false; - try { - setupPanel(); - if (myElement!=null) populateInstance(); - } catch (OutcomeException ex) { - removeAll(); - setLayout(new FlowLayout()); - add(new JLabel("Error displaying outcome segment: "+ex.getMessage())); - } - validate(); - } - - private void setupPanel() throws OutcomeException { - // set up panel - gridbag = new java.awt.GridBagLayout(); - setLayout(gridbag); - position = new GridBagConstraints(); - position.anchor = GridBagConstraints.NORTHWEST; - position.fill = GridBagConstraints.NONE; - position.weightx = 1.0; position.weighty = 1.0; - position.gridx = 0; position.gridy = 0; - position.ipadx = 5; position.ipady = 5; - position.insets = new Insets(5,5,0,0); - - // attributes at the top - myAttributes = new AttributeList(model, readOnly, helpPane); - position.gridwidth=3; - gridbag.setConstraints(myAttributes, position); - add(myAttributes); - - ComplexType elementType; - try { - elementType = (ComplexType)model.getType(); - } - catch (ClassCastException e) { - throw new StructuralException("DataRecord created with non-ComplexType"); - } - - //loop through all schema sub-elements - try { - enumerateElements(elementType); - } catch (OutcomeException e) { - throw new OutcomeException("Element "+model.getName()+" could not be created: "+e.getMessage()); - } - } - - @Override - public void addStructure(OutcomeStructure newElement) throws OutcomeException { - super.addStructure(newElement); - if (newElement == null) return; - if (newElement instanceof DataRecord) { - DataRecord newRecord = (DataRecord)newElement; - // set up enclosing tabbed pane for child drs - if (DRPanel == null) { - DRPanel = new JTabbedPane(); - position.gridy++; - position.weightx=1.0; - position.fill=GridBagConstraints.HORIZONTAL; - position.gridwidth=3; - gridbag.setConstraints(DRPanel, position); - add(DRPanel); - // defer further tabs in this pane - deferChild = true; - } - DRPanel.addTab(newRecord.getName(), newRecord); - DRPanel.addChangeListener(newRecord); - } - else { - DRPanel = null;// have to make a new tabbed pane now - deferChild = false; - if (newElement instanceof Field) { - Field newField = (Field)newElement; - // make some nice columns - position.gridwidth=1; - position.gridy++; - position.gridx=0; - position.weightx=2; - position.weighty=0; - position.fill=GridBagConstraints.NONE; - gridbag.setConstraints(newField.getLabel(), position); - this.add(newField.getLabel()); - position.gridy++; - position.weighty=1; - position.fill = GridBagConstraints.HORIZONTAL; - gridbag.setConstraints(newField.getCData(), position); - this.add(newField.getCData()); - position.gridx++; - position.gridy--; - position.gridheight=2; - position.weightx=0; - position.fill=GridBagConstraints.NONE; - gridbag.setConstraints(newField.getAttributes(), position); - this.add(newField.getAttributes()); - position.gridx=0; - position.gridheight=1; - position.gridy++; - } - else { - position.fill=GridBagConstraints.HORIZONTAL; - position.gridwidth=3; - position.weightx=1.0; - position.gridy++; - position.weighty=1.0; - gridbag.setConstraints(newElement, position); - add(newElement); - } - } - } - - @Override - public void addInstance(Element myElement, Document parentDoc) throws OutcomeException { - Logger.msg(8, "Accepting DR "+myElement.getTagName()); - - if (this.myElement != null) throw new CardinalException("DataRecord "+this.getName()+" cannot repeat."); - this.myElement = myElement; - this.parentDoc = parentDoc; - - if (!deferred) - populateInstance(); - } - - public void populateInstance() throws OutcomeException { - myAttributes.setInstance(myElement); - - NodeList childElements = myElement.getChildNodes(); - - for (int i=0; i 0) - myAttributes.grabFocus(); - else if (order.size()> 0) - subStructure.get(order.get(0)).grabFocus(); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/Dimension.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/Dimension.java deleted file mode 100644 index 9a3cb8d..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/Dimension.java +++ /dev/null @@ -1,396 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; -import java.awt.FlowLayout; -import java.awt.Font; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.util.ArrayList; -import java.util.Iterator; - -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTabbedPane; -import javax.swing.JTable; -import javax.swing.ListSelectionModel; -import javax.swing.border.EtchedBorder; -import javax.swing.table.JTableHeader; - -import org.exolab.castor.xml.schema.ElementDecl; -import org.exolab.castor.xml.schema.Particle; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import com.c2kernel.gui.DomainKeyConsumer; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.tabs.outcome.OutcomeException; -import com.c2kernel.lookup.DomainPath; -import com.c2kernel.utils.Logger; - -public class Dimension extends OutcomeStructure implements ActionListener { - - DimensionTableModel tableModel; - Element parent; - GridBagConstraints position; - GridBagLayout gridbag; - JTabbedPane tabs; - JLabel msg; - DomKeyPushTable table; - Box tableBox; - ArrayList instances = new ArrayList(); // stores DimensionInstances if tabs - ArrayList elements = new ArrayList(); // stores current children - - JButton addButton; - JButton delButton; - - short mode; - protected static final short TABLE = 1; - protected static final short TABS = 2; - - - public Dimension(ElementDecl model, boolean readOnly, HelpPane help) { - super(model, readOnly, help); - // set up panel - gridbag = new java.awt.GridBagLayout(); - setLayout(gridbag); - position = new GridBagConstraints(); - position.anchor = GridBagConstraints.NORTHWEST; - position.fill = GridBagConstraints.HORIZONTAL; - position.weightx = 1.0; position.weighty = 0.0; - position.gridx = 0; position.gridy = 0; - position.ipadx = 0; position.ipady = 0; - position.insets = new Insets(0,0,0,0); - - // TODO: an element or attribute of the dimension can be flagged as an index, so it can be used as a title for a tab - - // set up the border - setBorder(BorderFactory.createTitledBorder( - BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), model.getName())); - - msg = new JLabel("No elements"); - msg.setFont(new Font("SansSerif", Font.ITALIC, msg.getFont().getSize())); - gridbag.setConstraints(msg, position); - add(msg); - position.gridy++; - - // decide whether a table or tabs - try { - tableModel = new DimensionTableModel(model, readOnly); - Logger.msg(8, "DIM "+model.getName()+" - Will be a table"); - mode = TABLE; - tableBox = Box.createVerticalBox(); - table = new DomKeyPushTable(tableModel, this); - new MultiLinePasteAdapter(table, this); - if (readOnly) table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); - table.setColumnSelectionAllowed(readOnly); - JTableHeader tableHeader = table.getTableHeader(); - tableHeader.setReorderingAllowed(false); - tableBox.add(tableHeader); - tableBox.add(table); - gridbag.setConstraints(tableBox, position); - add(tableBox); - tableBox.setVisible(false); - - } catch (StructuralException e) { - // use tabs - Logger.msg(8, "DIM "+model.getName()+" - Will be tabs: "+e.getMessage()); - mode = TABS; - tabs = new JTabbedPane(); - gridbag.setConstraints(tabs, position); - add(tabs); - tabs.setVisible(false); - } - if (!readOnly) { - JPanel rowAdjust = new JPanel(new FlowLayout()); - addButton = new JButton("+"); - addButton.setActionCommand("add"); - addButton.addActionListener(this); - rowAdjust.add(addButton); - - delButton = new JButton("-"); - delButton.setActionCommand("del"); - delButton.addActionListener(this); - delButton.setEnabled(false); - rowAdjust.add(delButton); - - - position.gridy++; position.weighty=0; position.weightx=0; - gridbag.setConstraints(rowAdjust, position); - this.add(rowAdjust); - } - - } - - public void setParentElement(Element parent) { - this.parent = parent; - } - - @Override - public void addInstance(Element myElement, Document parentDoc) throws OutcomeException { - if (Logger.doLog(6)) - Logger.msg(6, "DIM - adding instance "+ (elements.size()+1) +" for "+myElement.getTagName()); - if (parent == null) setParentElement((Element)myElement.getParentNode()); - // if table, pass to table model - if (mode == TABLE) { - tableModel.addInstance(myElement, -1); - elements.add(myElement); - } - else { - DimensionInstance target; - elements.add(myElement); - if (instances.size() < elements.size()) - target = newInstance(); - else - target = instances.get(elements.size()-1); - target.addInstance(myElement, parentDoc); - } - checkButtons(); - } - - public int getChildCount() { - return elements.size(); - } - - public DimensionInstance newInstance() { - DimensionInstance newInstance = null; - try { - newInstance = new DimensionInstance(model, readOnly, helpPane, deferChild); - instances.add(newInstance); - newInstance.setTabNumber(instances.size()); - newInstance.setParent(this); - deferChild = true; - tabs.addTab(newInstance.getName(), newInstance); - tabs.addChangeListener(newInstance); - } catch (OutcomeException e) { - // shouldn't happen, we've already done it once - Logger.error(e); - } - return newInstance; - } - - @Override - public String validateStructure() { - if (mode == TABLE) - return table.validateStructure(); - else { - StringBuffer errors = new StringBuffer(); - for (Iterator iter = instances.iterator(); iter.hasNext();) { - OutcomeStructure element = iter.next(); - errors.append(element.validateStructure()); - } - return errors.toString(); - } - } - - public void checkButtons() { - // check if data visible - boolean dataVisible = elements.size() > 0; - if (mode == TABS) tabs.setVisible(dataVisible); - else tableBox.setVisible(dataVisible); - msg.setVisible(!dataVisible); - - if (readOnly) return; - - if (elements.size() <= model.getMinOccurs() || elements.size() == 0) { - delButton.setEnabled(false); - delButton.setToolTipText("Minimum row count of "+model.getMinOccurs()+" reached."); - } else { - delButton.setEnabled(true); - delButton.setToolTipText(null); - } - - if (elements.size() < model.getMaxOccurs() || model.getMaxOccurs() == Particle.UNBOUNDED) { - addButton.setEnabled(true); - addButton.setToolTipText(null); - } else { - addButton.setEnabled(false); - addButton.setToolTipText("Maximum row count of "+model.getMaxOccurs()+" reached."); - } - } - - @Override - public Element initNew(Document parent) { - Element newElement; - - if (mode == TABLE) { - newElement = tableModel.initNew(parent, -1); - elements.add(newElement); - checkButtons(); - return newElement; - } - else { - DimensionInstance newTab = null; - if (instances.size() < elements.size()+1) - newTab = newInstance(); - else - newTab = instances.get(elements.size()-1); - newElement = newTab.initNew(parent); - elements.add(newElement); - checkButtons(); - return newElement; - } - } - - @Override - public void actionPerformed(ActionEvent e) { - int index; - if (mode == TABS) index = tabs.getSelectedIndex(); - else { - index = table.getSelectedRow(); - if (index == -1) index = tableModel.getRowCount(); - } - try { - if (table == null || table.getCellEditor() == null || table.getCellEditor().stopCellEditing()) { - if (e.getActionCommand().equals("add")) - addRow(index); - else if (e.getActionCommand().equals("del")) - removeRow(index); - } - } catch (CardinalException ex) { - JOptionPane.showMessageDialog(null, ex.getMessage(), "Table error", JOptionPane.ERROR_MESSAGE); - } - } - - public void addRow(int index) throws CardinalException { - if (elements.size() == model.getMaxOccurs()) - throw new CardinalException("Maximum size of table reached"); - - if (mode == TABLE) { - Element newRow = tableModel.initNew(parent.getOwnerDocument(), index); - elements.add(index, newRow); - try { - Element following = elements.get(index+1); - parent.insertBefore(newRow, following); - } catch (IndexOutOfBoundsException ex) { - parent.appendChild(newRow); - } - table.clearSelection(); - table.setRowSelectionInterval(index, index); - } - else { - Element newTab = initNew(parent.getOwnerDocument()); - parent.appendChild(newTab); - } - checkButtons(); - - } - - public void removeRow(int index) throws CardinalException { - if (elements.size() <= model.getMinOccurs()) - throw new CardinalException("Minimum size of table reached"); - if (mode == TABLE) { - parent.removeChild(tableModel.removeRow(index)); - int selectRow = index; - if (index >= tableModel.getRowCount()) selectRow--; - if (tableModel.getRowCount() > 0) { - table.clearSelection(); - table.setRowSelectionInterval(selectRow, selectRow); - } - } - else { - Element elementToGo = elements.get(index); - parent.removeChild(elementToGo); - instances.remove(index); - tabs.remove(index); - for (int i = index; i -1 && row > -1) { - if (dataModel.getValueAt(row, col).toString().length()==0) - dataModel.setValueAt(name, row, col); - else { - if (row+1 == getRowCount()) { - try { - dim.addRow(row+1); - dataModel.setValueAt(name, row+1, col); - } catch (CardinalException ex) { - JOptionPane.showMessageDialog(null, ex.getMessage(), "Table error", JOptionPane.ERROR_MESSAGE); - } - } - } - if (row+1 < getRowCount()) { - Logger.msg(8, "Shifting selection to row "+(row+1)); - changeSelection(row+1, col, false, false); - } - } - } - - @Override - public void focusGained(FocusEvent e) { - if (!readOnly) - MainFrame.itemFinder.setConsumer(this, "Insert"); - } - - @Override - public void focusLost(FocusEvent e) { - // release the itemFinder - if (!readOnly) - MainFrame.itemFinder.clearConsumer(this); - } - - public String validateStructure() { - if (cellEditor != null) - cellEditor.stopCellEditing(); - return null; - } - - @Override - public void changeSelection( int rowIndex, int columnIndex, boolean toggle, boolean extend) { - super.changeSelection(rowIndex, columnIndex, toggle, extend); - DimensionTableModel dimModel = (DimensionTableModel)dataModel; - helpPane.setHelp(dimModel.getColumnName(columnIndex), dimModel.getHelp(columnIndex)); - } - - } - - @Override - public void grabFocus() { - if (mode == TABLE) { - if (table.getSelectedRow() == -1 && table.getRowCount() > 0) { - table.changeSelection(0, 0, false, false); - table.editCellAt(0,0); - } - table.requestFocus(); - } - else if (instances.size()> 0) - instances.get(0).grabFocus(); - } - -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/DimensionInstance.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/DimensionInstance.java deleted file mode 100644 index 649886b..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/DimensionInstance.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; -import org.exolab.castor.xml.schema.ElementDecl; - -import com.c2kernel.gui.tabs.outcome.OutcomeException; - -public class DimensionInstance extends DataRecord { - - //probably will be needed to synch edits later - Dimension parentDimension; - int tabNumber; - String tabName = null; - - public DimensionInstance(ElementDecl model, boolean readOnly , HelpPane help, boolean deferred) throws OutcomeException { - super(model, readOnly, help, deferred); - } - - public void setTabNumber(int tabNumber) { - this.tabNumber=tabNumber; - } - - public void setParent(Dimension parent) { - this.parentDimension = parent; - } - - @Override - public String getName() { - //TODO appinfo for picking out attributes or child elements for tab name - if (tabName == null) - return Integer.toString(tabNumber); - else - return tabName; - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/DimensionTableModel.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/DimensionTableModel.java deleted file mode 100644 index ac6a9f2..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/DimensionTableModel.java +++ /dev/null @@ -1,332 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; -import java.util.ArrayList; -import java.util.Enumeration; - -import javax.swing.table.AbstractTableModel; - -import org.exolab.castor.xml.schema.Annotated; -import org.exolab.castor.xml.schema.AttributeDecl; -import org.exolab.castor.xml.schema.ComplexType; -import org.exolab.castor.xml.schema.ContentModelGroup; -import org.exolab.castor.xml.schema.ElementDecl; -import org.exolab.castor.xml.schema.Group; -import org.exolab.castor.xml.schema.Order; -import org.exolab.castor.xml.schema.Particle; -import org.exolab.castor.xml.schema.SimpleType; -import org.exolab.castor.xml.schema.SimpleTypesFactory; -import org.exolab.castor.xml.schema.XMLType; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.Text; - -import com.c2kernel.gui.tabs.outcome.OutcomeException; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -public class DimensionTableModel extends AbstractTableModel { - - ElementDecl model; - ArrayList columnHeadings = new ArrayList(); - ArrayList> columnClasses = new ArrayList>(); - ArrayList columnDecls = new ArrayList(); - ArrayList colReadOnly = new ArrayList(); - ArrayList colHelp = new ArrayList(); - ArrayList rows = new ArrayList(); - ArrayList elements = new ArrayList(); - boolean readOnly; - - public DimensionTableModel(ElementDecl model, boolean readOnly) throws StructuralException { - XMLType modelContent = model.getType(); - this.model = model; - this.readOnly = readOnly; - // use text node for simple types - if (modelContent.isSimpleType()) { - SimpleType elementType = (SimpleType)modelContent; - SimpleType baseType = elementType.getBuiltInBaseType(); - addColumn(model.getName(), baseType, baseType.getTypeCode(), new Boolean(model.getFixedValue() != null)); - } - else if (modelContent.isComplexType()) { // if complex type, process child elements - ComplexType elementType = (ComplexType)modelContent; - - // find out if a CDATA type is used for this complex type - XMLType baseType = elementType.getBaseType(); - while (!(baseType instanceof SimpleType) && baseType != null) { - baseType = baseType.getBaseType(); - } - if (baseType != null) { - int typeCode = ((SimpleType)baseType).getTypeCode(); - addColumn(model.getName(), baseType, typeCode, new Boolean(model.getFixedValue() != null)); - } - // process attributes - for (Enumeration e = elementType.getAttributeDecls(); e.hasMoreElements();) { - AttributeDecl thisAttr = (AttributeDecl)e.nextElement(); - // HACK: if we don't resolve the reference, the type will be null - if (thisAttr.isReference()) thisAttr = thisAttr.getReference(); - if (thisAttr.getSimpleType() == null) - throw new StructuralException("Attribute "+thisAttr.getName()+" in "+model.getName()+" has no type"); - addColumn(thisAttr.getName(), thisAttr, thisAttr.getSimpleType().getTypeCode(), new Boolean(thisAttr.isFixed())); - } - - // enumerate child elements - enumerateElements(elementType); - } - } - - public synchronized void addColumn(String heading, Annotated decl, int typeCode, Boolean readOnly) { - Logger.msg(8, "Column "+heading+" contains "+decl.getClass().getName()+" readOnly="+readOnly.toString()); - columnHeadings.add(heading); - columnDecls.add(decl); - columnClasses.add(OutcomeStructure.getJavaClass(typeCode)); - colReadOnly.add(readOnly); - - // read help - String helpText; - if (decl instanceof SimpleType) - helpText = OutcomeStructure.extractHelp(model); - else - helpText = OutcomeStructure.extractHelp(decl); - - if (helpText.length() == 0) - helpText = ""+Language.translate("No help is available for this cell")+""; - - colHelp.add(helpText); - - } - - - public void enumerateElements(ContentModelGroup group) throws StructuralException { - for (Enumeration childElements = group.enumerate(); childElements.hasMoreElements(); ) { - Particle thisParticle = (Particle)childElements.nextElement(); - String extraHeader = ""; - if (thisParticle instanceof Group) { - Group thisGroup = (Group)thisParticle; - Order order = thisGroup.getOrder(); - if (order == Order.sequence || order == Order.all) - enumerateElements(thisGroup); - else // we only support sequences in data structures such as these - throw new StructuralException("Element "+thisGroup.getName()+". Expecting sequence or all. Got "+thisGroup.getOrder()); - } - else if (thisParticle instanceof ElementDecl) { - ElementDecl thisElement = (ElementDecl)thisParticle; - int typeCode = SimpleTypesFactory.INVALID_TYPE; - //make sure not too complex - if (thisElement.getType() != null) { - if (thisElement.getType().isComplexType()) { - ComplexType elementType = (ComplexType)thisElement.getType(); - if (elementType.getParticleCount() > 0 || - thisElement.getMaxOccurs() > 1) - throw new StructuralException("Too deep for a table"); - for (Enumeration attrs = elementType.getAttributeDecls(); attrs.hasMoreElements();) { - AttributeDecl thisAttr = (AttributeDecl)attrs.nextElement(); - if (!thisAttr.isFixed()) - throw new StructuralException("Non-fixed attributes of child elements not supported in tables."); - else - extraHeader=extraHeader+" ("+thisAttr.getName()+":"+(thisAttr.getFixedValue()!=null?thisAttr.getFixedValue():thisAttr.getDefaultValue())+")"; - } - // find type - XMLType parentType = thisElement.getType(); - while (!(parentType instanceof SimpleType) && parentType != null) { - parentType = parentType.getBaseType(); - if (parentType != null) typeCode = ((SimpleType)parentType).getTypeCode(); - } - } - else - typeCode = ((SimpleType)thisElement.getType()).getTypeCode(); - } - - //add to list - addColumn(thisElement.getName()+extraHeader, thisElement, typeCode, new Boolean(thisElement.getFixedValue() != null)); - } - else throw new StructuralException("Particle "+thisParticle.getClass()+" not implemented"); - } - } - - public void addInstance(Element myElement, int index) throws OutcomeException { - if (index == -1) index = elements.size(); - Object[] newRow = new Object[columnHeadings.size()]; - for (int i=0; i getColumnClass(int columnIndex) { - return columnClasses.get(columnIndex); - } - - @Override - public String getColumnName(int columnIndex) { - return columnHeadings.get(columnIndex); - } - - @Override - public int getRowCount() { - return rows.size(); - } - - @Override - public int getColumnCount() { - return columnHeadings.size(); - } - - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - boolean isReadOnly = readOnly || colReadOnly.get(columnIndex).booleanValue(); - return !isReadOnly; - } - - @Override - public void setValueAt(Object aValue, int rowIndex, int columnIndex) { - Object[] thisRow = rows.get(rowIndex); - thisRow[columnIndex]=aValue; - Element myElement = elements.get(rowIndex); - // update node - if (columnDecls.get(columnIndex) instanceof ElementDecl) { // sub element - ElementDecl thisDecl = (ElementDecl)columnDecls.get(columnIndex); - NodeList childElements = myElement.getElementsByTagName(thisDecl.getName()); - // depend on one element with a Text child - this should have been enforced on init. - Text childNode = (Text)(childElements.item(0).getFirstChild()); - childNode.setData(aValue.toString()); - } - else if (columnDecls.get(columnIndex) instanceof AttributeDecl) { //attribute - AttributeDecl thisDecl = (AttributeDecl) columnDecls.get(columnIndex); - myElement.setAttribute(thisDecl.getName(), aValue.toString()); - } - else { // first child node - Text textNode = (Text)myElement.getFirstChild(); - textNode.setData(aValue.toString()); - } - fireTableCellUpdated(rowIndex, columnIndex); - } - - public Element removeRow(int rowIndex) { - Element elementToGo = elements.get(rowIndex); - elements.remove(rowIndex); - rows.remove(rowIndex); - fireTableRowsDeleted(rowIndex,rowIndex); - return elementToGo; - } - - public Object setupDefaultElement(ElementDecl thisDecl, Element parent, Class type) { - Object newValue; - String defaultValue = thisDecl.getFixedValue(); - if (defaultValue == null) - defaultValue = thisDecl.getDefaultValue(); - if (readOnly) - newValue = ""; - else - newValue = OutcomeStructure.getTypedValue(defaultValue, type); - - Text newNode = parent.getOwnerDocument().createTextNode(newValue.toString()); - parent.appendChild(newNode); - // fixed attributes - try { - ComplexType content = (ComplexType)thisDecl.getType(); - for (Enumeration attrs = content.getAttributeDecls(); attrs.hasMoreElements();) { - AttributeDecl thisAttr = (AttributeDecl)attrs.nextElement(); - parent.setAttribute(thisAttr.getName(), thisAttr.getFixedValue()!=null?thisAttr.getFixedValue():thisAttr.getDefaultValue()); - } - } catch (ClassCastException ex) { } // only complex types have attributes - return newValue; - } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - Object[] thisRow = rows.get(rowIndex); - if (!(getColumnClass(columnIndex).equals(thisRow[columnIndex].getClass()))) - Logger.warning(thisRow[columnIndex]+" should be "+getColumnClass(columnIndex)+" is a "+thisRow[columnIndex].getClass().getName()); - return thisRow[columnIndex]; - } - - public String validateStructure() { // remove empty rows - for (int j=0; j < rows.size(); j++) { - Object[] elems = rows.get(j); - boolean empty = true; - for (int i = 0; i < elems.length && empty; i++) - empty &= OutcomeStructure.isEmpty(elems[i]); - if (empty) - if (model.getMinOccurs() < rows.size()) - removeRow(j); - else - return "Too many empty rows in table "+model.getName(); - } - return null; - } - - public Element initNew(Document parent, int index) { - if (index == -1) index = elements.size(); - Object[] newRow = new Object[columnHeadings.size()]; - Element myElement = parent.createElement(model.getName()); - for (int i=0; i"+Language.translate("Help")+""; - - public HelpPane() { - super(); - setEditable(false); - setEditorKit(new HTMLEditorKit()); - setContentType("text/html"); - setPreferredSize(new java.awt.Dimension(200,400)); - } - - public void setHelp(String title, String helpText) { - setText(header+"

"+title+"


"+toHTML(helpText)); - } - - - /** - * Unfortunately JEditorPane will only display HTML3.2, whereas to embed HTML in an xsd we must - * use XHTML so it will be valid XML. This method does a quick and dirty removal of stuff that - * the JEditorPane cannot display - * - * @param xhtml - * @return - */ - public static String toHTML(String xhtml) { - int startPos, endPos; - //remove xml header - while((startPos = xhtml.indexOf("")) != -1) { - xhtml = xhtml.substring(0,startPos)+xhtml.substring(endPos+2); - } - // remove slash in - while ((startPos = xhtml.indexOf("/>")) != -1) { - xhtml = xhtml.substring(0, startPos)+xhtml.substring(startPos+1); - } - return xhtml; - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/MultiLinePasteAdapter.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/MultiLinePasteAdapter.java deleted file mode 100644 index 13112ac..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/MultiLinePasteAdapter.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.StringSelection; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import com.c2kernel.gui.MainFrame; -import java.util.StringTokenizer; - -import javax.swing.JComponent; -import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.KeyStroke; - -import com.c2kernel.utils.Logger; -/** -* ExcelAdapter enables Copy-Paste Clipboard functionality on JTables. -* The clipboard data format used by the adapter is compatible with -* the clipboard format used by Excel. This provides for clipboard -* interoperability between enabled JTables and Excel. -*/ -public class MultiLinePasteAdapter implements ActionListener { - private String rowstring, value; - private Clipboard system; - private StringSelection stsel; - private JTable jTable1; - private Dimension parent; - /** - * The Excel Adapter is constructed with a - * JTable on which it enables Copy-Paste and acts - * as a Clipboard listener. - */ - public MultiLinePasteAdapter(JTable myJTable, Dimension parent) { - jTable1 = myJTable; - this.parent = parent; - KeyStroke copy = - KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK, false); - // Identifying the copy KeyStroke user can modify this - // to copy on some other Key combination. - KeyStroke paste = - KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK, false); - // Identifying the Paste KeyStroke user can modify this - //to copy on some other Key combination. - jTable1.registerKeyboardAction( - this, - "Copy", - copy, - JComponent.WHEN_FOCUSED); - jTable1.registerKeyboardAction( - this, - "Paste", - paste, - JComponent.WHEN_FOCUSED); - system = Toolkit.getDefaultToolkit().getSystemClipboard(); - } - /** - * Public Accessor methods for the Table on which this adapter acts. - */ - public JTable getJTable() { - return jTable1; - } - public void setJTable(JTable jTable1) { - this.jTable1 = jTable1; - } - /** - * This method is activated on the Keystrokes we are listening to - * in this implementation. Here it listens for Copy and Paste ActionCommands. - * Selections comprising non-adjacent cells result in invalid selection and - * then copy action cannot be performed. - * Paste is done by aligning the upper left corner of the selection with the - * 1st element in the current selection of the JTable. - */ - @Override - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().compareTo("Copy") == 0) { - StringBuffer sbf = new StringBuffer(); - // Check to ensure we have selected only a contiguous block of - // cells - int numcols = jTable1.getSelectedColumnCount(); - int numrows = jTable1.getSelectedRowCount(); - int[] rowsselected = jTable1.getSelectedRows(); - int[] colsselected = jTable1.getSelectedColumns(); - if (!((numrows - 1 - == rowsselected[rowsselected.length - 1] - rowsselected[0] - && numrows == rowsselected.length) - && (numcols - 1 - == colsselected[colsselected.length - 1] - colsselected[0] - && numcols == colsselected.length))) { - JOptionPane.showMessageDialog( - null, - "Invalid Copy Selection", - "Invalid Copy Selection", - JOptionPane.ERROR_MESSAGE); - return; - } - for (int i = 0; i < numrows; i++) { - for (int j = 0; j < numcols; j++) { - sbf.append( - jTable1.getValueAt(rowsselected[i], colsselected[j])); - if (j < numcols - 1) - sbf.append("\t"); - } - sbf.append("\n"); - } - stsel = new StringSelection(sbf.toString()); - system = Toolkit.getDefaultToolkit().getSystemClipboard(); - system.setContents(stsel, stsel); - } - if (e.getActionCommand().compareTo("Paste") == 0) { - Logger.msg(5, "Trying to Paste"); - int startRow = (jTable1.getSelectedRows())[0]; - int startCol = (jTable1.getSelectedColumns())[0]; - try { - String trstring = - (String) (system.getContents(this).getTransferData(DataFlavor.stringFlavor)); - Logger.msg(8, "String is:" + trstring); - StringTokenizer st1 = new StringTokenizer(trstring, "\n\r"); - for (int i = 0; st1.hasMoreTokens(); i++) { - rowstring = st1.nextToken(); - StringTokenizer st2 = new StringTokenizer(rowstring, "\t"); - for (int j = 0; st2.hasMoreTokens(); j++) { - value = st2.nextToken(); - if (startRow + i == jTable1.getRowCount()) - parent.addRow(startRow+i); - if (startRow + i < jTable1.getRowCount() - && startCol + j < jTable1.getColumnCount()) - jTable1.setValueAt( - value, - startRow + i, - startCol + j); - Logger.msg(5, "Putting "+value+" at row="+(startRow+i)+" column="+(startCol+j)); - } - } - } catch (Exception ex) { - MainFrame.exceptionDialog(ex); - } - - } - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomeEditor.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomeEditor.java deleted file mode 100644 index 55b7f81..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomeEditor.java +++ /dev/null @@ -1,215 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.URL; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; - -import com.c2kernel.persistency.outcome.OutcomeValidator; -import com.c2kernel.persistency.outcome.Schema; -import com.c2kernel.utils.FileStringUtility; -import com.c2kernel.utils.Logger; - - -class OutcomeEditor extends JFrame implements ActionListener { - - boolean readOnly = false; - File schemaFile = null; - File instanceFile = null; - JFileChooser chooser; - OutcomePanel outcome; - OutcomeValidator thisValid; - - public OutcomeEditor(File schema, File instance, boolean readOnly) { - URL schemaURL = null; - URL instanceURL = null; - schemaFile = schema; - instanceFile = instance; - this.readOnly = readOnly; - - try { - chooser = new JFileChooser(); - chooser.setCurrentDirectory(new File(new File(".").getCanonicalPath())); - } catch (IOException e) { - System.out.println("Could not initialise file dialog"); - System.exit(0); - } - - - this.setTitle("Outcome Editor"); - GridBagLayout gridbag = new GridBagLayout(); - getContentPane().setLayout(gridbag); - - addWindowListener( - new java.awt.event.WindowAdapter() { - @Override - public void windowClosing(java.awt.event.WindowEvent evt) { - System.exit(0); - } - } - ); - // select files if url is empty - - if (schemaFile == null) { // prompt for schema - schemaFile = getFile("Choose Schema File", "xsd"); - if (schemaFile == null) { - System.out.println("Cannot function without a schema"); - System.exit(1); - } - } - - try { - schemaURL = schemaFile.toURI().toURL(); - } catch (Exception e) { - System.out.println("Invalid schema URL"); - System.exit(1); - } - - if (instanceFile == null) { // prompt for schema - instanceFile = getFile("Choose Instance File", "xml"); - } - - try { - instanceURL = instanceFile.toURI().toURL(); - } catch (Exception e) { } - - try { - if (instanceFile != null && instanceFile.exists()) - outcome = new OutcomePanel(schemaURL, instanceURL, readOnly); - else - outcome = new OutcomePanel(schemaURL, readOnly); - - Schema thisSchema = new Schema(schemaURL.getFile(), -1, FileStringUtility.url2String(schemaURL)); - thisValid = OutcomeValidator.getValidator(thisSchema); - - } catch (Exception e) { e.printStackTrace(); System.exit(0);} - - - GridBagConstraints c = new GridBagConstraints(); - c.gridx = 0; c.gridy = 0; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1.0; c.weighty = 1.0; - c.gridwidth = 2; c.ipadx = 5; c.ipady = 5; - gridbag.setConstraints(outcome, c); - this.getContentPane().add(outcome); - - JButton saveButton = new JButton("Save"); - saveButton.setActionCommand("save"); - saveButton.addActionListener(this); - c.gridy++; c.weighty = 0; c.gridwidth = 1; - gridbag.setConstraints(saveButton, c); - this.getContentPane().add(saveButton); - if (readOnly) saveButton.setEnabled(false); - - JButton saveAsButton = new JButton("Save As"); - saveAsButton.setActionCommand("saveas"); - saveAsButton.addActionListener(this); - c.gridx++; c.weighty = 0; - gridbag.setConstraints(saveAsButton, c); - this.getContentPane().add(saveAsButton); - if (readOnly) saveAsButton.setEnabled(false); - System.out.println("Building Outcome Panel. Please wait . . ."); - outcome.run(); - pack(); - setVisible(true); - super.toFront(); - - } - - public File getFile(String title, String fileType) { - File targetFile = null; - chooser.setFileFilter(new SimpleFilter(fileType)); - chooser.setDialogTitle(title); - int returnVal = chooser.showDialog(this, "Select"); - if (returnVal == JFileChooser.APPROVE_OPTION) { - targetFile = chooser.getSelectedFile(); - } - try { - System.out.println(fileType+"="+targetFile.toURI().toURL()); - } catch (Exception ex) { } - return targetFile; - } - - public static void usage() { - System.out.println("-schema file:///schema.xsd"); - System.out.println("-inst file:///instance.xml"); - System.out.println("Leave one out to get a file open box."); - System.exit(0); - } - public static void main( String[] argv ) { - Logger.addLogStream(System.out, 6); - File instance = null; - File schema = null; - boolean readOnly = false; - for (int i = 0; i < argv.length; i++) { - if (argv[i].equals("-schema")) - schema = new File(argv[++i]); - if (argv[i].equals("-inst")) - instance = new File(argv[++i]); - if (argv[i].equals("-readOnly")) - readOnly = true; - if (argv[i].equals("-help") || argv[i].equals("-h")) - usage(); - } - new OutcomeEditor(schema, instance, readOnly); - } - - @Override - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().indexOf("save") == 0) { - String output; - output = outcome.getOutcome(); - - String errors = thisValid.validate(output); - if (errors != null && errors.length() > 0) { - int choice = JOptionPane.showConfirmDialog(null, errors+"\n\nSave anyway?", "Errors validating document", JOptionPane.YES_NO_OPTION); - if (choice != JOptionPane.YES_OPTION) - return; - } - - if (instanceFile == null || e.getActionCommand().equals("saveas")) { - instanceFile = getFile("Choose Instance File", "xml"); - if (instanceFile == null) { - System.out.println(output); - return; - } - } - try { - FileOutputStream targetStream = new FileOutputStream(instanceFile); - targetStream.write(output.getBytes()); - targetStream.close(); - } catch (Exception ex) {ex.printStackTrace();} - } - } - - private class SimpleFilter extends javax.swing.filechooser.FileFilter { - String extension; - - public SimpleFilter(String extension) { - super(); - this.extension = extension; - } - - @Override - public String getDescription() { - return extension.toUpperCase()+" Files"; - } - - @Override - public boolean accept(File f) { - if ((f.isFile() && f.getName().endsWith(extension.toLowerCase())) || f.isDirectory()) { - return true; - } - return false; - } - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomePanel.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomePanel.java deleted file mode 100644 index 506e17c..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomePanel.java +++ /dev/null @@ -1,348 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.io.File; -import java.io.IOException; -import java.io.StringReader; -import java.net.URL; - -import javax.swing.Box; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextArea; -import javax.swing.SwingConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.exolab.castor.xml.schema.ElementDecl; -import org.exolab.castor.xml.schema.Schema; -import org.exolab.castor.xml.schema.reader.SchemaReader; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.tabs.outcome.InvalidOutcomeException; -import com.c2kernel.gui.tabs.outcome.InvalidSchemaException; -import com.c2kernel.gui.tabs.outcome.OutcomeException; -import com.c2kernel.gui.tabs.outcome.OutcomeHandler; -import com.c2kernel.gui.tabs.outcome.OutcomeNotInitialisedException; -import com.c2kernel.persistency.outcome.Outcome; -import com.c2kernel.utils.FileStringUtility; -import com.c2kernel.utils.Logger; - -// will load the outcome as instructed by other bits of the gui -// provides the 'save' button and creates the trees of objects to feed to the outcome form - -public class OutcomePanel extends JPanel implements OutcomeHandler -{ - - Schema schemaSOM; - //ASModel schemaASModel; - Document outcomeDOM; - OutcomeStructure documentRoot; - DocumentBuilder parser; - boolean readOnly; - boolean useForm = true; - boolean panelBuilt = false; - boolean unsaved = false; - JScrollPane scrollpane = new JScrollPane(); - HelpPane help = new HelpPane(); - - JTextArea basicView; - - public OutcomePanel() - { - GridBagLayout gridbag = new java.awt.GridBagLayout(); - setLayout(gridbag); - - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - dbf.setValidating(false); - dbf.setNamespaceAware(false); - try - { - parser = dbf.newDocumentBuilder(); - } - catch (ParserConfigurationException e) - { - e.printStackTrace(); - } - - // Set up panel - - JComponent pane; - if (!MainFrame.getPref("ShowHelp", "true").equals("true")) - pane = scrollpane; - else { - JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, scrollpane, help); - splitPane.setOneTouchExpandable(true); - splitPane.setDividerSize(9); - pane = splitPane; - } - - GridBagConstraints c = new GridBagConstraints(); - - c.gridx = 0; - c.gridy = 0; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1.0; - c.weighty = 1.0; - c.ipadx = 5; - c.ipady = 5; - - gridbag.setConstraints(pane, c); - this.add(pane); - } - - public OutcomePanel(boolean readOnly) - { - this(); - setReadOnly(readOnly); - } - - public OutcomePanel(String schema, boolean readOnly) throws OutcomeException - { - this(readOnly); - this.setDescription(schema); - } - - public OutcomePanel(String schema, String outcome, boolean readOnly) throws OutcomeException - { - this(readOnly); - this.setDescription(schema); - this.setOutcome(outcome); - } - - // Parse from URLS - public void setOutcome(URL outcomeURL) throws InvalidOutcomeException - { - - try - { - setOutcome(new InputSource(outcomeURL.openStream())); - } - catch (IOException ex) - { - throw new InvalidOutcomeException("Error creating instance DOM tree: " + ex); - } - } - - public void setDescription(URL schemaURL) throws InvalidSchemaException - { - Logger.msg(7, "OutcomePanel.setDescription() - schemaURL:" + schemaURL.toString()); - try - { - setDescription(new InputSource(schemaURL.openStream())); - } - catch (IOException ex) - { - throw new InvalidSchemaException("Error creating exolab schema object: " + ex); - } - - } - - public OutcomePanel(URL schemaURL, boolean readOnly) throws OutcomeException - { - this(readOnly); - this.setDescription(schemaURL); - } - - public OutcomePanel(URL schemaURL, URL outcomeURL, boolean readOnly) throws OutcomeException - { - this(readOnly); - this.setDescription(schemaURL); - this.setOutcome(outcomeURL); - } - - // Parse from Strings - @Override - public void setOutcome(String outcome) throws InvalidOutcomeException - { - - try - { - setOutcome(new InputSource(new StringReader(outcome))); - } - catch (IOException ex) - { - throw new InvalidOutcomeException("Error creating instance DOM tree: " + ex); - } - } - - @Override - public void setDescription(String schema) throws InvalidSchemaException - { - if (schema == null) - throw new InvalidSchemaException("Null schema supplied"); - try - { - setDescription(new InputSource(new StringReader(schema))); - } - catch (Exception ex) - { - Logger.error(ex); - } - - } - - @Override - public void setReadOnly(boolean readOnly) - { - this.readOnly = readOnly; - } - - public void setDescription(InputSource schemaSource) throws InvalidSchemaException, IOException - { - - SchemaReader mySchemaReader = new SchemaReader(schemaSource); - this.schemaSOM = mySchemaReader.read(); - } - - public void setOutcome(InputSource outcomeSource) throws InvalidOutcomeException, IOException - { - try - { - outcomeDOM = parser.parse(outcomeSource); - } - catch (SAXException ex) - { - throw new InvalidOutcomeException("Sax error parsing Outcome " + ex); - } - } - - @Override - public void run() - { - Thread.currentThread().setName("Outcome Panel Builder"); - try - { - makeDisplay(); - } - catch (Exception oe) - { - scrollpane.setViewportView(new JLabel("Outcome View Generation Failed: " + oe.getMessage())); - Logger.error(oe); - } - } - - public void makeDisplay() - { - try - { - initPanel(); - } - catch (OutcomeException ex) - { - // something went wrong - useForm = false; - Box textPanel = Box.createVerticalBox(); - JLabel errorMsg = new JLabel("Could not create outcome view: " + ex.getMessage()); - errorMsg.setHorizontalAlignment(SwingConstants.LEFT); - textPanel.add(errorMsg); - textPanel.add(Box.createVerticalGlue()); - if (outcomeDOM!=null) { - basicView = new JTextArea(Outcome.serialize(outcomeDOM, true)); - basicView.setEnabled(!readOnly); - textPanel.add(basicView); - } - scrollpane.setViewportView(textPanel); - } - } - - public void initPanel() throws OutcomeException - { - Element docElement; - /*if (panelBuilt) - return;*/ - Logger.msg(5, "Initialising Panel.."); - scrollpane.setViewportView(new JLabel("Building outcome. Please hang on two ticks . . .")); - if (schemaSOM == null) - throw new InvalidSchemaException("A valid schema has not been supplied."); - // create root panel with element declaration and maybe root document element node - - //find the root element declaration in the schema - may need to look for annotation?? - ElementDecl rootElementDecl = null; - docElement = (outcomeDOM == null) ? null : outcomeDOM.getDocumentElement(); - - for (ElementDecl elementDecl: schemaSOM.getElementDecls()) - { - rootElementDecl = elementDecl; - // REVISIT: We don't detect which is the most likely root element if there is more than one root decl - // xmlspy looks for an element not referenced elsewhere. simple but hard - // if we already have a document then use its root element to find the right decl - if (docElement != null && docElement.getTagName().equals(rootElementDecl.getName())) - break; - } - - if (rootElementDecl == null) - throw new InvalidSchemaException("No root elements defined"); - documentRoot = new DataRecord(rootElementDecl, readOnly, help, false); - - Logger.msg(5, "Finished structure. Populating..."); - if (docElement == null) - { - outcomeDOM = parser.newDocument(); - docElement = documentRoot.initNew(outcomeDOM); - outcomeDOM.appendChild(docElement); - } - else - documentRoot.addInstance(docElement, outcomeDOM); - - // got a fully rendered Outcome! put it in the scrollpane - // initialise container panel - - JTabbedPane outcomeTab = new JTabbedPane(); - outcomeTab.addTab(rootElementDecl.getName(), documentRoot); - outcomeTab.setSelectedIndex(0); - - scrollpane.setViewportView(outcomeTab); - panelBuilt = true; - - revalidate(); - doLayout(); - if (!readOnly) - documentRoot.grabFocus(); - } - - @Override - public JPanel getPanel() throws OutcomeNotInitialisedException - { - return this; - } - - @Override - public String getOutcome() - { - if (useForm) - { - documentRoot.validateStructure(); - return Outcome.serialize(outcomeDOM, false); - } - else - { - return basicView.getText(); - } - } - - @Override - public boolean isUnsaved() { - return unsaved; - } - - @Override - public void saved() { - unsaved = false; - } - - @Override - public void export(File targetFile) throws Exception { - FileStringUtility.string2File(targetFile, getOutcome()); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomeStructure.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomeStructure.java deleted file mode 100644 index aee09df..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/OutcomeStructure.java +++ /dev/null @@ -1,283 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; - -import javax.swing.ImageIcon; -import javax.swing.JPanel; - -import org.exolab.castor.types.AnyNode; -import org.exolab.castor.xml.schema.Annotated; -import org.exolab.castor.xml.schema.Annotation; -import org.exolab.castor.xml.schema.ComplexType; -import org.exolab.castor.xml.schema.ContentModelGroup; -import org.exolab.castor.xml.schema.Documentation; -import org.exolab.castor.xml.schema.ElementDecl; -import org.exolab.castor.xml.schema.Group; -import org.exolab.castor.xml.schema.ModelGroup; -import org.exolab.castor.xml.schema.Order; -import org.exolab.castor.xml.schema.Particle; -import org.exolab.castor.xml.schema.SimpleType; -import org.exolab.castor.xml.schema.SimpleTypesFactory; -import org.exolab.castor.xml.schema.XMLType; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import com.c2kernel.gui.tabs.outcome.OutcomeException; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -// contains child outcome elements - creates new ones -public abstract class OutcomeStructure extends JPanel { - - ElementDecl model; - Element myElement = null; - boolean readOnly; - HashMap subStructure = new HashMap(); - ArrayList order = new ArrayList(); - String help = ""+Language.translate("No help is available for this element")+""; - HelpPane helpPane; - boolean deferChild = false; - - public OutcomeStructure(ElementDecl model, boolean readOnly , HelpPane helpPane) { - this.model = model; - this.readOnly = readOnly; - this.helpPane = helpPane; - subStructure = new HashMap(); - Logger.msg(8, "Creating " + model.getName() + " structure as " + - this.getClass().getName().substring(this.getClass().getName().lastIndexOf('.') + 1)); - - String doc = extractHelp(model); - if (doc.length() > 0) help = doc; - } - - public boolean getReadOnly() { - return readOnly; - } - /** Contains the rules for deciding which OutcomeStructure will represent a chosen Element Declaration. - * In this order - *
    - *
  1. if maxOccurs>1 then Dimension - *
  2. SimpleTypes are Fields - *
  3. No element children is a Field - *
  4. Everything else is a DataRecord - *
- */ - public OutcomeStructure createStructure(ElementDecl model, boolean readOnly, HelpPane help) throws OutcomeException { - XMLType elementType = model.getType(); - ComplexType elementComplexType; - - if (model.getMaxOccurs() == 0) return null; - - // if more than one can occur - dimension - if (model.getMaxOccurs() > 1 - || model.getMaxOccurs() == Particle.UNBOUNDED - || model.getMinOccurs() == 0) - return new Dimension(model, readOnly, help); - - // must have a type from now on - if (elementType == null) - throw new StructuralException("Element "+model.getName()+" is elementary yet has no type."); - // simple types will be fields - if (elementType instanceof SimpleType) return new Field(model, readOnly, help); - - // otherwise is a complex type - try { - elementComplexType = (ComplexType)elementType; - } - catch (ClassCastException e) { - throw new StructuralException("Unknown XMLType for element " + model.getName()); - } - - //when no element children - field - if (elementComplexType.getParticleCount() == 0) return new Field(model, readOnly, help); - - //everything else is a data record - return new DataRecord(model, readOnly, help, deferChild); - } - - /** Extracts child Element declarations from a content group and recursively from any group - * (not Element) of that group. calls createStructure() to find the corresponding OutcomeStructure - * then adds it to this structure. - */ - public void enumerateElements(ContentModelGroup group) throws OutcomeException { - - // process base types first if complex type - //HACK: castor does not include elements from basetype, so we do it manually. if they fix it, this will duplicate child elements. - if (group instanceof ComplexType) { - XMLType base = ((ComplexType)group).getBaseType(); - if (base instanceof ComplexType) - enumerateElements((ComplexType)base); - } - - for (Enumeration elements = group.enumerate(); elements.hasMoreElements(); ) { - Particle thisParticle = (Particle)elements.nextElement(); - if (thisParticle instanceof Group) { - Group thisGroup = (Group)thisParticle; - if (thisGroup instanceof ModelGroup) { - // HACK: Castor strangeness - model groups don't seem to resolve their own references. If fixed, this will still work - ModelGroup thisModel = (ModelGroup)thisGroup; - if (thisModel.hasReference()) thisGroup = thisModel.getReference(); - } - Order thisOrder = thisGroup.getOrder(); - if (thisOrder == Order.sequence || thisOrder == Order.all) enumerateElements(thisGroup); - else // we only support sequences in data structures such as these - throw new StructuralException("The '"+thisGroup.getOrder()+"' group is not supported"); - } - else if (thisParticle instanceof ElementDecl) { - ElementDecl thisElement = (ElementDecl)thisParticle; - addStructure(createStructure(thisElement, readOnly, helpPane)); - } - else throw new StructuralException("Particle " + thisParticle.getClass() + " not implemented"); - } - } - - /** Adds a generated OutcomeStructure as a child of this one. A separate structure as is often overridden. - */ - public void addStructure(OutcomeStructure newElement) throws OutcomeException { - if (newElement == null) return; - subStructure.put(newElement.getName(), newElement); - order.add(newElement.getName()); - } - - /** After schema processing, addInstance() propogates the XML instance document down the layout. - * Most OutcomeStructures will throw an exception if called more than once, except Dimension, which is the only - * Outcome Structure to support maxOccurs>1 - */ - public abstract void addInstance(Element myElement, Document parentDoc) throws OutcomeException; - - public Element getElement() { - return myElement; - } - - @Override - public String getName() { - if (model == null) return null; - return model.getName(); - } - - public ElementDecl getModel() { - return model; - } - - public String getHelp() { - return help; - } - - public String validateStructure() { - StringBuffer errors = new StringBuffer(); - for (OutcomeStructure element : subStructure.values()) { - errors.append(element.validateStructure()); - } - return errors.toString(); - } - - public abstract Element initNew(Document parent); - - public static String extractHelp(Annotated model) { - Enumeration e = model.getAnnotations(); - StringBuffer doc = new StringBuffer(); - if (e.hasMoreElements()) { // look for HTML - Annotation note = (Annotation)e.nextElement(); - for (Enumeration g = note.getDocumentation(); g.hasMoreElements();) { - Documentation thisDoc = (Documentation)g.nextElement(); - for (Enumeration h = thisDoc.getObjects(); h.hasMoreElements();) { - AnyNode node = (AnyNode)h.nextElement(); - String line = node.toString(); - if (line.length() == 0) - line = node.getStringValue(); - if (line.length() > 0) { - doc.append(line).append("\n"); - } - } - } - } - - return doc.toString(); - } - - @Override - public abstract void grabFocus(); - - public static Class getJavaClass(int typeCode) { - switch (typeCode) { - - // boolean - case SimpleTypesFactory.BOOLEAN_TYPE: - return Boolean.class; - - // integers - case SimpleTypesFactory.INTEGER_TYPE: - case SimpleTypesFactory.NON_POSITIVE_INTEGER_TYPE: - case SimpleTypesFactory.NEGATIVE_INTEGER_TYPE: - case SimpleTypesFactory.NON_NEGATIVE_INTEGER_TYPE: - case SimpleTypesFactory.POSITIVE_INTEGER_TYPE: - case SimpleTypesFactory.INT_TYPE: - case SimpleTypesFactory.UNSIGNED_INT_TYPE: - case SimpleTypesFactory.SHORT_TYPE: - case SimpleTypesFactory.UNSIGNED_SHORT_TYPE: - case SimpleTypesFactory.LONG_TYPE: - case SimpleTypesFactory.UNSIGNED_LONG_TYPE: - case SimpleTypesFactory.BYTE_TYPE: - case SimpleTypesFactory.UNSIGNED_BYTE_TYPE: - return BigInteger.class; - // floats - case SimpleTypesFactory.FLOAT_TYPE: - case SimpleTypesFactory.DOUBLE_TYPE: - case SimpleTypesFactory.DECIMAL_TYPE: - return BigDecimal.class; - - // images - case SimpleTypesFactory.BASE64BINARY_TYPE: - case SimpleTypesFactory.HEXBINARY_TYPE: - return ImageIcon.class; - - // everything else is a string for now - default: - return String.class; - } - } - - public static Object getTypedValue(String value, Class type) { - try { - if (type.equals(Boolean.class)) - if (value == null || value.equals("")) - return Boolean.FALSE; - else - return Boolean.valueOf(value); - else if (type.equals(BigInteger.class)) - if (value == null || value.equals("")) - return new BigInteger("0"); - else - return new BigInteger(value); - else if (type.equals(BigDecimal.class)) - if (value == null || value.equals("")) - return new BigDecimal(0); - else - return new BigDecimal(value); - } catch (Exception ex) { - Logger.error("Cannot convert value '"+value+"' to a "+type.getName()); - } - return value==null?"":value; - } - - public static boolean isEmpty(Object value) { - if (value == null) return true; - - if (value instanceof String) { - if (((String)value).length() == 0) return true; - } - else if (value instanceof Boolean) { - if (((Boolean)value).booleanValue() == false) return true; - } - else if (value instanceof BigInteger) { - if (((BigInteger)value).intValue() == 0) return true; - } - else if (value instanceof BigDecimal) { - if (((BigDecimal)value).floatValue() == 0.0) return true; - } - return false; - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/StructuralException.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/StructuralException.java deleted file mode 100644 index 5aff436..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/StructuralException.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form; -import com.c2kernel.gui.tabs.outcome.OutcomeException; - -public class StructuralException extends OutcomeException { - - public StructuralException() { - super(); - } - public StructuralException(String ex) { - super(ex); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ArrayEditField.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ArrayEditField.java deleted file mode 100644 index 742d1b4..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ArrayEditField.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form.field; - -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.text.JTextComponent; - -import org.exolab.castor.xml.schema.SimpleType; - -import com.c2kernel.utils.Language; - -/************************************************************************** - * - * $Revision: 1.7 $ - * $Date: 2006/05/24 07:51:51 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class ArrayEditField extends StringEditField implements ActionListener { - - Box arrayBox; - Box expandBox; - Box editBox; - JScrollPane arrayView; - JButton arrayButton; - JButton expandButton; - JButton contractButton; - JButton addButton; - JButton removeButton; - ArrayTableModel arrayModel; - JLabel arrayLabel = new JLabel("Array"); - boolean panelShown = false; - boolean readOnly = false; - - public ArrayEditField(SimpleType type) { - arrayBox = Box.createVerticalBox(); - arrayBox.add(arrayLabel); - arrayButton = new JButton(Language.translate("Show")); - arrayButton.addActionListener(this); - arrayButton.setActionCommand("toggle"); - arrayBox.add(arrayButton); - - expandBox = Box.createHorizontalBox(); - expandButton = new JButton(">>"); - expandButton.setToolTipText("Increase the number of columns displaying this array"); - expandButton.addActionListener(this); - expandButton.setActionCommand("extend"); - - contractButton = new JButton("<<"); - contractButton.setToolTipText("Decrease the number of columns displaying this array"); - contractButton.addActionListener(this); - contractButton.setActionCommand("contract"); - - expandBox.add(contractButton); - expandBox.add(Box.createHorizontalGlue()); - expandBox.add(expandButton); - - arrayModel = new ArrayTableModel(type); - if (arrayModel.getColumnCount() < 2) contractButton.setEnabled(false); - arrayView = new JScrollPane(new JTable(arrayModel)); - - editBox = Box.createHorizontalBox(); - addButton = new JButton("+"); - addButton.setToolTipText("Add a field to the end of this array"); - addButton.addActionListener(this); - addButton.setActionCommand("add"); - removeButton = new JButton("-"); - removeButton.setToolTipText("Remove the last field from this array"); - removeButton.addActionListener(this); - removeButton.setActionCommand("remove"); - editBox.add(addButton); - editBox.add(Box.createHorizontalGlue()); - editBox.add(removeButton); - } - /** - * - */ - @Override - public String getDefaultValue() { - return ""; - } - /** - * - */ - @Override - public String getText() { - return arrayModel.getData(); - } - /** - * - */ - @Override - public void setText(String text) { - arrayModel.setData(text); - arrayLabel.setText("Array ("+arrayModel.getArrayLength()+" values)"); - } - /** - * - */ - @Override - public Component getControl() { - return arrayBox; - } - /** - * - */ - @Override - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("toggle")) { - arrayBox.removeAll(); - if (panelShown) { - arrayBox.add(arrayLabel); - arrayBox.add(Box.createVerticalStrut(7)); - arrayBox.add(arrayButton); - arrayButton.setText("Show"); - } - else { - arrayBox.add(arrayLabel); - arrayBox.add(Box.createVerticalStrut(7)); - arrayBox.add(arrayButton); - arrayBox.add(Box.createVerticalStrut(7)); - arrayBox.add(expandBox); - arrayBox.add(Box.createVerticalStrut(7)); - arrayBox.add(arrayView); - if (!readOnly) arrayBox.add(editBox); - arrayButton.setText("Hide"); - } - panelShown = !panelShown; - arrayBox.validate(); - } - else if (e.getActionCommand().equals("add")) { - arrayModel.addField(); - arrayLabel.setText("Array ("+arrayModel.getArrayLength()+" values)"); - } - else if (e.getActionCommand().equals("remove")) { - arrayModel.removeField(); - arrayLabel.setText("Array ("+arrayModel.getArrayLength()+" values)"); - } - else { - int currentCols = arrayModel.getColumnCount(); - if (e.getActionCommand().equals("extend")) - currentCols++; - else if (e.getActionCommand().equals("contract")) - currentCols--; - arrayModel.setColumnCount(currentCols); - contractButton.setEnabled(currentCols > 1); - } - - } - - /** - * - */ - @Override - public JTextComponent makeTextField() { - // not used by array - return null; - } - @Override - public void setEditable(boolean editable) { - readOnly = !editable; - arrayModel.setReadOnly(!readOnly); - } - -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ArrayTableModel.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ArrayTableModel.java deleted file mode 100644 index 341c33a..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ArrayTableModel.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form.field; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.StringTokenizer; - -import javax.swing.table.AbstractTableModel; - -import org.exolab.castor.xml.schema.SimpleType; - -import com.c2kernel.gui.tabs.outcome.form.OutcomeStructure; -import com.c2kernel.utils.Language; - -/************************************************************************** - * - * $Revision: 1.2 $ - * $Date: 2006/05/24 07:51:53 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class ArrayTableModel extends AbstractTableModel { - - ArrayList contents = new ArrayList(); - Class type; - int numCols = 1; - boolean readOnly = false; - - public ArrayTableModel(SimpleType type) { - super(); - this.type = OutcomeStructure.getJavaClass(type.getTypeCode()); - } - - public void setReadOnly(boolean readOnly) { - this.readOnly = readOnly; - } - - public void setData(String data) { - contents.clear(); - StringTokenizer tok = new StringTokenizer(data); - while(tok.hasMoreTokens()) - contents.add(OutcomeStructure.getTypedValue(tok.nextToken(), type)); - fireTableStructureChanged(); - } - - public String getData() { - if (contents.size() == 0) return ""; - Iterator iter = contents.iterator(); - StringBuffer result = new StringBuffer(iter.next().toString()); - while (iter.hasNext()) - result.append(" ").append(iter.next().toString()); - return result.toString(); - } - - public void addField() { - contents.add(OutcomeStructure.getTypedValue("", type)); - fireTableStructureChanged(); - } - - public void removeField() { - contents.remove(contents.size()-1); - fireTableStructureChanged(); - } - - @Override - public Class getColumnClass(int columnIndex) { - return type; - } - - @Override - public int getColumnCount() { - return numCols; - } - - public int getArrayLength() { - return contents.size(); - } - - public void setColumnCount(int newCols) { - numCols = newCols; - fireTableStructureChanged(); - } - - @Override - public String getColumnName(int column) { - return Language.translate("Value"); - } - - @Override - public int getRowCount() { - return (contents.size()/numCols)+1; - } - - @Override - public Object getValueAt(int arg0, int arg1) { - int index = arg1+(arg0 * numCols); - if (index >= contents.size()) - return null; - return contents.get(arg1+(arg0 * numCols)); - } - - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - if (columnIndex+(rowIndex*numCols) > contents.size()-1) return false; - return !readOnly; - } - - @Override - public void setValueAt(Object aValue, int rowIndex, int columnIndex) { - contents.set(columnIndex+(rowIndex*numCols), aValue); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/BooleanEditField.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/BooleanEditField.java deleted file mode 100644 index c831eb4..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/BooleanEditField.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form.field; - -import java.awt.Component; -import java.awt.event.FocusEvent; - -import javax.swing.JCheckBox; -import javax.swing.text.JTextComponent; - -import com.c2kernel.utils.Logger; - -/************************************************************************** - * - * $Revision: 1.7 $ - * $Date: 2005/08/16 13:59:56 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ -public class BooleanEditField extends StringEditField { - - JCheckBox checkbox; - - public BooleanEditField() { - checkbox = new JCheckBox(); - checkbox.setSelected(false); - checkbox.addFocusListener(this); - } - - @Override - public String getText() { - return String.valueOf(checkbox.isSelected()); - } - - @Override - public void setText(String text) { - boolean newState = false; - try { - newState = Boolean.valueOf(text).booleanValue(); - } catch (Exception ex) { - Logger.error("Invalid value for checkbox: "+text); - } - checkbox.setSelected(newState); - } - - @Override - public void setEditable(boolean editable) { - super.setEditable(editable); - checkbox.setEnabled(editable); - } - - @Override - public Component getControl() { - return checkbox; - } - - @Override - public String getDefaultValue() { - return "false"; - } - - /** don't reserve the item finder for a boolean */ - @Override - public void focusGained(FocusEvent e) { - helpPane.setHelp(name, helpText); - } - - /** - * - */ - @Override - public JTextComponent makeTextField() { - // not used by boolean - return null; - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ComboField.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ComboField.java deleted file mode 100644 index 3be29f5..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ComboField.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form.field; - -import java.awt.Component; -import com.c2kernel.gui.MainFrame; -import java.util.Enumeration; -import java.util.StringTokenizer; - -import javax.swing.DefaultComboBoxModel; -import javax.swing.JComboBox; -import javax.swing.text.JTextComponent; - -import org.exolab.castor.types.AnyNode; -import org.exolab.castor.xml.schema.AttributeDecl; -import org.exolab.castor.xml.schema.ElementDecl; -import org.exolab.castor.xml.schema.Facet; -import org.exolab.castor.xml.schema.SimpleType; - -import com.c2kernel.gui.tabs.outcome.form.StructuralException; -import com.c2kernel.scripting.Script; - -/******************************************************************************* - * - * $Revision: 1.4 $ $Date: 2005/08/16 13:59:56 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research All - * rights reserved. - ******************************************************************************/ - -public class ComboField extends StringEditField { - - JComboBox comboField; - ListOfValues vals; - DefaultComboBoxModel comboModel; - AnyNode listNode; - - public ComboField(SimpleType type, AnyNode listNode) { - super(); - comboField = new JComboBox(); - content = type; - this.listNode = listNode; - createLOV(); - } - - @Override - public String getDefaultValue() { - if (vals.getDefaultKey() != null) - return vals.get(vals.getDefaultKey()).toString(); - else - return ""; - } - - @Override - public String getText() { - return vals.get(comboModel.getSelectedItem()).toString(); - } - - @Override - public JTextComponent makeTextField() { - // not used by this control - return null; - } - - @Override - public void setText(String text) { - comboModel.setSelectedItem(text); - } - - @Override - public Component getControl() { - return comboField; - } - - private void createLOV() { - vals = new ListOfValues(); - - if (listNode != null) { // schema instructions for list building - String lovType = listNode.getLocalName(); - String param = listNode.getFirstChild().getStringValue(); - if (lovType.equals("ScriptList")) - populateLOVFromScript(param); - if (lovType.equals("PathList")) - populateLOVFromLDAP(param); - } - - // handle enumerations - // TODO: should be ANDed with above results - if (content.hasFacet(Facet.ENUMERATION)) { - //ListOfValues andList = new ListOfValues(); - Enumeration enums = content.getFacets(Facet.ENUMERATION); - while (enums.hasMoreElements()) { - Facet thisEnum = enums.nextElement(); - vals.put(thisEnum.getValue(), thisEnum.getValue(), false); - } - } - - String[] keyArray = new String[vals.keySet().size()]; - comboModel = new DefaultComboBoxModel(vals.keySet().toArray(keyArray)); - comboModel.setSelectedItem(vals.getDefaultKey()); - comboField.setModel(comboModel); - } - - /** - * @param param - */ - private void populateLOVFromLDAP(String param) { - // TODO List of Values from LDAP properties, eg '/root/path;prop=val;prop=val' - - - } - - private void populateLOVFromScript(String scriptName) { - try { - StringTokenizer tok = new StringTokenizer(scriptName, "_"); - if (tok.countTokens() != 2) - throw new Exception("Invalid LOVScript name"); - Script lovscript = new Script(tok.nextToken(), Integer.parseInt(tok.nextToken())); - lovscript.setInputParamValue("LOV", vals); - lovscript.execute(); - } catch (Exception ex) { - MainFrame.exceptionDialog(ex); - } - } - - @Override - public void setDecl(AttributeDecl model) throws StructuralException { - super.setDecl(model); - createLOV(); - } - - @Override - public void setDecl(ElementDecl model) throws StructuralException { - super.setDecl(model); - createLOV(); - } - - /** - * - */ - - @Override - public void setEditable(boolean editable) { - comboField.setEditable(editable); - } -} \ No newline at end of file diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/DecimalEditField.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/DecimalEditField.java deleted file mode 100644 index 654dc35..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/DecimalEditField.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form.field; - -import java.awt.Toolkit; -import java.math.BigDecimal; - -import javax.swing.JTextField; -import javax.swing.text.AttributeSet; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; -import javax.swing.text.JTextComponent; -import javax.swing.text.PlainDocument; - -/************************************************************************** - * - * $Revision: 1.3 $ - * $Date: 2005/08/16 13:59:56 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ -public class DecimalEditField extends StringEditField { - - public DecimalEditField() { - super(); - field.addFocusListener(this); - field.setToolTipText("This field must contains a decimal number e.g. 3.14159265"); - } - - @Override - public String getText() { - return field.getText(); - } - - @Override - public void setText(String text) { - field.setText(text); - } - - @Override - public String getDefaultValue() { - return "0.0"; - } - - @Override - public JTextComponent makeTextField() { - return new DecimalTextField(); - } - - private class DecimalTextField extends JTextField { - - public DecimalTextField() { - super(); - setHorizontalAlignment(RIGHT); - } - @Override - protected Document createDefaultModel() { - return new Decimal(); - } - } - - private class Decimal extends PlainDocument { - - @Override - public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { - - if (str == null || str.equals("")) { - return; - } - - String proposedResult = null; - - if (getLength() == 0) { - proposedResult = str; - } else { - StringBuffer currentBuffer = new StringBuffer( this.getText(0, getLength()) ); - currentBuffer.insert(offs, str); - proposedResult = currentBuffer.toString(); - } - - try { - parse(proposedResult); - super.insertString(offs, str, a); - } catch (Exception e) { - Toolkit.getDefaultToolkit().beep(); - } - - } - - @Override - public void remove(int offs, int len) throws BadLocationException { - - String currentText = this.getText(0, getLength()); - String beforeOffset = currentText.substring(0, offs); - String afterOffset = currentText.substring(len + offs, currentText.length()); - String proposedResult = beforeOffset + afterOffset; - - if (proposedResult.length() == 0) { // empty is ok - super.remove(offs, len); - return; - } - try { - parse(proposedResult); - super.remove(offs, len); - } catch (Exception e) { - Toolkit.getDefaultToolkit().beep(); - } - - } - - public BigDecimal parse(String proposedResult) throws NumberFormatException { - - BigDecimal value = new BigDecimal(0); - if ( proposedResult.length() != 0) { - value = new BigDecimal(proposedResult); - } - return value; - } - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ImageEditField.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ImageEditField.java deleted file mode 100644 index 8eb9368..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ImageEditField.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form.field; - -import java.awt.Component; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileInputStream; -import java.lang.reflect.Array; - -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; - -import org.apache.xerces.impl.dv.util.Base64; - -import com.c2kernel.gui.MainFrame; - -public class ImageEditField extends StringEditField { - - JLabel imageLabel; - - Box imagePanel; - - JButton browseButton; - - String encodedImage; - - static JFileChooser chooser = new JFileChooser(); - static { - chooser.addChoosableFileFilter(new javax.swing.filechooser.FileFilter() { - @Override - public String getDescription() { - return "Image Files"; - } - - @Override - public boolean accept(File f) { - return (f.isDirectory() || (f.isFile() && (f.getName() - .endsWith(".gif") - || f.getName().endsWith(".jpg") - || f.getName().endsWith(".jpeg") - || f.getName().endsWith(".png")))); - } - }); - } - - public ImageEditField() { - super(); - imageLabel = new JLabel(); - imagePanel = Box.createVerticalBox(); - browseButton = new JButton("Browse"); - browseButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - int returnVal = chooser.showOpenDialog(null); - if (returnVal == JFileChooser.APPROVE_OPTION) { - File file = chooser.getSelectedFile(); - try { - FileInputStream fis = new FileInputStream(file); - byte[] bArray = (byte[]) Array.newInstance(byte.class, - (int) file.length()); - fis.read(bArray, 0, (int) file.length()); - fis.close(); - - ImageIcon newImage = new ImageIcon(Toolkit - .getDefaultToolkit().createImage(bArray)); - imageLabel.setIcon(newImage); - encodedImage = Base64.encode(bArray); - } catch (Exception ex) { - MainFrame.exceptionDialog(ex); - } - } - } - }); - imagePanel.add(imageLabel); - imagePanel.add(Box.createVerticalStrut(5)); - imagePanel.add(browseButton); - } - - @Override - public String getDefaultValue() { - return ""; - } - - @Override - public Component getControl() { - return imagePanel; - } - - @Override - public String getText() { - return encodedImage == null ? "" : encodedImage; - } - - @Override - public void setText(String text) { - encodedImage = text; - if (text != null && text.length() > 0) { - byte[] decodedImage = Base64.decode(encodedImage); - imageLabel.setIcon(new ImageIcon(Toolkit.getDefaultToolkit() - .createImage(decodedImage))); - } - } - - @Override - public void setEditable(boolean editable) { - browseButton.setVisible(false); - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/IntegerEditField.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/IntegerEditField.java deleted file mode 100644 index fef8cf0..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/IntegerEditField.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form.field; - -import java.awt.Toolkit; -import java.math.BigInteger; - -import javax.swing.JTextField; -import javax.swing.text.AttributeSet; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; -import javax.swing.text.JTextComponent; -import javax.swing.text.PlainDocument; - -/************************************************************************** - * - * $Revision: 1.4 $ - * $Date: 2005/08/16 13:59:56 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ -public class IntegerEditField extends StringEditField { - - public IntegerEditField() { - super(); - field.setToolTipText("This field must contains a whole number e.g. 3"); - } - - @Override - public String getText() { - return field.getText(); - } - - @Override - public void setText(String text) { - field.setText(text); - } - - @Override - public String getDefaultValue() { - return "0"; - } - - @Override - public JTextComponent makeTextField() { - return new IntegerTextField(); - } - - private class IntegerTextField extends JTextField { - - public IntegerTextField() { - super(); - setHorizontalAlignment(RIGHT); - } - @Override - protected Document createDefaultModel() { - return new IntegerDocument(); - } - } - - private class IntegerDocument extends PlainDocument { - - - @Override - public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { - - if (str == null || str.equals("")) { - return; - } - - String proposedResult = null; - - if (getLength() == 0) { - proposedResult = str; - } else { - StringBuffer currentBuffer = new StringBuffer( this.getText(0, getLength()) ); - currentBuffer.insert(offs, str); - proposedResult = currentBuffer.toString(); - } - - try { - parse(proposedResult); - super.insertString(offs, str, a); - } catch (Exception e) { - Toolkit.getDefaultToolkit().beep(); - } - - } - - @Override - public void remove(int offs, int len) throws BadLocationException { - - String currentText = this.getText(0, getLength()); - String beforeOffset = currentText.substring(0, offs); - String afterOffset = currentText.substring(len + offs, currentText.length()); - String proposedResult = beforeOffset + afterOffset; - if (proposedResult.length() == 0) { // empty is ok - super.remove(offs, len); - return; - } - - try { - parse(proposedResult); - super.remove(offs, len); - } catch (Exception e) { - Toolkit.getDefaultToolkit().beep(); - } - - } - - public BigInteger parse(String proposedResult) throws NumberFormatException { - - BigInteger value = new BigInteger("0"); - if ( proposedResult.length() != 0) { - value = new BigInteger(proposedResult); - } - return value; - } - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ListOfValues.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ListOfValues.java deleted file mode 100644 index f95c5c9..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/ListOfValues.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form.field; - -import java.util.HashMap; - -/************************************************************************** - * - * $Revision: 1.2 $ - * $Date: 2005/04/26 06:48:12 $ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ - -public class ListOfValues extends HashMap { - - String defaultKey = null; - - public ListOfValues() { - super(); - } - - public String put(String key, String value, boolean isDefaultKey) { - if (isDefaultKey) defaultKey = key; - return (String)super.put(key, value); - } - - public String getDefaultKey() { - return defaultKey; - } - -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/LongStringEditField.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/LongStringEditField.java deleted file mode 100644 index 140d7f2..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/LongStringEditField.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form.field; - -import java.awt.Component; - -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.text.JTextComponent; - -import com.c2kernel.utils.Language; - - -/************************************************************************** - * - * $Revision$ - * $Date$ - * - * Copyright (C) 2003 CERN - European Organization for Nuclear Research - * All rights reserved. - **************************************************************************/ -public class LongStringEditField extends StringEditField { - - JTextArea bigText; - JScrollPane bigScroller; - public LongStringEditField() { - super(); - field.setToolTipText(Language.translate("This field can contain any string.")); - } - - @Override - public JTextComponent makeTextField() { - return new JTextArea(); - } - @Override - public Component getControl() { - if (bigScroller == null) { - bigScroller = new JScrollPane(field); - } - return bigScroller; - } -} diff --git a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/StringEditField.java b/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/StringEditField.java deleted file mode 100644 index 0e5fee9..0000000 --- a/src/main/java/com/c2kernel/gui/tabs/outcome/form/field/StringEditField.java +++ /dev/null @@ -1,257 +0,0 @@ -package com.c2kernel.gui.tabs.outcome.form.field; -import java.awt.Component; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.Enumeration; - -import javax.swing.ImageIcon; -import javax.swing.JTextField; -import javax.swing.text.JTextComponent; - -import org.exolab.castor.types.AnyNode; -import org.exolab.castor.xml.schema.Annotation; -import org.exolab.castor.xml.schema.AppInfo; -import org.exolab.castor.xml.schema.AttributeDecl; -import org.exolab.castor.xml.schema.ElementDecl; -import org.exolab.castor.xml.schema.Facet; -import org.exolab.castor.xml.schema.SimpleType; -import org.exolab.castor.xml.schema.Structure; -import org.exolab.castor.xml.schema.XMLType; -import org.exolab.castor.xml.schema.simpletypes.ListType; -import org.w3c.dom.Attr; -import org.w3c.dom.Node; -import org.w3c.dom.Text; - -import com.c2kernel.gui.DomainKeyConsumer; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.tabs.outcome.OutcomeException; -import com.c2kernel.gui.tabs.outcome.form.HelpPane; -import com.c2kernel.gui.tabs.outcome.form.OutcomeStructure; -import com.c2kernel.gui.tabs.outcome.form.StructuralException; -import com.c2kernel.lookup.DomainPath; - -/** Superclass for the entry field for Field and AttributeList. - */ -public class StringEditField implements FocusListener, DomainKeyConsumer { - - Node data; - Structure model; - protected SimpleType content; - HelpPane helpPane; - String helpText; - protected JTextComponent field; - - boolean isValid = true; - boolean editable = true; - String name; - - - public StringEditField() { - field = makeTextField(); - if (field != null) - field.addFocusListener(this); - } - - private static StringEditField getFieldForType(SimpleType type) { - // handle lists special - if (type instanceof ListType) - return new ArrayEditField(type.getBuiltInBaseType()); - - // is a combobox - if (type.hasFacet(Facet.ENUMERATION)) - return new ComboField(type, null); - //find LOVscript TODO: Implement LOV - Enumeration e = type.getAnnotations(); - while (e.hasMoreElements()) { - Annotation note = e.nextElement(); - for (Enumeration f = note.getAppInfo(); f.hasMoreElements();) { - AppInfo thisAppInfo = f.nextElement(); - for (Enumeration g = thisAppInfo.getObjects(); g.hasMoreElements();) { - AnyNode appInfoNode = (AnyNode)g.nextElement(); - if (appInfoNode.getLocalName().equals("ScriptList") - || appInfoNode.getLocalName().equals("LDAPList")) { - return new ComboField(type, appInfoNode); - } - } - } - } - // find info on length before we go to the base type - long length = -1; - if (type.getLength()!=null) length = type.getLength().longValue(); - else if (type.getMaxLength()!=null) length = type.getMaxLength().longValue(); - else if (type.getMinLength()!=null) length = type.getMinLength().longValue(); - - // find base type if derived - if (!(type.isBuiltInType())) - type = type.getBuiltInBaseType(); - // else derive the class - Class contentClass = OutcomeStructure.getJavaClass(type.getTypeCode()); - // disable list edits for the moment - if (contentClass.equals(Boolean.class)) - return new BooleanEditField(); - else if (contentClass.equals(BigInteger.class)) - return new IntegerEditField(); - else if (contentClass.equals(BigDecimal.class)) - return new DecimalEditField(); - else if (contentClass.equals(ImageIcon.class)) - return new ImageEditField(); - else if (length > 60) - return new LongStringEditField(); - else return new StringEditField(); - } - - public static StringEditField getEditField(AttributeDecl model) throws StructuralException { - if (model.isReference()) model = model.getReference(); - StringEditField newField = getFieldForType(model.getSimpleType()); - newField.setDecl(model); - return newField; - } - - public static StringEditField getEditField(ElementDecl model) throws StructuralException { - try { - XMLType baseType = model.getType(); - while (!(baseType instanceof SimpleType)) - baseType = baseType.getBaseType(); - StringEditField newField = getFieldForType((SimpleType)baseType); - newField.setDecl(model); - return newField; - } catch (Exception ex) { - throw new StructuralException("No type defined in model"); - } - } - - public void setDecl(AttributeDecl model) throws StructuralException { - this.model=model; - this.content=model.getSimpleType(); - this.name = model.getName(); - if (model.isFixed()) setEditable(false); - } - - public void setDecl(ElementDecl model) throws StructuralException { - this.model=model; - this.name = model.getName(); - XMLType type = model.getType(); - - // derive base type - if (type.isSimpleType()) - this.content = (SimpleType)type; - else - this.content = (SimpleType)(type.getBaseType()); - - if (this.content == null) throw new StructuralException("No declared base type of element"); - - // - if (model.getFixedValue() != null) setEditable(false); - - } - - public void setData(Attr newData) throws StructuralException { - if (!(newData.getName().equals(name))) - throw new StructuralException("Tried to add a "+newData.getName()+" into a "+name+" attribute."); - - this.data = newData; - setText(newData.getValue()); - } - - public void setData(Text newData) { - String contents = newData.getData(); - this.data = newData; - setText(contents); - } - - public void setData(String newData) throws OutcomeException { - if (data == null) throw new OutcomeException("No node exists"); - setText(newData); - updateNode(); - - } - - public Structure getModel() { - return model; - } - - public String getName() { - return name; - } - - public Node getData() { - return data; - } - - public String getDefaultValue() { - return ""; - } - - public void setHelp(HelpPane helpPane, String helpText) { - this.helpPane = helpPane; - this.helpText = helpText; - } - - @Override - public void focusLost(FocusEvent e) { - if (MainFrame.itemFinder != null) - MainFrame.itemFinder.clearConsumer(this); - updateNode(); - } - - @Override - public void focusGained(FocusEvent e) { - helpPane.setHelp(name, helpText); - if (editable && MainFrame.itemFinder != null) - MainFrame.itemFinder.setConsumer(this, "Insert"); - } - - public void updateNode() { - if (data == null) return; - if (data instanceof Text) { - ((Text)data).setData(getText()); - } - else { //attribute - ((Attr)data).setValue(getText()); - } - } - - /** - * Read domkey from barcode input - */ - @Override - public void push(DomainPath key) { - setText(key.getName()); - } - - /** - * Read string from barcode input - */ - @Override - public void push(String key) { - setText(key); - } - - public void setEditable(boolean editable) { - this.editable = editable; - if (field != null) - field.setEditable(editable); - } - - public String getText() { - return field.getText(); - } - - public void setText(String text) { - field.setText(text); - } - - public JTextComponent makeTextField() { - return new JTextField(); - } - - public Component getControl() { - return field; - } - - public void grabFocus() { - getControl().requestFocus(); - } -} diff --git a/src/main/java/com/c2kernel/gui/tree/Node.java b/src/main/java/com/c2kernel/gui/tree/Node.java deleted file mode 100644 index d81061f..0000000 --- a/src/main/java/com/c2kernel/gui/tree/Node.java +++ /dev/null @@ -1,251 +0,0 @@ -package com.c2kernel.gui.tree; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; - -import javax.swing.Icon; -import javax.swing.ImageIcon; -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; -import javax.swing.tree.DefaultMutableTreeNode; - -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.gui.DynamicTreeBuilder; -import com.c2kernel.gui.ImageLoader; -import com.c2kernel.gui.ItemTabManager; -import com.c2kernel.lookup.AgentPath; -import com.c2kernel.lookup.ItemPath; -import com.c2kernel.lookup.Path; -import com.c2kernel.lookup.RolePath; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -public abstract class Node implements Runnable { - - protected Path binding; - protected DefaultMutableTreeNode treeNode; - protected String name; // domain key - protected ItemPath itemPath; // target item - // attributes - protected String type = ""; - protected String toolTip = null; - protected Icon icon; - protected boolean isExpandable = false; - protected HashMap childNodes = new HashMap(); - protected ArrayList subscribers = new ArrayList(); - protected DynamicTreeBuilder loader = null; - private boolean loaded = false; - private String iconName; - protected ItemTabManager desktop; - static ImageIcon folder = ImageLoader.findImage("folder.png"); - static ImageIcon emptyLeaf = ImageLoader.findImage("leaf.png"); - - public Node(ItemTabManager desktop) { - this.desktop = desktop; - } - - protected void createTreeNode() { - this.treeNode = new DefaultMutableTreeNode(this); - } - - public Node(Path path, ItemTabManager desktop) { - this.binding = path; - this.desktop = desktop; - try { - this.itemPath = path.getItemPath(); - } catch (ObjectNotFoundException e) { } - // get the name of this node (last path element) - String[] pathComponents = path.getPath(); - if (pathComponents.length > 0) - this.name = pathComponents[pathComponents.length-1]; - else - this.name = Gateway.getProperties().getProperty("Name"); - } - - public ItemTabManager getDesktop() { - return desktop; - } - - public Node newNode(Path path) - { - try { - if (path.getItemPath() instanceof AgentPath) - return new NodeAgent(path, desktop); - else - return new NodeItem(path, desktop); - } catch (ObjectNotFoundException ex) { - if (path instanceof RolePath) - return new NodeRole(path, desktop); - return new NodeContext(path, desktop); - } - - } - - /** Inserts a tree builder as the first child of the node, so it can be opened in the tree - */ - public void makeExpandable() { - if (isExpandable) return; - loader = new DynamicTreeBuilder(this.treeNode, desktop); - this.treeNode.insert(loader.getTreeNode(),0); - isExpandable = true; - } - - - public DefaultMutableTreeNode getTreeNode() { - return treeNode; - } - - public void setTreeNode(DefaultMutableTreeNode treeNode) { - this.treeNode = treeNode; - treeNode.setUserObject(this); - } - - /** Subscription for loading node children. - * Note this is separate from the itemproxy subscription as it included query of the naming service - * and eventually should not require access to the item at all for higher performance */ - public void subscribeNode(NodeSubscriber target) { - subscribers.add(target); - if (loaded == false) { - loaded = true; - loadMore(); - } - else { - synchronized (childNodes) { - Node newNode; - for (Iterator nodes = childNodes.values().iterator(); nodes.hasNext();) { - newNode = nodes.next(); - Logger.msg("subscribeNode target.add("+newNode.name+")"); - target.add(newNode); - } - } - } - } - - public void loadMore() { - Thread loading = new Thread(this); - loading.start(); - } - - public void unsubscribeNode(NodeSubscriber target) { - subscribers.remove(target); - } - - public void add(Node newNode) { - synchronized(childNodes) { - childNodes.put(newNode.getPath(), newNode); - for (NodeSubscriber thisSub : subscribers) { - thisSub.add(newNode); - } - } - } - - public void remove(Path oldPath) { - synchronized(childNodes) { - childNodes.remove(oldPath); - for (NodeSubscriber thisSub : subscribers) { - thisSub.remove(oldPath); - } - } - } - - public void removeAllChildren() { - synchronized(childNodes) { - while (childNodes.keySet().iterator().hasNext()) { - remove(childNodes.keySet().iterator().next()); - } - } - } - - public Node getChildNode(Path itsPath) { - for (Iterator i = childNodes.keySet().iterator(); i.hasNext();) { - Object next = i.next(); - if ( next.equals(itsPath) ) return childNodes.get(next); - } - return null; - } - - // end of current batch - public void end(boolean more) { - for (NodeSubscriber thisSub : subscribers) { - thisSub.end(more); - } - } - - - @Override - public void run() { - Thread.currentThread().setName("Node Loader: "+name); - loadChildren(); - } - - public abstract void loadChildren(); - - public void refresh() { - removeAllChildren(); - loadChildren(); - } - - // Getters and Setters - - public ItemPath getItemPath() { return itemPath; } -// public void setSysKey( int sysKey ) { this.sysKey = sysKey; } - - public String getName() { return name; } -// public void setName( String name ) { this.name = name; } - - public String getType() { return type; } -// public void setType( String type ) { this.type = type; } - - public Path getPath() { return binding; } - - public DynamicTreeBuilder getTreeBuilder() { return loader; } - - @Override - public String toString() { - if (this.name.length() > 0) { - return this.name; - } - else { return "Cristal"; } - } - - public Icon getIcon() { - if (icon != null) return icon; - return(isExpandable?folder:emptyLeaf); - } - - public String getIconName() { - return iconName; - } - - public void setIcon(String icon) { - iconName = icon; - this.icon = ImageLoader.findImage("typeicons/"+icon+"_16.png"); - if (this.icon==ImageLoader.nullImg) this.icon = ImageLoader.findImage("typeicons/item_16.png"); - } - - public JPopupMenu getPopupMenu() { - JPopupMenu popup = new JPopupMenu(); - JMenuItem menuItem = new JMenuItem(Language.translate("Refresh")); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (isExpandable) refresh(); - } - }); - popup.add(menuItem); - return popup; - } - - public String getToolTip() { - if (toolTip != null && toolTip.length()>0) - return toolTip; - else - return type; - } - - public void setToolTip(String tip) { - this.toolTip = tip; - }} diff --git a/src/main/java/com/c2kernel/gui/tree/NodeAgent.java b/src/main/java/com/c2kernel/gui/tree/NodeAgent.java deleted file mode 100644 index 3ce667d..0000000 --- a/src/main/java/com/c2kernel/gui/tree/NodeAgent.java +++ /dev/null @@ -1,32 +0,0 @@ - -package com.c2kernel.gui.tree; - - -import java.util.ArrayList; - -import com.c2kernel.gui.ItemTabManager; -import com.c2kernel.lookup.Path; - -/** - * Structure for Item presence on the tree and ItemDetails boxes. Created by NodeFactory. - * @author $Author: abranson $ - * @version $Version$ - */ -public class NodeAgent extends NodeItem { - - public NodeAgent(Path path, ItemTabManager desktop) { - super(path, desktop); - } - - @Override - public void loadChildren() { - } - - @Override - public ArrayList getTabs() { - - ArrayList requiredTabs = super.getTabs(); - requiredTabs.add("JobList"); - return requiredTabs; - } -} diff --git a/src/main/java/com/c2kernel/gui/tree/NodeCollection.java b/src/main/java/com/c2kernel/gui/tree/NodeCollection.java deleted file mode 100644 index 36d32e3..0000000 --- a/src/main/java/com/c2kernel/gui/tree/NodeCollection.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.c2kernel.gui.tree; - -import java.util.ArrayList; - -import javax.swing.tree.DefaultMutableTreeNode; - -import com.c2kernel.collection.Collection; -import com.c2kernel.collection.CollectionMember; -import com.c2kernel.collection.Dependency; -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.entity.proxy.ItemProxy; -import com.c2kernel.entity.proxy.MemberSubscription; -import com.c2kernel.entity.proxy.ProxyObserver; -import com.c2kernel.gui.ItemTabManager; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.lookup.ItemPath; -import com.c2kernel.lookup.Path; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.utils.CastorHashMap; -import com.c2kernel.utils.KeyValuePair; -import com.c2kernel.utils.Logger; - -public class NodeCollection extends Node implements ProxyObserver> { - - ItemProxy parent; - Collection thisCollection; - String path; - - public NodeCollection(ItemProxy parent, String name, ItemTabManager desktop) { - super(desktop); - this.parent = parent; - this.name = name; - this.path = parent.getPath()+"/"+ClusterStorage.COLLECTION+"/"+name+"/last"; - createTreeNode(); - this.makeExpandable(); - } - - public NodeCollection(ItemProxy parent, Collection coll, ItemTabManager desktop) { - super(desktop); - this.parent = parent; - this.name = coll.getName(); - this.path = parent.getPath()+"/"+ClusterStorage.COLLECTION+"/"+name+"/last"; - createTreeNode(); - this.makeExpandable(); - add(coll); - } - - @Override - public void loadChildren() { - Logger.msg(8, "NodeCollection::loadChildren()"); - try { - if (thisCollection == null) { - Collection initColl = (Collection)parent.getObject(ClusterStorage.COLLECTION+"/"+name+"/last"); - add(initColl); - } - parent.subscribe(new MemberSubscription>(this, ClusterStorage.COLLECTION, false)); - } catch (ObjectNotFoundException ex) { - end(false); - return; - } - } - - @Override - public void add(Collection contents) { - if (!contents.getName().equals(name)) return; - this.type = contents.getClass().getSimpleName(); - ArrayList newMembers = contents.getMembers().list; - ArrayList oldMembers; - if (thisCollection == null) - oldMembers = new ArrayList(); - else - oldMembers = thisCollection.getMembers().list; - - ArrayList currentPaths = new ArrayList(); - // add any missing paths - for (CollectionMember newMember : newMembers) { - ItemPath itemPath = newMember.getItemPath(); - if (!oldMembers.contains(newMember) && itemPath != null) { - currentPaths.add(itemPath); - NodeItem newMemberNode = new NodeItem(itemPath, desktop); - newMemberNode.setCollection(contents, newMember.getID(), parent); - newMemberNode.setToolTip(getPropertyToolTip(newMember.getProperties())); - add(newMemberNode); - } - } - // remove those no longer present - for (Path childPath : childNodes.keySet()) { - if (!currentPaths.contains(childPath)) { - remove(childPath); - } - - } - - thisCollection = contents; - if (isDependency()) - setToolTip(getPropertyToolTip(((Dependency)contents).getProperties())); - end(false); - } - - public boolean addMember(ItemPath itemPath) { - if (!isDependency()) return false; - String[] params = { thisCollection.getName(), itemPath.getUUID().toString() }; - try { - MainFrame.userAgent.execute(parent, "AddMemberToCollection", params); - return true; - } catch (Exception e1) { - MainFrame.exceptionDialog(e1); - return false; - } - } - - public static String getPropertyToolTip(CastorHashMap props) { - if (props.size() == 0) return null; - StringBuffer verStr = new StringBuffer(""); - for (KeyValuePair prop : props.getKeyValuePairs()) { - verStr.append("").append(prop.getKey()).append(": ").append(prop.getValue()).append("
"); - } - return verStr.append("").toString(); - } - - @Override - public DefaultMutableTreeNode getTreeNode() { - return treeNode; - } - - - - @Override - public void remove(String id) { - // TODO Auto-generated method stub - - } - - @Override - public void control(String control, String msg) { - // TODO Auto-generated method stub - - } - - public boolean isDependency() { - return thisCollection instanceof Dependency; - } -} diff --git a/src/main/java/com/c2kernel/gui/tree/NodeContext.java b/src/main/java/com/c2kernel/gui/tree/NodeContext.java deleted file mode 100644 index 6d7c7bd..0000000 --- a/src/main/java/com/c2kernel/gui/tree/NodeContext.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.c2kernel.gui.tree; - -import java.util.Iterator; - -import com.c2kernel.entity.proxy.DomainPathSubscriber; -import com.c2kernel.gui.ItemTabManager; -import com.c2kernel.lookup.DomainPath; -import com.c2kernel.lookup.Path; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Logger; - - -public class NodeContext extends Node implements DomainPathSubscriber { - Iterator children; - - public NodeContext(Path path, ItemTabManager desktop) { - super(path, desktop); - this.itemPath = null; - createTreeNode(); - this.makeExpandable(); - this.type = "Cristal Context"; - } - - - @Override - public void loadChildren() { - if (children == null) { - Gateway.getProxyManager().subscribeTree(this, (DomainPath)binding); - children = Gateway.getLookup().getChildren(binding); - } - - int batch = 75; - while (children.hasNext() && batch > 0) { - Path newPath = children.next(); - if (newPath == null) break; - Logger.msg(2, "Subscription.run() - new node: " + newPath ); - add( newNode(newPath)); - batch--; - } - end(children.hasNext()); - } - - @Override - public void pathAdded(DomainPath path) { - add(newNode(path)); - } - - @Override - public void refresh() { - children = null; - super.refresh(); - } - @Override - public void pathRemoved(DomainPath path) { - remove(path); - } - -} - - - - - - - diff --git a/src/main/java/com/c2kernel/gui/tree/NodeItem.java b/src/main/java/com/c2kernel/gui/tree/NodeItem.java deleted file mode 100644 index 3194bcd..0000000 --- a/src/main/java/com/c2kernel/gui/tree/NodeItem.java +++ /dev/null @@ -1,240 +0,0 @@ -package com.c2kernel.gui.tree; - -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.datatransfer.UnsupportedFlavorException; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.IOException; -import java.util.ArrayList; -import java.util.StringTokenizer; - -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; - -import com.c2kernel.collection.Aggregation; -import com.c2kernel.collection.Collection; -import com.c2kernel.collection.CollectionMember; -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.entity.agent.Job; -import com.c2kernel.entity.proxy.ItemProxy; -import com.c2kernel.gui.ItemDetails; -import com.c2kernel.gui.ItemTabManager; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.lookup.Path; -import com.c2kernel.persistency.ClusterStorage; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Language; -import com.c2kernel.utils.Logger; - -/** - * Structure for Item presence on the tree and ItemDetails boxes. Created by NodeFactory. - * @author $Author: abranson $ - * @version $Version$ - */ -public class NodeItem extends Node implements Transferable { - - protected ItemProxy myItem = null; - - public NodeItem(Path path, ItemTabManager desktop) { - - super(path, desktop); - Logger.msg(2,"NodeEntity. - Creating item for '"+path.toString()+"'."); - - // if an item - resolve the item and get its properties - try { - myItem = Gateway.getProxyManager().getProxy(path); - this.itemPath = path.getItemPath(); - Logger.msg(2,"NodeEntity. - System key is "+this.itemPath); - - // Name should be the alias if present - String alias = myItem.getName(); - if (alias != null) this.name = alias; - - try { - this.type = myItem.getProperty("Type"); - } catch (ObjectNotFoundException e) { - this.type = ""; - } - String iconString = this.type; - if (type.equals("ActivityDesc")) - try { - iconString = myItem.getProperty("Complexity")+iconString; - } catch (ObjectNotFoundException e) { - iconString = "error"; - } - iconString = iconString.toLowerCase(); - this.setIcon(iconString); - } catch (ObjectNotFoundException e1) { - this.itemPath = null; - this.type="Error"; - this.name="Entity not found"; - this.setIcon("error"); - } - createTreeNode(); - makeExpandable(); - } - - public ItemProxy getItem() { - return myItem; - } - - public void openItem() { - desktop.add(this); - } - - public Collection getParentCollection() { - return parentCollection; - } - - public Integer getSlotNo() { - return slotNo; - } - - Collection parentCollection; - Integer slotNo = null; - static DataFlavor dataFlavor = new DataFlavor(NodeItem.class, "NodeItem"); - ItemProxy parentItem; - static DataFlavor[] supportedFlavours = new DataFlavor[] { - dataFlavor, - new DataFlavor(Path.class, "Path"), - DataFlavor.getTextPlainUnicodeFlavor() }; - - - public void setCollection(Collection parentCollection, Integer slotNo, ItemProxy parentItem) { - this.parentCollection = parentCollection; - this.slotNo = slotNo; - this.parentItem = parentItem; - } - - @Override - public void loadChildren() { - try { - String collections = myItem.queryData("Collection/all"); - StringTokenizer tok = new StringTokenizer(collections, ","); - while (tok.hasMoreTokens()) { - NodeCollection newCollection = new NodeCollection(myItem, tok.nextToken(), desktop); - add(newCollection); - } - end(false); - } catch (Exception e) { - Logger.error(e); - } - } - - @Override - public JPopupMenu getPopupMenu() { - - JPopupMenu popup = super.getPopupMenu(); - JMenuItem openItem = new JMenuItem(Language.translate("Open")); - openItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - openItem(); - } - }); - popup.addSeparator(); - popup.add(openItem); - popup.addSeparator(); - if (parentCollection != null && MainFrame.isAdmin) { - JMenuItem collMenuItem = new JMenuItem("Remove from collection"); - //collMenuItem.setActionCommand("removeColl"); - collMenuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - String[] params = { parentCollection.getName(), String.valueOf(slotNo) }; - String predefStepName = parentCollection instanceof Aggregation?"ClearSlot":"RemoveSlotFromCollection"; - try { - MainFrame.userAgent.execute(parentItem, predefStepName, params); - } catch (Exception e1) { - MainFrame.exceptionDialog(e1); - } - - } - }); - popup.add(collMenuItem); - popup.addSeparator(); - } - try { - ArrayList jobList = myItem.getJobList(MainFrame.userAgent); - ArrayList already = new ArrayList(); - if (jobList.size() > 0) { - for (Job thisJob : jobList) { - String stepName = thisJob.getStepName(); - if (already.contains(stepName)) - continue; - already.add(stepName); - JMenuItem menuItem = new JMenuItem(stepName); - menuItem.setActionCommand(stepName); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - execute(e.getActionCommand()); - } - }); - popup.add(menuItem); - - } - } - else { - JMenuItem noAct = new JMenuItem("No activities"); - noAct.setEnabled(false); - popup.add(noAct); - } - } catch (Exception ex) { - JMenuItem error = new JMenuItem("Error querying jobs"); - error.setEnabled(false); - popup.add(error); - } - - return popup; - } - - public void execute(String stepName) { - ItemDetails thisDetail = desktop.add(this); - thisDetail.runCommand("Execution", stepName); - } - - public ArrayList getTabs() { - - ArrayList requiredTabs = new ArrayList(); - requiredTabs.add("Properties"); - try { - String collNames = myItem.queryData(ClusterStorage.COLLECTION+"/all"); - if (collNames.length() > 0) - requiredTabs.add("Collection"); - } catch (Exception e) { } - requiredTabs.add("Execution"); - requiredTabs.add("History"); - requiredTabs.add("Viewpoint"); - requiredTabs.add("Workflow"); - return requiredTabs; - - } - - @Override - public DataFlavor[] getTransferDataFlavors() { - return supportedFlavours; - } - - @Override - public boolean isDataFlavorSupported(DataFlavor flavor) { - for (DataFlavor flavour : supportedFlavours) { - if (flavour.equals(flavor)) - return true; - } - return false; - } - - @Override - public Object getTransferData(DataFlavor flavor) - throws UnsupportedFlavorException, IOException { - if (flavor.equals(supportedFlavours[0])) - return this; - if (flavor.equals(supportedFlavours[1])) - return binding; - if (flavor.equals(supportedFlavours[2])) - return name; - throw new UnsupportedFlavorException(flavor); - } -} diff --git a/src/main/java/com/c2kernel/gui/tree/NodeRole.java b/src/main/java/com/c2kernel/gui/tree/NodeRole.java deleted file mode 100644 index df04e3a..0000000 --- a/src/main/java/com/c2kernel/gui/tree/NodeRole.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.c2kernel.gui.tree; - -import com.c2kernel.common.ObjectNotFoundException; -import com.c2kernel.gui.ItemTabManager; -import com.c2kernel.lookup.AgentPath; -import com.c2kernel.lookup.Path; -import com.c2kernel.lookup.RolePath; -import com.c2kernel.process.Gateway; -import com.c2kernel.utils.Logger; - -public class NodeRole extends NodeContext { - - RolePath role; - public NodeRole(Path path, ItemTabManager desktop) { - super(path, desktop); - role = (RolePath)path; - } - @Override - public void loadChildren() { - AgentPath[] agents; - try { - agents = Gateway.getLookup().getAgents(role); - for (AgentPath agentPath : agents) { - add (newNode(agentPath)); - } - } catch (ObjectNotFoundException e) { - Logger.error("Role "+role.getName()+" not found"); - } - super.loadChildren(); - } - - -} diff --git a/src/main/java/com/c2kernel/gui/tree/NodeSubscriber.java b/src/main/java/com/c2kernel/gui/tree/NodeSubscriber.java deleted file mode 100644 index 55f8aa9..0000000 --- a/src/main/java/com/c2kernel/gui/tree/NodeSubscriber.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.c2kernel.gui.tree; - -import com.c2kernel.lookup.Path; - - -public interface NodeSubscriber { - - public void add(Node newNode); - - public void remove(Path path); - - public void end(boolean more); -} diff --git a/src/main/java/com/c2kernel/gui/tree/NodeTransferHandler.java b/src/main/java/com/c2kernel/gui/tree/NodeTransferHandler.java deleted file mode 100644 index 56e61bd..0000000 --- a/src/main/java/com/c2kernel/gui/tree/NodeTransferHandler.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.c2kernel.gui.tree; - -import java.awt.datatransfer.Transferable; - -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.TransferHandler; - -import com.c2kernel.gui.ImageLoader; -import com.c2kernel.gui.MainFrame; -import com.c2kernel.gui.TreeBrowser; -import com.c2kernel.utils.Logger; - -public class NodeTransferHandler extends TransferHandler { - - TreeBrowser tree; - - public NodeTransferHandler(TreeBrowser treeBrowser) { - tree = treeBrowser; - } - - @Override - public int getSourceActions(JComponent c) { - return COPY_OR_MOVE; - } - - @Override - public Transferable createTransferable(JComponent c) { - Node selNode = tree.getSelectedNode(); - if (selNode instanceof Transferable) - return (Transferable)selNode; - else - return null; - } - - @Override - public boolean importData(TransferSupport support) { - if (!canImport(support)) { - return false; - } - Node dropNode = tree.getNodeAt(support.getDropLocation().getDropPoint()); - if (dropNode instanceof NodeCollection) { - NodeCollection collNode = (NodeCollection)dropNode; - NodeItem source; - try { - source = (NodeItem)support.getTransferable().getTransferData(NodeItem.dataFlavor); - return collNode.addMember(source.getItemPath()); - } catch (Exception e) { - Logger.error(e); - return false; - } - } - return super.importData(support); - } - - @Override - public boolean canImport(TransferSupport support) { - boolean isNode = support.isDataFlavorSupported(NodeItem.dataFlavor); - if (!isNode) return false; - Node dropNode = tree.getNodeAt(support.getDropLocation().getDropPoint()); - if (MainFrame.isAdmin && dropNode instanceof NodeCollection && ((NodeCollection)dropNode).isDependency()) - return true; - return false; - - } - - @Override - public Icon getVisualRepresentation(Transferable t) { - if (t instanceof NodeItem) - return (((NodeItem)t).getIcon()); - return ImageLoader.nullImg; - } -} diff --git a/src/main/java/org/cristalise/gui/Console.java b/src/main/java/org/cristalise/gui/Console.java new file mode 100644 index 0000000..6d84e51 --- /dev/null +++ b/src/main/java/org/cristalise/gui/Console.java @@ -0,0 +1,290 @@ +package org.cristalise.gui; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.io.BufferedReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.InterruptedIOException; +import java.io.PrintWriter; +import java.net.Socket; +import java.util.Properties; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; + +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.Logger; + + +/************************************************************************** + * + * $Revision: 1.10 $ + * $Date: 2005/10/05 07:39:37 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class Console extends JFrame { + JTextArea output; + JScrollPane scroll; + JTextField input; + JButton sendButton; + JButton toFileButton; + FileWriter logFile; + ConsoleConnection connection; + JFileChooser scriptLoader = new JFileChooser(); + static int bufferSize = Gateway.getProperties().getInt("Console.bufferSize", 200); + + public Console(String host, int port) { + super("Cristal Console - "+host); + GridBagLayout gridbag = new GridBagLayout(); + getContentPane().setLayout(gridbag); + output = new JTextArea("Type 'help' for help. . .\n"); + output.setEditable(false); + input = new JTextField(); + setSize(400, 600); + sendButton = new JButton("Send"); + sendButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + submit(); + } + }); + JButton clearButton = new JButton("Clear"); + clearButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + synchronized (output) { + output.setText(""); + } + } + }); + toFileButton = new JButton("Save"); + toFileButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (logFile == null) { + int returnValue = scriptLoader.showSaveDialog(null); + switch (returnValue) + { + case JFileChooser.APPROVE_OPTION : + try { + logFile = new FileWriter(scriptLoader.getSelectedFile()); + print ("Starting writing log to "+scriptLoader.getSelectedFile().getAbsolutePath()); + } catch (Exception ex) { + print(ex.getClass().getName()+": "+ex.getMessage()); + Logger.error(ex); + } + toFileButton.setText("Stop"); + case JFileChooser.CANCEL_OPTION : + case JFileChooser.ERROR_OPTION : + default : + } + } + else { + try { + logFile.close(); + } catch (Exception ex) { + logFile = null; + print(ex.getClass().getName()+": "+ex.getMessage()); + } + logFile = null; + toFileButton.setText("Save"); + } + } + }); + + + input.addKeyListener(new EnterListener(this)); + + scroll = new JScrollPane(output); + GridBagConstraints c = new GridBagConstraints(); + c.gridx=0; c.gridy=0; + c.fill=GridBagConstraints.BOTH; + c.weightx=1.0;c.weighty=1.0; + gridbag.setConstraints(scroll, c); + getContentPane().add(scroll); + + Box inputBox = Box.createHorizontalBox(); + inputBox.add(input); + inputBox.add(Box.createHorizontalStrut(5)); + inputBox.add(sendButton); + inputBox.add(clearButton); + inputBox.add(toFileButton); + c.gridy=1; c.fill=GridBagConstraints.HORIZONTAL; + c.weighty=0; + gridbag.setConstraints(inputBox, c); + getContentPane().add(inputBox); + + try { + // TODO: merge module script utilities together and prepend with namespace + Properties utilProps = FileStringUtility.loadConfigFile( Gateway.getResource().findTextResource("ScriptUtils.conf") ); + + Box utilBox = Box.createHorizontalBox(); + for (Object name2 : utilProps.keySet()) { + String name = (String) name2; + String value = utilProps.getProperty(name); + JButton newUtil = new JButton(name); + newUtil.setActionCommand(value); + newUtil.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + processUtil(e.getActionCommand()); + } + }); + utilBox.add(newUtil); + utilBox.add(Box.createHorizontalStrut(5)); + } + + c.gridy++; + gridbag.setConstraints(utilBox, c); + getContentPane().add(utilBox); + } catch (Exception ex) { // no domain utils + } + + + validate(); + connection = new ConsoleConnection(host, port, this); + new Thread(connection).start(); + addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent evt) { + if (connection!=null) connection.shutdown(); + dispose(); + } + }); + } + + @Override + public void setVisible(boolean visible) { + super.setVisible(visible); + if (visible) input.requestFocus(); + } + + public void processUtil(String command) { + int replace; + String text = input.getText(); + while ((replace = command.indexOf("%s")) > -1) { + command = command.substring(0, replace)+text+command.substring(replace+2); + } + connection.sendCommand(command); + } + + public void submit() { + connection.sendCommand(input.getText()); + input.setText(""); + } + + public void print(String line) { + synchronized (output) { + String currentText = output.getText()+line+"\n"; + while (output.getLineCount() > bufferSize) { + currentText = currentText.substring(currentText.indexOf("\n")+1); + output.setText(currentText); + } + output.setText(currentText); + output.setCaretPosition(output.getText().length()); + if (logFile != null) try { + logFile.write(line+"\n"); + } catch (IOException ex) { + logFile = null; + print("Error writing to file."); + } + } + } + + @Override + public void disable() { + synchronized (output) { + output.append("Lost connection"); + } + output.setEnabled(false); + input.setEnabled(false); + sendButton.setEnabled(false); + } + + private class EnterListener extends KeyAdapter + { + Console parent; + public EnterListener(Console parent) { + this.parent = parent; + } + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode()==10) { + parent.submit(); + } + } + }; + + private class ConsoleConnection implements Runnable { + String host; int port; Console parent; boolean keepConnected = true; + Socket conn; PrintWriter consoleOutput; BufferedReader consoleInput; + + + public ConsoleConnection(String host, int port, Console parent) { + Thread.currentThread().setName("Console Client to "+host+":"+port); + this.host = host; + this.port = port; + this.parent = parent; + } + + @Override + public void run() { + connect(); + while (keepConnected) { + try { + String line = consoleInput.readLine(); + if (line == null) { + parent.disable(); + keepConnected = false; + } + else + parent.print(line); + } catch (InterruptedIOException ex) { // timeout - ignore + } catch (IOException ex) { // error reading + parent.disable(); + keepConnected = false; + } + } + + try { + conn.close(); + } catch (IOException ex) { } + } + + public void sendCommand(String command) { + consoleOutput.println(command); + } + + public void shutdown() { + keepConnected = false; + } + + public void connect() { + parent.print("Connecting to "+host+":"+port); + try { + conn = new Socket(host, port); + conn.setKeepAlive(true); + conn.setSoTimeout(500); + consoleOutput = new PrintWriter(conn.getOutputStream(), true); + consoleInput = new BufferedReader(new InputStreamReader(conn.getInputStream())); + } catch (Exception ex) { + + } + } + } +} diff --git a/src/main/java/org/cristalise/gui/DomainKeyConsumer.java b/src/main/java/org/cristalise/gui/DomainKeyConsumer.java new file mode 100644 index 0000000..7b03e70 --- /dev/null +++ b/src/main/java/org/cristalise/gui/DomainKeyConsumer.java @@ -0,0 +1,16 @@ +package org.cristalise.gui; + +import org.cristalise.kernel.lookup.DomainPath; + +/** + * Things that can be told when a barcode etc is entered + * @version $Revision: 1.2 $ $Date: 2003/03/13 16:42:38 $ + * @author $Author: abranson $ + */ + +public interface DomainKeyConsumer { + public void push(DomainPath key); + + public void push(String name); + +} diff --git a/src/main/java/org/cristalise/gui/DomainKeyListener.java b/src/main/java/org/cristalise/gui/DomainKeyListener.java new file mode 100644 index 0000000..1e2370a --- /dev/null +++ b/src/main/java/org/cristalise/gui/DomainKeyListener.java @@ -0,0 +1,27 @@ +package org.cristalise.gui; + +import java.io.IOException; + +import javax.swing.ImageIcon; + +/** + * Interface for external key input classes (e.g. barcode scanner) + * @version $Revision: 1.5 $ $Date: 2004/10/20 14:10:21 $ + * @author $Author: abranson $ + */ + +public interface DomainKeyListener { + public void init(); + + public boolean enable() throws IOException; + + public void setConsumer(ItemFinder consumer); + + public void disable(); + + // return 25x25 icon for enable/disable button + public ImageIcon getIcon(); + + // tooltip for the button + public String getDescription(); +} diff --git a/src/main/java/org/cristalise/gui/DynamicTreeBuilder.java b/src/main/java/org/cristalise/gui/DynamicTreeBuilder.java new file mode 100644 index 0000000..8983d08 --- /dev/null +++ b/src/main/java/org/cristalise/gui/DynamicTreeBuilder.java @@ -0,0 +1,192 @@ +package org.cristalise.gui; + +import javax.swing.ImageIcon; +import javax.swing.JTree; +import javax.swing.SwingUtilities; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; + +import org.cristalise.gui.tree.Node; +import org.cristalise.gui.tree.NodeItem; +import org.cristalise.gui.tree.NodeSubscriber; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + +/** + * Installed as the user object on a single child node of a new node known to be composite. + *

Shows 'Loading . . .' when the branch is opened, but a TreeExpansionListener attempts to fire this thread off in the first child node. + *
When started, this thread will retrieve all of the real child nodes and add them to its parent while removing itself (hopefully for garbage collection) + * + * @version $Revision: 1.24 $ $Date: 2004/12/15 12:12:06 $ + * @author $Author: abranson $ + */ + +public class DynamicTreeBuilder extends Node implements NodeSubscriber { + private DefaultTreeModel treeModel; + private final DefaultMutableTreeNode parent; + public short state = IDLE; + public static final short IDLE = 0; + public static final short LOADING = 1; + public static final short PARTIAL = 2; + public static final short FINISHED = 3; + private final DefaultMutableTreeNode loading; + private static ImageIcon loadIcon = ImageLoader.findImage("loading.gif"); + private static ImageIcon pauseIcon = ImageLoader.findImage("reload.gif"); + + /** + * The newly created DynamicTreeBuilder records its parent node - the one for which it will build child nodes for. + * @param nodeClicked The Parent Tree Node that will be populated. + * @see NodeItem + * @see TreeDisplay*/ + public DynamicTreeBuilder(DefaultMutableTreeNode parent, ItemTabManager desktop) { + super(desktop); + this.parent = parent; + loading = new DefaultMutableTreeNode(this); + } + + /** + * Before the tree builder can execute, it needs to be given references to the tree and NodeFactory needed to create the new nodes. + * @param myNodeFactory The NodeFactory that can be queried for new NodeItems. + * @param parentTree The JTree in which this node is currently contained. + */ + public void buildInfo(JTree parentTree) { + this.treeModel = (DefaultTreeModel)parentTree.getModel(); + } + + public void start() { + // find the clicked tree node + Node parentNode = (Node)parent.getUserObject(); + Logger.msg(2, "DynamicTreeBuilder.start() - Filling in children of '"+parentNode.toString()+"'"); + if (state == IDLE) + parentNode.subscribeNode(this); + else + parentNode.loadMore(); + state = LOADING; + } + + /** + * Used by the JTree to find the text representation of the node. + */ + @Override + public String toString() { + switch (state) { + case IDLE: + return Language.translate("Initializing Tree Node Loader"); + case LOADING: + return Language.translate("Loading . . ."); + case PARTIAL: + return Language.translate("Double-click to load more"); + case FINISHED: + return Language.translate("Done"); + default: + return ""; + } + + } + + @Override + public ImageIcon getIcon() { + if (state == LOADING) + return loadIcon; + else + return pauseIcon; + } + + @Override + public DefaultMutableTreeNode getTreeNode() { + return loading; + } + + @Override + public void add(Node newNode) { + Logger.msg(2, "DynamicTreeBuilder.add() - Received item for tree. Name: "+newNode); + + // have we inserted the node yet? + SwingUtilities.invokeLater(new TreeAddThread(newNode)); + } + + class TreeAddThread implements Runnable { + Node newNode; + TreeAddThread(Node newNode) { + this.newNode = newNode; + } + @Override + public void run() { + boolean inserted = false; + DefaultMutableTreeNode newTreeNode = newNode.getTreeNode(); + // loop though all children unless we have done the insertion + for (int i=0; i= 0) { + // if the next string is 'greater than' ours, insert the node before + treeModel.insertNodeInto(newTreeNode, parent, i); + inserted = true; + break; + } + + } + // if we haven't inserted yet, it must go at the end. + + if (!inserted) + treeModel.insertNodeInto(newTreeNode, parent, parent.getChildCount()); + } + + } + + class TreeRemoveThread implements Runnable { + DefaultMutableTreeNode oldNode; + TreeRemoveThread(DefaultMutableTreeNode oldNode) { + this.oldNode = oldNode; + } + + @Override + public void run() { + treeModel.removeNodeFromParent(oldNode); + } + } + + @Override + public void end(boolean more) { + if (more) { + state = PARTIAL; + } + else { + state = FINISHED; + synchronized(treeModel) { + if (loading.getParent() != null) + SwingUtilities.invokeLater(new TreeRemoveThread(loading)); + } + } + } + + @Override + public void remove(Path path) { + synchronized (treeModel) { + for (int i=0; i imgCache = new Hashtable(); + static public final ImageIcon nullImg = new ImageIcon(new byte[] { 0 }); + static private final ArrayList reportedMissingIcons = new ArrayList(); + + /** + * Gets an image from the resource directories + * + * @param resName - filename after resources/images + * @return + */ + static public ImageIcon findImage(String resName) { + try { + for (String ns : Gateway.getResource().getModuleBaseURLs().keySet()) { + try { + return getImage(ns, resName); + } catch (ObjectNotFoundException ex) { } + } + return getImage(null, resName); + } catch (ObjectNotFoundException ex) { + if (!reportedMissingIcons.contains(resName)) { + Logger.warning("Image '"+resName+"' not found. Using null icon"); + reportedMissingIcons.add(resName); + } + return nullImg; + } + } + + static public ImageIcon getImage(String ns, String resName) throws ObjectNotFoundException { + if (resName == null) + return nullImg; + + if (imgCache.containsKey(ns+'/'+resName)) { + return imgCache.get(ns+'/'+resName); + } + + URL imgLocation = null; + if (ns == null) + try { + imgLocation = Gateway.getResource().getKernelResourceURL("images/"+resName); + } catch (MalformedURLException ex) { } + else + try { + imgLocation = Gateway.getResource().getModuleResourceURL(ns, "images/"+resName); + } catch (MalformedURLException ex) { } + + if (imgLocation!= null) { + ImageIcon newImg = new ImageIcon(imgLocation); + + if (newImg.getIconHeight() > -1) { + imgCache.put(ns+'/'+resName, newImg); + Logger.msg(3, "Loaded "+resName+" "+newImg.getIconWidth()+"x"+newImg.getIconHeight()); + return newImg; + } + } + throw new ObjectNotFoundException(); + } + +} diff --git a/src/main/java/org/cristalise/gui/ItemDetails.java b/src/main/java/org/cristalise/gui/ItemDetails.java new file mode 100644 index 0000000..960b2d2 --- /dev/null +++ b/src/main/java/org/cristalise/gui/ItemDetails.java @@ -0,0 +1,233 @@ +package org.cristalise.gui; + +import java.awt.BorderLayout; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; + +import javax.swing.ImageIcon; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.SwingConstants; +import javax.swing.event.ChangeListener; + +import org.cristalise.gui.tabs.ItemTabPane; +import org.cristalise.gui.tree.NodeItem; +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + +/** + * The tab pane for each viewed item + * @version $Revision: 1.38 $ $Date: 2005/06/27 15:16:14 $ + * @author $Author: abranson $ + */ +public class ItemDetails extends JPanel implements ChangeListener, Runnable { + protected JTabbedPane myTabbedPane = new JTabbedPane(SwingConstants.BOTTOM); + protected JPanel itemTitlePanel; + private ItemTabManager desktopManager; + protected NodeItem myItem; + protected HashMap childPanes = new HashMap(); + protected String startTab; + protected String startCommand = null; + protected boolean initialized = false; + + public ItemDetails(NodeItem thisItem) { + super(); + startTab = MainFrame.getPref("DefaultStartTab", "Properties"); + myItem = thisItem; + } + + @Override + public void run() { + Thread.currentThread().setName("Entity Pane Builder"); + ItemTabPane componentToAdd = null; + setLayout(new BorderLayout()); + itemTitlePanel = getItemTitlePanel(); + add(itemTitlePanel, BorderLayout.NORTH); + add(myTabbedPane); + + // decide which tabs to create + ArrayList requiredTabs = myItem.getTabs(); + + for (Object name2 : requiredTabs) { + String tabName = (String)name2; + if (tabName != null) { + //create class instances and initialise + Class myClass = null; + //look up the required TabbedPane + try { + myClass = Class.forName(this.getClass().getPackage().getName() + ".tabs." + tabName + "Pane"); + Logger.msg(2, "ItemDetails. - Creating ItemTabPane instance: " + + this.getClass().getPackage().getName() + ".tabs." + tabName + "Pane"); + componentToAdd = (ItemTabPane)myClass.newInstance(); + } catch (ClassNotFoundException e) { + Logger.msg(2, "ItemDetails. - No specialist tab found for " + tabName + ". Using default."); + } catch (InstantiationException e) { + Logger.msg(0, "ItemDetails. - Instantiation Error! " + e); + } catch (IllegalAccessException e) { + Logger.msg(0, "ItemDetails. - Illegal Method Access Error! Class was probably not a ItemTabPane: " + e); + } + if (componentToAdd == null) componentToAdd = new ItemTabPane(tabName, null); + componentToAdd.setParent(this); + + //adds the component to the panel + childPanes.put(componentToAdd, new Boolean(false)); + + int placement = myTabbedPane.getTabCount(); + if (tabName.equals("Properties")) // must be first + placement = 0; + myTabbedPane.insertTab(componentToAdd.getTabName(), null, componentToAdd, null, placement); + } + } + initialized = true; + if (!(requiredTabs.contains(startTab))) { + startTab = "Properties"; + startCommand = null; + } + runCommand(Language.translate(startTab), startCommand); + myTabbedPane.setVisible(true); + myTabbedPane.addChangeListener(this); + validate(); + MainFrame.progress.stopBouncing("Done"); + + } + + @Override + public void stateChanged(javax.swing.event.ChangeEvent p1) { + initialisePane((ItemTabPane)myTabbedPane.getSelectedComponent()); + } + + public void initialisePane(ItemTabPane pane) { + Boolean isInit = childPanes.get(pane); + if (isInit.booleanValue() == false) { + Logger.msg(4,"Initialising "+pane.getTabName()); + pane.initForItem(myItem); + childPanes.put(pane, new Boolean(true)); + validate(); + } + } + + public ItemTabManager getDesktopManager() { + return desktopManager; + } + + public void setDesktopManager(ItemTabManager newDesktopManager) { + desktopManager = newDesktopManager; + } + + public JPanel getItemTitlePanel() { + JPanel titlePanel = new JPanel(); + JComponent current; + // Use gridbag layout for title + GridBagLayout gridbag = new GridBagLayout(); + GridBagConstraints c = new GridBagConstraints(); + titlePanel.setLayout(gridbag); + // Place Item Icon + c.gridx = 0; + c.gridy = 0; + c.gridheight = GridBagConstraints.REMAINDER; + c.anchor = GridBagConstraints.NORTH; + c.ipadx = 5; + c.ipady = 5; + ImageIcon icon = ImageLoader.findImage("typeicons/"+myItem.getIconName()+"_32.png"); + if (icon==ImageLoader.nullImg) icon = ImageLoader.findImage("typeicons/item_32.png"); + current = new JLabel(icon); + gridbag.setConstraints(current, c); + titlePanel.add(current); + // Place Name/ID Label + current = new JLabel(myItem.getName() + " (" + myItem.getItemPath().getUUID().toString() + ")"); + c.gridx = 1; c.gridy = 0; c.gridheight = 1; + c.anchor = GridBagConstraints.NORTH; c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1.0; c.ipadx = 2; c.ipady = 2; + current.setFont(new Font("Helvetica", Font.PLAIN, 18)); + gridbag.setConstraints(current, c); + titlePanel.add(current); + // Place Type Label + current = new JLabel(myItem.getType()); + c.gridx = 1; c.gridy = 2; c.gridheight = 1; + c.anchor = GridBagConstraints.CENTER; c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1.0; + current.setFont(new Font("Helvetica", Font.PLAIN, 12)); + gridbag.setConstraints(current, c); + titlePanel.add(current); + return titlePanel; + } + + public void discardTabs() { + myTabbedPane.removeChangeListener(this); + myTabbedPane.removeAll(); + for (Iterator iter = childPanes.keySet().iterator(); iter.hasNext();) { + ItemTabPane element = iter.next(); + element.destroy(); + iter.remove(); + } + } + + public ItemPath getItemPath() + { + return myItem.getItemPath(); + } + + public void closeTab() { + desktopManager.remove(myItem.getItemPath()); + Logger.msg(5,"Remove master Tab :"+myItem.getType()+ " SysKey "+myItem.getItemPath()); + myItem.getItem().dumpSubscriptions(5); + } + + public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().equals("close")) + closeTab(); + } + + public void runCommand(String tab, String command) { + if (initialized) { + int tabIndex = findTab(tab); + Logger.msg(3, "Running command "+tab+" "+command+" ("+tabIndex+")"); + if (tabIndex == -1) { + Logger.error("Tab "+tab+" not found for command "+command); + return; + } + ItemTabPane startPane = (ItemTabPane)myTabbedPane.getComponentAt(tabIndex); + myTabbedPane.setSelectedIndex(tabIndex); + initialisePane(startPane); + if (command!= null) startPane.runCommand(command); + } + else + { + Logger.msg(3, "Storing command "+tab+" "+command+" until initialised."); + startTab = tab; + startCommand = command; + } + } + + protected int findTab(String tabName) { + for (int i=0; i< myTabbedPane.getTabCount(); i++) { + ItemTabPane thisPane = (ItemTabPane)myTabbedPane.getComponentAt(i); + if (thisPane.getTabName().equals(tabName)) + return i; + } + return -1; + } + + + public void refresh() + { + } + /** + * + */ + @Override + protected void finalize() throws Throwable { + Logger.msg(7, "EntityDetails "+myItem.getItemPath()+" reaped"); + super.finalize(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/cristalise/gui/ItemFinder.java b/src/main/java/org/cristalise/gui/ItemFinder.java new file mode 100644 index 0000000..04f5bcf --- /dev/null +++ b/src/main/java/org/cristalise/gui/ItemFinder.java @@ -0,0 +1,223 @@ +package org.cristalise.gui; + +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.io.IOException; +import java.util.Iterator; +import java.util.StringTokenizer; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JTextField; +import javax.swing.JToggleButton; + +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.lookup.Lookup; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + +public class ItemFinder extends Box implements Runnable { + JTextField inputField; + JButton findButton; + JButton findNextButton; + GridBagLayout gridbag = new GridBagLayout(); + Lookup lookup = Gateway.getLookup(); + DomainKeyConsumer defaultConsumer = null; + DomainKeyConsumer currentConsumer = null; + Iterator matches; + Path rootNode = MainFrame.userNode.getPath(); + + static protected ImageIcon mFindIcon = null; + static protected ImageIcon mNextIcon = null; + static { + try + { + mNextIcon =ImageLoader.findImage("next.png"); + mFindIcon =ImageLoader.findImage("find.png"); + } + catch (Exception e) + { + Logger.error("Couldn't load images: " + e); + } + } + + public ItemFinder() { + super(BoxLayout.X_AXIS); + initPanel(); + } + + public void pushNewKey(String key) { + inputField.setText(key); + runSearch(); + } + + public void setDefaultConsumer(DomainKeyConsumer newConsumer) { + defaultConsumer = newConsumer; + currentConsumer = newConsumer; + } + + public void setConsumer(DomainKeyConsumer newConsumer, String label) { + currentConsumer = newConsumer; + findButton.setText(label); + } + + public void clearConsumer(DomainKeyConsumer oldConsumer) { + if (currentConsumer == oldConsumer) { + currentConsumer = defaultConsumer; + findButton.setText(""); + } + } + + private void initPanel() { + + JLabel search = new JLabel(" "+Language.translate("Search")+":"); + add(search); + add(Box.createHorizontalStrut(7)); + + inputField = new JTextField(20); + add(inputField); + add(Box.createHorizontalStrut(5)); + inputField.addActionListener( new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + pushNewKey(inputField.getText()); + } + }); + + findButton = new JButton(mFindIcon);//(Language.translate("Find")); + findButton.setMargin(new Insets(2, 5, 2, 5)); + findButton.addActionListener( new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + pushNewKey(inputField.getText()); + } + }); + add(findButton); + add(Box.createHorizontalStrut(5)); + + findNextButton = new JButton(mNextIcon);//(Language.translate("Next")); + findNextButton.setMargin(new Insets(2, 5, 2, 5)); + findNextButton.addActionListener( new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + nextMatch(); + } + }); + findNextButton.setEnabled(false); + add(findNextButton); + add(Box.createHorizontalStrut(15)); + + // create plugins + Logger.msg(6, "ItemFinder() - creating plugins"); + String requiredListeners = Gateway.getProperties().getString("DomainKeyListeners"); + if (requiredListeners != null) { + StringTokenizer tok = new StringTokenizer(requiredListeners, ","); + while (tok.hasMoreTokens()) { + String listenerName = tok.nextToken(); + Logger.msg(6, "ItemFinder() - creating a " + listenerName); + try { + Class listenerClass = Class.forName(listenerName); + DomainKeyListener newListener = (DomainKeyListener)listenerClass.newInstance(); + newListener.init(); newListener.setConsumer(this); + JToggleButton listenerButton = new JToggleButton(newListener.getIcon(), false); + listenerButton.addItemListener(new ListenerButtonListener(newListener, listenerButton)); + listenerButton.setMargin(new Insets(0, 2, 0, 2)); + listenerButton.setToolTipText("Enable "+newListener.getDescription()); + add(listenerButton); + add(Box.createHorizontalStrut(7)); + } catch (Exception e) { + Logger.error("ItemFinder() - could not create a "+listenerName+": "+e); + } + } + add(Box.createHorizontalGlue()); + } + } + + private void runSearch() { + Thread searcher = new Thread(this); + searcher.start(); + } + + @Override + public void run() { + Thread.currentThread().setName("Entity Search"); + String searchTerm = inputField.getText(); + if (searchTerm.length() == 0) return; // don't allow null searches + + findButton.setEnabled(false); findNextButton.setEnabled(false); + MainFrame.progress.startBouncing("Searching. Please Wait"); + findNextButton.setEnabled(false); + String term = inputField.getText(); +// The following block does property searching when the field contains a colon, but that returns EntityPaths, which the tree can't handle +// int colonPos = term.indexOf(':'); +// if (colonPos > 0) +// matches = lookup.search(rootNode,term.substring(0, colonPos), term.substring(colonPos+1)); +// else + matches = lookup.search(rootNode,term); + if (!matches.hasNext()) { + MainFrame.progress.stopBouncing("No results"); + currentConsumer.push(searchTerm); // for subscribers who don't care if it exists + findButton.setEnabled(true); + return; + } + MainFrame.progress.stopBouncing("Selecting first match."); + nextMatch(); + + } + + void nextMatch() { + findButton.setEnabled(false); findNextButton.setEnabled(false); + DomainPath nextMatch = (DomainPath)matches.next(); + try + { + currentConsumer.push(nextMatch); + } + catch (NullPointerException e) + { + //case the item searched is not found ! + } + findButton.setEnabled(true); + findNextButton.setToolTipText("Click to show next match"); + if (matches.hasNext()) findNextButton.setEnabled(true); + } + + private class ListenerButtonListener implements ItemListener { + private final DomainKeyListener listener; + private final JToggleButton listenerButton; + + public ListenerButtonListener(DomainKeyListener newListener, JToggleButton listenerButton) { + this.listener = newListener; + this.listenerButton = listenerButton; + } + + @Override + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + // Switch on + try { + if (!(listener.enable())) listenerButton.doClick(); // allow plugins to disable themselves + } catch (IOException ex) { + JOptionPane.showMessageDialog(null, ex.getMessage(), "Error initialising "+listener.getDescription(), JOptionPane.ERROR_MESSAGE); + listenerButton.doClick(); + } + listenerButton.setToolTipText("Disable "+listener.getDescription()); + } else { + // Switch off + listener.disable(); + listenerButton.setToolTipText("Enable "+listener.getDescription()); + } + } + } + +} diff --git a/src/main/java/org/cristalise/gui/ItemTabManager.java b/src/main/java/org/cristalise/gui/ItemTabManager.java new file mode 100644 index 0000000..4543817 --- /dev/null +++ b/src/main/java/org/cristalise/gui/ItemTabManager.java @@ -0,0 +1,84 @@ +package org.cristalise.gui; +import java.awt.GridLayout; +import java.util.ArrayList; +import java.util.HashMap; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; + +import org.cristalise.gui.tabs.JTabbedPaneWithCloseIcons; +import org.cristalise.gui.tree.NodeItem; +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.utils.Logger; + + +/** + * Keeps + * + * @version $Revision: 1.12 $ $Date: 2005/09/12 14:56:19 $ + * @author $Author: abranson $ + */ + +public class ItemTabManager extends JPanel +{ + + protected HashMap openItems = new HashMap(); + protected JTabbedPaneWithCloseIcons tabbedPane = new JTabbedPaneWithCloseIcons(); + //JTabbedPane tabbedPane = new JTabbedPane(); + MenuBuilder myMenuBuilder; + + + public ItemTabManager() { + super(); + setLayout(new GridLayout(1,1)); + setBorder(BorderFactory.createLoweredBevelBorder()); + + add(tabbedPane); + } + + public ItemDetails add(NodeItem thisItem) { + + ItemDetails requestedDetails; + if (!openItems.containsKey(thisItem.getItemPath())) { + MainFrame.progress.startBouncing("Opening "+thisItem.getName()+". Please wait."); + Logger.msg(1, "ItemWindowManager.add() - Window for syskey "+thisItem.getItemPath()+" not found. Opening new one."); + requestedDetails = new ItemDetails(thisItem); + Thread itemLoader = new Thread(requestedDetails); + itemLoader.start(); + openItems.put(thisItem.getItemPath(), requestedDetails); + requestedDetails.setDesktopManager(this); + + // get currently selected item to set location + tabbedPane.addTab(thisItem.getName(), thisItem.getIcon(), requestedDetails, thisItem.getType()); + + } + else { //opened window but different nodeitem + requestedDetails = openItems.get(thisItem.getItemPath()); + } + tabbedPane.setSelectedComponent(requestedDetails); + return requestedDetails; + } + + public void setMenuBuilder(MenuBuilder myMenuBuilder) { + this.myMenuBuilder = myMenuBuilder; + } + + public void remove(ItemPath itemPath) { + if (!openItems.containsKey(itemPath)) return; + ItemDetails tabToClose = openItems.get(itemPath); + tabbedPane.remove(tabToClose); + tabToClose.discardTabs(); + openItems.remove(itemPath); + } + + public void closeAll(boolean keepOpen) { + ArrayList toRemove = new ArrayList(); + for (ItemPath element : openItems.keySet()) { + if (keepOpen && openItems.get(element).equals(tabbedPane.getSelectedComponent())) continue; + toRemove.add(element); + } + for (ItemPath element : toRemove) { + remove(element); + } + } +} diff --git a/src/main/java/org/cristalise/gui/LoginBox.java b/src/main/java/org/cristalise/gui/LoginBox.java new file mode 100644 index 0000000..dc38f8c --- /dev/null +++ b/src/main/java/org/cristalise/gui/LoginBox.java @@ -0,0 +1,326 @@ +package org.cristalise.gui; + +/** + *

Title:

+ *

Description:

+ *

Copyright: Copyright (c) 2003

+ *

Company:

+ * @author not attributable + * @version 1.0 + */ +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; +import javax.swing.border.EmptyBorder; + +import org.cristalise.kernel.entity.proxy.AgentProxy; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + + +//import com.borland.jbcl.layout.*; + +/** + *

Title:

+ *

Description:

+ *

Copyright: Copyright (c) 2003

+ *

Company:

+ * @author not attributable + * @version 1.0 + */ + +public class LoginBox extends JFrame { + + public String errorMessage=new String(""); + String title; + private int maxNumberLogon; + public boolean action = false; + public int loginAttemptNumber= 0; + JLabel passwordLabel = new JLabel(); + JTextField username = new JTextField(); + JButton OK = new JButton(); + JLabel errorLabel = new JLabel(); + JPasswordField password = new JPasswordField(); + JButton Cancel = new JButton(); + JLabel userLabel = new JLabel(); + ImageIcon imageMainHolder = new ImageIcon(); + JLabel pictureLabel = new JLabel(); + GridBagLayout gridBagLayout1 = new GridBagLayout(); + MainFrame mainFrameFather; + public static AgentProxy userAgent; + private boolean logged; + private boolean errorSet; + + public LoginBox(int attempt,String title,String lastUser,String bottomMessage, + javax.swing.ImageIcon imageHolder,MainFrame mainFrame) { + String iconFile = Gateway.getProperties().getString("AppIcon"); + if (iconFile != null) + this.setIconImage(ImageLoader.findImage(iconFile).getImage()); + this.errorLabel.setText(bottomMessage); + if (errorMessage.compareTo("")!=0) this.errorLabel.setText(errorMessage); + mainFrameFather=mainFrame; + imageMainHolder=imageHolder; + try { + jbInit(); + } + catch(Exception e) { + e.printStackTrace(); + } + if (attempt==0) maxNumberLogon=5; + else maxNumberLogon=attempt; + if (title == null) + this.title = "Cristal"; + else + this.title = title; + setTitle(Language.translate("Log in to ")+title); + username.setText(lastUser); + + } +//OK button pressed OR Enter Hit + private void loginClicked(){ + errorSet=false; + try { + if (this.getUser().length()>0 && this.getPassword().length()>0) + userAgent = Gateway.connect(this.getUser(), this.getPassword(), title); + logged = (userAgent != null); + Logger.msg(7, "AbstractMain::standardSetUp() - Gateway.connect() OK."); + } + catch (Exception ex) { + String message = ex.getMessage(); + int i = ex.getMessage().indexOf(' '); + if (i > -1 ) message = message.substring(i); + //Here us elanguage translate I guess :) + //if (message.length()>65 && message.substring(1,5).compareTo("User")==0) + // message = (message.substring(1,50)+ "... not found" ); + this.errorLabel.setText(message); + Logger.error(message); + logged= false; + errorSet=true; + } + if (!logged) { + Logger.msg("Login attempt "+loginAttemptNumber+" of "+maxNumberLogon+" failed"); + if (loginAttemptNumber>=maxNumberLogon) Logger.die("Login failure limit reached"); + if (!errorSet) this.errorLabel.setText(Language.translate("Please enter username & password")); +// int posx=xMov+120; +// int posy=yMov; +// if (posy<135) posy=135; +// float texstSize = errorLabel.getFont().getSize2D(); +// if (posx-xMov pluginClass = Class.forName(pluginName); + Executor domainExecutor = (Executor)pluginClass.newInstance(); + plugins.addItem(domainExecutor); + } catch (Exception ex) { + Logger.error("Could not load the executor plugin "+pluginName); + } + } + } + return plugins; + } + protected JSplitPane getSplitPanel() + { + // create the split pane, and add the Tree to it. + if (splitPane == null) + { + splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, treeBrowser, myDesktopManager); + splitPane.setDividerSize(5); + splitPanePos = Integer.parseInt(getPref("SplitPanePosition", "200")); + getSplitPanel().setDividerLocation(splitPanePos); + } + return splitPane; + } + + static public void exceptionDialog(Exception ex) + { + String className = ex.getClass().getSimpleName(); + String error = ex.getMessage(); + if (ex instanceof UserException) + error = error.substring(error.indexOf(' ') + 1); + JOptionPane.showMessageDialog(null, error, className, JOptionPane.ERROR_MESSAGE); + } + +} diff --git a/src/main/java/org/cristalise/gui/MenuBuilder.java b/src/main/java/org/cristalise/gui/MenuBuilder.java new file mode 100644 index 0000000..f543870 --- /dev/null +++ b/src/main/java/org/cristalise/gui/MenuBuilder.java @@ -0,0 +1,282 @@ +package org.cristalise.gui; +import java.awt.Dimension; +import java.awt.event.ActionListener; +import java.awt.event.ItemListener; +import java.util.HashMap; +import java.util.Iterator; + +import javax.swing.Box; +import javax.swing.ButtonGroup; +import javax.swing.Icon; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UIManager.LookAndFeelInfo; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import javax.swing.text.html.HTMLEditorKit; + +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.property.Property; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + +/** + * @version $Revision: 1.47 $ $Date: 2006/03/03 13:52:21 $ + * @author $Author: abranson $ + */ +public class MenuBuilder extends JMenuBar implements ActionListener, ItemListener, HyperlinkListener +{ + + protected UIManager.LookAndFeelInfo[] availableViews = UIManager.getInstalledLookAndFeels(); + protected MainFrame myParentFrame; + protected JMenu fileMenu; + protected JMenu consoleMenu; + protected JMenu styleMenu; + protected JMenu prefMenu; + protected JMenu helpMenu; + protected HashMap availableMenus = new HashMap(); + + public MenuBuilder() + {} + + /** Creates new DynamicMenuBuilder */ + public MenuBuilder(MainFrame parentFrame) + { + myParentFrame = parentFrame; + fileMenu = new JMenu(Language.translate("File")); + consoleMenu = new JMenu(Language.translate("Console")); + styleMenu = new JMenu(Language.translate("Style")); + prefMenu = new JMenu("Preferences"); + helpMenu = new JMenu(Language.translate("Help")); + availableMenus.put("file", fileMenu); + availableMenus.put("console", consoleMenu); + availableMenus.put("preferences", prefMenu); + availableMenus.put("style", styleMenu); + availableMenus.put("help", helpMenu); + + addMenuItem(Language.translate("Close All"), "file", null, 0); + addMenuItem(Language.translate("Close Others"), "file", null, 0); + fileMenu.insertSeparator(2); + addMenuItem(Language.translate("Exit"), "file", null, 0); + + addMenuItem(Language.translate("Local console"), "console", null, 0); + consoleMenu.insertSeparator(5); + addServerConsoles(); + + ButtonGroup styleButtonGroup = new ButtonGroup(); + for (LookAndFeelInfo availableView : availableViews) + addMenuItem(availableView.getName(), "style", styleButtonGroup, 0); + + addMenuItem(Language.translate("Tree Browser"), "preferences", null, MainFrame.getPref("ShowTree", "true").equals("true")?2:1); + addMenuItem(Language.translate("Outcome Field Help"), "preferences", null, MainFrame.getPref("ShowHelp", "true").equals("true")?2:1); + addMenuItem(Language.translate("Graph Properties"), "preferences", null, MainFrame.getPref("ShowProps", "true").equals("true")?2:1); + addMenuItem(Language.translate("About"), "help", null, 0); + + add(fileMenu); + add(consoleMenu); + add(styleMenu); + add(prefMenu); + add(helpMenu); + } + /** + * + */ + private void addServerConsoles() { + Iterator servers = Gateway.getLookup().search(new DomainPath("/servers"), new Property("Type", "Server", false)); + while(servers.hasNext()) { + Path thisServerPath = (Path)servers.next(); + try { + ItemPath serverItemPath = thisServerPath.getItemPath(); + String serverName = ((Property)Gateway.getStorage().get(serverItemPath, ClusterStorage.PROPERTY+"/Name", null)).getValue(); + String portStr = ((Property)Gateway.getStorage().get(serverItemPath, ClusterStorage.PROPERTY+"/ConsolePort", null)).getValue(); + addMenuItem(serverName+":"+portStr, "console", null, 0); + } catch (Exception ex) { + Logger.error("Exception retrieving proxy server connection data for "+thisServerPath); + Logger.error(ex); + } + } + + } + + /** + * Adds a menu item to a menu. Adds an action listener to the menu item. + */ + public void addMenuItem(String itemName, String menuName, ButtonGroup bg, int checkBox) + { + //checks to see if the menu to add the item to exists + if (availableMenus.containsKey(menuName)) + { + JMenuItem myItem = new JMenuItem(itemName); + if (bg != null) + { + //if the menu item equals the current style, set it selected + myItem = new JRadioButtonMenuItem(itemName, UIManager.getLookAndFeel().getName().equals(itemName)); + bg.add(myItem); + } + if (checkBox != 0) + { + myItem = new JCheckBoxMenuItem(itemName, checkBox == 2); + } + myItem.addActionListener(this); + JMenu myMenu = availableMenus.get(menuName); + myMenu.add(myItem); + } + } + //checks to see if the event dispatched is one of the + //styles that belong to the UIManager + public int isStyleChange(String style) + { + for (int i = 0; i < availableViews.length; i++) + { + if (style.equals(availableViews[i].getName())) + return i; + } + return -1; + } + //listens for events performed on the menu items + @Override + public void actionPerformed(java.awt.event.ActionEvent e) + { + String s = e.getActionCommand(); + int i = isStyleChange(s); + if (s.equals("Close All") || s.equals("Close Others")) { + MainFrame.myDesktopManager.closeAll(s.equals("Close Others")); + } + else if (s.equals(Language.translate("Exit"))) + myParentFrame.exitForm(); + else if (s.equals(Language.translate("About"))) + showAboutWindow(); + else if (i >= 0) + { + try + { + UIManager.setLookAndFeel(availableViews[i].getClassName()); + SwingUtilities.updateComponentTreeUI(myParentFrame); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + else if (s.equals(Language.translate("Tree Browser"))) + { + myParentFrame.toggleTree(); + } + else if (s.indexOf(":")>0) { // server console + try + { + String[] serverDetails = s.split(":"); + new Console(serverDetails[0], Integer.parseInt(serverDetails[1])).setVisible(true); + } + catch (Exception ex) + { + Logger.error(ex); + } + } + else if (s.equals(Language.translate("Local console"))) { + try + { + new Console("localhost", Logger.getConsolePort()).setVisible(true); + } + catch (Exception ex) + { + Logger.error(ex); + } + } + else if (s.equals(Language.translate("Outcome Field Help"))) { + MainFrame.setPref("ShowHelp", String.valueOf(!MainFrame.getPref("ShowHelp", "true").equals("true"))); + } + else if (s.equals(Language.translate("Graph Properties"))) { + MainFrame.setPref("ShowProps", String.valueOf(!MainFrame.getPref("ShowProps", "true").equals("true"))); + } + else + Logger.msg(1, "MenuBuilder.actionPerformed() - No action associated with the event received"); + } + //constructs an about dialog + public void showAboutWindow() + { + JOptionPane myPane = new JOptionPane(); + Box about = Box.createVerticalBox(); + + String aboutInfo; + try + { + aboutInfo = FileStringUtility.file2String(Gateway.getProperties().getString("about")); + } + catch (Exception e) + { + aboutInfo = Language.translate("Cristal 2 Itembrowser"); + } + JLabel title = new JLabel(aboutInfo); + about.add(title); + + about.add(new JLabel("Kernel version: "+Gateway.getKernelVersion())); + about.add(new JLabel("Modules loaded: "+Gateway.getModuleManager().getModuleVersions())); + // get license info + + StringBuffer lictxt = new StringBuffer(); + try { + lictxt.append(Gateway.getResource().getTextResource(null, "textFiles/license.html")); + } catch (ObjectNotFoundException e) { } // no kernel license found + for (String ns : Gateway.getResource().getModuleBaseURLs().keySet()) { + String domlictxt; + try { + domlictxt = Gateway.getResource().getTextResource(ns, "license.html"); + lictxt.append(domlictxt).append("\n"); + } catch (ObjectNotFoundException e) { } + + } + + + JEditorPane license = new JEditorPane(); + license.setEditable(false); + license.setEditorKit(new HTMLEditorKit()); + license.setContentType("text/html"); + license.addHyperlinkListener(this); + license.setText(lictxt.toString()); + JScrollPane scroll = new JScrollPane(license); + scroll.setPreferredSize(new Dimension(300,200)); + license.setCaretPosition(0); + + about.add(scroll); + myPane.setMessage(about); + myPane.setMessageType(JOptionPane.INFORMATION_MESSAGE); + JDialog dialog = myPane.createDialog(null, Language.translate("About")); + dialog.setResizable(false); + Icon icon = ImageLoader.findImage(Gateway.getProperties().getString("banner")); + myPane.setIcon(icon); + dialog.pack(); + dialog.setVisible(true); + } + + @Override +public void hyperlinkUpdate(HyperlinkEvent e) { + try { + if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) + Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler "+e.getURL().toString()); + } catch (Exception ex) { + MainFrame.exceptionDialog(ex); + } + } + + @Override + public void itemStateChanged(java.awt.event.ItemEvent e) + { + } +} diff --git a/src/main/java/org/cristalise/gui/ProgressReporter.java b/src/main/java/org/cristalise/gui/ProgressReporter.java new file mode 100644 index 0000000..963e1e6 --- /dev/null +++ b/src/main/java/org/cristalise/gui/ProgressReporter.java @@ -0,0 +1,52 @@ +package org.cristalise.gui; + +import java.awt.Color; +import java.awt.Dimension; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JLabel; +import javax.swing.JProgressBar; + +public class ProgressReporter extends Box { + + JLabel status = new JLabel(); + JProgressBar progress = new JProgressBar(); + + /** + * + */ + public ProgressReporter() { + super(BoxLayout.X_AXIS); + status.setText("Cristal"); + //status.setBorder(BorderFactory.createLoweredBevelBorder()); + status.setForeground(Color.black); + status.setPreferredSize(new Dimension(400, progress.getPreferredSize().height)); + //progress.setBorder(BorderFactory.createLoweredBevelBorder()); + add(status); + //add(Box.createHorizontalGlue()); + progress.setPreferredSize(new Dimension(200, progress.getPreferredSize().height)); + add(progress); + } + + /** + * @param status + */ + public void startBouncing(String statusString) { + status.setText(statusString); + progress.setIndeterminate(true); + } + + /** + * @param status + */ + public void stopBouncing(String statusString) { + status.setText(statusString); + progress.setIndeterminate(false); + } + + public void setProgress(String statusString, int percent) { + progress.setIndeterminate(false); + progress.setValue(percent); + } +} diff --git a/src/main/java/org/cristalise/gui/TreeBrowser.java b/src/main/java/org/cristalise/gui/TreeBrowser.java new file mode 100644 index 0000000..0d40b43 --- /dev/null +++ b/src/main/java/org/cristalise/gui/TreeBrowser.java @@ -0,0 +1,231 @@ +package org.cristalise.gui; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.DropMode; +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTree; +import javax.swing.ToolTipManager; +import javax.swing.event.TreeExpansionEvent; +import javax.swing.event.TreeExpansionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; + +import org.cristalise.gui.tree.Node; +import org.cristalise.gui.tree.NodeItem; +import org.cristalise.gui.tree.NodeTransferHandler; +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.utils.Logger; + + +/** + * Container for the tree browser + * @version $Revision: 1.31 $ $Date: 2006/01/17 07:49:44 $ + * @author $Author: abranson $ + */ + + // must put in top level list of loaded items, so we don't have duplicates +public class TreeBrowser extends JPanel implements DomainKeyConsumer +{ + private ItemTabManager desktop; + protected JTree tree; + private Node userRoot; + + public TreeBrowser(ItemTabManager target, Node userRoot) { + setLayout(new java.awt.BorderLayout()); + //record the desktop and node factory for our item frames + this.desktop = target; + this.userRoot = userRoot; + this.setPreferredSize(new Dimension(300, 500)); + tree = new JTree(new DefaultTreeModel(userRoot.getTreeNode())); + tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + tree.setToggleClickCount(3); // need three clicks to expand a branch + tree.addTreeExpansionListener( + new TreeExpansionListener() { + @Override + public void treeCollapsed(TreeExpansionEvent e) { + //REVISIT: possible reaping here if things are getting heavy + } + @Override + public void treeExpanded(TreeExpansionEvent e) { + TreePath p = e.getPath(); + // find the clicked tree node + DefaultMutableTreeNode nodeClicked = (DefaultMutableTreeNode)p.getLastPathComponent(); + // run the tree builder if it is there. + DefaultMutableTreeNode loadNode = (DefaultMutableTreeNode)nodeClicked.getFirstChild(); + if (loadNode.getUserObject() instanceof DynamicTreeBuilder) { + DynamicTreeBuilder loading = (DynamicTreeBuilder)loadNode.getUserObject(); + if (loading.state == DynamicTreeBuilder.IDLE) { + loading.buildInfo(tree); + loading.start(); + } + } + } + } + ); + + //Enable tool tips. + ToolTipManager.sharedInstance().registerComponent(tree); + tree.setCellRenderer(new ItemRenderer()); + tree.addMouseListener(new TreeMouseListener()); + tree.setDragEnabled(true); + tree.setDropMode(DropMode.ON); + tree.setTransferHandler(new NodeTransferHandler(this)); + JScrollPane myScrollPane = new JScrollPane(tree); + this.add(myScrollPane); + DefaultMutableTreeNode loadNode = (DefaultMutableTreeNode)userRoot.getTreeNode().getFirstChild(); + DynamicTreeBuilder loading = (DynamicTreeBuilder)loadNode.getUserObject(); + loading.buildInfo(tree); + loading.start(); + } + + @Override + public void push(DomainPath target) { + String[] components = target.getPath(); + Node currentNode = userRoot; + Object[] treePath = new Object[components.length+1]; + treePath[0] = currentNode.getTreeNode(); + for (int i=0; i 1) + { + for(int i=0; i bottomY) + { + bottomY = outline[i].y; + } + } + + return bottomY; + } + + public Image getImage(AggregationMember am) { + return ImageLoader.findImage("typeicons/"+am.getProperties().get("Type")+"_16.png").getImage(); + } +} diff --git a/src/main/java/org/cristalise/gui/collection/CollectionFrame.java b/src/main/java/org/cristalise/gui/collection/CollectionFrame.java new file mode 100644 index 0000000..c30eec9 --- /dev/null +++ b/src/main/java/org/cristalise/gui/collection/CollectionFrame.java @@ -0,0 +1,42 @@ +package org.cristalise.gui.collection; + +import java.awt.GridLayout; + +import javax.swing.JFrame; + +import org.cristalise.gui.tabs.CollectionPane; +import org.cristalise.kernel.collection.Aggregation; + + + +/** + * @version $Revision: 1.10 $ $Date: 2003/04/06 15:06:36 $ + * @author $Author: abranson $ + */ + +public class CollectionFrame extends JFrame +{ + + private CollectionPane mCollectionPane = new CollectionPane(); + + public CollectionFrame() + { + createLayout(); + } + + public void setAggregation(Aggregation aggregation) + { + mCollectionPane.add(aggregation); + } + + + private void createLayout() + { + getContentPane().setLayout(new GridLayout(1, 1)); + + getContentPane().add(mCollectionPane); + + setSize(1000, 1000); + setVisible(true); + } +} diff --git a/src/main/java/org/cristalise/gui/collection/PropertyPanel.java b/src/main/java/org/cristalise/gui/collection/PropertyPanel.java new file mode 100644 index 0000000..08ce519 --- /dev/null +++ b/src/main/java/org/cristalise/gui/collection/PropertyPanel.java @@ -0,0 +1,38 @@ +package org.cristalise.gui.collection; + +import org.cristalise.gui.graph.view.VertexPropertyPanel; +import org.cristalise.kernel.collection.Aggregation; +import org.cristalise.kernel.collection.AggregationMember; +import org.cristalise.kernel.collection.CollectionMember; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.graph.model.Vertex; + + +public class PropertyPanel extends VertexPropertyPanel { + + Aggregation mCollection; + + public PropertyPanel() { + super(); + } + + public void setCollection(Aggregation collection) { + mCollection = collection; + } + + @Override + public void setVertex(Vertex vert) { + try { + CollectionMember newMember = mCollection.getMember(vert.getID()); + if (newMember instanceof AggregationMember) { + super.setVertex((AggregationMember)newMember); + return; + } + else + clear(); + } catch (ObjectNotFoundException ex) { + clear(); + selObjClass.setText("No Collection Member object found"); + } + } +} diff --git a/src/main/java/org/cristalise/gui/collection/SelectedMemberPanel.java b/src/main/java/org/cristalise/gui/collection/SelectedMemberPanel.java new file mode 100644 index 0000000..0b2244e --- /dev/null +++ b/src/main/java/org/cristalise/gui/collection/SelectedMemberPanel.java @@ -0,0 +1,166 @@ +package org.cristalise.gui.collection; + +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.JToggleButton; + +import org.cristalise.gui.DomainKeyConsumer; +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.graph.view.SelectedVertexPanel; +import org.cristalise.kernel.collection.AggregationMember; +import org.cristalise.kernel.common.InvalidCollectionModification; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.proxy.ItemProxy; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Language; + + +/************************************************************************** + * + * $Revision: 1.10 $ + * $Date: 2005/05/12 10:12:52 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + + +public class SelectedMemberPanel extends SelectedVertexPanel implements DomainKeyConsumer { + + JLabel slotNumber = new JLabel(); + JTextField memberKey = new JTextField(14); + + JButton findButton = new JButton(Language.translate("Find")); + JToggleButton changeButton = new JToggleButton(Language.translate("Change")); + JButton removeButton = new JButton(Language.translate("Remove")); + + SelectedMemberPanel me; + AggregationMember selectedMember = null; + + public SelectedMemberPanel() { + me=this; + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + JPanel attrs = new JPanel(new GridLayout(3,2)); + attrs.add(new JLabel(Language.translate("Slot Number:"))); + attrs.add(slotNumber); + attrs.add(new JLabel(Language.translate("Assigned Member:"))); + attrs.add(memberKey); + memberKey.setEditable(false); + + add(attrs); + add(Box.createVerticalStrut(10)); + + findButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + String code = memberKey.getText(); + if (code == null || code.length() == 0) + code = memberKey.getText().replace('/',' '); + MainFrame.itemFinder.pushNewKey(code); + } + }); + + changeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + if (changeButton.getModel().isSelected()) { + MainFrame.itemFinder.setConsumer(me, "Assign"); + findButton.setEnabled(false); + } + else { + MainFrame.itemFinder.clearConsumer(me); + if (selectedMember.getItemPath() != null) findButton.setEnabled(true); + } + } + }); + + removeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + selectedMember.clearItem(); + selectedMember.getProperties().remove("Name"); + select(selectedMember); + } + }); + + Box buttonBox = Box.createHorizontalBox(); + buttonBox.add(findButton); + if (MainFrame.isAdmin) { + buttonBox.add(changeButton); + buttonBox.add(removeButton); + } + + setButtons(false); + add(buttonBox); + } + + @Override + public void select(Vertex vert) { + selectedMember = (AggregationMember)vert; + slotNumber.setText(String.valueOf(vert.getID())); + ItemPath memberPath = selectedMember.getItemPath(); + String name = "Empty"; + if (memberPath != null) + try { + ItemProxy member = Gateway.getProxyManager().getProxy(memberPath); + name = member.getName(); + } catch (Exception e) { } + memberKey.setText(name); + setButtons(true); + + revalidate(); + } + + @Override + public void clear() { + slotNumber.setText(""); + memberKey.setText(""); + setButtons(false); + revalidate(); + } + + public void setButtons(boolean state) { + findButton.setEnabled(state); + changeButton.getModel().setSelected(false); + changeButton.setEnabled(state); + removeButton.setEnabled(state); + MainFrame.itemFinder.clearConsumer(me); + } + /** + * + */ + @Override + public void push(DomainPath key) { + try { + selectedMember.assignItem(key.getItemPath()); + select(selectedMember); + } catch (InvalidCollectionModification ex) { + JOptionPane.showMessageDialog(null, "Item does not fit in this slot", "Error", JOptionPane.ERROR_MESSAGE); + } catch (ObjectNotFoundException e) { + JOptionPane.showMessageDialog(null, "Not an item - cannot assign", "Error", JOptionPane.ERROR_MESSAGE); + } + } + + /** + * + */ + @Override + public void push(String name) { + JOptionPane.showMessageDialog(null, "Item is not known in this centre", "Error", JOptionPane.ERROR_MESSAGE); + } + +} + diff --git a/src/main/java/org/cristalise/gui/graph/controller/AutoScrollController.java b/src/main/java/org/cristalise/gui/graph/controller/AutoScrollController.java new file mode 100644 index 0000000..39b3b09 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/controller/AutoScrollController.java @@ -0,0 +1,42 @@ +package org.cristalise.gui.graph.controller; + +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionListener; + +import org.cristalise.gui.graph.view.GraphPanel; + + + +public class AutoScrollController implements MouseMotionListener +{ + private GraphPanel mGraphPanel = null; + + + public void setGraphPanel(GraphPanel graphPanel) + { + mGraphPanel = graphPanel; + mGraphPanel.addMouseMotionListener(this); + } + + + @Override + public void mouseDragged(MouseEvent me) + { + Point mousePoint = null; + + + if(mGraphPanel != null) + { + mousePoint = me.getPoint(); + mGraphPanel.scrollRectToVisible(new Rectangle(mousePoint.x, mousePoint.y, 1, 1)); + } + } + + + @Override + public void mouseMoved(MouseEvent me) + { + } +} diff --git a/src/main/java/org/cristalise/gui/graph/controller/DeletionController.java b/src/main/java/org/cristalise/gui/graph/controller/DeletionController.java new file mode 100644 index 0000000..b97ec11 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/controller/DeletionController.java @@ -0,0 +1,99 @@ +package org.cristalise.gui.graph.controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.util.Observable; +import java.util.Observer; + +import javax.swing.JButton; + +import org.cristalise.gui.graph.event.SelectionChangedEvent; +import org.cristalise.gui.graph.view.GraphPanel; +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.Vertex; + + + +// The deletion controller is responsible for deleting the present +// selection within the graph. +// +// The controller listens to: +// * The graph model to determine if there is a selection +// * The delete button +// * The graph panel for the typing of the delete key +// +// The controller modifies: +// * The graph model to delete the current selection +// * The delete button to enable it only when there is a selection +public class DeletionController extends KeyAdapter implements Observer, ActionListener +{ + private GraphModelManager mGraphModelManager = null; + private GraphPanel mGraphPanel = null; + private JButton mDeleteButton = null; + + + public void setGraphModelManager(GraphModelManager graphModelManager) + { + mGraphModelManager = graphModelManager; + mGraphModelManager.addObserver(this); + } + + public void setGraphPanel(GraphPanel graphPanel) + { + mGraphPanel = graphPanel; + } + + + public void setDeleteButton(JButton deleteButton) + { + mDeleteButton = deleteButton; + mDeleteButton.addActionListener(this); + } + + + // Invoked by the graph model + @Override + public void update(Observable o, Object arg) + { + SelectionChangedEvent event = null; + DirectedEdge selectedEdge = null; + Vertex[] selectedVertices = null; + + + // If the selected edge has changed + if(arg instanceof SelectionChangedEvent && mDeleteButton != null && mGraphModelManager.isEditable()) + { + // Enable the button if a single edge or single vertex is selected + event = (SelectionChangedEvent)arg; + + selectedEdge = event.mSelection.mEdge; + selectedVertices = event.mSelection.mVertices; + mDeleteButton.setEnabled(selectedEdge != null || selectedVertices != null); + } + } + + + // Invoked by the graph panel + @Override + public void keyPressed(KeyEvent e) + { + if(e.getKeyCode() == KeyEvent.VK_DELETE && mGraphModelManager.isEditable()) + { + mGraphPanel.deleteSelection(); + } + } + + + // Invoked by the delete button + @Override + public void actionPerformed(ActionEvent ae) + { + if(mGraphModelManager != null && mGraphModelManager.isEditable()) + { + mGraphPanel.deleteSelection(); + } + } +} diff --git a/src/main/java/org/cristalise/gui/graph/controller/EdgeConstructionController.java b/src/main/java/org/cristalise/gui/graph/controller/EdgeConstructionController.java new file mode 100644 index 0000000..63fc0dd --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/controller/EdgeConstructionController.java @@ -0,0 +1,262 @@ +package org.cristalise.gui.graph.controller; + +import java.awt.Point; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import org.cristalise.gui.graph.view.EditorModeListener; +import org.cristalise.gui.graph.view.EditorToolBar; +import org.cristalise.gui.graph.view.GraphPanel; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.graph.model.Vertex; + + + +public class EdgeConstructionController extends MouseAdapter implements EditorModeListener +{ + private GraphModelManager mGraphModelManager = null; + private GraphPanel mGraphPanel = null; + private EditorToolBar mEditorToolBar = null; + + + /**********/ + /* States */ + /**********/ + private final Integer kOtherMode = new Integer(0); + private final Integer kWaitOrigin = new Integer(1); + private final Integer kWaitTerminus = new Integer(2); + + + /**********/ + /* Events */ + /**********/ + private final int kEdgeEntered = 0; + private final int kOtherEntered = 1; + private final int kPressOnVertex = 2; + private final int kDrag = 3; + private final int kReleaseOnTerminus = 4; + private final int kReleaseOnNothing = 5; + + + /***********/ + /* Actions */ + /***********/ + + private interface Action + { + public void doIt(Object data); + } + + + private Action mSetOriginVertex = new Action() + { + @Override + public void doIt(Object data) + { + if(mGraphModelManager != null) + { + mGraphModelManager.getModel().setNewEdgeOriginVertex((Vertex)data); + } + } + }; + + + private Action mSetEndPoint = new Action() + { + @Override + public void doIt(Object data) + { + if(mGraphModelManager != null) + { + Point mouse = (Point)data; + mGraphModelManager.getModel().setNewEdgeEndPoint(new GraphPoint(mouse.x, mouse.y)); + } + } + }; + + + private Action mClearEdge = new Action() + { + @Override + public void doIt(Object data) + { + if(mGraphModelManager != null) + { + mGraphModelManager.getModel().setNewEdgeOriginVertex(null); + mGraphModelManager.getModel().setNewEdgeEndPoint(null); + } + } + }; + + + private Action mCreateEdge = new Action() + { + @Override + public void doIt(Object data) + { + if((mGraphModelManager != null) && (mEditorToolBar != null) && mGraphModelManager.isEditable()) + { + mGraphModelManager.getModel().createDirectedEdge + ( + mGraphModelManager.getModel().getNewEdgeOriginVertex(), + (Vertex)data, + mEditorToolBar.getSelectedEdgeType() + ); + mGraphModelManager.getModel().setNewEdgeOriginVertex(null); + mGraphModelManager.getModel().setNewEdgeEndPoint(null); + } + } + }; + + + /***********************************/ + /* Finite State Transition Network */ + /***********************************/ + + private Object[][][] mFSTN = + {// OtherMode WaitOrigin WaitTerminus + /* EdgeEntered */ {{null, kWaitOrigin}, null , null }, + /* OtherEntered */ { null , {null , kOtherMode} , null }, + /* PressOnVertex */ { null , {mSetOriginVertex, kWaitTerminus}, null }, + /* Drag */ { null , null , {mSetEndPoint, null} }, + /* ReleaseOnTerminus */ { null , null , {mCreateEdge , kWaitOrigin}}, + /* ReleaseOnNothing */ { null , null , {mClearEdge , kWaitOrigin}} + }; + + + /*****************/ + /* Current state */ + /*****************/ + + private Integer mState = kOtherMode; + + + /**************************/ + /* Event processing logic */ + /**************************/ + + private void processEvent(int event, Object data) + { + Object[] transition = mFSTN[event][mState.intValue()]; + Action action = null; + Integer nextState = null; + + if(transition != null) + { + action = (Action)transition[0]; + nextState = (Integer)transition[1]; + + if(action != null) + { + action.doIt(data); + } + + if(nextState != null) + { + mState = nextState; + } + } + } + + + /********************/ + /* Public interface */ + /********************/ + + public void setGraphModelManager(GraphModelManager graphModelManager) + { + mGraphModelManager = graphModelManager; + } + + public void setGraphPanel(GraphPanel graphPanel) + { + mGraphPanel = graphPanel; + } + + + public void setEditorToolBar(EditorToolBar editorToolBar) + { + mEditorToolBar = editorToolBar; + mEditorToolBar.addEditorModeListener(this); + } + + + @Override + public void editorModeChanged(String idOfNewMode) + { + if(idOfNewMode.equals("Edge")) + { + processEvent(kEdgeEntered, null); + } + else + { + processEvent(kOtherEntered, null); + } + } + + + @Override + public void mousePressed(MouseEvent me) + { + Vertex vertex = null; + Point mousePoint = null; + + if(mGraphModelManager != null && mGraphPanel != null) + { + // Determine if there is a vertex under the mouse cursor + mousePoint = me.getPoint(); + vertex = mGraphPanel.getVertex(new GraphPoint(mousePoint.x, mousePoint.y)); + + // If the mouse has been pressed on a vertex + if(vertex != null) + { + processEvent(kPressOnVertex, vertex); + } + } + } + + + @Override + public void mouseReleased(MouseEvent me) + { + Vertex vertex = null; + Point mousePoint = null; + + if(mGraphModelManager != null && mGraphPanel != null) + { + // Determine if there is a vertex under the mouse cursor + mousePoint = me.getPoint(); + vertex = mGraphPanel.getVertex(new GraphPoint(mousePoint.x, mousePoint.y)); + + // If the mouse has been released on a vertex which is not the origin vertex + if((vertex != null) && (vertex != mGraphModelManager.getModel().getNewEdgeOriginVertex())) + { + processEvent(kReleaseOnTerminus, vertex); + } + else + { + processEvent(kReleaseOnNothing, null); + } + } + } + + + @Override + public void mouseExited(MouseEvent me) + { + } + + + @Override + public void mouseDragged(MouseEvent me) + { + processEvent(kDrag, me.getPoint()); + } + + + @Override + public void mouseMoved(MouseEvent me) + { + } +} diff --git a/src/main/java/org/cristalise/gui/graph/controller/ElasticBand.java b/src/main/java/org/cristalise/gui/graph/controller/ElasticBand.java new file mode 100644 index 0000000..37d1ad4 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/controller/ElasticBand.java @@ -0,0 +1,18 @@ +package org.cristalise.gui.graph.controller; + +import org.cristalise.kernel.graph.model.GraphPoint; + + + +public class ElasticBand +{ + public GraphPoint mFixedCorner = null; + public GraphPoint mMovingCorner = null; + + + public ElasticBand(GraphPoint fixedCorner, GraphPoint movingCorner) + { + mFixedCorner = fixedCorner; + mMovingCorner = movingCorner; + } +} diff --git a/src/main/java/org/cristalise/gui/graph/controller/MultiSelectionDragController.java b/src/main/java/org/cristalise/gui/graph/controller/MultiSelectionDragController.java new file mode 100644 index 0000000..e677cce --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/controller/MultiSelectionDragController.java @@ -0,0 +1,575 @@ +package org.cristalise.gui.graph.controller; + +import java.awt.Point; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import org.cristalise.gui.graph.view.EditorModeListener; +import org.cristalise.gui.graph.view.GraphPanel; +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.graph.model.GraphableVertex; +import org.cristalise.kernel.graph.model.Vertex; + + + +public class MultiSelectionDragController +extends MouseAdapter +implements EditorModeListener, KeyListener +{ + + private class ResizeInf + { + public int mMousePressedX = 0; + public int mMousePressedY = 0; + public Vertex mSelectedVertex = null; + public GraphPoint[] mOldOutline = null; + public int mCentreX = 0; + public int mCentreY = 0; + public int mOldHeight = 0; + public int mOldWidth = 0; + } + private ResizeInf mResizeInf = new ResizeInf(); + + private class DispForSelection + { + public int mXDisp = 0; + public int mYDisp = 0; + } + private DispForSelection mDispForSelection = null; + + private class VertexAndDisp + { + public Vertex mVertex = null; + public int mXDisp = 0; + public int mYDisp = 0; + } + + protected GraphModelManager mGraphModelManager = null; + private GraphPanel mGraphPanel = null; + + + /**********/ + /* States */ + /**********/ + protected final Integer kOtherMode = new Integer(0); + protected final Integer kWaiting = new Integer(1); + protected final Integer kResizing = new Integer(2); + protected final Integer kDraggingSelection = new Integer(3); + protected final Integer kStretching = new Integer(4); + + + /**********/ + /* Events */ + /**********/ + protected final int kSelectEntered = 0; + protected final int kOtherEntered = 1; + protected final int kPressOnEdge = 2; + protected final int kPressOnVertex = 3; + protected final int kPressOnSelection = 4; + protected final int kPressOnResizePad = 5; + protected final int kCTRLPressOnVertex = 6; + protected final int kCTRL_A = 7; + protected final int kPressOnNothing = 8; + protected final int kDrag = 9; + protected final int kRelease = 10; + protected final int kZoomIn = 11; + + /***********/ + /* Actions */ + /***********/ + + protected interface Action + { + public void doIt(Object data); + } + + + protected Action mStoreResizeInf = new Action() + { + @Override + public void doIt(Object data) + { + Point mousePoint = (Point)data; + GraphPoint centre = null; + + mResizeInf.mMousePressedX = mousePoint.x; + mResizeInf.mMousePressedY = mousePoint.y; + mResizeInf.mSelectedVertex = mGraphPanel.getSelection().mVertices[0]; + mResizeInf.mOldOutline = mResizeInf.mSelectedVertex.getOutlinePoints(); + centre = mResizeInf.mSelectedVertex.getCentrePoint(); + mResizeInf.mCentreX = centre.x; + mResizeInf.mCentreY = centre.y; + mResizeInf.mOldHeight = mResizeInf.mSelectedVertex.getHeight(); + mResizeInf.mOldWidth = mResizeInf.mSelectedVertex.getWidth(); + } + }; + + + protected Action mResizeVertex = new Action() + { + @Override + public void doIt(Object data) + { + Point mousePoint = (Point)data; + int resizeX = 0; + int resizeY = 0; + + + // Calculate how much the old outline should be resized + resizeX = mousePoint.x - mResizeInf.mMousePressedX; + resizeY = mousePoint.y - mResizeInf.mMousePressedY; + + // Clip the resize so that outline does not get any + // smaller than 10 x 10 pixels + if(resizeX < -mResizeInf.mOldWidth/2 + 10) + { + resizeX = -mResizeInf.mOldWidth/2 + 10; + } + + if(resizeY < -mResizeInf.mOldHeight/2 + 10) + { + resizeY = -mResizeInf.mOldHeight/2 + 10; + } + + if (mGraphModelManager.isEditable()) { + mResizeInf.mSelectedVertex.setOutlinePoints(newOutline(resizeX, resizeY)); + mGraphModelManager.forceNotify(); + } + } + + + private GraphPoint[] newOutline(int resizeX, int resizeY) + { + GraphPoint[] newOutline = new GraphPoint[mResizeInf.mOldOutline.length]; + int x = 0; + int y = 0; + int i = 0; + + + for(i=0; i mResizeInf.mCentreX) + { + x = mResizeInf.mOldOutline[i].x + resizeX; + } + else if(mResizeInf.mOldOutline[i].x < mResizeInf.mCentreX) + { + x = mResizeInf.mOldOutline[i].x - resizeX; + } + else + { + x = mResizeInf.mOldOutline[i].x; + } + + if(mResizeInf.mOldOutline[i].y > mResizeInf.mCentreY) + { + y = mResizeInf.mOldOutline[i].y + resizeY; + } + else if(mResizeInf.mOldOutline[i].y < mResizeInf.mCentreY) + { + y = mResizeInf.mOldOutline[i].y - resizeY; + } + else + { + y = mResizeInf.mOldOutline[i].y; + } + + newOutline[i] = new GraphPoint(x, y); + } + + return newOutline; + } + }; + + + protected Action mSelectEdge = new Action() + { + @Override + public void doIt(Object data) + { + Selection selection = new Selection((DirectedEdge)data, null, 0, 0, 0, 0); + + mGraphPanel.setSelection(selection); + } + }; + + + protected Action mSelectVertexAndStoreDisp = new Action() + { + @Override + public void doIt(Object data) + { + VertexAndDisp vertexAndDisp = (VertexAndDisp)data; + GraphPoint centrePoint = vertexAndDisp.mVertex.getCentrePoint(); + Selection selection = new Selection(null, + new Vertex[] {vertexAndDisp.mVertex}, + centrePoint.x, + centrePoint.y, + centrePoint.x, + centrePoint.y); + + mGraphPanel.setSelection(selection); + mDispForSelection = new DispForSelection(); + mDispForSelection.mXDisp = vertexAndDisp.mXDisp; + mDispForSelection.mYDisp = vertexAndDisp.mYDisp; + } + }; + + + protected Action mStoreDisp = new Action() + { + @Override + public void doIt(Object data) + { + mDispForSelection = (DispForSelection)data; + } + }; + + + protected Action mToggleVertex = new Action() + { + @Override + public void doIt(Object data) + { + Vertex vertex = (Vertex)data; + + if(mGraphPanel.inSelection(vertex)) + { + mGraphPanel.removeFromSelection(vertex); + } + else + { + mGraphPanel.addToSelection(vertex); + } + } + }; + + + protected Action mSelectAll = new Action() + { + @Override + public void doIt(Object data) + { + mGraphPanel.selectAll(); + } + }; + + + protected Action mCreateBand = new Action() + { + @Override + public void doIt(Object data) + { + Point mouse = (Point)data; + GraphPoint fixedCorner = new GraphPoint(mouse.x, mouse.y); + + mGraphPanel.setElasticBand(new ElasticBand(fixedCorner, fixedCorner)); + } + }; + + + protected Action mMoveSelection = new Action() + { + @Override + public void doIt(Object data) + { + Point mousePoint = (Point)data; + int topLeftX = mousePoint.x - mDispForSelection.mXDisp; + int topLeftY = mousePoint.y - mDispForSelection.mYDisp; + if (mGraphModelManager.isEditable()) { + mGraphPanel.moveAbsoluteSelection(topLeftX, topLeftY); + } + } + }; + + + protected Action mResizeBand = new Action() + { + @Override + public void doIt(Object data) + { + Point mouse = (Point)data; + mGraphPanel.resizeElasticBand(new GraphPoint(mouse.x, mouse.y)); + } + }; + + + protected Action mSelectContents = new Action() + { + @Override + public void doIt(Object data) + { + mGraphPanel.selectContentsOfElasticBand(); + } + }; + + protected Action mZoomIn = new Action() + { + @Override + public void doIt(Object data) // data is the clicked vertex + { + // Need to get child graph model out of the vertex before we can zoom in + if (data instanceof Vertex) { + Vertex zoomTo = (Vertex)data; + if (((GraphableVertex)zoomTo).getIsComposite()) mGraphModelManager.zoomIn(zoomTo); + } + } + }; + + /***********************************/ + /* Finite State Transition Network */ + /***********************************/ + + protected Object[][][] mFSTN = + {// OtherMode Waiting Resizing DraggingSelection Stretching + /* SelectEntered */ {{null, kWaiting}, null , null , null , null }, + /* OtherEntered */ { null , {null , kOtherMode }, null , null , null }, + /* PressOnEdge */ { null , {mSelectEdge , null }, null , null , null }, + /* PressOnVertex */ { null , {mSelectVertexAndStoreDisp, kDraggingSelection}, null , null , null }, + /* PressOnSelection */ { null , {mStoreDisp , kDraggingSelection}, null , null , null }, + /* PressOnResizePad */ { null , {mStoreResizeInf , kResizing }, null , null , null }, + /* CTRLPressOnVertex */ { null , {mToggleVertex , null }, null , null , null }, + /* CTRL_A */ { null , {mSelectAll , null }, null , null , null }, + /* PressOnNothing */ { null , {mCreateBand , kStretching }, null , null , null }, + /* Drag */ { null , null , {mResizeVertex, null }, {mMoveSelection, null }, {mResizeBand , null }}, + /* Release */ { null , null , {null , kWaiting}, {null , kWaiting}, {mSelectContents, kWaiting}}, + /* Double Click */ { null , {mZoomIn , null }, null , null , null }, + }; + + + /*****************/ + /* Current state */ + /*****************/ + + private Integer mState = kWaiting; + + /**************************/ + /* Event processing logic */ + /**************************/ + + protected void processEvent(int event, Object data) + { + Object[] transition = mFSTN[event][mState.intValue()]; + Action action = null; + Integer nextState = null; + + if(transition != null) + { + action = (Action)transition[0]; + nextState = (Integer)transition[1]; + + if(action != null) + { + action.doIt(data); + } + + if(nextState != null) + { + mState = nextState; + } + } + } + + + /********************/ + /* Public interface */ + /********************/ + + + public MultiSelectionDragController(GraphModelManager graphModelManager, + GraphPanel graphPanel) { + mGraphModelManager = graphModelManager; + mGraphPanel = graphPanel; + } + + @Override + public void editorModeChanged(String idOfNewMode) + { + if(idOfNewMode.equals("Select")) + { + processEvent(kSelectEntered, null); + } + else + { + processEvent(kOtherEntered, null); + } + } + + + @Override + public void mousePressed(MouseEvent me) + { + int modifiers = me.getModifiers(); + + if(mGraphModelManager != null) + { + if((modifiers & InputEvent.CTRL_MASK) == 0) + { + mousePressedWithoutCTRL(me.getPoint()); + } + else + { + mousePressedWithCTRL(me.getPoint()); + } + } + } + + @Override + public void mouseClicked(MouseEvent me) + { + if (me.getClickCount() == 2) { // want double click + Point clickedSpot = me.getPoint(); + GraphPoint mouseGPoint = new GraphPoint(clickedSpot.x, clickedSpot.y); + Vertex clicked = mGraphPanel.getVertex(mouseGPoint); + if (clicked != null) + processEvent(kZoomIn, clicked); + } + } + + private void mousePressedWithoutCTRL(Point mousePoint) + { + GraphPoint mouseGPoint = new GraphPoint(mousePoint.x, mousePoint.y); + DirectedEdge edge = mGraphPanel.getEdge(mouseGPoint); + Vertex vertex = mGraphPanel.getVertex(mouseGPoint); + GraphPoint vertexCentrePoint = null; + VertexAndDisp vertexAndDisp = null; + Selection selection = null; + DispForSelection dispForSelection = null; + + + // In order of priority: + // 1. Click on resize pad + // 2. Click on vertex + // 3. Click on edge + if(onResizePad(mouseGPoint)) + { + processEvent(kPressOnResizePad, mousePoint); + } + else if(vertex != null) + { + if(mGraphPanel.inSelection(vertex)) + { + selection = mGraphPanel.getSelection(); + dispForSelection = new DispForSelection(); + dispForSelection.mXDisp = mousePoint.x - selection.mTopLeftX; + dispForSelection.mYDisp = mousePoint.y - selection.mTopLeftY; + + processEvent(kPressOnSelection, dispForSelection); + } + else + { + vertexCentrePoint = vertex.getCentrePoint(); + + vertexAndDisp = new VertexAndDisp(); + vertexAndDisp.mVertex = vertex; + vertexAndDisp.mXDisp = mousePoint.x - vertexCentrePoint.x; + vertexAndDisp.mYDisp = mousePoint.y - vertexCentrePoint.y; + + processEvent(kPressOnVertex, vertexAndDisp); + } + } + // vertex == null + else + { + if(edge == null) + { + processEvent(kPressOnNothing, mousePoint); + } + else + { + processEvent(kPressOnEdge, edge); + } + } + } + + + private boolean onResizePad(GraphPoint mouseGPoint) + { + Selection selection = mGraphPanel.getSelection(); + GraphPoint vertexCentre = null; + int bottomRightX = 0; + int bottomRightY = 0; + + + if(selection.mVertices == null) return false; + + if(selection.mVertices.length == 1) + { + vertexCentre = selection.mVertices[0].getCentrePoint(); + if (vertexCentre == null) return false; + bottomRightX = vertexCentre.x + selection.mVertices[0].getWidth()/2; + bottomRightY = vertexCentre.y + selection.mVertices[0].getHeight()/2; + + return + ( + (mouseGPoint.x > bottomRightX) && + (mouseGPoint.x < bottomRightX + 10) && + (mouseGPoint.y > bottomRightY) && + (mouseGPoint.y < bottomRightY + 10) + ); + } + else + { + return false; + } + } + + + private void mousePressedWithCTRL(Point mousePoint) + { + Vertex vertex = mGraphPanel.getVertex(new GraphPoint(mousePoint.x, mousePoint.y)); + + if(vertex != null) + { + processEvent(kCTRLPressOnVertex, vertex); + } + } + + + @Override + public void mouseReleased(MouseEvent me) + { + processEvent(kRelease, null); + } + + + @Override + public void mouseMoved(MouseEvent me) + { + } + + + @Override + public void mouseDragged(MouseEvent e) + { + processEvent(kDrag, e.getPoint()); + } + + + @Override + public void keyPressed(KeyEvent e) + { + if((e.getKeyCode() == KeyEvent.VK_A) && e.isControlDown()) + { + processEvent(kCTRL_A, null); + } + } + + + @Override + public void keyReleased(KeyEvent e) + { + } + + + @Override + public void keyTyped(KeyEvent e) + { + } + +} diff --git a/src/main/java/org/cristalise/gui/graph/controller/Selection.java b/src/main/java/org/cristalise/gui/graph/controller/Selection.java new file mode 100644 index 0000000..cf634a7 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/controller/Selection.java @@ -0,0 +1,36 @@ +package org.cristalise.gui.graph.controller; + +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.Vertex; + + + +public class Selection +{ + // Either a single edge can be selected or + // one or more vertices can be selected. + // It is impossible to select an edge and a + // vertex at the same time. + public DirectedEdge mEdge = null; + public Vertex[] mVertices = null; + public int mTopLeftX = 0; + public int mTopLeftY = 0; + public int mBottomRightX = 0; + public int mBottomRightY = 0; + + + public Selection(DirectedEdge edge, + Vertex[] vertices, + int topLeftX, + int topLeftY, + int bottomRightX, + int bottomRightY) + { + mEdge = edge; + mVertices = vertices; + mTopLeftX = topLeftX; + mTopLeftY = topLeftY; + mBottomRightX = bottomRightX; + mBottomRightY = bottomRightY; + } +} diff --git a/src/main/java/org/cristalise/gui/graph/controller/StartVertexController.java b/src/main/java/org/cristalise/gui/graph/controller/StartVertexController.java new file mode 100644 index 0000000..b98620b --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/controller/StartVertexController.java @@ -0,0 +1,82 @@ +package org.cristalise.gui.graph.controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Observable; +import java.util.Observer; + +import javax.swing.JButton; + +import org.cristalise.gui.graph.event.SelectionChangedEvent; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.Vertex; + + + +// The start vertex controller is responsible for selecting +// the vertex at the start of the graph. +// +// The controller listens to: +// * The graph model to determine if there is a single +// vertex selected +// * The start vertex button +// +// The controller modifies: +// * The graph model to select the start vertex +// * The start button to enable it only when there is a +// single vertex selected +public class StartVertexController implements Observer, ActionListener +{ + private GraphModelManager mGraphModelManager = null; + private JButton mStartButton = null; + private Vertex selectedVertex = null; + + + public void setGraphModelManager(GraphModelManager graphModelManager) + { + mGraphModelManager = graphModelManager; + mGraphModelManager.addObserver(this); + } + + + public void setStartButton(JButton startButton) + { + mStartButton = startButton; + mStartButton.addActionListener(this); + } + + + @Override + public void update(Observable o, Object arg) + { + SelectionChangedEvent event = null; + Vertex[] selectedVertices = null; + + // If the selected vertex has changed + if(arg instanceof SelectionChangedEvent && mStartButton != null) + { + event = (SelectionChangedEvent)arg; + selectedVertices = event.mSelection.mVertices; + + if(selectedVertices == null || selectedVertices.length != 1) + { + mStartButton.setEnabled(false); + } + else if (mGraphModelManager.isEditable()) + { + mStartButton.setEnabled(true); + selectedVertex = selectedVertices[0]; + } + } + } + + + @Override + public void actionPerformed(ActionEvent ae) + { + if(selectedVertex != null) + { + mGraphModelManager.getModel().setStartVertexId(selectedVertex.getID()); + } + } +} diff --git a/src/main/java/org/cristalise/gui/graph/controller/VertexConstructionController.java b/src/main/java/org/cristalise/gui/graph/controller/VertexConstructionController.java new file mode 100644 index 0000000..a2f5dc0 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/controller/VertexConstructionController.java @@ -0,0 +1,54 @@ +package org.cristalise.gui.graph.controller; + +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.graph.view.EditorModeListener; +import org.cristalise.gui.graph.view.EditorToolBar; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.GraphPoint; + + + +public class VertexConstructionController extends MouseAdapter implements EditorModeListener +{ + private GraphModelManager mGraphModelManager = null; + private EditorToolBar mEditorToolBar = null; + private boolean mCreatingVertices = false; + + + public void setGraphModelManager(GraphModelManager graphModelManager) + { + mGraphModelManager = graphModelManager; + } + + + public void setEditorToolBar(EditorToolBar editorToolBar) + { + mEditorToolBar = editorToolBar; + mEditorToolBar.addEditorModeListener(this); + } + + + @Override + public void editorModeChanged(String idOfNewMode) + { + mCreatingVertices = idOfNewMode.equals("Vertex"); + } + + + @Override + public void mouseClicked(MouseEvent me) + { + if(mCreatingVertices && (mGraphModelManager != null) && (mEditorToolBar != null) && mGraphModelManager.isEditable()) + { + try { + mGraphModelManager.getModel().createVertex(new GraphPoint(me.getPoint().x, me.getPoint().y), mEditorToolBar.getSelectedVertexType()); + } catch (Exception e) { + MainFrame.exceptionDialog(e); + } + mEditorToolBar.enterSelectMode(); + } + } +} diff --git a/src/main/java/org/cristalise/gui/graph/event/ElasticBandResizedEvent.java b/src/main/java/org/cristalise/gui/graph/event/ElasticBandResizedEvent.java new file mode 100644 index 0000000..87e77a5 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/event/ElasticBandResizedEvent.java @@ -0,0 +1,8 @@ +package org.cristalise.gui.graph.event; + +import org.cristalise.kernel.graph.event.GraphModelEvent; + + +public class ElasticBandResizedEvent extends GraphModelEvent +{ +} diff --git a/src/main/java/org/cristalise/gui/graph/event/ElasticBandSetEvent.java b/src/main/java/org/cristalise/gui/graph/event/ElasticBandSetEvent.java new file mode 100644 index 0000000..9a8236b --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/event/ElasticBandSetEvent.java @@ -0,0 +1,8 @@ +package org.cristalise.gui.graph.event; + +import org.cristalise.kernel.graph.event.GraphModelEvent; + + +public class ElasticBandSetEvent extends GraphModelEvent +{ +} diff --git a/src/main/java/org/cristalise/gui/graph/event/SelectionChangedEvent.java b/src/main/java/org/cristalise/gui/graph/event/SelectionChangedEvent.java new file mode 100644 index 0000000..cfcb85e --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/event/SelectionChangedEvent.java @@ -0,0 +1,11 @@ +package org.cristalise.gui.graph.event; + +import org.cristalise.gui.graph.controller.Selection; +import org.cristalise.kernel.graph.event.GraphModelEvent; + + + +public class SelectionChangedEvent extends GraphModelEvent +{ + public Selection mSelection = null; +} diff --git a/src/main/java/org/cristalise/gui/graph/event/SelectionMovedEvent.java b/src/main/java/org/cristalise/gui/graph/event/SelectionMovedEvent.java new file mode 100644 index 0000000..4dea263 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/event/SelectionMovedEvent.java @@ -0,0 +1,9 @@ +package org.cristalise.gui.graph.event; + +import org.cristalise.kernel.graph.event.GraphModelEvent; + + + +public class SelectionMovedEvent extends GraphModelEvent +{ +} diff --git a/src/main/java/org/cristalise/gui/graph/view/DefaultDirectedEdgeRenderer.java b/src/main/java/org/cristalise/gui/graph/view/DefaultDirectedEdgeRenderer.java new file mode 100644 index 0000000..7695885 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/view/DefaultDirectedEdgeRenderer.java @@ -0,0 +1,76 @@ +package org.cristalise.gui.graph.view; + +import java.awt.Graphics2D; +import java.awt.Paint; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.GeneralPath; + +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.GraphPoint; + + + +public class DefaultDirectedEdgeRenderer implements DirectedEdgeRenderer +{ + private GeneralPath mArrowTemplate = new GeneralPath(); + private Paint mLinePaint = null; + + + public DefaultDirectedEdgeRenderer(Paint linePaint) + { + mLinePaint = linePaint; + + mArrowTemplate.moveTo(-5, 5); + mArrowTemplate.lineTo( 0, 0); + mArrowTemplate.lineTo( 5, 5); + } + + + @Override + public void draw(Graphics2D g2d, DirectedEdge directedEdge) + { + GraphPoint originPoint = directedEdge.getOriginPoint(); + GraphPoint terminusPoint = directedEdge.getTerminusPoint(); + GraphPoint midPoint = new GraphPoint(); + AffineTransform transform = new AffineTransform(); + Shape arrow = null; + + g2d.setPaint(mLinePaint); + g2d.drawLine(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y); + + midPoint.x = originPoint.x + (terminusPoint.x - originPoint.x)/2; + midPoint.y = originPoint.y + (terminusPoint.y - originPoint.y)/2; + + transform.translate(midPoint.x, midPoint.y); + transform.rotate(calcArrowAngle(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y)); + + arrow = mArrowTemplate.createTransformedShape(transform); + + g2d.draw(arrow); + } + + + private static double calcArrowAngle(int originX, int originY, int terminusX, int terminusY) { + double width = terminusX - originX; + double height = terminusY - originY; + + if((width == 0) && (height > 0)) return Math.PI; + + if((width == 0) && (height < 0)) return 0; + + if((width > 0) && (height == 0)) return Math.PI/2.0; + + if((width < 0) && (height == 0)) return -1.0 * Math.PI/2.0; + + if((width > 0) && (height > 0)) return Math.PI/2.0 + Math.atan(Math.abs(height)/Math.abs(width)); + + if((width > 0) && (height < 0)) return Math.atan(Math.abs(width)/Math.abs(height)); + + if((width < 0) && (height < 0)) return -1.0 * Math.atan(Math.abs(width)/Math.abs(height)); + + if((width < 0) && (height > 0)) return -1.0 * (Math.PI/2.0 + Math.atan(Math.abs(height)/Math.abs(width))); + + return 0.0; + } +} diff --git a/src/main/java/org/cristalise/gui/graph/view/DefaultVertexRenderer.java b/src/main/java/org/cristalise/gui/graph/view/DefaultVertexRenderer.java new file mode 100644 index 0000000..fdb2079 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/view/DefaultVertexRenderer.java @@ -0,0 +1,61 @@ +package org.cristalise.gui.graph.view; + +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Paint; +import java.awt.Polygon; + +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.graph.model.Vertex; + + + +public class DefaultVertexRenderer implements VertexRenderer +{ + private Paint mLinePaint = null; + private Paint mTextPaint = null; + private Paint mFillPaint = null; + + + public DefaultVertexRenderer(Paint linePaint, Paint textPaint, Paint fillPaint) + { + mLinePaint = linePaint; + mTextPaint = textPaint; + mFillPaint = fillPaint; + } + + + @Override + public void draw(Graphics2D g2d, Vertex vertex) + { + GraphPoint[] outlinePoints = vertex.getOutlinePoints(); + GraphPoint centrePoint = vertex.getCentrePoint(); + Polygon outline = new Polygon(); + + String vertexName = vertex.getName(); + FontMetrics metrics = g2d.getFontMetrics(); + int textWidth = metrics.stringWidth(vertexName); + int textHeight = metrics.getHeight(); + int textX = centrePoint.x - textWidth/2; + int textY = centrePoint.y + textHeight/3; + + int i = 0; + + + // Construct a shape in the outline of the vertex + for(i=0; i mListenerVector = new Vector(10, 10); + public EditorToolBar(boolean edgeCreationMode, // True if edges can be created + JButton[] otherButtons, GraphPanel graphP) + { + super(BoxLayout.X_AXIS); + mGraphPanel = graphP; + mEdgeCreationMode = edgeCreationMode; + mOtherButtons = otherButtons; + prepareModeButtons(); + mStartVertexController.setStartButton(mStartButton); + mDeletionController.setDeleteButton(mDeleteButton); + createLayout(); + createListeners(); + } + protected void prepareModeButtons() + { + // Set the tool tip texts + mVertexModeButton.setToolTipText(Language.translate("Create vertex")); + mSelectModeButton.setToolTipText(Language.translate("Multi-select and drag")); + mEdgeModeButton.setToolTipText(Language.translate("Create edge")); + mStartButton.setToolTipText(Language.translate("Select the start vertex of the graph")); + mDeleteButton.setToolTipText(Language.translate("Delete the selection")); + mPrintButton.setToolTipText(Language.translate("Print this graph")); + mCopyButton.setToolTipText(Language.translate("Copy an image of this graph to the clipboard")); + // Set the button margins to 0 + mVertexModeButton.setMargin(new Insets(0, 0, 0, 0)); + mSelectModeButton.setMargin(new Insets(0, 0, 0, 0)); + mEdgeModeButton.setMargin(new Insets(0, 0, 0, 0)); + // The initial mode is select mode + mSelectModeButton.setSelected(true); + // Add the mode buttons to the mode button group + mModeButtonGroup.add(mVertexModeButton); + mModeButtonGroup.add(mSelectModeButton); + mModeButtonGroup.add(mEdgeModeButton); + // Add the action listeners + mVertexModeButton.addActionListener(new ModeButtonListener("Vertex")); + mSelectModeButton.addActionListener(new ModeButtonListener("Select")); + mEdgeModeButton.addActionListener(new ModeButtonListener("Edge")); + } + public void enterSelectMode() + { + mSelectModeButton.setSelected(true); + notifyListeners("Select"); + } + public void updateVertexTypes(TypeNameAndConstructionInfo[] typeNameAndConstructionInfo) + { + int i = 0; + mVertexTypeBox.removeAllItems(); + for (i = 0; i < typeNameAndConstructionInfo.length; i++) + { + mVertexTypeBox.addItem(typeNameAndConstructionInfo[i]); + } + } + public void updateEdgeTypes(TypeNameAndConstructionInfo[] typeNameAndConstructionInfo) + { + int i = 0; + mEdgeTypeBox.removeAllItems(); + for (i = 0; i < typeNameAndConstructionInfo.length; i++) + { + mEdgeTypeBox.addItem(typeNameAndConstructionInfo[i]); + } + } + public TypeNameAndConstructionInfo getSelectedVertexType() + { + return (TypeNameAndConstructionInfo) mVertexTypeBox.getSelectedItem(); + } + public TypeNameAndConstructionInfo getSelectedEdgeType() + { + return (TypeNameAndConstructionInfo) mEdgeTypeBox.getSelectedItem(); + } + protected void createLayout() + { + int i = 0; + add(mSelectModeButton); + add(mVertexModeButton); + add(mVertexTypeBox); + add(Box.createHorizontalStrut(10)); + if (mEdgeCreationMode) + { + add(mEdgeModeButton); + add(mEdgeTypeBox); + } + add(Box.createGlue()); + mPrintButton.setEnabled(true); + mPrintButton.setMargin(new Insets(0, 0, 0, 0)); + add(mPrintButton); + mCopyButton.setEnabled(true); + mCopyButton.setMargin(new Insets(0, 0, 0, 0)); + add(mCopyButton); + mStartButton.setEnabled(false); + mStartButton.setMargin(new Insets(0, 0, 0, 0)); + mDeleteButton.setEnabled(false); + mDeleteButton.setMargin(new Insets(0, 0, 0, 0)); + add(mDeleteButton); + add(Box.createRigidArea(new Dimension(20, 0))); + add(mStartButton); + if (mOtherButtons != null) + { + for (i = 0; i < mOtherButtons.length; i++) + { + mOtherButtons[i].setMargin(new Insets(0, 0, 0, 0)); + add(mOtherButtons[i]); + } + } + } + protected void createListeners() + { + // The vertex mode button should be selected if the + // user select a vertex type from the vertex type box + mVertexTypeBox.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + mVertexModeButton.setSelected(true); + notifyListeners("Vertex"); + } + }); + // The edge mode button should be selected if the + // user select an edge type from the edge type box + mEdgeTypeBox.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + mEdgeModeButton.setSelected(true); + notifyListeners("Edge"); + } + }); + mPrintButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + PrinterJob _monJob = PrinterJob.getPrinterJob(); + if (_monJob.printDialog()) + _monJob.setPrintable(self()); + try + { + _monJob.print(); + } + catch (Exception ex) + { + } + } + }); + + try { + Class.forName("java.awt.datatransfer.DataFlavor").getDeclaredField("imageFlavor"); + mCopyButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + try + { + Image i = createImage(mGraphPanel.getWidth(),mGraphPanel.getHeight()); + Graphics g = i.getGraphics(); + mGraphPanel.paintComponent(g); + ImageTransferable it = new ImageTransferable(i, mGraphPanel.getWidth(), mGraphPanel.getHeight()); + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(it, it); + } + catch (Exception e) + { + Logger.error(e); + } + } + }); + } catch (Exception ex) { //image clipboard transfer not supported + mCopyButton.setEnabled(false); + } + } + + protected class ImageTransferable implements Transferable, ClipboardOwner { + Image image; + int width,height; + DataFlavor javaImg; + public ImageTransferable(Image image, int width, int height) { + this.image = image; + this.width = width; + this.height = height; + try { + javaImg = new DataFlavor("image/x-java-image; class=java.awt.Image", "AWT Image"); + } catch (Exception ex){ } + } + @Override + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { + if (!isDataFlavorSupported(flavor) || image == null) { + throw new UnsupportedFlavorException(flavor); + } + return image; + } + + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + boolean result = in(flavor, getTransferDataFlavors()); + return result; + } + + @Override + public DataFlavor[] getTransferDataFlavors() { + return new DataFlavor[] { javaImg }; + } + protected boolean in(DataFlavor flavor, DataFlavor[] flavors) { + int f = 0; + while ((f < flavors.length) && !flavor.equals(flavors[f])) { + f++; + } + return f < flavors.length; + } + @Override + public void lostOwnership(Clipboard clipboard, Transferable contents) { + image = null; + } + } + + protected void notifyListeners(String newModeId) + { + int i = 0; + EditorModeListener listener = null; + for (i = 0; i < mListenerVector.size(); i++) + { + listener = mListenerVector.elementAt(i); + listener.editorModeChanged(newModeId); + } + } + public void setGraphModelManager(GraphModelManager graphModelManager) + { + mStartVertexController.setGraphModelManager(graphModelManager); + mDeletionController.setGraphModelManager(graphModelManager); + } + public void setGraphPanel(GraphPanel graphPanel) + { + graphPanel.addKeyListener(mDeletionController); + mDeletionController.setGraphPanel(graphPanel); + } + public void addEditorModeListener(EditorModeListener listener) + { + mListenerVector.add(listener); + } + public void removeEditorModeListener(EditorModeListener listener) + { + mListenerVector.remove(listener); + } + public void setGraphEditable(boolean editable) + { + mVertexModeButton.setEnabled(editable); + mEdgeModeButton.setEnabled(editable); + } + public EditorToolBar self() + { + return this; + } + @Override + public int print(Graphics g, PageFormat pf, int i) throws PrinterException + { + if (i >= 1) + { + return Printable.NO_SUCH_PAGE; + } + Graphics2D g2d = (Graphics2D) g; + double scalex = pf.getImageableWidth() / mGraphPanel.getWidth(); + double scaley = pf.getImageableHeight() / mGraphPanel.getHeight(); + double scale = Math.min(Math.min(scalex, scaley), 1); + g2d.translate(pf.getImageableX(), pf.getImageableY()); + g2d.scale(scale, scale); + mGraphPanel.printComponent(g2d); + return Printable.PAGE_EXISTS; + } +} diff --git a/src/main/java/org/cristalise/gui/graph/view/GraphPanel.java b/src/main/java/org/cristalise/gui/graph/view/GraphPanel.java new file mode 100644 index 0000000..1076d1b --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/view/GraphPanel.java @@ -0,0 +1,612 @@ +package org.cristalise.gui.graph.view; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Paint; +import java.awt.Polygon; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Observable; +import java.util.Observer; +import java.util.Vector; + +import javax.swing.JPanel; + +import org.cristalise.gui.ImageLoader; +import org.cristalise.gui.graph.controller.ElasticBand; +import org.cristalise.gui.graph.controller.Selection; +import org.cristalise.gui.graph.event.ElasticBandResizedEvent; +import org.cristalise.gui.graph.event.ElasticBandSetEvent; +import org.cristalise.gui.graph.event.SelectionChangedEvent; +import org.cristalise.gui.graph.event.SelectionMovedEvent; +import org.cristalise.kernel.graph.event.EntireModelChangedEvent; +import org.cristalise.kernel.graph.event.GraphModelResizedEvent; +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.graph.model.Vertex; + +public class GraphPanel extends JPanel implements Observer +{ + // There should always be a Selection object + protected Selection mSelection = new Selection(null, null, 0, 0, 0, 0); + private ElasticBand mElasticBand = null; + protected final Paint mSelectionPaint = Color.black; + protected final Paint mStartPaint = Color.green; + protected final Image mResizePadImg = ImageLoader.findImage("graph/resizepad.gif").getImage(); + protected final BasicStroke mDashed = + new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float[] { 5.0f }, 0.0f); + protected GraphModelManager mGraphModelManager = null; + protected VertexRenderer mVertexRenderer = null; + protected DirectedEdgeRenderer mDirectedEdgeRenderer = null; + private final SelectionChangedEvent mSelectionChangedEvent = new SelectionChangedEvent(); + private final SelectionMovedEvent mSelectionMovedEvent = new SelectionMovedEvent(); + private final ElasticBandResizedEvent mElasticBandResizedEvent = new ElasticBandResizedEvent(); + private final ElasticBandSetEvent mElasticBandSetEvent = new ElasticBandSetEvent(); + + public GraphPanel(DirectedEdgeRenderer eRenderer, VertexRenderer vRenderer) + { + mVertexRenderer = vRenderer; + mDirectedEdgeRenderer = eRenderer; + // Request the keyboard focus if the mouse + // is pressed on the graph panel + addMouseListener(new MouseAdapter() + { + @Override + public void mousePressed(MouseEvent me) + { + requestFocus(); + } + }); + } + public void setGraphModelManager(GraphModelManager graphModelManager) + { + mGraphModelManager = graphModelManager; + } + @Override + public void update(Observable o, Object arg) + { + if (arg instanceof EntireModelChangedEvent) + { + mSelection = new Selection(null, null, 0, 0, 0, 0); + } + if (arg instanceof GraphModelResizedEvent || arg instanceof EntireModelChangedEvent) + { + setPreferredSize(new Dimension(mGraphModelManager.getModel().getWidth(), mGraphModelManager.getModel().getHeight())); + revalidate(); + } + repaint(); + } + // Updates the top left and bottom right corners of the selection + private void updateSelectionCorners() { + Vertex vertex = mSelection.mVertices[0]; + GraphPoint centrePoint = vertex.getCentrePoint(); + if (centrePoint == null) return; + mSelection.mTopLeftX = centrePoint.x; + mSelection.mTopLeftY = centrePoint.y; + mSelection.mBottomRightX = centrePoint.x; + mSelection.mBottomRightY = centrePoint.y; + for (Vertex mVertice : mSelection.mVertices) { + vertex = mVertice; + centrePoint = vertex.getCentrePoint(); + if (centrePoint.x < mSelection.mTopLeftX) { + mSelection.mTopLeftX = centrePoint.x; + } + if (centrePoint.y < mSelection.mTopLeftY) { + mSelection.mTopLeftY = centrePoint.y; + } + if (centrePoint.x > mSelection.mBottomRightX) { + mSelection.mBottomRightX = centrePoint.x; + } + if (centrePoint.y > mSelection.mBottomRightY) { + mSelection.mBottomRightY = centrePoint.y; + } + } + } + + public void deleteSelection() { + int i = 0; + if (mSelection.mVertices != null) { + for (i = 0; i < mSelection.mVertices.length; i++) { + mGraphModelManager.getModel().removeVertex(mSelection.mVertices[i]); + } + } + else if (mSelection.mEdge != null) { + mGraphModelManager.getModel().removeEdge(mSelection.mEdge); + } + // Make sure nothing is selected + if ((mSelection.mEdge != null) || (mSelection.mVertices != null)) { + mSelection.mEdge = null; + mSelection.mVertices = null; + mSelectionChangedEvent.mSelection = mSelection; + mGraphModelManager.notifyObservers(mSelectionChangedEvent); + } + } + + public void selectAll() { + Vertex[] allVertices = mGraphModelManager.getModel().getVertices(); + if (allVertices.length > 0) { + mSelection.mEdge = null; + mSelection.mVertices = allVertices; + updateSelectionCorners(); + mSelectionChangedEvent.mSelection = mSelection; + mGraphModelManager.notifyObservers(mSelectionChangedEvent); + } + } + + public void selectContentsOfElasticBand() { + if (mElasticBand == null) return; + Polygon bandPolygon = new Polygon(); + Vertex[] allVertices = mGraphModelManager.getModel().getVertices(); + GraphPoint centrePoint = null; + Vector verticesInside = new Vector(10, 10); + int i = 0; + // Create a polygon representing the elastic band + bandPolygon.addPoint(mElasticBand.mFixedCorner.x, mElasticBand.mFixedCorner.y); + bandPolygon.addPoint(mElasticBand.mMovingCorner.x, mElasticBand.mFixedCorner.y); + bandPolygon.addPoint(mElasticBand.mMovingCorner.x, mElasticBand.mMovingCorner.y); + bandPolygon.addPoint(mElasticBand.mFixedCorner.x, mElasticBand.mMovingCorner.y); + // Create a vector of all of the vertices within the elastic band polygon + for (i = 0; i < allVertices.length; i++) { + centrePoint = allVertices[i].getCentrePoint(); + if (bandPolygon.contains(centrePoint.x, centrePoint.y)) { + verticesInside.add(allVertices[i]); + } + } + + // Select the vertices found within the elastic band polygon + if (verticesInside.size() == 0) { + mSelection.mTopLeftX = 0; + mSelection.mTopLeftY = 0; + mSelection.mBottomRightX = 0; + mSelection.mBottomRightY = 0; + mSelection.mEdge = null; + // select parent vertex if we have selected the 'paper' + if (mGraphModelManager.getModel().getContainingVertex() != null) + verticesInside.add(mGraphModelManager.getModel().getContainingVertex()); + else + mSelection.mVertices = null; + } + + if (verticesInside.size() > 0) { + mSelection.mEdge = null; + mSelection.mVertices = new Vertex[verticesInside.size()]; + for (i = 0; i < verticesInside.size(); i++) { + mSelection.mVertices[i] = verticesInside.elementAt(i); + } + updateSelectionCorners(); + } + // Remove the elastic band + mElasticBand = null; + mSelectionChangedEvent.mSelection = mSelection; + mGraphModelManager.notifyObservers(mSelectionChangedEvent); + } + + + + public void setSelectedVertexToBeStart() { + if (mSelection.mVertices != null) { + if (mSelection.mVertices.length == 1) { + mGraphModelManager.getModel().setStartVertexId(mSelection.mVertices[0].getID()); + } + } + } + + public Selection getSelection() { + return mSelection; + } + + public void setElasticBand(ElasticBand elasticBand) { + mElasticBand = elasticBand; + mGraphModelManager.notifyObservers(mElasticBandSetEvent); + } + + public void resizeElasticBand(GraphPoint movingCorner) { + mElasticBand.mMovingCorner = movingCorner; + mGraphModelManager.notifyObservers(mElasticBandResizedEvent); + } + + public boolean inSelection(Vertex v) { + int i = 0; + if (mSelection.mVertices == null) { + return false; + } + else { + for (i = 0; i < mSelection.mVertices.length; i++) { + if (mSelection.mVertices[i] == v) { + return true; + } + } + return false; + } + } + + // Only use this method to remove one vertex. + // If you wish to remove more, it would + // propably be more efficient to create a + // new Selection object. + public void removeFromSelection(Vertex v) { + Vertex[] vertices = null; + int i = 0; + int j = 0; + if (mSelection.mVertices.length == 1) { + mSelection.mVertices = null; + mSelection.mTopLeftX = 0; + mSelection.mTopLeftY = 0; + mSelection.mBottomRightX = 0; + mSelection.mBottomRightY = 0; + } + else { + vertices = new Vertex[mSelection.mVertices.length - 1]; + for (i = 0; i < mSelection.mVertices.length; i++) { + if (mSelection.mVertices[i] != v) { + vertices[j] = mSelection.mVertices[i]; + j++; + } + } + mSelection.mVertices = vertices; + updateSelectionCorners(); + } + mGraphModelManager.notifyObservers(mSelectionChangedEvent); + } + + // Only use this method to add one vertex. + // If you wish to add more, it would + // propably be more efficient to create a + // new Selection object. + public void addToSelection(Vertex v) { + Vertex[] vertices = new Vertex[mSelection.mVertices.length + 1]; + GraphPoint centrePoint = null; + int i = 0; + if (mSelection.mVertices == null) { + centrePoint = v.getCentrePoint(); + mSelection.mVertices = new Vertex[] { v }; + mSelection.mTopLeftX = centrePoint.x; + mSelection.mTopLeftY = centrePoint.y; + mSelection.mBottomRightX = centrePoint.x; + mSelection.mBottomRightY = centrePoint.y; + } + else { + for (i = 0; i < mSelection.mVertices.length; i++) { + vertices[i] = mSelection.mVertices[i]; + } + vertices[mSelection.mVertices.length] = v; + mSelection.mVertices = vertices; + updateSelectionCorners(); + } + mGraphModelManager.notifyObservers(mSelectionChangedEvent); + } + public void moveAbsoluteSelection(int newTopLeftX, int newTopLeftY) { + int selectionHeight = mSelection.mBottomRightY - mSelection.mTopLeftY; + int selectionWidth = mSelection.mBottomRightX - mSelection.mTopLeftX; + int bottomRightX = newTopLeftX + selectionWidth; + int bottomRightY = newTopLeftY + selectionHeight; + GraphPoint oldCentrePoint = null; + GraphPoint newCentrePoint = null; + int distXFromTopLeft = 0; + int distYFromTopLeft = 0; + int i = 0; + // Make sure the selection does not move + // outside the boundaries of the graph + if (newTopLeftX < 0) newTopLeftX = 0; + if (newTopLeftY < 0) newTopLeftY = 0; + int graphWidth = mGraphModelManager.getModel().getWidth(); + if (bottomRightX > graphWidth) newTopLeftX = graphWidth - selectionWidth; + int graphHeight = mGraphModelManager.getModel().getHeight(); + if (bottomRightY > graphHeight) newTopLeftY = graphHeight - selectionHeight; + // For each selected vertex + for (i = 0; i < mSelection.mVertices.length; i++) { + // Calculate the new centre point of the vertex. + // First calculate the distance of the centre point + // from the old top left hand corner of the selection, + // then move the point to the new top left hand + // corner plus the distance. + oldCentrePoint = mSelection.mVertices[i].getCentrePoint(); + distXFromTopLeft = oldCentrePoint.x - mSelection.mTopLeftX; + distYFromTopLeft = oldCentrePoint.y - mSelection.mTopLeftY; + newCentrePoint = new GraphPoint(newTopLeftX + distXFromTopLeft, newTopLeftY + distYFromTopLeft); + mGraphModelManager.getModel().moveAbsoluteVertex(mSelection.mVertices[i], newCentrePoint); + } + // Update the top left and bottom right corners + mSelection.mTopLeftX = newTopLeftX; + mSelection.mTopLeftY = newTopLeftY; + mSelection.mBottomRightX = newTopLeftX + selectionWidth; + mSelection.mBottomRightY = newTopLeftY + selectionHeight; + mGraphModelManager.notifyObservers(mSelectionMovedEvent); + } + + // If the specified point is within more than one vertex, + // then the smallest vertex is returned. + public Vertex getVertex(GraphPoint p) { + Object[] vertexObjs = mGraphModelManager.getModel().getVertices(); + Vertex vertex = null; + Vector vertexVector = new Vector(10, 10); + int numVerticesFound = 0; + Vertex smallestVertex = null; + int sizeOfSmallestVertex = 0; + int sizeOfVertex = 0; + int i = 0; + for (i = 0; i < vertexObjs.length; i++) { + vertex = (Vertex)vertexObjs[i]; + if (vertex.containsPoint(p)) { + vertexVector.add(vertex); + } + } + numVerticesFound = vertexVector.size(); + if (numVerticesFound == 0) { + return null; + } + else { + smallestVertex = vertexVector.elementAt(0); + sizeOfSmallestVertex = smallestVertex.getHeight() * smallestVertex.getWidth(); + // Determine the smallest vertex + for (i = 1; i < numVerticesFound; i++) { + vertex = vertexVector.elementAt(i); + sizeOfVertex = vertex.getHeight() * vertex.getWidth(); + if (sizeOfVertex < sizeOfSmallestVertex) { + smallestVertex = vertex; + sizeOfSmallestVertex = sizeOfVertex; + } + } + return smallestVertex; + } + } + + public DirectedEdge getEdge(GraphPoint p) { + Object[] edgeObjs = mGraphModelManager.getModel().getEdges(); + DirectedEdge edge = null; + int i = 0; + for (i = 0; i < edgeObjs.length; i++) { + edge = (DirectedEdge)edgeObjs[i]; + if (edge.containsPoint(p)) { + return edge; + } + } + return null; + } + + + public void setSelection(Selection s) { + // If the there is a change + if (selectionChanged(s)) { + mSelection = s; + mSelectionChangedEvent.mSelection = s; + mGraphModelManager.notifyObservers(mSelectionChangedEvent); + } + } + + private boolean selectionChanged(Selection newValue) { + int i = 0; + if (mSelection.mEdge != newValue.mEdge) { + return true; + } + if (mSelection.mVertices == null) { + if (newValue.mVertices == null) { + return false; + } + else { + return true; + } + } + else { + if (newValue.mVertices == null) { + return true; + } + else { + if (mSelection.mVertices.length != newValue.mVertices.length) { + return true; + } + for (i = 0; i < mSelection.mVertices.length; i++) { + if (mSelection.mVertices[i] != newValue.mVertices[i]) { + return true; + } + } + return false; + } + } + } + @Override + public void paintComponent(Graphics g) + { + Graphics2D g2d = (Graphics2D) g; + DirectedEdge[] edges = null; + Vertex[] vertices = null; + Vertex startVertex = null; + Vertex newEdgeOriginVertex = null; + GraphPoint newEdgeOriginPoint = null; + GraphPoint newEdgeEndPoint = null; + GraphPoint vertexCentre = null; + int i = 0; + super.paintComponent(g); + if (mGraphModelManager != null) + { + // Get the edges and vertices from the model + edges = mGraphModelManager.getModel().getEdges(); + vertices = mGraphModelManager.getModel().getVertices(); + //graphable = mGraphModelManager.getModel(). + // Draw the edges + for (i = 0; i < edges.length; i++) + { + mDirectedEdgeRenderer.draw(g2d, edges[i]); + } + // Draw the vertices + for (i = 0; i < vertices.length; i++) + { + mVertexRenderer.draw(g2d, vertices[i]); + } + g2d.setPaint(mStartPaint); + // Highlight the start vertex if there is one + startVertex = mGraphModelManager.getModel().getStartVertex(); + if (startVertex != null) + { + drawVertexHighlight(g2d, startVertex, 1); + } + g2d.setPaint(mSelectionPaint); + // Draw the outline of the selected + // vertices if there are any + if (mSelection.mVertices != null) + { + g2d.setStroke(mDashed); + for (i = 0; i < mSelection.mVertices.length; i++) + { + if (mSelection.mVertices[i] != mGraphModelManager.getModel().getContainingVertex()) + drawVertexHighlight(g2d, mSelection.mVertices[i], 5); + } + // Draw the resize pads if there is one and only one vertex selected + if (mSelection.mVertices.length == 1 && + mSelection.mVertices[0] != mGraphModelManager.getModel().getContainingVertex()) + { + vertexCentre = mSelection.mVertices[0].getCentrePoint(); + g2d.drawImage( + mResizePadImg, + vertexCentre.x + mSelection.mVertices[0].getWidth() / 2, + vertexCentre.y + mSelection.mVertices[0].getHeight() / 2, + this); + } + } + // Draw the outline of the selected + // edge if there is one + if (mSelection.mEdge != null) + { + drawEdgeHighlight(g2d, mSelection.mEdge); + } + // Draw the elastic band if there + // is one + if (mElasticBand != null) + { + g2d.drawLine( + mElasticBand.mFixedCorner.x, + mElasticBand.mFixedCorner.y, + mElasticBand.mMovingCorner.x, + mElasticBand.mFixedCorner.y); + g2d.drawLine( + mElasticBand.mMovingCorner.x, + mElasticBand.mFixedCorner.y, + mElasticBand.mMovingCorner.x, + mElasticBand.mMovingCorner.y); + g2d.drawLine( + mElasticBand.mMovingCorner.x, + mElasticBand.mMovingCorner.y, + mElasticBand.mFixedCorner.x, + mElasticBand.mMovingCorner.y); + g2d.drawLine( + mElasticBand.mFixedCorner.x, + mElasticBand.mMovingCorner.y, + mElasticBand.mFixedCorner.x, + mElasticBand.mFixedCorner.y); + } + // Draw the new edge under construction if there is one + newEdgeEndPoint = mGraphModelManager.getModel().getNewEdgeEndPoint(); + newEdgeOriginVertex = mGraphModelManager.getModel().getNewEdgeOriginVertex(); + if ((newEdgeEndPoint != null) && (newEdgeOriginVertex != null)) + { + newEdgeOriginPoint = newEdgeOriginVertex.getCentrePoint(); + g2d.setPaint(Color.black); + g2d.drawLine(newEdgeOriginPoint.x, newEdgeOriginPoint.y, newEdgeEndPoint.x, newEdgeEndPoint.y); + } + } + } + // Draws the highlight of the specified vertex the specified dist from its outline + protected void drawVertexHighlight(Graphics2D g2d, Vertex vertex, int dist) + { + GraphPoint[] outlinePoints = vertex.getOutlinePoints(); + GraphPoint centrePoint = vertex.getCentrePoint(); + int i = 0; + /* + * float dash1[] ={5.0f}; BasicStroke bs = new BasicStroke(5.0f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,10.0f, dash1,0.0f); + */ + for (i = 0; i < outlinePoints.length - 1; i++) + { + drawShiftedLine(dist, g2d, centrePoint, outlinePoints[i].x, outlinePoints[i].y, outlinePoints[i + 1].x, outlinePoints[i + 1].y); + } + drawShiftedLine( + dist, + g2d, + centrePoint, + outlinePoints[outlinePoints.length - 1].x, + outlinePoints[outlinePoints.length - 1].y, + outlinePoints[0].x, + outlinePoints[0].y); + } + // Draws the specifed line the specified distance away from the specified centre point + private static void drawShiftedLine(int dist, Graphics2D g2d, GraphPoint centrePoint, int x1, int y1, int x2, int y2) + { + if (x1 > centrePoint.x) + x1 += dist; + if (x1 < centrePoint.x) + x1 -= dist; + if (y1 > centrePoint.y) + y1 += dist; + if (y1 < centrePoint.y) + y1 -= dist; + if (x2 > centrePoint.x) + x2 += dist; + if (x2 < centrePoint.x) + x2 -= dist; + if (y2 > centrePoint.y) + y2 += dist; + if (y2 < centrePoint.y) + y2 -= dist; + g2d.drawLine(x1, y1, x2, y2); + } + // Draws the highlight of the specified edge + protected void drawEdgeHighlight(Graphics2D g2d, DirectedEdge edge) + { + GraphPoint originPoint = edge.getOriginPoint(); + GraphPoint terminusPoint = edge.getTerminusPoint(); + int midX = originPoint.x + (terminusPoint.x - originPoint.x) / 2; + int midY = originPoint.y + (terminusPoint.y - originPoint.y) / 2; + int minX = midX - 10; + int minY = midY - 10; + int maxX = midX + 10; + int maxY = midY + 10; + g2d.drawLine(minX, minY, maxX, minY); + g2d.drawLine(maxX, minY, maxX, maxY); + g2d.drawLine(maxX, maxY, minX, maxY); + g2d.drawLine(minX, maxY, minX, minY); + } + @Override + public void printComponent(Graphics g) + { + super.paintComponent(g); + Graphics2D g2d = (Graphics2D) g; + DirectedEdge[] edges = null; + Vertex[] vertices = null; + Vertex startVertex = null; + int i = 0; + g.setColor(Color.white); + g2d.fillRect(0,0,getWidth(),getHeight()); + if (mGraphModelManager != null) + { + // Get the edges and vertices from the model + edges = mGraphModelManager.getModel().getEdges(); + vertices = mGraphModelManager.getModel().getVertices(); + //graphable = mGraphModelManager.getModel(). + // Draw the edges + for (i = 0; i < edges.length; i++) + { + mDirectedEdgeRenderer.draw(g2d, edges[i]); + } + // Draw the vertices + for (i = 0; i < vertices.length; i++) + { + mVertexRenderer.draw(g2d, vertices[i]); + } + g2d.setPaint(mStartPaint); + // Highlight the start vertex if there is one + startVertex = mGraphModelManager.getModel().getStartVertex(); + if (startVertex != null) + { + drawVertexHighlight(g2d, startVertex, 1); + } + } + } + + protected void superPaint(Graphics g) + { + super.paintComponent(g); + } +} diff --git a/src/main/java/org/cristalise/gui/graph/view/PropertyTable.java b/src/main/java/org/cristalise/gui/graph/view/PropertyTable.java new file mode 100644 index 0000000..d88e3a6 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/view/PropertyTable.java @@ -0,0 +1,41 @@ +package org.cristalise.gui.graph.view; + +import javax.swing.JTable; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; + + +public class PropertyTable extends JTable +{ + public PropertyTable(PropertyTableModel tableModel) + { + super(tableModel); + putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); + } + + + @Override + public TableCellRenderer getCellRenderer(int row, int column) { + + + return getDefaultRenderer(getCellClass(row, column)); + + } + + @Override +public TableCellEditor getCellEditor(int row, int column) { + + return getDefaultEditor(getCellClass(row, column)); + + } + + private Class getCellClass(int row, int column) { + Class cellClass = String.class; + + try { + cellClass = dataModel.getValueAt(row, column).getClass(); + } catch (NullPointerException ex) { } + + return cellClass; + } +} diff --git a/src/main/java/org/cristalise/gui/graph/view/PropertyTableModel.java b/src/main/java/org/cristalise/gui/graph/view/PropertyTableModel.java new file mode 100644 index 0000000..173946a --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/view/PropertyTableModel.java @@ -0,0 +1,160 @@ +package org.cristalise.gui.graph.view; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +import javax.swing.JOptionPane; +import javax.swing.event.TableModelEvent; +import javax.swing.table.AbstractTableModel; + +import org.cristalise.kernel.utils.CastorHashMap; +import org.cristalise.kernel.utils.Language; + + +/************************************************************************** + * + * $Revision: 1.4 $ + * $Date: 2005/08/02 07:50:10 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class PropertyTableModel extends AbstractTableModel { + + private final String[] mColumnNames = { Language.translate("Name"), Language.translate("Value"), Language.translate("Abstract") }; + public CastorHashMap sourceMap = new CastorHashMap(); + public ArrayList sortedNameList = new ArrayList(); + boolean isEditable = false; + + public PropertyTableModel() { + super(); + } + + @Override + public int getColumnCount() + { + return mColumnNames.length; + } + @Override + public String getColumnName(int col) + { + return mColumnNames[col]; + } + @Override + public int getRowCount() + { + synchronized (sourceMap) { + return sourceMap.size(); + } + } + @Override + public Object getValueAt(int rowIndex, int colIndex) + { + synchronized (sourceMap) { + String rowName = sortedNameList.get(rowIndex); + switch (colIndex) { + case 0: + return rowName; + case 1: + return sourceMap.get(rowName); + case 2: + return sourceMap.getAbstract().contains(rowName); + default: + return ""; + } + } + } + + @Override + public void setValueAt(Object value, int rowIndex, int colIndex) + { + synchronized (sourceMap) { + if (colIndex == 0) return; + String rowName = sortedNameList.get(rowIndex); + if (colIndex == 1) { + Class oldElement = sourceMap.get(rowName).getClass(); + if (oldElement == Double.class && value.getClass() == String.class) + try { + value = Double.valueOf((String)value); + } catch (Exception ex) { } + if (value.getClass() != oldElement) + JOptionPane.showMessageDialog(null, "This property should contain a "+oldElement.getName()+" not a "+value.getClass().getName(), "Incorrect datatype", JOptionPane.ERROR_MESSAGE); + else + sourceMap.put(rowName, value); + } + else if (colIndex == 2) { + Boolean boolVal = (Boolean)value; + if (boolVal) + sourceMap.getAbstract().add(rowName); + else + sourceMap.getAbstract().remove(rowName); + } + } + fireTableCellUpdated(rowIndex, colIndex); + } + + @Override + public Class getColumnClass(int columnIndex) { + switch (columnIndex) { + case 2: + return Boolean.class; + default: + return String.class; + } + } + + public void setMap(CastorHashMap props) { + synchronized (sourceMap) { + sourceMap = props; + sortedNameList = new ArrayList(props.size()); + for (String string : props.keySet()) + sortedNameList.add(string); + + Collections.sort(sortedNameList, new Comparator() { + @Override + public int compare(String o1, String o2) { + return (o1.compareToIgnoreCase(o2)); + } + }); + } + fireTableChanged(new TableModelEvent(this)); + } + + @Override + public boolean isCellEditable(int row, int col) + { + return col>0 && isEditable; + } + + /** + * @return Returns the isEditable. + */ + public boolean isEditable() { + return isEditable; + } + /** + * @param isEditable The isEditable to set. + */ + public void setEditable(boolean isEditable) { + this.isEditable = isEditable; + } + + /** + * @param text + * @param object + */ + public void addProperty(String text, Object object, boolean isAbstract) { + sourceMap.put(text, object, isAbstract); + setMap(sourceMap); + } + + /** + * @param object + */ + public void delProperty(Object propName) { + sourceMap.remove(propName); + setMap(sourceMap); + } +} diff --git a/src/main/java/org/cristalise/gui/graph/view/SelectedVertexPanel.java b/src/main/java/org/cristalise/gui/graph/view/SelectedVertexPanel.java new file mode 100644 index 0000000..426a456 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/view/SelectedVertexPanel.java @@ -0,0 +1,28 @@ +package org.cristalise.gui.graph.view; + +import javax.swing.JPanel; + +import org.cristalise.kernel.graph.model.Vertex; + + +/************************************************************************** + * + * $Revision: 1.1 $ + * $Date: 2005/05/12 10:12:52 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + + + +public abstract class SelectedVertexPanel extends JPanel { + + public SelectedVertexPanel() { + super(); + } + + public abstract void select(Vertex vert); + + public abstract void clear(); +} diff --git a/src/main/java/org/cristalise/gui/graph/view/VertexPropertyPanel.java b/src/main/java/org/cristalise/gui/graph/view/VertexPropertyPanel.java new file mode 100644 index 0000000..006e3b0 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/view/VertexPropertyPanel.java @@ -0,0 +1,267 @@ +package org.cristalise.gui.graph.view; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.lang.reflect.Constructor; +import java.util.Observable; +import java.util.Observer; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.graph.event.SelectionChangedEvent; +import org.cristalise.gui.tabs.ItemTabPane; +import org.cristalise.kernel.graph.event.EntireModelChangedEvent; +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.GraphableEdge; +import org.cristalise.kernel.graph.model.GraphableVertex; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.utils.CastorHashMap; +import org.cristalise.kernel.utils.Language; + + +/************************************************************************** + * + * $Revision: 1.4 $ + * $Date: 2005/09/09 12:19:28 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class VertexPropertyPanel extends JPanel implements Observer, TableModelListener, ActionListener { + + private final PropertyTableModel mPropertyModel; + private final PropertyTable mPropertyTable; + private GraphModelManager mGraphModelManager; + private boolean isEditable = false; + GridBagLayout gridbag = new GridBagLayout(); + protected JLabel selObjName; + protected JLabel selObjClass; + JButton addPropButton; + JButton delPropButton; + Box newPropBox; + private JTextField newPropName; + private JComboBox newPropType; + private JCheckBox newPropAbstract; + String[] typeOptions = { "String", "Boolean", "Integer", "Float" }; + String[] typeInitVal = { "", "false", "0", "0.0"}; + SelectedVertexPanel mSelPanel; + + public VertexPropertyPanel() { + super(); + setLayout(gridbag); + mPropertyModel = new PropertyTableModel(); + mPropertyModel.addTableModelListener(this); + mPropertyTable = new PropertyTable(mPropertyModel); + } + + /** + * + */ + + @Override + public void update(Observable o, Object arg) { + Vertex[] selectedVertices = null; + DirectedEdge selectedEdge = null; + // If the selection has changed + if (arg instanceof SelectionChangedEvent) + { + SelectionChangedEvent event = (SelectionChangedEvent) arg; + selectedVertices = event.mSelection.mVertices; + if (selectedVertices != null) + { + if (selectedVertices.length == 1) + { + setVertex(selectedVertices[0]); + return; + } + } + selectedEdge = event.mSelection.mEdge; + if (selectedEdge != null) + { + setEdge(selectedEdge); + return; + } + } + if (arg instanceof SelectionChangedEvent || arg instanceof EntireModelChangedEvent){ + clear(); + } + } + + + @Override + public void tableChanged(TableModelEvent e) { + if (mGraphModelManager!=null) + mGraphModelManager.forceNotify(); + + } + + public void setVertex(Vertex vert) { + if (vert.getName().equals("domain")) + selObjName.setText("Domain Workflow"); + else + selObjName.setText(vert.getName()); + String className = vert.getClass().getName(); + selObjClass.setText(className.substring(className.lastIndexOf('.')+1)); + if (mSelPanel != null) mSelPanel.select(vert); + if (vert instanceof GraphableVertex) { + mPropertyModel.setMap(((GraphableVertex)vert).getProperties()); + addPropButton.setEnabled(isEditable); + delPropButton.setEnabled(isEditable); + } + } + + public void setEdge(DirectedEdge edge) { + selObjName.setText(edge.getName()); + String className = edge.getClass().getName(); + selObjClass.setText(className.substring(className.lastIndexOf('.')+1)); + if (edge instanceof GraphableEdge) { + mPropertyModel.setMap(((GraphableEdge)edge).getProperties()); + addPropButton.setEnabled(isEditable); + delPropButton.setEnabled(isEditable); + } + if (mSelPanel != null) mSelPanel.clear(); + } + + public void clear() { + selObjName.setText(""); + selObjClass.setText("Nothing Selected"); + mPropertyModel.setMap(new CastorHashMap()); + if (mSelPanel != null) mSelPanel.clear(); + addPropButton.setEnabled(false); + delPropButton.setEnabled(false); + } + + /** + * @param isEditable The isEditable to set. + */ + public void setEditable(boolean editable) { + mPropertyModel.setEditable(editable); + isEditable = editable; + newPropBox.setVisible(editable); + } + + public void setGraphModelManager(GraphModelManager manager) { + mGraphModelManager = manager; + manager.addObserver(this); + } + + public void createLayout(SelectedVertexPanel selPanel) + { + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = 0; + c.weightx = 1; + c.weighty = 0; + c.anchor = GridBagConstraints.NORTHWEST; + c.ipadx = 5; + c.ipady = 5; + + selObjName = new JLabel(); + selObjName.setFont(ItemTabPane.titleFont); + gridbag.setConstraints(selObjName, c); + add(selObjName); + + c.gridy++; + selObjClass = new JLabel(); + gridbag.setConstraints(selObjClass, c); + add(selObjClass); + + c.gridy++; + JLabel title = new JLabel("Properties"); + title.setFont(ItemTabPane.titleFont); + gridbag.setConstraints(title, c); + add(title); + + c.gridy++; + c.fill = GridBagConstraints.BOTH; + c.weighty = 2; + JScrollPane scroll = new JScrollPane(mPropertyTable); + gridbag.setConstraints(scroll, c); + add(scroll); + + newPropBox = Box.createHorizontalBox(); + newPropBox.add(new JLabel(Language.translate("New :"))); + newPropBox.add(Box.createHorizontalGlue()); + newPropName = new JTextField(15); + newPropBox.add(newPropName); + newPropType = new JComboBox(typeOptions); + newPropBox.add(newPropType); + newPropBox.add(Box.createHorizontalGlue()); + newPropAbstract = new JCheckBox(); + newPropBox.add(newPropAbstract); + newPropBox.add(Box.createHorizontalStrut(1)); + newPropBox.add(new JLabel("Abstract")); + newPropBox.add(Box.createHorizontalStrut(1)); + addPropButton = new JButton("Add"); + addPropButton.setMargin(new Insets(0, 0, 0, 0)); + delPropButton = new JButton("Del"); + delPropButton.setMargin(new Insets(0, 0, 0, 0)); + addPropButton.addActionListener(this); + delPropButton.addActionListener(this); + newPropBox.add(addPropButton); + newPropBox.add(delPropButton); + + c.gridy++; + c.weighty=0; + c.fill= GridBagConstraints.HORIZONTAL; + gridbag.setConstraints(newPropBox, c); + add(newPropBox); + + if (selPanel != null) { + c.gridy++; + mSelPanel = selPanel; + gridbag.setConstraints(mSelPanel, c); + add(mSelPanel); + } + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getSource() == addPropButton) { + if (newPropName.getText().length() < 1) { + JOptionPane.showMessageDialog(this, "Enter a name for the new property", "Cannot add property", JOptionPane.ERROR_MESSAGE); + return; + } + if (mPropertyModel.sourceMap.containsKey(newPropName.getText())) { + JOptionPane.showMessageDialog(this, "Property '"+newPropName.getText()+"' already exists.", "Cannot add property", JOptionPane.ERROR_MESSAGE); + return; + } + if (mPropertyTable.getCellEditor() != null) + mPropertyTable.getCellEditor().stopCellEditing(); + + try { + Class newPropClass = Class.forName("java.lang."+typeOptions[newPropType.getSelectedIndex()]); + Class[] params = {String.class}; + Constructor init = newPropClass.getConstructor(params); + Object[] initParams = { typeInitVal[newPropType.getSelectedIndex()] }; + mPropertyModel.addProperty(newPropName.getText(), init.newInstance(initParams), newPropAbstract.isSelected()); + } catch (Exception ex) { + MainFrame.exceptionDialog(ex); + } + } + else if (e.getSource() == delPropButton) { + int selrow = mPropertyTable.getSelectedRow(); + if (selrow == -1) { + JOptionPane.showMessageDialog(this, "Select a property to remove", "Cannot delete property", JOptionPane.ERROR_MESSAGE); + return; + } + mPropertyModel.delProperty(mPropertyModel.sortedNameList.get(selrow)); + } + } +} diff --git a/src/main/java/org/cristalise/gui/graph/view/VertexRenderer.java b/src/main/java/org/cristalise/gui/graph/view/VertexRenderer.java new file mode 100644 index 0000000..2aa7e49 --- /dev/null +++ b/src/main/java/org/cristalise/gui/graph/view/VertexRenderer.java @@ -0,0 +1,12 @@ +package org.cristalise.gui.graph.view; + +import java.awt.Graphics2D; + +import org.cristalise.kernel.graph.model.Vertex; + + + +public interface VertexRenderer +{ + public void draw(Graphics2D g2d, Vertex vertex); +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/chooser/ActivityChooser.java b/src/main/java/org/cristalise/gui/lifecycle/chooser/ActivityChooser.java new file mode 100644 index 0000000..d63a2c5 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/chooser/ActivityChooser.java @@ -0,0 +1,195 @@ +/* + * Created on 1 sept. 2003 + * + * To change the template for this generated file go to Window>Preferences>Java>Code Generation>Code and Comments + */ +package org.cristalise.gui.lifecycle.chooser; + +import java.awt.Container; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Image; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.cristalise.gui.ImageLoader; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + +/** + * @author Developpement + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class ActivityChooser extends JFrame +{ + private LDAPFileChooser mLDAPFileChooserActivity = null; + + private JButton mButtonOK = null; + + private JButton mButtonCancel = null; + + private JPanel mJPanelVertical = null; + + private JPanel mJPanelHorizontal = null; + + private String mMessage = "Choose or modify"; + + private WorkflowDialogue mParent = null; + + private JLabel label = null; + + HashMap mhashmap = null; + + public ActivityChooser(String message, String title, Image img, WorkflowDialogue parent, HashMap hashmap) + { + super(title); + mMessage = message; + img = ImageLoader.findImage("graph/newvertex_large.png").getImage(); + setIconImage(img); + mParent = parent; + mhashmap = hashmap; + initialize(); + } + + private JButton getJButtonOK() + { + if (mButtonOK == null) + mButtonOK = new JButton(Language.translate("OK")); + return mButtonOK; + } + + private JButton getJButtonCancel() + { + if (mButtonCancel == null) + mButtonCancel = new JButton(Language.translate("Cancel")); + return mButtonCancel; + } + + private LDAPFileChooser getLDAPFileChooserActivity() + { + if (mLDAPFileChooserActivity == null) + { + try + { + mLDAPFileChooserActivity = new LDAPFileChooser(LDAPFileChooser.ACTIVITY_CHOOSER); + mLDAPFileChooserActivity.setName("LDAPFileChooserRouting"); + mLDAPFileChooserActivity.setEditable(false); + //mLDAPFileChooserActivity.setBounds(125, 13, 400, 19); + } catch (Exception mExc) + { + Logger.error(mExc); + } + } + return mLDAPFileChooserActivity; + } + + private void initialize() + { + getJButtonOK().addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + Logger.debug(5, "mLDAPFileChooserActivity.getEntryName()" + mLDAPFileChooserActivity.getEntryName()); + setCursor(new Cursor(Cursor.WAIT_CURSOR)); + mParent.loadThisWorkflow(mLDAPFileChooserActivity.getEntryName(), mhashmap); + setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + close(); + } + }); + getJButtonCancel().addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + close(); + } + }); + //getContentPane().add(getJPanelVertical()); + Container contentPane = getContentPane(); + contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); + contentPane.add(getJPanelVertical()); + contentPane.add(getJPanelHorizontal()); + contentPane.add(Box.createGlue()); + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + setLocation((d.width - getWidth()) / 2, (d.height - getHeight()) / 2); + setResizable(true); + pack(); + setSize(new Dimension(getWidth(), getJButtonCancel().getHeight() + getLDAPFileChooserActivity().getHeight() + label.getHeight() + 100)); + setVisible(true); + setVisible(true); + } + + private void close() + { + mParent = null; + this.setEnabled(false); + this.setVisible(false); + } + + private JPanel getJPanelVertical() + { + if (mJPanelVertical == null) + { + try + { + Logger.debug(8, "Panel button"); + mJPanelVertical = new JPanel(); + mJPanelVertical.setName("JPanelV"); + mJPanelVertical.setLayout(new BoxLayout(mJPanelVertical, BoxLayout.Y_AXIS)); + label = new JLabel(mMessage); + JPanel labelP = new JPanel(); + labelP.setLayout(new BoxLayout(labelP, BoxLayout.X_AXIS)); + labelP.add(label); + labelP.add(Box.createGlue()); + mJPanelVertical.add(labelP); + mJPanelVertical.add(Box.createRigidArea(new Dimension(0, 5))); + mJPanelVertical.add(getLDAPFileChooserActivity(), getLDAPFileChooserActivity().getName()); + //mJPanelVertical.add(Box.createRigidArea(new Dimension(0, + // 10))); + mJPanelVertical.add(Box.createGlue()); + mJPanelVertical.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + mJPanelVertical.setVisible(true); + } catch (java.lang.Throwable mExc) + { + //handleException(mExc); + } + } + return mJPanelVertical; + } + + private JPanel getJPanelHorizontal() + { + if (mJPanelHorizontal == null) + { + try + { + Logger.debug(8, "Panel button"); + mJPanelHorizontal = new JPanel(); + mJPanelHorizontal.setName("JPanelH"); + mJPanelHorizontal.setLayout(new BoxLayout(mJPanelHorizontal, BoxLayout.X_AXIS)); + mJPanelHorizontal.add(getJButtonOK(), getJButtonOK().getName()); + mJPanelHorizontal.add(Box.createRigidArea(new Dimension(10, 0))); + mJPanelHorizontal.add(getJButtonCancel(), getJButtonCancel().getName()); + mJPanelHorizontal.setVisible(true); + } catch (java.lang.Throwable mExc) + { + //handleException(mExc); + } + } + return mJPanelHorizontal; + } +} \ No newline at end of file diff --git a/src/main/java/org/cristalise/gui/lifecycle/chooser/LDAPEntryChooser.java b/src/main/java/org/cristalise/gui/lifecycle/chooser/LDAPEntryChooser.java new file mode 100644 index 0000000..90c759f --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/chooser/LDAPEntryChooser.java @@ -0,0 +1,71 @@ +package org.cristalise.gui.lifecycle.chooser; +/** + * @version $Revision: 1.2 $ $Date: 2005/12/01 14:23:15 $ + * @author $Author: abranson $ + */ + +import java.awt.Dimension; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; + +import javax.swing.JComboBox; + +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.process.Gateway; + + +public class LDAPEntryChooser extends JComboBox +{ + + DomainPath mDomainPath = null; + ArrayList allItems = new ArrayList(); + + public LDAPEntryChooser(DomainPath domPath, boolean editable) + { + super(); + setEditable(editable); + mDomainPath = domPath; + initialise(); + } + + private void initialise() + { + try + { + Iterator children = Gateway.getLookup().search(mDomainPath, "*"); + while (children.hasNext()) + { + DomainPath domPath = (DomainPath)children.next(); + allItems.add(domPath.getName()); + } + } + catch (Exception ex) + { + MainFrame.exceptionDialog(ex); + } + + Collections.sort(allItems); + addItem(""); + for (String element : allItems) { + addItem(element); + } + + } + + public void reload() + { + removeAllItems(); + initialise(); + } + + @Override + public synchronized Dimension getSize() + { + if (Gateway.getProperties().getInt("ResizeCombo") > 0) + return new Dimension(super.getSize().width<400?400:super.getSize().width,super.getSize().height); + return super.getSize(); + } + +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/chooser/LDAPFileChooser.java b/src/main/java/org/cristalise/gui/lifecycle/chooser/LDAPFileChooser.java new file mode 100644 index 0000000..ed594f4 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/chooser/LDAPFileChooser.java @@ -0,0 +1,120 @@ +package org.cristalise.gui.lifecycle.chooser; +import java.awt.Dimension; +import java.awt.event.ItemListener; + +import javax.swing.BoxLayout; +import javax.swing.JPanel; + +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.utils.Logger; + + +//import fr.agilium.gui.tabs.wfPropertiesViewer.JPanelTabbedProperties; +/** + * @version $Revision: 1.2 $ $Date: 2005/06/27 15:16:12 $ + * @author $Author: abranson $ + */ + +public class LDAPFileChooser extends JPanel +{ + public static String SCRIPT_CHOOSER = "Script"; + public static String SCHEMA_CHOOSER = "Schema"; + public static String ACTIVITY_CHOOSER = "Activity"; + private String chooserMode = null; + public LDAPEntryChooser mLec; + private boolean mEditable = false; + DomainPath domainPath; + String itemQuery = null; + boolean showversion = true; + + public LDAPFileChooser(String choose) + { + super(); + chooserMode = choose; + initialise(); + } + + private void initialise() + { + if (chooserMode.equals(SCHEMA_CHOOSER)) + { + itemQuery = ClusterStorage.VIEWPOINT + "/Schema/all"; + domainPath = new DomainPath("/desc/OutcomeDesc/"); + } + else if (chooserMode.equals(SCRIPT_CHOOSER)) + { + itemQuery = ClusterStorage.VIEWPOINT + "/Script/all"; + domainPath = new DomainPath("/desc/Script/"); + } + else if (chooserMode.equals(ACTIVITY_CHOOSER)) + { + domainPath = new DomainPath("/desc/ActivityDesc/"); + showversion = false; + } + else + return; + mLec = new LDAPEntryChooser(domainPath, mEditable); + + mLec.setPreferredSize(new Dimension(220, 19)); + mLec.setMaximumSize(new Dimension(3000, 22)); + mLec.setMinimumSize(new Dimension(50, 19)); + //mLec.getRenderer().getListCellRendererComponent(); + + BoxLayout blyt = new BoxLayout(this, BoxLayout.X_AXIS); + setLayout(blyt); + add(mLec); + mLec.setVisible(true); + this.validate(); + this.setVisible(true); + + } + + public String getEntryName() + { + return (String) mLec.getSelectedItem(); + } + + public void addItemListener(ItemListener il) + { + mLec.addItemListener(il); + } + public void setSelectedItem(String name, String version) + { + Logger.debug(5,"setSelectedItem " + name + " " + version); + if (name == null||name.equals("-1")) name=""; + mLec.setSelectedItem(name); + } + + public void reload() + { + mLec.reload(); + } + + public void removeAllItems() + { + mLec.removeAllItems(); + } + + /** + * @param b + */ + public void setEditable(boolean b) + { + mEditable = b; + mLec.setEditable(b); + } + + @Override + public void updateUI() + { + if (mLec!=null) mLec.updateUI(); + super.updateUI(); + } + + @Override + public void setEnabled(boolean enabled) + { + mLec.setEnabled(enabled); + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/chooser/WorkflowDialogue.java b/src/main/java/org/cristalise/gui/lifecycle/chooser/WorkflowDialogue.java new file mode 100644 index 0000000..7ee6b5f --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/chooser/WorkflowDialogue.java @@ -0,0 +1,20 @@ +/* + * Created on 2 sept. 2003 + * + * To change the template for this generated file go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +package org.cristalise.gui.lifecycle.chooser; + +import java.util.HashMap; + +/** + * @author Developpement + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public interface WorkflowDialogue +{ + public void loadThisWorkflow(String name, HashMap mhashmap); +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/desc/ActivitySlotDefRenderer.java b/src/main/java/org/cristalise/gui/lifecycle/desc/ActivitySlotDefRenderer.java new file mode 100644 index 0000000..c15cf17 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/desc/ActivitySlotDefRenderer.java @@ -0,0 +1,72 @@ +package org.cristalise.gui.lifecycle.desc; + +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Paint; + +import org.cristalise.gui.graph.view.VertexRenderer; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lifecycle.ActivitySlotDef; +import org.cristalise.kernel.utils.Language; + + +public class ActivitySlotDefRenderer implements VertexRenderer +{ + private Paint mInactivePaint = new Color(255, 255, 255); + private Paint mErrorPaint = new Color( 255, 50, 0 ); + private Paint mCompositePaint= new Color(200, 200, 255); + private Paint mTextPaint = Color.black; + + + @Override + public void draw( Graphics2D g2d, Vertex vertex) + { + ActivitySlotDef activitySlotDef = ( ActivitySlotDef )vertex; + boolean hasError = activitySlotDef.verify(); + boolean isComposite = false; + isComposite = activitySlotDef.getIsComposite(); + GraphPoint centrePoint = activitySlotDef.getCentrePoint(); + int vertexHeight = activitySlotDef.getHeight(); + int vertexWidth = activitySlotDef.getWidth(); + + String[] linesOfText = new String[2+(hasError?0:1)]; + FontMetrics metrics = g2d.getFontMetrics(); + int lineWidth = 0; + int lineHeight = metrics.getHeight(); + int linesHeight = lineHeight * linesOfText.length; + int linesStartY = centrePoint.y - linesHeight / 2 + lineHeight * 2 / 3; + int x = 0; + int y = 0; + int i = 0; + + linesOfText[0]="("+activitySlotDef.getActivityDef()+")"; + linesOfText[1]=(String)activitySlotDef.getProperties().get("Name"); + + if (!hasError)linesOfText[2]=Language.translate(activitySlotDef.getErrors()); + + g2d.setPaint( !hasError ? mErrorPaint : isComposite ? mCompositePaint : mInactivePaint ); + g2d.fill3DRect + ( + centrePoint.x - vertexWidth / 2, + centrePoint.y - vertexHeight / 2, + vertexWidth, + vertexHeight, + true + ); + + g2d.setPaint( mTextPaint ); + + // Draw the lines of text + for ( i = 0; i < linesOfText.length; i++ ) + { + if (linesOfText[i] == null) linesOfText[i] = ""; + lineWidth = metrics.stringWidth( linesOfText[ i ] ); + x = centrePoint.x - lineWidth / 2; + y = linesStartY + i * lineHeight; + g2d.drawString( linesOfText[ i ], x, y ); + } + } +} + diff --git a/src/main/java/org/cristalise/gui/lifecycle/desc/CompActDefOutcomeHandler.java b/src/main/java/org/cristalise/gui/lifecycle/desc/CompActDefOutcomeHandler.java new file mode 100644 index 0000000..eabc85b --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/desc/CompActDefOutcomeHandler.java @@ -0,0 +1,242 @@ +package org.cristalise.gui.lifecycle.desc; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; + +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.JSplitPane; + +import org.cristalise.gui.ImageLoader; +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.graph.view.EditorPanel; +import org.cristalise.gui.graph.view.VertexPropertyPanel; +import org.cristalise.gui.lifecycle.instance.FindActDefPanel; +import org.cristalise.gui.tabs.outcome.InvalidOutcomeException; +import org.cristalise.gui.tabs.outcome.InvalidSchemaException; +import org.cristalise.gui.tabs.outcome.OutcomeException; +import org.cristalise.gui.tabs.outcome.OutcomeHandler; +import org.cristalise.gui.tabs.outcome.OutcomeNotInitialisedException; +import org.cristalise.kernel.graph.layout.DefaultGraphLayoutGenerator; +import org.cristalise.kernel.lifecycle.CompositeActivityDef; +import org.cristalise.kernel.lifecycle.WfVertexDefOutlineCreator; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.Logger; + + +/************************************************************************** + * + * $Revision: 1.14 $ + * $Date: 2005/09/07 13:46:31 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class CompActDefOutcomeHandler + extends JPanel + implements OutcomeHandler { + + protected JButton mLoadButton = new JButton(ImageLoader.findImage("graph/load.png")); + protected JButton mLayoutButton = new JButton(ImageLoader.findImage("graph/autolayout.png")); + protected JButton[] mOtherToolBarButtons = { mLayoutButton, mLoadButton }; + + protected CompositeActivityDef mCompActDef = null; + protected WfEdgeDefFactory mWfEdgeDefFactory = new WfEdgeDefFactory(); + protected WfVertexDefFactory mWfVertexDefFactory = new WfVertexDefFactory(); + + protected EditorPanel mEditorPanel; + protected VertexPropertyPanel mPropertyPanel; + protected JSplitPane mSplitPane; + boolean unsaved; + + public CompActDefOutcomeHandler() { + super(); + mPropertyPanel = loadPropertyPanel(); + mPropertyPanel.createLayout(new FindActDefPanel()); + mEditorPanel = + new EditorPanel( + mWfEdgeDefFactory, + mWfVertexDefFactory, + new WfVertexDefOutlineCreator(), + true, + mOtherToolBarButtons, + new WfDefGraphPanel(new WfDirectedEdgeDefRenderer(), + new WfVertexDefRenderer())); + } + + protected void createLayout() + { + mLoadButton.setToolTipText("Load from local file"); + mLayoutButton.setToolTipText("Auto-Layout"); + + // Add the editor pane + GridBagLayout gridbag = new GridBagLayout(); + setLayout(gridbag); + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = 1; + c.fill = GridBagConstraints.BOTH; + c.weighty = 2.0; + c.weightx = 2.0; + mSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, mEditorPanel, mPropertyPanel); + mSplitPane.setDividerSize(5); + gridbag.setConstraints(mSplitPane, c); + add(mSplitPane); + revalidate(); + } + + protected void createListeners() + { + mLoadButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + File selectedFile = null; + + int returnValue = MainFrame.xmlChooser.showOpenDialog(null); + + switch (returnValue) + { + case JFileChooser.APPROVE_OPTION : + selectedFile = MainFrame.xmlChooser.getSelectedFile(); + try { + String newWf = FileStringUtility.file2String(selectedFile); + setOutcome(newWf); + setUpGraphEditor(); + } catch (Exception e) { + MainFrame.exceptionDialog(e); + } + case JFileChooser.CANCEL_OPTION : + case JFileChooser.ERROR_OPTION : + + default : + } + } + }); + + mLayoutButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + DefaultGraphLayoutGenerator.layoutGraph(mEditorPanel.mGraphModelManager.getModel()); + } + }); + } + + public void setUpGraphEditor() { + mEditorPanel.mGraphModelManager.setModel(mCompActDef.getChildrenGraphModel()); + // Give the editor panel the edge and vertex types + mEditorPanel.updateVertexTypes(mCompActDef.getVertexTypeNameAndConstructionInfo()); + mEditorPanel.updateEdgeTypes(mCompActDef.getEdgeTypeNameAndConstructionInfo()); + mEditorPanel.enterSelectMode(); + mWfVertexDefFactory.setCreationContext(mCompActDef); + } + + /** + * + */ + @Override + public void setOutcome(String outcome) throws InvalidOutcomeException { + try { + CompositeActivityDef newAct = (CompositeActivityDef)Gateway.getMarshaller().unmarshall(outcome); + if (mCompActDef != null) + newAct.setName(mCompActDef.getName()); + mCompActDef = newAct; + } catch (Exception ex) { + Logger.error(ex); + throw new InvalidOutcomeException(ex.getMessage()); + } + } + /** + * + */ + @Override + public void setDescription(String description) + throws InvalidSchemaException { + // ignore - always the same + } + /** + * + */ + @Override + public void setReadOnly(boolean readOnly) { + mLayoutButton.setEnabled(!readOnly); + mLoadButton.setEnabled(!readOnly); + mEditorPanel.setEditable(!readOnly); + mPropertyPanel.setEditable(!readOnly); + } + /** + * + */ + @Override + public JPanel getPanel() throws OutcomeNotInitialisedException { + return this; + } + /** + * + */ + @Override + public String getOutcome() throws OutcomeException { + if (!mCompActDef.verify()) + throw new OutcomeException(mCompActDef.getErrors()); + try { + return Gateway.getMarshaller().marshall(mCompActDef); + } catch (Exception ex) { + throw new OutcomeException(ex.getMessage()); + } + } + /** + * + */ + @Override + public void run() { + Thread.currentThread().setName("Composite Act Def Viewer"); + createLayout(); + createListeners(); + mPropertyPanel.setGraphModelManager(mEditorPanel.mGraphModelManager); + setUpGraphEditor(); + } + + public VertexPropertyPanel loadPropertyPanel() + { + String wfPanelClass = Gateway.getProperties().getString("WfPropertyPanel"); + if (wfPanelClass != null) { + try { + return (VertexPropertyPanel)Gateway.getProperties().getInstance("WfPropertyPanel"); + } catch (Exception ex) { + Logger.error("Could not load wf props panel:"+wfPanelClass); + Logger.error(ex); + } + } + return new VertexPropertyPanel(); + } + + @Override + public boolean isUnsaved() { + return unsaved; + } + + @Override + public void saved() { + unsaved = false; + } + + @Override + public void export(File targetFile) throws Exception { + //Make sure module structure is present + File parentDir = targetFile.getParentFile(); + FileStringUtility.createNewDir(parentDir.getAbsolutePath()+"/CA"); + FileStringUtility.createNewDir(parentDir.getAbsolutePath()+"/EA"); + FileStringUtility.createNewDir(parentDir.getAbsolutePath()+"/OD"); + FileStringUtility.createNewDir(parentDir.getAbsolutePath()+"/SC"); + BufferedWriter imports = new BufferedWriter(new FileWriter(new File(parentDir, mCompActDef.getActName()+"Imports.xml"))); + ElemActDefOutcomeHandler.exportAct(targetFile.getParentFile(), imports, mCompActDef); + imports.close(); + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/desc/ElemActDefOutcomeHandler.java b/src/main/java/org/cristalise/gui/lifecycle/desc/ElemActDefOutcomeHandler.java new file mode 100644 index 0000000..985ce0a --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/desc/ElemActDefOutcomeHandler.java @@ -0,0 +1,228 @@ +package org.cristalise.gui.lifecycle.desc; + +import java.io.BufferedWriter; +import java.io.File; + +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.graph.view.VertexPropertyPanel; +import org.cristalise.gui.tabs.outcome.InvalidOutcomeException; +import org.cristalise.gui.tabs.outcome.InvalidSchemaException; +import org.cristalise.gui.tabs.outcome.OutcomeException; +import org.cristalise.gui.tabs.outcome.OutcomeHandler; +import org.cristalise.gui.tabs.outcome.OutcomeNotInitialisedException; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.agent.Job; +import org.cristalise.kernel.entity.proxy.ItemProxy; +import org.cristalise.kernel.graph.model.GraphableVertex; +import org.cristalise.kernel.lifecycle.ActivityDef; +import org.cristalise.kernel.lifecycle.ActivitySlotDef; +import org.cristalise.kernel.lifecycle.CompositeActivityDef; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.persistency.outcome.Viewpoint; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.LocalObjectLoader; +import org.cristalise.kernel.utils.Logger; + + +/************************************************************************** + * + * $Revision: 1.5 $ + * $Date: 2005/10/05 07:39:37 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class ElemActDefOutcomeHandler extends VertexPropertyPanel implements OutcomeHandler { + + ActivityDef act; + boolean unsaved; + public ElemActDefOutcomeHandler() { + super(); + createLayout(null); + } + + /** + * + */ + @Override + public void setOutcome(String outcome) throws InvalidOutcomeException { + try { + act = (ActivityDef)Gateway.getMarshaller().unmarshall(outcome); + setVertex(act); + } catch (Exception ex) { + Logger.error(ex); + throw new InvalidOutcomeException(); + } + } + + /** + * + */ + @Override + public void setDescription(String description) + throws InvalidSchemaException { + // ignore + } + + /** + * + */ + @Override + public void setReadOnly(boolean readOnly) { + setEditable(!readOnly); + + } + + /** + * + */ + @Override + public JPanel getPanel() throws OutcomeNotInitialisedException { + return this; + } + + /** + * + */ + @Override + public String getOutcome() throws OutcomeException { + try { + return Gateway.getMarshaller().marshall(act); + } catch (Exception ex) { + Logger.error(ex); + throw new OutcomeException(); + } + } + + /** + * + */ + @Override + public void run() { + validate(); + } + + @Override + public boolean isUnsaved() { + return unsaved; + } + + @Override + public void saved() { + unsaved = false; + } + + @Override + public void export(File targetFile) throws Exception { + exportAct(targetFile.getParentFile(), null, act); + } + + public static void exportAct(File dir, BufferedWriter imports, ActivityDef actDef) throws Exception { + + // Export associated schema + exportSchema((String)actDef.getProperties().get("SchemaType"), actDef.getProperties().get("SchemaVersion"), imports, new File(dir, "OD")); + // Export associated script + exportScript((String)actDef.getProperties().get("ScriptName"), actDef.getProperties().get("ScriptVersion"), imports, new File(dir, "SC")); + + //Export child act if composite + if (actDef instanceof CompositeActivityDef) { + CompositeActivityDef compActDef = (CompositeActivityDef)actDef; + for (int i=0; iboot/CA/"+compActDef.getActName()+".xml\n"); + } + } + else { + FileStringUtility.string2File(new File(new File(dir, "EA"), actDef.getActName()+".xml"), Gateway.getMarshaller().marshall(actDef)); + if (imports!=null) imports.write("boot/EA/"+actDef.getActName()+".xml\n"); + } + } + + private static void resolveRealVersion(ActivitySlotDef childDef) throws ObjectNotFoundException { + String defName = childDef.getActName(); + ItemProxy actDefItem = LocalObjectLoader.loadLocalObjectDef("/desc/ActivityDesc/", defName); + String actType = actDefItem.getProperty("Complexity"); + Viewpoint last = actDefItem.getViewpoint( actType + "ActivityDef", "last"); + String[] viewpoints = actDefItem.getContents(ClusterStorage.VIEWPOINT+"/"+actType + "ActivityDef"); + for (String viewName : viewpoints) { + try { + Integer.parseInt(viewName); + } catch (NumberFormatException e) { + continue; // only count integer viewnames + } + Viewpoint thisView = actDefItem.getViewpoint(actType + "ActivityDef", viewName); + if (thisView.getEventId() == last.getEventId()) { + JOptionPane.showMessageDialog(null, defName+" defined as 'last'. Will use view "+viewName+" instead"); + childDef.getProperties().put("Version", viewName); + return; + } + } + JOptionPane.showMessageDialog(null, "Last view for "+defName+" has not been materialized. Executing CreateFromLast"); + try { + Job createJob = actDefItem.getJobByName("AssignNewActivityVersionFromLast", MainFrame.userAgent); + MainFrame.userAgent.execute(createJob); + } catch (Exception e) { + Logger.error(e); + throw new ObjectNotFoundException("Could not create new version of "+defName+" from last"); + } + resolveRealVersion(childDef); + } + + public static void exportScript(String name, Object version, BufferedWriter imports, File dir) { + if (name == null || name.length()==0 || name.contains(":")) return; + try { + int intVersion; + if (version instanceof String) intVersion = Integer.parseInt((String)version); + else if (version instanceof Integer) intVersion = ((Integer)version).intValue(); + else return; + + FileStringUtility.string2File(new File(dir, name+".xml"), + LocalObjectLoader.getScript(name, intVersion)); + if (imports!=null) imports.write("boot/SC/"+name+".xml\n"); + } catch (NumberFormatException ex) { + JOptionPane.showMessageDialog(null, "Invalid version number in script version:"+version); + } catch (Exception ex) { + Logger.error(ex); + JOptionPane.showMessageDialog(null, "Could not export script "+name+"_"+version, "Error", JOptionPane.ERROR_MESSAGE); + } + } + + public static void exportSchema(String name, Object version, BufferedWriter imports, File dir) { + if (name == null || name.length()==0) return; + try { + int intVersion; + if (version instanceof String) intVersion = Integer.parseInt((String)version); + else if (version instanceof Integer) intVersion = ((Integer)version).intValue(); + else return; + FileStringUtility.string2File(new File(dir, name+".xsd"), + LocalObjectLoader.getSchema(name, intVersion).schema); + if (imports!=null) imports.write("boot/OD/"+name+".xsd\n"); + } catch (NumberFormatException ex) { + JOptionPane.showMessageDialog(null, "Invalid version number in script version:"+version); + } catch (Exception ex) { + Logger.error(ex); + JOptionPane.showMessageDialog(null, "Could not export schema "+name+"_"+version, "Error", JOptionPane.ERROR_MESSAGE); + } + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/desc/SplitJoinDefRenderer.java b/src/main/java/org/cristalise/gui/lifecycle/desc/SplitJoinDefRenderer.java new file mode 100644 index 0000000..65d59b2 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/desc/SplitJoinDefRenderer.java @@ -0,0 +1,139 @@ +package org.cristalise.gui.lifecycle.desc; + +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Paint; + +import org.cristalise.gui.graph.view.VertexRenderer; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lifecycle.AndSplitDef; +import org.cristalise.kernel.lifecycle.JoinDef; +import org.cristalise.kernel.lifecycle.LoopDef; +import org.cristalise.kernel.lifecycle.OrSplitDef; +import org.cristalise.kernel.lifecycle.WfVertexDef; +import org.cristalise.kernel.lifecycle.XOrSplitDef; +import org.cristalise.kernel.utils.Language; + + + +public class SplitJoinDefRenderer implements VertexRenderer +{ + private Paint mTextPaint = Color.black; + private Paint mBoxPaint = new Color( 204, 204, 204 ); + private Paint mErrorPaint = new Color( 255, 50, 0 ); + private boolean mTextOffsetsNotInitialised = true; + private int mTextYOffset = 0; + private String mAndText = "And"; + private int mAndTextXOffset = 0; + private String mOrText = "Or"; + private int mOrTextXOffset = 0; + private String mXOrText = "XOr"; + private int mXOrTextXOffset = 0; + private String mJoinText = "Join"; + private int mJoinTextXOffset = 0; + private String mLoopText = "Loop"; + private int mLoopTextXOffset = 0; + private String mRouteText = ""; + private int mRouteTextXOffset = 0; + private String mXXXText = "XXX"; + private int mXXXTextXOffset = 0; + + @Override + public void draw( Graphics2D g2d, Vertex vertex) + { + GraphPoint centrePoint = vertex.getCentrePoint(); + String text = null; + int textXOffset = 0; + int vertexHeight = vertex.getHeight(); + int vertexWidth = vertex.getWidth(); + boolean hasError = !((WfVertexDef)vertex).verify(); + + + if ( mTextOffsetsNotInitialised ) + { + initialiseTextOffsets( g2d ); + mTextOffsetsNotInitialised = false; + } + if ( vertex instanceof LoopDef ) + { + text = Language.translate(mLoopText); + textXOffset = mLoopTextXOffset; + } + else if ( vertex instanceof XOrSplitDef ) + { + text = Language.translate(mXOrText); + textXOffset = mXOrTextXOffset; + } + else if ( vertex instanceof OrSplitDef ) + { + text = Language.translate(mOrText); + textXOffset = mOrTextXOffset; + } + else if ( vertex instanceof AndSplitDef ) + { + text = Language.translate(mAndText); + textXOffset = mAndTextXOffset; + } + else if ( vertex instanceof JoinDef) + { + String type= (String)((JoinDef)vertex).getProperties().get("Type"); + if (type!=null && type.equals("Route")) + { + text = mRouteText; + textXOffset = mRouteTextXOffset; + } + else + { + text = Language.translate(mJoinText); + textXOffset = mJoinTextXOffset; + } + } + else + { + text = mXXXText; + textXOffset = mXXXTextXOffset; + } + + + g2d.setPaint( hasError ? mErrorPaint : mBoxPaint ); + g2d.fillRect + ( + centrePoint.x - vertexWidth / 2, + centrePoint.y - vertexHeight / 2, + vertexWidth, + vertexHeight + ); + g2d.setPaint( mTextPaint ); + g2d.drawRect + ( + centrePoint.x - vertexWidth / 2, + centrePoint.y - vertexHeight / 2, + vertexWidth, + vertexHeight + ); + g2d.drawString( text, centrePoint.x - textXOffset, centrePoint.y + mTextYOffset ); + if (hasError) { + g2d.setPaint( mErrorPaint ); + String errors = Language.translate(((WfVertexDef)vertex).getErrors()); + int errorWidth = g2d.getFontMetrics().stringWidth( errors ); + g2d.drawString( errors, centrePoint.x - ( errorWidth / 2), centrePoint.y + vertexHeight ); + } + } + + private void initialiseTextOffsets( Graphics2D g2d ) + { + FontMetrics metrics = g2d.getFontMetrics(); + + + mTextYOffset = metrics.getHeight() / 3; + mAndTextXOffset = metrics.stringWidth( Language.translate(mAndText) ) / 2; + mOrTextXOffset = metrics.stringWidth( Language.translate(mOrText) ) / 2; + mXOrTextXOffset = metrics.stringWidth( Language.translate(mXOrText) ) / 2; + mJoinTextXOffset = metrics.stringWidth( Language.translate(mJoinText) ) / 2; + mLoopTextXOffset = metrics.stringWidth( Language.translate(mJoinText) ) / 2; + mRouteTextXOffset = metrics.stringWidth( Language.translate(mRouteText) ) / 2; + } +} + diff --git a/src/main/java/org/cristalise/gui/lifecycle/desc/WfDefGraphPanel.java b/src/main/java/org/cristalise/gui/lifecycle/desc/WfDefGraphPanel.java new file mode 100644 index 0000000..2ad87b2 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/desc/WfDefGraphPanel.java @@ -0,0 +1,60 @@ +/*Created on 21 nov. 2003 */ +package org.cristalise.gui.lifecycle.desc; + +import java.awt.Graphics2D; + +import org.cristalise.gui.graph.view.DirectedEdgeRenderer; +import org.cristalise.gui.graph.view.GraphPanel; +import org.cristalise.gui.graph.view.VertexRenderer; +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.lifecycle.NextDef; + + +/** @author XSeb74*/ +public class WfDefGraphPanel extends GraphPanel +{ + public WfDefGraphPanel(DirectedEdgeRenderer d,VertexRenderer v) + { + super(d,v); + } + // Draws the highlight of the specified edge + @Override + protected void drawEdgeHighlight(Graphics2D g2d, DirectedEdge edge) + { + GraphPoint originPoint = edge.getOriginPoint(); + GraphPoint terminusPoint = edge.getTerminusPoint(); + GraphPoint midPoint = new GraphPoint(); + + if ("Straight".equals(((NextDef)edge).getProperties().get("Type")) || ((NextDef)edge).getProperties().get("Type") == null) + { + midPoint.x = originPoint.x + (terminusPoint.x - originPoint.x) / 2; + midPoint.y = originPoint.y + (terminusPoint.y - originPoint.y) / 2; + } + else if (("Broken +".equals(((NextDef)edge).getProperties().get("Type")))) + { + midPoint.x = (originPoint.x + terminusPoint.x) / 2; + midPoint.y = (originPoint.y + terminusPoint.y) / 2; + } + else if (("Broken -".equals(((NextDef)edge).getProperties().get("Type")))) + { + boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); + midPoint.x = arrowOnY ? terminusPoint.x : (originPoint.x + terminusPoint.x) / 2; + midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : originPoint.y; + } + else if (("Broken |".equals(((NextDef)edge).getProperties().get("Type")))) + { + boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); + midPoint.x = arrowOnY ? originPoint.x : (originPoint.x + terminusPoint.x) / 2; + midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : terminusPoint.y; + } + int minX = midPoint.x - 10; + int minY = midPoint.y - 10; + int maxX = midPoint.x + 10; + int maxY = midPoint.y + 10; + g2d.drawLine(minX, minY, maxX, minY); + g2d.drawLine(maxX, minY, maxX, maxY); + g2d.drawLine(maxX, maxY, minX, maxY); + g2d.drawLine(minX, maxY, minX, minY); + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/desc/WfDirectedEdgeDefRenderer.java b/src/main/java/org/cristalise/gui/lifecycle/desc/WfDirectedEdgeDefRenderer.java new file mode 100644 index 0000000..80a67a4 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/desc/WfDirectedEdgeDefRenderer.java @@ -0,0 +1,135 @@ +package org.cristalise.gui.lifecycle.desc; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.GeneralPath; + +import org.cristalise.gui.graph.view.DirectedEdgeRenderer; +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.lifecycle.NextDef; + +public class WfDirectedEdgeDefRenderer implements DirectedEdgeRenderer +{ + private GeneralPath mArrowTemplate = new GeneralPath(); + public WfDirectedEdgeDefRenderer() + { + mArrowTemplate.moveTo(-5, 5); + mArrowTemplate.lineTo(0, 0); + mArrowTemplate.lineTo(5, 5); + } + @Override + public void draw(Graphics2D g2d, DirectedEdge directedEdge) + { + GraphPoint originPoint = directedEdge.getOriginPoint(); + GraphPoint terminusPoint = directedEdge.getTerminusPoint(); + GraphPoint midPoint = new GraphPoint(); + AffineTransform transform = new AffineTransform(); + Shape arrow = null; + NextDef nextDef = (NextDef) directedEdge; + boolean hasError = !nextDef.verify(); + String text = (String) nextDef.getProperties().get("Alias"); + g2d.setPaint(hasError ? Color.red : Color.black); + if (("Broken +".equals(nextDef.getProperties().get("Type")))) + { + g2d.drawLine(originPoint.x, originPoint.y, originPoint.x, (originPoint.y + terminusPoint.y) / 2); + g2d.drawLine(originPoint.x, (originPoint.y + terminusPoint.y) / 2, terminusPoint.x, (originPoint.y + terminusPoint.y) / 2); + g2d.drawLine(terminusPoint.x, (originPoint.y + terminusPoint.y) / 2, terminusPoint.x, terminusPoint.y); + midPoint.x = (originPoint.x + terminusPoint.x) / 2; + midPoint.y = (originPoint.y + terminusPoint.y) / 2; + transform.translate(midPoint.x, midPoint.y); + transform.rotate( + calcArrowAngle( + originPoint.x, + originPoint.x - terminusPoint.x > -5 + && originPoint.x - terminusPoint.x < 5 ? originPoint.y : (originPoint.y + terminusPoint.y) / 2, + terminusPoint.x, + originPoint.x - terminusPoint.x > -5 + && originPoint.x - terminusPoint.x < 5 ? terminusPoint.y : (originPoint.y + terminusPoint.y) / 2)); + } + else if (("Broken -".equals(nextDef.getProperties().get("Type")))) + { + g2d.drawLine(originPoint.x, originPoint.y, terminusPoint.x, originPoint.y); + g2d.drawLine(terminusPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y); + boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); + midPoint.x = arrowOnY ? terminusPoint.x : (originPoint.x + terminusPoint.x) / 2; + midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : originPoint.y; + transform.translate(midPoint.x, midPoint.y); + transform + .rotate( + calcArrowAngle( + arrowOnY ? terminusPoint.x : originPoint.x, + arrowOnY ? originPoint.y : originPoint.y, + arrowOnY ? terminusPoint.x : terminusPoint.x, + arrowOnY ? terminusPoint.y : originPoint.y)); + } + else if (("Broken |".equals(nextDef.getProperties().get("Type")))) + { + g2d.drawLine(originPoint.x, originPoint.y, originPoint.x, terminusPoint.y); + g2d.drawLine(originPoint.x, terminusPoint.y, terminusPoint.x, terminusPoint.y); + boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); + midPoint.x = arrowOnY ? originPoint.x : (originPoint.x + terminusPoint.x) / 2; + midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : terminusPoint.y; + transform.translate(midPoint.x, midPoint.y); + transform + .rotate( + calcArrowAngle( + arrowOnY ? terminusPoint.x : originPoint.x, + arrowOnY ? originPoint.y : originPoint.y, + arrowOnY ? terminusPoint.x : terminusPoint.x, + arrowOnY ? terminusPoint.y : originPoint.y)); + } + else + { + g2d.drawLine(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y); + midPoint.x = originPoint.x + (terminusPoint.x - originPoint.x) / 2; + midPoint.y = originPoint.y + (terminusPoint.y - originPoint.y) / 2; + transform.translate(midPoint.x, midPoint.y); + transform.rotate(calcArrowAngle(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y)); + } + + arrow = mArrowTemplate.createTransformedShape(transform); + g2d.draw(arrow); + if (text != null) + g2d.drawString(text, midPoint.x + 10, midPoint.y); + } + private static double calcArrowAngle(int originX, int originY, int terminusX, int terminusY) + { + double width = terminusX - originX; + double height = terminusY - originY; + if ((width == 0) && (height > 0)) + { + return Math.PI; + } + if ((width == 0) && (height < 0)) + { + return 0; + } + if ((width > 0) && (height == 0)) + { + return Math.PI / 2.0; + } + if ((width < 0) && (height == 0)) + { + return -1.0 * Math.PI / 2.0; + } + if ((width > 0) && (height > 0)) + { + return Math.PI / 2.0 + Math.atan(Math.abs(height) / Math.abs(width)); + } + if ((width > 0) && (height < 0)) + { + return Math.atan(Math.abs(width) / Math.abs(height)); + } + if ((width < 0) && (height < 0)) + { + return -1.0 * Math.atan(Math.abs(width) / Math.abs(height)); + } + if ((width < 0) && (height > 0)) + { + return -1.0 * (Math.PI / 2.0 + Math.atan(Math.abs(height) / Math.abs(width))); + } + return 0.0; + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/desc/WfEdgeDefFactory.java b/src/main/java/org/cristalise/gui/lifecycle/desc/WfEdgeDefFactory.java new file mode 100644 index 0000000..e6c8fdd --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/desc/WfEdgeDefFactory.java @@ -0,0 +1,30 @@ +package org.cristalise.gui.lifecycle.desc; +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.EdgeFactory; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.TypeNameAndConstructionInfo; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lifecycle.NextDef; +import org.cristalise.kernel.lifecycle.WfVertexDef; +public class WfEdgeDefFactory implements EdgeFactory +{ + @Override + public void create( + GraphModelManager graphModelManager, + Vertex origin, + Vertex terminus, + TypeNameAndConstructionInfo typeNameAndConstructionInfo) + { + if (validCreation(graphModelManager, origin, terminus)) + { + NextDef nextDef = new NextDef((WfVertexDef) origin, (WfVertexDef) terminus); + graphModelManager.getModel().addEdgeAndCreateId(nextDef, origin, terminus); + } + } + private static boolean validCreation(GraphModelManager graphModelManager, Vertex origin, Vertex terminus) + { + DirectedEdge[] connectingEdgesAToB = graphModelManager.getModel().getConnectingEdges(origin.getID(), terminus.getID()); + DirectedEdge[] connectingEdgesBToA = graphModelManager.getModel().getConnectingEdges(terminus.getID(), origin.getID()); + return (origin != terminus) && (connectingEdgesAToB.length == 0) && (connectingEdgesBToA.length == 0); + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/desc/WfVertexDefFactory.java b/src/main/java/org/cristalise/gui/lifecycle/desc/WfVertexDefFactory.java new file mode 100644 index 0000000..0174096 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/desc/WfVertexDefFactory.java @@ -0,0 +1,97 @@ +package org.cristalise.gui.lifecycle.desc; +import java.util.HashMap; + +import javax.swing.JOptionPane; + +import org.cristalise.gui.ImageLoader; +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.lifecycle.chooser.ActivityChooser; +import org.cristalise.gui.lifecycle.chooser.WorkflowDialogue; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.graph.model.TypeNameAndConstructionInfo; +import org.cristalise.kernel.graph.model.VertexFactory; +import org.cristalise.kernel.lifecycle.ActivityDef; +import org.cristalise.kernel.lifecycle.CompositeActivityDef; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.LocalObjectLoader; +import org.cristalise.kernel.utils.Logger; + +public class WfVertexDefFactory implements VertexFactory, WorkflowDialogue +{ + protected CompositeActivityDef mCompositeActivityDef = null; + @Override + public void create(GraphModelManager graphModelManager, GraphPoint location, TypeNameAndConstructionInfo typeNameAndConstructionInfo) + { + String vertexTypeId = null; + if (mCompositeActivityDef != null && typeNameAndConstructionInfo.mInfo instanceof String) + { + vertexTypeId = (String) typeNameAndConstructionInfo.mInfo; + if (vertexTypeId.equals("Atomic") || vertexTypeId.equals("Composite")) + { + // ask for a name + HashMap mhm = new HashMap(); + mhm.put("P1", vertexTypeId); + mhm.put("P2", location); + //************************************************ + ActivityChooser a = + new ActivityChooser( + Language.translate("Please enter a Type for the new activityDef"), + Language.translate("New " + vertexTypeId + " Activity"), + ImageLoader.findImage("graph/newvertex_large.png").getImage(), + this, + mhm); + a.setVisible(true); + } + else + mCompositeActivityDef.newChild("", vertexTypeId, location); + } + } + @Override + public void loadThisWorkflow(String newName, HashMap hashMap) + { + String vertexTypeId = (String) hashMap.get("P1"); + GraphPoint location = (GraphPoint) hashMap.get("P2"); + if (newName == null || newName.equals("")) + return; + Logger.debug(5, newName); + ActivityDef act = (ActivityDef) mCompositeActivityDef.search(mCompositeActivityDef.getID() + "/" + newName); + if (act != null) + { + String unicName = newName; + while (unicName == null + || unicName == "" + || mCompositeActivityDef.search(mCompositeActivityDef.getID() + "/" + unicName) != null) + unicName = + (String) JOptionPane.showInputDialog( + null, + Language.translate("Please type a Name"), + Language.translate("New " + vertexTypeId + " Activity"), + JOptionPane.QUESTION_MESSAGE, + ImageLoader.findImage("graph/newvertex_large.png"), + null, + null); + act = (ActivityDef) mCompositeActivityDef.search(mCompositeActivityDef.getID() + "/" + newName); + mCompositeActivityDef.addExistingActivityDef(unicName, act, location); + } + else + { + try + { + act = LocalObjectLoader.getActDef(newName, 0); + } + catch (Exception ex) + { + MainFrame.exceptionDialog(ex); + return; + } + mCompositeActivityDef.newChild(newName, vertexTypeId, location); + } + } + @Override + public void setCreationContext(Object newContext) + { + if (newContext != null && newContext instanceof CompositeActivityDef) + mCompositeActivityDef = (CompositeActivityDef) newContext; + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/desc/WfVertexDefRenderer.java b/src/main/java/org/cristalise/gui/lifecycle/desc/WfVertexDefRenderer.java new file mode 100644 index 0000000..17e2622 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/desc/WfVertexDefRenderer.java @@ -0,0 +1,31 @@ +package org.cristalise.gui.lifecycle.desc; + +import java.awt.Graphics2D; + +import org.cristalise.gui.graph.view.VertexRenderer; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lifecycle.ActivitySlotDef; +import org.cristalise.kernel.lifecycle.AndSplitDef; +import org.cristalise.kernel.lifecycle.JoinDef; + + +public class WfVertexDefRenderer implements VertexRenderer +{ + protected ActivitySlotDefRenderer mActivitySlotDefRenderer = new ActivitySlotDefRenderer(); + protected SplitJoinDefRenderer mSplitJoinDefRenderer = new SplitJoinDefRenderer(); + + + @Override + public void draw( Graphics2D g2d, Vertex vertex) + { + if ( vertex instanceof ActivitySlotDef ) + { + mActivitySlotDefRenderer.draw( g2d, vertex); + } + else if ( ( vertex instanceof AndSplitDef ) || ( vertex instanceof JoinDef ) ) + { + mSplitJoinDefRenderer.draw( g2d, vertex); + } + } +} + diff --git a/src/main/java/org/cristalise/gui/lifecycle/instance/ActivityRenderer.java b/src/main/java/org/cristalise/gui/lifecycle/instance/ActivityRenderer.java new file mode 100644 index 0000000..f4d44b9 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/instance/ActivityRenderer.java @@ -0,0 +1,111 @@ +package org.cristalise.gui.lifecycle.instance; +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Paint; +import java.awt.Polygon; + +import org.cristalise.gui.graph.view.VertexRenderer; +import org.cristalise.kernel.common.GTimeStamp; +import org.cristalise.kernel.common.InvalidDataException; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lifecycle.instance.Activity; +import org.cristalise.kernel.utils.DateUtility; +import org.cristalise.kernel.utils.Language; + +public class ActivityRenderer implements VertexRenderer +{ + private Paint mActivePaint = new Color(100, 255, 100); + private Paint mActiveCompPaint = new Color(100, 255, 255); + private Paint mInactivePaint = new Color(255, 255, 255); + private Paint mInactiveCompPaint = new Color(200, 200, 255); + private Paint mErrorPaint = new Color(255, 50, 0); + private Paint mTextPaint = Color.black; + @Override + public void draw(Graphics2D g2d, Vertex vertex) + { + Activity activity = (Activity) vertex; + boolean active = activity.getActive(); + boolean hasError = !activity.verify(); + boolean isComposite = activity.getIsComposite(); + GraphPoint centrePoint = activity.getCentrePoint(); + //String description = activity.getDescription(); + String[] linesOfText = new String[3]; + linesOfText[0] = "(" + activity.getType() + ")"; + linesOfText[1] = activity.getName(); + if (hasError) + linesOfText[2] = Language.translate(activity.getErrors()); + else + { + boolean showTime = activity.getActive() && ((Boolean) activity.getProperties().get("Show time")).booleanValue(); + String stateName = "Invalid State"; + try { + stateName = activity.getStateName(); + } catch (InvalidDataException ex) { } + + linesOfText[2] = + Language.translate(stateName) + (showTime ? " " + getWaitTime(activity.getStateDate()) : ""); + } + + FontMetrics metrics = g2d.getFontMetrics(); + int lineWidth = 0; + int lineHeight = metrics.getHeight(); + int linesHeight = lineHeight * linesOfText.length; + int linesStartY = centrePoint.y - linesHeight / 2 + lineHeight * 2 / 3; + int x = 0; + int y = 0; + int i = 0; + GraphPoint[] outline = vertex.getOutlinePoints(); + Paint actColour; + if (hasError) + actColour = mErrorPaint; + else if (active) + if (isComposite) + actColour = mActiveCompPaint; + else + actColour = mActivePaint; + else if (isComposite) + actColour = mInactiveCompPaint; + else + actColour = mInactivePaint; + g2d.setPaint(actColour); + //g2d.fill3DRect( centrePoint.x - mSize.width / 2, centrePoint.y - mSize.height / 2, mSize.width, mSize.height, true ); + g2d.fill(graphPointsToPolygon(outline)); + g2d.setPaint(mTextPaint); + for (i = 0; i < linesOfText.length; i++) + { + lineWidth = metrics.stringWidth(linesOfText[i]); + x = centrePoint.x - lineWidth / 2; + y = linesStartY + i * lineHeight; + g2d.drawString(linesOfText[i], x, y); + } + } + private static Polygon graphPointsToPolygon(GraphPoint[] points) + { + Polygon polygon = new Polygon(); + int i = 0; + for (i = 0; i < points.length; i++) + { + polygon.addPoint(points[i].x, points[i].y); + } + return polygon; + } + private static String getWaitTime(GTimeStamp date) + { + GTimeStamp now = new GTimeStamp(); + DateUtility.setToNow(now); + long diff = DateUtility.diff(now, date); + long secondes = diff % 60; + long minutes = (diff / 60) % 60; + long hours = (diff / 3600) % 24; + long days = (diff / 3600 / 24); + if (days > 0) + return days + " " + Language.translate("d") + " " + hours + " " + Language.translate("h"); + if (hours > 0) + return hours + " " + Language.translate("h") + " " + minutes + " " + Language.translate("min"); + if (minutes > 0) + return minutes + " " + Language.translate("min"); + return secondes + " " + Language.translate("sec"); + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/instance/FindActDefPanel.java b/src/main/java/org/cristalise/gui/lifecycle/instance/FindActDefPanel.java new file mode 100644 index 0000000..4c3acbc --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/instance/FindActDefPanel.java @@ -0,0 +1,73 @@ +package org.cristalise.gui.lifecycle.instance; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Iterator; + +import javax.swing.JButton; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.graph.view.SelectedVertexPanel; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lifecycle.ActivitySlotDef; +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.process.Gateway; + + +/************************************************************************** + * + * $Revision: 1.3 $ + * $Date: 2005/12/01 14:23:15 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class FindActDefPanel extends SelectedVertexPanel { + + JButton findButton; + ActivitySlotDef currentAct; + + public FindActDefPanel() { + super(); + findButton = new JButton("Open Definition"); + findButton.setEnabled(false); + add(findButton); + findButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + Iterator acts = Gateway.getLookup().search(new DomainPath("/desc/ActivityDesc/"), currentAct.getActivityDef()); + if (acts.hasNext()) MainFrame.treeBrowser.push((DomainPath)acts.next()); + } + }); + } + + /** + * + */ + + @Override + public void select(Vertex vert) { + if (vert instanceof ActivitySlotDef) { + findButton.setEnabled(true); + currentAct = (ActivitySlotDef)vert; + } + else + clear(); + + } + + /** + * + */ + + @Override + public void clear() { + findButton.setEnabled(false); + currentAct = null; + } + +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/instance/SplitJoinRenderer.java b/src/main/java/org/cristalise/gui/lifecycle/instance/SplitJoinRenderer.java new file mode 100644 index 0000000..8667fed --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/instance/SplitJoinRenderer.java @@ -0,0 +1,143 @@ +package org.cristalise.gui.lifecycle.instance; + +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Paint; + +import org.cristalise.gui.graph.view.VertexRenderer; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lifecycle.instance.AndSplit; +import org.cristalise.kernel.lifecycle.instance.Join; +import org.cristalise.kernel.lifecycle.instance.Loop; +import org.cristalise.kernel.lifecycle.instance.OrSplit; +import org.cristalise.kernel.lifecycle.instance.WfVertex; +import org.cristalise.kernel.lifecycle.instance.XOrSplit; +import org.cristalise.kernel.utils.Language; + + +public class SplitJoinRenderer implements VertexRenderer +{ + private Paint mTextPaint = Color.black; + private Paint mBoxPaint = new Color( 204, 204, 204 ); + private Paint mErrorPaint = new Color( 255, 0, 0 ); + private boolean mTextOffsetsNotInitialised = true; + private int mTextYOffset = 0; + private String mAndText = "And"; + private int mAndTextXOffset = 0; + private String mOrText = "Or"; + private int mOrTextXOffset = 0; + private String mLoopText = "Loop"; + private int mLoopTextXOffset = 0; + private String mXOrText = "XOr"; + private int mXOrTextXOffset = 0; + private String mJoinText = "Join"; + private int mJoinTextXOffset = 0; + private String mRouteText = ""; + private int mRouteTextXOffset = 0; + private String mXXXText = "XXX"; + private int mXXXTextXOffset = 0; + + + @Override + public void draw( Graphics2D g2d, Vertex vertex) + { + GraphPoint centrePoint = vertex.getCentrePoint(); + String text = null; + int textXOffset = 0; + int vertexHeight = vertex.getHeight(); + int vertexWidth = vertex.getWidth(); + + + if ( mTextOffsetsNotInitialised ) + { + initialiseTextOffsets( g2d ); + mTextOffsetsNotInitialised = false; + } + if ( vertex instanceof AndSplit ) + { + text = Language.translate(mAndText); + textXOffset = mAndTextXOffset; + } + else if ( vertex instanceof OrSplit ) + { + text = Language.translate(mOrText); + textXOffset = mOrTextXOffset; + } + else if ( vertex instanceof Loop ) + { + text = Language.translate(mLoopText); + textXOffset = mLoopTextXOffset; + } + else if ( vertex instanceof XOrSplit ) + { + text = Language.translate(mXOrText); + textXOffset = mXOrTextXOffset; + } + else if ( vertex instanceof Join ) + { + text = Language.translate(mJoinText); + textXOffset = mJoinTextXOffset; + } + else if ( vertex instanceof Join) + { + String type= (String)((Join)vertex).getProperties().get("Type"); + if (type!=null && type.equals("Route")) + { + text = mRouteText; + textXOffset = mRouteTextXOffset; + } + else + { + text = Language.translate(mJoinText); + textXOffset = mJoinTextXOffset; + } + } + else + { + text = mXXXText; + textXOffset = mXXXTextXOffset; + } + + boolean hasErrors = ((WfVertex)vertex).verify(); + g2d.setPaint( hasErrors ? mBoxPaint : mErrorPaint ); + g2d.fillRect + ( + centrePoint.x - vertexWidth / 2, + centrePoint.y - vertexHeight / 2, + vertexWidth, + vertexHeight + ); + g2d.setPaint( mTextPaint ); + g2d.drawRect + ( + centrePoint.x - vertexWidth / 2, + centrePoint.y - vertexHeight / 2, + vertexWidth, + vertexHeight + ); + g2d.drawString( text, centrePoint.x - textXOffset, centrePoint.y + mTextYOffset ); + + if (!hasErrors) { + g2d.setPaint( mErrorPaint ); + String errors = Language.translate(((WfVertex)vertex).getErrors()); + int errorWidth = g2d.getFontMetrics().stringWidth( errors ); + g2d.drawString( errors, centrePoint.x - ( errorWidth / 2), centrePoint.y + vertexHeight ); + } + } + + private void initialiseTextOffsets( Graphics2D g2d ) + { + FontMetrics metrics = g2d.getFontMetrics(); + + + mTextYOffset = metrics.getHeight() / 3; + mAndTextXOffset = metrics.stringWidth( Language.translate(mAndText) ) / 2; + mOrTextXOffset = metrics.stringWidth( Language.translate(mOrText) ) / 2; + mXOrTextXOffset = metrics.stringWidth( Language.translate(mXOrText) ) / 2; + mJoinTextXOffset = metrics.stringWidth( Language.translate(mJoinText) ) / 2; + mLoopTextXOffset = metrics.stringWidth( Language.translate(mLoopText) ) / 2; + } +} + diff --git a/src/main/java/org/cristalise/gui/lifecycle/instance/TransitionPanel.java b/src/main/java/org/cristalise/gui/lifecycle/instance/TransitionPanel.java new file mode 100644 index 0000000..d58422d --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/instance/TransitionPanel.java @@ -0,0 +1,215 @@ +package org.cristalise.gui.lifecycle.instance; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Map; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JOptionPane; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.graph.view.SelectedVertexPanel; +import org.cristalise.gui.tabs.ItemTabPane; +import org.cristalise.gui.tabs.execution.Executor; +import org.cristalise.kernel.common.InvalidDataException; +import org.cristalise.kernel.entity.agent.Job; +import org.cristalise.kernel.entity.proxy.ItemProxy; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lifecycle.instance.Activity; +import org.cristalise.kernel.lifecycle.instance.stateMachine.State; +import org.cristalise.kernel.lifecycle.instance.stateMachine.StateMachine; +import org.cristalise.kernel.lifecycle.instance.stateMachine.Transition; +import org.cristalise.kernel.utils.Logger; + + +/************************************************************************** + * + * $Revision: 1.8 $ + * $Date: 2005/09/07 13:46:31 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class TransitionPanel extends SelectedVertexPanel implements ActionListener { + protected Activity mCurrentAct; + protected GridBagLayout gridbag; + protected GridBagConstraints c; + protected Box transBox; + protected JComboBox executors; + protected JComboBox states = new JComboBox(); + protected JCheckBox active = new JCheckBox(); + protected JLabel status = new JLabel(); + protected ItemProxy mItem; + + public TransitionPanel() { + super(); + gridbag = new GridBagLayout(); + setLayout(gridbag); + c = new GridBagConstraints(); + c.gridx=0; c.gridy=0; + c.weightx=1; c.weighty=0; + c.fill=GridBagConstraints.HORIZONTAL; + + JLabel title = new JLabel("Available Transitions"); + title.setFont(ItemTabPane.titleFont); + gridbag.setConstraints(title, c); + add(title); + + c.gridy++; + gridbag.setConstraints(status, c); + add(status); + c.gridy++; + + transBox = Box.createHorizontalBox(); + gridbag.setConstraints(transBox, c); + add(transBox); + + c.weightx=0; c.gridx++; + executors = MainFrame.getExecutionPlugins(); + if (executors.getItemCount() > 1) { + gridbag.setConstraints(executors, c); + add(executors); + } + + + + if (MainFrame.isAdmin) { + c.gridx=0; c.gridy++; + title = new JLabel("State Hacking"); + title.setFont(ItemTabPane.titleFont); + gridbag.setConstraints(title, c); + add(title); + Box hackBox = Box.createHorizontalBox(); + hackBox.add(states); + hackBox.add(Box.createHorizontalGlue()); + hackBox.add(new JLabel("Active:")); + hackBox.add(active); + c.gridy++; + gridbag.setConstraints(hackBox, c); + add(hackBox); + states.addActionListener(this); + active.addActionListener(this); + } + + clear(); + + } + /** + * + */ + @Override + public void select(Vertex vert) { + clear(); + if (!(vert instanceof Activity)) return; + mCurrentAct = (Activity)vert; + StateMachine sm; + try { + sm = mCurrentAct.getStateMachine(); + } catch (InvalidDataException e) { + status.setText("Invalid state machine."); + Logger.error(e); + return; + } + states.removeAllItems(); + int currentState; + try { + currentState = mCurrentAct.getState(); + } catch (InvalidDataException e) { + status.setText("Could not find activity state"); + Logger.error(e); + return; + } + for (State thisState : sm.getStates()) { + states.addItem(thisState); + if (currentState == thisState.getId()) + states.setSelectedItem(thisState); + } + states.setEnabled(true); + active.setSelected(mCurrentAct.active); + active.setEnabled(true); + Logger.msg(1, "Retrieving possible transitions for activity "+mCurrentAct.getName()); + Map transitions; + try { + transitions = mCurrentAct.getStateMachine().getPossibleTransitions(mCurrentAct, MainFrame.userAgent.getPath()); + } catch (Exception e) { + status.setText("Error loading possible transitions of activity. See log."); + Logger.error(e); + return; + } + + if (transitions.size() == 0) { + status.setText("None"); + return; + } + + for (Transition trans:transitions.keySet()) { + boolean hasOutcome = trans.hasOutcome(mCurrentAct.getProperties()); + if (!hasOutcome || (hasOutcome && !trans.getOutcome().isRequired())) { + JButton thisTrans = new JButton(trans.getName()); + thisTrans.setActionCommand("Trans:"+trans.getId()); + thisTrans.addActionListener(this); + transBox.add(thisTrans); + transBox.add(Box.createHorizontalGlue()); + } + status.setText(transitions.size()+" transitions possible."); + } + revalidate(); + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getSource() == active && mCurrentAct != null) { + mCurrentAct.active = active.isSelected(); + return; + } + if (e.getSource() == states && mCurrentAct != null) { + mCurrentAct.setState(states.getSelectedIndex()); + return; + } + if (!e.getActionCommand().startsWith("Trans:")) return; + int transition = Integer.parseInt(e.getActionCommand().substring(6)); + Logger.msg("Requesting transition "+transition); + try { + StateMachine actSM = mCurrentAct.getStateMachine(); + Job thisJob = new Job(mCurrentAct, + mItem.getPath(), + actSM.getTransition(transition), + MainFrame.userAgent.getPath(), + "Admin"); + Executor selectedExecutor = (Executor)executors.getSelectedItem(); + selectedExecutor.execute(thisJob, status); + } catch (Exception ex) { + String className = ex.getClass().getName(); + className = className.substring(className.lastIndexOf('.')+1); + Logger.error(ex); + JOptionPane.showMessageDialog(null, ex.getMessage(), className, JOptionPane.ERROR_MESSAGE); + } + + } + + @Override + public void clear() { + mCurrentAct = null; + transBox.removeAll(); + status.setText("No activity selected"); + states.setEnabled(false); + active.setSelected(false); + active.setEnabled(false); + revalidate(); + } + + + /** + * @param item The mItem to set. + */ + public void setItem(ItemProxy item) { + mItem = item; + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/instance/WfDirectedEdgeRenderer.java b/src/main/java/org/cristalise/gui/lifecycle/instance/WfDirectedEdgeRenderer.java new file mode 100644 index 0000000..1dce7e7 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/instance/WfDirectedEdgeRenderer.java @@ -0,0 +1,131 @@ +package org.cristalise.gui.lifecycle.instance; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.GeneralPath; + +import org.cristalise.gui.graph.view.DirectedEdgeRenderer; +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.lifecycle.instance.Next; + +public class WfDirectedEdgeRenderer implements DirectedEdgeRenderer +{ + private GeneralPath mArrowTemplate = new GeneralPath(); + public WfDirectedEdgeRenderer() + { + mArrowTemplate.moveTo(-5, 5); + mArrowTemplate.lineTo(0, 0); + mArrowTemplate.lineTo(5, 5); + } + @Override + public void draw(Graphics2D g2d, DirectedEdge directedEdge) + { + GraphPoint originPoint = directedEdge.getOriginPoint(); + GraphPoint terminusPoint = directedEdge.getTerminusPoint(); + GraphPoint midPoint = new GraphPoint(); + AffineTransform transform = new AffineTransform(); + Shape arrow = null; + Next next = (Next) directedEdge; + String text = (String) next.getProperties().get("Alias"); + g2d.setPaint(Color.black); + if (("Broken +".equals(next.getProperties().get("Type")))) + { + g2d.drawLine(originPoint.x, originPoint.y, originPoint.x, (originPoint.y + terminusPoint.y) / 2); + g2d.drawLine(originPoint.x, (originPoint.y + terminusPoint.y) / 2, terminusPoint.x, (originPoint.y + terminusPoint.y) / 2); + g2d.drawLine(terminusPoint.x, (originPoint.y + terminusPoint.y) / 2, terminusPoint.x, terminusPoint.y); + midPoint.x = (originPoint.x + terminusPoint.x) / 2; + midPoint.y = (originPoint.y + terminusPoint.y) / 2; + transform.translate(midPoint.x, midPoint.y); + transform.rotate( + calcArrowAngle( + originPoint.x, + originPoint.x - terminusPoint.x > -5 + && originPoint.x - terminusPoint.x < 5 ? originPoint.y : (originPoint.y + terminusPoint.y) / 2, + terminusPoint.x, + originPoint.x - terminusPoint.x > -5 + && originPoint.x - terminusPoint.x < 5 ? terminusPoint.y : (originPoint.y + terminusPoint.y) / 2)); + } + else if (("Broken -".equals(next.getProperties().get("Type")))) + { + g2d.drawLine(originPoint.x, originPoint.y, terminusPoint.x, originPoint.y); + g2d.drawLine(terminusPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y); + boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); + midPoint.x = arrowOnY ? terminusPoint.x : (originPoint.x + terminusPoint.x) / 2; + midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : originPoint.y; + transform.translate(midPoint.x, midPoint.y); + transform.rotate( + calcArrowAngle( + arrowOnY ? terminusPoint.x : originPoint.x, + arrowOnY ? originPoint.y : originPoint.y, + arrowOnY ? terminusPoint.x : terminusPoint.x, + arrowOnY ? terminusPoint.y : originPoint.y)); + } + else if (("Broken |".equals(next.getProperties().get("Type")))) + { + g2d.drawLine(originPoint.x, originPoint.y, originPoint.x, terminusPoint.y); + g2d.drawLine(originPoint.x, terminusPoint.y, terminusPoint.x, terminusPoint.y); + boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); + midPoint.x = arrowOnY ? originPoint.x : (originPoint.x + terminusPoint.x) / 2; + midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : terminusPoint.y; + transform.translate(midPoint.x, midPoint.y); + transform.rotate( + calcArrowAngle( + arrowOnY ? terminusPoint.x : originPoint.x, + arrowOnY ? originPoint.y : originPoint.y, + arrowOnY ? terminusPoint.x : terminusPoint.x, + arrowOnY ? terminusPoint.y : originPoint.y)); + } + else + { + g2d.drawLine(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y); + midPoint.x = originPoint.x + (terminusPoint.x - originPoint.x) / 2; + midPoint.y = originPoint.y + (terminusPoint.y - originPoint.y) / 2; + transform.translate(midPoint.x, midPoint.y); + transform.rotate(calcArrowAngle(originPoint.x, originPoint.y, terminusPoint.x, terminusPoint.y)); + } + arrow = mArrowTemplate.createTransformedShape(transform); + g2d.draw(arrow); + if (text != null) + g2d.drawString(text, midPoint.x + 10, midPoint.y); + } + private static double calcArrowAngle(int originX, int originY, int terminusX, int terminusY) + { + double width = terminusX - originX; + double height = terminusY - originY; + if ((width == 0) && (height > 0)) + { + return Math.PI; + } + if ((width == 0) && (height < 0)) + { + return 0; + } + if ((width > 0) && (height == 0)) + { + return Math.PI / 2.0; + } + if ((width < 0) && (height == 0)) + { + return -1.0 * Math.PI / 2.0; + } + if ((width > 0) && (height > 0)) + { + return Math.PI / 2.0 + Math.atan(Math.abs(height) / Math.abs(width)); + } + if ((width > 0) && (height < 0)) + { + return Math.atan(Math.abs(width) / Math.abs(height)); + } + if ((width < 0) && (height < 0)) + { + return -1.0 * Math.atan(Math.abs(width) / Math.abs(height)); + } + if ((width < 0) && (height > 0)) + { + return -1.0 * (Math.PI / 2.0 + Math.atan(Math.abs(height) / Math.abs(width))); + } + return 0.0; + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/instance/WfEdgeFactory.java b/src/main/java/org/cristalise/gui/lifecycle/instance/WfEdgeFactory.java new file mode 100644 index 0000000..d6596b6 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/instance/WfEdgeFactory.java @@ -0,0 +1,35 @@ +package org.cristalise.gui.lifecycle.instance; + +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.EdgeFactory; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.TypeNameAndConstructionInfo; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lifecycle.instance.WfVertex; + +public class WfEdgeFactory implements EdgeFactory +{ + @Override + public void create + ( + GraphModelManager graphModelManager, + Vertex origin, + Vertex terminus, + TypeNameAndConstructionInfo typeNameAndConstructionInfo + ) + { + if ( validCreation( graphModelManager, origin, terminus ) ) + ((WfVertex)origin).addNext((WfVertex)terminus); + + } + + private static boolean validCreation( GraphModelManager graphModelManager, Vertex origin, Vertex terminus ) + { + DirectedEdge[] connectingEdgesAToB = graphModelManager.getModel().getConnectingEdges( origin.getID() , terminus.getID() ); + DirectedEdge[] connectingEdgesBToA = graphModelManager.getModel().getConnectingEdges( terminus.getID(), origin.getID() ); + + + return ( origin != terminus ) && ( connectingEdgesAToB.length == 0 ) && ( connectingEdgesBToA.length == 0 ); + } +} + diff --git a/src/main/java/org/cristalise/gui/lifecycle/instance/WfGraphPanel.java b/src/main/java/org/cristalise/gui/lifecycle/instance/WfGraphPanel.java new file mode 100644 index 0000000..1d8a3e3 --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/instance/WfGraphPanel.java @@ -0,0 +1,60 @@ +/*Created on 21 nov. 2003 */ +package org.cristalise.gui.lifecycle.instance; + +import java.awt.Graphics2D; + +import org.cristalise.gui.graph.view.DirectedEdgeRenderer; +import org.cristalise.gui.graph.view.GraphPanel; +import org.cristalise.gui.graph.view.VertexRenderer; +import org.cristalise.kernel.graph.model.DirectedEdge; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.lifecycle.instance.Next; + + +/** @author XSeb74*/ +public class WfGraphPanel extends GraphPanel +{ + public WfGraphPanel(DirectedEdgeRenderer d,VertexRenderer v) + { + super(d,v); + } + // Draws the highlight of the specified edge + @Override + protected void drawEdgeHighlight(Graphics2D g2d, DirectedEdge edge) + { + GraphPoint originPoint = edge.getOriginPoint(); + GraphPoint terminusPoint = edge.getTerminusPoint(); + GraphPoint midPoint = new GraphPoint(); + + if ("Straight".equals(((Next)edge).getProperties().get("Type")) || ((Next)edge).getProperties().get("Type") == null) + { + midPoint.x = originPoint.x + (terminusPoint.x - originPoint.x) / 2; + midPoint.y = originPoint.y + (terminusPoint.y - originPoint.y) / 2; + } + else if (("Broken +".equals(((Next)edge).getProperties().get("Type")))) + { + midPoint.x = (originPoint.x + terminusPoint.x) / 2; + midPoint.y = (originPoint.y + terminusPoint.y) / 2; + } + else if (("Broken -".equals(((Next)edge).getProperties().get("Type")))) + { + boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); + midPoint.x = arrowOnY ? terminusPoint.x : (originPoint.x + terminusPoint.x) / 2; + midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : originPoint.y; + } + else if (("Broken |".equals(((Next)edge).getProperties().get("Type")))) + { + boolean arrowOnY = !(originPoint.y - terminusPoint.y < 60 && originPoint.y - terminusPoint.y > -60); + midPoint.x = arrowOnY ? originPoint.x : (originPoint.x + terminusPoint.x) / 2; + midPoint.y = arrowOnY ? (originPoint.y + terminusPoint.y) / 2 : terminusPoint.y; + } + int minX = midPoint.x - 10; + int minY = midPoint.y - 10; + int maxX = midPoint.x + 10; + int maxY = midPoint.y + 10; + g2d.drawLine(minX, minY, maxX, minY); + g2d.drawLine(maxX, minY, maxX, maxY); + g2d.drawLine(maxX, maxY, minX, maxY); + g2d.drawLine(minX, maxY, minX, minY); + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/instance/WfVertexFactory.java b/src/main/java/org/cristalise/gui/lifecycle/instance/WfVertexFactory.java new file mode 100644 index 0000000..d80d18c --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/instance/WfVertexFactory.java @@ -0,0 +1,93 @@ +package org.cristalise.gui.lifecycle.instance; +import java.io.Serializable; +import java.util.HashMap; + +import javax.swing.JOptionPane; + +import org.cristalise.gui.ImageLoader; +import org.cristalise.gui.lifecycle.chooser.ActivityChooser; +import org.cristalise.gui.lifecycle.chooser.WorkflowDialogue; +import org.cristalise.kernel.graph.model.GraphModelManager; +import org.cristalise.kernel.graph.model.GraphPoint; +import org.cristalise.kernel.graph.model.TypeNameAndConstructionInfo; +import org.cristalise.kernel.graph.model.VertexFactory; +import org.cristalise.kernel.lifecycle.ActivityDef; +import org.cristalise.kernel.lifecycle.instance.Activity; +import org.cristalise.kernel.lifecycle.instance.CompositeActivity; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.LocalObjectLoader; + +public class WfVertexFactory implements VertexFactory, WorkflowDialogue +{ + protected CompositeActivity mRootAct = null; + @Override + public void create(GraphModelManager graphModelManager, GraphPoint location, TypeNameAndConstructionInfo typeNameAndConstructionInfo) + { + String vertexTypeId = null; + if (mRootAct != null && typeNameAndConstructionInfo.mInfo instanceof String) + { + vertexTypeId = (String) typeNameAndConstructionInfo.mInfo; + if (vertexTypeId.equals("Atomic") || vertexTypeId.equals("Composite")) + { + HashMap mhm = new HashMap(); + mhm.put("P1", vertexTypeId); + mhm.put("P2", location); + //************************************************ + ActivityChooser a = + new ActivityChooser( + Language.translate("Please enter a Type for the new activity"), + Language.translate("New " + vertexTypeId + " Activity"), + ImageLoader.findImage("graph/newvertex_large.png").getImage(), + this, + mhm); + a.setVisible(true); + } + else + mRootAct.newChild(vertexTypeId, location); + } + } + @Override + public void setCreationContext(Object newContext) + { + if (newContext != null && newContext instanceof CompositeActivity) + mRootAct = (CompositeActivity) newContext; + } + @Override + public void loadThisWorkflow(String newName, HashMap hashMap) + { + String vertexTypeId = (String) hashMap.get("P1"); + GraphPoint location = (GraphPoint) hashMap.get("P2"); + if (newName == null) + return; + + + String unicName = newName; + while (mRootAct.search(mRootAct.getPath() + "/" + unicName) != null) + { + unicName = + (String) JOptionPane.showInputDialog( + null, + Language.translate("Activity name not unique. Please give another."), + Language.translate("New " + vertexTypeId + " Activity"), + JOptionPane.QUESTION_MESSAGE, + ImageLoader.findImage("graph/newvertex_large.png"), + null, + null); + if (newName.equals("")) + return; + } + Activity act = null; + try + { + ActivityDef actD = LocalObjectLoader.getActDef(newName, 0); + act = (Activity)actD.instantiate(unicName); + } + catch (Exception e) + { + } + if (act == null) + mRootAct.newChild(unicName, vertexTypeId, location); + else + mRootAct.newExistingChild(act, unicName, location); + } +} diff --git a/src/main/java/org/cristalise/gui/lifecycle/instance/WfVertexRenderer.java b/src/main/java/org/cristalise/gui/lifecycle/instance/WfVertexRenderer.java new file mode 100644 index 0000000..61944fc --- /dev/null +++ b/src/main/java/org/cristalise/gui/lifecycle/instance/WfVertexRenderer.java @@ -0,0 +1,24 @@ +package org.cristalise.gui.lifecycle.instance; + +import java.awt.Graphics2D; + +import org.cristalise.gui.graph.view.VertexRenderer; +import org.cristalise.kernel.graph.model.Vertex; +import org.cristalise.kernel.lifecycle.instance.Activity; +import org.cristalise.kernel.lifecycle.instance.Join; +import org.cristalise.kernel.lifecycle.instance.Split; + + +public class WfVertexRenderer implements VertexRenderer +{ + protected ActivityRenderer mActivityRenderer = new ActivityRenderer(); + protected SplitJoinRenderer mSplitJoinRenderer = new SplitJoinRenderer(); + + @Override + public void draw( Graphics2D g2d, Vertex vertex) + { + if ( vertex instanceof Activity ) { mActivityRenderer.draw( g2d, vertex); } + else if ( ( vertex instanceof Split ) || ( vertex instanceof Join ) ) { mSplitJoinRenderer.draw( g2d, vertex ); } + } +} + diff --git a/src/main/java/org/cristalise/gui/tabs/CloseTabIcon.java b/src/main/java/org/cristalise/gui/tabs/CloseTabIcon.java new file mode 100644 index 0000000..dff6da0 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/CloseTabIcon.java @@ -0,0 +1,70 @@ +package org.cristalise.gui.tabs; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Rectangle; + +import javax.swing.Icon; + +/** + * @author Developpement + * + * To change this generated comment edit the template variable "typecomment": + * Window>Preferences>Java>Templates. + * To enable and disable the creation of type comments go to + * Window>Preferences>Java>Code Generation. + */ +/** * The class which generates the 'X' icon for the tabs. The constructor * accepts an icon which is extra to the 'X' icon, so you can have tabs * like in JBuilder. This value is null if no extra icon is required. */ +class CloseTabIcon implements Icon +{ + private int x_pos; + private int y_pos; + private int width; + private int height; + private Icon fileIcon; + public CloseTabIcon(Icon fileIcon) + { + this.fileIcon = fileIcon; + width = 16; + height = 16; + } + @Override + public void paintIcon(Component c, Graphics g, int x, int y) + { + this.x_pos = x; + this.y_pos = y; + Color col = g.getColor(); + g.setColor(Color.black); + int y_p = y + 2; + g.drawLine(x + 1, y_p, x + 12, y_p); + g.drawLine(x + 1, y_p + 13, x + 12, y_p + 13); + g.drawLine(x, y_p + 1, x, y_p + 12); + g.drawLine(x + 13, y_p + 1, x + 13, y_p + 12); + g.drawLine(x + 3, y_p + 3, x + 10, y_p + 10); + g.drawLine(x + 3, y_p + 4, x + 9, y_p + 10); + g.drawLine(x + 4, y_p + 3, x + 10, y_p + 9); + g.drawLine(x + 10, y_p + 3, x + 3, y_p + 10); + g.drawLine(x + 10, y_p + 4, x + 4, y_p + 10); + g.drawLine(x + 9, y_p + 3, x + 3, y_p + 9); + g.setColor(col); + if (fileIcon != null) + { + fileIcon.paintIcon(c, g, x + width, y_p); + } + } + @Override + public int getIconWidth() + { + return width + (fileIcon != null ? fileIcon.getIconWidth() : 0); + } + @Override + public int getIconHeight() + { + return height; + } + public Rectangle getBounds() + { + return new Rectangle(x_pos, y_pos, width, height); + } +} \ No newline at end of file diff --git a/src/main/java/org/cristalise/gui/tabs/CollectionPane.java b/src/main/java/org/cristalise/gui/tabs/CollectionPane.java new file mode 100644 index 0000000..c2dce76 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/CollectionPane.java @@ -0,0 +1,123 @@ +package org.cristalise.gui.tabs; +import java.awt.GridBagConstraints; +import java.util.StringTokenizer; + +import javax.swing.JTabbedPane; + +import org.cristalise.gui.tabs.collection.AggregationView; +import org.cristalise.gui.tabs.collection.CollectionView; +import org.cristalise.gui.tabs.collection.DependencyView; +import org.cristalise.kernel.collection.Aggregation; +import org.cristalise.kernel.collection.Collection; +import org.cristalise.kernel.collection.CollectionDescription; +import org.cristalise.kernel.collection.CollectionMember; +import org.cristalise.kernel.collection.Dependency; +import org.cristalise.kernel.entity.proxy.MemberSubscription; +import org.cristalise.kernel.entity.proxy.ProxyObserver; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Logger; + +/** + * @version $Revision: 1.36 $ $Date: 2005/10/06 06:51:15 $ + * @author $Author: abranson $ + */ +public class CollectionPane extends ItemTabPane implements ProxyObserver> +{ + JTabbedPane collTabs; + + public CollectionPane() + { + super("Collection", "Item Collection"); + createLayout(); + } + + @Override + public void add(Collection contents) + { + Logger.msg(5, "Got "+contents.getName()+": "+contents.getClass().getName()); + Logger.msg(7, "Looking for existing "+contents.getName()); + CollectionView thisCollView = findTabForCollName(contents.getName()); + if (thisCollView == null){ + if (contents instanceof Aggregation) { + AggregationView thisAggView = new AggregationView(); + thisAggView.setItem(sourceItem.getItem()); + thisAggView.setCollection((Aggregation)contents); + thisCollView = thisAggView; + } + else if (contents instanceof Dependency) { + DependencyView thisDepView = new DependencyView(); + thisDepView.setItem(sourceItem.getItem()); + thisDepView.setCollection((Dependency)contents); + thisCollView = thisDepView; + } + else { + Logger.error("Collection type "+contents.getClass().getName()+" not known"); + return; + } + Logger.msg(3, "Adding new "+thisCollView.getClass().getName()); + collTabs.add(contents.getName()+(contents instanceof CollectionDescription?"*":""), thisCollView); + } + } + + @Override + public void remove(String id) + { + + } + + private CollectionView findTabForCollName(String collName) { + CollectionView thisCollView = null; + for (int i = 0; i < collTabs.getTabCount(); i++) { + String tabName = collTabs.getTitleAt(i); + if (tabName.equals(collName)) { + thisCollView = (CollectionView)collTabs.getComponentAt(i); + } + } + return thisCollView; + } + + protected void createLayout() + { + initPanel(); + // Add the collection tab pane + getGridBagConstraints(); + c.gridx = 0; + c.gridy = 1; + c.fill = GridBagConstraints.BOTH; + c.weighty = 2.0; + collTabs = new JTabbedPane(); + gridbag.setConstraints(collTabs, c); + add(collTabs); + } + + @Override + public void run() + { + Thread.currentThread().setName("Collection Loader"); + sourceItem.getItem().subscribe(new MemberSubscription>(this, ClusterStorage.COLLECTION, false)); + try { + String collNames = sourceItem.getItem().queryData(ClusterStorage.COLLECTION+"/all"); + StringTokenizer tok = new StringTokenizer(collNames, ","); + while (tok.hasMoreTokens()) { + Collection thisLastColl = (Collection) sourceItem.getItem().getObject(ClusterStorage.COLLECTION+"/"+tok.nextToken()+"/last"); + add(thisLastColl); + } + } catch (Exception e) { + Logger.error(e); + Logger.msg(2, "Error loading collections"); + } + } + + @Override + public void reload() + { + Gateway.getStorage().clearCache(sourceItem.getItemPath(), ClusterStorage.COLLECTION); + collTabs.removeAll(); + initForItem(sourceItem); + } + + @Override + public void control(String control, String msg) { + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/DomainPathAdmin.java b/src/main/java/org/cristalise/gui/tabs/DomainPathAdmin.java new file mode 100644 index 0000000..a9bccef --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/DomainPathAdmin.java @@ -0,0 +1,176 @@ +package org.cristalise.gui.tabs; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.Iterator; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; + +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.proxy.ItemProxy; +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.process.Gateway; + + +/************************************************************************** + * + * $Revision: 1.3 $ + * $Date: 2004/10/21 08:02:21 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class DomainPathAdmin extends Box implements ActionListener { + + ItemProxy entity; + JTable table; + DomainPathTableModel model; + JButton addButton; + JButton removeButton; + + public DomainPathAdmin() { + super(BoxLayout.Y_AXIS); + + model = new DomainPathTableModel(this); + table = new JTable(model); + add(new JScrollPane(table)); + + add(Box.createVerticalGlue()); + Box buttonBox = Box.createHorizontalBox(); + addButton = new JButton("Add"); + buttonBox.add(addButton); + buttonBox.add(Box.createHorizontalGlue()); + removeButton = new JButton("Remove"); + buttonBox.add(removeButton); + buttonBox.add(Box.createHorizontalGlue()); + add(buttonBox); + + addButton.setActionCommand("add"); + addButton.addActionListener(this); + removeButton.setActionCommand("remove"); + removeButton.addActionListener(this); + } + + public void setEntity(ItemProxy entity) { + this.entity = entity; + model.loadPaths(); + } + + @Override +public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().equals("add")) { + String newPath = JOptionPane.showInputDialog(this, "Enter new path,", "Add Domain Path", JOptionPane.PLAIN_MESSAGE); + addDomainPath(new DomainPath(newPath)); + model.loadPaths(); + } + else if (e.getActionCommand().equals("remove")) { + if (table.getSelectedRow() > -1) { + DomainPath oldPath = model.getPath(table.getSelectedRow()); + removeDomainPath(oldPath); + model.loadPaths(); + } + } + } + + public boolean removeDomainPath(DomainPath oldPath) { + return alterDomainPath(oldPath, "Remove"); + } + + public boolean addDomainPath(DomainPath newPath) { + return alterDomainPath(newPath, "Add"); + } + + public boolean alterDomainPath(DomainPath path, String action) { + + if (JOptionPane.showConfirmDialog(this, + action+" "+path+"?", + action+" Domain Path", + JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) + return false; + + String[] params = new String[1]; + params[0] = path.toString(); + try { + MainFrame.userAgent.execute(entity, action+"DomainPath", params); + } catch (Exception e) { + MainFrame.exceptionDialog(e); + return false; + } + return true; + } + + private class DomainPathTableModel extends AbstractTableModel { + ArrayList domPaths; + DomainPathAdmin parent; + public DomainPathTableModel(DomainPathAdmin parent) { + this.parent = parent; + domPaths = new ArrayList(); + } + + public void loadPaths() { + domPaths.clear(); + for (Iterator currentPaths = Gateway.getLookup().search(new DomainPath(), entity.getName()); currentPaths.hasNext();) { + DomainPath thisPath = (DomainPath)currentPaths.next(); + try { + if (thisPath.getItemPath().equals(entity.getPath())) domPaths.add(thisPath); + } catch (ObjectNotFoundException e) { } + } + fireTableDataChanged(); + } + + public DomainPath getPath(int rowIndex) { + return domPaths.get(rowIndex); + } + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + DomainPath oldPath = domPaths.get(rowIndex); + DomainPath newPath = new DomainPath((String)aValue); + boolean success = parent.addDomainPath(newPath); + if (success) + success = parent.removeDomainPath(oldPath); + if (success) { + oldPath.setPath(newPath); + fireTableDataChanged(); + } + } + + @Override + public Class getColumnClass(int columnIndex) { + return String.class; + } + + @Override + public int getColumnCount() { + return 1; + } + + @Override + public String getColumnName(int column) { + return "Path"; + } + + @Override + public int getRowCount() { + return domPaths.size(); + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return domPaths.get(rowIndex).toString(); + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return true; + } + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/ExecutionPane.java b/src/main/java/org/cristalise/gui/tabs/ExecutionPane.java new file mode 100644 index 0000000..e982d18 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/ExecutionPane.java @@ -0,0 +1,208 @@ +package org.cristalise.gui.tabs; + +import java.awt.GridBagConstraints; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.ArrayList; +import java.util.Iterator; + +import javax.swing.Box; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.tabs.execution.ActivityItem; +import org.cristalise.gui.tabs.execution.ActivityViewer; +import org.cristalise.kernel.entity.agent.Job; +import org.cristalise.kernel.entity.proxy.MemberSubscription; +import org.cristalise.kernel.entity.proxy.ProxyObserver; +import org.cristalise.kernel.lifecycle.instance.Workflow; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + +public class ExecutionPane extends ItemTabPane implements ProxyObserver { + + ArrayList jobList = null; + Object jobLock = new Object(); + ActivityItem emptyAct = new ActivityItem(); + JLabel noActs = new JLabel(Language.translate("There are currently no activities that you can execute in this item.")); + JPanel view = new JPanel(new GridLayout(1, 1)); + ActivityViewer currentActView; + JComboBox activitySelector = new JComboBox(); + Box activityBox = Box.createHorizontalBox(); + String selAct = null; + ArrayList activities; + String autoRun = null; + boolean init = false; + boolean formIsActive = false; + public ExecutionPane() { + super("Execution", "Activity Execution"); + super.initPanel(); + // add view panel + c = new GridBagConstraints(); + c.gridx = 0; c.gridy = 1; c.weightx = 1.0; c.weighty = 2.0; + c.insets = new Insets(5, 5, 5, 5); + c.anchor = GridBagConstraints.CENTER; + c.fill = GridBagConstraints.BOTH; + gridbag.setConstraints(view, c); + + add(view); + // create activity selection box + activityBox.add(new JLabel(Language.translate("Select Activity") + ": ")); + activityBox.add(Box.createHorizontalStrut(5)); + activitySelector.setEditable(false); + activityBox.add(activitySelector); + activitySelector.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent selection) { + if (selection.getStateChange() == ItemEvent.SELECTED) { + selectActivity(selection.getItem()); + } + } + }); + } + @Override + public void run() { + Thread.currentThread().setName("Execution Pane Builder"); + sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.LIFECYCLE, false)); + loadJobList(); + init = true; + if (autoRun != null) { + runCommand(autoRun); + autoRun = null; + } + } + private void loadJobList() { + synchronized (jobLock) { + activitySelector.removeAllItems(); + view.removeAll(); + activities = new ArrayList(); + try { + jobList = (sourceItem.getItem()).getJobList(MainFrame.userAgent); + activitySelector.addItem(emptyAct); + for (Job thisJob : jobList) { + //Logger.msg(7, "ExecutionPane - loadJobList " + thisJob.hasOutcome() + "|" + thisJob.getSchemaName() + "|" + thisJob.getSchemaVersion() + "|"); + ActivityItem newAct = new ActivityItem(thisJob); + if (activities.contains(newAct)) { + int actIndex = activities.indexOf(newAct); + activities.get(actIndex).addJob(thisJob); + } else { + Logger.msg(2, "ExecutionPane - Adding activity " + thisJob.getStepPath()); + addActivity(newAct); + } + } + } catch (Exception e) { + Logger.error("Error fetching joblist"); + Logger.error(e); + } + + switch (activities.size()) { + case 0 : + view.add(noActs); + break; + case 1 : + currentActView = new ActivityViewer(activities.get(0), sourceItem.getItem(), this); + c.fill = GridBagConstraints.BOTH; + gridbag.setConstraints(view, c); + view.add(currentActView); + currentActView.init(); + break; + default : + c.fill = GridBagConstraints.HORIZONTAL; + gridbag.setConstraints(view, c); + view.add(activityBox); + } + } + revalidate(); + updateUI(); + } + @Override + public void reload() { + loadJobList(); + } + private void addActivity(ActivityItem newAct) { + if (activities.contains(newAct)) { + Logger.msg(6, "ExecutionPane.addActivity(): Already in " + newAct.getStepPath()); + int actIndex = activities.indexOf(newAct); + activitySelector.removeItemAt(actIndex); + activitySelector.insertItemAt(newAct, actIndex); + activities.set(actIndex, newAct); + } else { + Logger.msg(6, "ExecutionPane.addActivity(): New " + newAct.getStepPath()); + activities.add(newAct); + activitySelector.addItem(newAct); + } + } + private void selectActivity(Object selObj) { + if (selObj.equals(emptyAct)) + return; + view.removeAll(); + c.fill = GridBagConstraints.BOTH; + gridbag.setConstraints(view, c); + currentActView = new ActivityViewer((ActivityItem)selObj, sourceItem.getItem(), this); + view.add(currentActView); + revalidate(); + updateUI(); + currentActView.init(); + } + @Override + public void runCommand(String command) { + if (init) { + for (ActivityItem act : activities) { + if (act.name.equals(command)) { + selectActivity(act); + } + } + } else + autoRun = command; + } + /** + * when the workflow changes, reload this pane. + */ + @Override + public void add(Workflow contents) { + if (!formIsActive) + reload(); + else { // look to see if this form is now invalid + // get the new joblist + try { + jobList = (sourceItem.getItem()).getJobList(MainFrame.userAgent); + } catch (Exception ex) { + return; + } + // compare to currently editing jobs + ArrayList currentActJobs = currentActView.getActivity().getJobs(); + boolean allValid = true; + for (Iterator iter = currentActJobs.iterator(); iter.hasNext() && allValid;) { + Job thisJob = (Job)iter.next(); + boolean stillValid = false; + for (Job newJob : jobList) { + if (thisJob.equals(newJob)) { + stillValid = true; + break; + } + } + allValid &= stillValid; + } + if (!allValid) { // not all transitions are now valid + reload(); // refresh the execution pane + } + } + } + /** + * Not pertinent for this one + */ + @Override + public void remove(String id) { + } + @Override + public void control(String control, String msg) { + // TODO Auto-generated method stub + + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/HistoryPane.java b/src/main/java/org/cristalise/gui/tabs/HistoryPane.java new file mode 100644 index 0000000..60e97e9 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/HistoryPane.java @@ -0,0 +1,304 @@ +/* + * StatusPane.java + * + * Created on March 20, 2001, 3:30 PM + */ + +package org.cristalise.gui.tabs; + +/** + * @author abranson + * @version + */ +import java.awt.GridBagConstraints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; + +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.proxy.MemberSubscription; +import org.cristalise.kernel.entity.proxy.ProxyObserver; +import org.cristalise.kernel.events.Event; +import org.cristalise.kernel.events.History; +import org.cristalise.kernel.lifecycle.instance.stateMachine.StateMachine; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.LocalObjectLoader; +import org.cristalise.kernel.utils.Logger; + + +/** + * Pane to display all work orders that this agent can execute, and activate + * them on request from the user. Subscribes to NodeItem for WorkOrder objects. + * @version $Revision: 1.22 $ $Date: 2005/04/26 06:48:13 $ + * @author $Author: abranson $ + */ +public class HistoryPane extends ItemTabPane implements ActionListener, ProxyObserver { + + History history; + HistoryTableModel model; + JTable eventTable; + JButton startButton = new JButton("<<"); + JButton prevButton = new JButton("<"); + JButton nextButton = new JButton(">"); + JButton endButton = new JButton(">>"); + public static final int SIZE = 30; + int currentSize = SIZE; + + public HistoryPane() { + super("History", "Event History"); + initPanel(); + + // add buttons + Box navBox = Box.createHorizontalBox(); + navBox.add(startButton); navBox.add(prevButton); + navBox.add(nextButton); navBox.add(endButton); + + // setup buttons + //startButton.setEnabled(false); nextButton.setEnabled(false); + //prevButton.setEnabled(false); endButton.setEnabled(false); + startButton.setActionCommand("start"); + startButton.addActionListener(this); + prevButton.setActionCommand("prev"); + prevButton.addActionListener(this); + nextButton.setActionCommand("next"); + nextButton.addActionListener(this); + endButton.setActionCommand("end"); + endButton.addActionListener(this); + getGridBagConstraints(); + c.gridx = 0; c.gridy = 1; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill=GridBagConstraints.NONE; + c.weightx=0; c.weighty=0; + gridbag.setConstraints(navBox, c); + add(navBox); + + + // Create table + eventTable = new JTable(); + JScrollPane eventScroll= new JScrollPane(eventTable); + c.weightx = 1.0; c.weighty = 1.0; + c.fill = GridBagConstraints.BOTH; c.gridy++; + gridbag.setConstraints(eventScroll, c); + add(eventScroll); + + // open viewpoint pane when outcome events are clicked on + eventTable.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + Event selected = model.getEventForRow(eventTable.getSelectedRow()); + if (selected.getSchemaName()!=null && selected.getViewName()!=null) + parent.runCommand("Data Viewer", selected.getSchemaName()+":"+selected.getViewName()); + } + } + }); + + } + + @Override + public void reload() { + history.clear(); + jumpToEnd(); + } + + @Override + public void run() { + Thread.currentThread().setName("History Pane Builder"); + MainFrame.progress.startBouncing("Loading history"); + try { + history = (History)sourceItem.getItem().getObject(ClusterStorage.HISTORY); + sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.HISTORY, true)); + } catch (ObjectNotFoundException e) { + Logger.error(e); + } + model = new HistoryTableModel(); + eventTable.setModel(model); + jumpToEnd(); + } + + public void jumpToEnd() { + int lastEvent = history.getLastId(); + int firstEvent = 0; currentSize = SIZE; + if (lastEvent > currentSize) firstEvent = lastEvent - currentSize + 1; + if (lastEvent < currentSize) currentSize = lastEvent + 1; + Logger.msg(5, "HistoryPane.run() - init table start "+firstEvent+" for "+currentSize); + model.setView(firstEvent, currentSize); + } + + @Override + public void add(Event contents) { + jumpToEnd(); + } + + @Override + public void remove(String id) { + // don't have to deal with this normally + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().equals("end")) { + jumpToEnd(); + return; + } + + int lastEvent = history.getLastId(); + int startEvent = model.getStartId(); + if (e.getActionCommand().equals("start")) { + currentSize = SIZE; + startEvent = 0; + } + + else if (e.getActionCommand().equals("prev")) { + currentSize = SIZE; + startEvent-=currentSize; + if (startEvent<0) startEvent = 0; + } + else if (e.getActionCommand().equals("next")) { + currentSize = SIZE; + startEvent+=currentSize; + if (startEvent > lastEvent) + startEvent = lastEvent - currentSize +1; + } + else { // unknown action + return; + } + + model.setView(startEvent, currentSize); + } + + private class HistoryTableModel extends AbstractTableModel { + Event[] event; + StateMachine[] sm; + Integer[] ids; + int loaded = 0; + int startId = 0; + + public HistoryTableModel() { + event = new Event[0]; + ids = new Integer[0]; + } + + public int getStartId() { + return startId; + } + + public void setView(int startId, int size) { + event = new Event[size]; + ids = new Integer[size]; + sm = new StateMachine[size]; + this.startId = startId; + for (int i=0; i getColumnClass(int columnIndex) { + switch(columnIndex) { + case 0: + return Integer.class; + default: + return String.class; + } + } + + /** + * @see javax.swing.table.TableModel#getColumnCount() + */ + @Override + public int getColumnCount() { + return 8; + } + + /** + * @see javax.swing.table.TableModel#getColumnName(int) + */ + @Override + public String getColumnName(int columnIndex) { + switch(columnIndex) { + case 0: return Language.translate("ID"); + case 1: return Language.translate("Activity"); + case 2: return Language.translate("Transition"); + case 3: return Language.translate("Date"); + case 4: return Language.translate("Agent Name"); + case 5: return Language.translate("Agent Role"); + case 6: return Language.translate("Schema"); + case 7: return Language.translate("View"); + default: return ""; + } + } + + /** + * @see javax.swing.table.TableModel#getRowCount() + */ + @Override + public int getRowCount() { + return loaded; + } + + /** + * @see javax.swing.table.TableModel#getValueAt(int, int) + */ + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if (event.length <= rowIndex || event[rowIndex] == null) + return ""; + try { + switch (columnIndex) { + case 0: return ids[rowIndex]; + case 1: return event[rowIndex].getStepName(); + case 2: return sm[rowIndex]==null?"Unknown": + sm[rowIndex].getTransition(event[rowIndex].getTransition()).getName(); + case 3: return event[rowIndex].getTimeString(); + case 4: return event[rowIndex].getAgentPath().getAgentName(); + case 5: return event[rowIndex].getAgentRole(); + case 6: return event[rowIndex].getSchemaName()+" v"+event[rowIndex].getSchemaVersion(); + case 7: return event[rowIndex].getViewName(); + default: return ""; + } + } catch (Exception e) { + return null; + } + } + + public Event getEventForRow(int rowIndex) { + return event[rowIndex]; + } + + /** + * @see javax.swing.table.TableModel#isCellEditable(int, int) + */ + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } + + } + + @Override + public void control(String control, String msg) { + if (control.equals(MemberSubscription.END)) + MainFrame.progress.stopBouncing("History loading complete."); + else + MainFrame.progress.stopBouncing("History: "+msg); + } + +} diff --git a/src/main/java/org/cristalise/gui/tabs/ItemTabPane.java b/src/main/java/org/cristalise/gui/tabs/ItemTabPane.java new file mode 100644 index 0000000..4d7f090 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/ItemTabPane.java @@ -0,0 +1,195 @@ +/* + * TabbedPane.java + * + * Created on March 22, 2001, 11:39 AM + */ +package org.cristalise.gui.tabs; +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; + +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JToggleButton; +import javax.swing.SwingConstants; + +import org.cristalise.gui.ImageLoader; +import org.cristalise.gui.ItemDetails; +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.tabs.outcome.OutcomeHandler; +import org.cristalise.gui.tabs.outcome.form.OutcomePanel; +import org.cristalise.gui.tree.NodeItem; +import org.cristalise.kernel.entity.proxy.ProxyObserver; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + +/** + * Generic item details tabbed pane. + * + * @version $Revision: 1.31 $ $Date: 2005/06/08 16:47:44 $ + * @author $Author: abranson $ + */ +public class ItemTabPane extends JPanel implements Runnable { + + protected NodeItem sourceItem; + protected String titleText = null; + protected ImageIcon titleIcon = null; + private final String tabName; + protected GridBagLayout gridbag = new GridBagLayout(); + protected GridBagConstraints c = null; + public static Font titleFont = null; + public static Color headingColor = new Color(0, 0, 185); + protected ItemDetails parent; + protected static ImageIcon mReloadIcon = null; + protected Box titleBox; + static { + try { + mReloadIcon = ImageLoader.findImage("refresh.png"); + } catch (Exception e) { + Logger.warning("Couldn't load images: " + e); + } + } + + public void focusLost(FocusEvent e) + { + } + + public ItemTabPane(String tabName, String titleText) { + this.tabName = Language.translate(tabName); + this.titleText = + titleText == null ? null : Language.translate(titleText); + if (titleFont == null) + titleFont = + new Font("SansSerif", Font.BOLD, this.getFont().getSize() + 5); + Logger.msg(2, "ItemTabPane. - viewing " + tabName); + setLayout(gridbag); + } + public void setParent(ItemDetails parent) { + this.parent = parent; + } + public String getTabName() { + return tabName; + } + protected GridBagConstraints getGridBagConstraints() { + if (c == null) + c = new GridBagConstraints(); + return c; + } + protected void initPanel() { + getGridBagConstraints().gridx = 0; + getGridBagConstraints().gridy = 0; + getGridBagConstraints().anchor = GridBagConstraints.NORTHWEST; + getGridBagConstraints().fill = GridBagConstraints.HORIZONTAL; + getGridBagConstraints().ipadx = 5; + getGridBagConstraints().weightx = 1.0; + getGridBagConstraints().ipady = 5; + // Help panel + if (titleText == null) + titleText = tabName; + if (titleIcon == null) + titleIcon = ImageLoader.findImage("info_16.png"); + JLabel title = new JLabel(titleText, titleIcon, SwingConstants.LEFT); + title.setFont(titleFont); + title.setForeground(headingColor); + JButton refreshButton = new JButton(mReloadIcon); + refreshButton.setToolTipText(Language.translate("Refresh")); + refreshButton.setMargin(new Insets(0, 0, 0, 0)); + refreshButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + setCursor(new Cursor(Cursor.WAIT_CURSOR)); + reload(); + setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + } + }); + String defaultStartTab = MainFrame.getPref("DefaultStartTab", "Properties"); + JToggleButton defaultStart = + new JToggleButton(ImageLoader.findImage("graph/start.png")); + defaultStart.setMargin(new Insets(0, 0, 0, 0)); + defaultStart.setToolTipText( + Language.translate("Select this tab to be the default one opened when you double click an item")); + defaultStart.setSelected(tabName.equals(defaultStartTab)); + defaultStart.setActionCommand(tabName); + defaultStart.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (((JToggleButton)e.getSource()).isSelected()) + MainFrame.setPref("DefaultStartTab", e.getActionCommand()); + } + }); + titleBox = Box.createHorizontalBox(); + titleBox.add(title); + titleBox.add(Box.createHorizontalGlue()); + titleBox.add(defaultStart); + titleBox.add(refreshButton); + gridbag.setConstraints(titleBox, c); + this.add(titleBox); + } + public void initForItem(NodeItem sourceItem) { + this.sourceItem = sourceItem; + Thread loader = new Thread(this); + loader.start(); + } + @Override + public void run() { + Thread.currentThread().setName("Default Entity Pane Builder"); + getGridBagConstraints(); + c.gridx = 0; + c.gridy = 1; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.ipadx = 5; + c.weightx = 1.0; + c.weighty = 1.0; + c.ipady = 5; + JLabel error = new JLabel("In Development"); + gridbag.setConstraints(error, c); + this.add(error); + } + public void reload() { + } + public void runCommand(String command) { + } + + public void destroy() { + if (sourceItem != null && this instanceof ProxyObserver) { + sourceItem.getItem().unsubscribe((ProxyObserver)this); + } + parent = null; + } + + @Override + protected void finalize() throws Throwable { + Logger.msg(7, "Reaping "+getClass().getName()); + } + + static public OutcomeHandler getOutcomeHandler(String schema, int version) { + String propName = "OutcomeHandler."+schema+"."+version; + if (Gateway.getProperties().containsKey(propName)) + try { + return (OutcomeHandler)Gateway.getProperties().getInstance(propName); + } catch (Exception ex) { + Logger.error("Error creating handler "+Gateway.getProperties().getString(propName)+". using default outcome editor"); + } + + propName = "OutcomeHandler.*"; + if (Gateway.getProperties().containsKey(propName)) + try { + return (OutcomeHandler)Gateway.getProperties().getInstance(propName); + } catch (Exception ex) { + Logger.error("Error creating handler "+Gateway.getProperties().getString(propName)+". using default outcome editor"); + } + return new OutcomePanel(); + } + +} diff --git a/src/main/java/org/cristalise/gui/tabs/JTabbedPaneWithCloseIcons.java b/src/main/java/org/cristalise/gui/tabs/JTabbedPaneWithCloseIcons.java new file mode 100644 index 0000000..ec31e3d --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/JTabbedPaneWithCloseIcons.java @@ -0,0 +1,97 @@ +package org.cristalise.gui.tabs; +import java.awt.Component; +import java.awt.Rectangle; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import javax.swing.Icon; +import javax.swing.JTabbedPane; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.cristalise.gui.ItemDetails; + + +/** + * @author Developpement + * + * Allows a close icone in JTabbePane + */ +public class JTabbedPaneWithCloseIcons extends JTabbedPane implements MouseListener, ChangeListener +{ + /** + * + */ + public JTabbedPaneWithCloseIcons() + { + super(); + addMouseListener(this); + addChangeListener(this); + } + /** + * @see javax.swing.JTabbedPane#addTab(String, Icon, Component, String) + */ + @Override + public void addTab(String title, Icon arg2, Component component, String arg3) + { + super.addTab(title, new CloseTabIcon(arg2), component, arg3); + } + /** + * @see java.awt.event.MouseListener#mouseClicked(MouseEvent) + */ + @Override + public void mouseClicked(MouseEvent e) + { + int tabNumber = getUI().tabForCoordinate(this, e.getX(), e.getY()); + Component cp = null; + if (tabNumber < 0) + return; + Rectangle rect = ((CloseTabIcon) getIconAt(tabNumber)).getBounds(); + if (rect.contains(e.getX(), e.getY())||(e.getModifiers()& InputEvent.CTRL_MASK) != 0) + { //the tab is being closed + cp = this.getComponent(tabNumber); + //if (getComponentCount() != 1) + if (cp instanceof ItemDetails) + { + ((ItemDetails) cp).closeTab(); + remove(cp); + } + } + stateChanged(new ChangeEvent(this)); + } + /** + * @see java.awt.event.MouseListener#mouseEntered(MouseEvent) + */ + @Override + public void mouseEntered(MouseEvent e) + { + } + /** + * @see java.awt.event.MouseListener#mouseExited(MouseEvent) + */ + @Override + public void mouseExited(MouseEvent e) + { + } + /** + * @see java.awt.event.MouseListener#mousePressed(MouseEvent) + */ + @Override + public void mousePressed(MouseEvent e) + { + } + /** + * @see java.awt.event.MouseListener#mouseReleased(MouseEvent) + */ + @Override + public void mouseReleased(MouseEvent e) + { + } + @Override + public void stateChanged(ChangeEvent e) + { + if (getSelectedComponent()!= null) + ((ItemDetails) getSelectedComponent()).refresh(); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/JobListPane.java b/src/main/java/org/cristalise/gui/tabs/JobListPane.java new file mode 100644 index 0000000..06dd1ed --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/JobListPane.java @@ -0,0 +1,312 @@ +/* + * StatusPane.java + * + * Created on March 20, 2001, 3:30 PM + */ + +package org.cristalise.gui.tabs; + +/** + * @author abranson + * @version + */ +import java.awt.GridBagConstraints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Iterator; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; + +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.agent.Job; +import org.cristalise.kernel.entity.agent.JobList; +import org.cristalise.kernel.entity.proxy.MemberSubscription; +import org.cristalise.kernel.entity.proxy.ProxyObserver; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.property.Property; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + +/** + * Pane to display all work orders that this agent can execute, and activate + * them on request from the user. Subscribes to NodeItem for WorkOrder objects. + * @version $Revision: 1.4 $ $Date: 2004/10/21 08:02:21 $ + * @author $Author: abranson $ + */ +public class JobListPane extends ItemTabPane implements ActionListener, ProxyObserver { + + JobList joblist; + JoblistTableModel model; + JTable eventTable; + JButton startButton = new JButton("<<"); + JButton prevButton = new JButton("<"); + JButton nextButton = new JButton(">"); + JButton endButton = new JButton(">>"); + public static final int SIZE = 30; + int currentSize = SIZE; + + public JobListPane() { + super("Job List", "Agent Job List"); + initPanel(); + + // add buttons + Box navBox = Box.createHorizontalBox(); + navBox.add(startButton); navBox.add(prevButton); + navBox.add(nextButton); navBox.add(endButton); + + // setup buttons + //startButton.setEnabled(false); nextButton.setEnabled(false); + //prevButton.setEnabled(false); endButton.setEnabled(false); + startButton.setActionCommand("start"); + startButton.addActionListener(this); + prevButton.setActionCommand("prev"); + prevButton.addActionListener(this); + nextButton.setActionCommand("next"); + nextButton.addActionListener(this); + endButton.setActionCommand("end"); + endButton.addActionListener(this); + getGridBagConstraints(); + c.gridx = 0; c.gridy = 1; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill=GridBagConstraints.NONE; + c.weightx=0; c.weighty=0; + gridbag.setConstraints(navBox, c); + add(navBox); + + + // Create table + eventTable = new JTable(); + JScrollPane eventScroll= new JScrollPane(eventTable); + c.weightx = 1.0; c.weighty = 1.0; + c.fill = GridBagConstraints.BOTH; c.gridy++; + gridbag.setConstraints(eventScroll, c); + add(eventScroll); + + // detect double clicked jobs + eventTable.addMouseListener(new JobListMouseListener()); + } + + @Override + public void reload() { + joblist.clear(); + jumpToEnd(); + } + + @Override + public void run() { + Thread.currentThread().setName("Joblist Pane Builder"); + try { + joblist = (JobList)sourceItem.getItem().getObject(ClusterStorage.JOB); + sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.JOB, false)); + } catch (ObjectNotFoundException e) { + Logger.error(e); + } + model = new JoblistTableModel(joblist); + eventTable.setModel(model); + jumpToEnd(); + } + + + public void jumpToEnd() { + int lastEvent = joblist.getLastId(); + int firstEvent = 0; currentSize = SIZE; + if (lastEvent > currentSize) firstEvent = lastEvent - currentSize + 1; + if (lastEvent < currentSize) currentSize = lastEvent + 1; + Logger.msg(5, "JobListPane.run() - init table start "+firstEvent+" for "+currentSize); + model.setView(firstEvent, currentSize); + } + + @Override + public void add(Job contents) { + reload(); + } + + @Override + public void remove(String id) { + reload(); + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().equals("end")) { + jumpToEnd(); + return; + } + + int lastEvent = joblist.getLastId(); + int startEvent = model.getStartId(); + if (e.getActionCommand().equals("start")) { + currentSize = SIZE; + startEvent = 0; + } + + else if (e.getActionCommand().equals("prev")) { + currentSize = SIZE; + startEvent-=currentSize; + if (startEvent<0) startEvent = 0; + } + else if (e.getActionCommand().equals("next")) { + currentSize = SIZE; + startEvent+=currentSize; + if (startEvent > lastEvent) + startEvent = lastEvent - currentSize +1; + } + else { // unknown action + return; + } + + model.setView(startEvent, currentSize); + } + + private class JoblistTableModel extends AbstractTableModel { + Job[] job; + Integer[] ids; + String[] itemNames; + int loaded = 0; + int startId = 0; + + public JoblistTableModel(JobList joblist) { + job = new Job[0]; + ids = new Integer[0]; + } + + public int getStartId() { + return startId; + } + + public void setView(int startId, int size) { + job = new Job[size]; + ids = new Integer[size]; + itemNames = new String[size]; + this.startId = startId; + int count = 0; + for (Iterator i = joblist.keySet().iterator(); i.hasNext();) { + Integer thisJobId = new Integer((String)i.next()); + if (count >= startId) { + int idx = count-startId; + ids[idx] = thisJobId; + job[idx] = joblist.getJob(thisJobId.intValue()); + itemNames[idx] = "Item Not Found"; + try { + itemNames[idx] = ((Property)Gateway.getStorage().get(job[count-startId].getItemPath(), ClusterStorage.PROPERTY+"/Name", null)).getValue(); + } catch (Exception ex) { + Logger.error(ex); + } + + } + count++; + loaded = count-startId; + if (count > (startId + size)) break; + } + fireTableStructureChanged(); + } + /** + * @see javax.swing.table.TableModel#getColumnClass(int) + */ + @Override + public Class getColumnClass(int columnIndex) { + switch(columnIndex) { + case 0: + return Integer.class; + default: + return String.class; + } + } + + /** + * @see javax.swing.table.TableModel#getColumnCount() + */ + @Override + public int getColumnCount() { + return 4; + } + + /** + * @see javax.swing.table.TableModel#getColumnName(int) + */ + @Override + public String getColumnName(int columnIndex) { + switch(columnIndex) { + case 0: return Language.translate("ID"); + case 1: return Language.translate("Subject"); + case 2: return Language.translate("Activity"); + case 3: return Language.translate("Transition"); + default: return ""; + } + } + + /** + * @see javax.swing.table.TableModel#getRowCount() + */ + @Override + public int getRowCount() { + return loaded; + } + + /** + * @see javax.swing.table.TableModel#getValueAt(int, int) + */ + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if (job.length <= rowIndex || job[rowIndex] == null) + return ""; + try { + switch (columnIndex) { + case 0: return ids[rowIndex]; + case 1: return itemNames[rowIndex]; + case 2: return job[rowIndex].getStepName(); + case 3: return job[rowIndex].getTransition().getName(); + default: return ""; + } + } catch (Exception e) { + return null; + } + } + + /** + * @see javax.swing.table.TableModel#isCellEditable(int, int) + */ + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } + + public Job getJobAtRow(int rowIndex) { + return job[rowIndex]; + } + + } + + private class JobListMouseListener extends MouseAdapter { + + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + if (e.getClickCount() == 2) { + Job selectedJob = model.getJobAtRow(eventTable.getSelectedRow()); + try { + MainFrame.itemFinder.pushNewKey(selectedJob.getItemProxy().getName()); + } catch (Exception ex) { + Logger.error(ex); + JOptionPane.showMessageDialog(null, "No Item Found", "Job references an unknown item", JOptionPane.ERROR_MESSAGE); + } + } + } + } + + @Override + public void control(String control, String msg) { + // TODO Auto-generated method stub + + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/PropertiesPane.java b/src/main/java/org/cristalise/gui/tabs/PropertiesPane.java new file mode 100644 index 0000000..8ae18f8 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/PropertiesPane.java @@ -0,0 +1,201 @@ +/* + * StatusPane.java + * + * Created on March 20, 2001, 3:30 PM + */ + +package org.cristalise.gui.tabs; + +/** + * @author abranson + * @version + */ +import java.awt.GridBagConstraints; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.SwingConstants; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.tree.NodeAgent; +import org.cristalise.kernel.entity.proxy.MemberSubscription; +import org.cristalise.kernel.entity.proxy.ProxyObserver; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.property.Property; +import org.cristalise.kernel.utils.Language; + + +/** + * Pane to display all work orders that this agent can execute, and activate + * them on request from the user. Subscribes to NodeItem for Property objects. + * @version $Revision: 1.44 $ $Date: 2005/08/31 07:21:20 $ + * @author $Author: abranson $ + */ +public class PropertiesPane extends ItemTabPane implements ProxyObserver, ActionListener { + + Box propertyBox; + JButton eraseButton; + boolean subbed = false; + HashMap loadedProps = new HashMap(); + JLabel domTitle; + DomainPathAdmin domAdmin; + + public PropertiesPane() { + super("Properties", "Properties"); + initPanel(); + + // Create box container for properties + getGridBagConstraints(); + c.gridx = 0; c.gridy = 1; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 1.0; c.weighty = 2.0; + propertyBox = Box.createVerticalBox(); + gridbag.setConstraints(propertyBox, c); + add(propertyBox); + if (MainFrame.isAdmin) { // edit dompath + c.gridy++; + c.fill = GridBagConstraints.NONE; + c.weighty=0.0; + domTitle = new JLabel("Domain Paths", titleIcon, SwingConstants.LEFT); + domTitle.setFont(titleFont); + domTitle.setForeground(headingColor); + gridbag.setConstraints(domTitle, c); + add(domTitle); + + c.gridy++; + c.fill = GridBagConstraints.BOTH; + c.weighty=1.0; + domAdmin = new DomainPathAdmin(); + gridbag.setConstraints(domAdmin, c); + add(domAdmin); + + + if (Gateway.getProperties().getBoolean("EnableItemErase")) { + c.gridy++; + c.fill = GridBagConstraints.NONE; + eraseButton = new JButton(Language.translate("Erase!")); + eraseButton.addActionListener(this); + eraseButton.setActionCommand("Erase Item"); + gridbag.setConstraints(eraseButton, c); + add(eraseButton); + } + } + } + + @Override + public void reload() { + Gateway.getStorage().clearCache(sourceItem.getItemPath(), ClusterStorage.PROPERTY); + loadedProps = new HashMap(); + initForItem(sourceItem); + } + + @Override + public void run() { + Thread.currentThread().setName("Property Pane Builder"); + if (sourceItem instanceof NodeAgent) { + remove(domAdmin); + remove(domTitle); + eraseButton.setEnabled(false); + } + else if (domAdmin != null) + domAdmin.setEntity(sourceItem.getItem()); + propertyBox.removeAll(); + propertyBox.add(Box.createGlue()); + revalidate(); + sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.PROPERTY, true)); + + } + /** + * + */ + @Override + public void add(Property newProp) { + JLabel propLabel = loadedProps.get(newProp.getName()); + if (propLabel == null) { // new prop + JPanel summaryPanel = new JPanel(new GridLayout(0,2)); + summaryPanel.add(new JLabel(Language.translate(newProp.getName()) + ":")); + Box valueBox = Box.createHorizontalBox(); + propLabel = new JLabel(newProp.getValue()); + loadedProps.put(newProp.getName(), propLabel); + valueBox.add(propLabel); + if (MainFrame.isAdmin && newProp.isMutable()) { + JButton editButton = new JButton("..."); + editButton.setMargin(new Insets(0,0,0,0)); + editButton.setActionCommand(newProp.getName()); + editButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e){ + String oldVal = loadedProps.get(e.getActionCommand()).getText(); + String newVal = (String)JOptionPane.showInputDialog(null, "Enter new value for "+e.getActionCommand(), "Edit Property", + JOptionPane.QUESTION_MESSAGE, null, null, oldVal); + if (newVal!=null && !(newVal.equals(oldVal))) { + try { + (sourceItem.getItem()).setProperty(MainFrame.userAgent, e.getActionCommand(), newVal); + } catch (Exception ex) { + MainFrame.exceptionDialog(ex); + } + } + } + }); + valueBox.add(Box.createVerticalStrut(7)); + valueBox.add(editButton); + + } + summaryPanel.add(valueBox); + propertyBox.add(Box.createVerticalStrut(7)); + propertyBox.add(summaryPanel); + } + propLabel.setText(newProp.getValue()); + revalidate(); + } + + @Override + public void remove(String id) { + String propName = id.substring(id.lastIndexOf("/")+1); + JLabel propbox = loadedProps.get(propName); + if (propbox!= null) propbox.setText("DELETED"); + revalidate(); + } + + @Override + public void actionPerformed(ActionEvent e) { + String[] params; + String predefStep; + + if (JOptionPane.showConfirmDialog(this, + "Are you sure?", + e.getActionCommand(), + JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) + return; + + if (e.getActionCommand().equals("Erase Item")) { + params = new String[0]; + predefStep = "Erase"; + } + else + return; + + try { + MainFrame.userAgent.execute(sourceItem.getItem(), predefStep, params); + } catch (Exception ex) { + MainFrame.exceptionDialog(ex); + } + } + + @Override + public void control(String control, String msg) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/org/cristalise/gui/tabs/ViewpointPane.java b/src/main/java/org/cristalise/gui/tabs/ViewpointPane.java new file mode 100644 index 0000000..01429b5 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/ViewpointPane.java @@ -0,0 +1,530 @@ + +package org.cristalise.gui.tabs; +import java.awt.GridBagConstraints; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.StringTokenizer; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.SwingConstants; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.tabs.outcome.OutcomeException; +import org.cristalise.gui.tabs.outcome.OutcomeHandler; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.C2KLocalObject; +import org.cristalise.kernel.entity.proxy.MemberSubscription; +import org.cristalise.kernel.entity.proxy.ProxyObserver; +import org.cristalise.kernel.events.Event; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.persistency.outcome.Outcome; +import org.cristalise.kernel.persistency.outcome.Viewpoint; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.LocalObjectLoader; +import org.cristalise.kernel.utils.Logger; + + +public class ViewpointPane extends ItemTabPane implements ItemListener, ActionListener, ProxyObserver { + + JComboBox schemas; + JComboBox views; + JComboBox events; + JLabel eventDetails; + JButton exportButton; + JButton viewButton; + + ArrayList schemaList; + ArrayList viewpointList; + ArrayList eventList; + String currentSchema = null; + Outcome currentOutcome = null; + OutcomeHandler thisOutcome; + boolean suspendSelection = false; + + JPanel dataView = new JPanel(new GridLayout(1,1)); + + public ViewpointPane() { + + super("Data Viewer", "Outcome Browser"); + initialize(); + } + + public void initialize() { + initPanel(); + + getGridBagConstraints(); + + c.gridx = 0; c.gridy = 1; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.ipadx = 5; c.weightx = 1.0; + c.ipady = 5; + + // Set up view box + + Box viewBox = Box.createHorizontalBox(); + + JLabel label = new JLabel(Language.translate("Outcome Type")+":", SwingConstants.LEFT); + viewBox.add(label); + viewBox.add(Box.createHorizontalStrut(7)); + + schemas = new JComboBox(); + viewBox.add(schemas); + viewBox.add(Box.createHorizontalGlue()); + schemas.addItemListener(this); + + label = new JLabel(Language.translate("View")+":", SwingConstants.LEFT); + viewBox.add(label); + viewBox.add(Box.createHorizontalStrut(7)); + + views = new JComboBox(); + viewBox.add(views); + viewBox.add(Box.createHorizontalGlue()); + views.addItemListener(this); + + gridbag.setConstraints(viewBox, c); + this.add(viewBox); + + // Set up event details box + c.gridy++; + Box eventBox = Box.createHorizontalBox(); + + label = new JLabel(Language.translate("Event")+":", SwingConstants.LEFT); + eventBox.add(label); + eventBox.add(Box.createHorizontalStrut(7)); + + events = new JComboBox(); + eventBox.add(events); + eventBox.add(Box.createHorizontalStrut(7)); + events.addItemListener(this); + + eventDetails = new JLabel(); + eventBox.add(eventDetails); + eventBox.add(Box.createHorizontalGlue()); + + if (MainFrame.isAdmin) { + viewButton = new JButton(Language.translate("Write View")); + viewButton.setMargin(new Insets(0, 0, 0, 0)); + viewButton.setActionCommand("setview"); + eventBox.add(viewButton); + eventBox.add(Box.createHorizontalStrut(14)); + viewButton.addActionListener(this); + } + + exportButton = new JButton(Language.translate("Export")); + exportButton.setMargin(new Insets(0, 0, 0, 0)); + exportButton.setActionCommand("export"); + exportButton.addActionListener(this); + eventBox.add(exportButton); + + gridbag.setConstraints(eventBox, c); + this.add(eventBox); + + // data pane + c.gridx = 0; c.gridy = 3; + c.anchor = GridBagConstraints.NORTHWEST; c.fill = GridBagConstraints.BOTH; + c.weighty = 1.0; c.weightx = 1.0; + gridbag.setConstraints(dataView, c); + this.add(dataView); + } + + @Override + public void reload() { + // reset boxes + schemas.removeAllItems(); + views.removeAllItems(); + events.removeAllItems(); + eventDetails.setText(""); + + clearView(); + + // reload + initForItem(sourceItem); + } + + @Override + public void run() { + Thread.currentThread().setName("Viewpoint Pane Builder"); + //Local object subscriptions + sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.VIEWPOINT, false)); + sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.OUTCOME, false)); + clearView(); + schemas.addItem("--"); + currentSchema = null; + schemaList = new ArrayList(); + try { + String outcomeTypes = sourceItem.getItem().queryData(ClusterStorage.VIEWPOINT+"/all"); + StringTokenizer tok = new StringTokenizer(outcomeTypes, ","); + while (tok.hasMoreTokens()) { + String thisType = tok.nextToken(); + schemas.addItem(thisType); + schemaList.add(thisType); + } + } catch (Exception e) { + Logger.msg(2, "No viewpoints found"); + } + } + + @Override + public void itemStateChanged(ItemEvent e) { + + Object selectedItem = e.getItem(); + if (e.getStateChange() == ItemEvent.DESELECTED) return; + if (suspendSelection) return; + if (e.getItem().equals("--")) return; + + if (e.getItemSelectable() == schemas) + switchSchema((String)selectedItem); + else if (e.getItemSelectable() == views) + switchView((Viewpoint)selectedItem); + else if (e.getItemSelectable() == events) + showEvent((EventItem)selectedItem); + } + + public void switchSchema(String schemaName) { + clearView(); + suspendSelection = true; + views.removeAllItems(); + events.removeAllItems(); + viewpointList = new ArrayList(); + eventList = new ArrayList(); + + currentSchema = schemaName; + + try { + // populate views + String viewNames = sourceItem.getItem().queryData(ClusterStorage.VIEWPOINT+"/"+schemaName+"/all"); + StringTokenizer tok = new StringTokenizer(viewNames, ","); + Viewpoint lastView = null; + while(tok.hasMoreTokens()) { + String viewName = tok.nextToken(); + Viewpoint thisView = (Viewpoint)sourceItem.getItem().getObject(ClusterStorage.VIEWPOINT+"/"+schemaName+"/"+viewName); + views.addItem(thisView); + if (lastView == null) lastView = thisView; + if (thisView.getName().equals("last")) //select + lastView = thisView; + viewpointList.add(thisView); + } + + String ocVersions = sourceItem.getItem().queryData(ClusterStorage.OUTCOME+"/"+schemaName+"/all"); + tok = new StringTokenizer(ocVersions, ","); + while(tok.hasMoreTokens()) { + int schemaVersion = Integer.parseInt(tok.nextToken()); + String ocEvents = sourceItem.getItem().queryData(ClusterStorage.OUTCOME+"/"+schemaName+"/"+schemaVersion+"/all"); + StringTokenizer tok2 = new StringTokenizer(ocEvents, ","); + while(tok2.hasMoreTokens()) { + int eventId = Integer.parseInt(tok2.nextToken()); + EventItem newEvent = new EventItem(eventId, schemaVersion); + for (Viewpoint thisView : viewpointList) { + if (thisView.getEventId() == eventId) + newEvent.addView(thisView.getName()); + } + eventList.add(newEvent); + } + Collections.sort(eventList, new Comparator() { + @Override + public int compare(EventItem o1, EventItem o2) { + return o1.compareTo(o2); + } + }); + for (EventItem eventItem : eventList) + events.addItem(eventItem); + } + + if (lastView != null) { + suspendSelection = false; + views.setSelectedItem(lastView); + switchView(lastView); + } + + } catch (Exception e) { + Logger.error(e); + JOptionPane.showMessageDialog(this, + "The data structures of this item are incorrect.\nPlease contact your administrator.", + "Viewpoint Error" , JOptionPane.ERROR_MESSAGE); + } + suspendSelection = false; + } + + public void switchView(Viewpoint newView) { + for (EventItem thisEvent : eventList) { + if (thisEvent.eventId == newView.getEventId()) { + suspendSelection = true; + events.setSelectedItem(thisEvent); + showEvent(thisEvent); + suspendSelection = false; + break; + } + } + } + + public void showEvent(EventItem thisEvent) { + eventDetails.setText(thisEvent.getEventDesc()); + try { + setView((Outcome)sourceItem.getItem().getObject( + ClusterStorage.OUTCOME+"/"+currentSchema+"/"+thisEvent.schemaVersion+"/"+thisEvent.eventId)); + } catch (Exception ex) { + Logger.error(ex); + JOptionPane.showMessageDialog(this, + "Could not retrieve requested outcome.\nPlease contact your administrator.", + "Viewpoint Error" , JOptionPane.ERROR_MESSAGE); + } + } + + public void setView(Outcome data) { + Logger.msg(6, "ViewpointPane: got outcome type: "+data.getSchemaType()+" version: "+data.getSchemaVersion()); + String schema; + currentOutcome = data; + dataView.removeAll(); + String error = null; + try { + schema = LocalObjectLoader.getSchema(data.getSchemaType(), data.getSchemaVersion()).schema; + thisOutcome = ItemTabPane.getOutcomeHandler(data.getSchemaType(), data.getSchemaVersion()); + thisOutcome.setDescription(schema); + thisOutcome.setOutcome(data.getData()); + thisOutcome.setReadOnly(true); + Thread builder = new Thread(thisOutcome); + builder.start(); + dataView.add(thisOutcome.getPanel()); + exportButton.setEnabled(true); + if (viewButton!=null) viewButton.setEnabled(true); + return; + } catch (ObjectNotFoundException ex) { + error = "Schema not found"; + } catch (OutcomeException ex) { + error = "Outcome was not valid. See log for details: "+ex.getMessage(); + Logger.error(ex); + } + + dataView.add(new JLabel(error)); + } + + public void clearView() { + dataView.removeAll(); + exportButton.setEnabled(false); + if (viewButton!=null) viewButton.setEnabled(false); + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().equals("export") && currentOutcome != null) + saveOutcomeToFile(); + if (e.getActionCommand().equals("setview") && currentOutcome != null) + overrideView(); + } + + private void saveOutcomeToFile() { + + MainFrame.xmlChooser.setSelectedFile(new File(currentOutcome.getSchemaType()+".xml")); + int returnVal = MainFrame.xmlChooser.showSaveDialog(this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File targetFile = MainFrame.xmlChooser.getSelectedFile(); + if (!(targetFile.getAbsolutePath().endsWith(".xml"))) + targetFile = new File(targetFile.getAbsolutePath()+".xml"); + + Logger.msg(2, "ViewpointPane.actionPerformed() - Exporting outcome to file " + targetFile.getName()); + try { + thisOutcome.export(targetFile); + } + catch (Exception ex) { + Logger.error(ex); + MainFrame.exceptionDialog(ex); + } + } + + } + + private void overrideView() { + + Viewpoint oldView = (Viewpoint)views.getSelectedItem(); + EventItem newEvent = (EventItem)events.getSelectedItem(); + + if (oldView.getEventId() == newEvent.eventId) { + JOptionPane.showMessageDialog(this, + "View '"+oldView.getName()+"' is already set to event "+newEvent.eventId, + "Viewpoint Already Set" , JOptionPane.ERROR_MESSAGE); + return; + } + + if (JOptionPane.showConfirmDialog(this, + "Are you sure you want to set the '"+oldView.getName()+ + "' view to event " + newEvent.eventId+ "?", + "Overwrite view", + JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) + return; + + oldView.setEventId(newEvent.eventId); + try { + String[] predefParams = new String[1]; + predefParams[0] = Gateway.getMarshaller().marshall(oldView); + MainFrame.userAgent.execute(sourceItem.getItem(), "AddC2KObject", predefParams); + } catch (Exception e) { + Logger.error(e); + MainFrame.exceptionDialog(e); + } + } + + @Override + public void runCommand(String command) { + String[] viewElements = command.split(":"); + if (viewElements.length!=2) return; + if (schemaList == null) run(); + schemas.setSelectedItem(viewElements[0]); + for (Viewpoint thisView : viewpointList) { + if (thisView.getName().equals(viewElements[1])) { + switchView(thisView); + return; + } + } + Logger.error("Viewpoint "+command+" not found in this item"); + } + + @Override + public void add(C2KLocalObject contents) { + if (contents instanceof Viewpoint) + addViewpoint((Viewpoint)contents); + else if (contents instanceof Outcome) + addOutcome((Outcome)contents); + + } + + public void addViewpoint(Viewpoint newView) { + String schemaName = newView.getSchemaName(); + Logger.msg(3, "Viewpoint "+newView.getName()+" now points to "+newView.getEventId()); + if (!(schemaList.contains(schemaName))) { + schemaList.add(schemaName); + schemas.addItem(schemaName); + return; + } + + + if (!(schemaName.equals(schemas.getSelectedItem()))) + return; + + for (EventItem thisEvent : eventList) { + if (thisEvent.eventId == newView.getEventId()) + thisEvent.addView(newView.getName()); + else + thisEvent.removeView(newView.getName()); + } + + boolean isSelected = false; + for (Viewpoint thisView : viewpointList) { + if (thisView.getName().equals(newView.getName())) { + isSelected = thisView.equals(views.getSelectedItem()); + views.removeItem(thisView); + viewpointList.remove(thisView); + break; + } + } + + views.addItem(newView); + viewpointList.add(newView); + if (isSelected) { + views.setSelectedItem(newView); + } + + } + + public void addOutcome(Outcome contents) { + if (!(contents.getSchemaType().equals(currentSchema))) // not interested + return; + Logger.msg(3, "Adding event "+contents.getID()); + EventItem newEvent = new EventItem(contents.getID(), contents.getSchemaVersion()); + eventList.add(newEvent); + events.addItem(newEvent); + } + + @Override + public void remove(String id) { + // we don't really remove viewpoints + } + + class EventItem implements Comparable { + public int eventId; + public int schemaVersion; + public ArrayList viewNames = new ArrayList(); + public String viewList = ""; + + public EventItem(int eventId, int schemaVersion) { + this.eventId = eventId; + this.schemaVersion = schemaVersion; + } + + public void addView(String viewName) { + if (!(viewNames.contains(viewName))) { + viewNames.add(viewName); + buildViewLabel(); + } + } + + public void removeView(String viewName) { + viewNames.remove(viewName); + buildViewLabel(); + } + + private void buildViewLabel() { + if (viewNames.size() == 0) { + viewList = ""; + return; + } + + StringBuffer newLabel = new StringBuffer(" ("); + for (Iterator iter = viewNames.iterator(); iter.hasNext();) { + String viewName = iter.next(); + newLabel.append(viewName); + if (iter.hasNext()) + newLabel.append(", "); + } + + viewList = newLabel.append(")").toString(); + } + + @Override + public String toString() { + return eventId+viewList; + + } + + public String getEventDesc() { + try { + Event myEvent = (Event)sourceItem.getItem().getObject(ClusterStorage.HISTORY+"/"+eventId); + return (Language.translate("Recorded on")+" "+myEvent.getTimeString()+" "+ + Language.translate("by")+" "+myEvent.getAgentPath().getAgentName()+" "+ + Language.translate("using schema v")+schemaVersion); + } catch (Exception ex) { + Logger.error(ex); + return ("Error retrieving event details"); + } + } + + @Override + public int compareTo(EventItem other) { + if (other.eventId < eventId) return 1; + if (other.eventId > eventId) return -1; + return 0; + } + } + + @Override + public void control(String control, String msg) { + // TODO Auto-generated method stub + + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/WorkflowPane.java b/src/main/java/org/cristalise/gui/tabs/WorkflowPane.java new file mode 100644 index 0000000..f76f906 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/WorkflowPane.java @@ -0,0 +1,281 @@ +package org.cristalise.gui.tabs; +import java.awt.Cursor; +import java.awt.GridBagConstraints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; + +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JSplitPane; + +import org.cristalise.gui.ImageLoader; +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.graph.controller.Selection; +import org.cristalise.gui.graph.view.EditorPanel; +import org.cristalise.gui.graph.view.VertexPropertyPanel; +import org.cristalise.gui.lifecycle.instance.TransitionPanel; +import org.cristalise.gui.lifecycle.instance.WfDirectedEdgeRenderer; +import org.cristalise.gui.lifecycle.instance.WfEdgeFactory; +import org.cristalise.gui.lifecycle.instance.WfGraphPanel; +import org.cristalise.gui.lifecycle.instance.WfVertexFactory; +import org.cristalise.gui.lifecycle.instance.WfVertexRenderer; +import org.cristalise.kernel.entity.proxy.MemberSubscription; +import org.cristalise.kernel.entity.proxy.ProxyObserver; +import org.cristalise.kernel.graph.layout.DefaultGraphLayoutGenerator; +import org.cristalise.kernel.graph.model.EdgeFactory; +import org.cristalise.kernel.graph.model.VertexFactory; +import org.cristalise.kernel.lifecycle.instance.CompositeActivity; +import org.cristalise.kernel.lifecycle.instance.WfVertexOutlineCreator; +import org.cristalise.kernel.lifecycle.instance.Workflow; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + +public class WorkflowPane extends ItemTabPane implements ProxyObserver +{ + // Only for the purpose of loading and saving + protected Workflow mWorkflow = null; + boolean init = false; + TransitionPanel transPanel; + protected JButton mLoadButton = new JButton(ImageLoader.findImage("graph/load.png")); + protected JButton mSaveButton = new JButton(ImageLoader.findImage("graph/save.png")); + protected JButton mLayoutButton = new JButton(ImageLoader.findImage("graph/autolayout.png")); + protected JButton mZoomOutButton = new JButton(ImageLoader.findImage("graph/zoomout.png")); + protected JButton[] mOtherToolBarButtons; + // Workflow factories + protected EdgeFactory mWfEdgeFactory; + protected VertexFactory mWfVertexFactory; + // Graph editor panel + protected EditorPanel mEditorPanel; + // Objects to view/modify the properties of the selected activity + protected VertexPropertyPanel mPropertyPanel; + protected JSplitPane mSplitPane; + + // Graph editor panel + // Objects to view/modify the properties of the selected activity + public WorkflowPane() + { + super("Workflow", "Workflow Viewer"); + // Workflow factories + mWfEdgeFactory = new WfEdgeFactory(); + mWfVertexFactory = new WfVertexFactory(); + mZoomOutButton.setToolTipText(Language.translate("Zoom Out")); + mLayoutButton.setToolTipText(Language.translate("Auto Layout")); + mLoadButton.setToolTipText(Language.translate("Load")); + mSaveButton.setToolTipText(Language.translate("Save")); + mOtherToolBarButtons = new JButton[] { mZoomOutButton, mLayoutButton, mLoadButton, mSaveButton }; + + } + + protected void createListeners() + { + /** + * + */ + mLoadButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + loadWorkflow(); + } + }); + /** + * + */ + mSaveButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + setCursor(new Cursor(Cursor.WAIT_CURSOR)); + saveWorkflow(); + setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + } + }); + /** + * + */ + mLayoutButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + DefaultGraphLayoutGenerator.layoutGraph(mEditorPanel.mGraphModelManager.getModel()); + } + }); + /** + * + */ + mZoomOutButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + mEditorPanel.mGraphModelManager.zoomOut(); + } + }); + } + /** + * Return a single ref on mEditorPanel + * + * @return EditorPanel + */ + public EditorPanel getEditorPanel() + { + if (mEditorPanel == null) + mEditorPanel = + new EditorPanel( + mWfEdgeFactory, + mWfVertexFactory, + new WfVertexOutlineCreator(), + true, + mOtherToolBarButtons, + new WfGraphPanel(new WfDirectedEdgeRenderer(), new WfVertexRenderer())); + return mEditorPanel; + } + public JSplitPane getJSplitPane() + { + if (mSplitPane == null) + { + mSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, getEditorPanel(), getPropertyPanel()); + mSplitPane.setDividerSize(5); + mSplitPane.setDividerLocation(800); + } + return mSplitPane; + } + @Override + public void add(Workflow contents) + { + mWorkflow = contents; + addActivity((CompositeActivity) mWorkflow.search("workflow/domain")); + } + @Override + public void remove(String id) + { + } + protected void addActivity(CompositeActivity cAct) + { + // Resolve any undefined references in the workflow + mEditorPanel.mGraphModelManager.replace(cAct.getChildrenGraphModel()); + // Give the editor panel the edge and vertex types + mEditorPanel.updateVertexTypes(cAct.getWf().getVertexTypeNameAndConstructionInfo()); + mEditorPanel.updateEdgeTypes(cAct.getWf().getEdgeTypeNameAndConstructionInfo()); + mEditorPanel.enterSelectMode(); + mWfVertexFactory.setCreationContext(cAct); + } + @Override + public void run() + { + Thread.currentThread().setName("Workflow Pane Builder"); + if (!init) + { + getEditorPanel(); + createLayout(); + createListeners(); + mPropertyPanel.setGraphModelManager(mEditorPanel.mGraphModelManager); + mEditorPanel.setEditable(MainFrame.isAdmin); + init = true; + } + sourceItem.getItem().subscribe(new MemberSubscription(this, ClusterStorage.LIFECYCLE, true)); + transPanel.setItem(sourceItem.getItem()); + } + @Override + public void reload() + { + Gateway.getStorage().clearCache(sourceItem.getItemPath(), ClusterStorage.LIFECYCLE); + initForItem(sourceItem); + } + protected void createLayout() + { + initPanel(); + // Add the editor pane + getGridBagConstraints().gridx = 0; + getGridBagConstraints().gridy = 1; + getGridBagConstraints().fill = GridBagConstraints.BOTH; + getGridBagConstraints().weighty = 2.0; + gridbag.setConstraints(getJSplitPane(), getGridBagConstraints()); + add(getJSplitPane()); + validate(); + } + protected void loadWorkflow() + { + File selectedFile = null; + int returnValue = MainFrame.xmlChooser.showOpenDialog(null); + switch (returnValue) + { + case JFileChooser.APPROVE_OPTION : + selectedFile = MainFrame.xmlChooser.getSelectedFile(); + try + { + String newWf = FileStringUtility.file2String(selectedFile); + add((Workflow) Gateway.getMarshaller().unmarshall(newWf)); + } + catch (Exception e) + { + e.printStackTrace(); + } + case JFileChooser.CANCEL_OPTION : + case JFileChooser.ERROR_OPTION : + default : + } + } + protected void saveWorkflow() + { + try + { + CompositeActivity cact = (CompositeActivity)mWorkflow.getWf().search("workflow/domain"); + MainFrame.userAgent.execute( + sourceItem.getItem(), + "ReplaceDomainWorkflow", + new String[] { Gateway.getMarshaller().marshall(cact)}); + mEditorPanel.mGraphPanel.setSelection(new Selection(null,null,0,0,0,0)); + } + catch (Exception e) + { + Logger.error(e); + } + } + + public VertexPropertyPanel getPropertyPanel() + { + if (mPropertyPanel == null) { + setNewPropertyPanel(); + transPanel = new TransitionPanel(); + mPropertyPanel.createLayout(transPanel); + mPropertyPanel.setGraphModelManager(mEditorPanel.mGraphModelManager); + mPropertyPanel.setEditable(MainFrame.isAdmin); + } + return mPropertyPanel; + } + + public void setNewPropertyPanel() + { + String wfPanelClass = Gateway.getProperties().getProperty("WfPropertyPanel"); + if (wfPanelClass != null) + { + try + { + Class panelClass = Class.forName(wfPanelClass); + mPropertyPanel = (VertexPropertyPanel) panelClass.newInstance(); + return; + } + catch (Exception ex) + { + Logger.error("Could not load wf props panel:" + wfPanelClass); + Logger.error(ex); + } + } + mPropertyPanel = new VertexPropertyPanel(); + } + + @Override + public void control(String control, String msg) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/org/cristalise/gui/tabs/collection/AggregationView.java b/src/main/java/org/cristalise/gui/tabs/collection/AggregationView.java new file mode 100644 index 0000000..141fcb1 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/collection/AggregationView.java @@ -0,0 +1,91 @@ +package org.cristalise.gui.tabs.collection; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JSplitPane; + +import org.cristalise.gui.ImageLoader; +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.collection.AggregationMemberRenderer; +import org.cristalise.gui.collection.PropertyPanel; +import org.cristalise.gui.collection.SelectedMemberPanel; +import org.cristalise.gui.graph.view.EditorPanel; +import org.cristalise.gui.graph.view.GraphPanel; +import org.cristalise.kernel.collection.Aggregation; +import org.cristalise.kernel.collection.AggregationMember; +import org.cristalise.kernel.collection.AggregationVertexFactory; +import org.cristalise.kernel.collection.AggregationVertexOutlineCreator; +import org.cristalise.kernel.collection.Collection; +import org.cristalise.kernel.utils.Language; + +/** + * @version $Revision: 1.5 $ $Date: 2006/09/15 15:02:24 $ + * @author $Author: abranson $ + */ +public class AggregationView extends CollectionView +{ + protected JButton mSaveButton = new JButton(ImageLoader.findImage("graph/save.png")); + protected JButton mHistoryButton = new JButton(ImageLoader.findImage("graph/history.png")); + protected JButton[] mOtherToolBarButtons = { mSaveButton, mHistoryButton }; + // Graph editor panel + protected EditorPanel mEditorPanel; + // Objects to view/modify the properties of the selected activity + protected PropertyPanel mPropertyPanel; + protected JSplitPane mSplitPane; + private final AggregationVertexFactory mAggregationVertexFactory = new AggregationVertexFactory(); + private final AggregationMemberRenderer mAggregationMemberRenderer = new AggregationMemberRenderer(); + public AggregationView() + { + super(); + setLayout(new GridLayout(1,1)); + mPropertyPanel = new PropertyPanel(); + mEditorPanel = new EditorPanel(null, mAggregationVertexFactory, new AggregationVertexOutlineCreator(), false, mOtherToolBarButtons, new GraphPanel(null, mAggregationMemberRenderer)); + createLayout(); + createListeners(); + mPropertyPanel.setGraphModelManager(mEditorPanel.mGraphModelManager); + mPropertyPanel.createLayout(new SelectedMemberPanel()); + mEditorPanel.setEditable(MainFrame.isAdmin); + } + + @Override + public void setCollection(Collection contents) + { + thisColl = contents; + Aggregation agg = (Aggregation)thisColl; + mPropertyPanel.setCollection(agg); + mAggregationMemberRenderer.setAggregation(agg); + mEditorPanel.mGraphModelManager.setModel(agg.getLayout()); + mEditorPanel.updateVertexTypes(agg.getVertexTypeNameAndConstructionInfo()); + mEditorPanel.enterSelectMode(); + mAggregationVertexFactory.setCreationContext(agg); + } + public void createLayout() + { + mSaveButton.setToolTipText(Language.translate("Save Layout Changes")); + mSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, mEditorPanel, mPropertyPanel); + mSplitPane.setDividerSize(5); + add(mSplitPane); + } + + protected void createListeners() + { + mSaveButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + saveCollection(); + } + }); + mHistoryButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + new CollectionHistoryWindow(item, (Aggregation)thisColl); + } + }); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/collection/CollectionHistoryWindow.java b/src/main/java/org/cristalise/gui/tabs/collection/CollectionHistoryWindow.java new file mode 100644 index 0000000..d1ae054 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/collection/CollectionHistoryWindow.java @@ -0,0 +1,188 @@ +package org.cristalise.gui.tabs.collection; + +import java.awt.HeadlessException; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; + +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; + +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.collection.Aggregation; +import org.cristalise.kernel.collection.Collection; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.proxy.ItemProxy; +import org.cristalise.kernel.entity.proxy.MemberSubscription; +import org.cristalise.kernel.entity.proxy.ProxyObserver; +import org.cristalise.kernel.events.Event; +import org.cristalise.kernel.lifecycle.instance.predefined.PredefinedStep; +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.persistency.outcome.Outcome; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + +public class CollectionHistoryWindow extends JFrame { + + JTable historyTable; + HistoryTableModel historyModel; + + public CollectionHistoryWindow(ItemProxy item, Aggregation coll) throws HeadlessException { + super("Collection History"); + historyModel = new HistoryTableModel(item, coll); + historyTable = new JTable(historyModel); + this.getContentPane().add(new JScrollPane(historyTable)); + historyTable.addMouseListener(new HistoryTableListener(item)); + this.pack(); + super.toFront(); + this.validate(); + this.setVisible(true); + } + + private class HistoryTableModel extends AbstractTableModel implements ProxyObserver { + + ItemProxy item; + ArrayList collEvents; + ArrayList collEventData; + Aggregation coll; + public HistoryTableModel(ItemProxy item, Aggregation coll) { + this.item = item; + this.coll = coll; + collEvents = new ArrayList(); + collEventData = new ArrayList(); + item.subscribe(new MemberSubscription(this, ClusterStorage.HISTORY, true)); + } + @Override + public int getColumnCount() { + return 4; + } + + @Override + public String getColumnName(int columnIndex) { + switch(columnIndex) { + case 0: return Language.translate("Date"); + case 1: return Language.translate("Operation"); + case 2: return Language.translate("Slot"); + case 3: return Language.translate("Child"); + default: return ""; + } + } + @Override + public int getRowCount() { + return collEvents.size(); + } + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + Event ev = collEvents.get(rowIndex); + switch (columnIndex) { + case 0: + return ev.getTimeString(); + case 1: + if (ev.getStepName().equals("AssignItemToSlot")) + return "Item Assigned"; + else + return "Collection replaced"; + case 2: + if (ev.getStepName().equals("AssignItemToSlot")) + return ((String[])collEventData.get(rowIndex))[1]; + return ""; + case 3: + if (ev.getStepName().equals("AddC2KObject")) + return "Click to view"; + String name; + try { + ItemProxy childItem = Gateway.getProxyManager().getProxy(new ItemPath(((String[])collEventData.get(rowIndex))[2])); + name = childItem.getName(); + } catch (ObjectNotFoundException e) { + name = "Item deleted: "+((String[])collEventData.get(rowIndex))[2]; + } catch (Exception e) { + name = "Problem resolving Item key: "+((String[])collEventData.get(rowIndex))[2]; + } + return name; + default: + return ""; + } + } + public Object getEventData(int row) { + return collEventData.get(row); + } + @Override + public void add(Event thisEv) { + if (thisEv.getStepName().equals("AssignItemToSlot") || thisEv.getStepName().equals("AddC2KObject")) { + String[] params; + try { + Outcome oc = (Outcome)item.getObject(ClusterStorage.OUTCOME+"/PredefinedStepOutcome/0/"+thisEv.getID()); + params = PredefinedStep.getDataList(oc.getData()); + } catch (ObjectNotFoundException ex) { return; } + if (thisEv.getStepName().equals("AssignItemToSlot")) { + if (params[0].equals(coll.getName())) + collEventData.add(params); + else return; + } + else { + Object obj; + try { + obj = Gateway.getMarshaller().unmarshall(params[0]); + } catch (Exception e) { + Logger.error(e); + return; + } + if (obj instanceof Collection) + collEventData.add(obj); + else return; + + } + } + else return; + collEvents.add(thisEv); + fireTableRowsInserted(collEvents.size()-1, collEvents.size()-1); + } + @Override + public void remove(String id) { } + @Override + public void control(String control, String msg) { + } + } + + private class HistoryTableListener extends MouseAdapter { + + ItemProxy item; + public HistoryTableListener(ItemProxy item) { + this.item = item; + } + + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount()==2) { + int row = historyTable.getSelectedRow(); + Object data = historyModel.getEventData(row); + if (data instanceof Aggregation) { + showColl((Aggregation)data); + } + else { + String[] params = (String[])data; + try { + ItemProxy childItem = Gateway.getProxyManager().getProxy(new ItemPath(params[2])); + MainFrame.itemFinder.pushNewKey(childItem.getName()); + } catch (Exception ex) { } + } + } + } + public void showColl(Aggregation coll) { + JFrame newFrame = new JFrame(); + AggregationView newView = new AggregationView(); + newView.setCollection(coll); + newView.setItem(item); + newFrame.getContentPane().add(newView); + newFrame.pack(); + newFrame.toFront(); + newFrame.validate(); + newFrame.setVisible(true); + } + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/collection/CollectionMemberPropertyPanel.java b/src/main/java/org/cristalise/gui/tabs/collection/CollectionMemberPropertyPanel.java new file mode 100644 index 0000000..d55a2c2 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/collection/CollectionMemberPropertyPanel.java @@ -0,0 +1,183 @@ +package org.cristalise.gui.tabs.collection; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.lang.reflect.Constructor; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.graph.view.PropertyTable; +import org.cristalise.gui.graph.view.PropertyTableModel; +import org.cristalise.gui.tabs.ItemTabPane; +import org.cristalise.kernel.collection.CollectionMember; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.CastorHashMap; +import org.cristalise.kernel.utils.Language; + + +public class CollectionMemberPropertyPanel extends JPanel implements ActionListener { + + private final PropertyTableModel mPropertyModel; + private final PropertyTable mPropertyTable; + private boolean isEditable = false; + CollectionMember selectedCollMem; + GridBagLayout gridbag = new GridBagLayout(); + protected JLabel selObjSlot; + protected JLabel selObjMember; + JButton addPropButton; + JButton delPropButton; + Box newPropBox; + private JTextField newPropName; + private JComboBox newPropType; + String[] typeOptions = { "String", "Boolean", "Integer", "Float" }; + String[] typeInitVal = { "", "false", "0", "0.0"}; + + public CollectionMemberPropertyPanel() { + super(); + setLayout(gridbag); + mPropertyModel = new PropertyTableModel(); + mPropertyTable = new PropertyTable(mPropertyModel); + createLayout(); + } + + public void setMember(CollectionMember cm) { + selectedCollMem = cm; + String newMemberName; + try { + ItemPath path = cm.getItemPath(); + if (path == null) newMemberName = "No member"; + else newMemberName = Gateway.getProxyManager().getProxy(path).getProperty("Name"); + } catch (ObjectNotFoundException e) { + newMemberName = "Item or Item name property not found"; + } + + selObjSlot.setText(newMemberName); + selObjMember.setText("Slot "+cm.getID()); + mPropertyModel.setMap(cm.getProperties()); + addPropButton.setEnabled(isEditable); + delPropButton.setEnabled(isEditable); + } + + public void createLayout() + { + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = 0; + c.weightx = 1; + c.weighty = 0; + c.anchor = GridBagConstraints.NORTHWEST; + c.ipadx = 5; + c.ipady = 5; + + selObjSlot = new JLabel(); + selObjSlot.setFont(ItemTabPane.titleFont); + gridbag.setConstraints(selObjSlot, c); + add(selObjSlot); + + c.gridy++; + selObjMember = new JLabel(); + gridbag.setConstraints(selObjMember, c); + add(selObjMember); + + c.gridy++; + JLabel title = new JLabel("Properties"); + title.setFont(ItemTabPane.titleFont); + gridbag.setConstraints(title, c); + add(title); + + c.gridy++; + c.fill = GridBagConstraints.BOTH; + c.weighty = 2; + JScrollPane scroll = new JScrollPane(mPropertyTable); + gridbag.setConstraints(scroll, c); + add(scroll); + + newPropBox = Box.createHorizontalBox(); + newPropBox.add(new JLabel(Language.translate("New :"))); + newPropBox.add(Box.createHorizontalGlue()); + newPropName = new JTextField(15); + newPropBox.add(newPropName); + newPropType = new JComboBox(typeOptions); + newPropBox.add(newPropType); + newPropBox.add(Box.createHorizontalStrut(1)); + addPropButton = new JButton("Add"); + addPropButton.setMargin(new Insets(0, 0, 0, 0)); + delPropButton = new JButton("Del"); + delPropButton.setMargin(new Insets(0, 0, 0, 0)); + addPropButton.addActionListener(this); + delPropButton.addActionListener(this); + newPropBox.add(addPropButton); + newPropBox.add(delPropButton); + + c.gridy++; + c.weighty=0; + c.fill= GridBagConstraints.HORIZONTAL; + gridbag.setConstraints(newPropBox, c); + add(newPropBox); + } + + public void clear() { + selObjSlot.setText(""); + selObjMember.setText("Nothing Selected"); + mPropertyModel.setMap(new CastorHashMap()); + addPropButton.setEnabled(false); + delPropButton.setEnabled(false); + } + + /** + * @param isEditable The isEditable to set. + */ + public void setEditable(boolean editable) { + mPropertyModel.setEditable(editable); + isEditable = editable; + newPropBox.setVisible(editable); + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getSource() == addPropButton) { + if (newPropName.getText().length() < 1) { + JOptionPane.showMessageDialog(this, "Enter a name for the new property", "Cannot add property", JOptionPane.ERROR_MESSAGE); + return; + } + if (mPropertyModel.sourceMap.containsKey(newPropName.getText())) { + JOptionPane.showMessageDialog(this, "Property '"+newPropName.getText()+"' already exists.", "Cannot add property", JOptionPane.ERROR_MESSAGE); + return; + } + if (mPropertyTable.getCellEditor() != null) + mPropertyTable.getCellEditor().stopCellEditing(); + + try { + Class newPropClass = Class.forName("java.lang."+typeOptions[newPropType.getSelectedIndex()]); + Class[] params = {String.class}; + Constructor init = newPropClass.getConstructor(params); + Object[] initParams = { typeInitVal[newPropType.getSelectedIndex()] }; + mPropertyModel.addProperty(newPropName.getText(), init.newInstance(initParams), false); + } catch (Exception ex) { + MainFrame.exceptionDialog(ex); + } + } + else if (e.getSource() == delPropButton) { + int selrow = mPropertyTable.getSelectedRow(); + if (selrow == -1) { + JOptionPane.showMessageDialog(this, "Select a property to remove", "Cannot delete property", JOptionPane.ERROR_MESSAGE); + return; + } + mPropertyModel.delProperty(mPropertyModel.sortedNameList.get(selrow)); + } + } + +} diff --git a/src/main/java/org/cristalise/gui/tabs/collection/CollectionView.java b/src/main/java/org/cristalise/gui/tabs/collection/CollectionView.java new file mode 100644 index 0000000..06b11ab --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/collection/CollectionView.java @@ -0,0 +1,51 @@ +package org.cristalise.gui.tabs.collection; + +import javax.swing.JPanel; + +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.collection.Collection; +import org.cristalise.kernel.collection.CollectionMember; +import org.cristalise.kernel.entity.proxy.ItemProxy; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Logger; + + +/************************************************************************** + * + * $Revision: 1.1 $ + * $Date: 2004/08/10 07:56:08 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + + +public abstract class CollectionView extends JPanel { + + protected Collection thisColl; + protected ItemProxy item; + + public CollectionView() { + super(); + } + + public void setItem(ItemProxy item) { + this.item = item; + } + + public abstract void setCollection(Collection coll); + + protected void saveCollection() + { + try + { + String[] params = new String[1]; + params[0] = Gateway.getMarshaller().marshall(thisColl); + MainFrame.userAgent.execute(item, "AddC2KObject", params); + } + catch (Exception e) + { + Logger.error(e); + } + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/collection/DependencyView.java b/src/main/java/org/cristalise/gui/tabs/collection/DependencyView.java new file mode 100644 index 0000000..543d3aa --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/collection/DependencyView.java @@ -0,0 +1,73 @@ +package org.cristalise.gui.tabs.collection; +import java.awt.GridLayout; + +import javax.swing.JSplitPane; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.TreeBrowser; +import org.cristalise.gui.tree.Node; +import org.cristalise.gui.tree.NodeCollection; +import org.cristalise.gui.tree.NodeItem; +import org.cristalise.kernel.collection.Collection; +import org.cristalise.kernel.collection.DependencyMember; +import org.cristalise.kernel.common.ObjectNotFoundException; + +/** + * @version $Revision: 1.2 $ $Date: 2005/06/02 12:17:22 $ + * @author $Author: abranson $ + */ +public class DependencyView extends CollectionView +{ + TreeBrowser tree; + CollectionMemberPropertyPanel propPanel; + JSplitPane split; + + public DependencyView() + { + super(); + setLayout(new GridLayout(1, 1)); + createLayout(); + } + + @Override + public void setCollection(Collection contents) + { + thisColl = contents; + NodeCollection collNode = new NodeCollection(item, thisColl.getName(), null); + tree = new TreeBrowser(MainFrame.myDesktopManager, collNode); + tree.getTree().addTreeSelectionListener(new TreeSelectionListener() { + @Override + public void valueChanged(TreeSelectionEvent e) { + if (e.getPath() == null) { + propPanel.clear(); + } + else { + Node selectedNode = (Node)((DefaultMutableTreeNode)e.getPath().getLastPathComponent()).getUserObject(); + if (selectedNode instanceof NodeItem) { + NodeItem thisItem = (NodeItem)selectedNode; + if (thisItem.getParentCollection() != null) { + try { + propPanel.setMember(thisItem.getParentCollection().getMember(thisItem.getSlotNo())); + return; + } catch (ObjectNotFoundException e1) { } + } + propPanel.clear(); + } + } + } + }); + split.setLeftComponent(tree); + } + public void createLayout() + { + propPanel = new CollectionMemberPropertyPanel(); + split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); + split.setRightComponent(propPanel); + add(split); + + } + +} diff --git a/src/main/java/org/cristalise/gui/tabs/execution/ActivityItem.java b/src/main/java/org/cristalise/gui/tabs/execution/ActivityItem.java new file mode 100644 index 0000000..81ccb02 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/execution/ActivityItem.java @@ -0,0 +1,57 @@ +package org.cristalise.gui.tabs.execution; +import java.util.ArrayList; + +import org.cristalise.kernel.entity.agent.Job; + + +public class ActivityItem { + public String stepPath; + public int state; + public String stateName; + public String name; + ArrayList jobs = new ArrayList(); + + public ActivityItem() { + stepPath = ""; + state = -1; + name = "--"; + } + + public ActivityItem(Job thisJob) { + stepPath = thisJob.getStepPath(); + state = thisJob.getTransition().getOriginStateId(); + stateName = thisJob.getOriginStateName(); + name = thisJob.getStepName(); + jobs.add(thisJob); + } + + public void addJob(Job newJob) { + jobs.add(newJob); + } + + public ArrayList getJobs() { + return jobs; + } + + public String getStepPath() { + return stepPath; + } + + @Override + public String toString() { + return name+(state>-1?" ("+stateName+")":""); + } + + @Override + public boolean equals(Object other) { + if (other instanceof ActivityItem) + return hashCode() == ((ActivityItem)other).hashCode(); + return false; + } + + @Override + public int hashCode() { + return stepPath.hashCode(); + } + +} diff --git a/src/main/java/org/cristalise/gui/tabs/execution/ActivityViewer.java b/src/main/java/org/cristalise/gui/tabs/execution/ActivityViewer.java new file mode 100644 index 0000000..2193916 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/execution/ActivityViewer.java @@ -0,0 +1,346 @@ +package org.cristalise.gui.tabs.execution; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.util.ArrayList; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.tabs.ExecutionPane; +import org.cristalise.gui.tabs.ItemTabPane; +import org.cristalise.gui.tabs.outcome.InvalidOutcomeException; +import org.cristalise.gui.tabs.outcome.InvalidSchemaException; +import org.cristalise.gui.tabs.outcome.OutcomeHandler; +import org.cristalise.kernel.common.InvalidDataException; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.agent.Job; +import org.cristalise.kernel.entity.proxy.ItemProxy; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.LocalObjectLoader; +import org.cristalise.kernel.utils.Logger; + + +public class ActivityViewer extends JPanel implements Runnable { + + ItemProxy item; + Box outcomeButtons = Box.createHorizontalBox(); + OutcomeHandler outcomePanel; + OutcomeHandler errorPanel; + JPanel outcomeView = new JPanel(new GridLayout(1,1)); + JPanel errorView = new JPanel(new GridLayout(2,1)); + ActivityItem thisAct; + ArrayList requestButtons = new ArrayList(); + JLabel noOutcome = new JLabel(Language.translate("No outcome data is required for this activity")); + ExecutionPane parent; + JLabel status; + JComboBox executors; + JButton saveButton = new JButton("Save"); + JButton loadButton = new JButton("Load"); + GridBagLayout gridbag = new GridBagLayout(); + Job executingJob = null; + static JFileChooser chooser = new JFileChooser(); + static { + chooser.addChoosableFileFilter( + new javax.swing.filechooser.FileFilter() { + @Override + public String getDescription() { + return "XML Files"; + } + @Override + public boolean accept(File f) { + if (f.isDirectory() || (f.isFile() && f.getName().endsWith(".xml"))) { + return true; + } + return false; + } + }); + } + + public ActivityViewer (ActivityItem newAct, ItemProxy item, ExecutionPane parent){ + thisAct = newAct; + this.item = item; + this.parent = parent; + setLayout(gridbag); + + GridBagConstraints c = new GridBagConstraints(); + c.gridx=0; c.gridy=1; c.weightx=1.0; c.weighty=0.0; + c.insets = new Insets(5,5,5,5); + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.HORIZONTAL; + +// activity title + JLabel actTitle = new JLabel(Language.translate("Activity")+": "+newAct.name); + actTitle.setFont(ItemTabPane.titleFont); + gridbag.setConstraints(actTitle, c); + add(actTitle); + + Job firstJob = (thisAct.getJobs().get(0)); +// desc + String desc = firstJob.getDescription(); + if (desc != null && desc.length() > 0) { + Box descBox = Box.createHorizontalBox(); + + String chopDesc = null; + if(desc.length() >= 40) chopDesc = desc.substring(0,40); + else chopDesc = desc; + + descBox.add(new JLabel("Description: "+chopDesc)); + if (desc.length()>chopDesc.length()) { + descBox.add(new JLabel(" ...")); + descBox.add(Box.createHorizontalStrut(7)); + JButton descButton = new JButton("View"); + descButton.setMargin(new Insets(0,0,0,0)); + descButton.setActionCommand(desc); + descButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JTextArea descArea = new JTextArea(e.getActionCommand()); + descArea.setLineWrap(true); + descArea.setWrapStyleWord(true); + JScrollPane descScroll = new JScrollPane(descArea); + descScroll.setPreferredSize(new Dimension(400,150)); + JOptionPane.showMessageDialog(null, descScroll, "Activity Description", JOptionPane.PLAIN_MESSAGE); + } + }); + descBox.add(descButton); + } + + c.gridy++; + gridbag.setConstraints(descBox, c); + add(descBox); + } + + +// agentid + String roleName = firstJob.getAgentRole(); + if (roleName!= null && roleName.length()>0) { + c.gridy++; + JLabel role = new JLabel(Language.translate("Agent Role")+": "+roleName); + gridbag.setConstraints(role, c); + add(role); + } + + c.gridy++; + c.anchor = GridBagConstraints.EAST; + gridbag.setConstraints(outcomeButtons, c); + add(outcomeButtons); + + executors = MainFrame.getExecutionPlugins(); + if (executors.getItemCount() > 1) { + c.gridx++; + gridbag.setConstraints(executors, c); + add(executors); + c.gridx--; + } + + c.gridy++; + + status = new JLabel(Language.translate("Waiting for request")); + status.setFont(ItemTabPane.titleFont); + gridbag.setConstraints(status, c); + add(status); + + c.gridx++; + Box fileBox = Box.createHorizontalBox(); + fileBox.add(saveButton); fileBox.add(Box.createHorizontalGlue()); fileBox.add(loadButton); + gridbag.setConstraints(fileBox, c); + add(fileBox); + saveButton.setEnabled(false); + loadButton.setEnabled(false); + c.gridx--; + c.gridwidth = 2; + for (Object name2 : thisAct.getJobs()) { + Job thisJob = (Job)name2; + RequestButton newButton = new RequestButton(thisJob, this); + requestButtons.add(newButton); + outcomeButtons.add(newButton); + outcomeButtons.add(Box.createHorizontalStrut(5)); + newButton.setEnabled(false); + + if (thisJob.hasOutcome()) { + + String schemaName; + int schemaVersion; + try { + schemaName = thisJob.getSchemaName(); + schemaVersion = thisJob.getSchemaVersion(); + } catch (Exception e) { + newButton.setToolTipText("Could not load schema for this job."); + continue; + } + + if(!schemaName.equals("Errors") && outcomePanel == null) { + try { + outcomePanel = getOutcomeHandler(thisJob); + outcomeView = outcomePanel.getPanel(); + newButton.setEnabled(true); + } catch (ObjectNotFoundException ex) { + outcomeView.add(new JLabel(Language.translate("Schema not found:")+" "+schemaName+" v"+schemaVersion)); + } catch (Exception ex) { + outcomeView.add(new JLabel(Language.translate("ERROR loading outcome editor: ") + +ex.getClass().getName()+" ("+ex.getMessage()+")")); + Logger.error(ex); + } + } + if (schemaName.equals("Errors")) { + try { + errorPanel = getOutcomeHandler(thisJob); + errorView.add(errorPanel.getPanel()); + newButton.setEnabled(true); + } catch (Exception ex) { + errorView.add(new JLabel(Language.translate("ERROR loading error editor: ") + +ex.getClass().getName()+" ("+ex.getMessage()+")")); + + } + } + } + else + newButton.setEnabled(true); + } + if (outcomePanel == null) + outcomeView.add(noOutcome); + else + enableLoadSaveButtons(); + + + c.gridy++; c.weighty=1.0; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.BOTH; + gridbag.setConstraints(outcomeView, c); + add(outcomeView); + + } + + public OutcomeHandler getOutcomeHandler(Job thisJob) throws ObjectNotFoundException, InvalidSchemaException, InvalidOutcomeException, InvalidDataException { + String schema; + OutcomeHandler thisForm; + schema = LocalObjectLoader.getSchema(thisJob.getSchemaName(), thisJob.getSchemaVersion()).schema; + thisForm = ItemTabPane.getOutcomeHandler(thisJob.getSchemaName(), thisJob.getSchemaVersion()); + thisForm.setReadOnly(false); + thisForm.setDescription(schema); + String outcomeString = thisJob.getOutcomeString(); + if ( outcomeString!= null && outcomeString.length() > 0) + thisForm.setOutcome(outcomeString); + return thisForm; + } + + public void enableLoadSaveButtons() { + saveButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String output; + try { + output = outcomePanel.getOutcome(); + int returnVal = chooser.showSaveDialog(null); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File targetFile = chooser.getSelectedFile(); + if (!(targetFile.getAbsolutePath().endsWith(".xml"))) + targetFile = new File(targetFile.getAbsolutePath()+".xml"); + + Logger.msg(2, "ExecutionPane - Exporting outcome to file " + targetFile.getName()); + FileStringUtility.string2File(targetFile, output); + } + } catch (Exception ex) { + Logger.error(ex); + MainFrame.exceptionDialog(ex); + } + } + }); + saveButton.setEnabled(true); + + loadButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + try { + int returnVal = chooser.showOpenDialog(null); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File targetFile = chooser.getSelectedFile(); + + Logger.msg(2, "ViewpointPane.actionPerformed() - Reading outcome from file " + targetFile.getName()); + String outcome = FileStringUtility.file2String(targetFile); + outcomePanel.setOutcome(outcome); + new Thread(outcomePanel).start(); + } + } catch (Exception ex) { + Logger.error(ex); + MainFrame.exceptionDialog(ex); + } + } + }); + loadButton.setEnabled(true); + } + + public void init() { + if (outcomePanel != null) + new Thread(outcomePanel).start(); + if (errorPanel != null) + new Thread(errorPanel).start(); + } + + public void execute(Job thisJob) { + try { + if (thisJob.hasOutcome()) + if (!thisJob.getSchemaName().equals("Errors")) + thisJob.setOutcome(outcomePanel.getOutcome()); + else { + Box errorBox = Box.createVerticalBox(); + errorBox.add(new JLabel("Please give details of the error:")); + errorBox.add(errorView); + int result = JOptionPane.showConfirmDialog(this, errorBox, "Send Error", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE); + if (result != JOptionPane.OK_OPTION) + return; + thisJob.setOutcome(errorPanel.getOutcome()); + } + executingJob = thisJob; + new Thread(this).start(); + } catch (Exception ex) { + MainFrame.exceptionDialog(ex); + } + + } + + /** + * Submits the job to the database + */ + @Override + public void run() { + Thread.currentThread().setName("Activity Execution"); + enableAllButtons(false); + try { + Executor selectedExecutor = (Executor)executors.getSelectedItem(); + selectedExecutor.execute(executingJob, status); + } catch (Exception e) { + Logger.error(e); + MainFrame.progress.stopBouncing(Language.translate("Error during execution")); + status.setText(Language.translate("Error during execution: "+e.getClass().getSimpleName())); + MainFrame.exceptionDialog(e); + } + enableAllButtons(true); + } + + private void enableAllButtons(boolean enabled) { + + for (RequestButton thisButton : requestButtons) { + thisButton.setEnabled(enabled); + } + } + + public ActivityItem getActivity() { + return thisAct; + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/execution/DefaultExecutor.java b/src/main/java/org/cristalise/gui/tabs/execution/DefaultExecutor.java new file mode 100644 index 0000000..8b15c95 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/execution/DefaultExecutor.java @@ -0,0 +1,38 @@ +package org.cristalise.gui.tabs.execution; + +import javax.swing.JLabel; + +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.entity.agent.Job; +import org.cristalise.kernel.utils.Language; + + +/************************************************************************** + * + * $Revision: 1.2 $ + * $Date: 2003/11/04 14:31:30 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class DefaultExecutor implements Executor { + + public DefaultExecutor() { + super(); + } + + @Override + public void execute(Job job, JLabel status) throws Exception { + status.setText(Language.translate("Submitting...")); + MainFrame.progress.startBouncing("Requesting, please wait."); + MainFrame.userAgent.execute(job); + MainFrame.progress.stopBouncing("Execution complete."); + status.setText("Waiting for joblist update."); + } + + @Override + public String toString() { + return "Normal"; + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/execution/Executor.java b/src/main/java/org/cristalise/gui/tabs/execution/Executor.java new file mode 100644 index 0000000..8a08351 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/execution/Executor.java @@ -0,0 +1,23 @@ +package org.cristalise.gui.tabs.execution; + +import javax.swing.JLabel; + +import org.cristalise.kernel.entity.agent.Job; + + +/************************************************************************** + * + * $Revision: 1.1 $ + * $Date: 2003/09/25 10:28:02 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public interface Executor { + + @Override + public String toString(); + + public void execute(Job job, JLabel status) throws Exception; +} diff --git a/src/main/java/org/cristalise/gui/tabs/execution/RequestButton.java b/src/main/java/org/cristalise/gui/tabs/execution/RequestButton.java new file mode 100644 index 0000000..bccf99f --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/execution/RequestButton.java @@ -0,0 +1,44 @@ +package org.cristalise.gui.tabs.execution; +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; + +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.entity.agent.Job; +import org.cristalise.kernel.utils.Logger; + +/** + * Each job gets a RequestButton + */ + + public class RequestButton extends JButton implements ActionListener { + + Job myJob; + ActivityViewer parent; + + public RequestButton(Job myJob, ActivityViewer parent) { + super(); + this.myJob = myJob; + this.parent = parent; + String label = myJob.getTransition().getName(); + if (myJob.hasOutcome()) { + setBackground(Color.white); + try { + if (myJob.getSchemaName().equals("Errors")) setBackground(Color.pink); + } catch (Exception e) { + Logger.error(e); + MainFrame.exceptionDialog(e); + setEnabled(false); + } + } + super.setText(label); + addActionListener(this); + } + + @Override + public void actionPerformed(ActionEvent event) { + parent.execute(myJob); + } + } diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/BasicOutcomeEditor.java b/src/main/java/org/cristalise/gui/tabs/outcome/BasicOutcomeEditor.java new file mode 100644 index 0000000..d31230d --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/BasicOutcomeEditor.java @@ -0,0 +1,114 @@ +package org.cristalise.gui.tabs.outcome; + +import java.awt.Font; +import java.awt.GridLayout; +import java.io.File; + +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.PlainDocument; + +import org.cristalise.kernel.utils.FileStringUtility; + + +/************************************************************************** + * + * $Revision: 1.4 $ + * $Date: 2005/09/07 13:46:31 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + + + +public class BasicOutcomeEditor extends JPanel implements OutcomeHandler { + + PlainDocument doc; + JTextArea textarea; + boolean unsaved; + + public BasicOutcomeEditor() { + super(); + this.setLayout(new GridLayout(1,1)); + doc = new PlainDocument(); + textarea = new JTextArea(doc); + textarea.setTabSize(2); + textarea.setFont(Font.decode("monospaced")); + add(new JScrollPane(textarea)); + doc.addDocumentListener(new DocumentListener() { + @Override + public void changedUpdate(DocumentEvent e) { unsaved = true; } + @Override + public void insertUpdate(DocumentEvent e) { unsaved = true; } + @Override + public void removeUpdate(DocumentEvent e) { unsaved = true; } + + }); + } + + @Override + public void setOutcome(String outcome) throws InvalidOutcomeException { + try { + doc.insertString(0, outcome, null); + unsaved = false; + } catch (Exception ex) { + throw new InvalidOutcomeException(ex.getMessage()); + } + } + + @Override + public void setDescription(String description) throws InvalidSchemaException { } + + @Override + public void setReadOnly(boolean readOnly) { + textarea.setEditable(!readOnly); + } + + + @Override + public JPanel getPanel() throws OutcomeNotInitialisedException { + return this; + } + + /** + * + */ + + @Override + public String getOutcome() throws OutcomeException { + if (doc.getLength()==0) return null; + try { + return doc.getText(0, doc.getLength()); + } catch (Exception ex) { + throw new OutcomeException(ex.getMessage()); + } + } + + /** + * + */ + + @Override + public void run() { + } + + + @Override + public boolean isUnsaved() { + return unsaved; + } + + @Override + public void saved() { + unsaved = false; + } + + @Override + public void export(File targetFile) throws Exception { + FileStringUtility.string2File(targetFile, getOutcome()); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/InvalidOutcomeException.java b/src/main/java/org/cristalise/gui/tabs/outcome/InvalidOutcomeException.java new file mode 100644 index 0000000..15fc6be --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/InvalidOutcomeException.java @@ -0,0 +1,11 @@ +package org.cristalise.gui.tabs.outcome; + +public class InvalidOutcomeException extends OutcomeException { + + public InvalidOutcomeException() { + super(); + } + public InvalidOutcomeException(String ex) { + super(ex); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/InvalidSchemaException.java b/src/main/java/org/cristalise/gui/tabs/outcome/InvalidSchemaException.java new file mode 100644 index 0000000..cf33e66 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/InvalidSchemaException.java @@ -0,0 +1,11 @@ +package org.cristalise.gui.tabs.outcome; + +public class InvalidSchemaException extends OutcomeException { + + public InvalidSchemaException() { + super(); + } + public InvalidSchemaException(String ex) { + super(ex); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/OutcomeException.java b/src/main/java/org/cristalise/gui/tabs/outcome/OutcomeException.java new file mode 100644 index 0000000..eed7593 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/OutcomeException.java @@ -0,0 +1,11 @@ +package org.cristalise.gui.tabs.outcome; + +public class OutcomeException extends Exception { + + public OutcomeException() { + super(); + } + public OutcomeException(String ex) { + super(ex); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/OutcomeHandler.java b/src/main/java/org/cristalise/gui/tabs/outcome/OutcomeHandler.java new file mode 100644 index 0000000..4d7e66c --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/OutcomeHandler.java @@ -0,0 +1,16 @@ +package org.cristalise.gui.tabs.outcome; +import java.io.File; + +import javax.swing.JPanel; + +public interface OutcomeHandler extends Runnable { + + public void setOutcome(String outcome) throws InvalidOutcomeException; + public void setDescription(String description) throws InvalidSchemaException; + public void setReadOnly(boolean readOnly); + public JPanel getPanel() throws OutcomeNotInitialisedException; + public boolean isUnsaved(); + public void saved(); + public String getOutcome() throws OutcomeException; + public void export(File targetFile) throws Exception; +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/OutcomeNotInitialisedException.java b/src/main/java/org/cristalise/gui/tabs/outcome/OutcomeNotInitialisedException.java new file mode 100644 index 0000000..22d43e8 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/OutcomeNotInitialisedException.java @@ -0,0 +1,11 @@ +package org.cristalise.gui.tabs.outcome; + +public class OutcomeNotInitialisedException extends OutcomeException { + + public OutcomeNotInitialisedException() { + super(); + } + public OutcomeNotInitialisedException(String ex) { + super(ex); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/AttributeList.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/AttributeList.java new file mode 100644 index 0000000..58365ee --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/AttributeList.java @@ -0,0 +1,160 @@ +package org.cristalise.gui.tabs.outcome.form; + +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Iterator; + +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingConstants; + +import org.cristalise.gui.tabs.outcome.form.field.StringEditField; +import org.cristalise.kernel.utils.Logger; +import org.exolab.castor.xml.schema.AttributeDecl; +import org.exolab.castor.xml.schema.ComplexType; +import org.exolab.castor.xml.schema.ElementDecl; +import org.w3c.dom.Attr; +import org.w3c.dom.Element; + + +public class AttributeList extends JPanel { + + ArrayList attrSet = new ArrayList(); + ElementDecl model; + Element myElement; + boolean readOnly; + static Font labelFont; + + public AttributeList(ElementDecl model, boolean readOnly, HelpPane helpPane) { + super(); + AttributeDecl thisDecl; + this.model = model; + this.readOnly = readOnly; + + // set up panel + GridBagLayout gridbag = new java.awt.GridBagLayout(); + setLayout(gridbag); + if (labelFont == null) + labelFont = this.getFont().deriveFont((float)(this.getFont().getSize()-3.0)); + // retrieve attributes + if (!model.getType().isComplexType()) { + // simple types have no attributes + return; + } + + ComplexType content = (ComplexType)model.getType(); + + // place on panel + + GridBagConstraints c = new GridBagConstraints(); + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1.0; c.weighty = 1.0; c.gridx = 0; + c.ipadx = 5; c.ipady = 0; + + for (Enumeration fields = content.getAttributeDecls(); fields.hasMoreElements();) { + c.gridy = 0; + thisDecl = (AttributeDecl)fields.nextElement(); + Logger.msg(8, "Includes Attribute "+thisDecl.getName()); + + // Add Label + JLabel heading = new JLabel(thisDecl.getName()); + heading.setFont(labelFont); + heading.setVerticalAlignment(SwingConstants.BOTTOM); + gridbag.setConstraints(heading, c); + this.add(heading); + + // read help + String helpText; + String doc = OutcomeStructure.extractHelp(thisDecl); + if (doc.length() > 0) + helpText = doc.toString(); + else + helpText = "No help is available for this attribute"; + + + c.gridy++; + + // Add entry + try { + StringEditField entry = StringEditField.getEditField(thisDecl); + entry.setHelp(helpPane, helpText); + attrSet.add(entry); + if (readOnly) entry.setEditable(false); + gridbag.setConstraints(entry.getControl(), c); + this.add(entry.getControl()); + } catch (StructuralException e) { + JLabel entry = new JLabel("Error"); + entry.setToolTipText(e.getMessage()); + gridbag.setConstraints(entry, c); + this.add(entry); + } + + + c.gridx++; + } + } + + public void setInstance(Element data) throws StructuralException { + this.myElement = data; + for (StringEditField thisField : attrSet) { + Logger.msg(8, "Populating Attribute "+thisField.getName()); + Attr thisAttr = myElement.getAttributeNode(thisField.getName()); + if (thisAttr == null) + thisAttr = newAttribute(myElement, (AttributeDecl)thisField.getModel()); + thisField.setData(thisAttr); + } + } + + public Attr newAttribute(Element parent, AttributeDecl attr) { + + parent.setAttribute(attr.getName(), attr.getFixedValue()!=null?attr.getFixedValue():attr.getDefaultValue()); + return parent.getAttributeNode(attr.getName()); + } + + public String validateAttributes() { + if (model.getType().isComplexType()) { + ComplexType content = (ComplexType)model.getType(); + for (Enumeration fields = content.getAttributeDecls(); fields.hasMoreElements();) { + AttributeDecl thisDecl = (AttributeDecl)fields.nextElement(); + String attrVal = myElement.getAttribute(thisDecl.getName()); + if (attrVal.length() == 0 && thisDecl.isOptional()) { + myElement.removeAttribute(thisDecl.getName()); + } + } + } + return null; + } + + public void initNew(Element parent) { + AttributeDecl thisDecl; + StringEditField thisField; + Attr thisAttr; + this.myElement = parent; + + if (model.getType().isSimpleType()) return; // no attributes in simple types + + ComplexType content = (ComplexType)model.getType(); + + for (Iterator e = attrSet.iterator(); e.hasNext();) { + thisField = e.next(); + + thisDecl = content.getAttributeDecl(thisField.getName()); + // HACK: if we don't resolve the reference, the type will be null + if (thisDecl.isReference()) thisDecl = thisDecl.getReference(); + thisAttr = newAttribute(myElement, thisDecl); + // add into parent - fill in field + try { + thisField.setData(thisAttr); + } catch (Exception ex) { } // impossible name mismatch + } + } + @Override + public void grabFocus() { + if (attrSet.size() > 0) + attrSet.get(0).grabFocus(); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/CardinalException.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/CardinalException.java new file mode 100644 index 0000000..000d791 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/CardinalException.java @@ -0,0 +1,14 @@ +package org.cristalise.gui.tabs.outcome.form; + +import org.cristalise.gui.tabs.outcome.OutcomeException; + +public class CardinalException extends OutcomeException { + + public CardinalException() { + super(); + } + + public CardinalException(String ex) { + super(ex); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/DataRecord.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/DataRecord.java new file mode 100644 index 0000000..32070ca --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/DataRecord.java @@ -0,0 +1,252 @@ +package org.cristalise.gui.tabs.outcome.form; +import java.awt.FlowLayout; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; + +import javax.swing.JLabel; +import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.cristalise.gui.tabs.outcome.OutcomeException; +import org.cristalise.kernel.utils.Logger; +import org.exolab.castor.xml.schema.ComplexType; +import org.exolab.castor.xml.schema.ElementDecl; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + + +public class DataRecord extends OutcomeStructure implements ChangeListener { + + AttributeList myAttributes; + JTabbedPane DRPanel = null; + boolean deferred; + Document parentDoc; + GridBagConstraints position; + GridBagLayout gridbag; + + public DataRecord(ElementDecl model, boolean readOnly, HelpPane help, boolean deferred) throws OutcomeException { + super(model, readOnly, help); + this.deferred = deferred; + if (!deferred) setupPanel(); + } + + public synchronized void activate() { + deferred = false; + try { + setupPanel(); + if (myElement!=null) populateInstance(); + } catch (OutcomeException ex) { + removeAll(); + setLayout(new FlowLayout()); + add(new JLabel("Error displaying outcome segment: "+ex.getMessage())); + } + validate(); + } + + private void setupPanel() throws OutcomeException { + // set up panel + gridbag = new java.awt.GridBagLayout(); + setLayout(gridbag); + position = new GridBagConstraints(); + position.anchor = GridBagConstraints.NORTHWEST; + position.fill = GridBagConstraints.NONE; + position.weightx = 1.0; position.weighty = 1.0; + position.gridx = 0; position.gridy = 0; + position.ipadx = 5; position.ipady = 5; + position.insets = new Insets(5,5,0,0); + + // attributes at the top + myAttributes = new AttributeList(model, readOnly, helpPane); + position.gridwidth=3; + gridbag.setConstraints(myAttributes, position); + add(myAttributes); + + ComplexType elementType; + try { + elementType = (ComplexType)model.getType(); + } + catch (ClassCastException e) { + throw new StructuralException("DataRecord created with non-ComplexType"); + } + + //loop through all schema sub-elements + try { + enumerateElements(elementType); + } catch (OutcomeException e) { + throw new OutcomeException("Element "+model.getName()+" could not be created: "+e.getMessage()); + } + } + + @Override + public void addStructure(OutcomeStructure newElement) throws OutcomeException { + super.addStructure(newElement); + if (newElement == null) return; + if (newElement instanceof DataRecord) { + DataRecord newRecord = (DataRecord)newElement; + // set up enclosing tabbed pane for child drs + if (DRPanel == null) { + DRPanel = new JTabbedPane(); + position.gridy++; + position.weightx=1.0; + position.fill=GridBagConstraints.HORIZONTAL; + position.gridwidth=3; + gridbag.setConstraints(DRPanel, position); + add(DRPanel); + // defer further tabs in this pane + deferChild = true; + } + DRPanel.addTab(newRecord.getName(), newRecord); + DRPanel.addChangeListener(newRecord); + } + else { + DRPanel = null;// have to make a new tabbed pane now + deferChild = false; + if (newElement instanceof Field) { + Field newField = (Field)newElement; + // make some nice columns + position.gridwidth=1; + position.gridy++; + position.gridx=0; + position.weightx=2; + position.weighty=0; + position.fill=GridBagConstraints.NONE; + gridbag.setConstraints(newField.getLabel(), position); + this.add(newField.getLabel()); + position.gridy++; + position.weighty=1; + position.fill = GridBagConstraints.HORIZONTAL; + gridbag.setConstraints(newField.getCData(), position); + this.add(newField.getCData()); + position.gridx++; + position.gridy--; + position.gridheight=2; + position.weightx=0; + position.fill=GridBagConstraints.NONE; + gridbag.setConstraints(newField.getAttributes(), position); + this.add(newField.getAttributes()); + position.gridx=0; + position.gridheight=1; + position.gridy++; + } + else { + position.fill=GridBagConstraints.HORIZONTAL; + position.gridwidth=3; + position.weightx=1.0; + position.gridy++; + position.weighty=1.0; + gridbag.setConstraints(newElement, position); + add(newElement); + } + } + } + + @Override + public void addInstance(Element myElement, Document parentDoc) throws OutcomeException { + Logger.msg(8, "Accepting DR "+myElement.getTagName()); + + if (this.myElement != null) throw new CardinalException("DataRecord "+this.getName()+" cannot repeat."); + this.myElement = myElement; + this.parentDoc = parentDoc; + + if (!deferred) + populateInstance(); + } + + public void populateInstance() throws OutcomeException { + myAttributes.setInstance(myElement); + + NodeList childElements = myElement.getChildNodes(); + + for (int i=0; i 0) + myAttributes.grabFocus(); + else if (order.size()> 0) + subStructure.get(order.get(0)).grabFocus(); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/Dimension.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/Dimension.java new file mode 100644 index 0000000..27f863b --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/Dimension.java @@ -0,0 +1,396 @@ +package org.cristalise.gui.tabs.outcome.form; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.util.ArrayList; +import java.util.Iterator; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.border.EtchedBorder; +import javax.swing.table.JTableHeader; + +import org.cristalise.gui.DomainKeyConsumer; +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.tabs.outcome.OutcomeException; +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.utils.Logger; +import org.exolab.castor.xml.schema.ElementDecl; +import org.exolab.castor.xml.schema.Particle; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + + +public class Dimension extends OutcomeStructure implements ActionListener { + + DimensionTableModel tableModel; + Element parent; + GridBagConstraints position; + GridBagLayout gridbag; + JTabbedPane tabs; + JLabel msg; + DomKeyPushTable table; + Box tableBox; + ArrayList instances = new ArrayList(); // stores DimensionInstances if tabs + ArrayList elements = new ArrayList(); // stores current children + + JButton addButton; + JButton delButton; + + short mode; + protected static final short TABLE = 1; + protected static final short TABS = 2; + + + public Dimension(ElementDecl model, boolean readOnly, HelpPane help) { + super(model, readOnly, help); + // set up panel + gridbag = new java.awt.GridBagLayout(); + setLayout(gridbag); + position = new GridBagConstraints(); + position.anchor = GridBagConstraints.NORTHWEST; + position.fill = GridBagConstraints.HORIZONTAL; + position.weightx = 1.0; position.weighty = 0.0; + position.gridx = 0; position.gridy = 0; + position.ipadx = 0; position.ipady = 0; + position.insets = new Insets(0,0,0,0); + + // TODO: an element or attribute of the dimension can be flagged as an index, so it can be used as a title for a tab + + // set up the border + setBorder(BorderFactory.createTitledBorder( + BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), model.getName())); + + msg = new JLabel("No elements"); + msg.setFont(new Font("SansSerif", Font.ITALIC, msg.getFont().getSize())); + gridbag.setConstraints(msg, position); + add(msg); + position.gridy++; + + // decide whether a table or tabs + try { + tableModel = new DimensionTableModel(model, readOnly); + Logger.msg(8, "DIM "+model.getName()+" - Will be a table"); + mode = TABLE; + tableBox = Box.createVerticalBox(); + table = new DomKeyPushTable(tableModel, this); + new MultiLinePasteAdapter(table, this); + if (readOnly) table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); + table.setColumnSelectionAllowed(readOnly); + JTableHeader tableHeader = table.getTableHeader(); + tableHeader.setReorderingAllowed(false); + tableBox.add(tableHeader); + tableBox.add(table); + gridbag.setConstraints(tableBox, position); + add(tableBox); + tableBox.setVisible(false); + + } catch (StructuralException e) { + // use tabs + Logger.msg(8, "DIM "+model.getName()+" - Will be tabs: "+e.getMessage()); + mode = TABS; + tabs = new JTabbedPane(); + gridbag.setConstraints(tabs, position); + add(tabs); + tabs.setVisible(false); + } + if (!readOnly) { + JPanel rowAdjust = new JPanel(new FlowLayout()); + addButton = new JButton("+"); + addButton.setActionCommand("add"); + addButton.addActionListener(this); + rowAdjust.add(addButton); + + delButton = new JButton("-"); + delButton.setActionCommand("del"); + delButton.addActionListener(this); + delButton.setEnabled(false); + rowAdjust.add(delButton); + + + position.gridy++; position.weighty=0; position.weightx=0; + gridbag.setConstraints(rowAdjust, position); + this.add(rowAdjust); + } + + } + + public void setParentElement(Element parent) { + this.parent = parent; + } + + @Override + public void addInstance(Element myElement, Document parentDoc) throws OutcomeException { + if (Logger.doLog(6)) + Logger.msg(6, "DIM - adding instance "+ (elements.size()+1) +" for "+myElement.getTagName()); + if (parent == null) setParentElement((Element)myElement.getParentNode()); + // if table, pass to table model + if (mode == TABLE) { + tableModel.addInstance(myElement, -1); + elements.add(myElement); + } + else { + DimensionInstance target; + elements.add(myElement); + if (instances.size() < elements.size()) + target = newInstance(); + else + target = instances.get(elements.size()-1); + target.addInstance(myElement, parentDoc); + } + checkButtons(); + } + + public int getChildCount() { + return elements.size(); + } + + public DimensionInstance newInstance() { + DimensionInstance newInstance = null; + try { + newInstance = new DimensionInstance(model, readOnly, helpPane, deferChild); + instances.add(newInstance); + newInstance.setTabNumber(instances.size()); + newInstance.setParent(this); + deferChild = true; + tabs.addTab(newInstance.getName(), newInstance); + tabs.addChangeListener(newInstance); + } catch (OutcomeException e) { + // shouldn't happen, we've already done it once + Logger.error(e); + } + return newInstance; + } + + @Override + public String validateStructure() { + if (mode == TABLE) + return table.validateStructure(); + else { + StringBuffer errors = new StringBuffer(); + for (Iterator iter = instances.iterator(); iter.hasNext();) { + OutcomeStructure element = iter.next(); + errors.append(element.validateStructure()); + } + return errors.toString(); + } + } + + public void checkButtons() { + // check if data visible + boolean dataVisible = elements.size() > 0; + if (mode == TABS) tabs.setVisible(dataVisible); + else tableBox.setVisible(dataVisible); + msg.setVisible(!dataVisible); + + if (readOnly) return; + + if (elements.size() <= model.getMinOccurs() || elements.size() == 0) { + delButton.setEnabled(false); + delButton.setToolTipText("Minimum row count of "+model.getMinOccurs()+" reached."); + } else { + delButton.setEnabled(true); + delButton.setToolTipText(null); + } + + if (elements.size() < model.getMaxOccurs() || model.getMaxOccurs() == Particle.UNBOUNDED) { + addButton.setEnabled(true); + addButton.setToolTipText(null); + } else { + addButton.setEnabled(false); + addButton.setToolTipText("Maximum row count of "+model.getMaxOccurs()+" reached."); + } + } + + @Override + public Element initNew(Document parent) { + Element newElement; + + if (mode == TABLE) { + newElement = tableModel.initNew(parent, -1); + elements.add(newElement); + checkButtons(); + return newElement; + } + else { + DimensionInstance newTab = null; + if (instances.size() < elements.size()+1) + newTab = newInstance(); + else + newTab = instances.get(elements.size()-1); + newElement = newTab.initNew(parent); + elements.add(newElement); + checkButtons(); + return newElement; + } + } + + @Override + public void actionPerformed(ActionEvent e) { + int index; + if (mode == TABS) index = tabs.getSelectedIndex(); + else { + index = table.getSelectedRow(); + if (index == -1) index = tableModel.getRowCount(); + } + try { + if (table == null || table.getCellEditor() == null || table.getCellEditor().stopCellEditing()) { + if (e.getActionCommand().equals("add")) + addRow(index); + else if (e.getActionCommand().equals("del")) + removeRow(index); + } + } catch (CardinalException ex) { + JOptionPane.showMessageDialog(null, ex.getMessage(), "Table error", JOptionPane.ERROR_MESSAGE); + } + } + + public void addRow(int index) throws CardinalException { + if (elements.size() == model.getMaxOccurs()) + throw new CardinalException("Maximum size of table reached"); + + if (mode == TABLE) { + Element newRow = tableModel.initNew(parent.getOwnerDocument(), index); + elements.add(index, newRow); + try { + Element following = elements.get(index+1); + parent.insertBefore(newRow, following); + } catch (IndexOutOfBoundsException ex) { + parent.appendChild(newRow); + } + table.clearSelection(); + table.setRowSelectionInterval(index, index); + } + else { + Element newTab = initNew(parent.getOwnerDocument()); + parent.appendChild(newTab); + } + checkButtons(); + + } + + public void removeRow(int index) throws CardinalException { + if (elements.size() <= model.getMinOccurs()) + throw new CardinalException("Minimum size of table reached"); + if (mode == TABLE) { + parent.removeChild(tableModel.removeRow(index)); + int selectRow = index; + if (index >= tableModel.getRowCount()) selectRow--; + if (tableModel.getRowCount() > 0) { + table.clearSelection(); + table.setRowSelectionInterval(selectRow, selectRow); + } + } + else { + Element elementToGo = elements.get(index); + parent.removeChild(elementToGo); + instances.remove(index); + tabs.remove(index); + for (int i = index; i -1 && row > -1) { + if (dataModel.getValueAt(row, col).toString().length()==0) + dataModel.setValueAt(name, row, col); + else { + if (row+1 == getRowCount()) { + try { + dim.addRow(row+1); + dataModel.setValueAt(name, row+1, col); + } catch (CardinalException ex) { + JOptionPane.showMessageDialog(null, ex.getMessage(), "Table error", JOptionPane.ERROR_MESSAGE); + } + } + } + if (row+1 < getRowCount()) { + Logger.msg(8, "Shifting selection to row "+(row+1)); + changeSelection(row+1, col, false, false); + } + } + } + + @Override + public void focusGained(FocusEvent e) { + if (!readOnly) + MainFrame.itemFinder.setConsumer(this, "Insert"); + } + + @Override + public void focusLost(FocusEvent e) { + // release the itemFinder + if (!readOnly) + MainFrame.itemFinder.clearConsumer(this); + } + + public String validateStructure() { + if (cellEditor != null) + cellEditor.stopCellEditing(); + return null; + } + + @Override + public void changeSelection( int rowIndex, int columnIndex, boolean toggle, boolean extend) { + super.changeSelection(rowIndex, columnIndex, toggle, extend); + DimensionTableModel dimModel = (DimensionTableModel)dataModel; + helpPane.setHelp(dimModel.getColumnName(columnIndex), dimModel.getHelp(columnIndex)); + } + + } + + @Override + public void grabFocus() { + if (mode == TABLE) { + if (table.getSelectedRow() == -1 && table.getRowCount() > 0) { + table.changeSelection(0, 0, false, false); + table.editCellAt(0,0); + } + table.requestFocus(); + } + else if (instances.size()> 0) + instances.get(0).grabFocus(); + } + +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/DimensionInstance.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/DimensionInstance.java new file mode 100644 index 0000000..da817c2 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/DimensionInstance.java @@ -0,0 +1,33 @@ +package org.cristalise.gui.tabs.outcome.form; +import org.cristalise.gui.tabs.outcome.OutcomeException; +import org.exolab.castor.xml.schema.ElementDecl; + + +public class DimensionInstance extends DataRecord { + + //probably will be needed to synch edits later + Dimension parentDimension; + int tabNumber; + String tabName = null; + + public DimensionInstance(ElementDecl model, boolean readOnly , HelpPane help, boolean deferred) throws OutcomeException { + super(model, readOnly, help, deferred); + } + + public void setTabNumber(int tabNumber) { + this.tabNumber=tabNumber; + } + + public void setParent(Dimension parent) { + this.parentDimension = parent; + } + + @Override + public String getName() { + //TODO appinfo for picking out attributes or child elements for tab name + if (tabName == null) + return Integer.toString(tabNumber); + else + return tabName; + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/DimensionTableModel.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/DimensionTableModel.java new file mode 100644 index 0000000..e0d4ff5 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/DimensionTableModel.java @@ -0,0 +1,332 @@ +package org.cristalise.gui.tabs.outcome.form; +import java.util.ArrayList; +import java.util.Enumeration; + +import javax.swing.table.AbstractTableModel; + +import org.cristalise.gui.tabs.outcome.OutcomeException; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; +import org.exolab.castor.xml.schema.Annotated; +import org.exolab.castor.xml.schema.AttributeDecl; +import org.exolab.castor.xml.schema.ComplexType; +import org.exolab.castor.xml.schema.ContentModelGroup; +import org.exolab.castor.xml.schema.ElementDecl; +import org.exolab.castor.xml.schema.Group; +import org.exolab.castor.xml.schema.Order; +import org.exolab.castor.xml.schema.Particle; +import org.exolab.castor.xml.schema.SimpleType; +import org.exolab.castor.xml.schema.SimpleTypesFactory; +import org.exolab.castor.xml.schema.XMLType; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; + + +public class DimensionTableModel extends AbstractTableModel { + + ElementDecl model; + ArrayList columnHeadings = new ArrayList(); + ArrayList> columnClasses = new ArrayList>(); + ArrayList columnDecls = new ArrayList(); + ArrayList colReadOnly = new ArrayList(); + ArrayList colHelp = new ArrayList(); + ArrayList rows = new ArrayList(); + ArrayList elements = new ArrayList(); + boolean readOnly; + + public DimensionTableModel(ElementDecl model, boolean readOnly) throws StructuralException { + XMLType modelContent = model.getType(); + this.model = model; + this.readOnly = readOnly; + // use text node for simple types + if (modelContent.isSimpleType()) { + SimpleType elementType = (SimpleType)modelContent; + SimpleType baseType = elementType.getBuiltInBaseType(); + addColumn(model.getName(), baseType, baseType.getTypeCode(), new Boolean(model.getFixedValue() != null)); + } + else if (modelContent.isComplexType()) { // if complex type, process child elements + ComplexType elementType = (ComplexType)modelContent; + + // find out if a CDATA type is used for this complex type + XMLType baseType = elementType.getBaseType(); + while (!(baseType instanceof SimpleType) && baseType != null) { + baseType = baseType.getBaseType(); + } + if (baseType != null) { + int typeCode = ((SimpleType)baseType).getTypeCode(); + addColumn(model.getName(), baseType, typeCode, new Boolean(model.getFixedValue() != null)); + } + // process attributes + for (Enumeration e = elementType.getAttributeDecls(); e.hasMoreElements();) { + AttributeDecl thisAttr = (AttributeDecl)e.nextElement(); + // HACK: if we don't resolve the reference, the type will be null + if (thisAttr.isReference()) thisAttr = thisAttr.getReference(); + if (thisAttr.getSimpleType() == null) + throw new StructuralException("Attribute "+thisAttr.getName()+" in "+model.getName()+" has no type"); + addColumn(thisAttr.getName(), thisAttr, thisAttr.getSimpleType().getTypeCode(), new Boolean(thisAttr.isFixed())); + } + + // enumerate child elements + enumerateElements(elementType); + } + } + + public synchronized void addColumn(String heading, Annotated decl, int typeCode, Boolean readOnly) { + Logger.msg(8, "Column "+heading+" contains "+decl.getClass().getName()+" readOnly="+readOnly.toString()); + columnHeadings.add(heading); + columnDecls.add(decl); + columnClasses.add(OutcomeStructure.getJavaClass(typeCode)); + colReadOnly.add(readOnly); + + // read help + String helpText; + if (decl instanceof SimpleType) + helpText = OutcomeStructure.extractHelp(model); + else + helpText = OutcomeStructure.extractHelp(decl); + + if (helpText.length() == 0) + helpText = ""+Language.translate("No help is available for this cell")+""; + + colHelp.add(helpText); + + } + + + public void enumerateElements(ContentModelGroup group) throws StructuralException { + for (Enumeration childElements = group.enumerate(); childElements.hasMoreElements(); ) { + Particle thisParticle = (Particle)childElements.nextElement(); + String extraHeader = ""; + if (thisParticle instanceof Group) { + Group thisGroup = (Group)thisParticle; + Order order = thisGroup.getOrder(); + if (order == Order.sequence || order == Order.all) + enumerateElements(thisGroup); + else // we only support sequences in data structures such as these + throw new StructuralException("Element "+thisGroup.getName()+". Expecting sequence or all. Got "+thisGroup.getOrder()); + } + else if (thisParticle instanceof ElementDecl) { + ElementDecl thisElement = (ElementDecl)thisParticle; + int typeCode = SimpleTypesFactory.INVALID_TYPE; + //make sure not too complex + if (thisElement.getType() != null) { + if (thisElement.getType().isComplexType()) { + ComplexType elementType = (ComplexType)thisElement.getType(); + if (elementType.getParticleCount() > 0 || + thisElement.getMaxOccurs() > 1) + throw new StructuralException("Too deep for a table"); + for (Enumeration attrs = elementType.getAttributeDecls(); attrs.hasMoreElements();) { + AttributeDecl thisAttr = (AttributeDecl)attrs.nextElement(); + if (!thisAttr.isFixed()) + throw new StructuralException("Non-fixed attributes of child elements not supported in tables."); + else + extraHeader=extraHeader+" ("+thisAttr.getName()+":"+(thisAttr.getFixedValue()!=null?thisAttr.getFixedValue():thisAttr.getDefaultValue())+")"; + } + // find type + XMLType parentType = thisElement.getType(); + while (!(parentType instanceof SimpleType) && parentType != null) { + parentType = parentType.getBaseType(); + if (parentType != null) typeCode = ((SimpleType)parentType).getTypeCode(); + } + } + else + typeCode = ((SimpleType)thisElement.getType()).getTypeCode(); + } + + //add to list + addColumn(thisElement.getName()+extraHeader, thisElement, typeCode, new Boolean(thisElement.getFixedValue() != null)); + } + else throw new StructuralException("Particle "+thisParticle.getClass()+" not implemented"); + } + } + + public void addInstance(Element myElement, int index) throws OutcomeException { + if (index == -1) index = elements.size(); + Object[] newRow = new Object[columnHeadings.size()]; + for (int i=0; i getColumnClass(int columnIndex) { + return columnClasses.get(columnIndex); + } + + @Override + public String getColumnName(int columnIndex) { + return columnHeadings.get(columnIndex); + } + + @Override + public int getRowCount() { + return rows.size(); + } + + @Override + public int getColumnCount() { + return columnHeadings.size(); + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + boolean isReadOnly = readOnly || colReadOnly.get(columnIndex).booleanValue(); + return !isReadOnly; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + Object[] thisRow = rows.get(rowIndex); + thisRow[columnIndex]=aValue; + Element myElement = elements.get(rowIndex); + // update node + if (columnDecls.get(columnIndex) instanceof ElementDecl) { // sub element + ElementDecl thisDecl = (ElementDecl)columnDecls.get(columnIndex); + NodeList childElements = myElement.getElementsByTagName(thisDecl.getName()); + // depend on one element with a Text child - this should have been enforced on init. + Text childNode = (Text)(childElements.item(0).getFirstChild()); + childNode.setData(aValue.toString()); + } + else if (columnDecls.get(columnIndex) instanceof AttributeDecl) { //attribute + AttributeDecl thisDecl = (AttributeDecl) columnDecls.get(columnIndex); + myElement.setAttribute(thisDecl.getName(), aValue.toString()); + } + else { // first child node + Text textNode = (Text)myElement.getFirstChild(); + textNode.setData(aValue.toString()); + } + fireTableCellUpdated(rowIndex, columnIndex); + } + + public Element removeRow(int rowIndex) { + Element elementToGo = elements.get(rowIndex); + elements.remove(rowIndex); + rows.remove(rowIndex); + fireTableRowsDeleted(rowIndex,rowIndex); + return elementToGo; + } + + public Object setupDefaultElement(ElementDecl thisDecl, Element parent, Class type) { + Object newValue; + String defaultValue = thisDecl.getFixedValue(); + if (defaultValue == null) + defaultValue = thisDecl.getDefaultValue(); + if (readOnly) + newValue = ""; + else + newValue = OutcomeStructure.getTypedValue(defaultValue, type); + + Text newNode = parent.getOwnerDocument().createTextNode(newValue.toString()); + parent.appendChild(newNode); + // fixed attributes + try { + ComplexType content = (ComplexType)thisDecl.getType(); + for (Enumeration attrs = content.getAttributeDecls(); attrs.hasMoreElements();) { + AttributeDecl thisAttr = (AttributeDecl)attrs.nextElement(); + parent.setAttribute(thisAttr.getName(), thisAttr.getFixedValue()!=null?thisAttr.getFixedValue():thisAttr.getDefaultValue()); + } + } catch (ClassCastException ex) { } // only complex types have attributes + return newValue; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + Object[] thisRow = rows.get(rowIndex); + if (!(getColumnClass(columnIndex).equals(thisRow[columnIndex].getClass()))) + Logger.warning(thisRow[columnIndex]+" should be "+getColumnClass(columnIndex)+" is a "+thisRow[columnIndex].getClass().getName()); + return thisRow[columnIndex]; + } + + public String validateStructure() { // remove empty rows + for (int j=0; j < rows.size(); j++) { + Object[] elems = rows.get(j); + boolean empty = true; + for (int i = 0; i < elems.length && empty; i++) + empty &= OutcomeStructure.isEmpty(elems[i]); + if (empty) + if (model.getMinOccurs() < rows.size()) + removeRow(j); + else + return "Too many empty rows in table "+model.getName(); + } + return null; + } + + public Element initNew(Document parent, int index) { + if (index == -1) index = elements.size(); + Object[] newRow = new Object[columnHeadings.size()]; + Element myElement = parent.createElement(model.getName()); + for (int i=0; i"+Language.translate("Help")+""; + + public HelpPane() { + super(); + setEditable(false); + setEditorKit(new HTMLEditorKit()); + setContentType("text/html"); + setPreferredSize(new java.awt.Dimension(200,400)); + } + + public void setHelp(String title, String helpText) { + setText(header+"

"+title+"


"+toHTML(helpText)); + } + + + /** + * Unfortunately JEditorPane will only display HTML3.2, whereas to embed HTML in an xsd we must + * use XHTML so it will be valid XML. This method does a quick and dirty removal of stuff that + * the JEditorPane cannot display + * + * @param xhtml + * @return + */ + public static String toHTML(String xhtml) { + int startPos, endPos; + //remove xml header + while((startPos = xhtml.indexOf("")) != -1) { + xhtml = xhtml.substring(0,startPos)+xhtml.substring(endPos+2); + } + // remove slash in + while ((startPos = xhtml.indexOf("/>")) != -1) { + xhtml = xhtml.substring(0, startPos)+xhtml.substring(startPos+1); + } + return xhtml; + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/MultiLinePasteAdapter.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/MultiLinePasteAdapter.java new file mode 100644 index 0000000..efb0ba9 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/MultiLinePasteAdapter.java @@ -0,0 +1,143 @@ +package org.cristalise.gui.tabs.outcome.form; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.util.StringTokenizer; + +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.KeyStroke; + +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.utils.Logger; + +/** +* ExcelAdapter enables Copy-Paste Clipboard functionality on JTables. +* The clipboard data format used by the adapter is compatible with +* the clipboard format used by Excel. This provides for clipboard +* interoperability between enabled JTables and Excel. +*/ +public class MultiLinePasteAdapter implements ActionListener { + private String rowstring, value; + private Clipboard system; + private StringSelection stsel; + private JTable jTable1; + private Dimension parent; + /** + * The Excel Adapter is constructed with a + * JTable on which it enables Copy-Paste and acts + * as a Clipboard listener. + */ + public MultiLinePasteAdapter(JTable myJTable, Dimension parent) { + jTable1 = myJTable; + this.parent = parent; + KeyStroke copy = + KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK, false); + // Identifying the copy KeyStroke user can modify this + // to copy on some other Key combination. + KeyStroke paste = + KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK, false); + // Identifying the Paste KeyStroke user can modify this + //to copy on some other Key combination. + jTable1.registerKeyboardAction( + this, + "Copy", + copy, + JComponent.WHEN_FOCUSED); + jTable1.registerKeyboardAction( + this, + "Paste", + paste, + JComponent.WHEN_FOCUSED); + system = Toolkit.getDefaultToolkit().getSystemClipboard(); + } + /** + * Public Accessor methods for the Table on which this adapter acts. + */ + public JTable getJTable() { + return jTable1; + } + public void setJTable(JTable jTable1) { + this.jTable1 = jTable1; + } + /** + * This method is activated on the Keystrokes we are listening to + * in this implementation. Here it listens for Copy and Paste ActionCommands. + * Selections comprising non-adjacent cells result in invalid selection and + * then copy action cannot be performed. + * Paste is done by aligning the upper left corner of the selection with the + * 1st element in the current selection of the JTable. + */ + @Override + public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().compareTo("Copy") == 0) { + StringBuffer sbf = new StringBuffer(); + // Check to ensure we have selected only a contiguous block of + // cells + int numcols = jTable1.getSelectedColumnCount(); + int numrows = jTable1.getSelectedRowCount(); + int[] rowsselected = jTable1.getSelectedRows(); + int[] colsselected = jTable1.getSelectedColumns(); + if (!((numrows - 1 + == rowsselected[rowsselected.length - 1] - rowsselected[0] + && numrows == rowsselected.length) + && (numcols - 1 + == colsselected[colsselected.length - 1] - colsselected[0] + && numcols == colsselected.length))) { + JOptionPane.showMessageDialog( + null, + "Invalid Copy Selection", + "Invalid Copy Selection", + JOptionPane.ERROR_MESSAGE); + return; + } + for (int i = 0; i < numrows; i++) { + for (int j = 0; j < numcols; j++) { + sbf.append( + jTable1.getValueAt(rowsselected[i], colsselected[j])); + if (j < numcols - 1) + sbf.append("\t"); + } + sbf.append("\n"); + } + stsel = new StringSelection(sbf.toString()); + system = Toolkit.getDefaultToolkit().getSystemClipboard(); + system.setContents(stsel, stsel); + } + if (e.getActionCommand().compareTo("Paste") == 0) { + Logger.msg(5, "Trying to Paste"); + int startRow = (jTable1.getSelectedRows())[0]; + int startCol = (jTable1.getSelectedColumns())[0]; + try { + String trstring = + (String) (system.getContents(this).getTransferData(DataFlavor.stringFlavor)); + Logger.msg(8, "String is:" + trstring); + StringTokenizer st1 = new StringTokenizer(trstring, "\n\r"); + for (int i = 0; st1.hasMoreTokens(); i++) { + rowstring = st1.nextToken(); + StringTokenizer st2 = new StringTokenizer(rowstring, "\t"); + for (int j = 0; st2.hasMoreTokens(); j++) { + value = st2.nextToken(); + if (startRow + i == jTable1.getRowCount()) + parent.addRow(startRow+i); + if (startRow + i < jTable1.getRowCount() + && startCol + j < jTable1.getColumnCount()) + jTable1.setValueAt( + value, + startRow + i, + startCol + j); + Logger.msg(5, "Putting "+value+" at row="+(startRow+i)+" column="+(startCol+j)); + } + } + } catch (Exception ex) { + MainFrame.exceptionDialog(ex); + } + + } + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomeEditor.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomeEditor.java new file mode 100644 index 0000000..f0ef2b2 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomeEditor.java @@ -0,0 +1,216 @@ +package org.cristalise.gui.tabs.outcome.form; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; + +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JOptionPane; + +import org.cristalise.kernel.persistency.outcome.OutcomeValidator; +import org.cristalise.kernel.persistency.outcome.Schema; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.Logger; + + + +class OutcomeEditor extends JFrame implements ActionListener { + + boolean readOnly = false; + File schemaFile = null; + File instanceFile = null; + JFileChooser chooser; + OutcomePanel outcome; + OutcomeValidator thisValid; + + public OutcomeEditor(File schema, File instance, boolean readOnly) { + URL schemaURL = null; + URL instanceURL = null; + schemaFile = schema; + instanceFile = instance; + this.readOnly = readOnly; + + try { + chooser = new JFileChooser(); + chooser.setCurrentDirectory(new File(new File(".").getCanonicalPath())); + } catch (IOException e) { + System.out.println("Could not initialise file dialog"); + System.exit(0); + } + + + this.setTitle("Outcome Editor"); + GridBagLayout gridbag = new GridBagLayout(); + getContentPane().setLayout(gridbag); + + addWindowListener( + new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent evt) { + System.exit(0); + } + } + ); + // select files if url is empty + + if (schemaFile == null) { // prompt for schema + schemaFile = getFile("Choose Schema File", "xsd"); + if (schemaFile == null) { + System.out.println("Cannot function without a schema"); + System.exit(1); + } + } + + try { + schemaURL = schemaFile.toURI().toURL(); + } catch (Exception e) { + System.out.println("Invalid schema URL"); + System.exit(1); + } + + if (instanceFile == null) { // prompt for schema + instanceFile = getFile("Choose Instance File", "xml"); + } + + try { + instanceURL = instanceFile.toURI().toURL(); + } catch (Exception e) { } + + try { + if (instanceFile != null && instanceFile.exists()) + outcome = new OutcomePanel(schemaURL, instanceURL, readOnly); + else + outcome = new OutcomePanel(schemaURL, readOnly); + + Schema thisSchema = new Schema(schemaURL.getFile(), -1, FileStringUtility.url2String(schemaURL)); + thisValid = OutcomeValidator.getValidator(thisSchema); + + } catch (Exception e) { e.printStackTrace(); System.exit(0);} + + + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; c.gridy = 0; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1.0; c.weighty = 1.0; + c.gridwidth = 2; c.ipadx = 5; c.ipady = 5; + gridbag.setConstraints(outcome, c); + this.getContentPane().add(outcome); + + JButton saveButton = new JButton("Save"); + saveButton.setActionCommand("save"); + saveButton.addActionListener(this); + c.gridy++; c.weighty = 0; c.gridwidth = 1; + gridbag.setConstraints(saveButton, c); + this.getContentPane().add(saveButton); + if (readOnly) saveButton.setEnabled(false); + + JButton saveAsButton = new JButton("Save As"); + saveAsButton.setActionCommand("saveas"); + saveAsButton.addActionListener(this); + c.gridx++; c.weighty = 0; + gridbag.setConstraints(saveAsButton, c); + this.getContentPane().add(saveAsButton); + if (readOnly) saveAsButton.setEnabled(false); + System.out.println("Building Outcome Panel. Please wait . . ."); + outcome.run(); + pack(); + setVisible(true); + super.toFront(); + + } + + public File getFile(String title, String fileType) { + File targetFile = null; + chooser.setFileFilter(new SimpleFilter(fileType)); + chooser.setDialogTitle(title); + int returnVal = chooser.showDialog(this, "Select"); + if (returnVal == JFileChooser.APPROVE_OPTION) { + targetFile = chooser.getSelectedFile(); + } + try { + System.out.println(fileType+"="+targetFile.toURI().toURL()); + } catch (Exception ex) { } + return targetFile; + } + + public static void usage() { + System.out.println("-schema file:///schema.xsd"); + System.out.println("-inst file:///instance.xml"); + System.out.println("Leave one out to get a file open box."); + System.exit(0); + } + public static void main( String[] argv ) { + Logger.addLogStream(System.out, 6); + File instance = null; + File schema = null; + boolean readOnly = false; + for (int i = 0; i < argv.length; i++) { + if (argv[i].equals("-schema")) + schema = new File(argv[++i]); + if (argv[i].equals("-inst")) + instance = new File(argv[++i]); + if (argv[i].equals("-readOnly")) + readOnly = true; + if (argv[i].equals("-help") || argv[i].equals("-h")) + usage(); + } + new OutcomeEditor(schema, instance, readOnly); + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().indexOf("save") == 0) { + String output; + output = outcome.getOutcome(); + + String errors = thisValid.validate(output); + if (errors != null && errors.length() > 0) { + int choice = JOptionPane.showConfirmDialog(null, errors+"\n\nSave anyway?", "Errors validating document", JOptionPane.YES_NO_OPTION); + if (choice != JOptionPane.YES_OPTION) + return; + } + + if (instanceFile == null || e.getActionCommand().equals("saveas")) { + instanceFile = getFile("Choose Instance File", "xml"); + if (instanceFile == null) { + System.out.println(output); + return; + } + } + try { + FileOutputStream targetStream = new FileOutputStream(instanceFile); + targetStream.write(output.getBytes()); + targetStream.close(); + } catch (Exception ex) {ex.printStackTrace();} + } + } + + private class SimpleFilter extends javax.swing.filechooser.FileFilter { + String extension; + + public SimpleFilter(String extension) { + super(); + this.extension = extension; + } + + @Override + public String getDescription() { + return extension.toUpperCase()+" Files"; + } + + @Override + public boolean accept(File f) { + if ((f.isFile() && f.getName().endsWith(extension.toLowerCase())) || f.isDirectory()) { + return true; + } + return false; + } + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomePanel.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomePanel.java new file mode 100644 index 0000000..e3f4622 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomePanel.java @@ -0,0 +1,348 @@ +package org.cristalise.gui.tabs.outcome.form; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.net.URL; + +import javax.swing.Box; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextArea; +import javax.swing.SwingConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.tabs.outcome.InvalidOutcomeException; +import org.cristalise.gui.tabs.outcome.InvalidSchemaException; +import org.cristalise.gui.tabs.outcome.OutcomeException; +import org.cristalise.gui.tabs.outcome.OutcomeHandler; +import org.cristalise.gui.tabs.outcome.OutcomeNotInitialisedException; +import org.cristalise.kernel.persistency.outcome.Outcome; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.Logger; +import org.exolab.castor.xml.schema.ElementDecl; +import org.exolab.castor.xml.schema.Schema; +import org.exolab.castor.xml.schema.reader.SchemaReader; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + + +// will load the outcome as instructed by other bits of the gui +// provides the 'save' button and creates the trees of objects to feed to the outcome form + +public class OutcomePanel extends JPanel implements OutcomeHandler +{ + + Schema schemaSOM; + //ASModel schemaASModel; + Document outcomeDOM; + OutcomeStructure documentRoot; + DocumentBuilder parser; + boolean readOnly; + boolean useForm = true; + boolean panelBuilt = false; + boolean unsaved = false; + JScrollPane scrollpane = new JScrollPane(); + HelpPane help = new HelpPane(); + + JTextArea basicView; + + public OutcomePanel() + { + GridBagLayout gridbag = new java.awt.GridBagLayout(); + setLayout(gridbag); + + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setValidating(false); + dbf.setNamespaceAware(false); + try + { + parser = dbf.newDocumentBuilder(); + } + catch (ParserConfigurationException e) + { + e.printStackTrace(); + } + + // Set up panel + + JComponent pane; + if (!MainFrame.getPref("ShowHelp", "true").equals("true")) + pane = scrollpane; + else { + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, scrollpane, help); + splitPane.setOneTouchExpandable(true); + splitPane.setDividerSize(9); + pane = splitPane; + } + + GridBagConstraints c = new GridBagConstraints(); + + c.gridx = 0; + c.gridy = 0; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1.0; + c.weighty = 1.0; + c.ipadx = 5; + c.ipady = 5; + + gridbag.setConstraints(pane, c); + this.add(pane); + } + + public OutcomePanel(boolean readOnly) + { + this(); + setReadOnly(readOnly); + } + + public OutcomePanel(String schema, boolean readOnly) throws OutcomeException + { + this(readOnly); + this.setDescription(schema); + } + + public OutcomePanel(String schema, String outcome, boolean readOnly) throws OutcomeException + { + this(readOnly); + this.setDescription(schema); + this.setOutcome(outcome); + } + + // Parse from URLS + public void setOutcome(URL outcomeURL) throws InvalidOutcomeException + { + + try + { + setOutcome(new InputSource(outcomeURL.openStream())); + } + catch (IOException ex) + { + throw new InvalidOutcomeException("Error creating instance DOM tree: " + ex); + } + } + + public void setDescription(URL schemaURL) throws InvalidSchemaException + { + Logger.msg(7, "OutcomePanel.setDescription() - schemaURL:" + schemaURL.toString()); + try + { + setDescription(new InputSource(schemaURL.openStream())); + } + catch (IOException ex) + { + throw new InvalidSchemaException("Error creating exolab schema object: " + ex); + } + + } + + public OutcomePanel(URL schemaURL, boolean readOnly) throws OutcomeException + { + this(readOnly); + this.setDescription(schemaURL); + } + + public OutcomePanel(URL schemaURL, URL outcomeURL, boolean readOnly) throws OutcomeException + { + this(readOnly); + this.setDescription(schemaURL); + this.setOutcome(outcomeURL); + } + + // Parse from Strings + @Override + public void setOutcome(String outcome) throws InvalidOutcomeException + { + + try + { + setOutcome(new InputSource(new StringReader(outcome))); + } + catch (IOException ex) + { + throw new InvalidOutcomeException("Error creating instance DOM tree: " + ex); + } + } + + @Override + public void setDescription(String schema) throws InvalidSchemaException + { + if (schema == null) + throw new InvalidSchemaException("Null schema supplied"); + try + { + setDescription(new InputSource(new StringReader(schema))); + } + catch (Exception ex) + { + Logger.error(ex); + } + + } + + @Override + public void setReadOnly(boolean readOnly) + { + this.readOnly = readOnly; + } + + public void setDescription(InputSource schemaSource) throws InvalidSchemaException, IOException + { + + SchemaReader mySchemaReader = new SchemaReader(schemaSource); + this.schemaSOM = mySchemaReader.read(); + } + + public void setOutcome(InputSource outcomeSource) throws InvalidOutcomeException, IOException + { + try + { + outcomeDOM = parser.parse(outcomeSource); + } + catch (SAXException ex) + { + throw new InvalidOutcomeException("Sax error parsing Outcome " + ex); + } + } + + @Override + public void run() + { + Thread.currentThread().setName("Outcome Panel Builder"); + try + { + makeDisplay(); + } + catch (Exception oe) + { + scrollpane.setViewportView(new JLabel("Outcome View Generation Failed: " + oe.getMessage())); + Logger.error(oe); + } + } + + public void makeDisplay() + { + try + { + initPanel(); + } + catch (OutcomeException ex) + { + // something went wrong + useForm = false; + Box textPanel = Box.createVerticalBox(); + JLabel errorMsg = new JLabel("Could not create outcome view: " + ex.getMessage()); + errorMsg.setHorizontalAlignment(SwingConstants.LEFT); + textPanel.add(errorMsg); + textPanel.add(Box.createVerticalGlue()); + if (outcomeDOM!=null) { + basicView = new JTextArea(Outcome.serialize(outcomeDOM, true)); + basicView.setEnabled(!readOnly); + textPanel.add(basicView); + } + scrollpane.setViewportView(textPanel); + } + } + + public void initPanel() throws OutcomeException + { + Element docElement; + /*if (panelBuilt) + return;*/ + Logger.msg(5, "Initialising Panel.."); + scrollpane.setViewportView(new JLabel("Building outcome. Please hang on two ticks . . .")); + if (schemaSOM == null) + throw new InvalidSchemaException("A valid schema has not been supplied."); + // create root panel with element declaration and maybe root document element node + + //find the root element declaration in the schema - may need to look for annotation?? + ElementDecl rootElementDecl = null; + docElement = (outcomeDOM == null) ? null : outcomeDOM.getDocumentElement(); + + for (ElementDecl elementDecl: schemaSOM.getElementDecls()) + { + rootElementDecl = elementDecl; + // REVISIT: We don't detect which is the most likely root element if there is more than one root decl + // xmlspy looks for an element not referenced elsewhere. simple but hard + // if we already have a document then use its root element to find the right decl + if (docElement != null && docElement.getTagName().equals(rootElementDecl.getName())) + break; + } + + if (rootElementDecl == null) + throw new InvalidSchemaException("No root elements defined"); + documentRoot = new DataRecord(rootElementDecl, readOnly, help, false); + + Logger.msg(5, "Finished structure. Populating..."); + if (docElement == null) + { + outcomeDOM = parser.newDocument(); + docElement = documentRoot.initNew(outcomeDOM); + outcomeDOM.appendChild(docElement); + } + else + documentRoot.addInstance(docElement, outcomeDOM); + + // got a fully rendered Outcome! put it in the scrollpane + // initialise container panel + + JTabbedPane outcomeTab = new JTabbedPane(); + outcomeTab.addTab(rootElementDecl.getName(), documentRoot); + outcomeTab.setSelectedIndex(0); + + scrollpane.setViewportView(outcomeTab); + panelBuilt = true; + + revalidate(); + doLayout(); + if (!readOnly) + documentRoot.grabFocus(); + } + + @Override + public JPanel getPanel() throws OutcomeNotInitialisedException + { + return this; + } + + @Override + public String getOutcome() + { + if (useForm) + { + documentRoot.validateStructure(); + return Outcome.serialize(outcomeDOM, false); + } + else + { + return basicView.getText(); + } + } + + @Override + public boolean isUnsaved() { + return unsaved; + } + + @Override + public void saved() { + unsaved = false; + } + + @Override + public void export(File targetFile) throws Exception { + FileStringUtility.string2File(targetFile, getOutcome()); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomeStructure.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomeStructure.java new file mode 100644 index 0000000..d6047c7 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/OutcomeStructure.java @@ -0,0 +1,283 @@ +package org.cristalise.gui.tabs.outcome.form; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashMap; + +import javax.swing.ImageIcon; +import javax.swing.JPanel; + +import org.cristalise.gui.tabs.outcome.OutcomeException; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; +import org.exolab.castor.types.AnyNode; +import org.exolab.castor.xml.schema.Annotated; +import org.exolab.castor.xml.schema.Annotation; +import org.exolab.castor.xml.schema.ComplexType; +import org.exolab.castor.xml.schema.ContentModelGroup; +import org.exolab.castor.xml.schema.Documentation; +import org.exolab.castor.xml.schema.ElementDecl; +import org.exolab.castor.xml.schema.Group; +import org.exolab.castor.xml.schema.ModelGroup; +import org.exolab.castor.xml.schema.Order; +import org.exolab.castor.xml.schema.Particle; +import org.exolab.castor.xml.schema.SimpleType; +import org.exolab.castor.xml.schema.SimpleTypesFactory; +import org.exolab.castor.xml.schema.XMLType; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + + +// contains child outcome elements - creates new ones +public abstract class OutcomeStructure extends JPanel { + + ElementDecl model; + Element myElement = null; + boolean readOnly; + HashMap subStructure = new HashMap(); + ArrayList order = new ArrayList(); + String help = ""+Language.translate("No help is available for this element")+""; + HelpPane helpPane; + boolean deferChild = false; + + public OutcomeStructure(ElementDecl model, boolean readOnly , HelpPane helpPane) { + this.model = model; + this.readOnly = readOnly; + this.helpPane = helpPane; + subStructure = new HashMap(); + Logger.msg(8, "Creating " + model.getName() + " structure as " + + this.getClass().getName().substring(this.getClass().getName().lastIndexOf('.') + 1)); + + String doc = extractHelp(model); + if (doc.length() > 0) help = doc; + } + + public boolean getReadOnly() { + return readOnly; + } + /** Contains the rules for deciding which OutcomeStructure will represent a chosen Element Declaration. + * In this order + *
    + *
  1. if maxOccurs>1 then Dimension + *
  2. SimpleTypes are Fields + *
  3. No element children is a Field + *
  4. Everything else is a DataRecord + *
+ */ + public OutcomeStructure createStructure(ElementDecl model, boolean readOnly, HelpPane help) throws OutcomeException { + XMLType elementType = model.getType(); + ComplexType elementComplexType; + + if (model.getMaxOccurs() == 0) return null; + + // if more than one can occur - dimension + if (model.getMaxOccurs() > 1 + || model.getMaxOccurs() == Particle.UNBOUNDED + || model.getMinOccurs() == 0) + return new Dimension(model, readOnly, help); + + // must have a type from now on + if (elementType == null) + throw new StructuralException("Element "+model.getName()+" is elementary yet has no type."); + // simple types will be fields + if (elementType instanceof SimpleType) return new Field(model, readOnly, help); + + // otherwise is a complex type + try { + elementComplexType = (ComplexType)elementType; + } + catch (ClassCastException e) { + throw new StructuralException("Unknown XMLType for element " + model.getName()); + } + + //when no element children - field + if (elementComplexType.getParticleCount() == 0) return new Field(model, readOnly, help); + + //everything else is a data record + return new DataRecord(model, readOnly, help, deferChild); + } + + /** Extracts child Element declarations from a content group and recursively from any group + * (not Element) of that group. calls createStructure() to find the corresponding OutcomeStructure + * then adds it to this structure. + */ + public void enumerateElements(ContentModelGroup group) throws OutcomeException { + + // process base types first if complex type + //HACK: castor does not include elements from basetype, so we do it manually. if they fix it, this will duplicate child elements. + if (group instanceof ComplexType) { + XMLType base = ((ComplexType)group).getBaseType(); + if (base instanceof ComplexType) + enumerateElements((ComplexType)base); + } + + for (Enumeration elements = group.enumerate(); elements.hasMoreElements(); ) { + Particle thisParticle = (Particle)elements.nextElement(); + if (thisParticle instanceof Group) { + Group thisGroup = (Group)thisParticle; + if (thisGroup instanceof ModelGroup) { + // HACK: Castor strangeness - model groups don't seem to resolve their own references. If fixed, this will still work + ModelGroup thisModel = (ModelGroup)thisGroup; + if (thisModel.hasReference()) thisGroup = thisModel.getReference(); + } + Order thisOrder = thisGroup.getOrder(); + if (thisOrder == Order.sequence || thisOrder == Order.all) enumerateElements(thisGroup); + else // we only support sequences in data structures such as these + throw new StructuralException("The '"+thisGroup.getOrder()+"' group is not supported"); + } + else if (thisParticle instanceof ElementDecl) { + ElementDecl thisElement = (ElementDecl)thisParticle; + addStructure(createStructure(thisElement, readOnly, helpPane)); + } + else throw new StructuralException("Particle " + thisParticle.getClass() + " not implemented"); + } + } + + /** Adds a generated OutcomeStructure as a child of this one. A separate structure as is often overridden. + */ + public void addStructure(OutcomeStructure newElement) throws OutcomeException { + if (newElement == null) return; + subStructure.put(newElement.getName(), newElement); + order.add(newElement.getName()); + } + + /** After schema processing, addInstance() propogates the XML instance document down the layout. + * Most OutcomeStructures will throw an exception if called more than once, except Dimension, which is the only + * Outcome Structure to support maxOccurs>1 + */ + public abstract void addInstance(Element myElement, Document parentDoc) throws OutcomeException; + + public Element getElement() { + return myElement; + } + + @Override + public String getName() { + if (model == null) return null; + return model.getName(); + } + + public ElementDecl getModel() { + return model; + } + + public String getHelp() { + return help; + } + + public String validateStructure() { + StringBuffer errors = new StringBuffer(); + for (OutcomeStructure element : subStructure.values()) { + errors.append(element.validateStructure()); + } + return errors.toString(); + } + + public abstract Element initNew(Document parent); + + public static String extractHelp(Annotated model) { + Enumeration e = model.getAnnotations(); + StringBuffer doc = new StringBuffer(); + if (e.hasMoreElements()) { // look for HTML + Annotation note = (Annotation)e.nextElement(); + for (Enumeration g = note.getDocumentation(); g.hasMoreElements();) { + Documentation thisDoc = (Documentation)g.nextElement(); + for (Enumeration h = thisDoc.getObjects(); h.hasMoreElements();) { + AnyNode node = (AnyNode)h.nextElement(); + String line = node.toString(); + if (line.length() == 0) + line = node.getStringValue(); + if (line.length() > 0) { + doc.append(line).append("\n"); + } + } + } + } + + return doc.toString(); + } + + @Override + public abstract void grabFocus(); + + public static Class getJavaClass(int typeCode) { + switch (typeCode) { + + // boolean + case SimpleTypesFactory.BOOLEAN_TYPE: + return Boolean.class; + + // integers + case SimpleTypesFactory.INTEGER_TYPE: + case SimpleTypesFactory.NON_POSITIVE_INTEGER_TYPE: + case SimpleTypesFactory.NEGATIVE_INTEGER_TYPE: + case SimpleTypesFactory.NON_NEGATIVE_INTEGER_TYPE: + case SimpleTypesFactory.POSITIVE_INTEGER_TYPE: + case SimpleTypesFactory.INT_TYPE: + case SimpleTypesFactory.UNSIGNED_INT_TYPE: + case SimpleTypesFactory.SHORT_TYPE: + case SimpleTypesFactory.UNSIGNED_SHORT_TYPE: + case SimpleTypesFactory.LONG_TYPE: + case SimpleTypesFactory.UNSIGNED_LONG_TYPE: + case SimpleTypesFactory.BYTE_TYPE: + case SimpleTypesFactory.UNSIGNED_BYTE_TYPE: + return BigInteger.class; + // floats + case SimpleTypesFactory.FLOAT_TYPE: + case SimpleTypesFactory.DOUBLE_TYPE: + case SimpleTypesFactory.DECIMAL_TYPE: + return BigDecimal.class; + + // images + case SimpleTypesFactory.BASE64BINARY_TYPE: + case SimpleTypesFactory.HEXBINARY_TYPE: + return ImageIcon.class; + + // everything else is a string for now + default: + return String.class; + } + } + + public static Object getTypedValue(String value, Class type) { + try { + if (type.equals(Boolean.class)) + if (value == null || value.equals("")) + return Boolean.FALSE; + else + return Boolean.valueOf(value); + else if (type.equals(BigInteger.class)) + if (value == null || value.equals("")) + return new BigInteger("0"); + else + return new BigInteger(value); + else if (type.equals(BigDecimal.class)) + if (value == null || value.equals("")) + return new BigDecimal(0); + else + return new BigDecimal(value); + } catch (Exception ex) { + Logger.error("Cannot convert value '"+value+"' to a "+type.getName()); + } + return value==null?"":value; + } + + public static boolean isEmpty(Object value) { + if (value == null) return true; + + if (value instanceof String) { + if (((String)value).length() == 0) return true; + } + else if (value instanceof Boolean) { + if (((Boolean)value).booleanValue() == false) return true; + } + else if (value instanceof BigInteger) { + if (((BigInteger)value).intValue() == 0) return true; + } + else if (value instanceof BigDecimal) { + if (((BigDecimal)value).floatValue() == 0.0) return true; + } + return false; + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/StructuralException.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/StructuralException.java new file mode 100644 index 0000000..5b1558a --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/StructuralException.java @@ -0,0 +1,12 @@ +package org.cristalise.gui.tabs.outcome.form; +import org.cristalise.gui.tabs.outcome.OutcomeException; + +public class StructuralException extends OutcomeException { + + public StructuralException() { + super(); + } + public StructuralException(String ex) { + super(ex); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ArrayEditField.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ArrayEditField.java new file mode 100644 index 0000000..4c1d031 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ArrayEditField.java @@ -0,0 +1,173 @@ +package org.cristalise.gui.tabs.outcome.form.field; + +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.text.JTextComponent; + +import org.cristalise.kernel.utils.Language; +import org.exolab.castor.xml.schema.SimpleType; + + +/************************************************************************** + * + * $Revision: 1.7 $ + * $Date: 2006/05/24 07:51:51 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class ArrayEditField extends StringEditField implements ActionListener { + + Box arrayBox; + Box expandBox; + Box editBox; + JScrollPane arrayView; + JButton arrayButton; + JButton expandButton; + JButton contractButton; + JButton addButton; + JButton removeButton; + ArrayTableModel arrayModel; + JLabel arrayLabel = new JLabel("Array"); + boolean panelShown = false; + boolean readOnly = false; + + public ArrayEditField(SimpleType type) { + arrayBox = Box.createVerticalBox(); + arrayBox.add(arrayLabel); + arrayButton = new JButton(Language.translate("Show")); + arrayButton.addActionListener(this); + arrayButton.setActionCommand("toggle"); + arrayBox.add(arrayButton); + + expandBox = Box.createHorizontalBox(); + expandButton = new JButton(">>"); + expandButton.setToolTipText("Increase the number of columns displaying this array"); + expandButton.addActionListener(this); + expandButton.setActionCommand("extend"); + + contractButton = new JButton("<<"); + contractButton.setToolTipText("Decrease the number of columns displaying this array"); + contractButton.addActionListener(this); + contractButton.setActionCommand("contract"); + + expandBox.add(contractButton); + expandBox.add(Box.createHorizontalGlue()); + expandBox.add(expandButton); + + arrayModel = new ArrayTableModel(type); + if (arrayModel.getColumnCount() < 2) contractButton.setEnabled(false); + arrayView = new JScrollPane(new JTable(arrayModel)); + + editBox = Box.createHorizontalBox(); + addButton = new JButton("+"); + addButton.setToolTipText("Add a field to the end of this array"); + addButton.addActionListener(this); + addButton.setActionCommand("add"); + removeButton = new JButton("-"); + removeButton.setToolTipText("Remove the last field from this array"); + removeButton.addActionListener(this); + removeButton.setActionCommand("remove"); + editBox.add(addButton); + editBox.add(Box.createHorizontalGlue()); + editBox.add(removeButton); + } + /** + * + */ + @Override + public String getDefaultValue() { + return ""; + } + /** + * + */ + @Override + public String getText() { + return arrayModel.getData(); + } + /** + * + */ + @Override + public void setText(String text) { + arrayModel.setData(text); + arrayLabel.setText("Array ("+arrayModel.getArrayLength()+" values)"); + } + /** + * + */ + @Override + public Component getControl() { + return arrayBox; + } + /** + * + */ + @Override + public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().equals("toggle")) { + arrayBox.removeAll(); + if (panelShown) { + arrayBox.add(arrayLabel); + arrayBox.add(Box.createVerticalStrut(7)); + arrayBox.add(arrayButton); + arrayButton.setText("Show"); + } + else { + arrayBox.add(arrayLabel); + arrayBox.add(Box.createVerticalStrut(7)); + arrayBox.add(arrayButton); + arrayBox.add(Box.createVerticalStrut(7)); + arrayBox.add(expandBox); + arrayBox.add(Box.createVerticalStrut(7)); + arrayBox.add(arrayView); + if (!readOnly) arrayBox.add(editBox); + arrayButton.setText("Hide"); + } + panelShown = !panelShown; + arrayBox.validate(); + } + else if (e.getActionCommand().equals("add")) { + arrayModel.addField(); + arrayLabel.setText("Array ("+arrayModel.getArrayLength()+" values)"); + } + else if (e.getActionCommand().equals("remove")) { + arrayModel.removeField(); + arrayLabel.setText("Array ("+arrayModel.getArrayLength()+" values)"); + } + else { + int currentCols = arrayModel.getColumnCount(); + if (e.getActionCommand().equals("extend")) + currentCols++; + else if (e.getActionCommand().equals("contract")) + currentCols--; + arrayModel.setColumnCount(currentCols); + contractButton.setEnabled(currentCols > 1); + } + + } + + /** + * + */ + @Override + public JTextComponent makeTextField() { + // not used by array + return null; + } + @Override + public void setEditable(boolean editable) { + readOnly = !editable; + arrayModel.setReadOnly(!readOnly); + } + +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ArrayTableModel.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ArrayTableModel.java new file mode 100644 index 0000000..f54e85a --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ArrayTableModel.java @@ -0,0 +1,113 @@ +package org.cristalise.gui.tabs.outcome.form.field; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.StringTokenizer; + +import javax.swing.table.AbstractTableModel; + +import org.cristalise.gui.tabs.outcome.form.OutcomeStructure; +import org.cristalise.kernel.utils.Language; +import org.exolab.castor.xml.schema.SimpleType; + + +/************************************************************************** + * + * $Revision: 1.2 $ + * $Date: 2006/05/24 07:51:53 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class ArrayTableModel extends AbstractTableModel { + + ArrayList contents = new ArrayList(); + Class type; + int numCols = 1; + boolean readOnly = false; + + public ArrayTableModel(SimpleType type) { + super(); + this.type = OutcomeStructure.getJavaClass(type.getTypeCode()); + } + + public void setReadOnly(boolean readOnly) { + this.readOnly = readOnly; + } + + public void setData(String data) { + contents.clear(); + StringTokenizer tok = new StringTokenizer(data); + while(tok.hasMoreTokens()) + contents.add(OutcomeStructure.getTypedValue(tok.nextToken(), type)); + fireTableStructureChanged(); + } + + public String getData() { + if (contents.size() == 0) return ""; + Iterator iter = contents.iterator(); + StringBuffer result = new StringBuffer(iter.next().toString()); + while (iter.hasNext()) + result.append(" ").append(iter.next().toString()); + return result.toString(); + } + + public void addField() { + contents.add(OutcomeStructure.getTypedValue("", type)); + fireTableStructureChanged(); + } + + public void removeField() { + contents.remove(contents.size()-1); + fireTableStructureChanged(); + } + + @Override + public Class getColumnClass(int columnIndex) { + return type; + } + + @Override + public int getColumnCount() { + return numCols; + } + + public int getArrayLength() { + return contents.size(); + } + + public void setColumnCount(int newCols) { + numCols = newCols; + fireTableStructureChanged(); + } + + @Override + public String getColumnName(int column) { + return Language.translate("Value"); + } + + @Override + public int getRowCount() { + return (contents.size()/numCols)+1; + } + + @Override + public Object getValueAt(int arg0, int arg1) { + int index = arg1+(arg0 * numCols); + if (index >= contents.size()) + return null; + return contents.get(arg1+(arg0 * numCols)); + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + if (columnIndex+(rowIndex*numCols) > contents.size()-1) return false; + return !readOnly; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + contents.set(columnIndex+(rowIndex*numCols), aValue); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/field/BooleanEditField.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/BooleanEditField.java new file mode 100644 index 0000000..f9b078e --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/BooleanEditField.java @@ -0,0 +1,76 @@ +package org.cristalise.gui.tabs.outcome.form.field; + +import java.awt.Component; +import java.awt.event.FocusEvent; + +import javax.swing.JCheckBox; +import javax.swing.text.JTextComponent; + +import org.cristalise.kernel.utils.Logger; + + +/************************************************************************** + * + * $Revision: 1.7 $ + * $Date: 2005/08/16 13:59:56 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ +public class BooleanEditField extends StringEditField { + + JCheckBox checkbox; + + public BooleanEditField() { + checkbox = new JCheckBox(); + checkbox.setSelected(false); + checkbox.addFocusListener(this); + } + + @Override + public String getText() { + return String.valueOf(checkbox.isSelected()); + } + + @Override + public void setText(String text) { + boolean newState = false; + try { + newState = Boolean.valueOf(text).booleanValue(); + } catch (Exception ex) { + Logger.error("Invalid value for checkbox: "+text); + } + checkbox.setSelected(newState); + } + + @Override + public void setEditable(boolean editable) { + super.setEditable(editable); + checkbox.setEnabled(editable); + } + + @Override + public Component getControl() { + return checkbox; + } + + @Override + public String getDefaultValue() { + return "false"; + } + + /** don't reserve the item finder for a boolean */ + @Override + public void focusGained(FocusEvent e) { + helpPane.setHelp(name, helpText); + } + + /** + * + */ + @Override + public JTextComponent makeTextField() { + // not used by boolean + return null; + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ComboField.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ComboField.java new file mode 100644 index 0000000..cb9b0ca --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ComboField.java @@ -0,0 +1,144 @@ +package org.cristalise.gui.tabs.outcome.form.field; + +import java.awt.Component; +import java.util.Enumeration; +import java.util.StringTokenizer; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JComboBox; +import javax.swing.text.JTextComponent; + +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.tabs.outcome.form.StructuralException; +import org.cristalise.kernel.scripting.Script; +import org.exolab.castor.types.AnyNode; +import org.exolab.castor.xml.schema.AttributeDecl; +import org.exolab.castor.xml.schema.ElementDecl; +import org.exolab.castor.xml.schema.Facet; +import org.exolab.castor.xml.schema.SimpleType; + + +/******************************************************************************* + * + * $Revision: 1.4 $ $Date: 2005/08/16 13:59:56 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research All + * rights reserved. + ******************************************************************************/ + +public class ComboField extends StringEditField { + + JComboBox comboField; + ListOfValues vals; + DefaultComboBoxModel comboModel; + AnyNode listNode; + + public ComboField(SimpleType type, AnyNode listNode) { + super(); + comboField = new JComboBox(); + content = type; + this.listNode = listNode; + createLOV(); + } + + @Override + public String getDefaultValue() { + if (vals.getDefaultKey() != null) + return vals.get(vals.getDefaultKey()).toString(); + else + return ""; + } + + @Override + public String getText() { + return vals.get(comboModel.getSelectedItem()).toString(); + } + + @Override + public JTextComponent makeTextField() { + // not used by this control + return null; + } + + @Override + public void setText(String text) { + comboModel.setSelectedItem(text); + } + + @Override + public Component getControl() { + return comboField; + } + + private void createLOV() { + vals = new ListOfValues(); + + if (listNode != null) { // schema instructions for list building + String lovType = listNode.getLocalName(); + String param = listNode.getFirstChild().getStringValue(); + if (lovType.equals("ScriptList")) + populateLOVFromScript(param); + if (lovType.equals("PathList")) + populateLOVFromLDAP(param); + } + + // handle enumerations + // TODO: should be ANDed with above results + if (content.hasFacet(Facet.ENUMERATION)) { + //ListOfValues andList = new ListOfValues(); + Enumeration enums = content.getFacets(Facet.ENUMERATION); + while (enums.hasMoreElements()) { + Facet thisEnum = enums.nextElement(); + vals.put(thisEnum.getValue(), thisEnum.getValue(), false); + } + } + + String[] keyArray = new String[vals.keySet().size()]; + comboModel = new DefaultComboBoxModel(vals.keySet().toArray(keyArray)); + comboModel.setSelectedItem(vals.getDefaultKey()); + comboField.setModel(comboModel); + } + + /** + * @param param + */ + private void populateLOVFromLDAP(String param) { + // TODO List of Values from LDAP properties, eg '/root/path;prop=val;prop=val' + + + } + + private void populateLOVFromScript(String scriptName) { + try { + StringTokenizer tok = new StringTokenizer(scriptName, "_"); + if (tok.countTokens() != 2) + throw new Exception("Invalid LOVScript name"); + Script lovscript = new Script(tok.nextToken(), Integer.parseInt(tok.nextToken())); + lovscript.setInputParamValue("LOV", vals); + lovscript.execute(); + } catch (Exception ex) { + MainFrame.exceptionDialog(ex); + } + } + + @Override + public void setDecl(AttributeDecl model) throws StructuralException { + super.setDecl(model); + createLOV(); + } + + @Override + public void setDecl(ElementDecl model) throws StructuralException { + super.setDecl(model); + createLOV(); + } + + /** + * + */ + + @Override + public void setEditable(boolean editable) { + comboField.setEditable(editable); + } +} \ No newline at end of file diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/field/DecimalEditField.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/DecimalEditField.java new file mode 100644 index 0000000..a829f85 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/DecimalEditField.java @@ -0,0 +1,119 @@ +package org.cristalise.gui.tabs.outcome.form.field; + +import java.awt.Toolkit; +import java.math.BigDecimal; + +import javax.swing.JTextField; +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.JTextComponent; +import javax.swing.text.PlainDocument; + +/************************************************************************** + * + * $Revision: 1.3 $ + * $Date: 2005/08/16 13:59:56 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ +public class DecimalEditField extends StringEditField { + + public DecimalEditField() { + super(); + field.addFocusListener(this); + field.setToolTipText("This field must contains a decimal number e.g. 3.14159265"); + } + + @Override + public String getText() { + return field.getText(); + } + + @Override + public void setText(String text) { + field.setText(text); + } + + @Override + public String getDefaultValue() { + return "0.0"; + } + + @Override + public JTextComponent makeTextField() { + return new DecimalTextField(); + } + + private class DecimalTextField extends JTextField { + + public DecimalTextField() { + super(); + setHorizontalAlignment(RIGHT); + } + @Override + protected Document createDefaultModel() { + return new Decimal(); + } + } + + private class Decimal extends PlainDocument { + + @Override + public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { + + if (str == null || str.equals("")) { + return; + } + + String proposedResult = null; + + if (getLength() == 0) { + proposedResult = str; + } else { + StringBuffer currentBuffer = new StringBuffer( this.getText(0, getLength()) ); + currentBuffer.insert(offs, str); + proposedResult = currentBuffer.toString(); + } + + try { + parse(proposedResult); + super.insertString(offs, str, a); + } catch (Exception e) { + Toolkit.getDefaultToolkit().beep(); + } + + } + + @Override + public void remove(int offs, int len) throws BadLocationException { + + String currentText = this.getText(0, getLength()); + String beforeOffset = currentText.substring(0, offs); + String afterOffset = currentText.substring(len + offs, currentText.length()); + String proposedResult = beforeOffset + afterOffset; + + if (proposedResult.length() == 0) { // empty is ok + super.remove(offs, len); + return; + } + try { + parse(proposedResult); + super.remove(offs, len); + } catch (Exception e) { + Toolkit.getDefaultToolkit().beep(); + } + + } + + public BigDecimal parse(String proposedResult) throws NumberFormatException { + + BigDecimal value = new BigDecimal(0); + if ( proposedResult.length() != 0) { + value = new BigDecimal(proposedResult); + } + return value; + } + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ImageEditField.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ImageEditField.java new file mode 100644 index 0000000..3744782 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ImageEditField.java @@ -0,0 +1,112 @@ +package org.cristalise.gui.tabs.outcome.form.field; + +import java.awt.Component; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileInputStream; +import java.lang.reflect.Array; + +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JLabel; + +import org.apache.xerces.impl.dv.util.Base64; +import org.cristalise.gui.MainFrame; + + +public class ImageEditField extends StringEditField { + + JLabel imageLabel; + + Box imagePanel; + + JButton browseButton; + + String encodedImage; + + static JFileChooser chooser = new JFileChooser(); + static { + chooser.addChoosableFileFilter(new javax.swing.filechooser.FileFilter() { + @Override + public String getDescription() { + return "Image Files"; + } + + @Override + public boolean accept(File f) { + return (f.isDirectory() || (f.isFile() && (f.getName() + .endsWith(".gif") + || f.getName().endsWith(".jpg") + || f.getName().endsWith(".jpeg") + || f.getName().endsWith(".png")))); + } + }); + } + + public ImageEditField() { + super(); + imageLabel = new JLabel(); + imagePanel = Box.createVerticalBox(); + browseButton = new JButton("Browse"); + browseButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int returnVal = chooser.showOpenDialog(null); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File file = chooser.getSelectedFile(); + try { + FileInputStream fis = new FileInputStream(file); + byte[] bArray = (byte[]) Array.newInstance(byte.class, + (int) file.length()); + fis.read(bArray, 0, (int) file.length()); + fis.close(); + + ImageIcon newImage = new ImageIcon(Toolkit + .getDefaultToolkit().createImage(bArray)); + imageLabel.setIcon(newImage); + encodedImage = Base64.encode(bArray); + } catch (Exception ex) { + MainFrame.exceptionDialog(ex); + } + } + } + }); + imagePanel.add(imageLabel); + imagePanel.add(Box.createVerticalStrut(5)); + imagePanel.add(browseButton); + } + + @Override + public String getDefaultValue() { + return ""; + } + + @Override + public Component getControl() { + return imagePanel; + } + + @Override + public String getText() { + return encodedImage == null ? "" : encodedImage; + } + + @Override + public void setText(String text) { + encodedImage = text; + if (text != null && text.length() > 0) { + byte[] decodedImage = Base64.decode(encodedImage); + imageLabel.setIcon(new ImageIcon(Toolkit.getDefaultToolkit() + .createImage(decodedImage))); + } + } + + @Override + public void setEditable(boolean editable) { + browseButton.setVisible(false); + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/field/IntegerEditField.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/IntegerEditField.java new file mode 100644 index 0000000..ebff113 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/IntegerEditField.java @@ -0,0 +1,119 @@ +package org.cristalise.gui.tabs.outcome.form.field; + +import java.awt.Toolkit; +import java.math.BigInteger; + +import javax.swing.JTextField; +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.JTextComponent; +import javax.swing.text.PlainDocument; + +/************************************************************************** + * + * $Revision: 1.4 $ + * $Date: 2005/08/16 13:59:56 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ +public class IntegerEditField extends StringEditField { + + public IntegerEditField() { + super(); + field.setToolTipText("This field must contains a whole number e.g. 3"); + } + + @Override + public String getText() { + return field.getText(); + } + + @Override + public void setText(String text) { + field.setText(text); + } + + @Override + public String getDefaultValue() { + return "0"; + } + + @Override + public JTextComponent makeTextField() { + return new IntegerTextField(); + } + + private class IntegerTextField extends JTextField { + + public IntegerTextField() { + super(); + setHorizontalAlignment(RIGHT); + } + @Override + protected Document createDefaultModel() { + return new IntegerDocument(); + } + } + + private class IntegerDocument extends PlainDocument { + + + @Override + public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { + + if (str == null || str.equals("")) { + return; + } + + String proposedResult = null; + + if (getLength() == 0) { + proposedResult = str; + } else { + StringBuffer currentBuffer = new StringBuffer( this.getText(0, getLength()) ); + currentBuffer.insert(offs, str); + proposedResult = currentBuffer.toString(); + } + + try { + parse(proposedResult); + super.insertString(offs, str, a); + } catch (Exception e) { + Toolkit.getDefaultToolkit().beep(); + } + + } + + @Override + public void remove(int offs, int len) throws BadLocationException { + + String currentText = this.getText(0, getLength()); + String beforeOffset = currentText.substring(0, offs); + String afterOffset = currentText.substring(len + offs, currentText.length()); + String proposedResult = beforeOffset + afterOffset; + if (proposedResult.length() == 0) { // empty is ok + super.remove(offs, len); + return; + } + + try { + parse(proposedResult); + super.remove(offs, len); + } catch (Exception e) { + Toolkit.getDefaultToolkit().beep(); + } + + } + + public BigInteger parse(String proposedResult) throws NumberFormatException { + + BigInteger value = new BigInteger("0"); + if ( proposedResult.length() != 0) { + value = new BigInteger(proposedResult); + } + return value; + } + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ListOfValues.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ListOfValues.java new file mode 100644 index 0000000..b56e6b8 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/ListOfValues.java @@ -0,0 +1,31 @@ +package org.cristalise.gui.tabs.outcome.form.field; + +import java.util.HashMap; + +/************************************************************************** + * + * $Revision: 1.2 $ + * $Date: 2005/04/26 06:48:12 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class ListOfValues extends HashMap { + + String defaultKey = null; + + public ListOfValues() { + super(); + } + + public String put(String key, String value, boolean isDefaultKey) { + if (isDefaultKey) defaultKey = key; + return (String)super.put(key, value); + } + + public String getDefaultKey() { + return defaultKey; + } + +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/field/LongStringEditField.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/LongStringEditField.java new file mode 100644 index 0000000..87ea82d --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/LongStringEditField.java @@ -0,0 +1,41 @@ +package org.cristalise.gui.tabs.outcome.form.field; + +import java.awt.Component; + +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.text.JTextComponent; + +import org.cristalise.kernel.utils.Language; + + + +/************************************************************************** + * + * $Revision$ + * $Date$ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ +public class LongStringEditField extends StringEditField { + + JTextArea bigText; + JScrollPane bigScroller; + public LongStringEditField() { + super(); + field.setToolTipText(Language.translate("This field can contain any string.")); + } + + @Override + public JTextComponent makeTextField() { + return new JTextArea(); + } + @Override + public Component getControl() { + if (bigScroller == null) { + bigScroller = new JScrollPane(field); + } + return bigScroller; + } +} diff --git a/src/main/java/org/cristalise/gui/tabs/outcome/form/field/StringEditField.java b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/StringEditField.java new file mode 100644 index 0000000..e8f0341 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tabs/outcome/form/field/StringEditField.java @@ -0,0 +1,257 @@ +package org.cristalise.gui.tabs.outcome.form.field; +import java.awt.Component; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Enumeration; + +import javax.swing.ImageIcon; +import javax.swing.JTextField; +import javax.swing.text.JTextComponent; + +import org.cristalise.gui.DomainKeyConsumer; +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.tabs.outcome.OutcomeException; +import org.cristalise.gui.tabs.outcome.form.HelpPane; +import org.cristalise.gui.tabs.outcome.form.OutcomeStructure; +import org.cristalise.gui.tabs.outcome.form.StructuralException; +import org.cristalise.kernel.lookup.DomainPath; +import org.exolab.castor.types.AnyNode; +import org.exolab.castor.xml.schema.Annotation; +import org.exolab.castor.xml.schema.AppInfo; +import org.exolab.castor.xml.schema.AttributeDecl; +import org.exolab.castor.xml.schema.ElementDecl; +import org.exolab.castor.xml.schema.Facet; +import org.exolab.castor.xml.schema.SimpleType; +import org.exolab.castor.xml.schema.Structure; +import org.exolab.castor.xml.schema.XMLType; +import org.exolab.castor.xml.schema.simpletypes.ListType; +import org.w3c.dom.Attr; +import org.w3c.dom.Node; +import org.w3c.dom.Text; + + +/** Superclass for the entry field for Field and AttributeList. + */ +public class StringEditField implements FocusListener, DomainKeyConsumer { + + Node data; + Structure model; + protected SimpleType content; + HelpPane helpPane; + String helpText; + protected JTextComponent field; + + boolean isValid = true; + boolean editable = true; + String name; + + + public StringEditField() { + field = makeTextField(); + if (field != null) + field.addFocusListener(this); + } + + private static StringEditField getFieldForType(SimpleType type) { + // handle lists special + if (type instanceof ListType) + return new ArrayEditField(type.getBuiltInBaseType()); + + // is a combobox + if (type.hasFacet(Facet.ENUMERATION)) + return new ComboField(type, null); + //find LOVscript TODO: Implement LOV + Enumeration e = type.getAnnotations(); + while (e.hasMoreElements()) { + Annotation note = e.nextElement(); + for (Enumeration f = note.getAppInfo(); f.hasMoreElements();) { + AppInfo thisAppInfo = f.nextElement(); + for (Enumeration g = thisAppInfo.getObjects(); g.hasMoreElements();) { + AnyNode appInfoNode = (AnyNode)g.nextElement(); + if (appInfoNode.getLocalName().equals("ScriptList") + || appInfoNode.getLocalName().equals("LDAPList")) { + return new ComboField(type, appInfoNode); + } + } + } + } + // find info on length before we go to the base type + long length = -1; + if (type.getLength()!=null) length = type.getLength().longValue(); + else if (type.getMaxLength()!=null) length = type.getMaxLength().longValue(); + else if (type.getMinLength()!=null) length = type.getMinLength().longValue(); + + // find base type if derived + if (!(type.isBuiltInType())) + type = type.getBuiltInBaseType(); + // else derive the class + Class contentClass = OutcomeStructure.getJavaClass(type.getTypeCode()); + // disable list edits for the moment + if (contentClass.equals(Boolean.class)) + return new BooleanEditField(); + else if (contentClass.equals(BigInteger.class)) + return new IntegerEditField(); + else if (contentClass.equals(BigDecimal.class)) + return new DecimalEditField(); + else if (contentClass.equals(ImageIcon.class)) + return new ImageEditField(); + else if (length > 60) + return new LongStringEditField(); + else return new StringEditField(); + } + + public static StringEditField getEditField(AttributeDecl model) throws StructuralException { + if (model.isReference()) model = model.getReference(); + StringEditField newField = getFieldForType(model.getSimpleType()); + newField.setDecl(model); + return newField; + } + + public static StringEditField getEditField(ElementDecl model) throws StructuralException { + try { + XMLType baseType = model.getType(); + while (!(baseType instanceof SimpleType)) + baseType = baseType.getBaseType(); + StringEditField newField = getFieldForType((SimpleType)baseType); + newField.setDecl(model); + return newField; + } catch (Exception ex) { + throw new StructuralException("No type defined in model"); + } + } + + public void setDecl(AttributeDecl model) throws StructuralException { + this.model=model; + this.content=model.getSimpleType(); + this.name = model.getName(); + if (model.isFixed()) setEditable(false); + } + + public void setDecl(ElementDecl model) throws StructuralException { + this.model=model; + this.name = model.getName(); + XMLType type = model.getType(); + + // derive base type + if (type.isSimpleType()) + this.content = (SimpleType)type; + else + this.content = (SimpleType)(type.getBaseType()); + + if (this.content == null) throw new StructuralException("No declared base type of element"); + + // + if (model.getFixedValue() != null) setEditable(false); + + } + + public void setData(Attr newData) throws StructuralException { + if (!(newData.getName().equals(name))) + throw new StructuralException("Tried to add a "+newData.getName()+" into a "+name+" attribute."); + + this.data = newData; + setText(newData.getValue()); + } + + public void setData(Text newData) { + String contents = newData.getData(); + this.data = newData; + setText(contents); + } + + public void setData(String newData) throws OutcomeException { + if (data == null) throw new OutcomeException("No node exists"); + setText(newData); + updateNode(); + + } + + public Structure getModel() { + return model; + } + + public String getName() { + return name; + } + + public Node getData() { + return data; + } + + public String getDefaultValue() { + return ""; + } + + public void setHelp(HelpPane helpPane, String helpText) { + this.helpPane = helpPane; + this.helpText = helpText; + } + + @Override + public void focusLost(FocusEvent e) { + if (MainFrame.itemFinder != null) + MainFrame.itemFinder.clearConsumer(this); + updateNode(); + } + + @Override + public void focusGained(FocusEvent e) { + helpPane.setHelp(name, helpText); + if (editable && MainFrame.itemFinder != null) + MainFrame.itemFinder.setConsumer(this, "Insert"); + } + + public void updateNode() { + if (data == null) return; + if (data instanceof Text) { + ((Text)data).setData(getText()); + } + else { //attribute + ((Attr)data).setValue(getText()); + } + } + + /** + * Read domkey from barcode input + */ + @Override + public void push(DomainPath key) { + setText(key.getName()); + } + + /** + * Read string from barcode input + */ + @Override + public void push(String key) { + setText(key); + } + + public void setEditable(boolean editable) { + this.editable = editable; + if (field != null) + field.setEditable(editable); + } + + public String getText() { + return field.getText(); + } + + public void setText(String text) { + field.setText(text); + } + + public JTextComponent makeTextField() { + return new JTextField(); + } + + public Component getControl() { + return field; + } + + public void grabFocus() { + getControl().requestFocus(); + } +} diff --git a/src/main/java/org/cristalise/gui/tree/Node.java b/src/main/java/org/cristalise/gui/tree/Node.java new file mode 100644 index 0000000..4ef3942 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tree/Node.java @@ -0,0 +1,252 @@ +package org.cristalise.gui.tree; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.tree.DefaultMutableTreeNode; + +import org.cristalise.gui.DynamicTreeBuilder; +import org.cristalise.gui.ImageLoader; +import org.cristalise.gui.ItemTabManager; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.lookup.AgentPath; +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.lookup.RolePath; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + +public abstract class Node implements Runnable { + + protected Path binding; + protected DefaultMutableTreeNode treeNode; + protected String name; // domain key + protected ItemPath itemPath; // target item + // attributes + protected String type = ""; + protected String toolTip = null; + protected Icon icon; + protected boolean isExpandable = false; + protected HashMap childNodes = new HashMap(); + protected ArrayList subscribers = new ArrayList(); + protected DynamicTreeBuilder loader = null; + private boolean loaded = false; + private String iconName; + protected ItemTabManager desktop; + static ImageIcon folder = ImageLoader.findImage("folder.png"); + static ImageIcon emptyLeaf = ImageLoader.findImage("leaf.png"); + + public Node(ItemTabManager desktop) { + this.desktop = desktop; + } + + protected void createTreeNode() { + this.treeNode = new DefaultMutableTreeNode(this); + } + + public Node(Path path, ItemTabManager desktop) { + this.binding = path; + this.desktop = desktop; + try { + this.itemPath = path.getItemPath(); + } catch (ObjectNotFoundException e) { } + // get the name of this node (last path element) + String[] pathComponents = path.getPath(); + if (pathComponents.length > 0) + this.name = pathComponents[pathComponents.length-1]; + else + this.name = Gateway.getProperties().getProperty("Name"); + } + + public ItemTabManager getDesktop() { + return desktop; + } + + public Node newNode(Path path) + { + try { + if (path.getItemPath() instanceof AgentPath) + return new NodeAgent(path, desktop); + else + return new NodeItem(path, desktop); + } catch (ObjectNotFoundException ex) { + if (path instanceof RolePath) + return new NodeRole(path, desktop); + return new NodeContext(path, desktop); + } + + } + + /** Inserts a tree builder as the first child of the node, so it can be opened in the tree + */ + public void makeExpandable() { + if (isExpandable) return; + loader = new DynamicTreeBuilder(this.treeNode, desktop); + this.treeNode.insert(loader.getTreeNode(),0); + isExpandable = true; + } + + + public DefaultMutableTreeNode getTreeNode() { + return treeNode; + } + + public void setTreeNode(DefaultMutableTreeNode treeNode) { + this.treeNode = treeNode; + treeNode.setUserObject(this); + } + + /** Subscription for loading node children. + * Note this is separate from the itemproxy subscription as it included query of the naming service + * and eventually should not require access to the item at all for higher performance */ + public void subscribeNode(NodeSubscriber target) { + subscribers.add(target); + if (loaded == false) { + loaded = true; + loadMore(); + } + else { + synchronized (childNodes) { + Node newNode; + for (Iterator nodes = childNodes.values().iterator(); nodes.hasNext();) { + newNode = nodes.next(); + Logger.msg("subscribeNode target.add("+newNode.name+")"); + target.add(newNode); + } + } + } + } + + public void loadMore() { + Thread loading = new Thread(this); + loading.start(); + } + + public void unsubscribeNode(NodeSubscriber target) { + subscribers.remove(target); + } + + public void add(Node newNode) { + synchronized(childNodes) { + childNodes.put(newNode.getPath(), newNode); + for (NodeSubscriber thisSub : subscribers) { + thisSub.add(newNode); + } + } + } + + public void remove(Path oldPath) { + synchronized(childNodes) { + childNodes.remove(oldPath); + for (NodeSubscriber thisSub : subscribers) { + thisSub.remove(oldPath); + } + } + } + + public void removeAllChildren() { + synchronized(childNodes) { + while (childNodes.keySet().iterator().hasNext()) { + remove(childNodes.keySet().iterator().next()); + } + } + } + + public Node getChildNode(Path itsPath) { + for (Iterator i = childNodes.keySet().iterator(); i.hasNext();) { + Object next = i.next(); + if ( next.equals(itsPath) ) return childNodes.get(next); + } + return null; + } + + // end of current batch + public void end(boolean more) { + for (NodeSubscriber thisSub : subscribers) { + thisSub.end(more); + } + } + + + @Override + public void run() { + Thread.currentThread().setName("Node Loader: "+name); + loadChildren(); + } + + public abstract void loadChildren(); + + public void refresh() { + removeAllChildren(); + loadChildren(); + } + + // Getters and Setters + + public ItemPath getItemPath() { return itemPath; } +// public void setSysKey( int sysKey ) { this.sysKey = sysKey; } + + public String getName() { return name; } +// public void setName( String name ) { this.name = name; } + + public String getType() { return type; } +// public void setType( String type ) { this.type = type; } + + public Path getPath() { return binding; } + + public DynamicTreeBuilder getTreeBuilder() { return loader; } + + @Override + public String toString() { + if (this.name.length() > 0) { + return this.name; + } + else { return "Cristal"; } + } + + public Icon getIcon() { + if (icon != null) return icon; + return(isExpandable?folder:emptyLeaf); + } + + public String getIconName() { + return iconName; + } + + public void setIcon(String icon) { + iconName = icon; + this.icon = ImageLoader.findImage("typeicons/"+icon+"_16.png"); + if (this.icon==ImageLoader.nullImg) this.icon = ImageLoader.findImage("typeicons/item_16.png"); + } + + public JPopupMenu getPopupMenu() { + JPopupMenu popup = new JPopupMenu(); + JMenuItem menuItem = new JMenuItem(Language.translate("Refresh")); + menuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (isExpandable) refresh(); + } + }); + popup.add(menuItem); + return popup; + } + + public String getToolTip() { + if (toolTip != null && toolTip.length()>0) + return toolTip; + else + return type; + } + + public void setToolTip(String tip) { + this.toolTip = tip; + }} diff --git a/src/main/java/org/cristalise/gui/tree/NodeAgent.java b/src/main/java/org/cristalise/gui/tree/NodeAgent.java new file mode 100644 index 0000000..b070c5d --- /dev/null +++ b/src/main/java/org/cristalise/gui/tree/NodeAgent.java @@ -0,0 +1,33 @@ + +package org.cristalise.gui.tree; + + +import java.util.ArrayList; + +import org.cristalise.gui.ItemTabManager; +import org.cristalise.kernel.lookup.Path; + + +/** + * Structure for Item presence on the tree and ItemDetails boxes. Created by NodeFactory. + * @author $Author: abranson $ + * @version $Version$ + */ +public class NodeAgent extends NodeItem { + + public NodeAgent(Path path, ItemTabManager desktop) { + super(path, desktop); + } + + @Override + public void loadChildren() { + } + + @Override + public ArrayList getTabs() { + + ArrayList requiredTabs = super.getTabs(); + requiredTabs.add("JobList"); + return requiredTabs; + } +} diff --git a/src/main/java/org/cristalise/gui/tree/NodeCollection.java b/src/main/java/org/cristalise/gui/tree/NodeCollection.java new file mode 100644 index 0000000..3a8643a --- /dev/null +++ b/src/main/java/org/cristalise/gui/tree/NodeCollection.java @@ -0,0 +1,144 @@ +package org.cristalise.gui.tree; + +import java.util.ArrayList; + +import javax.swing.tree.DefaultMutableTreeNode; + +import org.cristalise.gui.ItemTabManager; +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.collection.Collection; +import org.cristalise.kernel.collection.CollectionMember; +import org.cristalise.kernel.collection.Dependency; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.proxy.ItemProxy; +import org.cristalise.kernel.entity.proxy.MemberSubscription; +import org.cristalise.kernel.entity.proxy.ProxyObserver; +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.utils.CastorHashMap; +import org.cristalise.kernel.utils.KeyValuePair; +import org.cristalise.kernel.utils.Logger; + + +public class NodeCollection extends Node implements ProxyObserver> { + + ItemProxy parent; + Collection thisCollection; + String path; + + public NodeCollection(ItemProxy parent, String name, ItemTabManager desktop) { + super(desktop); + this.parent = parent; + this.name = name; + this.path = parent.getPath()+"/"+ClusterStorage.COLLECTION+"/"+name+"/last"; + createTreeNode(); + this.makeExpandable(); + } + + public NodeCollection(ItemProxy parent, Collection coll, ItemTabManager desktop) { + super(desktop); + this.parent = parent; + this.name = coll.getName(); + this.path = parent.getPath()+"/"+ClusterStorage.COLLECTION+"/"+name+"/last"; + createTreeNode(); + this.makeExpandable(); + add(coll); + } + + @Override + public void loadChildren() { + Logger.msg(8, "NodeCollection::loadChildren()"); + try { + if (thisCollection == null) { + Collection initColl = (Collection)parent.getObject(ClusterStorage.COLLECTION+"/"+name+"/last"); + add(initColl); + } + parent.subscribe(new MemberSubscription>(this, ClusterStorage.COLLECTION, false)); + } catch (ObjectNotFoundException ex) { + end(false); + return; + } + } + + @Override + public void add(Collection contents) { + if (!contents.getName().equals(name)) return; + this.type = contents.getClass().getSimpleName(); + ArrayList newMembers = contents.getMembers().list; + ArrayList oldMembers; + if (thisCollection == null) + oldMembers = new ArrayList(); + else + oldMembers = thisCollection.getMembers().list; + + ArrayList currentPaths = new ArrayList(); + // add any missing paths + for (CollectionMember newMember : newMembers) { + ItemPath itemPath = newMember.getItemPath(); + if (!oldMembers.contains(newMember) && itemPath != null) { + currentPaths.add(itemPath); + NodeItem newMemberNode = new NodeItem(itemPath, desktop); + newMemberNode.setCollection(contents, newMember.getID(), parent); + newMemberNode.setToolTip(getPropertyToolTip(newMember.getProperties())); + add(newMemberNode); + } + } + // remove those no longer present + for (Path childPath : childNodes.keySet()) { + if (!currentPaths.contains(childPath)) { + remove(childPath); + } + + } + + thisCollection = contents; + if (isDependency()) + setToolTip(getPropertyToolTip(((Dependency)contents).getProperties())); + end(false); + } + + public boolean addMember(ItemPath itemPath) { + if (!isDependency()) return false; + String[] params = { thisCollection.getName(), itemPath.getUUID().toString() }; + try { + MainFrame.userAgent.execute(parent, "AddMemberToCollection", params); + return true; + } catch (Exception e1) { + MainFrame.exceptionDialog(e1); + return false; + } + } + + public static String getPropertyToolTip(CastorHashMap props) { + if (props.size() == 0) return null; + StringBuffer verStr = new StringBuffer(""); + for (KeyValuePair prop : props.getKeyValuePairs()) { + verStr.append("").append(prop.getKey()).append(": ").append(prop.getValue()).append("
"); + } + return verStr.append("").toString(); + } + + @Override + public DefaultMutableTreeNode getTreeNode() { + return treeNode; + } + + + + @Override + public void remove(String id) { + // TODO Auto-generated method stub + + } + + @Override + public void control(String control, String msg) { + // TODO Auto-generated method stub + + } + + public boolean isDependency() { + return thisCollection instanceof Dependency; + } +} diff --git a/src/main/java/org/cristalise/gui/tree/NodeContext.java b/src/main/java/org/cristalise/gui/tree/NodeContext.java new file mode 100644 index 0000000..97252c7 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tree/NodeContext.java @@ -0,0 +1,66 @@ +package org.cristalise.gui.tree; + +import java.util.Iterator; + +import org.cristalise.gui.ItemTabManager; +import org.cristalise.kernel.entity.proxy.DomainPathSubscriber; +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Logger; + + + +public class NodeContext extends Node implements DomainPathSubscriber { + Iterator children; + + public NodeContext(Path path, ItemTabManager desktop) { + super(path, desktop); + this.itemPath = null; + createTreeNode(); + this.makeExpandable(); + this.type = "Cristal Context"; + } + + + @Override + public void loadChildren() { + if (children == null) { + Gateway.getProxyManager().subscribeTree(this, (DomainPath)binding); + children = Gateway.getLookup().getChildren(binding); + } + + int batch = 75; + while (children.hasNext() && batch > 0) { + Path newPath = children.next(); + if (newPath == null) break; + Logger.msg(2, "Subscription.run() - new node: " + newPath ); + add( newNode(newPath)); + batch--; + } + end(children.hasNext()); + } + + @Override + public void pathAdded(DomainPath path) { + add(newNode(path)); + } + + @Override + public void refresh() { + children = null; + super.refresh(); + } + @Override + public void pathRemoved(DomainPath path) { + remove(path); + } + +} + + + + + + + diff --git a/src/main/java/org/cristalise/gui/tree/NodeItem.java b/src/main/java/org/cristalise/gui/tree/NodeItem.java new file mode 100644 index 0000000..667b701 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tree/NodeItem.java @@ -0,0 +1,241 @@ +package org.cristalise.gui.tree; + +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.util.ArrayList; +import java.util.StringTokenizer; + +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; + +import org.cristalise.gui.ItemDetails; +import org.cristalise.gui.ItemTabManager; +import org.cristalise.gui.MainFrame; +import org.cristalise.kernel.collection.Aggregation; +import org.cristalise.kernel.collection.Collection; +import org.cristalise.kernel.collection.CollectionMember; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.agent.Job; +import org.cristalise.kernel.entity.proxy.ItemProxy; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + +/** + * Structure for Item presence on the tree and ItemDetails boxes. Created by NodeFactory. + * @author $Author: abranson $ + * @version $Version$ + */ +public class NodeItem extends Node implements Transferable { + + protected ItemProxy myItem = null; + + public NodeItem(Path path, ItemTabManager desktop) { + + super(path, desktop); + Logger.msg(2,"NodeEntity. - Creating item for '"+path.toString()+"'."); + + // if an item - resolve the item and get its properties + try { + myItem = Gateway.getProxyManager().getProxy(path); + this.itemPath = path.getItemPath(); + Logger.msg(2,"NodeEntity. - System key is "+this.itemPath); + + // Name should be the alias if present + String alias = myItem.getName(); + if (alias != null) this.name = alias; + + try { + this.type = myItem.getProperty("Type"); + } catch (ObjectNotFoundException e) { + this.type = ""; + } + String iconString = this.type; + if (type.equals("ActivityDesc")) + try { + iconString = myItem.getProperty("Complexity")+iconString; + } catch (ObjectNotFoundException e) { + iconString = "error"; + } + iconString = iconString.toLowerCase(); + this.setIcon(iconString); + } catch (ObjectNotFoundException e1) { + this.itemPath = null; + this.type="Error"; + this.name="Entity not found"; + this.setIcon("error"); + } + createTreeNode(); + makeExpandable(); + } + + public ItemProxy getItem() { + return myItem; + } + + public void openItem() { + desktop.add(this); + } + + public Collection getParentCollection() { + return parentCollection; + } + + public Integer getSlotNo() { + return slotNo; + } + + Collection parentCollection; + Integer slotNo = null; + static DataFlavor dataFlavor = new DataFlavor(NodeItem.class, "NodeItem"); + ItemProxy parentItem; + static DataFlavor[] supportedFlavours = new DataFlavor[] { + dataFlavor, + new DataFlavor(Path.class, "Path"), + DataFlavor.getTextPlainUnicodeFlavor() }; + + + public void setCollection(Collection parentCollection, Integer slotNo, ItemProxy parentItem) { + this.parentCollection = parentCollection; + this.slotNo = slotNo; + this.parentItem = parentItem; + } + + @Override + public void loadChildren() { + try { + String collections = myItem.queryData("Collection/all"); + StringTokenizer tok = new StringTokenizer(collections, ","); + while (tok.hasMoreTokens()) { + NodeCollection newCollection = new NodeCollection(myItem, tok.nextToken(), desktop); + add(newCollection); + } + end(false); + } catch (Exception e) { + Logger.error(e); + } + } + + @Override + public JPopupMenu getPopupMenu() { + + JPopupMenu popup = super.getPopupMenu(); + JMenuItem openItem = new JMenuItem(Language.translate("Open")); + openItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + openItem(); + } + }); + popup.addSeparator(); + popup.add(openItem); + popup.addSeparator(); + if (parentCollection != null && MainFrame.isAdmin) { + JMenuItem collMenuItem = new JMenuItem("Remove from collection"); + //collMenuItem.setActionCommand("removeColl"); + collMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String[] params = { parentCollection.getName(), String.valueOf(slotNo) }; + String predefStepName = parentCollection instanceof Aggregation?"ClearSlot":"RemoveSlotFromCollection"; + try { + MainFrame.userAgent.execute(parentItem, predefStepName, params); + } catch (Exception e1) { + MainFrame.exceptionDialog(e1); + } + + } + }); + popup.add(collMenuItem); + popup.addSeparator(); + } + try { + ArrayList jobList = myItem.getJobList(MainFrame.userAgent); + ArrayList already = new ArrayList(); + if (jobList.size() > 0) { + for (Job thisJob : jobList) { + String stepName = thisJob.getStepName(); + if (already.contains(stepName)) + continue; + already.add(stepName); + JMenuItem menuItem = new JMenuItem(stepName); + menuItem.setActionCommand(stepName); + menuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + execute(e.getActionCommand()); + } + }); + popup.add(menuItem); + + } + } + else { + JMenuItem noAct = new JMenuItem("No activities"); + noAct.setEnabled(false); + popup.add(noAct); + } + } catch (Exception ex) { + JMenuItem error = new JMenuItem("Error querying jobs"); + error.setEnabled(false); + popup.add(error); + } + + return popup; + } + + public void execute(String stepName) { + ItemDetails thisDetail = desktop.add(this); + thisDetail.runCommand("Execution", stepName); + } + + public ArrayList getTabs() { + + ArrayList requiredTabs = new ArrayList(); + requiredTabs.add("Properties"); + try { + String collNames = myItem.queryData(ClusterStorage.COLLECTION+"/all"); + if (collNames.length() > 0) + requiredTabs.add("Collection"); + } catch (Exception e) { } + requiredTabs.add("Execution"); + requiredTabs.add("History"); + requiredTabs.add("Viewpoint"); + requiredTabs.add("Workflow"); + return requiredTabs; + + } + + @Override + public DataFlavor[] getTransferDataFlavors() { + return supportedFlavours; + } + + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + for (DataFlavor flavour : supportedFlavours) { + if (flavour.equals(flavor)) + return true; + } + return false; + } + + @Override + public Object getTransferData(DataFlavor flavor) + throws UnsupportedFlavorException, IOException { + if (flavor.equals(supportedFlavours[0])) + return this; + if (flavor.equals(supportedFlavours[1])) + return binding; + if (flavor.equals(supportedFlavours[2])) + return name; + throw new UnsupportedFlavorException(flavor); + } +} diff --git a/src/main/java/org/cristalise/gui/tree/NodeRole.java b/src/main/java/org/cristalise/gui/tree/NodeRole.java new file mode 100644 index 0000000..288d3b6 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tree/NodeRole.java @@ -0,0 +1,34 @@ +package org.cristalise.gui.tree; + +import org.cristalise.gui.ItemTabManager; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.lookup.AgentPath; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.lookup.RolePath; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Logger; + + +public class NodeRole extends NodeContext { + + RolePath role; + public NodeRole(Path path, ItemTabManager desktop) { + super(path, desktop); + role = (RolePath)path; + } + @Override + public void loadChildren() { + AgentPath[] agents; + try { + agents = Gateway.getLookup().getAgents(role); + for (AgentPath agentPath : agents) { + add (newNode(agentPath)); + } + } catch (ObjectNotFoundException e) { + Logger.error("Role "+role.getName()+" not found"); + } + super.loadChildren(); + } + + +} diff --git a/src/main/java/org/cristalise/gui/tree/NodeSubscriber.java b/src/main/java/org/cristalise/gui/tree/NodeSubscriber.java new file mode 100644 index 0000000..b06f497 --- /dev/null +++ b/src/main/java/org/cristalise/gui/tree/NodeSubscriber.java @@ -0,0 +1,13 @@ +package org.cristalise.gui.tree; + +import org.cristalise.kernel.lookup.Path; + + +public interface NodeSubscriber { + + public void add(Node newNode); + + public void remove(Path path); + + public void end(boolean more); +} diff --git a/src/main/java/org/cristalise/gui/tree/NodeTransferHandler.java b/src/main/java/org/cristalise/gui/tree/NodeTransferHandler.java new file mode 100644 index 0000000..89f503c --- /dev/null +++ b/src/main/java/org/cristalise/gui/tree/NodeTransferHandler.java @@ -0,0 +1,74 @@ +package org.cristalise.gui.tree; + +import java.awt.datatransfer.Transferable; + +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.TransferHandler; + +import org.cristalise.gui.ImageLoader; +import org.cristalise.gui.MainFrame; +import org.cristalise.gui.TreeBrowser; +import org.cristalise.kernel.utils.Logger; + + +public class NodeTransferHandler extends TransferHandler { + + TreeBrowser tree; + + public NodeTransferHandler(TreeBrowser treeBrowser) { + tree = treeBrowser; + } + + @Override + public int getSourceActions(JComponent c) { + return COPY_OR_MOVE; + } + + @Override + public Transferable createTransferable(JComponent c) { + Node selNode = tree.getSelectedNode(); + if (selNode instanceof Transferable) + return (Transferable)selNode; + else + return null; + } + + @Override + public boolean importData(TransferSupport support) { + if (!canImport(support)) { + return false; + } + Node dropNode = tree.getNodeAt(support.getDropLocation().getDropPoint()); + if (dropNode instanceof NodeCollection) { + NodeCollection collNode = (NodeCollection)dropNode; + NodeItem source; + try { + source = (NodeItem)support.getTransferable().getTransferData(NodeItem.dataFlavor); + return collNode.addMember(source.getItemPath()); + } catch (Exception e) { + Logger.error(e); + return false; + } + } + return super.importData(support); + } + + @Override + public boolean canImport(TransferSupport support) { + boolean isNode = support.isDataFlavorSupported(NodeItem.dataFlavor); + if (!isNode) return false; + Node dropNode = tree.getNodeAt(support.getDropLocation().getDropPoint()); + if (MainFrame.isAdmin && dropNode instanceof NodeCollection && ((NodeCollection)dropNode).isDependency()) + return true; + return false; + + } + + @Override + public Icon getVisualRepresentation(Transferable t) { + if (t instanceof NodeItem) + return (((NodeItem)t).getIcon()); + return ImageLoader.nullImg; + } +} diff --git a/src/main/resources/module.xml b/src/main/resources/module.xml index ca61f86..078d6a4 100644 --- a/src/main/resources/module.xml +++ b/src/main/resources/module.xml @@ -4,10 +4,10 @@ ${version} com/c2kernel/gui/resources/ - com.c2kernel.gui.lifecycle.desc.CompActDefOutcomeHandler - com.c2kernel.gui.lifecycle.desc.ElemActDefOutcomeHandler - com.c2kernel.gui.tabs.outcome.BasicOutcomeEditor - com.c2kernel.gui.tabs.outcome.BasicOutcomeEditor + org.cristalise.kernel.gui.lifecycle.desc.CompActDefOutcomeHandler + org.cristalise.kernel.gui.lifecycle.desc.ElemActDefOutcomeHandler + org.cristalise.kernel.gui.tabs.outcome.BasicOutcomeEditor + org.cristalise.kernel.gui.tabs.outcome.BasicOutcomeEditor about.png \ No newline at end of file -- cgit v1.2.3