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.Cursor;
023: import java.awt.geom.Area;
024:
025: import java.net.URL;
026: import java.util.Collection;
027: import java.util.concurrent.Callable;
028: import javax.swing.SwingUtilities;
029: import org.netbeans.api.project.FileOwnerQuery;
030: import org.netbeans.api.project.Project;
031: import org.netbeans.modules.bpel.design.DesignView;
032: import org.netbeans.modules.bpel.design.DnDHandler;
033: import org.netbeans.modules.bpel.design.geometry.FBounds;
034: import org.netbeans.modules.bpel.design.geometry.FRange;
035: import org.netbeans.modules.bpel.design.model.elements.ContentElement;
036: import org.netbeans.modules.bpel.design.selection.DefaultPlaceholder;
037: import org.netbeans.modules.bpel.model.api.Activity;
038: import org.netbeans.modules.bpel.model.api.BpelEntity;
039: import org.netbeans.modules.bpel.model.api.BpelModel;
040: import org.netbeans.modules.bpel.model.api.EventHandlers;
041: import org.netbeans.modules.bpel.model.api.ExtendableActivity;
042: import org.netbeans.modules.bpel.model.api.FaultHandlers;
043: import org.netbeans.modules.bpel.model.api.Import;
044: import org.netbeans.modules.bpel.model.api.PartnerLink;
045: import org.netbeans.modules.bpel.model.api.PartnerLinkContainer;
046: import org.netbeans.modules.bpel.model.api.Process;
047: import org.netbeans.modules.bpel.design.geometry.FPoint;
048: import org.netbeans.modules.bpel.design.layout.LayoutManager;
049: import org.netbeans.modules.bpel.design.model.DiagramModel;
050: import org.netbeans.modules.bpel.design.model.PartnerLinkHelper;
051: import org.netbeans.modules.bpel.design.model.connections.Connection;
052: import org.netbeans.modules.bpel.design.model.connections.Direction;
053: import org.netbeans.modules.bpel.design.model.elements.PlaceHolderElement;
054: import org.netbeans.modules.bpel.design.model.elements.ProcessBorder;
055: import org.netbeans.modules.bpel.design.model.elements.VisualElement;
056: import org.netbeans.modules.bpel.editors.api.nodes.NodeType;
057: import org.netbeans.modules.bpel.design.selection.PlaceHolder;
058: import org.netbeans.modules.bpel.properties.ImportRegistrationHelper;
059: import org.netbeans.modules.soa.ui.UserNotification;
060: import org.netbeans.modules.soa.ui.form.CustomNodeEditor;
061: import org.netbeans.modules.websvc.core.WebServiceReference;
062: import org.openide.ErrorManager;
063: import org.openide.filesystems.FileObject;
064: import org.openide.filesystems.FileStateInvalidException;
065: import org.openide.util.NbBundle;
066: import org.openide.util.RequestProcessor;
067:
068: /**
069: *
070: * @author Alexey Yarmolenko
071: */
072: public class ProcessPattern extends CompositePattern {
073:
074: private PlaceHolderElement placeHolder;
075:
076: private VisualElement startEvent;
077: private VisualElement endEvent;
078:
079: private Connection connection1;
080: private Connection connection2;
081:
082: private Connection eventHandlersConnection;
083: private VisualElement eventsBadge;
084:
085: private Connection faultHandlersConnection;
086: private VisualElement faultBadge;
087:
088: public ProcessPattern(DiagramModel model) {
089: super (model);
090: connection1 = new Connection(this );
091: connection2 = new Connection(this );
092: }
093:
094: public VisualElement getFirstElement() {
095: return null;
096: }
097:
098: public VisualElement getLastElement() {
099: return null;
100: }
101:
102: public boolean isDraggable() {
103: return false;
104: }
105:
106: protected void onAppendPattern(Pattern p) {
107: BpelEntity entity = p.getOMReference();
108:
109: if (entity instanceof EventHandlers) {
110: appendElement(eventsBadge);
111: } else if (entity instanceof FaultHandlers) {
112: appendElement(faultBadge);
113: } else if (!(p instanceof PartnerLinksPattern)) {
114: removeElement(placeHolder);
115: }
116: }
117:
118: protected void onRemovePattern(Pattern p) {
119: Process process = (Process) getOMReference();
120:
121: if (eventsBadge.hasPattern()
122: && (process.getEventHandlers() == null)) {
123: removeElement(eventsBadge);
124: } else if (faultBadge.hasPattern()
125: && (process.getFaultHandlers() == null)) {
126: removeElement(faultBadge);
127: } else if (!(p instanceof PartnerLinksPattern)) {
128: appendElement(placeHolder);
129: }
130: }
131:
132: public CompositePattern getParent() {
133: return null;
134: }
135:
136: public FBounds layoutPattern(LayoutManager manager) {
137: Collection<Pattern> patterns = super .getNestedPatterns();
138:
139: Process process = (Process) getOMReference();
140:
141: FRange rangeX = new FRange(0);
142: double y;
143: double yMax = 0;
144:
145: Pattern rootActivityPattern = getRootActivityPattern();
146: startEvent.setCenter(0, 0);
147: yMax += LayoutManager.VSPACING + startEvent.getHeight() / 2;
148:
149: rangeX.extend(startEvent.getWidth() / 2);
150: rangeX.extend(-startEvent.getWidth() / 2);
151:
152: double contentWidth;
153: double contentHeight;
154:
155: if (rootActivityPattern == null) {
156: contentWidth = Math.max(placeHolder.getWidth(),
157: MIN_CONTENT_WIDTH);
158: contentHeight = Math.max(placeHolder.getHeight(),
159: MIN_CONTENT_HEIGHT);
160: } else {
161: FBounds contentSize = rootActivityPattern.getBounds();
162: contentWidth = Math.max(contentSize.width,
163: MIN_CONTENT_WIDTH);
164: contentHeight = Math.max(contentSize.height,
165: MIN_CONTENT_HEIGHT);
166: }
167:
168: double contentTop = startEvent.getHeight() / 2
169: + LayoutManager.VSPACING;
170: double contentBottom = contentTop + contentHeight;
171:
172: if (rootActivityPattern == null) {
173: placeHolder.setCenter(0, contentTop + contentHeight / 2);
174:
175: rangeX.extend(contentWidth / 2);
176: rangeX.extend(-contentWidth / 2);
177: } else {
178: FBounds clientSize = rootActivityPattern.getBounds();
179: FPoint origin = manager
180: .getOriginOffset(rootActivityPattern);
181:
182: double contentPadding = (contentWidth - clientSize.width) / 2;
183:
184: manager.setPatternPosition(rootActivityPattern, -origin.x,
185: contentTop + (contentHeight - clientSize.height)
186: / 2);
187:
188: yMax += clientSize.height + LayoutManager.VSPACING;
189:
190: endEvent.setCenter(0f, yMax + endEvent.getHeight() / 2);
191:
192: rangeX.extend(-origin.x - contentPadding);
193: rangeX.extend(clientSize.width - origin.x + contentPadding);
194: }
195:
196: endEvent.setCenter(0, contentBottom + LayoutManager.VSPACING
197: + endEvent.getHeight() / 2);
198:
199: double y0 = -startEvent.getHeight() / 2;
200: double y1 = contentBottom + LayoutManager.VSPACING
201: + endEvent.getHeight();
202:
203: getBorder().setClientRectangle(rangeX.min, y0,
204: rangeX.getSize(), y1 - y0);
205:
206: FBounds result = getBorder().getBounds();
207:
208: PartnerLinkContainer plc = process.getPartnerLinkContainer();
209:
210: if (plc != null) {
211: PartnerLinksPattern plc_pattern = (PartnerLinksPattern) getModel()
212: .getPattern(plc);
213: if (plc_pattern != null && plc_pattern.isInModel()) {
214:
215: manager.setPatternPosition(plc_pattern, 0, 0);
216:
217: //plc_pattern.optimizePositions(manager);
218: }
219: }
220:
221: EventHandlers eventHandlers = process.getEventHandlers();
222: FaultHandlers faultHandlers = process.getFaultHandlers();
223:
224: if ((eventHandlers == null) && (faultHandlers == null))
225: return null;
226:
227: double paddingTop = getBorder().getInsets().top;
228:
229: double badgeX = result.x + result.width;
230: double badgeY = startEvent.getY() + eventsBadge.getHeight() / 2;
231:
232: double lastBadgeBottom = 0;
233:
234: double handlerX = badgeX + LayoutManager.HSPACING;
235: double handlerY = badgeY + LayoutManager.VSPACING;
236:
237: if (eventHandlers != null) {
238: Pattern p = getNestedPattern(eventHandlers);
239: eventsBadge.setCenter(badgeX, badgeY);
240:
241: lastBadgeBottom = badgeY + eventsBadge.getHeight() / 2;
242:
243: manager.setPatternPosition(p, handlerX, handlerY);
244:
245: double handlerHeight = p.getBounds().height + 2
246: * LayoutManager.VSPACING;
247:
248: badgeY += handlerHeight;
249: handlerY += handlerHeight;
250: }
251:
252: if (faultHandlers != null) {
253: Pattern p = getNestedPattern(faultHandlers);
254: faultBadge.setCenter(badgeX, badgeY);
255:
256: lastBadgeBottom = badgeY + eventsBadge.getHeight() / 2;
257:
258: manager.setPatternPosition(p, handlerX, handlerY);
259:
260: double handlerHeight = p.getBounds().height + 2
261: * LayoutManager.VSPACING;
262: badgeY += handlerHeight;
263: handlerY += handlerHeight;
264:
265: }
266:
267: getBorder().setClientRectangle(rangeX.min, y0,
268: rangeX.getSize(), Math.max(y1, lastBadgeBottom) - y0);
269:
270: return null;
271: }
272:
273: public boolean isCollapsable() {
274: return false;
275: }
276:
277: protected void createElementsImpl() {
278:
279: setBorder(new ProcessBorder());
280: registerTextElement(getBorder());
281:
282: //getBorder().setLabelText("Process");
283:
284: Process process = (Process) getOMReference();
285:
286: startEvent = ContentElement.createStartEvent();
287: startEvent.setText("Process Start"); // NOI18N
288:
289: endEvent = ContentElement.createEndEvent();
290: endEvent.setText("Process End"); // NOI18N
291:
292: placeHolder = new PlaceHolderElement();
293:
294: appendElement(startEvent);
295: appendElement(endEvent);
296: appendElement(placeHolder);
297:
298: ExtendableActivity a = process.getActivity();
299:
300: if (a != null) {
301: Pattern p = getModel().createPattern(a);
302: p.setParent(this );
303: }
304:
305: if (getModel().getFilters().showPartnerlinks()
306: && process.getPartnerLinkContainer() != null) {
307: Pattern p = getModel().createPattern(
308: process.getPartnerLinkContainer());
309: p.setParent(this );
310: }
311:
312: // Init handlers
313: eventsBadge = ContentElement.createEventBadge();
314: faultBadge = ContentElement.createFaultBadge();
315:
316: EventHandlers eventHandlers = process.getEventHandlers();
317: FaultHandlers faultHandlers = process.getFaultHandlers();
318:
319: if (eventHandlers != null) {
320: Pattern p = getModel().createPattern(eventHandlers);
321: p.setParent(this );
322: //appendElement(eventsBadge);
323: }
324:
325: if (faultHandlers != null) {
326: Pattern p = getModel().createPattern(faultHandlers);
327: p.setParent(this );
328: //appendElement(faultBadge);
329: }
330: }
331:
332: public String getDefaultName() {
333: return "Process"; // NOI18N
334: }
335:
336: public void createPlaceholders(Pattern draggedPattern,
337: Collection<PlaceHolder> placeHolders) {
338: if (draggedPattern == this )
339: return;
340:
341: if (draggedPattern instanceof ImportPattern) {
342: placeHolders.add(new ImportPlaceholder(draggedPattern));
343: } else if (draggedPattern.getOMReference() instanceof Activity
344: &&
345:
346: getRootActivityPattern() == null) {
347: placeHolders.add(new InnerPlaceHolder(draggedPattern));
348: }
349: }
350:
351: public NodeType getNodeType() {
352: return NodeType.PROCESS;
353: }
354:
355: public void reconnectElements() {
356:
357: Pattern rootActivity = getRootActivityPattern();
358:
359: if (rootActivity == null) {
360: connection1.connect(startEvent, Direction.BOTTOM,
361: placeHolder, Direction.TOP);
362:
363: connection2.connect(placeHolder, Direction.BOTTOM,
364: endEvent, Direction.TOP);
365: } else {
366: connection1.connect(startEvent, Direction.BOTTOM,
367: rootActivity.getFirstElement(), Direction.TOP);
368:
369: connection2.connect(rootActivity.getLastElement(),
370: Direction.BOTTOM, endEvent, Direction.TOP);
371: }
372:
373: Pattern eventHandlersPattern = getEventHandlersPattern();
374: Pattern faultHandlersPattern = getFaultHandlersPattern();
375:
376: if (eventHandlersPattern != null) {
377: if (eventHandlersConnection == null) {
378: eventHandlersConnection = new Connection(this );
379: }
380:
381: eventHandlersConnection.connect(eventsBadge,
382: Direction.RIGHT, eventHandlersPattern
383: .getFirstElement(), Direction.TOP);
384: } else if (eventHandlersConnection != null) {
385: eventHandlersConnection.remove();
386: eventHandlersConnection = null;
387: }
388:
389: if (faultHandlersPattern != null) {
390: if (faultHandlersConnection == null) {
391: faultHandlersConnection = new Connection(this );
392: }
393: faultHandlersConnection.connect(faultBadge,
394: Direction.RIGHT, faultHandlersPattern
395: .getFirstElement(), Direction.TOP);
396: } else if (faultHandlersConnection != null) {
397: faultHandlersConnection.remove();
398: faultHandlersConnection = null;
399: }
400: }
401:
402: private Pattern getEventHandlersPattern() {
403: EventHandlers eh = ((Process) getOMReference())
404: .getEventHandlers();
405: return (eh != null) ? getNestedPattern(eh) : null;
406: }
407:
408: private Pattern getFaultHandlersPattern() {
409: FaultHandlers fh = ((Process) getOMReference())
410: .getFaultHandlers();
411: return (fh != null) ? getNestedPattern(fh) : null;
412: }
413:
414: private Pattern getRootActivityPattern() {
415: Activity a = (Activity) ((Process) getOMReference())
416: .getActivity();
417: return (a != null) ? getNestedPattern(a) : null;
418: }
419:
420: public Area createSelection() {
421: Area a = new Area(getBorder().getShape());
422: if (faultBadge.getPattern() != null) {
423: a.add(new Area(faultBadge.getShape()));
424: }
425: if (eventsBadge.getPattern() != null) {
426: a.add(new Area(eventsBadge.getShape()));
427: }
428: a.subtract(new Area(startEvent.getShape()));
429: a.subtract(new Area(endEvent.getShape()));
430: return a;
431: }
432:
433: public void reloadPartnerlinks() {
434: PartnerLinkContainer plc = ((Process) getOMReference())
435: .getPartnerLinkContainer();
436:
437: if (plc == null) {
438: return;
439: }
440:
441: PartnerLinksPattern plp = (PartnerLinksPattern) getNestedPattern(plc);
442:
443: if (plp != null) {
444: plp.setParent(null);
445: }
446:
447: if (getModel().getFilters().showPartnerlinks() && plc != null) {
448: Pattern p = getModel().createPattern(plc);
449: p.setParent(this );
450: }
451:
452: }
453:
454: public void updateAccordingToViewFiltersStatus() {
455:
456: reloadPartnerlinks();
457:
458: }
459:
460: class ImportPlaceholder extends DefaultPlaceholder {
461: public ImportPlaceholder(Pattern dndPattern) {
462: super (ProcessPattern.this , dndPattern);
463:
464: }
465:
466: public void drop() {
467:
468: Pattern pattern = getDraggedPattern();
469:
470: BpelModel model = getModel().getView().getBPELModel();
471:
472: Import new_imp = (Import) pattern.getOMReference();
473:
474: if (pattern.getParent() == null) {
475: if (getModel()
476: .getView()
477: .showCustomEditor(
478: pattern,
479: CustomNodeEditor.EditingMode.CREATE_NEW_INSTANCE)) {
480: new ImportRegistrationHelper(model)
481: .addImport(new_imp);
482: }
483: }
484: }
485: }
486:
487: class InnerPlaceHolder extends PlaceHolder {
488: public InnerPlaceHolder(Pattern draggedPattern) {
489: super (ProcessPattern.this , draggedPattern, placeHolder
490: .getCenterX(), placeHolder.getCenterY());
491: }
492:
493: public void drop() {
494: Pattern p = getDraggedPattern();
495: ((Process) getOMReference()).setActivity((Activity) p
496: .getOMReference());
497: }
498: }
499:
500: private static final float INITIAL_SIZE = 200;
501:
502: private static final float MIN_CONTENT_WIDTH = 200;
503: private static final float MIN_CONTENT_HEIGHT = 200;
504:
505: public Connection getConnection1() {
506: return connection1;
507: }
508:
509: public Connection getConnection2() {
510: return connection2;
511: }
512:
513: }
|