001: package com.opensymphony.workflow.designer.actions;
002:
003: import java.awt.*;
004: import java.util.Map;
005: import java.util.Hashtable;
006: import javax.swing.*;
007:
008: import com.opensymphony.workflow.designer.*;
009: import com.opensymphony.workflow.designer.dnd.DragData;
010: import com.opensymphony.workflow.loader.*;
011: import org.jgraph.graph.GraphConstants;
012: import org.jgraph.graph.AttributeMap;
013: import org.jgraph.graph.DefaultPort;
014:
015: /**
016: * @author Gulei
017: */
018: public class CellFactory {
019: public static WorkflowCell createCell(WorkflowDescriptor workflow,
020: WorkflowGraphModel model, Point location, DragData data) {
021: if (data.equals(DragData.JOIN)) {
022: return createJoin(workflow, model, location);
023: } else if (data.equals(DragData.SPLIT)) {
024: return createSplit(workflow, model, location);
025: } else if (data.equals(DragData.STEP)) {
026: return createStep(workflow, model, location);
027: }
028: return null;
029: }
030:
031: public static StepCell createStep(WorkflowDescriptor workflow,
032: WorkflowGraphModel model, Point location) {
033: return createStep(workflow, null, model, location);
034: }
035:
036: public static StepCell createStep(WorkflowDescriptor workflow,
037: StepDescriptor step, WorkflowGraphModel model,
038: Point location) {
039: Map viewMap = new Hashtable();
040: // create new step
041:
042: boolean exists = step != null;
043: if (step == null) {
044: String name = JOptionPane.showInputDialog(ResourceManager
045: .getString("step.add.name"));
046: if (name == null || name.trim().length() == 0)
047: return null;
048:
049: step = DescriptorBuilder.createStep(name, Utils
050: .getNextId(model.getContext()));
051: step.setParent(workflow);
052: workflow.addStep(step);
053: }
054:
055: int index = 0;
056: StepCell cell = new StepCell(step);
057: DefaultPort port = new WorkflowPort(index++);
058: cell.add(port);
059: if (location != null) {
060: Rectangle bounds = (Rectangle) cell.getAttributes().get(
061: GraphConstants.BOUNDS);
062: bounds.x = location.x;
063: bounds.y = location.y;
064: }
065: int u = GraphConstants.PERMILLE;
066: // Top Left
067: AttributeMap map = new AttributeMap();
068: GraphConstants.setOffset(map, new Point(0, 0));
069: port = new WorkflowPort(index++);
070: cell.add(port);
071: viewMap.put(port, map);
072:
073: // Top Center
074: map = new AttributeMap();
075: GraphConstants.setOffset(map, new Point(u / 2, 0));
076: port = new WorkflowPort(index++);
077: cell.add(port);
078: viewMap.put(port, map);
079:
080: // Top Right
081: map = new AttributeMap();
082: GraphConstants.setOffset(map, new Point(u, 0));
083: port = new WorkflowPort(index++);
084: cell.add(port);
085: viewMap.put(port, map);
086:
087: // Top Center
088: map = new AttributeMap();
089: GraphConstants.setOffset(map, new Point(0, u / 2));
090: port = new WorkflowPort(index++);
091: cell.add(port);
092: viewMap.put(port, map);
093:
094: // Middle Right
095: map = new AttributeMap();
096: GraphConstants.setOffset(map, new Point(u, u / 2));
097: port = new WorkflowPort(index++);
098: cell.add(port);
099: viewMap.put(port, map);
100:
101: // Bottom Left
102: map = new AttributeMap();
103: GraphConstants.setOffset(map, new Point(0, u));
104: port = new WorkflowPort(index++);
105: cell.add(port);
106: viewMap.put(port, map);
107:
108: // Bottom Center
109: map = new AttributeMap();
110: GraphConstants.setOffset(map, new Point(u / 2, u));
111: port = new WorkflowPort(index++);
112: cell.add(port);
113: viewMap.put(port, map);
114:
115: // Bottom Right
116: map = new AttributeMap();
117: GraphConstants.setOffset(map, new Point(u, u));
118: port = new WorkflowPort(index++);
119: cell.add(port);
120: viewMap.put(port, map);
121: model.insertStepCell(cell, viewMap, null, null);
122:
123: if (!exists) {
124: WorkflowDesigner.INSTANCE.navigator().reloadSteps(workflow);
125: WorkflowDesigner.INSTANCE.navigator().selectTreeNode(
126: workflow, step);
127: }
128: return cell;
129: }
130:
131: public static JoinCell createJoin(WorkflowDescriptor workflow,
132: WorkflowGraphModel model, Point location) {
133: JoinDescriptor join = DescriptorBuilder.createJoin(Utils
134: .getNextId(model.getContext()));
135: join.setParent(workflow);
136: workflow.addJoin(join);
137:
138: JoinCell cell = new JoinCell(join);
139: WorkflowPort port = new WorkflowPort();
140: cell.add(port);
141: Rectangle bounds = (Rectangle) cell.getAttributes().get(
142: GraphConstants.BOUNDS);
143: bounds.x = location.x;
144: bounds.y = location.y;
145: model.insertJoinCell(cell, null, null, null);
146:
147: WorkflowDesigner.INSTANCE.navigator().reloadJoins(workflow);
148: WorkflowDesigner.INSTANCE.navigator().selectTreeNode(workflow,
149: join);
150:
151: return cell;
152: }
153:
154: public static SplitCell createSplit(WorkflowDescriptor workflow,
155: WorkflowGraphModel model, Point location) {
156: SplitDescriptor split = DescriptorBuilder.createSplit(Utils
157: .getNextId(model.getContext()));
158: split.setParent(workflow);
159: workflow.addSplit(split);
160:
161: SplitCell cell = new SplitCell(split);
162: WorkflowPort port = new WorkflowPort();
163: cell.add(port);
164: Rectangle bounds = (Rectangle) cell.getAttributes().get(
165: GraphConstants.BOUNDS);
166: bounds.x = location.x;
167: bounds.y = location.y;
168: model.insertSplitCell(cell, null, null, null);
169:
170: WorkflowDesigner.INSTANCE.navigator().reloadSplits(workflow);
171: WorkflowDesigner.INSTANCE.navigator().selectTreeNode(workflow,
172: split);
173:
174: return cell;
175: }
176: }
|