KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > schema > ui > basic > wizard > SchemaWizardIterator


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19 package org.netbeans.modules.xml.schema.ui.basic.wizard;
20
21 //java imports
22
import java.awt.Component JavaDoc;
23 import java.io.IOException JavaDoc;
24 import java.util.ArrayList JavaDoc;
25 import java.util.Arrays JavaDoc;
26 import java.util.Collections JavaDoc;
27 import java.util.HashSet JavaDoc;
28 import java.util.Iterator JavaDoc;
29 import java.util.List JavaDoc;
30 import java.util.NoSuchElementException JavaDoc;
31 import java.util.Set JavaDoc;
32 import javax.swing.JComponent JavaDoc;
33 import javax.swing.event.ChangeListener JavaDoc;
34 import javax.swing.event.ChangeEvent JavaDoc;
35 import javax.swing.event.UndoableEditListener JavaDoc;
36
37 //netbeans imports
38
import org.netbeans.api.project.Project;
39 import org.netbeans.api.project.ProjectUtils;
40 import org.netbeans.api.project.SourceGroup;
41 import org.netbeans.api.project.Sources;
42 import org.netbeans.editor.BaseDocument;
43 import org.netbeans.modules.xml.xam.ui.ProjectConstants;
44 import org.openide.WizardDescriptor;
45 import org.openide.filesystems.FileObject;
46 import org.openide.loaders.DataFolder;
47 import org.openide.loaders.DataObject;
48 import org.openide.util.NbBundle;
49 import org.openide.cookies.EditCookie;
50 import org.openide.cookies.EditorCookie;
51 import org.openide.cookies.SaveCookie;
52 import org.openide.loaders.TemplateWizard;
53 import org.netbeans.spi.project.ui.templates.support.Templates;
54
55
56 /**
57  * Schema wizard iterator. This guy is responsible for showing appropriate GUI
58  * panels to the user, collecting inputs from those panels and based on those
59  * collected inputs, will instantiate schema from templates.
60  *
61  * See layer.xml for template declaration.
62  *
63  * Read http://performance.netbeans.org/howto/dialogs/wizard-panels.html.
64  *
65  * @author Samaresh (Samaresh.Panda@Sun.Com)
66  */

67 public class SchemaWizardIterator extends Object JavaDoc implements TemplateWizard.Iterator {
68         
69     private static final long serialVersionUID = 1L;
70     private int index;
71     private final Set JavaDoc<ChangeListener JavaDoc> changeListeners = new HashSet JavaDoc<ChangeListener JavaDoc>();
72     private transient WizardDescriptor.Panel[] panels;
73     private transient WizardDescriptor.Panel schemaPanel;
74     private SchemaAdditionalInfoGUI schemaGUI;
75         
76     /**
77      * You should define what panels you want to use here:
78      */

79     protected WizardDescriptor.Panel[] createPanels (Project project,
80                              final TemplateWizard wizard) {
81         Sources sources = ProjectUtils.getSources(project);
82     List JavaDoc<SourceGroup> roots = new ArrayList JavaDoc<SourceGroup>();
83     SourceGroup[] javaRoots =
84         sources.getSourceGroups(ProjectConstants.JAVA_SOURCES_TYPE);
85     roots.addAll(Arrays.asList(javaRoots));
86     if (roots.isEmpty()) {
87         SourceGroup[] sourceGroups = sources.getSourceGroups(Sources.TYPE_GENERIC);
88         roots.addAll(Arrays.asList(sourceGroups));
89     }
90         schemaPanel = new SchemaAdditionalInfoPanel();
91     schemaGUI = (SchemaAdditionalInfoGUI) schemaPanel.getComponent();
92     DataFolder folder = DataFolder.findFolder(roots.get(0).getRootFolder());
93     DataFolder projectFolder =
94         DataFolder.findFolder(project.getProjectDirectory());
95     try {
96         if (wizard.getTargetFolder().equals(projectFolder)) {
97         wizard.setTargetFolder(folder);
98         }
99     } catch (IOException JavaDoc ioe) {
100         wizard.setTargetFolder(folder);
101     }
102         WizardDescriptor.Panel panel =
103             Templates.createSimpleTargetChooser(project,
104         roots.toArray(new SourceGroup[roots.size()]), schemaPanel);
105     schemaGUI.setParentPanel(panel);
106     return new WizardDescriptor.Panel[] {panel};
107     }
108     
109     /**
110      * Initialization of the wizard iterator.
111      */

112     public void initialize(TemplateWizard wizard) {
113         index = 0;
114         Project project = Templates.getProject( wizard );
115         panels = createPanels (project, wizard);
116         
117         // Creating steps.
118
Object JavaDoc prop = wizard.getProperty ("WizardPanel_contentData"); // NOI18N
119
String JavaDoc[] beforeSteps = null;
120         if (prop instanceof String JavaDoc[]) {
121             beforeSteps = (String JavaDoc[])prop;
122         }
123         String JavaDoc[] steps = createSteps (beforeSteps, panels);
124         
125         for (int i = 0; i < panels.length; i++) {
126             Component JavaDoc c = panels[i].getComponent ();
127             if (steps[i] == null) {
128                 // Default step name to component name of panel.
129
// Mainly useful for getting the name of the target
130
// chooser to appear in the list of steps.
131
steps[i] = c.getName ();
132             }
133             if (c instanceof JComponent JavaDoc) { // assume Swing components
134
JComponent JavaDoc jc = (JComponent JavaDoc) c;
135                 // Step #.
136
jc.putClientProperty ("WizardPanel_contentSelectedIndex", Integer.valueOf(i)); // NOI18N
137
// Step name (actually the whole list for reference).
138
jc.putClientProperty ("WizardPanel_contentData", steps); // NOI18N
139
}
140         }
141     }
142
143     /**
144      * Cleanup.
145      */

146     public void uninitialize (TemplateWizard wiz) {
147         panels = null;
148     }
149
150     /**
151      * This is where, the schema gets instantiated from the template.
152      */

153     public Set JavaDoc instantiate (TemplateWizard wizard) throws IOException JavaDoc {
154         String JavaDoc tns = schemaGUI.getTargetNamespace();
155         
156         FileObject dir = Templates.getTargetFolder( wizard );
157         DataFolder df = DataFolder.findFolder( dir );
158         FileObject template = Templates.getTemplate( wizard );
159         DataObject dTemplate = DataObject.find( template );
160         DataObject dobj = dTemplate.createFromTemplate( df, Templates.getTargetName( wizard ) );
161         if (dobj == null)
162             return Collections.emptySet();
163             
164         EditCookie edit = (EditCookie) dobj.getCookie (EditCookie.class);
165         if (edit != null) {
166             EditorCookie editorCookie = (EditorCookie)dobj.getCookie(EditorCookie.class);
167             BaseDocument doc = (BaseDocument)editorCookie.openDocument();
168             UndoableEditListener JavaDoc[] listeners = doc.getUndoableEditListeners();
169             for(UndoableEditListener JavaDoc l : listeners) {
170                 doc.removeUndoableEditListener(l);
171             }
172             if(tns.length() == 0) tns = SchemaAdditionalInfoGUI.DEFAULT_TARGET_NAMESPACE;
173             replaceInDocument(doc, "#TARGET_NAMESPACE", tns); //NOI18N
174

175             SaveCookie save = (SaveCookie)dobj.getCookie(SaveCookie.class);
176             if (save!=null) save.save();
177             for(UndoableEditListener JavaDoc l : listeners) {
178                 doc.addUndoableEditListener(l);
179             }
180         }
181         return Collections.singleton(dobj.getPrimaryFile());
182     }
183                 
184     /**
185      *
186      */

187     public void addChangeListener(ChangeListener JavaDoc listener) {
188         changeListeners.add(listener);
189     }
190
191     /**
192      *
193      *
194      */

195     public void removeChangeListener(ChangeListener JavaDoc listener) {
196         changeListeners.remove(listener);
197     }
198     
199     /**
200      *
201      */

202     public void fireStateChanged() {
203         ChangeEvent JavaDoc event = new ChangeEvent JavaDoc(this);
204
205         Iterator JavaDoc<ChangeListener JavaDoc> i = changeListeners.iterator();
206         while (i.hasNext()) {
207             try {
208                 i.next().stateChanged(event);
209             } catch (Exception JavaDoc e) {
210                 //Debug.debugNotify(e);
211
}
212         }
213     }
214     
215     /**
216      *
217      */

218     public String JavaDoc name () {
219         return NbBundle.getMessage(SchemaWizardIterator.class, "TITLE_x_of_y",
220             Integer.valueOf(index + 1), Integer.valueOf(panels.length));
221     }
222     
223     /**
224      *
225      */

226     public boolean hasNext () {
227         return index < panels.length - 1;
228     }
229     
230     /**
231      *
232      */

233     public boolean hasPrevious () {
234         return index > 0;
235     }
236     
237     /**
238      *
239      */

240     public void nextPanel () {
241         if (! hasNext ()) throw new NoSuchElementException JavaDoc ();
242         index++;
243     }
244     
245     /**
246      *
247      */

248     public void previousPanel () {
249         if (! hasPrevious ()) throw new NoSuchElementException JavaDoc ();
250         index--;
251     }
252     
253     /**
254      * Returns the current panel.
255      */

256     public WizardDescriptor.Panel current () {
257         return panels[index];
258     }
259
260     /**
261      * Create steps.
262      */

263     private String JavaDoc[] createSteps(String JavaDoc[] before, WizardDescriptor.Panel[] panels) {
264         //assert panels != null;
265
// hack to use the steps set before this panel processed
266
int diff = 0;
267         if (before == null) {
268             before = new String JavaDoc[0];
269         } else if (before.length > 0) {
270             diff = ("...".equals (before[before.length - 1])) ? 1 : 0; // NOI18N
271
}
272         String JavaDoc[] res = new String JavaDoc[ (before.length - diff) + panels.length];
273         for (int i = 0; i < res.length; i++) {
274             if (i < (before.length - diff)) {
275                 res[i] = before[i];
276             } else {
277                 res[i] = panels[i - before.length + diff].getComponent ().getName ();
278             }
279         }
280         return res;
281     }
282     
283     /**
284      * Utility method to replace text in document.
285      */

286     private void replaceInDocument(javax.swing.text.Document JavaDoc document, String JavaDoc replaceFrom, String JavaDoc replaceTo) {
287         javax.swing.text.AbstractDocument JavaDoc doc = (javax.swing.text.AbstractDocument JavaDoc)document;
288         int len = replaceFrom.length();
289         try {
290             String JavaDoc content = doc.getText(0,doc.getLength());
291             int index = content.lastIndexOf(replaceFrom);
292             while (index>=0) {
293                 doc.replace(index,len,replaceTo,null);
294                 content=content.substring(0,index);
295                 index = content.lastIndexOf(replaceFrom);
296             }
297         } catch (javax.swing.text.BadLocationException JavaDoc ex){}
298     }
299
300 }
301
Popular Tags