<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
 <title>Wizard guidebook</title>
    <link rel="stylesheet" href="../../../prose.css" type="text/css"/>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <meta name="topic" content="openide/dialogs"/>
    <meta name="type" content="article"/>
    <meta name="audience" content="nbdeveloper"/>
    <meta name="description" content="Guidebook of using WizardDescriptor API."/>
    <meta name="author" content="jrojcek@netbeans.org,jrechtacek@netbeans.org"/>
    <meta name="indexed" content="y"/>
    <style type="text/css">
    </style>
</head>

<h1>Wizard Descriptor API</h1>

<body>

Class <a href="../WizardDescriptor.html"><code>WizardDescriptor</code></a>

allows developer to create wizard from supplied 
<a href="../WizardDescriptor.Iterator.html"><code>WizardDescriptor.Iterator</code></a>
or array of 
<a href="../WizardDescriptor.Panel.html"><code>WizardDesriptor.Panel</code></a>.

<br><br>

<code>WizardDescriptor</code> can create wizard panel (steps, graphics, help on
the left; subtitle and user panel on the right). To achieve that, developer
have to use <code>WizardDescriptor.putProperty()</code> or 
<code>JComponent.putClientProperty()</code>

in his/her panel to set needed properties (e.g. <code>String[]</code> for steps, 
<code>URL</code> for help, some <code>Boolean</code> for layout control, ...). 

<br><br>

To create simple wizard try this: 

<pre>
WizardDescriptor wd = new WizardDescriptor(
    new WizardDescriptor.Panel[] { 
        myPanel1, 
        myPanel2, 
        myPanel3,
        myPanel4 
}); 
</pre>

It will create four steps wizard with no additional graphic.
To achieve creation of subtitle, steps pane, help tab, ... one have to
set initialization properties. 

<br><br>

<h2>Wizard panel initialization</h2>

Use 
<a href="../WizardDescriptor.html#putProperty-java.lang.String-java.lang.Object-">
<code>WizardDescriptor.putProperty()</code></a> to set following initialization 
properties.
<ul>
<li><tt>
Name <b> <code>"WizardPanel_autoWizardStyle"</code></b>, type <b> <code>Boolean</code></b>

<br>
    The key property for layouting of wizard dialog. <b>Recommended to be set <code>Boolean.TRUE</code></b> to most cases.
    <br>If switch on <code>WizardPanel_autoWizardStyle</code> then wizard can display wizards steps
    on the left side, create a subtitle on active panel, display of error messages and others.
    Wizards infrastructure will check the properties:
    <ul>
        <li><code>WizardPanel_contentDisplayed</code></li>
        <li><code>WizardPanel_helpDisplayed</code></li>
        <li><code>WizardPanel_contentNumbered</code></li>
    </ul>
    If doesn't set or set to <code>Boolean.FALSE</code> then these properties <b>are ignored</b>.
<br>
<br>
Also set to <code>Boolean.TRUE</code> to turn on subtitle creation from
<a href="../WizardDescriptor.Panel.html#getComponent--">
<code>WizardDesriptor.Panel.getComponent()</code></a><code>.getName()</code>
as first and 
<a href="../WizardDescriptor.Iterator.html#name--">
<code>WizardDescriptor.Iterator.name()</code></a> as second parameter in subtitle
format set with 
<a href="../WizardDescriptor.html#setTitleFormat-java.text.MessageFormat-">
<code>WizardDesriptor.setTitleFormat()</code></a>. 
Default subtitle format is <code>"{0} wizard ({1})"</code> and name of default 

<a href="../WizardDescriptor.ArrayIterator.html">
<code>WizardDescriptor.ArrayIterator</code></a> is 
<code>"{0} of {1}"</code>
where <code>{0}</code> is number of current panel and <code>{1}</code> is size of iterator. 
<br>

</tt></li>
<br><br>

<li><tt>
Name <b> <code>"WizardPanel_contentDisplayed"</code></b>, type <b> <code>Boolean</code></b>
<br>
Set to <code>Boolean.TRUE</code> to turn on displaying of steps pane 
(content, behind which can be displayed image).
Content will be constructed from not initialization property <code>"WizardPanel_contentData"</code>.

</tt></li>

<br><br>

<li><tt>
Name <b> <code>"WizardPanel_helpDisplayed"</code></b>, type <b> <code>Boolean</code></b>
<br>
Set to <code>Boolean.TRUE</code> to turn on displaying of help (html browser)
in a special tabbed pane of wizard panel. <br>
Help will be taken from not initialization property <code>"WizardPanel_helpURL"</code>.
If also steps are displayed then put help and content panes into tabbed pane.
<br>
<br>
<i>Note: If do you need a help on invoking the Help button then ensure
a <code>WizardDescriptor.Panel</code> supply a non-default <code>HelpCtx</code>.</i>

</tt></li>

<br><br>

<li><tt>
Name <b> <code>"WizardPanel_contentNumbered"</code></b>, type <b> <code>Boolean</code></b>
<br>
Set to <code>Boolean.TRUE</code> to turn on numbering of steps (before every step
is placed it's sequence number). 

</tt></li>

<br><br>

<li><tt>
Name <b> <code>"WizardPanel_leftDimension"</code></b>, type <b> <code>Dimension</code></b>
<br>
Set size of left pane (steps and help pane). 
</tt></li>
</ul>

That was initialization part. All <code>Boolean</code> properties are <code>Boolean.FALSE</code>
by default. Initialization properties could be set
also in the first panel (through <code>JComponent.putClientProperty()</code>) of supplied
iterator. Later change of these properties will not cause change of wizard
behavior. Properties have to be set before <code>TopManager.getDefault().createDialog(wd)</code>
is called. 
<br>
Follow properties which could be changed at wizard runtime.

<br><br>

<h2>Wizard panel properties</h2>

These properties could be changed dynamically.

<ul>
<li><tt>
Name <b> <code>"WizardPanel_contentData"</code></b>, type <b> <code>String[]</code></b>
<br>
Set step names which will be displayed in the content pane.

<br><br>

<li><tt>
Name <b> <code>"WizardPanel_image"</code></b>, type <b> <code>java.awt.Image</code></b>

<br>
Set image displayed as background of content. 
</tt></li>

<br><br>

<li><tt>
Set subtitle (!!!) format with 
<a href="../WizardDescriptor.html#setTitleFormat-java.text.MessageFormat-">
<code>WizardDescriptor.setTitleFormat()</code></a>.
</tt></li>

<br><br>

<li><tt>
Set title of the wizard with 

<a href="../NotifyDescriptor.html#setTitle-java.lang.String-">
<code>WizardDescriptor.setTitle()</code></a>. 
</tt></li>
<br><br>

<li><tt>
Name <b><code>"WizardPanel_errorMessage"</code></b>, type <b> <code>String</code></b>
<br>
Set the localized message which is then shown at the bottom of the wizard panel.
This message should be set when panel becomes invalid and Next/Finish
buttons are disabled. It helps user to understand what is wrong. The property
must be set to null value to clear the message. This property is supported since
NetBeans 3.5.
</tt></li>

</ul>

In every
panel set these client properties (<code>JComponent.putClientProperty()</code>): 

<ul>
<li><tt>
Name <b> <code>"WizardPanel_helpURL"</code></b>, type <b> <code>java.net.URL</code></b>
<br>
Help url which explains your pane. 
</tt></li>

<br><br>

<li><tt>
Name <b> <code>"WizardPanel_contentSelectedIndex"</code></b>, type <b> <code>java.lang.Integer</code></b>
<br>
Index of highlighted step in the content, the index is zero-based.
</tt></li>

<br><br>

<li><tt>
Name <b> <code>"WizardPanel_contentBackgroundColor"</code></b>, type <b> <code>java.awt.Color</code></b>
<br>
Color used as background of content pane. 
</tt></li>

<br><br>

<li><tt>
Set name of panel <code>JComponent.setName("First wizard panel")</code>, 
used as first part of subtitle, second
is 

<a href="../WizardDescriptor.Iterator.html#name--">
<code>WizardDescriptor.Panel.name()</code></a> when you use <code>"{0}{1}"</code> message format.
</tt></li>

</ul>

All properties could be set with
both alternatives (<a href="../WizardDescriptor.html#putProperty-java.lang.String-java.lang.Object-"><code>WizardDescriptor.putProperty()</code></a> or 
<code>JComponent.putClientProperty()</code>)
except <b><code>"WizardPanel_helpURL"</code></b> which can be set only with 
<code>JComponent.putClientProperty()</code> and the property <b><code>"WizardPanel_errorMessage"</code></b> which can be set only by
<a href="../WizardDescriptor.html#putProperty-java.lang.String-java.lang.Object-"><code>WizardDescriptor.putProperty()</code></a>.
<br>
If both are used at the same time then 
<a href="../WizardDescriptor.html#putProperty-java.lang.String-java.lang.Object-">
<code>WizardDescriptor.putProperty()</code></a> matters.
<a href="../WizardDescriptor.html">
<code>WizardDescriptor</code></a> listens on property changes of not initialization properties
and makes immediate changes.

</body>
</html>
