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.geometry.FRectangle;
027: import org.netbeans.modules.bpel.design.layout.LayoutManager;
028: import org.netbeans.modules.bpel.design.model.DiagramModel;
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.OnAlarmEvent;
040: import org.netbeans.modules.bpel.model.api.Scope;
041:
042: public class OnAlarmEventPattern extends CompositePattern {
043:
044: private VisualElement timerEvent;
045: private Connection connection;
046: private PlaceHolderElement placeHolder;
047:
048: public OnAlarmEventPattern(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 timerEvent;
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: timerEvent = ContentElement.createTimerEvent();
076: timerEvent.setLabelText("Timer"); // NOI18N
077: appendElement(timerEvent);
078:
079: placeHolder = new PlaceHolderElement();
080: appendElement(placeHolder);
081:
082: BpelEntity activity = ((OnAlarmEvent) getOMReference())
083: .getScope();
084:
085: if (activity != null) {
086: Pattern p = getModel().createPattern(activity);
087: p.setParent(this );
088: }
089: }
090:
091: public FBounds layoutPattern(LayoutManager manager) {
092:
093: double height = timerEvent.getHeight() + LayoutManager.HSPACING;
094: double width = timerEvent.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: timerEvent.setCenter(eventX, -height / 2
119: + timerEvent.getHeight() / 2);
120:
121: getBorder().setClientRectangle(-width / 2, -height / 2, width,
122: height);
123: return getBorder().getBounds();
124:
125: }
126:
127: public void createPlaceholders(Pattern draggedPattern,
128: Collection<PlaceHolder> placeHolders) {
129: if (draggedPattern == this )
130: return;
131: if (isNestedIn(draggedPattern))
132: return;
133: if (!(draggedPattern.getOMReference() instanceof ExtendableActivity))
134: return;
135: if (placeHolder.getPattern() != null) {
136: placeHolders.add(new InnerPlaceHolder(draggedPattern));
137: }
138: }
139:
140: public String getDefaultName() {
141: return "OnAlarm"; // NOI18N
142: }
143:
144: public NodeType getNodeType() {
145: return NodeType.ALARM_EVENT_HANDLER;
146: }
147:
148: public void reconnectElements() {
149: if (connection == null) {
150: connection = new Connection(this );
151: }
152:
153: if (getNestedPatterns().isEmpty()) {
154: connection.connect(timerEvent, Direction.BOTTOM,
155: placeHolder, Direction.TOP);
156: } else {
157: connection
158: .connect(timerEvent, Direction.BOTTOM,
159: getNestedPattern().getFirstElement(),
160: Direction.TOP);
161: }
162: }
163:
164: public Area createSelection() {
165: Area res = new Area(getBorder().getShape());
166: res.subtract(new Area(timerEvent.getShape()));
167: return res;
168: }
169:
170: class InnerPlaceHolder extends PlaceHolder {
171: public InnerPlaceHolder(Pattern draggedPattern) {
172: super (OnAlarmEventPattern.this , draggedPattern, placeHolder
173: .getCenterX(), placeHolder.getCenterY());
174: }
175:
176: public void drop() {
177: if (getDraggedPattern().getOMReference() instanceof Scope) {
178: ((OnAlarmEvent) getOMReference())
179: .setScope((Scope) getDraggedPattern()
180: .getOMReference());
181: } else {
182: Scope scope = getOwnerPattern().getBpelModel()
183: .getBuilder().createScope();
184: scope
185: .setActivity((ExtendableActivity) getDraggedPattern()
186: .getOMReference());
187: ((OnAlarmEvent) getOMReference()).setScope(scope);
188: }
189: }
190: }
191: }
|