001: /*
002: * The contents of this file are subject to the terms of the Common Development
003: * and Distribution License (the License). You may not use this file except in
004: * compliance with the License.
005: *
006: * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
007: * or http://www.netbeans.org/cddl.txt.
008: *
009: * When distributing Covered Code, include this CDDL Header Notice in each file
010: * and include the License file at http://www.netbeans.org/cddl.txt.
011: * If applicable, add the following below the CDDL Header, with the fields
012: * enclosed by brackets [] replaced by your own identifying information:
013: * "Portions Copyrighted [year] [name of copyright owner]"
014: *
015: * The Original Software is NetBeans. The Initial Developer of the Original
016: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
017: * Microsystems, Inc. All Rights Reserved.
018: */
019:
020: package org.netbeans.modules.bpel.design.model.patterns;
021:
022: import java.awt.geom.Area;
023: import java.util.Collection;
024: import org.netbeans.modules.bpel.design.geometry.FBounds;
025: import org.netbeans.modules.bpel.design.geometry.FDimension;
026: import org.netbeans.modules.bpel.design.layout.LayoutManager;
027: import org.netbeans.modules.bpel.design.model.DiagramModel;
028: import org.netbeans.modules.bpel.design.model.PartnerLinkHelper;
029: import org.netbeans.modules.bpel.design.model.connections.Connection;
030: import org.netbeans.modules.bpel.design.model.connections.Direction;
031: import org.netbeans.modules.bpel.design.model.elements.ContentElement;
032: import org.netbeans.modules.bpel.design.model.elements.GroupBorder;
033: import org.netbeans.modules.bpel.design.model.elements.PlaceHolderElement;
034: import org.netbeans.modules.bpel.design.model.elements.VisualElement;
035: import org.netbeans.modules.bpel.editors.api.nodes.NodeType;
036: import org.netbeans.modules.bpel.design.selection.PlaceHolder;
037: import org.netbeans.modules.bpel.model.api.BpelEntity;
038: import org.netbeans.modules.bpel.model.api.ExtendableActivity;
039: import org.netbeans.modules.bpel.model.api.OnEvent;
040: import org.netbeans.modules.bpel.model.api.Scope;
041:
042: public class OnEventPattern extends CompositePattern {
043:
044: private VisualElement messageEvent;
045: private Connection connection;
046: private PlaceHolderElement placeHolder;
047:
048: public OnEventPattern(DiagramModel model) {
049: super (model);
050: }
051:
052: protected void onAppendPattern(Pattern p) {
053: removeElement(placeHolder);
054: }
055:
056: protected void onRemovePattern(Pattern p) {
057: appendElement(placeHolder);
058: }
059:
060: public VisualElement getFirstElement() {
061: return messageEvent;
062: }
063:
064: public VisualElement getLastElement() {
065: if (getNestedPatterns().isEmpty()) {
066: return placeHolder;
067: }
068: return getNestedPattern().getLastElement();
069: }
070:
071: protected void createElementsImpl() {
072: setBorder(new GroupBorder());
073: getBorder().setLabelText(getDefaultName());
074:
075: messageEvent = ContentElement.createMessageEvent();
076: messageEvent.setLabelText("Event"); // NOI18N
077: appendElement(messageEvent);
078:
079: placeHolder = new PlaceHolderElement();
080: appendElement(placeHolder);
081:
082: BpelEntity activity = ((OnEvent) getOMReference()).getScope();
083:
084: if (activity != null) {
085: Pattern p = getModel().createPattern(activity);
086: p.setParent(this );
087: }
088: }
089:
090: public FBounds layoutPattern(LayoutManager manager) {
091:
092: double height = messageEvent.getHeight()
093: + LayoutManager.HSPACING;
094: double width = messageEvent.getWidth();
095:
096: double eventX;
097:
098: if (getNestedPatterns().isEmpty()) {
099: height += placeHolder.getHeight();
100: width = Math.max(width, placeHolder.getWidth());
101:
102: placeHolder.setCenter(0, height / 2
103: - placeHolder.getHeight() / 2);
104:
105: eventX = 0;
106: } else {
107: Pattern p = getNestedPattern();
108:
109: FBounds pSize = p.getBounds();
110: eventX = -pSize.width / 2 + manager.getOriginOffset(p).x;
111:
112: height += pSize.height;
113: width = Math.max(width, pSize.width);
114: manager.setPatternPosition(p, -pSize.width / 2, height / 2
115: - pSize.height);
116: }
117:
118: messageEvent.setCenter(eventX, -height / 2
119: + messageEvent.getHeight() / 2);
120: getBorder().setClientRectangle(-width / 2, -height / 2, width,
121: height);
122:
123: return getBorder().getBounds();
124: }
125:
126: public void createPlaceholders(Pattern draggedPattern,
127: Collection<PlaceHolder> placeHolders) {
128: if (draggedPattern == this )
129: return;
130: if (isNestedIn(draggedPattern))
131: return;
132: if (!(draggedPattern.getOMReference() instanceof ExtendableActivity))
133: return;
134:
135: if (placeHolder.getPattern() != null) {
136: placeHolders.add(new InnerPlaceHolder(draggedPattern));
137: }
138:
139: }
140:
141: public String getDefaultName() {
142: return "OnEvent"; // NOI18N
143: }
144:
145: public NodeType getNodeType() {
146: return NodeType.ON_EVENT;
147: }
148:
149: public void reconnectElements() {
150: if (connection == null) {
151: connection = new Connection(this );
152: }
153:
154: if (getNestedPatterns().isEmpty()) {
155: connection.connect(messageEvent, Direction.BOTTOM,
156: placeHolder, Direction.TOP);
157: } else {
158: connection
159: .connect(messageEvent, Direction.BOTTOM,
160: getNestedPattern().getFirstElement(),
161: Direction.TOP);
162: }
163: clearConnectionsExcept(connection);
164: new PartnerLinkHelper(getModel()).updateMessageFlowLinks(this );
165: }
166:
167: public Area createSelection() {
168: Area res = new Area(getBorder().getShape());
169: res.subtract(new Area(messageEvent.getShape()));
170: return res;
171: }
172:
173: class InnerPlaceHolder extends PlaceHolder {
174: public InnerPlaceHolder(Pattern draggedPattern) {
175: super (OnEventPattern.this , draggedPattern, placeHolder
176: .getCenterX(), placeHolder.getCenterY());
177: }
178:
179: public void drop() {
180: if (getDraggedPattern().getOMReference() instanceof Scope) {
181: ((OnEvent) getOMReference())
182: .setScope((Scope) getDraggedPattern()
183: .getOMReference());
184: } else {
185: Scope scope = getOwnerPattern().getBpelModel()
186: .getBuilder().createScope();
187: scope
188: .setActivity((ExtendableActivity) getDraggedPattern()
189: .getOMReference());
190: ((OnEvent) getOMReference()).setScope(scope);
191: }
192: }
193: }
194: }
|