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: package org.netbeans.modules.bpel.design;
020:
021: import java.awt.Container;
022: import java.awt.Point;
023: import java.awt.Rectangle;
024: import java.beans.PropertyChangeEvent;
025: import java.beans.PropertyChangeListener;
026: import java.util.LinkedList;
027: import java.util.List;
028: import javax.swing.SwingUtilities;
029: import org.netbeans.modules.bpel.design.model.patterns.Pattern;
030: import org.netbeans.modules.bpel.design.selection.DiagramSelectionListener;
031: import org.netbeans.modules.bpel.model.api.BpelEntity;
032: import org.netbeans.modules.bpel.model.api.BpelModel;
033: import org.netbeans.modules.bpel.nodes.BpelNode;
034: import org.openide.ErrorManager;
035: import org.openide.loaders.DataObject;
036: import org.openide.nodes.Node;
037: import org.openide.windows.TopComponent;
038:
039: /**
040: *
041: * @author root
042: */
043: public class SelectionBridge implements PropertyChangeListener,
044: DiagramSelectionListener
045:
046: {
047: private DesignView designView;
048: private boolean insideChangeNode = false;
049:
050: public SelectionBridge(DesignView designView) {
051: this .designView = designView;
052:
053: TopComponent.getRegistry().addPropertyChangeListener(this );
054:
055: designView.getSelectionModel().addSelectionListener(this );
056: }
057:
058: public void release() {
059: TopComponent.getRegistry().removePropertyChangeListener(this );
060: designView.getSelectionModel().removeSelectionListener(this );
061: designView = null;
062: }
063:
064: public void selectionChanged(BpelEntity oldSelection,
065: final BpelEntity newSelection) {
066: try {
067:
068: Node node = null;
069:
070: if (newSelection != null) {
071: node = designView.getNodeForPattern(designView
072: .getModel().getPattern(newSelection));
073: } else {
074: // Workaround for bug xxx:
075: // Set process as active node when nothing is been
076: // selected on diagram
077: // Otherwise the printing is broken
078: DataObject dobj = (DataObject) designView.getLookup()
079: .lookup(DataObject.class);
080:
081: if (dobj != null) {
082: node = dobj.getNodeDelegate();
083: }
084:
085: if (node == null) {
086: node = designView.getNodeForPattern(designView
087: .getModel().getRootPattern());
088: }
089: // Hack. Reset the active node before deleting element
090: // related to active node.
091: // see bug 6377934
092: }
093:
094: insideChangeNode = true;
095:
096: if (node != null) {
097: setActivatedNodes(new Node[] { node });
098: } else {
099: setActivatedNodes(new Node[] {});
100: }
101:
102: insideChangeNode = false;
103: } catch (Exception ex) {
104: ErrorManager.getDefault().notify(
105: ErrorManager.INFORMATIONAL, ex);
106: }
107: }
108:
109: public void propertyChange(PropertyChangeEvent evt) {
110:
111: if (designView != null) {
112: if (!designView.isVisible()) {
113: return;
114: }
115: }
116:
117: if (insideChangeNode) {
118: return;
119: }
120:
121: String propertyName = evt.getPropertyName();
122:
123: //ignore this event if model is in broken state
124: if (designView.getBPELModel().getState() != BpelModel.State.VALID) {
125: return;
126: }
127:
128: if (propertyName
129: .equals(TopComponent.Registry.PROP_ACTIVATED_NODES)) {
130: Node[] nodes = TopComponent.getRegistry()
131: .getActivatedNodes();
132: if (nodes.length != 1) {
133: return;
134: }
135:
136: TopComponent tc = TopComponent.getRegistry().getActivated();
137: /* Ignore event coming from my TC */
138: if (nodes[0] instanceof BpelNode) {
139:
140: Object ref = ((BpelNode) nodes[0]).getReference();
141: if (ref == null) {
142: return;
143: }
144:
145: if (ref instanceof BpelEntity) {
146: BpelEntity entity = (BpelEntity) ref;
147:
148: /**
149: * Iterate up to the root of entity hierarchy
150: * To find first entity wrapped with pattern
151: **/
152: designView.getModel().expandToBeVisible(entity);
153:
154: Pattern pattern = null;
155:
156: while (entity != null) {
157: pattern = designView.getModel().getPattern(
158: entity);
159: if (pattern != null) {
160: break;
161: }
162: entity = entity.getParent();
163: }
164:
165: if (pattern != null) {
166: designView.getSelectionModel().setSelected(
167: entity);
168: }
169:
170: designView.scrollSelectedToView();
171: }
172: }
173: }
174: }
175:
176: private void setActivatedNodes(final Node[] nodes) {
177: try {
178: TopComponent targetTopComponent = null;
179: Container container = (Container) designView;
180: while (container != null) { // Find TopComponent
181: if (container instanceof TopComponent) {
182: targetTopComponent = (TopComponent) container;
183: break;
184:
185: }
186: container = container.getParent();
187: }
188: if (targetTopComponent != null) {
189: targetTopComponent.setActivatedNodes(nodes);
190: }
191: } catch (Exception ex) {
192: ErrorManager.getDefault().notify(
193: ErrorManager.INFORMATIONAL, ex);
194: }
195: }
196:
197: }
|