<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>A Place for John on the Web &#187; Development</title>
	<atom:link href="http://www.siberian.org/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.siberian.org</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 21 Mar 2010 14:51:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Enum based ComboBoxes in GXT</title>
		<link>http://www.siberian.org/2010/03/20/enum-based-comboboxes-in-gxt/</link>
		<comments>http://www.siberian.org/2010/03/20/enum-based-comboboxes-in-gxt/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 03:54:38 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[GWT/GXT]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.siberian.org/?p=240</guid>
		<description><![CDATA[Working with GXT is interesting. You combine utter frustration and time wasting with incredible breakthroughs that make you say &#8216;I could have never done that so easily in another framework.&#8217; In a way all frameworks are like this I suppose.
My most recent problem/breakthrough was around enums. The particular app in question uses GXT in the [...]]]></description>
			<content:encoded><![CDATA[<p>Working with GXT is interesting. You combine utter frustration and time wasting with incredible breakthroughs that make you say &#8216;I could have never done that so easily in another framework.&#8217; In a way all frameworks are like this I suppose.</p>
<p>My most recent problem/breakthrough was around enums. The particular app in question uses GXT in the browser, a set of native client apps on the users PC and an XML-RPC layer that glues them all together <em>(yes, I still love XML-RPC, give me type safety over syntactical sugar any day of the week. Plus, we have libraries that make syntax a non-issue. But I diverge..). </em>The client is written in C++/C# and does a lot of state tracking using, of course, enumerations, with a mirrored set of enums on the server-side.</p>
<p>These enums are natively persisted into the database using <a href="http://cwiki.apache.org/CAYDOC/modeling-enumerations.html" target="_blank">Cayenne&#8217;s Extended Enumeration</a> feature making the entire transaction fairly seamless, until I got to the browser level and realized that GXT likes to treat everything as a <a href="http://www.extjs.com/deploy/gxtdocs/com/extjs/gxt/ui/client/store/Store.html">Store</a> and, beyond that, sending a native Cayenne class to the browser as a module was not going to work well since the Javascript Compiler would probably flip over and croak. After searching for awhile I finally came across a mix of recipes that works for me and thought I would commit my knowledge to Google and hope that I help others in the future.</p>
<h2>Step 1: Normalize your Enum into your GWT *.client.* package space.</h2>
<p>Yes, you must duplicate your enum OR move it to this space and change all accessors. Its a bit more complicated if your using a non-native enum (like the above mentioned Extended Enumeration for Cayenne). I ended up just making a copy of my Extended Enumerations as POE (Plain Ole Enumerations). Duplicative code AND prone to error when we change states but it worked.</p>
<p>Mine looks like this:</p>
<pre>public enum BudgetPeriod {
     DAILY("Daily"),WEEKLY("Weekly"),MONTHLY("Monthly"),QUARTERLY("Quarterly"),YEARLY("Yearly");
     private String value;
     BudgetPeriod(String value) {
		this.value = value;
     }
     public String toString() {
		return value;
     }
}</pre>
<h2>Step 2: Use the SimpleComboBox</h2>
<p>The combobox insists on a Store. At this point you can either convert your enum to ModelData and call it a day (which is what most people do) or realize that, since your using Dozer (well, I am), that this blows up fantastically and requires all sorts of conversion routines to move back and forth between ModelData and enum if Dozer is going to do its job right.</p>
<p>This is where the SimpleComboBox comes in, it allows you to bind any class to the combobox and thus gives you seamless abilities that glue your Enum directly to the form (and back again). It looks like this in my case:</p>
<pre>SimpleComboBox&lt;MyEnumClass&gt; theComboBox = new SimpleComboBox&lt;MyEnumClass&gt;();</pre>
<p>Now my box can move my enums around nicely in this combox format.</p>
<h2>Step 3: Populate the list</h2>
<p>Even a SimpleComboBox needs standards and its standard is either a Store or a List. We choose list and convert our Enum to that list for adding it to the list.</p>
<pre>java.util.List enumList = Arrays.asList(MyEnumClass.values());
theComboBox.add(enumList);</pre>
<div>This just takes all enum values and sticks them in the list for picking. Easy enough.</div>
<h2>Step 4: Pre-select whats in the database</h2>
<div>In an edit context we obviously must pre-select the currently selected item. Simple!</div>
<div>
<pre>theComboBox.setSimpleValue(entity.getEnum());</pre>
<h2>Step 5: Oh no! My Dropdown list clears itself if I pick something!</h2>
<p>This is trivial but important to understand. Since its a ComboBox at heart it is always filtering the list based on what you type. This is easily overridden by setting a trigger on the field that makes this behavior appear to go away and thus always show the list. This is a problem in two scenarios:</p>
<p>A) The user picked a value, thus narrowing the filter all the way to one item and clearing the picklist</p>
<p>B) You are in an update scenario so the pre-selection does (A) for the user (thanks!).</p>
<p>The answer is simple</p>
<pre>theComboBox.setTriggerAction(TriggerAction.ALL);</pre>
<p>This causes a lot of people confusion but it is what it is. By setting the trigger you&#8217;ll force the list to always display all of your enums (or anything else you may put in a ComboBox)</p>
<h2>Step 6: FormBinding: Not your friend with an Enum</h2>
<p>The next big trip-up comes when you try to bind your SimpleComboBox to the form so that it auto-updates the model and removes all that <em>CRUD</em> you hate so much. At the end of the day, even though we told the SimpleComboBox it contained MyEnumClass its value is just a string. When we try to bind a string to an enumeration in our backing model we get a big fat <span style="color: #ff0000;">CLASS CAST EXCEPTION</span>. Boo hiss.</p>
<p>The solution: Don&#8217;t bind the field, handle it manually in your create/update event right before you send your model out over RPC for commitment.</p>
<pre>myModel.setBudgetperiod(theComboBox.getSimpleValue());</pre>
<p>Since the combobox is pretending to hold real-enums it will pass the value of the users selecting to the model without causing that <span style="color: #ff0000;">CLASS CAST EXCEPTIO</span><span style="color: #ff0000;">N</span>. This is not truly creating Enum&lt;-&gt;Enum mapping but it is passing a value back that the model Enum *thinks* it understands and thus, making a mockery of data-types, it successfully updates the model which in turn can update the data-store transparently.</p>
<h2>Summary and Final Code</h2>
<p>There are other recipes for this as well as all sorts of trickery you can do for display purposes etc but in the end this worked well for my requirements. This app is really heavy on the enums and this, with a touch of code duplication and a bit more maintenance overhead for the few updates a year I may do, gave me seamless movement of enums from Windows Desktop-&gt;XML-RPC-&gt;Database-&gt;Browser/GXT-&gt;Database-&gt;XML-RPC-&gt;Windows Desktop.</p>
<p>Take that JSON! (just kidding, I love you also JSON. Sometimes..)</p>
<h4>Enum</h4>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace;">public enum BudgetPeriod {
     DAILY("Daily"),WEEKLY("Weekly"),MONTHLY("Monthly"),QUARTERLY("Quarterly"),YEARLY("Yearly");
     private String value;
     BudgetPeriod(String value) {
		this.value = value;
     }
     public String toString() {
		return value;
     }
}</pre>
<h4>SimpleComboBox creation</h4>
<p>A few notes here:</p>
<ul>
<li>I assign my list of enum values to a variable and then add that variable. You can do that in one fell swoop and avoid the assignment, this code is debugger friendly</li>
<li>Notice that I am NOT defining <em>theComboBox</em> here, just assigning it. You need to define it at the class level so that the update routine, which is usually anonymous in a GWT/GXT pattern, can access it without it being final.</li>
</ul>
<pre>theComboBox = new SimpleComboBox&lt;BudgetPeriod&gt;();
java.util.List periodList = Arrays.asList(MyEnumClass.values()); 
theComboBox.add(periodList);
theComboBox.setLazyRender(false);
theComboBox.setForceSelection(true);
theComboBox.setTriggerAction(TriggerAction.ALL);
theComboBox.setSimpleValue(project.getBudgetperiod());</pre>
<h4>Create/Update handler</h4>
<div id="_mcePaste">
<div id="_mcePaste">Your handle will be different, this is just an example of mine. The only line you care about is &#8216;myModel.setBudgetPeriod(&#8230;)&#8217;</div>
<pre>createButton.addListener(Events.Select, new Listener() {
     public void handleEvent(ButtonEvent e) {
         grid.mask("Saving..");
         myModel.setBudgetperiod(projectBudgetTimeSpan.getSimpleValue()); <strong>// THIS IS ALL YOU CARE ABOUT IN THIS CODE CHUNK</strong>
         MyRPC.Util.getInstance().createProject(project, ClientSession.getInstance().getSessionID(),
                                                new ProjectCreatedCallback(grid, index, myModelBean));
         }
});</pre>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.siberian.org/2010/03/20/enum-based-comboboxes-in-gxt/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>GXT/GWT, DTOs and Dozer : Managing the Exception rather then the Common Case</title>
		<link>http://www.siberian.org/2010/02/04/gxtgwt-dtos-and-dozer-managing-the-exception-rather-then-the-common-case/</link>
		<comments>http://www.siberian.org/2010/02/04/gxtgwt-dtos-and-dozer-managing-the-exception-rather-then-the-common-case/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 18:56:12 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[GWT/GXT]]></category>
		<category><![CDATA[Software Projects]]></category>

		<guid isPermaLink="false">http://www.siberian.org/?p=230</guid>
		<description><![CDATA[For all of its amazing cleverness, GWT has one really difficult area, persistence. There are various projects and attempts to clear this are up but most are very young and have a ways to go. This gets even more complicated if your not, lets face it, using Hibernate. As a Cayenne fan I don&#8217;t use [...]]]></description>
			<content:encoded><![CDATA[<p>For all of its amazing cleverness, GWT has one really difficult area, persistence. There are various projects and attempts to clear this are up but most are very young and have a ways to go. This gets even more complicated if your not, lets face it, using Hibernate. As a Cayenne fan I don&#8217;t use Hibernate so of course my path is even more complex then most. Persistent objects, in most popular frameworks, carry with them a lot of persistent baggage that doesn&#8217;t cleanly serialize across the wire.</p>
<p>Thankfully there is, as with most things software related, a pattern! The pattern in this case is to use a Data Transfer Object (DTO). A DTO is basically a serializable bean that mirrors the persistent object. This is an annoying duplication of work and obviously violates the DRY (Don&#8217;t Repeat Yourself) principle since you are essentially cloning the Persistent object as a basic java bean. The upside of it is that you can control exactly what gets into your DTO (and thus what is transferred to the client). Originally I was constructing these beans as required, doing a pretty ad hoc job of it and generally causing myself headaches.</p>
<p>My first attempt at streamlining this was to use the <a title="Bean Utils - Apache Commons" href="http://commons.apache.org/beanutils/" target="_blank">BeanUtils</a> apache commons project. This library has some simple methods for copying properties between beans which, in the end, is what the DTO is all about. This worked well for common and primitive types that were shared (name and type) between the two objects but it fell over pretty quickly if the types mismatched. Additionally, there is no easy way to exclude or customize an individual field level map and no way to do one-way mappings (there is never a reason to map the ID from the Bean to the Persistent Object!)</p>
<p>What are my requirements and why didn&#8217;t BeanUtils not working?</p>
<ul>
<li>BeanUtils is exceptions based: If it has a mismatched attribute it blows up spectacularly and you then have to treat those objects differently.</li>
<li>BeanUtils doesn&#8217;t have an exceptions mechanism: In my situation where I have enumerations everywhere this meant that many objects of mine are not eligible for BeanUtils. (GWT doesn&#8217;t easily support enumerations so I have to convert them to int before sticking the int in the DTO with a map of values)</li>
<li>BeanUtils doesn&#8217;t have an extensions mechanism: Once your object is out of the path of automation there is no way back, its a manual coding exercise.</li>
</ul>
<p>There was a better way: <a title="Dozer is a Java Bean to Java Bean mapper that recursively copies data from one object to another." href="http://dozer.sourceforge.net/" target="_blank">Dozer</a></p>
<p>I had looked at Dozer a few times and it just seemed Scary and Large but in my desperation I started to dig around and discovered how addictingly easy it is to start with Dozer:</p>
<pre>public static void setUser(UserBean bean, Pguser user){
     Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
     mapper.map(bean,user);
}</pre>
<p>This is your base &#8216;BeanUtils replacement&#8217; usage of Dozer. In my case this is part of a larger static class that is a big BeanFactory, eg: A bit file that has a bunch of static methods for converting beans to objects and objects to beans.</p>
<p>Fantastic! Now my conversions did not blow up in the general case where one object had a field that the other one lacked. However, it still exploded when types mismatched. Thats where the Dozer mapping comes in. Dozer allows you to create an XML file of exceptions that run as a part of the map(a,b) process. You don&#8217;t have to specific ALL fields in this mapping, just the differentials! Once I understood that it was happy-pants-time!</p>
<p>All you do is toss a file called &#8216;dozerBeanMapping.xml&#8217; into your class path and Dozer automatically picks it up. No muss no fuss. Lets look at one of my beans in this file. In the below example I am basically excluded my enumerations from the mapping process. Note: you can do a LOT more then this, my goal here is to show how easy it is to use Dozer to manage your bean&lt;-&gt;object exceptions.</p>
<pre>&lt;mapping&gt;
   &lt;class-a&gt;com.pgi.common.Clientsettings&lt;/class-a&gt;
   &lt;class-b&gt;com.pgi.webapp.client.dto.ClientsettingsBean&lt;/class-b&gt;
   &lt;field-exclude&gt;
      &lt;a&gt;jobmode&lt;/a&gt;
     &lt;b&gt;jobmode&lt;/b&gt;
   &lt;/field-exclude&gt;
   &lt;field-exclude&gt;
      &lt;a&gt;removemethod&lt;/a&gt;
      &lt;b&gt;removemethod&lt;/b&gt;
   &lt;/field-exclude&gt;
   &lt;field-exclude&gt;
      &lt;a&gt;reportingmode&lt;/a&gt;
      &lt;b&gt;reportingmode&lt;/b&gt;
   &lt;/field-exclude&gt;
&lt;/mapping&gt;</pre>
<p>But now how do I put my enumerations into my DTO? Two options really</p>
<p>For now I am putting this mapping in my factory method post auto-map</p>
<pre>public static ClientsettingsBean getClientsettingsBean(Clientsettings settings){
   Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
   ClientsettingsBean theBean = mapper.map(settings,ClientsettingsBean.class);
   theBean.setJobmode(settings.getJobmode().ordinal());
   theBean.setReportingmode(settings.getReportingmode().ordinal());
   theBean.setRemovemethod(settings.getRemovemethod().ordinal());
   theBean.setId(DataObjectUtils.intPKForObject(settings));
   return theBean;
}</pre>
<div id="_mcePaste">There is another way though, I can create a custom Dozer Converter that knows how to do this mapping for me. I am still working on this though, Enumerations in my case are tough as I have about 15 of them and they all have a custom methods that goes from int to enum. Since I don&#8217;t want 15 converters that do the same thing, just with a different class, I need to find a way to extend my enumeration from a base class that has this mapping.</div>
<div>With a base enumeration class (if possible, haven&#8217;t looked deeply yet) I can have one Dozer Conversion class that maps back and forth between any of my enumerations and the class that has that enumeration as an attribute. Should be fun.</div>
<div></div>
<div>An intriguing idea for the future would be a Cayenne template that auto-creates these DTOs, Factory and Mapping files for me as part of the Cayenne class generation process. I&#8217;d still need to copy them manually into my GWT *.client.* namespace but it would speed things up considerably.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.siberian.org/2010/02/04/gxtgwt-dtos-and-dozer-managing-the-exception-rather-then-the-common-case/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riding The Wave : My Google Wave Impressions</title>
		<link>http://www.siberian.org/2010/01/15/riding-the-wave-my-google-wave-impressions/</link>
		<comments>http://www.siberian.org/2010/01/15/riding-the-wave-my-google-wave-impressions/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 06:30:16 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://www.siberian.org/?p=199</guid>
		<description><![CDATA[Google Wave has been out for almost a year now and its strengths and weaknesses have been analyzed by every blogger/pundit/opinion maker on the planet at this point.

That said, since this is the Internet, I am going to put my $.02 in. So without further ado here is my Wave experience.]]></description>
			<content:encoded><![CDATA[<p>Google Wave has been out for almost a year now and its strengths and weaknesses have been analyzed by every blogger/pundit/opinion maker on the planet at this point.</p>
<p>That said, since this is the Internet, I am going to put my $.02 in. So without further ado here is my Wave experience.</p>
<h2>Scenario</h2>
<p>Once a quarter or so my team rolls a release to our production servers. This is a very scripted event with &#8216;pilot checklist&#8217; steps that we go through, one by one, confirming each along the way (<em>Step 12: database dumped, confirmed. etc</em>) . When we encounter any unknown problem we stop, analyze and decide whether to continue. Our &#8216;points of no return&#8217; (or problematic return) are clearly noted and overall this approach lends itself well to our release process</p>
<p>Since we do our releases in the late evening and would rather not sit at the office all night the entire event is conducted via chat a group session. Traditionally this works well with some caveats.</p>
<ul>
<li>Gtalk randomly likes to bump people and people tend to hit the wrong button or close the window or have browser crashes. This leads to some tense moments in mid-roll while we invite them back etc.</li>
<li>When things get fast and furious the interleaved conversations get really difficult to track</li>
<li>The inevitable off-topic chatter gets in the way while we wait for things to complete</li>
<li>Reassembling a record of events, even with chat logging, can be difficult since its not threaded making the post-roll analysis we do a bit more tiresome (<em>&#8216;was he saying &#8217;shit&#8217; because the database crashed or was this when his cat knocked over his beer?&#8217;</em>)</li>
</ul>
<p>So, in the interests of all of the above we decided to do a release on the Wave.</p>
<p>I fully acknowledge that I am a Wave Newbie and possibly every single point I raise is invalid. However, as the Wave Newbie who is accustomed to picking up Google tools and just Using Them I feel that my perspective is valuable.</p>
<h2>Riding the Wave</h2>
<h3>First Impressions</h3>
<p>Initial tests were confusing. Coming at it from a group chat paradigm, we did not really understand what we were supposed to do in this new world. Our confusion was quickly dispelled when someone uploaded a funny picture into a new thread. The game was on.</p>
<p>We then all very quickly realized how boring it is to watch people type. I mean seriously boring. In fact, I miss the suspense of <em>&#8216;xyz is typing&#8217;. What is xyz going to say? How long will it take him to say it and when he is done will I care? Oh xyz, hurry hurry and type to me! </em>Instead of &#8216;<em>xyz is typing</em>&#8216; we now were treated to a stream of consciousness. Random threads popping up empty and disappearing as they were deleted. Thoughts half baked and other thoughts that normally would not be expressed were exposed as the poster forgot that he has, essentially, lost the &#8216;draft&#8217; mode that non-realtime chat provides (Note: This can be very embarrassing!). Finally, if I have to watch someone mistype and studiously correct the word &#8216;the&#8217;  again (&#8216;<em>teh</em>&#8216; for anyone curious) I may go insane.</p>
<p>Once we got over our annoyance at our fellow developers typing skills we proceeded to treat it like chat. Every post was a new thread, nothing was connected and it just seemed like really annoying, standard issue chat. Finally, with some discipline imposed by one of my leads, we got herded into a threaded mode and started into our process.</p>
<h3>Second Impressions</h3>
<p>Once we got into the mode of thinking in threads the inevitable dispute broke out, what sort of threads should we use? Topical? Checklist related? Eventually it just evolved into a semi-chaotic system of topical threads that ran at different paces (See &#8216;The Good&#8217; below). It was interesting to watch the team self-organize into little pockets of discussion and to be able to jump in and participate as required. In a strict group chat setting many of these probably happen in one-on-one chats outside the group and are both lost to the record and less collaborative then they could be. We are big on &#8216;roll night records&#8217; so pulling these chats in was very valuable for us and avoided a few confusing situations.</p>
<p>This multitude of threads was taxing though. Thoughts seemed disconnected and hard to follow. The amount of information quickly became overwhelming and everyone was resorting to constantly scrolling up and down, hunting for updates and looking for information. This lack of &#8216;indexability&#8217; really made keeping track of things difficult and time consuming. In more then one instance we had to revert to chat to let someone in the wave know that a thread had been updated. Compounding this problem was the fact that there is no Quick Search feature for just the wave in question. Google without search? Totally odd. Yes, you can create big mega-searches etc but in my case I just wanted a quick intra-wave search that let me navigate the content.</p>
<p>Eventually we hit a nice rhythm. Less threads created, more centralized discussion and the pace picked up. People were able to step in and out of the release process as required, picking up and getting immediate context to the task at hand. It was pretty fun in an odd sort of nerd way. Definitely a different experience for us and a different sort of chaos then we are used to. Not less or more, just different. It was less boring as well since you could have multiple discussions on screen, in real-time, at the same time. Much more &#8216;CNN news ticker while watching a debate&#8217;</p>
<h2>The Good</h2>
<p><strong>Comment Editing</strong>: The ability to edit, with changes tracked, threads is fantastic. It allowed us to keep a &#8216;notes&#8217; thread and a &#8217;status&#8217; thread that were continually updated. Not only that but you can keep the root node &#8216;current&#8217; and then do threaded comments beneath. This was very handy in tracking our status and noting deviance from the script.</p>
<p><strong>Addictive</strong>: You pretty quickly find yourself addicted to the amount of information you can consume at once. It was a bit thrilling to be watching one person troubleshooting a code problem, another guy running automated test scripts while yet another guy ran update tools to bring the database up to date. It was as close to a birds eye view as I have ever seen for our process.</p>
<p><strong>Totality</strong>: We were able to capture everything that happened in a clear way. When I had to call my QA engineer to come online 30 minutes early it was a side-thread and did not bother anyone that did not care about that thread. More then just <em>content</em> and <em>context</em> is the <em>temporal</em> nature of it. Being able to replay and easily see the context of a comment in both time and space is invaluable. This 3 dimensional view of our software releases is fascinating.</p>
<p><strong>Pacing</strong>: The threaded view allowed us to run different threads at different paces. Some were fast and furious as live problems were debugged while others were very slow as they tracked overall release status. In a group chat everything is Now and Urgent and (for us) the slow lead items are paper based to ensure completeness. Wave seems to have done away with that by allowing us to pace different conversations differently.</p>
<h2>The Bad</h2>
<p><strong>Comment Editing</strong>: Confusing as all can be sometimes. The change tracking in that context can make your head spin and you never know if its authoritative, what has changed etc.</p>
<p><strong>No Navigation</strong>: The lack of a table of contents, index or any other sort of thread navigation tool outside of the scrollbar was the most painful (&#8216;<em>tedious</em>&#8216; as one engineer commented) part of the evening. Having to scroll up and down constantly, trolling for updates, sucked and made the tool very difficult to use. It almost forced us to use the tool much less collaboratively then we would have, reverting us back to group chat mode with minor side threads for the most part.</p>
<p><strong>No Quick Search</strong>: Without any sort of index to the wave some sort of quick search is imperative. I fully expected to be able to type anything into a box and have a list of thread matches pop-up with anchor links to them. Nope. Really? No Search in a google App? Sigh. Yes, I may have missed the big green &#8216;<strong><span style="color: #339966;">Search The Wave&#8217;</span></strong> button but I doubt it.</p>
<h2>The Ugly</h2>
<p><strong>Scrolling</strong>: Its completely apparent to me now that everyone at the GooglePlex working on Wave has at least one 3280×2048 WQSXGA monitor. The only way these long waves make sense is if you make them Tall and Wide so as to reduce scrolling and the sheer amount of screen real estate they scream for is incredible. My pathetic little 15&#8243; MacBook Pro was not up to the task of giving me a good view of the action.</p>
<p><strong>Extremely Easy Thread Creation</strong>: I get it, it needs to be easy to use but does it need to be THAT easy to use? We spent a lot of time deleting empty threads when all someone was doing was trying to respond to a thread.</p>
<p><strong>Extremely Difficult Thread </strong><strong>Maintenance</strong>: 5 pixel click region to stay in a thread? This really made things disjointed for us as people failed to click in that 5 pixel boundary and Very Easily Created New Threads.</p>
<p><strong>Inability to Reorganize Content</strong>: Once your cast yourself out of a thread because Its So Darn Easy To Create A New Thread  you must STAY OUT! Some drag/drop tools would be great here.</p>
<h2>Take Aways and Ideas (haha, ideas? really? for google? sigh..)</h2>
<p>The jury is still out but I think we like Google Wave and will use it again. With more experience under our belt it might actually make some sense and it did not truly detract once we wrapped our heads around it. With a bit of discipline I think our org will be successful Wavers soon enough.</p>
<p>So, in the spirit of a know it all, mostly anonymous and definitely uninformed blogger I will now proceed to tell Google what they should fix so that the Wave is easier to ride. Hold on to your pants because this anonymous and uninformed blogger is about to tell the uncountable Top Notch Product Managers and UX Developers who spent millions on design, research, usability analysis, market testing and prolonged beta-testing exactly what they need to do with the Wave!</p>
<p><strong>Quick Search</strong>: As discussed above, I need to quickly search my wave and get a nice list of Google Like results. It would even be neat to do a narrowing search so that the threads that do not match your criteria disappear, one by one (think iTunes). That would be huge for navigability.</p>
<p><strong>Index</strong>: Give me a thread index tree that I can collapse and expand and use as a quick nav for the wave. This would let me bounce around more easily. Bonus points: Let me give any node my own name so I can reference it more easily.</p>
<p><strong>Bookmarks</strong>: Let me bookmark locations in the wave so I can anchor link back to them. Being able to click a &#8217;star icon&#8217; and name it &#8216;Status Report&#8217; so I can quickly reference it without wearing out my 4 year old microsoft mouse would be fabulous.</p>
<p><strong>Quick Links to Update</strong>s: The inbox nicely tells me &#8216;6&#8242; if the wave has 6 new entries but it doesn&#8217;t tell me WHERE THOSE ARE. Once again my mouse-wheel suffers as I frantically scroll up and down scanning for the &#8216;new item&#8217; indicator amongst 300+ posts.</p>
<p><strong>Browser Tab Should Reflect Current Wave</strong>: There is a nice number in the browser tab. It usually reads &#8216;1&#8242; and indicates that &#8216;1&#8242; wave has updates. I was off doing other tasks expecting this to reflect the number of updates IN MY CURRENT WAVE (you know, like GMAIL and my INBOX) rather then the fact that my one and only wave was updated. I clicked back, wondering what was taking so long, and noticed that about 40 messages had scrolled by. Lets make this number reflect the number of updates in my open wave.</p>
<p>Hopefully the myriad of Google specialists who live and breath usability and probably possess PhD&#8217;s in &#8216;Waveology&#8217;  take my advice and make Wave a better tool for me. We&#8217;ll probably try it again with the knowledge gained and see if we can make it more sensible for us. My feeling is that the Wave is growing on the team and we&#8217;ll be doing a lot more with it soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.siberian.org/2010/01/15/riding-the-wave-my-google-wave-impressions/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Ajax Wizards in Wicket</title>
		<link>http://www.siberian.org/2009/10/29/ajax-wizards-in-wicket/</link>
		<comments>http://www.siberian.org/2009/10/29/ajax-wizards-in-wicket/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 03:42:00 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software Projects]]></category>
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://www.siberian.org/?p=174</guid>
		<description><![CDATA[Lately I&#8217;ve found that Wicket + Ajax == Very nice. More then nice its turns out its just a lot easier to build sites using Ajax and Wicket then it is to do it otherwise. Last night I found myself wanting to place a wizard into an entirely Ajax driven site. Luckily Google pointed me [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I&#8217;ve found that Wicket + Ajax == Very nice. More then nice its turns out its just a lot easier to build sites using Ajax and Wicket then it is to do it otherwise. Last night I found myself wanting to place a wizard into an entirely Ajax driven site. Luckily Google pointed me to the answer in this thread: <a href="http://www.nabble.com/Is-there-an-ajax-WizardButton-to-use-in-a-wizard-inside-a-ModalWindow--td15978434.html" target="_blank">Ajax Wizard Button in Modal Window</a>.</p>
<p>In the spirit of duplicating information all over the internet I&#8217;ll paste my copy/paste implementation of the presented solution. It works well!</p>
<p>Step 1: Create the AjaxWizardButton class</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.wicket.ajax.AjaxRequestTarget;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.wicket.ajax.markup.html.form.AjaxButton;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.wicket.extensions.wizard.IWizard;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.wicket.extensions.wizard.IWizardModel;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import org.apache.wicket.markup.html.form.Form;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.wicket.model.ResourceModel;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">abstract</span> <span class="kw2">class</span> AjaxWizardButton <span class="kw2">extends</span> AjaxButton <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">static</span> <span class="kw2">final</span> <span class="kw4">long</span> serialVersionUID = 1L;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">final</span> IWizard wizard;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> AjaxWizardButton<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> id, IWizard wizard, <span class="kw2">final</span> Form form,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> labelResourceKey<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">super</span><span class="br0">&#40;</span>id, form<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">setLabel</span><span class="br0">&#40;</span><span class="kw2">new</span> ResourceModel<span class="br0">&#40;</span>labelResourceKey<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">wizard</span> = wizard;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> AjaxWizardButton<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> id, IWizard wizard, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> labelResourceKey<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span><span class="br0">&#40;</span>id, wizard, <span class="kw2">null</span>, labelResourceKey<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw2">final</span> IWizard getWizard<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> wizard;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw2">final</span> IWizardModel getWizardModel<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> getWizard<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getWizardModel</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw2">final</span> <span class="kw4">void</span> onSubmit<span class="br0">&#40;</span>AjaxRequestTarget target, Form form<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onClick<span class="br0">&#40;</span>target, form<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw2">abstract</span> <span class="kw4">void</span> onClick<span class="br0">&#40;</span>AjaxRequestTarget target, Form form<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Step 2: Create the buttonbar that will wrap these buttons and override the native buttonbar built into the Wizard.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.wicket.ajax.AjaxRequestTarget;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.wicket.extensions.wizard.IWizardModel;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import org.apache.wicket.extensions.wizard.IWizardStep;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.wicket.extensions.wizard.Wizard;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.wicket.extensions.wizard.WizardButtonBar;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.wicket.markup.html.form.Form;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">public</span> <span class="kw2">class</span> AjaxWizardButtonBar <span class="kw2">extends</span> WizardButtonBar <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">static</span> <span class="kw2">final</span> <span class="kw4">long</span> serialVersionUID = 1L;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> AjaxWizardButtonBar<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> id, <span class="kw2">final</span> Wizard wizard<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">super</span><span class="br0">&#40;</span>id, wizard<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addOrReplace<span class="br0">&#40;</span><span class="kw2">new</span> AjaxWizardButton<span class="br0">&#40;</span><span class="st0">&quot;next&quot;</span>, wizard, <span class="st0">&quot;next&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw4">void</span> onClick<span class="br0">&#40;</span>AjaxRequestTarget target, Form form<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IWizardModel wizardModel = getWizardModel<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IWizardStep step = wizardModel.<span class="me1">getActiveStep</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// let the step apply any state</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; step.<span class="me1">applyState</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// if the step completed after applying the state, move the</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// model onward</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>step.<span class="me1">isComplete</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wizardModel.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; error<span class="br0">&#40;</span>getLocalizer<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="me1">getString</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;org.apache.wicket.extensions.wizard.NextButton.step.did.not.complete&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; target.<span class="me1">addComponent</span><span class="br0">&#40;</span>wizard<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">final</span> <span class="kw4">boolean</span> isEnabled<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> getWizardModel<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">isNextAvailable</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addOrReplace<span class="br0">&#40;</span><span class="kw2">new</span> AjaxWizardButton<span class="br0">&#40;</span><span class="st0">&quot;previous&quot;</span>, wizard, <span class="st0">&quot;prev&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw4">void</span> onClick<span class="br0">&#40;</span>AjaxRequestTarget target, Form form<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getWizardModel<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">previous</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; target.<span class="me1">addComponent</span><span class="br0">&#40;</span>wizard<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">final</span> <span class="kw4">boolean</span> isEnabled<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> getWizardModel<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">isPreviousAvailable</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Step 3: Alter your wizard html markup so you can override the native buttonbar</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;html xmlns:wicket&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;wicket:panel&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;div&gt;
</div>
</li>
<li class="li2">
<div class="de2">&lt;form wicket:id=&quot;form&quot; class=&quot;wicketExtensionsWizardForm&quot;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;span wicket:id=&quot;overview&quot;&gt;&lt;/span&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;span wicket:id=&quot;header&quot;&gt;&lt;/span&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&lt;div wicket:id=&quot;view&quot;&gt;&lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;span wicket:id=&quot;feedback&quot;&gt;&lt;/span&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;div class=&quot;buttons&quot;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;span wicket:id=&quot;buttons&quot;&gt;&lt;/span&gt;
</div>
</li>
<li class="li2">
<div class="de2">&lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/form&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/wicket:panel&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/html&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Step 4: Set your wizard markup output ID so that you can target it with Ajax calls</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">theWizard.<span class="me1">setOutputMarkupId</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Step 5: Override the buttonbar call in your wizard class</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AComponent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Component</span></a> newButtonBar<span class="br0">&#40;</span>java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> id<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">new</span> AjaxWizardButtonBar<span class="br0">&#40;</span>id, <span class="kw2">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Step 6: Bask in the glow of warm Ajax.</p>
<p>Pretty simple but the impact is fantastic. Using this code I was able to Ajaxify my wizard in well under 10 minutes.</p>
<p>Thanks Wicket!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.siberian.org/2009/10/29/ajax-wizards-in-wicket/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>&quot;Deployability&quot;</title>
		<link>http://www.siberian.org/2009/06/26/deployability/</link>
		<comments>http://www.siberian.org/2009/06/26/deployability/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 18:22:55 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.siberian.org/?p=42</guid>
		<description><![CDATA[One thing people rarely talk about is key to why after well over 10 years, millions upon millions upon millions of pages served and more lines of code then a room full of monkeys could count I stopped building new apps in perl. Well, mainly they don't talk about it because I am no one. But if I WAS SOMEONE they would ask 'Why?'. I'll tell you why.]]></description>
			<content:encoded><![CDATA[<p>One thing people rarely talk about is key to why after well over 10 years, millions upon millions upon millions of pages served and more lines of code then a room full of monkeys could count I stopped building new apps in perl. Well, mainly they don&#8217;t talk about it because I am no one. But if I WAS SOMEONE they would ask &#8216;Why?&#8217;. I&#8217;ll tell you why.</p>
<p>&#8216;<strong>Deployability</strong>&#8216;.</p>
<p>WHAT? What is this &#8220;deployability&#8221; you speak of? Well, it is the key to a stable and reproducible system.</p>
<p>CPAN is great, mod_perl (and fastcgi) are , well, fast, but deploying the Perl stack is a nightmare of dependencies, OS incompatibilities and environmental hooks that require being set &#8216;just so&#8217; for the entire shebang to function.</p>
<p>When I need to deploy across a mixed network of dozens app servers as well as get my app onto 20 developers dev tree&#8217;s, multiple staging, production and dev systems and keep everything moving smoothly perl does.. not.. help.</p>
<p>This is where a language like Java shines. The same app will run on windows, linux, mac os x and is almost entirely independent of its &#8216;environment&#8217; outside the prerequisite (universal) java env vars. All libs are stored local to the app, it mostly ignores the OS level environment and the same libs run everywhere exactly the same (take that DBD::Oracle and your dumb client dependencies..) Yes, there is a big overhead of learning to be done, particularly coming from perl, but once your past that its pretty darn slick.</p>
<p>I&#8217;ve gotten around this &#8216;deployability&#8217; issue with perl by creating one click/script build/deploy systems that pull CPAN modules from the project source control, build perl, apache and mod_perl from source controlled tarballs and strictly enforcing &#8216;The Environment Is Evil, Do Not Depend On It&#8217; coding standards. This works really well but requires a lot of discipline and a TON of up-front work.</p>
<p><strong>But what About CPAN/Debian/MyFavoriteDistro?!?! </strong></p>
<p>And before you go touting CPAN as &#8216;all that and a stack of bricks&#8217; let me highlight just a few incidents of lameness I have seen in a decade of perling..</p>
<ul>
<li style="text-align: left; ">CGI.pm treats &#8216;undef&#8217; differently in different versions in different circumstances. Yea, that hurts.</li>
<li style="text-align: left; ">The DBI Postgres drivers dramatically changed the internal SQL statement behavior and then DEFAULTED TO THE NEW BEHAVIOUR. (Can you say &#8216;Hello broken apps&#8217;? We sure did..)</li>
<li style="text-align: left; ">Storable changed its storage format which means different machines running different versions would corrupt data. Woops, thank goodness for a real multi-server test environment..</li>
<li style="text-align: left; ">on and on and on. This is just in the last 2 years or so.</li>
</ul>
<p>CPAN was/is awesome but depending on it, or any uncontrolled release process, is stupid. Grab your modules, test them and then source control them. Don&#8217;t treat your linux distro like a source control system, its not, the Debian or Ubuntu guys don&#8217;t care about you. Case in point, deprecating Apache 1.3.x <em>entirely</em> and forcing mod-perl users to move to Apache 2.2. Sounds fine but when you have a 100,00+ lines of 10 year old perl code that have been grafted into mod_perl being forced to switch to mod_perl 2 is not happy or trivial. Sure, we can compile 1.3.x ourselves but that really defeats the point of a package management system..</p>
<p>Oh, and about those bajillion CPAN modules. It might be important to note</p>
<p>A) How many of these are just Base Features in most other languages.</p>
<p>B) The fact that most perl modules are factored down to very granular levels (Good Engineering Practice), increasing the module count.</p>
<p>I&#8217;ve found that a good 85-90% of my lib needs are covered in the core Java language + the apache-commons packages. Everything else is an edge case where either perl or java or ruby or whatever generally is going to have some sort of library that is half-tested but available and better then nothing..</p>
<p>Quantity is not Quality and Quantity is not a measurement of the level of support a language is getting.</p>
<p>Hold your nose, set your browser to &#8216;private browsing&#8217; so no one knows you looked and check out the apache-commons and base java api&#8217;s, I bet you&#8217;ll find that it would provide you with a big slice of your CPAN requirements&#8230;</p>
<p>http://commons.apache.org/</p>
<p>I do love CPAN but a bajillion modules doesn&#8217;t mean anything really outside of bragging rights. And yes, there is some awesome cool Obscure Stuff in CPAN but it is dwindling as perl phases out and the next generation of languages start to arrive. Tried using some of that stuff from CPAN lately? Egads, most of it hasn&#8217;t been updated in 3+ years.</p>
<p>If you are building large apps in perl and are honest with yourself you should be nodding in agreement before telling me I am an idiot for using Java and not your favorite unstructured/untyped scripting language.</p>
<p><strong>Summary</strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; text-align: justify; padding: 0px; border: 0px initial initial;">&#8216;Deployability&#8217;, if you ever build a big system this will become one of the most important problems you face. If you don&#8217;t think this is true then you A) are not building large systems or B) don&#8217;t work in a multi-developer environment or C) have a manager/sysadmin/fellow coder that really loves you and shelters you from the harsh world of deploying apps outside of your dev tree.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; text-align: justify; padding: 0px; border: 0px initial initial;">If you don&#8217;t have a dev tree you aren&#8217;t building a real app. Sorry, its true. None of this applies to you, you can now switch back to vi and continue coding. Thanks for reading this far, be sure to USR1 your development environment when making changes so that your live users (mostly) don&#8217;t notice.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; text-align: justify; padding: 0px; border: 0px initial initial;">So, when you pick your next language think about its deployment mode and if its paradigm will really support what you need to get done. In the end I ended up moving to Java for most everything. Robust library support, 100% reproducibility in almost any environment, suitable performance characteristics and the best userland tools going. Yes vi is cool, I get it, you rock with vi. Congrats, I find it difficult to navigate a huge codebase in vi and the lack of tools support is insane, but that&#8217;s me, I am the Tools Using sort of monkey. Just about every single one of my developers is a vi bigot so I am used to being stared at.</p>
<p>That said, I am currently running a really rather very large perl codebase with tons of traffic and it is an absolute blast sometimes.</p>
<p><br class="spacer_" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.siberian.org/2009/06/26/deployability/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Customizing Wicket Wizard Markup</title>
		<link>http://www.siberian.org/2009/06/24/customizing-wicket-wizard-markup/</link>
		<comments>http://www.siberian.org/2009/06/24/customizing-wicket-wizard-markup/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 08:04:23 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Software Projects]]></category>
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://www.siberian.org/?p=77</guid>
		<description><![CDATA[Apache Wicket provides an interesting out of the box component called a 'Wizard' that does just what you'd expect it to, create an easy to use Wizard workflow that you can insert into your page. The base markup that comes with the wizard is 'adequate' in that 'it works' but its complex table based structure is at odds with modern CSS based markup making it difficult to adapt at times. Luckily its totally and completely customizable (as all good Wicket Things are)..]]></description>
			<content:encoded><![CDATA[<p><strong>Overview</strong></p>
<p style="text-align: center;"><a href="http://wicket.apache.org/"></a></p>
<p style="text-align: left;"><a href="http://wicket.apache.org/">Apache Wicke</a>t provides an interesting out of the box component called a &#8216;Wizard&#8217; that does just what you&#8217;d expect it to, create an easy to use Wizard workflow that you can insert into your page. It provides next, previous and cancel buttons as well as tracking the state between steps and enabling the &#8216;Finish&#8217; button when appropriate. You can see the genericwizard in action here : <a href="http://www.wicket-library.com/wicket-examples/wizard/">http://www.wicket-library.com/wicket-examples/wizard/</a></p>
<p>The base markup that comes with the wizard is &#8216;adequate&#8217; in that &#8216;it works&#8217; but its complex table based structure is at odds with modern CSS based markup making it difficult to adapt at times. Luckily  (ok, by design..) its totally and completely customizable (as all good Wicket Things are) however doing so is a bit obtuse and generally left as an exercise for the reader. Here is a step by step for how you customize the look/feel of your wizard in Wicket. I won&#8217;t be explaining the base case, the link above details that. This tutorial won&#8217;t go &#8220;all the way&#8221;, if you really want to customize to the &#8216;nth degree its easy enough once you understand how the basics work.</p>
<p>When in doubt, download the wicket source and follow the bouncing ball, thats all I did. This quick tutorial also touches on how to customize a few other pieces of the Wizard process but the core of it is demonstrated in the first section.</p>
<p>You can download my Quickstart here: <a href="http://www.siberian.org/wp-content/uploads/2009/06/wizard-quickstart.zip">wizard-quickstart</a>.zip</p>
<p><strong>Create A Wizard without tables!</strong></p>
<p>Lets create a Table-less Wizard! A Wizard is basically a Panel that extends &#8216;Wizard&#8217;, lets call ours &#8220;YourCustomWizard&#8221; and build out its base methods, assign it a model and add a few steps. In the Real World your steps are probably going to be dynamic. If you want a quick tutorial on that let me know but its pretty easy to get through.  Note that the HTML on the right has NO TABLES. You are now in control of your own CSS destiny.</p>
<p>Put simply (thanks Nathan!) &#8220;To override the default markup, make a markup file using the same basename as your custom Wizard class (e.g., &#8220;YourCustomWizard.html&#8221;) with the following wicket:id attributes: <em><strong>form</strong></em>, <em><strong>overview</strong></em>, <em><strong>header</strong></em>, <em><strong>view</strong></em>, <em><strong>feedback</strong></em> and <em><strong>buttons</strong></em>. With that knowledge you can stop reading. Continue on for code samples.</p>
<p>Your welcome. NOTE: The Old Fat Wizard is the html that ships with the Wicket source.</p>
<p><span style="font-size: x-small;">(/src/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/Wizard.html)</span></p>
<table border="0">
<tbody>
<tr>
<td>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">package</span> wicket.quickstart;</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; min-height: 15px; padding: 0px; margin: 0px; border: 0px initial initial;">
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">import</span> wicket.Component;</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">import</span> wicket.extensions.wizard.Wizard;</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">import</span> wicket.extensions.wizard.WizardModel;</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; min-height: 15px; padding: 0px; margin: 0px; border: 0px initial initial;">
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">public</span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">class</span> <span style="text-decoration: underline;">YourCustomWizard</span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">extends</span> Wizard {</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;">/*</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> * Create a wizard with a default model</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;">* and three custom steps. Each step</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;">* is a form with some default data</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;">* in the model for example purpose.</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> */</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">public</span> YourCustomWizard(String id){</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">super</span>(id);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> WizardModel model = <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> WizardModel();</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> YourObject theObj = <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> YourObject();</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> theObj.setElementdescription(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;First item&#8221;</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> theObj.setElementlabel(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;Label me&#8221;</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> theObj.setElementvalue(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;my value&#8221;</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; min-height: 15px; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> YourObject theObj2 = <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> YourObject();</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> theObj2.setElementdescription(</span>&#8220;Second item&#8221;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">);</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> theObj2.setElementlabel(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;Label me2&#8243;</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> theObj2.setElementvalue(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;my value2&#8243;</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; min-height: 15px; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> YourObject theObj3 = <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> YourObject();</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> theObj3.setElementdescription(</span>&#8220;Third item&#8221;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">);</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> theObj3.setElementlabel(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;Label me3&#8243;</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> theObj3.setElementvalue(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;my value3&#8243;</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; min-height: 15px; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> model.add(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> YourWizardStep(theObj));</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> model.add(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> YourWizardStep(theObj2));</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> model.add(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> YourWizardStep(theObj3));</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> init(model);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>}</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;">/**</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>On<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>finish.</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;">*</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>Put<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>any<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>specific<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>logic<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>you<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>want<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>when<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>the<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>user<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>hits<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>the<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>&#8220;finish&#8221;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>button<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>eventually</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>Here<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>we<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>print<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>to<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>error<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>log<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>and<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>send<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>them</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>to<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>the<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>home<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>page.</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>Normally<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>used<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>for<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>saving<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>unclean<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>objects<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>to<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>database<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>if<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>you<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>did<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>not<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>do<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>it<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>in<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>the<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>WizardStep</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;">*/</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #646464; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>@Override</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">public</span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">void</span> onFinish() {</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> System.<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #0000c0; padding: 0px; margin: 0px; border: 0px initial initial;">err</span>.println(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;DONE WITH THE WIZ!&#8221;</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> setResponsePage(Index.<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">class</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> }</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;">/**</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>On<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>cancel.</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;">*</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>Put<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>your<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>cancel<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>logic<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>in<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>for<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>when<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>users<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>hit<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>the<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>&#8216;Cancel&#8217;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>button.</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>*<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>I<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>send<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>them<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>to<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>the<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>home<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>page</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f5fbf; padding: 0px; margin: 0px; border: 0px initial initial;">*/</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #646464; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> </span>@Override</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">public</span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">void</span> onCancel() {</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> setResponsePage(Index.<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">class</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> }</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; min-height: 15px; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">protected </span>Component newButtonBar(java.lang.String id){</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">return</span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> ButtonBarPanel(id, <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">this</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> }</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">protected </span>Component newOverviewBar(java.lang.String id){</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">return</span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> OverviewPanel(id);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;">}</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; min-height: 15px; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;">}</p>
</td>
<td>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;"><strong><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">The New Lean And Mean Wizard </span></strong></span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;"><strong><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">(YourCustomWizard.html)</span></strong></span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;"><strong> </strong></span></p>
<p><strong><br />
</strong></p>
<p><strong> </strong></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="text-decoration: underline;">&lt;</span><span style="text-decoration: underline;">wicket:panel</span><span style="text-decoration: underline;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span>div<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">form</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">=</span>&#8220;form&#8221;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f007f; padding: 0px; margin: 0px; border: 0px initial initial;">class</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">=</span>&#8220;wicketExtensionsWizardForm&#8221;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">=</span>&#8220;overview&#8221;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;&lt;/</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #7f007f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">=</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;header&#8221;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;&lt;/</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #7f007f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">div</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">=</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;view&#8221;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;&lt;/</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">div</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">=</span>&#8220;feedback&#8221;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;&lt;/</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">div</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f007f; padding: 0px; margin: 0px; border: 0px initial initial;">class</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">=</span>&#8220;buttons&#8221;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span> <span style="text-decoration: underline;">wicket:id</span>=<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;buttons&#8221;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;&lt;/</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;/</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">div</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;/</span>form<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;/</span>div<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;/</span>wicket:panel<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;"> </span></p>
<p style="font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong><span style="color: #000000;">The Old Fat Wizard </span></strong></p>
<p style="font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong><span style="color: #000000;">(Wizard.html)</span></strong></p>
<p style="font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="text-decoration: underline;">&lt;</span><span style="text-decoration: underline;">wicket:panel</span><span style="text-decoration: underline;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">div</span><span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizard&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">form</span><span style="color: #3f7f7f;"><span style="color: #000000;"> </span></span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;form&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardForm&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">table</span><span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardOuterTable&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">tr</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #7f007f;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">td</span><span style="color: #000000;"> </span>valign<span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;top&#8221;</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">span</span><span style="color: #000000;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;overview&#8221;<span style="color: #008080;">&gt;&lt;/</span><span style="color: #3f7f7f;">span</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">td</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #7f007f;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">td</span><span style="color: #000000;"> </span>valign<span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;top&#8221;</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">table</span><span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardInnerTable&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">tr</span><span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardHeaderRow&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">td</span><span style="color: #000000;"> </span><span style="color: #7f007f;">valign</span><span style="color: #000000;">=</span>&#8220;top&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardHeader&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">span</span><span style="color: #000000;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;header&#8221;<span style="color: #008080;">&gt;&lt;/</span><span style="color: #3f7f7f;">span</span><span style="color: #008080;">&gt;&lt;/</span><span style="color: #3f7f7f;">td</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">tr</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">tr</span><span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardViewRow&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">td</span><span style="color: #000000;"> </span><span style="color: #7f007f;">valign</span><span style="color: #000000;">=</span>&#8220;top&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardView&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">div</span><span style="color: #3f7f7f;"><span style="color: #000000;"> </span></span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;view&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardViewInner&#8221;<span style="color: #008080;">&gt;&lt;/</span><span style="color: #3f7f7f;">div</span><span style="color: #008080;">&gt;&lt;/</span><span style="color: #3f7f7f;">td</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">tr</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">tr</span><span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardFeedbackRow&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">td</span><span style="color: #000000;"> </span><span style="color: #7f007f;">valign</span><span style="color: #000000;">=</span>&#8220;top&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardFeedback&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">span</span><span style="color: #000000;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;feedback&#8221;<span style="color: #008080;">&gt;&lt;/</span><span style="color: #3f7f7f;">span</span><span style="color: #008080;">&gt;&lt;/</span><span style="color: #3f7f7f;">td</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">tr</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">tr</span><span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardButtonBarRow&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">td</span><span style="color: #000000;"> </span><span style="color: #7f007f;">valign</span><span style="color: #000000;">=</span>&#8220;top&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">class</span><span style="color: #000000;">=</span>&#8220;wicketExtensionsWizardButtonBar&#8221;<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">span</span><span style="color: #000000;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;buttons&#8221;<span style="color: #008080;">&gt;&lt;/</span><span style="color: #3f7f7f;">span</span><span style="color: #008080;">&gt;&lt;/</span><span style="color: #3f7f7f;">td</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">tr</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;/</span>table<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">td</span><span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #008080;"><span style="color: #000000;"> </span>&lt;/<span style="color: #3f7f7f;">tr</span>&gt;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;/</span>table<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #008080;">&lt;/</span>form<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #008080;">&lt;/</span>div<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #008080;">&lt;/</span>wicket:panel<span style="color: #008080;">&gt;</span></p>
<p><br class="spacer_" /></p>
<p><br class="spacer_" /></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="color: #000000;"><strong> </strong></span></p>
<p><strong><br />
</strong></p>
<p><strong> </strong></td>
</tr>
</tbody>
</table>
<p>Now that you have the base system of Custom Wizardry in place lets look at some more components you can customize.</p>
<p><span style="color: #7f0055;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><strong>What&#8217;s in a Wizard Step?</strong></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><strong><span style="font-family: Georgia; font-weight: normal; font-size: 13px; line-height: 19px; ">Lets first look at our example step &#8220;YourWizardStep()&#8221;. In our case this is a panel that extends the WizardStep class with a nice form that collects &#8216;elementvalue&#8217; and displays two fields, &#8216;elementlabel&#8217; and &#8216;elementdescription&#8217;. Its important to stop for a second and understand that I am using the same class for *all* of my wizard steps. You are not bound by this, you can create a multitude of wizard steps and add them to your wizard as you see fit. Your Wizard can do things like branch steps based on the previous set, force users to stay on a step and you can even embed a full wizard within a step for some Wizard On Wizard action.</span></strong></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><strong><span style="font-family: Georgia; font-weight: normal; font-size: 13px; line-height: 19px; "> </span></strong></p>
<p><strong><br />
</strong></p>
<p><strong> </strong></p>
<table border="0">
<tbody>
<tr>
<td>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">package</span> wicket.quickstart;</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; min-height: 15px; padding: 0px; margin: 0px; border: 0px initial initial;">
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">import</span> wicket.extensions.wizard.WizardStep;</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">import</span> wicket.markup.html.basic.Label;</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">import</span> wicket.markup.html.form.TextField;</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">import</span> wicket.model.CompoundPropertyModel;</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">import</span> wicket.model.PropertyModel;</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; min-height: 15px; padding: 0px; margin: 0px; border: 0px initial initial;">
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">public</span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">class</span> <span style="text-decoration: underline;">YourWizardStep</span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">extends</span> WizardStep {</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">public</span> YourWizardStep(YourObject object1){</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> setModel(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> CompoundPropertyModel(object1));</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> add(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> Label(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;elementlabel&#8221;</span>));</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> add(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> Label(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;elementdescription&#8221;</span>).setEscapeModelStrings(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">false</span>));</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>TextField theField = <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> TextField(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;elementvalue&#8221;</span>,<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">new</span> PropertyModel(object1, <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;elementvalue&#8221;</span>));</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> theField.setRequired(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">true</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> add(theField);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> }</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;">/*</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> *  This is called when the next button i clicked,</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> *  I assume you want to use your for for data gathering..</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> *  Normally you&#8217;d save the object the the database</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> *  Or just leave it in memory and save it in the Wizard onFinish()</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> */</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">public</span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">void</span> applyState(){</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> System.<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #0000c0; padding: 0px; margin: 0px; border: 0px initial initial;">err</span>.println(<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;Applying state!&#8221;</span>);</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f5f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> setComplete(</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f0055; padding: 0px; margin: 0px; border: 0px initial initial;">true</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">); </span>// Set this step as done, you should put custom logic here</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; white-space: pre; padding: 0px; margin: 0px; border: 0px initial initial;"> </span> }</p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;">}</p>
</td>
<td>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #7f007f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">html</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span>xmlns:wicket<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span>wicket:panel<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span>fieldset<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">legend</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f007f; padding: 0px; margin: 0px; border: 0px initial initial;">wicket:id</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">=</span>&#8220;elementlabel&#8221;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;&lt;/</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;/</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">legend</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span> <span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f007f; padding: 0px; margin: 0px; border: 0px initial initial;">wicket:id</span>=<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;">&#8220;elementdescription&#8221;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span>[Element Description]<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;/</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">span</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">br</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">/&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #2a00ff; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;">input</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f007f; padding: 0px; margin: 0px; border: 0px initial initial;">type</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">=</span>text<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #7f007f; padding: 0px; margin: 0px; border: 0px initial initial;">wicket:id</span><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #000000; padding: 0px; margin: 0px; border: 0px initial initial;">=</span>&#8220;elementvalue&#8221;<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;/</span>fieldset<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;/</span>wicket:panel<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
<p style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; text-align: justify; font: normal normal normal 11px/normal Monaco; color: #3f7f7f; padding: 0px; margin: 0px; border: 0px initial initial;"><span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&lt;/</span>html<span style="font-weight: inherit; font-style: inherit; font-size: 11px; font-family: inherit; vertical-align: baseline; color: #008080; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;</span></p>
</td>
</tr>
</tbody>
</table>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="font-family: Georgia; color: #7f0055; font-size: small;"><span> </span></span></p>
<p><strong>Add an Overview</strong></p>
<p>The overview is just a bit of markup that is placed in the element named &#8216;overview&#8217;. Nominally this is used to give the user an &#8216;overview&#8217; of what this wizard is all about etc.  This is pretty vanilla but we are nothing if not complete.</p>
<table border="0">
<tbody>
<tr>
<td>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">package</span> wicket.quickstart;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">import</span> wicket.markup.html.panel.Panel;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f5f;">/*</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f5f;">* The Overview panel is displayed in the Overview <span style="text-decoration: underline;">div</span> automatically.</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f5f;">* It serves no special purposes other then for the default wizard</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f5f;">* to display common information across pages.</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f5f;">*/</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">class</span> <span style="text-decoration: underline;">OverviewPanel</span> <span style="color: #7f0055;">extends</span> Panel {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span><span style="color: #7f0055;">public</span> OverviewPanel(String id){</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span><span style="color: #7f0055;">super</span>(id);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;"><span style="white-space: pre;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
</td>
<td>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #7f007f;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">html</span><span style="color: #000000;"> </span>xmlns:wicket<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #008080;">&lt;</span>wicket:panel<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">Overview Panel</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #008080;">&lt;/</span>wicket:panel<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #008080;">&lt;/</span>html<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
</td>
</tr>
</tbody>
</table>
<p><strong>Pressing My Buttons</strong></p>
<p>The other thing developers usually want to customize are the buttons. You may need to add custom classes in order to Prettify them, you might want to use images. Buttons always need some help. The Wizard by default places buttons in a wicket element  component with the id &#8216;buttons&#8217;. To create your own ButtonBar you just need to &#8230; wait for it .. extend Panel and make sure you have some specific markup in the page to indicate to wicket what element to attach its actions to.</p>
<table border="0">
<tbody>
<tr>
<td>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">package</span> wicket.quickstart;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">import</span> wicket.extensions.wizard.CancelButton;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">import</span> wicket.extensions.wizard.FinishButton;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">import</span> wicket.extensions.wizard.NextButton;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">import</span> wicket.extensions.wizard.PreviousButton;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">import</span> wicket.extensions.wizard.Wizard;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">import</span> wicket.markup.html.panel.Panel;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">class</span> <span style="text-decoration: underline;">ButtonBarPanel</span> <span style="color: #7f0055;">extends</span> Panel {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span><span style="color: #7f0055;">public</span> ButtonBarPanel(String id, Wizard wizard){</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span><span style="color: #7f0055;">super</span>(id);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">add(<span style="color: #7f0055;">new</span> PreviousButton(<span style="color: #2a00ff;">&#8220;previous&#8221;</span>, wizard));</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">add(<span style="color: #7f0055;">new</span> NextButton(<span style="color: #2a00ff;">&#8220;next&#8221;</span>, wizard));</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">add(<span style="color: #7f0055;">new</span> YourLastButton(<span style="color: #2a00ff;">&#8220;last&#8221;</span>, wizard));</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">add(<span style="color: #7f0055;">new</span> CancelButton(<span style="color: #2a00ff;">&#8220;cancel&#8221;</span>, wizard));</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">add(<span style="color: #7f0055;">new</span> FinishButton(<span style="color: #2a00ff;">&#8220;finish&#8221;</span>, wizard));</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
</td>
<td>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="text-decoration: underline;">&lt;</span><span style="text-decoration: underline;">wicket:panel</span><span style="text-decoration: underline;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #008080;">&lt;</span>div<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">input</span><span style="color: #000000;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;previous&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">type</span><span style="color: #000000;">=</span>&#8220;submit&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">value</span><span style="color: #000000;">=</span>&#8220;previous&#8221;<span style="color: #000000;"> </span><span style="color: #008080;">/&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">input</span><span style="color: #000000;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;next&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">type</span><span style="color: #000000;">=</span>&#8220;submit&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">value</span><span style="color: #000000;">=</span>&#8220;next&#8221;<span style="color: #000000;"> </span><span style="color: #008080;">/&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">input</span><span style="color: #000000;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;last&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">type</span><span style="color: #000000;">=</span>&#8220;submit&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">value</span><span style="color: #000000;">=</span>&#8220;last&#8221;<span style="color: #000000;"> </span><span style="color: #008080;">/&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">input</span><span style="color: #000000;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;cancel&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">type</span><span style="color: #000000;">=</span>&#8220;submit&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">value</span><span style="color: #000000;">=</span>&#8220;cancel&#8221;<span style="color: #000000;"> </span><span style="color: #008080;">/&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"> </span><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">input</span><span style="color: #000000;"> </span><span style="text-decoration: underline;">wicket:id</span><span style="color: #000000;">=</span>&#8220;finish&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">type</span><span style="color: #000000;">=</span>&#8220;submit&#8221;<span style="color: #000000;"> </span><span style="color: #7f007f;">value</span><span style="color: #000000;">=</span>&#8220;finish&#8221;<span style="color: #000000;"> </span><span style="color: #008080;">/&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #008080;">&lt;/</span>div<span style="color: #008080;">&gt;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f7f;"><span style="color: #008080;">&lt;/</span>wicket:panel<span style="color: #008080;">&gt;</span></p>
<div style="text-align: justify;"><span style="font-family: Monaco; color: #008080; font-size: small;"><span style="line-height: normal;"></p>
<p></span></span></div>
</td>
</tr>
</tbody>
</table>
<p>Easy! However if you look closely you will notice that One Of These Buttons is doing his own thing. We are attaching a button called &#8216;YourLastButton&#8217; to the wicket element &#8216;last&#8217;. This is a custom button implementation as an example of what can be done. Note that you are not controlling the view of a button, just the controller. You&#8217;d do this if you wanted to add some customer behavior to a button or override one of the methods like isEnabled(). The most general case is to add an update workflow to the onClick() that updates the model somehow.</p>
<table border="0">
<tbody>
<tr>
<td>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">jfdpackage wicket.quickstart;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">import wicket.extensions.wizard.IWizard;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">import wicket.extensions.wizard.IWizardModel;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">import wicket.extensions.wizard.WizardButton;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">public class YourLastButton extends WizardButton</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">{</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>private static final long serialVersionUID = 1L;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>public YourLastButton(String id, IWizard wizard)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>{</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>super(id, wizard, &#8220;org.apache.wicket.extensions.wizard.last&#8221;);</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>public final boolean isEnabled()</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>{</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>return getWizardModel().isLastAvailable();</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>public final boolean isVisible()</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>{</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>return getWizardModel().isLastVisible();</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>public final void onClick()</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>{</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>IWizardModel wizardModel = getWizardModel();</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>wizardModel.getActiveStep().applyState();</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>wizardModel.lastStep();</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2353px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">}</div>
<p><span style="font-family: Monaco; font-size: 11px;"><span style="color: #7f0055;">package</span> wicket.quickstart;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">import</span> wicket.extensions.wizard.IWizard;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">import</span> wicket.extensions.wizard.IWizardModel;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">import</span> wicket.extensions.wizard.WizardButton;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">class</span> YourLastButton <span style="color: #7f0055;">extends</span> WizardButton {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #7f0055;"><span style="color: #000000;"><span style="white-space: pre;"> </span></span>private<span style="color: #000000;"> </span>static<span style="color: #000000;"> </span>final<span style="color: #000000;"> </span>long<span style="color: #000000;"> </span><span style="color: #0000c0;">serialVersionUID</span><span style="color: #000000;"> = 1L;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span><span style="color: #7f0055;">public</span> YourLastButton(String id, IWizard wizard) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"><span style="white-space: pre;"> </span></span><span style="color: #7f0055;">super</span><span style="color: #000000;">(id, wizard, </span>&#8220;org.apache.wicket.extensions.wizard.last&#8221;<span style="color: #000000;">);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #7f0055;"><span style="color: #000000;"><span style="white-space: pre;"> </span></span>public<span style="color: #000000;"> </span>final<span style="color: #000000;"> </span>boolean<span style="color: #000000;"> isEnabled() {</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span><span style="color: #7f0055;">return</span> getWizardModel().isLastAvailable();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #7f0055;"><span style="color: #000000;"><span style="white-space: pre;"> </span></span>public<span style="color: #000000;"> </span>final<span style="color: #000000;"> </span>boolean<span style="color: #000000;"> isVisible() {</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span><span style="color: #7f0055;">return</span> getWizardModel().isLastVisible();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">final</span> <span style="color: #7f0055;">void</span> onClick() {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span>IWizardModel wizardModel = getWizardModel();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span>wizardModel.getActiveStep().applyState();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span>wizardModel.lastStep();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">}</p>
<div><span style="font-family: Monaco; font-size: small;"><span></p>
<p></span></span></div>
<p><br class="spacer_" /></p>
<p><br class="spacer_" /></td>
<td></td>
</tr>
</tbody>
</table>
<p><strong>Summary</strong></p>
<p>This is a basic introduction on how to implement your own Wizard markup in place of the mark-up that the wizard puts out. I had to get through this on a project because throwing the default table based layout into my pages was causing some serious issues. By creating my own extended Wizard classes I was able to totally customize the look/feel of the wizard and ensure pixel perfect design. In my case I needed to use <a title="NiceForms" href="http://www.emblematiq.com/projects/niceforms/" target="_blank">NiceForms</a> which I highly recommend. Particularly since you can now Customize Your Wicket Wizard..</p>
<p>You can do more with Wizards, much more. This tutorial is not meant to be comprehensive. Check out the <a title="WizardAPI" href="http://www.wicketframework.org/wicket-extensions/apidocs/wicket/extensions/wizard/package-summary.html">Wizard API</a> for a total rundown on what can be sub-classed. Take a look at the DynamicWizardStep and other classes, they really open the power of the Wizard. Also refer to the source for the base implementations. Open Source is an invaluable resource so Read The Source. The Wizard code is short and easy to understand since it uses the common Wicket constructs (panels etc). Don&#8217;t be intimidated.</p>
<p>Now, Go Forth And Wizardify.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.siberian.org/2009/06/24/customizing-wicket-wizard-markup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blue Collar vs White Collar developers</title>
		<link>http://www.siberian.org/2009/04/30/blue-collar-vs-white-collar-developers/</link>
		<comments>http://www.siberian.org/2009/04/30/blue-collar-vs-white-collar-developers/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 19:45:32 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://www.siberian.org/2009/04/30/blue-collar-vs-white-collar-developers/</guid>
		<description><![CDATA[There is an serious and mostly ignored split between Programming as a Trade and Programming as a Science.]]></description>
			<content:encoded><![CDATA[<p><em>From a recent post I made @ javaworld on the topic of <strong>&#8216;Do you need a degree to be a programmer&#8217;</strong></em></p>
<p>There is a serious and mostly ignored split between Programming as a Trade and Programming as a Science.</p>
<p>There is a huge and legitimate need for people who can make a Core 2 Duo bleed by simply looking at it and thinking harsh and deep computer sciency thoughts. These folks tend to be on the science edge of the spectrum, you need them to be. You may be plumbing the depths of the universe, doing 15 degrees of relationships among a population of billions, inventing new and innovative compression algorithms, developing operating systems that run on graphics cards as parallel processing platforms or peering through an atom, these people are scientists.  They make the tools that make the rest of us go. These folks don&#8217;t get paid tons but they also tend to go to work in big safe buildings with lots of locks and guards and almost never get fired.</p>
<p>Then there are the trade folks. Computer Science as a Blue Collar occupation. All of the Java, C, C++, perl, python etc folks who just want a paycheck, get enjoyment out of building things and occasionally, very occasionally, hit it big. Thankfully there are enough of the blue collar folks that the &#8216;hit it big&#8217; ratio appears to be fairly high and thus encourages the rest of the interested to jump in and try their luck. But, for the most part, the blue collar folks are head down in the trenches on the hamster wheel of quarterly releases that never end.</p>
<p>Incidentally, these folks, just like auto workers, tend to get outsourced.</p>
<p>If you really want to get extreme, for the Blue Collar crowd, there is no longer a relevant need to understand Big O/Sigma/Theta and they really don&#8217;t care about sorting algorithms or how an operating system manages its virtual memory. Their ability to do good or bad is limited, incidentally just like the auto workers, by their tools compensating for their lack of knowledge/care (optimized compilers vs safety robots). The constraint of range that both the auto-worker robots and Blue Collar developer compilers/tools enforce is at the same time liberating as it is constraining. In some ways you can Do More Faster and in other ways you Just Cant Do As Much. But as long as those White Collar guys keep getting paid to make sure the tools compensate everything will be a-ok.</p>
<p>This is also why you don&#8217;t see a lot of Blue Collar guys doing embedded work, the toolsets are not engineered for safety so those tend to be more Sciency then Trade.</p>
<p>Anyhow, this &#8216;must have a college degree&#8217; is an attempt to maintain software engineering as a White Collar profession for -all- of its members and maybe does us all a bit of a disservice when, truly in todays service economy, it has become Blue Collar in the western world.</p>
<p>Then again, maybe we&#8217;d all be better if everyone could make processors bleed by looking at them.. I just don&#8217;t know, but I do know that in my recruiting efforts seeing this split and understanding the requirements for a given position dramatically increases my success rate in hiring Right Fits for my team.</p>
<p>Your mileage may vary.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.siberian.org/2009/04/30/blue-collar-vs-white-collar-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction: Apple TV as a Matrix Switch Controller</title>
		<link>http://www.siberian.org/2009/04/04/introduction-apple-tv-as-a-matrix-switch-controller/</link>
		<comments>http://www.siberian.org/2009/04/04/introduction-apple-tv-as-a-matrix-switch-controller/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 12:22:17 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://www.siberian.org/2009/04/04/introduction-apple-tv-as-a-matrix-switch-controller/</guid>
		<description><![CDATA[I&#8217;ve run an autopatch matrix switch for a few years in my house. This total overkill solution boils down to one key feature: The ability to send any device (Tivo, DVD, Cable) to 0 or more outputs (Televisions, computers etc) in my house. It does this in a &#8216;matrix&#8217; fashion so, for example, I can [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve run an autopatch matrix switch for a few years in my house. This total overkill solution boils down to one key feature: The ability to send any device (Tivo, DVD, Cable) to 0 or more outputs (Televisions, computers etc) in my house. It does this in a &#8216;matrix&#8217; fashion so, for example, I can have my Tivo on in the living room but the DVD player on in the kitchen and the bedroom while my media server is switched to the garage so I can listen to music.</p>
<p>Its a very flexible way to manage your A/V distribution needs. However the real problem with it is controlling it, these matrix switchers are Old School and require Serial commands. Here is an example session over the serial port:</p>
<p><code><br />
CI3O6T<br />
</code></p>
<p>That means <b>C</b>hange <b>I</b>nput <b>3</b> to <b>O</b>utput <b>6</b> <b>T</b>ake</p>
<p>Fun right? Well, maybe for me but my wife and children hate it.</p>
<p>A few years ago I wrote an interface for my Pronto remote that relied on Girder, a Windows based home automation package. Well, the pronto went belly up and the media PC was then replaced by an AppleTV and now, whenever we want to switch, I have to VNC to an old G4 laptop in the garage to issue the switching commands. Terrible..</p>
<p>So, this new category, AppleTV, is where I will document my quest to turn my AppleTV + my Harmony remote into a Matrix Switch Controller (on top of its normal duties). I have a roadmap prepared of all the tasks to accomplish in order to make this a reality. Some are these are done already but I will list them for historical purposes.</p>
<p>1. Hack my AppleTV. It needs to be SSH, fink (for svn and other utils) and USB enabled.<br />
2. Get the AppleTV to recognize the <a href="http://www.usbuirt.com/">USB-UIRT</a> so that I can send it IR commands.<br />
3. Get the AppleTV running java and jetty, so I can create a simple web UI to manage configurations<br />
4. Convince the AppleTV to recognize and interact with the Keyspan USB->Serial port dongle<br />
5. Get the USB->Serial Dongle and the USB-UIRT functioning on a USB hub<br />
6. Get ribsu to receive commands from the USB-UIRT on appletv.<br />
7. Get ribsu to flush its STDOUT so that I can exec it from java and work with the output in real-time<br />
8. Prototype a simple control app via Jetty to prove that it all snaps together<br />
9. Can I get wicket or some other jetty controlled app to do some AppleTV UI control so I can break the web barrier?</p>
<p>These items will prove it all fits together properly and will allow me to design my application. This app has some high level features, here they are:</p>
<p>1) JSON interfaces for all functions for future automation purposes.<br />
2) Lightweight server process / highly visual and dynamic web app in javascript so the weak AppleTV doesn&#8217;t get burdened.<br />
3) Ability to create configurations that can be referenced as a whole (EG: Switch DVD to Bedroom (CI2O5T) )<br />
4) Ability to learn remote codes and then assign them to a configuration</p>
<p>That is the base minimum to allow my usage scenario of teaching the harmony remote how to do these things.</p>
<p>The future dreamy stuff would be to create some sort of plugin architecture so folks can extend it to do other things. Thats out a bit, right now I just need to be able to control the switcher..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.siberian.org/2009/04/04/introduction-apple-tv-as-a-matrix-switch-controller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JARS, Libraries, Runnables and Ant</title>
		<link>http://www.siberian.org/2009/04/04/jars-libraries-runnables-and-ant/</link>
		<comments>http://www.siberian.org/2009/04/04/jars-libraries-runnables-and-ant/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 00:01:46 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.siberian.org/2009/04/04/jars-libraries-runnables-and-ant/</guid>
		<description><![CDATA[For various and sundry reasons I wrote a nice little swing app awhile back which immediately sends me down the rabbit hole of 'Packaging Java Applications'. Apparently the old adage that Java  was designed by PhD's and implemented by interns holds true in regards to the method of deployment for desktop java apps. Let me share my experience.]]></description>
			<content:encoded><![CDATA[<p>For various and sundry reasons I wrote a nice little swing app awhile back which immediately sends me down the rabbit hole of &#8216;Packaging Java Applications&#8217;. Apparently the old adage that Java  was designed by PhD&#8217;s and implemented by interns holds true in regards to the method of deployment for desktop java apps. Let me share my experience.</p>
<h3>
Double-clickable JAR</h3>
<p>You want users to double click the application, just like any other application.  This is actually easy and well-documented, you just create a manifest.xml at the root of the app that looks like this:<br />
<code><br />
Manifest-Version: 1.0<br />
Sealed: true<br />
Main-Class: gui.SyncApp</code></p>
<p>Replace &#8216;gui.SyncApp&#8217; with the class that contains your main and your in business. Any recent JRE will launch this for you.</p>
<h3>Bundled Libraries</h3>
<p>Ok this one is a real bummer. Any reasonably modern Java app will have approx 35,431 JAR files that it requires. Unfortunately JAR files can not reference themselves internally in regards to the Class-Path for some esoteric reason that probably makes great sense on paper but utterly falls down in the Real World.</p>
<p>So when you do the normal &#8216;Export as JAR&#8217; any bundled up JARs are useless! The answer is to unzip ALL of your jar libraries and bring the packages right into your app. Luckily Eclipse 3.4+ has a new export option &#8220;Runnable JAR&#8221;. This is a continuation of the very successful Fat-JAR project that has merged into Eclipse and basically decompresses everything for you and also pulls in all none code files for referencing as required.</p>
<p>SideNote: Fat-JAR is not OS X compat but the Export->Runnable seems to work great.</p>
<h3>Embedded Databases and ORMS</h3>
<p>For this particular app I merged the greatness of <a href="http://db.apache.org/derby/">Derby</a> (a pure java embedded database) with the fantastic <a href="http://cayenne.apache.org/">Apache Cayenne ORM</a>. This combination gave me great features in a nice tight package. The problem was how to deploy these things in a JAR file.</p>
<h4>Problem 1: Data Source location</h4>
<p>Where does the database live since its a file on disk? My app needs to run on Windows, Linux and Mac, all of which have dramatically different file system layouts. The answer here is:</p>
<p><code>System.getProperty("user.home") + "/myDbName";</code></p>
<p>This ensures that every OS does the Right Thing.</p>
<h4>Problem 2: Tell the ORM where the database is</h4>
<p>Now that I have a database how the heck do we tell Cayenne how to find it? Cayenne, like most Java frameworks, requires a static xml file for configuration. Unfortunately for me my database location is dynamic (based on the value of user.home) and the cayenne xml file is does not accept variables (like Ant does). After some great help from the listserv I simply implemented my own DataSourceFactory which turned out to be a lot less scary then I thought it would be.</p>
<p><code><br />
	public DataSource getDataSource(String location) throws Exception {</p>
<p>		// Set up the driver, in case it's not on the classpath<br />
		Class.forName("org.apache.derby.jdbc.EmbeddedDriver");<br />
		String theDatabase = System.getProperty("user.home") + "/myDBName";<br />
		String url = "jdbc:derby:" + theDatabase + ";create=true";<br />
		String username = "";<br />
		String password = "";<br />
		String schema = "";</p>
<p>		try {<br />
			DriverManager.getDriver(url);<br />
		} catch (SQLException e) {<br />
			log.debug(getClass() + "Failed in registering "<br />
					+ "org.apache.derby.jdbc.EmbeddedDriver");<br />
			// conn = DriverManager.getConnection(url);<br />
		}</p>
<p>		// Connect<br />
		log.debug("Connecting to " + url);<br />
		PoolManager poolManager = new PoolManager(null, // Setting this to null<br />
														// will force Cayenne to<br />
														// use the DriverManager<br />
				url, 1, 1, username, password, new ConnectionLogger());<br />
		conn = poolManager.getConnection();</p>
<p>		// Check if the schema is up to par<br />
		if (!checkSchema()) {<br />
			createSchema();<br />
		}</p>
<p>		conn.close();</p>
<p>		// All done!<br />
		return poolManager;<br />
	}<br />
</code></p>
<p>Now the app can dynamically connect to the proper database for its host OS file system.</p>
<h3>First Run&#8230;</h3>
<p>Next Problem! On first run the database does not yet exist but Cayenne assumes that it DOES exist. This makes Cayenne unhappy, confused and exception prone since connecting works, Derby autocreates the base database, but any real work fails since the database is empty! We need a way to create and populate the database on first run.</p>
<p>Easy enough, we just run some simple checks post-connect and if they fail we build out the tables required.<br />
<code><br />
// Check if the schema is up to par<br />
if (!checkSchema()) {<br />
     createSchema();<br />
}<br />
</code></p>
<p>All checkSchema() does is attempt a simple query that should succeed if the table exists (even if it returns 0 rows). If it fails we create the table structures as required using various mechanisms and the createDDL function below. I chose Ant for this, Ant does things like this exceptionally well.</p>
<h3>Headless Ants &#8211; Creating the table structure on the fly</h3>
<p>Just because Ant does something well doesn&#8217;t mean that Real Humans can use it. No Real Human is going to execute an Ant script in order to use my cool little tool. This means we have to create Headless Ants that are automated. Easy enough! Ant, like all serious things Java, has an API.</p>
<p><code><br />
   public static void createDDL(String build, String db, String theDatabase) {<br />
    	Project p = new Project();<br />
	p.init();<br />
	p.setProperty("dbFile", theDatabase);<br />
	File buildFile = new File(build);<br />
	File dbFile = new File(db);<br />
	System.err.println("File is "+buildFile.length());<br />
	ProjectHelper.configureProject(p, buildFile);<br />
	p.executeTarget("import-target-db");<br />
    }<br />
</code></p>
<p>All we do is pass this function the build.xml path, the db-schema.xml path and the database path. The Ant ddlToDatabase function takes care of the rest for us. Thanks Ant!</p>
<h3>Ant Hates JARs</h3>
<p>Here is where I really lost it, I simply could NOT coerce Ant into creating the database when running from the JAR file. In Eclipse everything was fine but from the JAR it would constantly bomb out  because it could not find the build.xml file. After hours and hours of useless Googling and experimenting I finally discovered the following:</p>
<p>A) You CAN get a handle to the build.xml file using the ClassLoader<br />
<code>java.io.InputStream is = ClassLoader.getSystemResourceAsStream("build.xml");</code><br />
B) However Ant has no idea how to deal with this, even when you load it as a URL instead of an input stream and pass Ant URL.getFile().</p>
<p>Solution? Copy this file to the users home.dir as .build.xml and pass THAT into the ProjectHelper. Delete when the operation completes.</p>
<p>I also had to do the same with the db-schema.xml file. Once these two files lived outside of the JAR Ant was happy, the database built and the app ran.</p>
<h3>Conclusion</h3>
<p>None really, once you know how it all snaps together its pretty easy stuff but getting there took a long long time. The docs are terrible and Google can&#8217;t find much on the topic that is anything more then other clueless developers begging for help.</p>
<p>Ant does suck in relation to JAR files although I am almost positive I could have done the entire thing in pure Java with no XML somehow. Possibly there is a better solution and way to get Ant to be JAR aware but given how horrible Java support for runnable JARs is I am doubting that this Better Way exists..</p>
<h3>Bonus Points</h3>
<p>I&#8217;ve used Install4J to create native OS packages (both JRE and non-JRE included versions). Fun!</p>
<h3>Bummer Points</h3>
<p>JNLP (java webstart) runs in a web sandbox so file system access is really difficult. They provide a simple API for file access but since my tools are mostly bundled up jars from other projects it proved exceedingly difficult to teach those how to use the new API for local file access (xml files etc). My solution here was to Give Up since I already had native app installers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.siberian.org/2009/04/04/jars-libraries-runnables-and-ant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Untangle + VMWare = Extreme Goodness</title>
		<link>http://www.siberian.org/2009/03/03/untangle-vmware-extreme-goodness/</link>
		<comments>http://www.siberian.org/2009/03/03/untangle-vmware-extreme-goodness/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 00:26:14 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.siberian.org/2009/03/03/untangle-vmware-extreme-goodness/</guid>
		<description><![CDATA[A friend and I were experimenting with new network configurations for his Wireless ISP. He runs a lot of services and has a very extensive network and is growing, fast.
Recently he installed an Untangle server so that his users would get less Spam, he could start shaping traffic/dealing better with PeerToPeer traffic and other such [...]]]></description>
			<content:encoded><![CDATA[<p>A friend and I were experimenting with new network configurations for his Wireless ISP. He runs a lot of services and has a very extensive network and is growing, fast.</p>
<p>Recently he installed an <a href="http://www.untangle.com/">Untangle</a> server so that his users would get less Spam, he could start shaping traffic/dealing better with PeerToPeer traffic and other such things. He really likes the product and when it came time to add a few servers to his network we decided to virtualize them in VMWare.</p>
<p>The preferred configuration for this system was<br />
VM1 : Untangle<br />
VM2 : Web<br />
VM3 : Mail</p>
<p>All well and good until you understand that Untangle is a <a href="http://en.wikipedia.org/wiki/Transparent_bridge">Transparent Bridge</a>, it needs to sit on the network between machines so it can manage all the traffic. Transparent Bridges are a nice piece of Layer 2 magic that look like a Firewall but are zero config and do not require network changes, NATs etc. They simply grab all incoming traffic on the external port, sorts and manages packets and then passes approved traffic/modified traffic onto the internal network. Likewise for outgoing traffic (swap external/internal). All &#8220;Internal&#8221; machines get External IP&#8217;s so you get the power of a traffic shaping firewall with the simplicity of a single network.</p>
<p>So, how does this work on a VMWare box? Easy and obvious but I want to confirm it works and works well.</p>
<p>Obtain a server with more then one network port. VMware Server will route packets between them <strong>even if they are not physically connected</strong>. So, in this example we put Untangles external network on ETH0 which was &#8220;connected&#8221; (configured really, its a VM) to speak to the outside network and then we configure its internal network to bridge to ETH1 which has no network connected.</p>
<p>Any protected VM&#8217;s just get configured to use the Physical ETH1 as their device. Give them an external IP address (its a transparent bridge, remember, not a firewall) and you will be off to the races.</p>
<p>Bonus, you can connect a physical network segment to ETH1 and Untangle in the VM will protect both the Physical and Virtual machines.</p>
<p>Its quite slick and I am very impressed, good work Untangle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.siberian.org/2009/03/03/untangle-vmware-extreme-goodness/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
