diff options
| author | Andrew Branson <andrew.branson@cern.ch> | 2012-05-30 08:37:45 +0200 |
|---|---|---|
| committer | Andrew Branson <andrew.branson@cern.ch> | 2012-05-30 08:37:45 +0200 |
| commit | b086f57f56bf0eb9dab9cf321a0f69aaaae84347 (patch) | |
| tree | 8e6e26e8b7eed6abad7a17b093bdbb55c5e6b1ba /src/main/java/com/c2kernel/lifecycle/gui | |
| parent | 22088ae8d2d5ff390518dbe1c4372325ffb3a647 (diff) | |
Initial Maven Conversion
Diffstat (limited to 'src/main/java/com/c2kernel/lifecycle/gui')
10 files changed, 1004 insertions, 0 deletions
diff --git a/src/main/java/com/c2kernel/lifecycle/gui/model/WfDefGraphPanel.java b/src/main/java/com/c2kernel/lifecycle/gui/model/WfDefGraphPanel.java new file mode 100644 index 0000000..e0f4f65 --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/gui/model/WfDefGraphPanel.java @@ -0,0 +1,59 @@ +/*Created on 21 nov. 2003 */
+package com.c2kernel.lifecycle.gui.model;
+
+import java.awt.Graphics2D;
+
+import com.c2kernel.graph.model.DirectedEdge;
+import com.c2kernel.graph.model.GraphPoint;
+import com.c2kernel.graph.view.DirectedEdgeRenderer;
+import com.c2kernel.graph.view.GraphPanel;
+import com.c2kernel.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/lifecycle/gui/model/WfEdgeDefFactory.java b/src/main/java/com/c2kernel/lifecycle/gui/model/WfEdgeDefFactory.java new file mode 100644 index 0000000..6e6727a --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/gui/model/WfEdgeDefFactory.java @@ -0,0 +1,30 @@ +package com.c2kernel.lifecycle.gui.model;
+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/lifecycle/gui/model/WfVertexDefFactory.java b/src/main/java/com/c2kernel/lifecycle/gui/model/WfVertexDefFactory.java new file mode 100644 index 0000000..132fdcf --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/gui/model/WfVertexDefFactory.java @@ -0,0 +1,97 @@ +package com.c2kernel.lifecycle.gui.model;
+import java.awt.Point;
+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.lifecycle.ActivityDef;
+import com.c2kernel.lifecycle.CompositeActivityDef;
+import com.c2kernel.lifecycle.chooser.ActivityChooser;
+import com.c2kernel.lifecycle.chooser.WorkflowDialogue;
+import com.c2kernel.utils.Language;
+import com.c2kernel.utils.LocalObjectLoader;
+import com.c2kernel.utils.Logger;
+import com.c2kernel.utils.Resource;
+public class WfVertexDefFactory implements VertexFactory, WorkflowDialogue
+{
+ protected CompositeActivityDef mCompositeActivityDef = null;
+ @Override
+ public void create(GraphModelManager graphModelManager, Point 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<String, Serializable> mhm = new HashMap<String, Serializable>();
+ 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"),
+ Resource.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");
+ Point location = (Point) 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,
+ Resource.findImage("graph/newvertex_large.png"),
+ null,
+ null);
+ act = (ActivityDef) mCompositeActivityDef.search(mCompositeActivityDef.getID() + "/" + newName);
+ mCompositeActivityDef.addExistingActivityDef(unicName, act, new GraphPoint(location.x, location.y));
+ }
+ else
+ {
+ try
+ {
+ act = LocalObjectLoader.getActDef(newName, "last");
+ }
+ catch (Exception ex)
+ {
+ Logger.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/lifecycle/gui/model/WfVertexDefOutlineCreator.java b/src/main/java/com/c2kernel/lifecycle/gui/model/WfVertexDefOutlineCreator.java new file mode 100644 index 0000000..63d3b2f --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/gui/model/WfVertexDefOutlineCreator.java @@ -0,0 +1,51 @@ +package com.c2kernel.lifecycle.gui.model;
+
+import com.c2kernel.graph.model.GraphPoint;
+import com.c2kernel.graph.model.Vertex;
+import com.c2kernel.graph.model.VertexOutlineCreator;
+import com.c2kernel.lifecycle.ActivitySlotDef;
+
+public class WfVertexDefOutlineCreator implements VertexOutlineCreator
+{
+ private final int mActivityWidth = 130;
+ private final int mActivityHeight = 60;
+ private final int mSplitJoinWidth = 60;
+ private final int mSplitJoinHeight = 25;
+
+ @Override
+ public void setOutline(Vertex vertex)
+ {
+ GraphPoint centrePoint = vertex.getCentrePoint();
+ GraphPoint[] outlinePoints = new GraphPoint[ 4 ];
+ int vertexWidth = 0;
+ int vertexHeight = 0;
+
+
+ if ( vertex instanceof ActivitySlotDef )
+ {
+ vertexWidth = mActivityWidth;
+ vertexHeight = mActivityHeight;
+ }
+ else
+ {
+ vertexWidth = mSplitJoinWidth;
+ vertexHeight = mSplitJoinHeight;
+ }
+
+ outlinePoints[ 0 ] = new GraphPoint();
+ outlinePoints[ 0 ].x = centrePoint.x - vertexWidth / 2;
+ outlinePoints[ 0 ].y = centrePoint.y - vertexHeight / 2;
+ outlinePoints[ 1 ] = new GraphPoint();
+ outlinePoints[ 1 ].x = centrePoint.x + vertexWidth / 2;
+ outlinePoints[ 1 ].y = centrePoint.y - vertexHeight / 2;
+ outlinePoints[ 2 ] = new GraphPoint();
+ outlinePoints[ 2 ].x = centrePoint.x + vertexWidth / 2;
+ outlinePoints[ 2 ].y = centrePoint.y + vertexHeight / 2;
+ outlinePoints[ 3 ] = new GraphPoint();
+ outlinePoints[ 3 ].x = centrePoint.x - vertexWidth / 2;
+ outlinePoints[ 3 ].y = centrePoint.y + vertexHeight / 2;
+
+ vertex.setOutlinePoints( outlinePoints );
+ }
+}
+
diff --git a/src/main/java/com/c2kernel/lifecycle/gui/view/ActivitySlotDefRenderer.java b/src/main/java/com/c2kernel/lifecycle/gui/view/ActivitySlotDefRenderer.java new file mode 100644 index 0000000..c4309ee --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/gui/view/ActivitySlotDefRenderer.java @@ -0,0 +1,71 @@ +package com.c2kernel.lifecycle.gui.view;
+
+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.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/lifecycle/gui/view/CompActDefOutcomeHandler.java b/src/main/java/com/c2kernel/lifecycle/gui/view/CompActDefOutcomeHandler.java new file mode 100644 index 0000000..4c69f15 --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/gui/view/CompActDefOutcomeHandler.java @@ -0,0 +1,233 @@ +package com.c2kernel.lifecycle.gui.view;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+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.JPanel;
+import javax.swing.JSplitPane;
+
+import com.c2kernel.graph.layout.DefaultGraphLayoutGenerator;
+import com.c2kernel.graph.view.EditorPanel;
+import com.c2kernel.graph.view.VertexPropertyPanel;
+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.lifecycle.CompositeActivityDef;
+import com.c2kernel.lifecycle.gui.model.WfDefGraphPanel;
+import com.c2kernel.lifecycle.gui.model.WfEdgeDefFactory;
+import com.c2kernel.lifecycle.gui.model.WfVertexDefFactory;
+import com.c2kernel.lifecycle.gui.model.WfVertexDefOutlineCreator;
+import com.c2kernel.lifecycle.instance.gui.view.FindActDefPanel;
+import com.c2kernel.process.Gateway;
+import com.c2kernel.utils.CastorXMLUtility;
+import com.c2kernel.utils.FileStringUtility;
+import com.c2kernel.utils.Logger;
+import com.c2kernel.utils.Resource;
+
+/**************************************************************************
+ *
+ * $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(Resource.findImage("graph/load.png"));
+ protected JButton mLayoutButton = new JButton(Resource.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 disc");
+ 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);
+ }
+
+ 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) {
+ Logger.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)CastorXMLUtility.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 {
+ try {
+ return CastorXMLUtility.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.getProperty("WfPropertyPanel");
+ if (wfPanelClass != null) {
+ try {
+ Class<?> panelClass = Class.forName(wfPanelClass);
+ return (VertexPropertyPanel)panelClass.newInstance();
+ } 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 {
+ ElemActDefOutcomeHandler.exportAct(targetFile.getParentFile(), mCompActDef);
+ }
+}
diff --git a/src/main/java/com/c2kernel/lifecycle/gui/view/ElemActDefOutcomeHandler.java b/src/main/java/com/c2kernel/lifecycle/gui/view/ElemActDefOutcomeHandler.java new file mode 100644 index 0000000..c37e5a7 --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/gui/view/ElemActDefOutcomeHandler.java @@ -0,0 +1,161 @@ +package com.c2kernel.lifecycle.gui.view;
+
+import java.io.File;
+
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import com.c2kernel.graph.model.GraphableVertex;
+import com.c2kernel.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.utils.CastorXMLUtility;
+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)CastorXMLUtility.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 CastorXMLUtility.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(), act);
+ }
+
+ public static void exportAct(File dir, ActivityDef actDef) throws Exception {
+ FileStringUtility.string2File(new File(dir, actDef.getActName()+".xml"), CastorXMLUtility.marshall(actDef));
+ // Export associated schema
+ exportSchema((String)actDef.getProperties().get("SchemaType"), (String)actDef.getProperties().get("SchemaVersion"), dir);
+ // Export associated script
+ exportScript((String)actDef.getProperties().get("ScriptName"), (String)actDef.getProperties().get("ScriptVersion"), dir);
+
+ //Export child act if composite
+ if (actDef instanceof CompositeActivityDef) {
+ CompositeActivityDef compActDef = (CompositeActivityDef)actDef;
+ for (int i=0; i<compActDef.getChildren().length; i++) {
+ GraphableVertex vert = compActDef.getChildren()[i];
+ exportScript((String)vert.getProperties().get("ScriptName"), (String)vert.getProperties().get("ScriptVersion"), dir);
+ exportScript((String)vert.getProperties().get("RoutingScriptName"), (String)vert.getProperties().get("RoutingScriptVersion"), dir);
+ }
+ GraphableVertex[] childDefs = compActDef.getLayoutableChildren();
+ for (GraphableVertex childDef : childDefs) {
+ if (childDef instanceof ActivitySlotDef)
+ exportAct(dir, ((ActivitySlotDef)childDef).getTheActivityDef());
+ }
+ }
+ }
+
+ public static void exportScript(String name, String version, File dir) {
+ if (name == null || name.length()==0) return;
+ try {
+ FileStringUtility.string2File(new File(dir, name+"_"+version+".xml"),
+ LocalObjectLoader.getScript(name, 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, String version, File dir) {
+ if (name == null || name.length()==0) return;
+ try {
+ FileStringUtility.string2File(new File(dir, name+"_"+version+".xsd"),
+ LocalObjectLoader.getSchema(name, Integer.parseInt(version)).schema);
+ } 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/lifecycle/gui/view/SplitJoinDefRenderer.java b/src/main/java/com/c2kernel/lifecycle/gui/view/SplitJoinDefRenderer.java new file mode 100644 index 0000000..84be70c --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/gui/view/SplitJoinDefRenderer.java @@ -0,0 +1,138 @@ +package com.c2kernel.lifecycle.gui.view;
+
+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.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/lifecycle/gui/view/WfDirectedEdgeDefRenderer.java b/src/main/java/com/c2kernel/lifecycle/gui/view/WfDirectedEdgeDefRenderer.java new file mode 100644 index 0000000..12df7a1 --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/gui/view/WfDirectedEdgeDefRenderer.java @@ -0,0 +1,134 @@ +package com.c2kernel.lifecycle.gui.view;
+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.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/lifecycle/gui/view/WfVertexDefRenderer.java b/src/main/java/com/c2kernel/lifecycle/gui/view/WfVertexDefRenderer.java new file mode 100644 index 0000000..9199615 --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/gui/view/WfVertexDefRenderer.java @@ -0,0 +1,30 @@ +package com.c2kernel.lifecycle.gui.view;
+
+import java.awt.Graphics2D;
+
+import com.c2kernel.graph.model.Vertex;
+import com.c2kernel.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);
+ }
+ }
+}
+
|
