001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.etl.ui.view.wizards;
042:
043: import java.awt.Component;
044: import java.io.IOException;
045: import java.util.HashSet;
046: import java.util.List;
047: import java.util.NoSuchElementException;
048: import java.util.Set;
049:
050: import javax.swing.JComponent;
051: import javax.swing.event.ChangeListener;
052:
053: import org.openide.WizardDescriptor;
054:
055: /**
056: * A wizard iterator (sequence of panels). Used to create a wizard. Create one or more
057: * panels from template as needed too.
058: *
059: */
060: public abstract class ETLWizardIterator implements
061: WizardDescriptor.InstantiatingIterator {
062:
063: /** Tracks index of current panel */
064: protected transient int index = 0;
065:
066: /* Set <ChangeListener> */
067: private transient Set listeners = new HashSet(1);
068:
069: /* Contains panels to be iterated */
070: private transient WizardDescriptor.Panel[] panels = null;
071:
072: private transient WizardDescriptor wiz;
073:
074: // If something changes dynamically (besides moving between panels),
075: // e.g. the number of panels changes in response to user input, then
076: // implement fireChangeEvent().
077:
078: /**
079: * @see org.openide.WizardDescriptor.Iterator#addChangeListener
080: */
081: public final void addChangeListener(ChangeListener l) {
082:
083: synchronized (listeners) {
084: listeners.add(l);
085: }
086: }
087:
088: public int getIndex() {
089: return index;
090: }
091:
092: /**
093: * @see org.openide.WizardDescriptor.Iterator#current
094: */
095: public WizardDescriptor.Panel current() {
096: return getPanels(this .wiz)[index];
097: }
098:
099: /**
100: * @see org.openide.WizardDescriptor.Iterator#hasNext
101: */
102: public boolean hasNext() {
103: return index < getPanels(this .wiz).length - 1;
104: }
105:
106: /**
107: * @see org.openide.WizardDescriptor.Iterator#hasPrevious
108: */
109: public boolean hasPrevious() {
110: return index > 0;
111: }
112:
113: /**
114: * @see org.openide.WizardDescriptor.Iterator#name
115: */
116: public abstract String name();
117:
118: /**
119: * @see org.openide.WizardDescriptor.Iterator#nextPanel
120: */
121: public void nextPanel() {
122: if (!hasNext()) {
123: throw new NoSuchElementException();
124: }
125: index++;
126: }
127:
128: /**
129: * @see org.openide.WizardDescriptor.Iterator#previousPanel
130: */
131: public void previousPanel() {
132: if (!hasPrevious()) {
133: throw new NoSuchElementException();
134: }
135: index--;
136: }
137:
138: /**
139: * @see org.openide.WizardDescriptor.Iterator#removeChangeListener
140: */
141: public final void removeChangeListener(ChangeListener l) {
142: synchronized (listeners) {
143: listeners.remove(l);
144: }
145: }
146:
147: /**
148: * Creates list of panels to be displayed.
149: *
150: * @return List of panels
151: */
152: protected abstract List createPanels(WizardDescriptor wiz);
153:
154: /**
155: * Creates array of step descriptions
156: *
157: * @return array of Strings representing task summaries for each panel
158: */
159: protected abstract String[] createSteps();
160:
161: /**
162: * Gets panels to be displayed.
163: *
164: * @return array of WizardDescriptor.Panel objects
165: */
166: protected final WizardDescriptor.Panel[] getPanels(
167: WizardDescriptor wiz) {
168: if (panels == null) {
169: List myPanels = createPanels(wiz);
170:
171: WizardDescriptor.Panel[] pnlArray = new WizardDescriptor.Panel[myPanels
172: .size()];
173: panels = (WizardDescriptor.Panel[]) myPanels
174: .toArray(pnlArray);
175: }
176: return panels;
177: }
178:
179: /**
180: * Gets list of steps corresponding to each panel
181: *
182: * @return array of Strings summarizing the task in each panel
183: */
184: protected final String[] getSteps() {
185: return createSteps();
186: }
187:
188: public void initialize(WizardDescriptor wiz) {
189: this .panels = getPanels(wiz);
190: this .wiz = wiz;
191:
192: String[] steps = createSteps();
193: for (int i = 0; i < panels.length; i++) {
194: Component c = panels[i].getComponent();
195: if (steps[i] == null) {
196: // Default step name to component name of panel.
197: // Mainly useful for getting the name of the target
198: // chooser to appear in the list of steps.
199: steps[i] = c.getName();
200: }
201: if (c instanceof JComponent) { // assume Swing components
202: JComponent jc = (JComponent) c;
203: // Step #.
204: jc.putClientProperty(
205: "WizardPanel_contentSelectedIndex",
206: new Integer(i)); // NOI18N
207: // Step name (actually the whole list for reference).
208: jc.putClientProperty("WizardPanel_contentData", steps); // NOI18N
209: }
210: }
211: }
212:
213: public void uninitialize(WizardDescriptor wiz) {
214: this .wiz = null;
215: panels = null;
216: }
217:
218: public Set instantiate() throws IOException {
219: return new HashSet();
220: }
221:
222: }
|