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.model;
020:
021: import java.util.ArrayList;
022: import java.util.Collection;
023: import java.util.Collections;
024: import java.util.Iterator;
025: import java.util.List;
026: import org.netbeans.modules.bpel.design.model.patterns.CompositePattern;
027: import org.netbeans.modules.bpel.design.model.patterns.Pattern;
028: import org.netbeans.modules.bpel.design.selection.EntitySelectionModel;
029:
030: /**
031: *
032: * @author Vitaly Bychkov
033: * @version 1.0
034: */
035: public class DiagramModelHierarchyIterator implements
036: DiagramModelIterator {
037:
038: private DiagramModel model;
039: private EntitySelectionModel selectionModel;
040:
041: public DiagramModelHierarchyIterator(DiagramModel model,
042: EntitySelectionModel selectionModel) {
043: assert model != null && selectionModel != null;
044:
045: this .model = model;
046: this .selectionModel = selectionModel;
047: }
048:
049: public Pattern next() {
050: Pattern p = selectionModel.getSelectedPattern();
051:
052: if (p == null) {
053: return null;
054: }
055:
056: Pattern nextPattern = null;
057:
058: if (p instanceof CompositePattern
059: && !model.isCollapsed(p.getOMReference())) {
060: nextPattern = getNextNestedPattern((CompositePattern) p);
061: }
062:
063: if (nextPattern == null) {
064: nextPattern = getNextParentPattern(p);
065: }
066:
067: return nextPattern;
068: }
069:
070: public Pattern previous() {
071: Pattern p = selectionModel.getSelectedPattern();
072:
073: if (p == null) {
074: return null;
075: }
076: return getPrevParentPattern(p);
077: }
078:
079: private Pattern getPrevNestedPattern(CompositePattern pattern) {
080: if (pattern == null) {
081: return null;
082: }
083: Pattern prevPattern = null;
084:
085: List<Pattern> children = pattern.getNestedPatterns();
086: if (children == null) {
087: return pattern;
088: }
089:
090: int childSize = children.size();
091: for (int i = childSize - 1; i >= 0; i--) {
092: Pattern tmpPattern = children.get(i);
093: if (tmpPattern.isSelectable()) {
094: prevPattern = tmpPattern;
095: }
096:
097: if (tmpPattern instanceof CompositePattern) {
098: tmpPattern = getPrevNestedPattern((CompositePattern) tmpPattern);
099: if (tmpPattern != null && tmpPattern.isSelectable()) {
100: prevPattern = tmpPattern;
101: }
102: }
103:
104: if (prevPattern != null) {
105: break;
106: }
107: }
108:
109: return prevPattern == null ? pattern : prevPattern;
110: }
111:
112: private Pattern getNextNestedPattern(CompositePattern pattern) {
113: if (pattern == null) {
114: return null;
115: }
116: Pattern nextPattern = null;
117:
118: List<Pattern> children = pattern.getNestedPatterns();
119: for (Pattern elem : children) {
120: if (elem.isSelectable()) {
121: nextPattern = elem;
122: break;
123: }
124: }
125:
126: return nextPattern;
127: }
128:
129: private Pattern getPrevParentPattern(Pattern curPattern) {
130: if (curPattern == null) {
131: return curPattern;
132: }
133:
134: Pattern prevParent = null;
135: CompositePattern parent = curPattern.getParent();
136: if (parent == null) {
137: // hardcoded trick - loop shift tab way
138: Pattern rootPattern = curPattern.getModel()
139: .getRootPattern();
140: return rootPattern instanceof CompositePattern ? getPrevNestedPattern((CompositePattern) rootPattern)
141: : rootPattern;
142: }
143:
144: List<Pattern> children = parent.getNestedPatterns();
145: int curPatternIndex = children.indexOf(curPattern);
146: assert curPatternIndex > -1;
147:
148: for (int i = curPatternIndex - 1; i >= 0; i--) {
149: Pattern tmpPattern = children.get(i);
150: if (tmpPattern.isSelectable()) {
151: prevParent = tmpPattern;
152: }
153:
154: if (tmpPattern instanceof CompositePattern) {
155: tmpPattern = getPrevNestedPattern((CompositePattern) tmpPattern);
156: if (tmpPattern != null && tmpPattern.isSelectable()) {
157: prevParent = tmpPattern;
158: }
159: }
160:
161: if (prevParent != null) {
162: break;
163: }
164: }
165:
166: if (prevParent == null && !parent.isSelectable()) {
167: prevParent = getPrevParentPattern(parent);
168: }
169:
170: return prevParent == null ? parent : prevParent;
171: }
172:
173: private Pattern getNextParentPattern(Pattern pattern) {
174: if (pattern == null) {
175: return pattern;
176: }
177:
178: Pattern nextParent = null;
179: CompositePattern curParent = pattern.getParent();
180: if (curParent == null) {
181: // hardcoded trick - loop tab way
182: return pattern.getModel().getRootPattern();
183: }
184:
185: List<Pattern> nestedPatterns = curParent.getNestedPatterns();
186: int curPatternIndex = nestedPatterns.indexOf(pattern);
187: assert curPatternIndex > -1;
188:
189: for (int i = curPatternIndex + 1; i < nestedPatterns.size(); i++) {
190: Pattern tmpPattern = nestedPatterns.get(i);
191:
192: if (tmpPattern.isSelectable()) {
193: nextParent = tmpPattern;
194: } else if (!tmpPattern.isSelectable()
195: && tmpPattern instanceof CompositePattern) {
196: nextParent = getNextNestedPattern((CompositePattern) tmpPattern);
197: }
198:
199: if (nextParent != null) {
200: break;
201: }
202: }
203:
204: return nextParent == null ? getNextParentPattern(curParent)
205: : nextParent;
206: }
207: }
|