![JAR search and dependency download from the Maven repository](/logo.png)
org.openide.loaders.TemplateWizard Maven / Gradle / Ivy
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.openide.loaders;
import java.awt.event.ActionEvent;
import java.io.*;
import java.lang.ref.*;
import java.net.*;
import java.text.MessageFormat;
import java.util.Collections;
import java.util.Enumeration;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.awt.Component;
import java.awt.Cursor;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.openide.*;
import org.openide.actions.ActionManager;
import org.openide.loaders.*;
import org.openide.filesystems.*;
import org.openide.filesystems.FileSystem; // override java.io.FileSystem
import org.openide.nodes.Node;
import org.openide.util.Lookup;
import org.openide.util.Mutex;
import org.openide.util.NbBundle;
import org.openide.windows.WindowManager;
/** Wizard for creation of new objects from a template.
*
* @author Jaroslav Tulach, Jiri Rechtacek
*/
public class TemplateWizard extends WizardDescriptor {
/** EA that defines the wizards description */
private static final String EA_DESCRIPTION = "templateWizardURL"; // NOI18N
/** EA that defines custom iterator*/
private static final String EA_ITERATOR = "templateWizardIterator"; // NOI18N
/** EA that defines resource string to the description instead of raw URL
* @deprecated
*/
private static final String EA_DESC_RESOURCE = "templateWizardDescResource"; // NOI18N
/** Defines the wizards description */
private static final String CUSTOM_DESCRIPTION = "instantiatingWizardURL"; // NOI18N
/** Defines custom iterator */
private static final String CUSTOM_ITERATOR = "instantiatingIterator"; // NOI18N
/** See org.openide.WizardDescriptor.PROP_CONTENT_SELECTED_INDEX
*/
private static final String PROP_CONTENT_SELECTED_INDEX = "WizardPanel_contentSelectedIndex"; // NOI18N
/** See org.openide.WizardDescriptor.PROP_CONTENT_DATA
*/
private static final String PROP_CONTENT_DATA = "WizardPanel_contentData"; // NOI18N
/** prefered dimmension of the panels */
static java.awt.Dimension PREF_DIM = new java.awt.Dimension (560, 350);
/** panel */
private Panel templateChooser;
/** panel */
private Panel targetChooser;
/** whether to show target chooser */
private boolean showTargetChooser = true;
/** Iterator for the targetChooser */
private Iterator targetIterator;
/** whole iterator */
private TemplateWizardIterImpl iterator;
/** values for wizards */
private DataObject template;
/** root of all templates */
private DataFolder templatesFolder;
/** class name of object to create */
private String targetName = null;
/** target folder*/
private DataFolder targetDataFolder;
/** This is true if we have already set a value to the title format */
private boolean titleFormatSet = false;
/** listenes on property (steps, index) changes and updates steps pane */
private PropertyChangeListener pcl;
/** Component which we are listening on for changes of steps */
private Component lastComp;
private Set newObjects = null;
/** Creates new TemplateWizard */
public TemplateWizard () {
this (new TemplateWizardIterImpl ());
}
/** Constructor to be called from public default one.
*/
private TemplateWizard (TemplateWizardIterImpl it) {
super (it);
this.iterator = it;
// pass this to iterator
iterator.initialize(this);
putProperty("WizardPanel_autoWizardStyle", Boolean.TRUE); // NOI18N
putProperty("WizardPanel_contentDisplayed", Boolean.TRUE); // NOI18N
putProperty("WizardPanel_contentNumbered", Boolean.TRUE); // NOI18N
setTitle(NbBundle.getMessage(TemplateWizard.class,"CTL_TemplateTitle")); //NOI18N
setTitleFormat(new java.text.MessageFormat("{0}")); // NOI18N
}
/** Constructor
* for wizards that require the target chooser or template
* chooser panel.
* @param it panel iterator instance
*/
protected TemplateWizard (TemplateWizard.Iterator it) {
this();
iterator.setIterator(it, false);
}
/** Initializes important settings.
*/
protected void initialize () {
if (iterator != null) {
iterator.initialize(this);
newObjects = null;
}
super.initialize ();
}
/** Getter for default filesystem to create objects on.
* @return the first non hidden filesystem or null if none
*/
final FileSystem getEnabledSystem () {
// search for a filesystem
Enumeration en = Repository.getDefault().fileSystems();
while (en.hasMoreElements()) {
FileSystem fs = (FileSystem)en.nextElement();
if (!fs.isHidden()) {
// found first non hidden filesystem
return fs;
}
}
return null;
}
/** This is method used by TemplateWizardPanel1 to change the template
*/
final void setTemplateImpl (DataObject obj, boolean notify) {
DataObject old = template;
if (template != obj) {
template = obj;
}
setTitle(NbBundle.getMessage(TemplateWizard.class, "CTL_TemplateTitle2",
obj.getNodeDelegate().getDisplayName()));
if (old != template) {
Iterator it;
if (
obj == null ||
(it = getIterator (obj)) == null
) {
it = defaultIterator ();
}
this.iterator.setIterator (it, notify);
}
}
/** Getter for template to create object from.
* @return template
*/
public DataObject getTemplate () {
return template;
}
/** Sets the template. If under the Templates/
* directory it will be selected by the dialog.
*
* @param obj the template to start with
*/
public void setTemplate (DataObject obj) {
if (obj != null) {
setTemplateImpl (obj, true);
}
}
/** Setter for the folder with templates. If not specified the
* Templates/ folder is used.
*
* @param folder the root folder for all templates if null the
* default folder is used
*/
public void setTemplatesFolder (DataFolder folder) {
templatesFolder = folder;
}
/** Getter for the folder with templates.
* @return the folder with templates that should be used as root
*/
public DataFolder getTemplatesFolder () {
DataFolder df = templatesFolder;
if (df == null) {
FileObject fo = Repository.getDefault ().getDefaultFileSystem ().findResource ("/Templates"); // NOI18N
if (fo != null && fo.isFolder ()) {
return DataFolder.findFolder (fo);
}
}
return df;
}
/** Getter for target folder. If the folder does not
* exists it is created at this point.
*
* @return the target folder
* @exception IOException if the possible creation of the folder fails
*/
public DataFolder getTargetFolder () throws IOException {
if (targetDataFolder == null) {
// bugfix #28357, check if filesystem is null
if (getEnabledSystem () == null) {
throw new IOException (NbBundle.getMessage(TemplateWizard.class, "ERR_NoFilesystem"));
}
targetDataFolder = DataFolder.findFolder (getEnabledSystem ().getRoot ());
}
return targetDataFolder;
}
// Note: called by reflection from projects/projectui/Hacks
private void reload (DataObject obj) {
Iterator it;
if (
obj == null ||
(it = getIterator (obj)) == null
) {
it = defaultIterator ();
}
this.iterator.setIterator (it, true);
}
/** Sets the target folder.
*
* @param f the folder
*/
public void setTargetFolder (DataFolder f) {
targetDataFolder = f;
}
/** Getter for the name of the target template.
* @return the name or null
if not yet set
*/
public String getTargetName () {
return targetName;
}
/** Setter for the name of the template.
* @param name name for the new object, or null
*/
public void setTargetName (String name) {
targetName = name;
}
/** Returns wizard panel that is used to choose a template.
* @return wizard panel
*/
public Panel templateChooser () {
synchronized (this) {
if (templateChooser == null) {
templateChooser = createTemplateChooser ();
}
}
return templateChooser;
}
/** Returns wizard panel that that is used to choose target folder and
* name of the template.
* @return wizard panel
*/
public Panel targetChooser () {
synchronized (this) {
if (targetChooser == null) {
targetChooser = createTargetChooser ();
}
}
return targetChooser;
}
/** Access method to the default iterator.
*/
final synchronized Iterator defaultIterator () {
if (targetIterator == null) {
targetIterator = createDefaultIterator ();
}
return targetIterator;
}
/** Method that allows subclasses to provide their own panel
* for choosing the template (the first panel).
*
* @return the panel
*/
protected Panel createTemplateChooser () {
return new TemplateWizardPanel1 ();
}
/** Method that allows subclasses to second (default) panel.
*
* @return the panel
*/
protected Panel createTargetChooser () {
return showTargetChooser ? (Panel)new TemplateWizardPanel2 () : (Panel)new NewObjectWizardPanel ();
}
/** Allows subclasses to provide their own default iterator
* the one that will be used if not special iterator is associated
* with selected template.
*
* This implementation creates iterator that just shows the targetChooser
* panel.
*
* @return the iterator to use as default one
*/
protected Iterator createDefaultIterator () {
return new DefaultIterator ();
}
/** Chooses the template and instantiates it.
* @return set of instantiated data objects (DataObject)
* or null if user canceled the dialog
* @exception IOException I/O error
*/
public java.util.Set instantiate () throws IOException {
showTargetChooser = true;
return instantiateImpl (null, null);
}
/** Chooses the template and instantiates it.
*
* @param template predefined template that should be instantiated
* @return set of instantiated data objects (DataObject)
* or null if user canceled the dialog
* @exception IOException I/O error
*/
public java.util.Set instantiate (DataObject template) throws IOException {
showTargetChooser = true;
return instantiateImpl (template, null);
}
/** Chooses the template and instantiates it.
*
* @param template predefined template that should be instantiated
* @param targetFolder the target folder
*
* @return set of instantiated data objects (DataObject)
* or null if user canceled the dialog
* @exception IOException I/O error
*/
public java.util.Set instantiate (
DataObject template, DataFolder targetFolder
) throws IOException {
showTargetChooser = false;
return instantiateImpl (template, targetFolder);
}
Set instantiateNewObjects () throws IOException {
try {
// #17341. The problem is handling ESC -> value is not
// set to CANCEL_OPTION for such cases.
Object option = getValue();
if(option == FINISH_OPTION || option == YES_OPTION
|| option == OK_OPTION) {
// show wait cursor when handling instantiate
showWaitCursor ();
newObjects = handleInstantiate ();
if (lastComp != null) {
lastComp.removePropertyChangeListener(propL());
lastComp = null;
}
} else {
if (lastComp != null) {
lastComp.removePropertyChangeListener(propL());
lastComp = null;
}
newObjects = null;
}
} finally {
// set normal cursor back
showNormalCursor ();
}
return newObjects;
}
/** Chooses the template and instantiates it.
* @param template predefined template or nothing
* @return set of instantiated data objects (DataObject)
* or null if user canceled the dialog
* @exception IOException I/O error
*/
private java.util.Set instantiateImpl (
DataObject template, DataFolder targetFolder
) throws IOException {
showTargetChooser |= targetFolder == null;
targetChooser = null;
// Bugfix #16161
// Message which cancelled the previous attempt to instantiate the
// template
Throwable thrownMessage = null;
// Bugfix #15458: Target folder should be set before readSettings of
// template wizard first panel is called.
if (targetFolder != null) {
setTargetFolder (targetFolder);
}
if (template != null) {
// force new template selection
this.template = null;
setTemplate (template);
// make sure that iterator is initialized
if (iterator != null) {
iterator.initialize(this);
}
} else if (iterator != null) {
iterator.initialize(this);
iterator.first();
}
try {
updateState();
// bugfix #40876, set null as initial value before show wizard
setValue (null);
final java.awt.Dialog d = DialogDisplayer.getDefault().createDialog(this);
// Bugfix #16161: if there was a message to the user, notify it
// after the dialog has been shown on screen:
if (thrownMessage != null) {
final Throwable t = thrownMessage;
thrownMessage = null;
d.addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentShown(java.awt.event.ComponentEvent e) {
if (t.getMessage() != null) {
// this is only for backward compatitility (plus bugfix #15618, using errMan to log stack trace)
ErrorManager.getDefault ().notify (ErrorManager.USER, t);
} else {
// this should be used (it checks for exception
// annotations and severity)
ErrorManager.getDefault().notify(t);
}
d.removeComponentListener(this);
}
});
}
d.show ();
} catch (IllegalStateException ise) {
thrownMessage = ise;
}
// here can return newObjects because instantiateNewObjects() was called
// from WizardDescriptor before close dialog (on Finish)
return newObjects;
}
private void showWaitCursor () {
//
// waiting times
//
Mutex.EVENT.writeAccess (new Runnable () {
public void run () {
try {
JFrame f = (JFrame)WindowManager.getDefault ().getMainWindow ();
Component c = f.getGlassPane ();
c.setVisible (true);
c.setCursor (Cursor.getPredefinedCursor (Cursor.WAIT_CURSOR));
} catch (NullPointerException npe) {
ErrorManager.getDefault ().notify (ErrorManager.INFORMATIONAL, npe);
}
}
});
}
private void showNormalCursor () {
//
// normal times
//
Mutex.EVENT.writeAccess (new Runnable () {
public void run () {
try {
JFrame f = (JFrame)WindowManager.getDefault ().getMainWindow ();
Component c = f.getGlassPane ();
c.setCursor (null);
c.setVisible (false);
} catch (NullPointerException npe) {
ErrorManager.getDefault ().notify (ErrorManager.INFORMATIONAL, npe);
}
}
});
}
/** Overriden to be able to set own default value for the title format.
* @param format message format
*/
public void setTitleFormat (MessageFormat format) {
titleFormatSet = true; // someone have set the title format
super.setTitleFormat(format);
}
/** Overriden to be able to set a default value for the title format.
* @return message format in title
*/
public MessageFormat getTitleFormat () {
if (!titleFormatSet) {
// we want to call this just for the first time getTitleFormat was called
// and not to call it when someone else called setTitleFormat
setTitleFormat (new MessageFormat (NbBundle.getMessage(TemplateWizard.class, "CTL_TemplateTitle")));
}
return super.getTitleFormat();
}
/** Calls iterator's instantiate. It is called when user selects
* a option which is not CANCEL_OPTION or CLOSED_OPTION.
* @throws IOException if the instantiation fails
* @return set of data objects that have been created (should contain
* at least one)
*/
protected java.util.Set handleInstantiate() throws IOException {
return iterator.getIterator ().instantiate (this);
}
/** Method to attach a description to a data object.
* It is suggested that the URL use the nbresloc
protocol.
* @param obj data object to attach description to
* @param url the url with description or null if there should be
* no description
* @exception IOException if I/O fails
*/
public static void setDescription (DataObject obj, URL url) throws IOException {
obj.getPrimaryFile().setAttribute(EA_DESCRIPTION, url);
obj.getPrimaryFile().setAttribute(CUSTOM_DESCRIPTION, url);
}
/** Method to get a description for a data object.
* @param obj data object to attach description to
* @return the url with description or null
*/
public static URL getDescription (DataObject obj) {
URL desc = (URL)obj.getPrimaryFile().getAttribute(CUSTOM_DESCRIPTION);
if (desc != null) return desc;
desc = (URL)obj.getPrimaryFile().getAttribute(EA_DESCRIPTION);
if (desc != null) return desc;
// Backwards compatibility:
String rsrc = (String) obj.getPrimaryFile ().getAttribute (EA_DESC_RESOURCE);
if (rsrc != null) {
try {
URL better = new URL ("nbresloc:/" + rsrc); // NOI18N
try {
setDescription (obj, better);
} catch (IOException ioe) {
// Oh well, just ignore.
}
return better;
} catch (MalformedURLException mfue) {
ErrorManager.getDefault().notify(mfue);
}
}
return null;
}
/** Set a description for a data object by resource path rather than raw URL.
* @deprecated Use {@link #setDescription} instead.
* @param obj data object to set description for
* @param rsrc a resource string, e.g. "com/foo/MyPage.html", or null
to clear
* @throws IOException if the attribute cannot be set
*/
public static void setDescriptionAsResource (DataObject obj, String rsrc) throws IOException {
if (rsrc != null && rsrc.startsWith ("/")) { // NOI18N
ErrorManager.getDefault().log(ErrorManager.WARNING, "Warning: auto-stripping leading slash from resource path in TemplateWizard.setDescriptionAsResource: " + rsrc);
rsrc = rsrc.substring (1);
}
obj.getPrimaryFile ().setAttribute (EA_DESC_RESOURCE, rsrc);
}
/** Get a description as a resource.
* @param obj the data object
* @return the resource path, or null
if unset (incl. if only set as a raw URL)
* @deprecated Use {@link #getDescription} instead.
*/
public static String getDescriptionAsResource (DataObject obj) {
return (String) obj.getPrimaryFile ().getAttribute (EA_DESC_RESOURCE);
}
/** Allows to attach a special Iterator to a template. This allows
* templates to completelly control the way they are instantiated.
*
* Better way for providing an Iterator is to return it from the
* dataobject.getCookie (TemplateWizard.Iterator.class)
* call.
*
* @param obj data object
* @param iter TemplateWizard.Iterator to use for instantiation of this
* data object, or null
to clear
* @exception IOException if I/O fails
*
* @deprecated since 2.13 you should provide the iterator from getCookie
method
*/
public static void setIterator (DataObject obj, Iterator iter)
throws IOException {
obj.getPrimaryFile().setAttribute(CUSTOM_ITERATOR, iter);
obj.getPrimaryFile().setAttribute(EA_ITERATOR, iter);
}
/** Finds a custom iterator attached to a template that should
* be used to instantiate the object. First of all it checks
* whether there is an iterator attached by setIterator
method, if not it asks the
* data object for the Iterator as cookie.
*
* @param obj the data object
* @return custom iterator or null
*/
public static Iterator getIterator (DataObject obj) {
Object unknownIterator = obj.getPrimaryFile ().getAttribute(CUSTOM_ITERATOR);
if (unknownIterator == null) {
unknownIterator = obj.getPrimaryFile ().getAttribute(EA_ITERATOR);
}
Iterator it = null;
if (unknownIterator instanceof Iterator) {
// old style iterator
it = (Iterator)unknownIterator;
} if (unknownIterator instanceof WizardDescriptor.InstantiatingIterator) {
it = new TemplateWizard.Brigde2Iterator ((WizardDescriptor.InstantiatingIterator) unknownIterator);
}
if (it != null) {
return it;
}
return (Iterator)obj.getCookie (Iterator.class);
}
// helper check for windows, its filesystem is case insensitive (workaround the bug #33612)
/** Check existence of file on case insensitive filesystem.
* Returns true if folder contains file with given name and extension.
* @param folder folder for search
* @param name name of file
* @param extension extension of file
* @return true if file with name and extension exists, false otherwise.
*/
static boolean checkCaseInsensitiveName (FileObject folder, String name, String extension) {
// bugfix #41277, check only direct children
Enumeration children = folder.getChildren (false);
FileObject fo;
while (children.hasMoreElements ()) {
fo = (FileObject) children.nextElement ();
if (extension.equalsIgnoreCase (fo.getExt ()) && name.equalsIgnoreCase (fo.getName ())) {
return true;
}
}
return false;
}
/** Overriden to add/remove listener to/from displayed component. Also make recreation
* of steps and content.
*/
protected void updateState() {
super.updateState();
if (lastComp != null) {
lastComp.removePropertyChangeListener(propL());
}
// listener
lastComp = iterator.current().getComponent();
lastComp.addPropertyChangeListener(propL());
// compoun steps pane info
putProperty(PROP_CONTENT_SELECTED_INDEX,
new Integer(getContentSelectedIndex()));
if (getContentData() != null) {
putProperty(PROP_CONTENT_DATA, getContentData());
}
}
/**
* @return String[] content taken from first panel and delegated iterator or null if
* delegated iterator doesn't supplied content steps name
*/
private String[] getContentData() {
Component first = templateChooser().getComponent();
if (iterator.current() == templateChooser()) {
// return first panel steps
return (String[])((JComponent)first).getClientProperty(PROP_CONTENT_DATA);
}
String[] cd = null;
Component c = iterator.current().getComponent();
if (c instanceof JComponent) {
// merge first panel name with delegated iterator steps
Object property = ((JComponent)c).getClientProperty(PROP_CONTENT_DATA);
if (property instanceof String[]) {
String[] cont = (String[])property;
Object value = ((JComponent)first).getClientProperty(PROP_CONTENT_DATA);
if (value instanceof String[]) {
cd = new String[cont.length + 1];
cd[0] = ((String[])value)[0];
System.arraycopy(cont, 0, cd, 1, cont.length);
} else {
cd = new String[cont.length];
System.arraycopy(cont, 0, cd, 0, cont.length);
}
}
}
return cd;
}
/** Returns selected item in content
* @return int selected index of content
*/
private int getContentSelectedIndex() {
if (iterator.current() == templateChooser()) {
return 0;
}
Component c = iterator.current().getComponent();
if (c instanceof JComponent) {
// increase supplied selected index by one (template chooser)
Object property = ((JComponent)c).getClientProperty(PROP_CONTENT_SELECTED_INDEX);
if ((property instanceof Integer)) {
return ((Integer)property).intValue() + 1;
}
}
return 1;
}
final TemplateWizardIterImpl getIterImpl () {
return iterator;
}
/** Listens on content property changes in delegated iterator. Updates Wizard
* descriptor properties.
*/
private PropertyChangeListener propL() {
if (pcl == null) {
pcl = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent ev) {
if (PROP_CONTENT_SELECTED_INDEX.equals(ev.getPropertyName())) {
putProperty(PROP_CONTENT_SELECTED_INDEX,
new Integer(getContentSelectedIndex()));
} else {
if ((PROP_CONTENT_DATA.equals(ev.getPropertyName())) && (getContentData() != null)) {
putProperty(PROP_CONTENT_DATA, getContentData());
}
}
}
};
}
return pcl;
}
/** The interface for custom iterator. Enhances to WizardDescriptor.Iterator
* by serialization and ability to instantiate the object.
*
* All Panels provided by this iterator will receive a TemplateWizard
* as the settings object and they are encourage to store its data by the
* use of putProperty
method and read it using getProperty
.
*
* Implements Node.Cookie
since version 2.13
*/
public interface Iterator extends WizardDescriptor.Iterator,
java.io.Serializable, org.openide.nodes.Node.Cookie {
/** Instantiates the template using information provided by
* the wizard. If instantiation fails then wizard remains open to enable correct values.
*
* @return set of data objects that have been created (should contain
* at least one)
* @param wiz the wizard
* @exception IOException if the instantiation fails
*/
public java.util.Set instantiate (TemplateWizard wiz)
throws IOException;
/** Initializes the iterator after it is constructed.
* The iterator can for example obtain the {@link #targetChooser target chooser}
* from the wizard if it does not wish to provide its own.
* @param wiz template wizard that wishes to use the iterator
*/
public void initialize(TemplateWizard wiz);
/** Informs the Iterator that the TemplateWizard finished using the Iterator.
* The main purpose of this method is to perform cleanup tasks that should
* not be left on the garbage collector / default cleanup mechanisms.
* @param wiz wizard which is no longer being used
*/
public void uninitialize(TemplateWizard wiz);
} // end of Iterator
/** Implementation of default iterator.
*/
private final class DefaultIterator implements Iterator {
DefaultIterator() {}
/** Name */
public String name () {
return ""; // NOI18N
}
/** Instantiates the template using informations provided by
* the wizard.
*
* @param wiz the wizard
* @return set of data objects that has been created (should contain
* at least one)
* @exception IOException if the instantiation fails
*/
public java.util.Set instantiate(TemplateWizard wiz) throws IOException {
String n = wiz.getTargetName ();
DataFolder folder = wiz.getTargetFolder ();
DataObject template = wiz.getTemplate ();
DataObject obj = n == null ?
template.createFromTemplate (folder)
:
template.createFromTemplate (folder, n);
// run default action (hopefully should be here)
final Node node = obj.getNodeDelegate ();
final Action a = node.getPreferredAction();
if (a != null) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
a.actionPerformed(new ActionEvent(node, ActionEvent.ACTION_PERFORMED, "")); // NOI18N
}
});
}
return java.util.Collections.singleton(obj);
}
/** No-op implementation.
*/
public void initialize(TemplateWizard wiz) {
}
/** No-op implementation.
*/
public void uninitialize(TemplateWizard wiz) {
}
/** Get the current panel.
* @return the panel
*/
public Panel current() {
return targetChooser ();
}
/** Test whether there is a next panel.
* @return true
if so
*/
public boolean hasNext() {
return false;
}
/** Test whether there is a previous panel.
* @return true
if so
*/
public boolean hasPrevious() {
return false;
}
/** Move to the next panel.
* I.e. increment its index, need not actually change any GUI itself.
* @exception NoSuchElementException if the panel does not exist
*/
public void nextPanel() {
throw new java.util.NoSuchElementException ();
}
/** Move to the previous panel.
* I.e. decrement its index, need not actually change any GUI itself.
* @exception NoSuchElementException if the panel does not exist
*/
public void previousPanel() {
throw new java.util.NoSuchElementException ();
}
/** Add a listener to changes of the current panel.
* The listener is notified when the possibility to move forward/backward changes.
* @param l the listener to add
*/
public void addChangeListener(javax.swing.event.ChangeListener l) {
}
/** Remove a listener to changes of the current panel.
* @param l the listener to remove
*/
public void removeChangeListener(javax.swing.event.ChangeListener l) {
}
}
static class Brigde2Iterator implements TemplateWizard.Iterator {
private WizardDescriptor.InstantiatingIterator instantiatingIterator;
public Brigde2Iterator (WizardDescriptor.InstantiatingIterator it) {
instantiatingIterator = it;
}
public void addChangeListener (javax.swing.event.ChangeListener l) {
instantiatingIterator.addChangeListener (l);
}
public org.openide.WizardDescriptor.Panel current () {
return instantiatingIterator.current ();
}
public boolean hasNext () {
return instantiatingIterator.hasNext ();
}
public boolean hasPrevious () {
return instantiatingIterator.hasPrevious ();
}
public String name () {
return instantiatingIterator.name ();
}
public void nextPanel () {
instantiatingIterator.nextPanel ();
}
public void previousPanel () {
instantiatingIterator.previousPanel ();
}
public void removeChangeListener (javax.swing.event.ChangeListener l) {
instantiatingIterator.removeChangeListener (l);
}
public void initialize (TemplateWizard wiz) {
instantiatingIterator.initialize (wiz);
}
public Set/**/ instantiate (TemplateWizard wiz) throws IOException {
// iterate Set and replace unexpected object with dataobjects
Set workSet = instantiatingIterator.instantiate ();
java.util.Iterator it = workSet.iterator ();
Object obj;
DataObject dobj;
HashSet resultSet = new HashSet (workSet.size ());
while (it.hasNext ()) {
obj = it.next ();
assert obj != null;
if (obj instanceof DataObject) continue;
if (obj instanceof FileObject) {
try {
dobj = DataObject.find ((FileObject)obj);
resultSet.add (dobj);
} catch (DataObjectNotFoundException ex) {
assert false : obj;
}
} else if (obj instanceof Node) {
dobj = (DataObject)((Node)obj).getCookie (DataObject.class);
resultSet.add (dobj);
assert dobj != null : obj;
}
}
return resultSet;
}
public void uninitialize (TemplateWizard wiz) {
instantiatingIterator.uninitialize (wiz);
}
}
/*
public static void main (String[] args) throws java.lang.Exception {
TemplateWizard wiz = new TemplateWizard ();
FileObject fo = FileSystemCapability.ALL.findResource(
"Templates/AWTForms/Frame.java"
);
DataObject obj = DataObject.find (fo);
fo = FileSystemCapability.ALL.findResource(
"test"
);
DataFolder f = DataFolder.findFolder(fo);
wiz.instantiate();
}
*/
}