<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4526035505570833554</id><updated>2011-11-27T15:50:19.451-08:00</updated><category term='dropdown'/><category term='AutoCompleteTextField'/><category term='choice'/><category term='DropDownChoice'/><category term='endless pageless behaviour'/><category term='java'/><category term='wicket'/><category term='radiochoice'/><title type='text'>The code filled.. code story blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://donteattoomuch.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4526035505570833554/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://donteattoomuch.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>DontEatTooMuch</name><uri>http://www.blogger.com/profile/04563755867766671563</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4526035505570833554.post-510989517426489571</id><published>2008-04-29T20:42:00.000-07:00</published><updated>2008-04-29T21:22:01.771-07:00</updated><title type='text'>Partial ajax update capable list view</title><content type='html'>&lt;a href="http://java.dzone.com/news/interview-how-wicket-does-ajax"&gt;interview-how-wicket-does-ajax&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I read this interview i think yesterday or day before and something which eelco said actually helped-&lt;br /&gt;"&lt;b style="font-style: italic;"&gt;Eelco. &lt;/b&gt;&lt;span style="font-style: italic;"&gt;The fact that you can encapsulate Ajax in self contained components. My favorite part of Wicket's Ajax is really how easy it is to replace a component on the fly. I typically create the Ajax components I need from scratch (base classes rather).&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;I was struggling to think how i could write a list view which was capable of pagination via ajax, only repainting the new items. Today I dared to try from the scratch approach--extending from RefreshingView and I could design few classes which actually can do so. Not only that, but I have tested them and they seem to work perfectly fine.&lt;br /&gt;&lt;br /&gt;The AjaxEndlessPageableView and AjaxEndlessDataView I provide here are created looking at code of existing components. They complement the &lt;a href="http://donteattoomuch.blogspot.com/2008/01/implementing-endless-pageless-in-wicket.html"&gt;OnScrollEndUpdaterBehaviour&lt;/a&gt; in case one wants to implement endless navigation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(1) The Interface IAjaxPageable is at the top of this class hirarchy&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;import org.apache.wicket.ajax.AjaxRequestTarget;&lt;br /&gt;import org.apache.wicket.markup.html.navigation.paging.IPageable;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IAjaxPageable extends IPageable&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * Sets the page/viewincrement that should be rendered.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @param page&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     *            The page that should be rendered.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; setCurrentPage(&lt;span class="kwrd"&gt;int&lt;/span&gt; page,AjaxRequestTarget target);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;(2)The AjaxPageableView--note that we talk in terms of view increments rather pages (decrements are not incorporated in here yet)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import java.util.NoSuchElementException;&lt;br /&gt;import org.apache.wicket.ajax.AjaxRequestTarget;&lt;br /&gt;import org.apache.wicket.markup.repeater.Item;&lt;br /&gt;import org.apache.wicket.markup.repeater.RefreshingView;&lt;br /&gt;import org.apache.wicket.model.IModel;&lt;br /&gt;import org.apache.wicket.version.undo.Change;&lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt; * setCurrentView method can be used to increment the view ajax.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt; * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt; * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AjaxEndlessPageableView extends RefreshingView implements IAjaxPageable&lt;br /&gt;{&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * items shown on first page initially, initially set to Integer.MAX_VALUE&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * meaning everything shown on the same page and no extra paging views.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; itemsOnStartPage = Integer.MAX_VALUE;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Logger log = LoggerFactory.getLogger(AjaxEndlessPageableView.&lt;span class="kwrd"&gt;class&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * Items for each view increment initially set to 0 meaning no more paging&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * views&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; itemsPerViewIncrement = 0;&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; currentViewNumber = 0;&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * &amp;lt;code&amp;gt;cachedItemCount&amp;lt;/code&amp;gt; is used to cache the call to&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * &amp;lt;code&amp;gt;internalGetItemCount()&amp;lt;/code&amp;gt; for the duration of the request&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * because that call can potentially be expensive ( a select count query )&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * and so we do not want to execute it multiple times.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; cachedItemCount;&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; AjaxEndlessPageableView(String id, IModel model, &lt;span class="kwrd"&gt;int&lt;/span&gt; itemsOnStartPage)&lt;br /&gt;  {&lt;br /&gt;      super(id, model);&lt;br /&gt;      clearCachedItemCount();&lt;br /&gt;      &lt;span class="kwrd"&gt;this&lt;/span&gt;.itemsOnStartPage = itemsOnStartPage;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; AjaxEndlessPageableView(String id, &lt;span class="kwrd"&gt;int&lt;/span&gt; itemsOnStartPage)&lt;br /&gt;  {&lt;br /&gt;      super(id);&lt;br /&gt;      clearCachedItemCount();&lt;br /&gt;      &lt;span class="kwrd"&gt;this&lt;/span&gt;.itemsOnStartPage = itemsOnStartPage;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; AjaxEndlessPageableView(String id, IModel model)&lt;br /&gt;  {&lt;br /&gt;      super(id, model);&lt;br /&gt;      clearCachedItemCount();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; AjaxEndlessPageableView(String id)&lt;br /&gt;  {&lt;br /&gt;      super(id);&lt;br /&gt;      clearCachedItemCount();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; clearCachedItemCount()&lt;br /&gt;  {&lt;br /&gt;      cachedItemCount = -1;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; setCachedItemCount(&lt;span class="kwrd"&gt;int&lt;/span&gt; itemCount)&lt;br /&gt;  {&lt;br /&gt;      cachedItemCount = itemCount;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; getCachedItemCount()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (cachedItemCount &amp;lt; 0)&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalStateException(&lt;span class="str"&gt;"getItemCountCache() called when cache was not set"&lt;/span&gt;);&lt;br /&gt;      }&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; cachedItemCount;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; boolean isItemCountCached()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; cachedItemCount &amp;gt;= 0;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; Iterator getItemModels()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;int&lt;/span&gt; offset = getViewOffset();&lt;br /&gt;      &lt;span class="kwrd"&gt;int&lt;/span&gt; size = getViewSize();&lt;br /&gt;      Iterator models = getItemModelsInCurrentViewIncrement(offset, size);&lt;br /&gt;      models = &lt;span class="kwrd"&gt;new&lt;/span&gt; CappedIteratorAdapter(models, size);&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; models;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; boolean isOnStartPage()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; getCurrentPage() == 0;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @return the number of items visible&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; getViewSize()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (isOnStartPage())&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; internalGetItemsOnStartPage();&lt;br /&gt;      }&lt;br /&gt;      &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; Math.min(internalGetItemsPerViewIncrement(), getRowCount() - getViewOffset());&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; onDetach()&lt;br /&gt;  {&lt;br /&gt;      clearCachedItemCount();&lt;br /&gt;      super.onDetach();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @return the index of the first visible item&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; getViewOffset()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (isOnStartPage())&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;&lt;br /&gt;      }&lt;br /&gt;      &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; internalGetItemsOnStartPage() + internalGetItemsPerViewIncrement()&lt;br /&gt;                  * getPreviousPage();&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * Returns an iterator over models for items in the incremental view&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @param offset&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     *            index of first new item in this view increment&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @param size&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     *            number of items that will be showing in the current view&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     *            increment&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @return an iterator over models for items in the current view increment&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; Iterator getItemModelsInCurrentViewIncrement(&lt;span class="kwrd"&gt;int&lt;/span&gt; offset, &lt;span class="kwrd"&gt;int&lt;/span&gt; size);&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * This call is very costly never ever use it directly. use getRowCount()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @return total item count&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; internalGetItemCount();&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @return total item count&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; final &lt;span class="kwrd"&gt;int&lt;/span&gt; getRowCount()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (!isVisibleInHierarchy())&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (isItemCountCached())&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; getCachedItemCount();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;int&lt;/span&gt; count = internalGetItemCount();&lt;br /&gt;&lt;br /&gt;      setCachedItemCount(count);&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; count;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; populateItem(Item item);&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; String getJavaScriptToRenderNewDomElement(Item item);&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * returns the current view number starting from the start page view number&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * which is 0&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @see org.apache.wicket.markup.html.navigation.paging.IAjaxPageable#getCurrentPage()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; final &lt;span class="kwrd"&gt;int&lt;/span&gt; getCurrentPage()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;int&lt;/span&gt; view = currentViewNumber;&lt;br /&gt;&lt;br /&gt;      &lt;span class="rem"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * trim current page if its out of bounds this can happen if items are&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * deleted between requests&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (view &amp;gt;= getPageCount())&lt;br /&gt;      {&lt;br /&gt;          view = Math.max(getPageCount() - 1, 0);&lt;br /&gt;          setCurrentPage(view);&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; view;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; view;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * returns the previous view number&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @see org.apache.wicket.markup.html.navigation.paging.IAjaxPageable#getCurrentPage()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; final &lt;span class="kwrd"&gt;int&lt;/span&gt; getPreviousPage()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; getCurrentPage() - 1;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; getPageCount()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;int&lt;/span&gt; total = getRowCount();&lt;br /&gt;      &lt;span class="kwrd"&gt;int&lt;/span&gt; itemsPerView = internalGetItemsPerViewIncrement();&lt;br /&gt;      &lt;span class="kwrd"&gt;int&lt;/span&gt; itemsOnStartPage = internalGetItemsOnStartPage();&lt;br /&gt;      &lt;span class="kwrd"&gt;int&lt;/span&gt; countIncrementalViews = (total - itemsOnStartPage) / itemsPerView;&lt;br /&gt;      &lt;span class="kwrd"&gt;int&lt;/span&gt; count = countIncrementalViews + 1;&lt;span class="rem"&gt;// add 1 for start page&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (itemsPerView * countIncrementalViews + itemsOnStartPage &amp;lt; total)&lt;br /&gt;      {&lt;br /&gt;          count++;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; count;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @see org.apache.wicket.markup.html.navigation.paging.IAjaxPageable#setCurrentPage(int)&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; final &lt;span class="kwrd"&gt;void&lt;/span&gt; setCurrentPage(&lt;span class="kwrd"&gt;int&lt;/span&gt; view)&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (view &amp;lt; 0 || (view &amp;gt;= getPageCount() &amp;amp;&amp;amp; getPageCount() &amp;gt; 0))&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IndexOutOfBoundsException(&lt;span class="str"&gt;"argument [view]="&lt;/span&gt; + view + &lt;span class="str"&gt;", must be 0&amp;lt;=view&amp;lt;"&lt;/span&gt;&lt;br /&gt;                  + getPageCount());&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (currentViewNumber != view)&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;if&lt;/span&gt; (isVersioned())&lt;br /&gt;          {&lt;br /&gt;              addStateChange(&lt;span class="kwrd"&gt;new&lt;/span&gt; Change()&lt;br /&gt;              {&lt;br /&gt;                  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; final &lt;span class="kwrd"&gt;long&lt;/span&gt; serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;                  &lt;span class="kwrd"&gt;private&lt;/span&gt; final &lt;span class="kwrd"&gt;int&lt;/span&gt; old = currentViewNumber;&lt;br /&gt;&lt;br /&gt;                  @Override&lt;br /&gt;                  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; undo()&lt;br /&gt;                  {&lt;br /&gt;                      currentViewNumber = old;&lt;br /&gt;                  }&lt;br /&gt;&lt;br /&gt;                  @Override&lt;br /&gt;                  &lt;span class="kwrd"&gt;public&lt;/span&gt; String toString()&lt;br /&gt;                  {&lt;br /&gt;                      &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;"CurrentViewChange[component: "&lt;/span&gt; + getPath() + &lt;span class="str"&gt;", currentView: "&lt;/span&gt;&lt;br /&gt;                              + old + &lt;span class="str"&gt;"]"&lt;/span&gt;;&lt;br /&gt;                  }&lt;br /&gt;              });&lt;br /&gt;&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;      currentViewNumber = view;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @see org.apache.wicket.markup.html.navigation.paging.IAjaxPageable#setCurrentPage(int,AjaxRequestTarget)&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; final &lt;span class="kwrd"&gt;void&lt;/span&gt; setCurrentPage(&lt;span class="kwrd"&gt;int&lt;/span&gt; view, AjaxRequestTarget target)&lt;br /&gt;  {&lt;br /&gt;      setCurrentPage(view);&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (view == 0)&lt;br /&gt;      {&lt;br /&gt;          target.addComponent(AjaxEndlessPageableView.&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;      }&lt;br /&gt;      &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;int&lt;/span&gt; itemCountLast = getViewOffset();&lt;br /&gt;          &lt;span class="kwrd"&gt;for&lt;/span&gt; (Iterator it = getItemModels(); it.hasNext();)&lt;br /&gt;          {&lt;br /&gt;              String id = newChildId();&lt;br /&gt;              IModel model = (IModel)it.next();&lt;br /&gt;              Item item = newItem(id, itemCountLast, model);&lt;br /&gt;              populateItem(item);&lt;br /&gt;              item.setOutputMarkupId(&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;              add(item);&lt;br /&gt;              target.prependJavascript(getJavaScriptToRenderNewDomElement(item));&lt;br /&gt;              target.addComponent(item);&lt;br /&gt;              itemCountLast++;&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; final &lt;span class="kwrd"&gt;void&lt;/span&gt; nextPage(AjaxRequestTarget target)&lt;br /&gt;  {&lt;br /&gt;      setCurrentPage(getCurrentPage() + 1, target);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; final boolean hasMore()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; getViewSize() + getViewOffset() != getRowCount();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; final &lt;span class="kwrd"&gt;int&lt;/span&gt; internalGetItemsOnStartPage()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;int&lt;/span&gt; totalSize = getRowCount();&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; (itemsOnStartPage == Integer.MAX_VALUE || itemsOnStartPage &amp;gt; totalSize)&lt;br /&gt;              ? totalSize&lt;br /&gt;              : itemsOnStartPage;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; final &lt;span class="kwrd"&gt;void&lt;/span&gt; internalSetItemsOnStartPage(&lt;span class="kwrd"&gt;int&lt;/span&gt; items, AjaxRequestTarget target)&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (items &amp;lt; 1)&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span class="str"&gt;"Argument [itemsPerPage] cannot be less than 1"&lt;/span&gt;);&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (itemsOnStartPage != items)&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;if&lt;/span&gt; (isVersioned())&lt;br /&gt;          {&lt;br /&gt;              addStateChange(&lt;span class="kwrd"&gt;new&lt;/span&gt; Change()&lt;br /&gt;              {&lt;br /&gt;                  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; final &lt;span class="kwrd"&gt;long&lt;/span&gt; serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;                  final &lt;span class="kwrd"&gt;int&lt;/span&gt; old = itemsOnStartPage;&lt;br /&gt;&lt;br /&gt;                  @Override&lt;br /&gt;                  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; undo()&lt;br /&gt;                  {&lt;br /&gt;                      itemsOnStartPage = old;&lt;br /&gt;                  }&lt;br /&gt;&lt;br /&gt;                  @Override&lt;br /&gt;                  &lt;span class="kwrd"&gt;public&lt;/span&gt; String toString()&lt;br /&gt;                  {&lt;br /&gt;                      &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;"ItemsPerPageChange[component: "&lt;/span&gt; + getPath() + &lt;span class="str"&gt;", itemsPerPage: "&lt;/span&gt;&lt;br /&gt;                              + old + &lt;span class="str"&gt;"]"&lt;/span&gt;;&lt;br /&gt;                  }&lt;br /&gt;              });&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      itemsOnStartPage = items;&lt;br /&gt;&lt;br /&gt;      &lt;span class="rem"&gt;// because items per page can effect the total number of pages and also&lt;/span&gt;&lt;br /&gt;      &lt;span class="rem"&gt;// the view on the first page&lt;/span&gt;&lt;br /&gt;      setCurrentPage(0, target);&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; internalGetItemsPerViewIncrement()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; itemsPerViewIncrement;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; onBeforeRender()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (!(AjaxRequestTarget.&lt;span class="kwrd"&gt;class&lt;/span&gt;.isAssignableFrom(getRequestCycle().getRequestTarget()&lt;br /&gt;              .getClass())))&lt;br /&gt;      {&lt;br /&gt;          setCurrentPage(0);&lt;br /&gt;      }&lt;br /&gt;      super.onBeforeRender();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; internalSetItemsPerViewIncrement(&lt;span class="kwrd"&gt;int&lt;/span&gt; items)&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (items &amp;lt; 1)&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span class="str"&gt;"Argument [itemsPerPage] cannot be less than 1"&lt;/span&gt;);&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (itemsPerViewIncrement != items)&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;if&lt;/span&gt; (isVersioned())&lt;br /&gt;          {&lt;br /&gt;              addStateChange(&lt;span class="kwrd"&gt;new&lt;/span&gt; Change()&lt;br /&gt;              {&lt;br /&gt;                  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; final &lt;span class="kwrd"&gt;long&lt;/span&gt; serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;                  final &lt;span class="kwrd"&gt;int&lt;/span&gt; old = itemsPerViewIncrement;&lt;br /&gt;&lt;br /&gt;                  @Override&lt;br /&gt;                  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; undo()&lt;br /&gt;                  {&lt;br /&gt;                      itemsPerViewIncrement = old;&lt;br /&gt;                  }&lt;br /&gt;&lt;br /&gt;                  @Override&lt;br /&gt;                  &lt;span class="kwrd"&gt;public&lt;/span&gt; String toString()&lt;br /&gt;                  {&lt;br /&gt;                      &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;"ItemsPerPageChange[component: "&lt;/span&gt; + getPath() + &lt;span class="str"&gt;", itemsPerPage: "&lt;/span&gt;&lt;br /&gt;                              + old + &lt;span class="str"&gt;"]"&lt;/span&gt;;&lt;br /&gt;                  }&lt;br /&gt;              });&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      itemsPerViewIncrement = items;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;// /////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;  &lt;span class="rem"&gt;// HELPER CLASSES&lt;/span&gt;&lt;br /&gt;  &lt;span class="rem"&gt;// /////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * Iterator adapter that makes sure only the specified max number of items&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * can be accessed from its delegate.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CappedIteratorAdapter implements Iterator&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;private&lt;/span&gt; final &lt;span class="kwrd"&gt;int&lt;/span&gt; max;&lt;br /&gt;      &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; index;&lt;br /&gt;      &lt;span class="kwrd"&gt;private&lt;/span&gt; final Iterator &lt;span class="kwrd"&gt;delegate&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;      &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * Constructor&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @param delegate&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         *            delegate iterator&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @param max&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         *            maximum number of items that can be accessed.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         */&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;public&lt;/span&gt; CappedIteratorAdapter(Iterator &lt;span class="kwrd"&gt;delegate&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt; max)&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;this&lt;/span&gt;.&lt;span class="kwrd"&gt;delegate&lt;/span&gt; = &lt;span class="kwrd"&gt;delegate&lt;/span&gt;;&lt;br /&gt;          &lt;span class="kwrd"&gt;this&lt;/span&gt;.max = max;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @see java.util.Iterator#remove()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         */&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; remove()&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; UnsupportedOperationException();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @see java.util.Iterator#hasNext()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         */&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;public&lt;/span&gt; boolean hasNext()&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; (index &amp;lt; max) &amp;amp;&amp;amp; &lt;span class="kwrd"&gt;delegate&lt;/span&gt;.hasNext();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @see java.util.Iterator#next()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         */&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;public&lt;/span&gt; Object next()&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;if&lt;/span&gt; (index &amp;gt;= max)&lt;br /&gt;          {&lt;br /&gt;              &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NoSuchElementException();&lt;br /&gt;          }&lt;br /&gt;          index++;&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt;.next();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;  };&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(3)The Ajax data view..&lt;br /&gt;How to use this data view::&lt;br /&gt;a)@Override getJavaScriptToRenderNewDomElement&lt;br /&gt;b).setRowsPerViewIncrement to your taste&lt;br /&gt;c)dataview.hasMore() tells if there are more rows to show up in next increment&lt;br /&gt;d)dataview.nextPage(ajaxRequestTarget) appends the new rows in the end, without refreshing the whole view&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import org.apache.wicket.markup.repeater.data.IDataProvider;&lt;br /&gt;import org.apache.wicket.model.IDetachable;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt; * DataGridView hierarchy can directly extend from this one.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AjaxEndlessDataView extends AjaxEndlessPageableView&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; AjaxEndlessDataView(String id, &lt;span class="kwrd"&gt;int&lt;/span&gt; itemsOnStartPage, IDataProvider dataProvider)&lt;br /&gt;   {&lt;br /&gt;       super(id, itemsOnStartPage);&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (dataProvider == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span class="str"&gt;"argument [dataProvider] cannot be null"&lt;/span&gt;);&lt;br /&gt;       }&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.dataProvider = dataProvider;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; AjaxEndlessDataView(String id, IDataProvider dataProvider)&lt;br /&gt;   {&lt;br /&gt;       super(id);&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (dataProvider == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span class="str"&gt;"argument [dataProvider] cannot be null"&lt;/span&gt;);&lt;br /&gt;       }&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.dataProvider = dataProvider;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; Iterator getItemModelsInCurrentViewIncrement(&lt;span class="kwrd"&gt;int&lt;/span&gt; offset, &lt;span class="kwrd"&gt;int&lt;/span&gt; size)&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ModelIterator(internalGetDataProvider(), offset, size);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; IDataProvider dataProvider;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @return data provider associated with this view&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; final IDataProvider internalGetDataProvider()&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;return&lt;/span&gt; dataProvider;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * Helper class that converts input from IDataProvider to an iterator over&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * view items.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @author Igor Vaynberg (ivaynberg)&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; final &lt;span class="kwrd"&gt;class&lt;/span&gt; ModelIterator implements Iterator&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;private&lt;/span&gt; Iterator items;&lt;br /&gt;       &lt;span class="kwrd"&gt;private&lt;/span&gt; IDataProvider dataProvider;&lt;br /&gt;       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; max;&lt;br /&gt;       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; index;&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * Constructor&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @param dataProvider&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         *            data provider&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @param offset&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         *            index of first item&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @param count&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         *            max number of items to return&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         */&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; ModelIterator(IDataProvider dataProvider, &lt;span class="kwrd"&gt;int&lt;/span&gt; offset, &lt;span class="kwrd"&gt;int&lt;/span&gt; count)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.items = dataProvider.iterator(offset, count);&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.dataProvider = dataProvider;&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.max = count;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @see java.util.Iterator#remove()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         */&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; remove()&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; UnsupportedOperationException();&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @see java.util.Iterator#hasNext()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         */&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; boolean hasNext()&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; items.hasNext() &amp;amp;&amp;amp; (index &amp;lt; max);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         * @see java.util.Iterator#next()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;         */&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Object next()&lt;br /&gt;       {&lt;br /&gt;           index++;&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; dataProvider.model(items.next());&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; final &lt;span class="kwrd"&gt;int&lt;/span&gt; internalGetItemCount()&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;return&lt;/span&gt; internalGetDataProvider().size();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @see org.apache.wicket.markup.repeater.AbstractPageableView#onDetach()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; onDetach()&lt;br /&gt;   {&lt;br /&gt;       super.onDetach();&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (dataProvider instanceof IDetachable)&lt;br /&gt;       {&lt;br /&gt;           ((IDetachable)dataProvider).detach();&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * Sets the number of items to be displayed per view increment&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @param items&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     *            number of items to display per view increment&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; setRowsPerViewIncrement(&lt;span class="kwrd"&gt;int&lt;/span&gt; items)&lt;br /&gt;   {&lt;br /&gt;       internalSetItemsPerViewIncrement(items);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     * @return number of items displayed per view increment&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; getRowsPerViewIncrement()&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;return&lt;/span&gt; internalGetItemsPerViewIncrement();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4526035505570833554-510989517426489571?l=donteattoomuch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://donteattoomuch.blogspot.com/feeds/510989517426489571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4526035505570833554&amp;postID=510989517426489571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4526035505570833554/posts/default/510989517426489571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4526035505570833554/posts/default/510989517426489571'/><link rel='alternate' type='text/html' href='http://donteattoomuch.blogspot.com/2008/04/partial-ajax-update-capable-list-view.html' title='Partial ajax update capable list view'/><author><name>DontEatTooMuch</name><uri>http://www.blogger.com/profile/04563755867766671563</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4526035505570833554.post-5436033856381732041</id><published>2008-04-11T16:54:00.000-07:00</published><updated>2008-04-11T17:30:10.630-07:00</updated><title type='text'>Wicket is Simple</title><content type='html'>Wicket is simple. It took some time for new people working with me to understand. They joined our project a few weeks back.  But I found myself incapable of briefing them in a way they could understand. Rather each of them had to have worked actually on wicket to know that. And thats what happened.&lt;br /&gt;One of them told me(After a month of hands on I guess) that wicket was basically made of &lt;span style="font-weight: bold;"&gt;IModel&lt;/span&gt;s made of logic which sets and gets values from inputs.It's like the Model is mashed up so really well with the user interaction. Each input can be designed in to a component the way you want. Biggest point, each &lt;span style="font-weight: bold;"&gt;Componet&lt;/span&gt; can be made custom just like that .You could design custom user interactions by just extending from the Component hierarchy. And then there are &lt;span style="font-weight: bold;"&gt;Behavior&lt;/span&gt;s, which can  manipulate how a component behaves.  All this really as simple as knowing plain object oriented concepts. And what I feel is people who at one/another time wanted to code in core java should try wicket out for themselves. I feel wicket is ready for making/proving itself into a very very useful user-interface api.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4526035505570833554-5436033856381732041?l=donteattoomuch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://donteattoomuch.blogspot.com/feeds/5436033856381732041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4526035505570833554&amp;postID=5436033856381732041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4526035505570833554/posts/default/5436033856381732041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4526035505570833554/posts/default/5436033856381732041'/><link rel='alternate' type='text/html' href='http://donteattoomuch.blogspot.com/2008/04/wicket-is-simple.html' title='Wicket is Simple'/><author><name>DontEatTooMuch</name><uri>http://www.blogger.com/profile/04563755867766671563</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4526035505570833554.post-6988296163233822323</id><published>2008-01-12T15:36:00.000-08:00</published><updated>2008-04-29T21:29:41.899-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='endless pageless behaviour'/><category scheme='http://www.blogger.com/atom/ns#' term='wicket'/><title type='text'>Implementing Endless Pageless Behaviour in wicket</title><content type='html'>Note:: I have edited the original code bit to support any element like div/table in addition to page.&lt;br /&gt;Endless behavior of a page means you keep scrolling down and the page keeps loading the next view in the same page.&lt;br /&gt;This has been used at many websites as a substitute for pagination and users are happy too.&lt;br /&gt;An example is &lt;a href="http://www.thoof.com/"&gt;thoof &lt;/a&gt;.&lt;br /&gt;I found the required javascript code at &lt;a href="http://unspace.ca/discover/pageless/"&gt;unspace website&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;Today what I wanted to do was to implement such a behavior in wicket so that it can be added into any component, and customized.&lt;br /&gt;There are only few &lt;span style="font-weight: bold;"&gt;things about the behavior you might want to change&lt;/span&gt; :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;how much distance before reaching the end of page you want to start an Ajax  request.&lt;/li&gt;&lt;li&gt;when are you out of further view? i.e. you don't want to load more view into your page once you are out of data.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Some Notes :&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The method of implementation is to check at regular intervals if you have reached towards the end of page scrolling.One should have a close look at &lt;pre class="csharpcode"&gt;&lt;span style="font-weight: bold;"&gt;hasMoreViewIncrementsIndicatorComponentId()&lt;/span&gt;&lt;code style="font-weight: bold;" class="java"&gt;&lt;span class="java8"&gt;.&lt;/span&gt;&lt;/code&gt;&lt;code class="java"&gt;&lt;span class="java8"&gt;In&lt;/span&gt;&lt;/code&gt;&lt;code style="font-weight: bold;" class="java"&gt;&lt;span class="java8"&gt; &lt;/span&gt;&lt;/code&gt;&lt;code class="java"&gt;&lt;span class="java8"&gt;this method one should return the&lt;br /&gt;&lt;span style="font-family: Georgia,serif;"&gt;markup id of a hidden field. Also the model of the hidden field should be boolean. The hidden field repainted&lt;span style="font-family: monospace;"&gt;&lt;/span&gt; on every request to indicate if we have reached the end of the page or element.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;code class="java"&gt;&lt;/code&gt;&lt;code class="java"&gt;&lt;span class="java8"&gt;Also I would like to mention the use of &lt;/span&gt;&lt;/code&gt;&lt;code style="font-weight: bold;" class="java"&gt;&lt;span class="java5"&gt;WicketAjaxDebug in javascript. It will need you to turn on the wicket-ajax debug. &lt;/span&gt;&lt;/code&gt;&lt;code class="java"&gt;&lt;span class="java5"&gt;Once turned on a link to ajax-debug window will be seen on page, and then it turns out to be really helpful in javascript debugging.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;code class="java"&gt;&lt;span class="java8"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;It turned out really very straightforward implementing the behavior. This behavior will send out Ajax request as soon as user is about to reach end of the page.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;This is what the code finally looks like:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;&lt;br /&gt;import org.apache.wicket.ajax.AjaxRequestTarget;&lt;br /&gt;import org.apache.wicket.markup.html.IHeaderResponse;&lt;br /&gt;import org.apache.wicket.markup.html.resources.JavascriptResourceReference;&lt;br /&gt;import org.apache.wicket.util.time.Duration;&lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OnScrollEndUpdaterBahaviour extends AbstractAjaxTimerBehavior&lt;br /&gt;{&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; final &lt;span class="kwrd"&gt;int&lt;/span&gt; preLoadDistance;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; final Duration updateInterval;&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Logger log = LoggerFactory.getLogger(OnScrollEndUpdaterBahaviour.&lt;span class="kwrd"&gt;class&lt;/span&gt;);&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; PageOrElement pgOrElement;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; String remainingScrollHeightFunction = &lt;span class="str"&gt;""&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; PageOrElement {&lt;br /&gt;       PAGE, ELEMENT&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; OnScrollEndUpdaterBahaviour(Duration updateInterval, &lt;span class="kwrd"&gt;int&lt;/span&gt; preLoadDistance,&lt;br /&gt;           PageOrElement pgOrElement)&lt;br /&gt;   {&lt;br /&gt;       super(updateInterval);&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.pgOrElement = pgOrElement;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.preLoadDistance = preLoadDistance;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.updateInterval = updateInterval;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; onBind()&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;switch&lt;/span&gt; (pgOrElement)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;case&lt;/span&gt; PAGE :&lt;br /&gt;               remainingScrollHeightFunction = &lt;span class="str"&gt;"getRemainingScrollHeight()"&lt;/span&gt;;&lt;br /&gt;               &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;           &lt;span class="kwrd"&gt;case&lt;/span&gt; ELEMENT :&lt;br /&gt;               remainingScrollHeightFunction = &lt;span class="str"&gt;"getRemainingScrollHeight('"&lt;/span&gt;&lt;br /&gt;                       + getComponent().getMarkupId() + &lt;span class="str"&gt;"')"&lt;/span&gt;;&lt;br /&gt;               &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;       }&lt;br /&gt;       super.onBind();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; OnScrollEndUpdaterBahaviour(&lt;span class="kwrd"&gt;int&lt;/span&gt; preLoadDistance, PageOrElement pgOrElement)&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;(Duration.milliseconds(200), preLoadDistance, pgOrElement);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; final JavascriptResourceReference PAGEUTILJS = &lt;span class="kwrd"&gt;new&lt;/span&gt; JavascriptResourceReference(&lt;br /&gt;           OnScrollEndUpdaterBahaviour.&lt;span class="kwrd"&gt;class&lt;/span&gt;, &lt;span class="str"&gt;"pageutil.js"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; renderHead(IHeaderResponse response)&lt;br /&gt;   {&lt;br /&gt;       super.renderHead(response);&lt;br /&gt;       response.renderJavascript(&lt;span class="str"&gt;"var preloadDistance = "&lt;/span&gt; + preLoadDistance + &lt;span class="str"&gt;";\n"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"var mouseState = 'up';\n"&lt;/span&gt; + &lt;span class="str"&gt;"var hasMoreViewIncrements;"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"var canMakeAjaxCall= true;"&lt;/span&gt; + &lt;span class="str"&gt;"\n"&lt;/span&gt; + &lt;span class="str"&gt;"function onMouseDown(){\n"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"mouseState = 'down';\n"&lt;/span&gt; + &lt;span class="str"&gt;"}\n"&lt;/span&gt; + &lt;span class="str"&gt;"function onMouseUp(){\n"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"mouseState = 'up';\n"&lt;/span&gt; + &lt;span class="str"&gt;"}\n"&lt;/span&gt; + &lt;span class="str"&gt;"document.onmousedown = onMouseDown;\n"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"document.onmouseup = onMouseUp;\n"&lt;/span&gt; + &lt;span class="str"&gt;"function pgTOCallBack(){"&lt;/span&gt;&lt;br /&gt;               + getJsTimeoutCall(updateInterval) + &lt;span class="str"&gt;"}"&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br /&gt;       response.renderJavascriptReference(PAGEUTILJS);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; CharSequence getPreconditionScript()&lt;br /&gt;   {&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="rem"&gt;// can i make an ajax call?&lt;/span&gt;&lt;br /&gt;       &lt;span class="str"&gt;"hasMoreViewIncrements=$('"&lt;/span&gt;&lt;br /&gt;               + hasMoreViewIncrementsIndicatorComponentId()&lt;br /&gt;               + &lt;span class="str"&gt;"').value;"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"canMakeAjaxCall=( "&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"mouseState == 'up' "&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"&amp;amp;&amp;amp; ("&lt;/span&gt;&lt;br /&gt;               + remainingScrollHeightFunction&lt;br /&gt;               + &lt;span class="str"&gt;" &amp;lt; preloadDistance ) "&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"&amp;amp;&amp;amp; hasMoreViewIncrements=='true'"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;");"&lt;/span&gt;&lt;br /&gt;               +&lt;br /&gt;               &lt;span class="rem"&gt;// lets put some debug info&lt;/span&gt;&lt;br /&gt;               &lt;span class="str"&gt;"WicketAjaxDebug.logInfo(' mouseState '+mouseState);"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"WicketAjaxDebug.logInfo(' getPageHeight() '+getPageHeight());"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"WicketAjaxDebug.logInfo('getScrollHeight()'+getScrollHeight());"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"WicketAjaxDebug.logInfo(' preloadDistance '+preloadDistance);"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"WicketAjaxDebug.logInfo(' hasMoreViewIncrements '+hasMoreViewIncrements);"&lt;/span&gt;&lt;br /&gt;               +&lt;br /&gt;               &lt;span class="rem"&gt;// if can make ajax call&lt;/span&gt;&lt;br /&gt;               &lt;span class="str"&gt;"if(canMakeAjaxCall)"&lt;/span&gt; + &lt;span class="str"&gt;"{"&lt;/span&gt; + &lt;span class="str"&gt;"Wicket.Focus.lastFocusId='"&lt;/span&gt;&lt;br /&gt;               + requestInProgressIndicatorComponentId() + &lt;span class="str"&gt;"';"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"wicketShow('"&lt;/span&gt;&lt;br /&gt;               + requestInProgressIndicatorComponentId()&lt;br /&gt;               + &lt;span class="str"&gt;"');"&lt;/span&gt;&lt;br /&gt;               +&lt;br /&gt;               &lt;span class="rem"&gt;// else set up another timeout&lt;/span&gt;&lt;br /&gt;               &lt;span class="str"&gt;"}else{"&lt;/span&gt; + &lt;span class="str"&gt;"wicketHide('"&lt;/span&gt; + requestInProgressIndicatorComponentId() + &lt;span class="str"&gt;"');"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"pgTOCallBack();"&lt;/span&gt; + &lt;span class="str"&gt;"}"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"WicketAjaxDebug.logInfo(' canMakeAjaxCall '+canMakeAjaxCall);"&lt;/span&gt;&lt;br /&gt;               + &lt;span class="str"&gt;"return canMakeAjaxCall;"&lt;/span&gt;;&lt;br /&gt;       &lt;span class="rem"&gt;// &amp;amp;&amp;amp; {"+super.getPreconditionScript()+"}&lt;/span&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; String hasMoreViewIncrementsIndicatorComponentId();&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; String requestInProgressIndicatorComponentId();&lt;br /&gt;&lt;br /&gt;   &lt;span class="rem"&gt;// doing this for better readability&lt;/span&gt;&lt;br /&gt;   @Override&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; onTimer(AjaxRequestTarget target)&lt;br /&gt;   {&lt;br /&gt;       onPageEnd(target);&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; onPageEnd(AjaxRequestTarget target);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;================================================================================&lt;br /&gt;How to use the behavior:&lt;br /&gt;component.add(new OnScrollEndUpdaterBahaviour(Duration.milliseconds(200), 50,&lt;br /&gt;  PageOrElement.ELEMENT)&lt;br /&gt;{&lt;br /&gt; @Override&lt;br /&gt; protected void onPageEnd(AjaxRequestTarget target)&lt;br /&gt; {&lt;br /&gt;  //also refresh the component you need to refresh&lt;br /&gt;  target.addComponent(hasMoreField);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected String hasMoreViewIncrementsIndicatorComponentId()&lt;br /&gt; {&lt;br /&gt;  return hasMoreField.getMarkupId();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected String requestInProgressIndicatorComponentId()&lt;br /&gt; {&lt;br /&gt;  return indicator.getMarkupId();&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;indicator.setOutputMarkupId(true);&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;================================================================================&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;pageutil.js&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;===========&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;function getPageHeight(){&lt;br /&gt;var y;&lt;br /&gt;var test1 = document.body.scrollHeight;&lt;br /&gt;var test2 = document.body.offsetHeight&lt;br /&gt;if (test1 &gt; test2) {&lt;br /&gt;  y = document.body.scrollHeight;&lt;br /&gt;} else {&lt;br /&gt;    y = document.body.offsetHeight;&lt;br /&gt;}&lt;br /&gt;return parseInt(y);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function _getWindowHeight(){&lt;br /&gt;if (self.innerHeight) {&lt;br /&gt;      frameHeight = self.innerHeight;&lt;br /&gt;} else if (document.documentElement &amp;amp;&amp;amp; document.documentElement.clientHeight) {&lt;br /&gt;  frameHeight = document.documentElement.clientHeight;&lt;br /&gt;} else if (document.body) {&lt;br /&gt;  frameHeight = document.body.clientHeight;&lt;br /&gt;}&lt;br /&gt;return parseInt(frameHeight);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getScrollHeight(){&lt;br /&gt;var y;&lt;br /&gt;// all except Explorer&lt;br /&gt;if (self.pageYOffset) {&lt;br /&gt;    y = self.pageYOffset;&lt;br /&gt;} else if (document.documentElement &amp;amp;&amp;amp; document.documentElement.scrollTop) {&lt;br /&gt;    y = document.documentElement.scrollTop;&lt;br /&gt;} else if (document.body)    {&lt;br /&gt;    y = document.body.scrollTop;&lt;br /&gt;}&lt;br /&gt;WicketAjaxDebug.logInfo('YYYYY: '+parseInt(y));&lt;br /&gt;return parseInt(y)+_getWindowHeight();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function getElementHeight(elid){&lt;br /&gt;var y;&lt;br /&gt;var el= document.getElementById(elid);&lt;br /&gt;var test1 = el.scrollHeight;&lt;br /&gt;var test2 = el.offsetHeight&lt;br /&gt;if (test1 &gt; test2) {&lt;br /&gt;  y = el.scrollHeight;&lt;br /&gt;} else {&lt;br /&gt;    y = el.offsetHeight;&lt;br /&gt;}&lt;br /&gt;return parseInt(y);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function _getElementWindowHeight(elid){&lt;br /&gt; var el= document.getElementById(elid);&lt;br /&gt;if (el.innerHeight) {&lt;br /&gt;      frameHeight = el.innerHeight;&lt;br /&gt;} else if (el.clientHeight) {&lt;br /&gt;  frameHeight = el.clientHeight;&lt;br /&gt;}&lt;br /&gt;return parseInt(frameHeight);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getElementScrollHeight(elid){&lt;br /&gt;var y;&lt;br /&gt;var el= document.getElementById(elid);&lt;br /&gt;y = el.scrollTop;&lt;br /&gt;WicketAjaxDebug.logInfo('YYYYY: '+parseInt(y));&lt;br /&gt;return parseInt(y)+_getElementWindowHeight(elid);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getRemainingScrollHeight(){&lt;br /&gt; return getPageHeight() - getScrollHeight();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getRemainingScrollHeight(elid){&lt;br /&gt; return getElementHeight(elid) - getElementScrollHeight(elid);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4526035505570833554-6988296163233822323?l=donteattoomuch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://donteattoomuch.blogspot.com/feeds/6988296163233822323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4526035505570833554&amp;postID=6988296163233822323' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4526035505570833554/posts/default/6988296163233822323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4526035505570833554/posts/default/6988296163233822323'/><link rel='alternate' type='text/html' href='http://donteattoomuch.blogspot.com/2008/01/implementing-endless-pageless-in-wicket.html' title='Implementing Endless Pageless Behaviour in wicket'/><author><name>DontEatTooMuch</name><uri>http://www.blogger.com/profile/04563755867766671563</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4526035505570833554.post-1459988394773688411</id><published>2007-12-28T18:23:00.000-08:00</published><updated>2008-04-29T07:33:13.550-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='DropDownChoice'/><category scheme='http://www.blogger.com/atom/ns#' term='choice'/><category scheme='http://www.blogger.com/atom/ns#' term='wicket'/><category scheme='http://www.blogger.com/atom/ns#' term='dropdown'/><category scheme='http://www.blogger.com/atom/ns#' term='radiochoice'/><category scheme='http://www.blogger.com/atom/ns#' term='AutoCompleteTextField'/><title type='text'>Playing with Wicket((The component oriented web application framework)) Components: Part 1 :Choices</title><content type='html'>&lt;p&gt;&lt;b&gt;We use wicket (&lt;/b&gt;&lt;a href="http://www.blogger.com/%20http://wicket.apache.org/"&gt; http://wicket.apache.org/&lt;/a&gt;&lt;b&gt;) at my current employers. And now that I have written quite some amount of code in wicket, I want to share my code.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;No I am not about to quit; my boss allows me to do so... :)&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;I just hope to get opinions on improvement.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Also I hope it gets to any of someone's use.&lt;/b&gt;&lt;/p&gt;&lt;p style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Here goes the story::&lt;/p&gt;&lt;p&gt;(If you don't code&lt;b&gt;&lt;/b&gt; please forget about reading further or that this blog even exists in this world. )&lt;/p&gt;&lt;p&gt;I start using wicket. Initially everything is cool. With so much code for a developer already coming in the examples and pre-built components. Also I go and read all things wicket(&lt;a href="http://wicket.apache.org/planet-wicket.html"&gt;planet wicket&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;And as there is so much activity here, similar is on the mailing list. &lt;/p&gt;&lt;p style="font-weight: bold;"&gt;My first encounter with any difficulty happens when I want to use choice components in certain scenarios.&lt;/p&gt;&lt;p&gt;The first one is the Country,State,City trio. I want them to be in rhythm on all my pages. I also want this to happen using Ajax.&lt;/p&gt;&lt;p&gt;Here are my three wicket guys for the work::&lt;/p&gt;&lt;blockquote&gt;&lt;a href="http://wicket.sourceforge.net/apidocs/wicket/markup/html/form/DropDownChoice.html"&gt;&lt;b&gt;DropDownChoice &lt;/b&gt;&lt;/a&gt;countryDrpDwn ;//--from core wicket&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;&lt;a href="http://people.apache.org/%7Etobrien/wicket/apidocs/index.html"&gt;DropDownChoice&lt;/a&gt; &lt;/b&gt;stateDrpDwn; &lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href="http://wicketframework.org/wicket-extensions/apidocs/wicket/extensions/ajax/markup/html/autocomplete/AutoCompleteTextField.html"&gt;&lt;b&gt;AutoCompleteTextField &lt;/b&gt;&lt;/a&gt;cityTxtFld;//--from extensions&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Then I need to create them so that I have ids used by them internally for , but descriptions shown to the outer world.&lt;/blockquote&gt;&lt;blockquote&gt;And I found &lt;a href="http://people.apache.org/%7Etobrien/wicket/apidocs/index.html"&gt;&lt;b&gt;IChoiceRenderer&lt;/b&gt; &lt;/a&gt;does this job.&lt;/blockquote&gt;&lt;blockquote&gt;Now I need models N subject them to the renderer. The use case looks simple enough for a key-value based model, with a simple renderer. &lt;/blockquote&gt;&lt;blockquote&gt;I could provide my countryDrpDwn a list of the key-value models.&lt;/blockquote&gt;&lt;blockquote&gt;But my stateDrpDwn looks dependent on the country value selected. If I state it well, my stateDrpDwn's list model is dependent on the country value.&lt;/blockquote&gt;&lt;blockquote&gt;And further to complicate things enough cityTxtFld's list model is dependent on the stateDrpDwn's selected value.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;I realise(and my realisation could be wrong)..that I needed custom model for wicket. Which could fit these components well.&lt;/b&gt;&lt;/blockquote&gt;&lt;blockquote&gt;I end up writing custom models, writing code more than what I needed minimally(happens with a lot of people i know ;))..........(&lt;b&gt;imagine of a fast forward in the movie now....I just provide the results here&lt;/b&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I have a set of following :::&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt; 1.&lt;i&gt; ChoiceHelper's &lt;/i&gt;which help me work with my choices model outside  the   Choice component.&lt;br /&gt;2.&lt;span style="font-style: italic;"&gt;ChoiceModel's &lt;/span&gt;which are the end product which can be used with components&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Apologies for the very few comments. I put a lot of them here only now when I write all this, consider them part of my talking.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * Has(Provides) a strict set of choices with no defaults etc.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * @see ChoicesProvider-- factory+defaults for an encapsulated ChoicesHelper&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * @see AbstractChoicesHelper--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    A default choices helper--provides some basic functionality + 'nested&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    helper' functionality so that child classes&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * don't have to worry about it.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * @author dontEatTooMuch&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    *&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ChoicesHelper extends IClusterable&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; List list();&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; IChoiceRenderer renderer();&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * To support any nested helpers..&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * e.g. States for a country_key&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * If there's no nested list...throw an exception on this call&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * @param key&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * @return&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ChoicesHelper helper(Object idvalue);&lt;br /&gt;    &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * Calling the helper(String id) will definitely throw an exception if there's no nested list of choices for the key passed..&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * This method allows to check if there is a nested helper to avoid calling the above method&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * @param key&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * @return&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    */&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; boolean containsNestedHelper(Object idvalue);&lt;br /&gt;    &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * Returns display values of all choices.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * @return&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; String[] displayValues();&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; String displayValueOf(String id, Component component);&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Object ObjectOf(String id);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AbstractChoicesHelper implements ChoicesHelper&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Object ObjectOf(String id)&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (id == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;    final List choices = list();&lt;br /&gt;    final IChoiceRenderer renderer = renderer();&lt;br /&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; index = 0; index &amp;lt; choices.size(); index++)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    final Object choice = choices.get(index);&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (renderer.getIdValue(choice, index).equals(id))&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; choice;&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; String displayValueOf(String id, Component component)&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (id == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;    final List choices = list();&lt;br /&gt;    final IChoiceRenderer renderer = renderer();&lt;br /&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; index = 0; index &amp;lt; choices.size(); index++)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    final Object choice = choices.get(index);&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (renderer.getIdValue(choice, index).equals(id))&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    Object objectValue = renderer.getDisplayValue(choice);&lt;br /&gt;    Class objectClass = objectValue == &lt;span class="kwrd"&gt;null&lt;/span&gt; ? &lt;span class="kwrd"&gt;null&lt;/span&gt; : objectValue.getClass();&lt;br /&gt;&lt;br /&gt;    final String displayValue = component == &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;br /&gt;    ? String.valueOf(objectValue)&lt;br /&gt;    : component.getConverter(objectClass).convertToString(objectValue,&lt;br /&gt;&lt;br /&gt;    component.getLocale());&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; displayValue;&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; String[] displayValues()&lt;br /&gt;    {&lt;br /&gt;    final List choices = list();&lt;br /&gt;&lt;br /&gt;    final ArrayList dispVals = &lt;span class="kwrd"&gt;new&lt;/span&gt; ArrayList();&lt;br /&gt;    final IChoiceRenderer renderer = renderer();&lt;br /&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; index = 0; index &amp;lt; choices.size(); index++)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    final Object choice = choices.get(index);&lt;br /&gt;    dispVals.add(String.valueOf(renderer.getDisplayValue(choice)));&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; dispVals.toArray(&lt;span class="kwrd"&gt;new&lt;/span&gt; String[dispVals.size()]);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; IChoiceRenderer renderer()&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ChoiceRenderer();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* all its subclasses provide similar functionality, the difference is supposed to be just the underlying storage&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* key in doAdd(K key,V value) implementation in subclass&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* value in doAdd(K key,V value) implementation in subclass&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AbstractKeyValChoicesHelper extends AbstractChoicesHelper&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; HashMap nestedHelpers = &lt;span class="kwrd"&gt;new&lt;/span&gt; HashMap();&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; AbstractKeyValChoicesHelper()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;super();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* Add key-value pairs. Also implements a shortcut where the java.lang.Class&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* which extends ChoicesHelper can be passed as key, its getSimpleName()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* name will be used as key, also an instance will be stored of this class&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* as nested helper. e.g.add(in.class, "India") where in.class is a&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* ChoicesHelper providing list of indian states.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param _key--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* key for storage and reference to this particular choice node&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param value--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* display value, which if a non-string, will be converted to&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* string,based on the locale&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @return-- AbstractChoicesHelper to call the add as you call append in&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* StringBuffer&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; final AbstractKeyValChoicesHelper add(Object key, Object &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (key == &lt;span class="kwrd"&gt;null&lt;/span&gt; || &lt;span class="kwrd"&gt;value&lt;/span&gt; == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span class="str"&gt;"key can't be null"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (key instanceof Class)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; ((ChoicesHelper.&lt;span class="kwrd"&gt;class&lt;/span&gt;.isAssignableFrom((Class)key)))&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;String classSimpleName = ((Class)key).getSimpleName();&lt;br /&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;nestedHelpers.put(classSimpleName, ((Class)key).newInstance());&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;key = classSimpleName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException(key&lt;br /&gt;+ &lt;span class="str"&gt;" is not of type ChoicesHelper, which is the only class supported as key"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;doAdd((K)key, (V)&lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* An instance of nestedhelperclass will be stored as nested helper for&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* getting children list of this choice&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param _key--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* key for storage and reference to this particular choice node&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param value--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* display value, which if a non-string, will be converted to&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* string,based on the locale&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param nestedhelperclass--nested&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* helper class name&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @return-- AbstractChoicesHelper to call the add as you call append in&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* StringBuffer&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; final AbstractKeyValChoicesHelper add(K key, V &lt;span class="kwrd"&gt;value&lt;/span&gt;, Class nestedhelperclass)&lt;br /&gt;{&lt;br /&gt;String strkey;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (key == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span class="str"&gt;"key can't be null"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (key instanceof Class)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; UnsupportedOperationException(&lt;span class="str"&gt;"please use the other add method"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;doAdd(key, &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (nestedhelperclass != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;nestedHelpers.put(key, ((Class)nestedhelperclass).newInstance());&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;{&lt;br /&gt;e.printStackTrace();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* An instance of nestedhelper will be stored as nested helper for getting&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* children list of this choice&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param _key--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* key for storage and reference to this particular choice node&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param value--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* display value, which if a non-string, will be converted to&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* string,based on the locale&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param nestedhelper--nested&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* helper instance&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @return-- AbstractChoicesHelper to call the add as you call append in&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* StringBuffer&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; final AbstractKeyValChoicesHelper add(K key, V &lt;span class="kwrd"&gt;value&lt;/span&gt;, ChoicesHelper nestedhelper)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;String strkey;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (key == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span class="str"&gt;"key can't be null"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (key instanceof Class)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; UnsupportedOperationException(&lt;span class="str"&gt;"please use the other add method"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;doAdd(key, &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (nestedhelper != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;nestedHelpers.put(String.valueOf(key), nestedhelper);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;{&lt;br /&gt;e.printStackTrace();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ChoicesHelper helper(Object id)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!nestedHelpers.containsKey(id))&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;br /&gt;&lt;br /&gt;&lt;span class="str"&gt;"There are no nested choices which you are trying to fetch for key"&lt;/span&gt; + id);&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; ((ChoicesHelper)nestedHelpers.get(id));&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; boolean containsNestedHelper(Object id)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; nestedHelpers.containsKey(id);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* don't call this method directly--call add(Object _key,Object value)&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param _key&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @param value&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; doAdd(K _key, V &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; String displayValueOf(IModel idmodel, Component component)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; displayValueOf(String.valueOf(idmodel.getObject()), component);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MapChoicesHelper&amp;lt;K, V&amp;gt; extends AbstractKeyValChoicesHelper&amp;lt;Object, Object&amp;gt;&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; IChoiceRenderer renderer = &lt;span class="kwrd"&gt;new&lt;/span&gt; IChoiceRenderer()&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Object getDisplayValue(Object &lt;span class="kwrd"&gt;object&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; map().get(&lt;span class="kwrd"&gt;object&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; String getIdValue(Object &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt; index)&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; == &lt;span class="kwrd"&gt;null&lt;/span&gt; ? &lt;span class="kwrd"&gt;null&lt;/span&gt; : &lt;span class="kwrd"&gt;object&lt;/span&gt;.toString();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; IChoiceRenderer renderer()&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; renderer;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * Note that this list should not be modified directly&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; List list()&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArrayList(map().keySet());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; doAdd(Object key, Object &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;    map().put((K)key, (V)&lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Object ObjectOf(String id)&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; map().get(id);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; Map&amp;lt;K, V&amp;gt; map();&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;b&gt;(5)&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SortedMapChoicesHelper extends MapChoicesHelper{&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; SortedMap choicesKeyValMap= &lt;span class="kwrd"&gt;new&lt;/span&gt; TreeMap();&lt;br /&gt;    @Override&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; Map map() {&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;return&lt;/span&gt; choicesKeyValMap;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;b&gt;(6)&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; EnumMapChoicesHelper&amp;lt;T&amp;gt; extends MapChoicesHelper{&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; EnumMap choicesKeyValueMap;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; EnumMapChoicesHelper(Class enumclass) {&lt;br /&gt;&lt;br /&gt;    super();&lt;br /&gt;    choicesKeyValueMap= &lt;span class="kwrd"&gt;new&lt;/span&gt; EnumMap(enumclass);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; Map&amp;lt;Enum,Object&amp;gt; map() {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; choicesKeyValueMap;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;(7)&lt;/b&gt;&lt;/br&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ListChoicesHelper extends AbstractChoicesHelper{&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; HashMap&amp;lt;Object, ChoicesHelper&amp;gt; nestedHelpers = &lt;span class="kwrd"&gt;new&lt;/span&gt; HashMap&amp;lt;Object, ChoicesHelper&amp;gt;();&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; indx=0;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; ArrayList choiceLst = &lt;span class="kwrd"&gt;new&lt;/span&gt; ArrayList();&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; final ListChoicesHelper add(Object obj){&lt;br /&gt;&lt;br /&gt;add(obj,&lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; final ListChoicesHelper add(Object obj,ChoicesHelper nestedhelper){&lt;br /&gt;&lt;br /&gt;String strkey;&lt;br /&gt;list().add(obj);&lt;br /&gt;strkey=renderer().getIdValue(obj, list().indexOf(obj));&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt;(nestedhelper!=&lt;span class="kwrd"&gt;null&lt;/span&gt;){&lt;br /&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt; {&lt;br /&gt;nestedHelpers.put(strkey,nestedhelper);&lt;br /&gt;&lt;br /&gt;} &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; boolean containsNestedHelper(Object id) {&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; nestedHelpers.containsKey(id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ChoicesHelper helper(Object id) {&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt;(!nestedHelpers.containsKey(id)){&lt;br /&gt;&lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span class="str"&gt;"There are no nested choices which you are trying to fetch for key"&lt;/span&gt;+id);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; ((ChoicesHelper)nestedHelpers.get(id));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* Should return the same list instance always&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; List list(){&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; choiceLst;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;(8)&lt;/b&gt;&lt;/br&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* acts as a factory to build ChoicesHelper &amp;amp; reuses its instance&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ChoicesProvider implements ChoicesHelper&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; ChoicesHelper buildhelper();&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; ChoicesHelper helper = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; List list()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; helper.list();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; String[] displayValues()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; helper.displayValues();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IChoiceRenderer renderer()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; helper.renderer();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ChoicesProvider helper(final Object id)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ChoicesProvider()&lt;br /&gt;{&lt;br /&gt;@Override&lt;br /&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; ChoicesHelper buildhelper()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;ChoicesHelper helperForNested;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!helper.containsNestedHelper(id))&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;helperForNested = defaultHelper();&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;helperForNested = helper.helper(id);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// Still null!!&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (helperForNested == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;helperForNested = defaultHelper();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; helperForNested;&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ChoicesProvider()&lt;br /&gt;{&lt;br /&gt;super();&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (helper == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;helper = buildhelper();&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (helper == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;helper = defaultHelper();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* Method used to return the defaultHelper()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;* @return&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; final ChoicesHelper defaultHelper()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;KeyValueChoicesHelper defHelper = &lt;span class="kwrd"&gt;new&lt;/span&gt; KeyValueChoicesHelper();&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; defHelper;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; boolean containsNestedHelper(Object id)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; helper.containsNestedHelper(id);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Object ObjectOf(String id)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; helper.ObjectOf(id);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; String displayValueOf(String id, Component component)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; helper.displayValueOf(id, component);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;(9)&lt;/b&gt;&lt;/br&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ChoicesModel extends LoadableDetachableModel{&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Logger log = LoggerFactory.getLogger(ChoicesModel.&lt;span class="kwrd"&gt;class&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; IChoiceRenderer renderer(){&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; provider().renderer();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; Object load() {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; provider().list();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * Just to add flexibility of doing stuff before returning an object which is a list here,&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * this method makes a call to beforeGetObject() which can be overriden&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Object getObject() {&lt;br /&gt;    beforeGetObject();&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; super.getObject();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; ChoicesHelper provider();&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * Override and do any initialization of other things before returning the nested list object&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    */&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; beforeGetObject(){&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;(10)&lt;/b&gt;&lt;/br&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * For nested choices which are dependent on parents choice&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * Intelligent dependent model which provides its listof values based on current value of parent&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * @author dontEatToomuch&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    *&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    */&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DependentChoicesModel extends ChoicesModel&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; DependentChoicesModel()&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;    super();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * The key with which this list of choices is linked to something else&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * For example you wanted to work with all states of india, you will return "in" for&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * getParentDependencyValue() (in the parent list of countries india is represented by "in")&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * @return&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    */&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; Object getParentDependencyValue();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; final ChoicesHelper provider()&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; parentprovider().helper(getParentDependencyValue());&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; ChoicesHelper parentprovider();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;(11)&lt;/b&gt;&lt;/br&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="rem"&gt;//start countries-----------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Countries extends ChoicesProvider{&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; ChoicesHelper locationshelper;&lt;br /&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;new&lt;/span&gt; KeyValueChoicesHelper()&lt;br /&gt;&lt;br /&gt;    .add(&lt;span class="kwrd"&gt;in&lt;/span&gt;.&lt;span class="kwrd"&gt;class&lt;/span&gt;, &lt;span class="str"&gt;"India"&lt;/span&gt;)&lt;br /&gt;    .add(usa.&lt;span class="kwrd"&gt;class&lt;/span&gt;,&lt;span class="str"&gt;"United States Of America"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; ChoicesHelper buildhelper() {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; locationshelper;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="rem"&gt;//end countries-------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; usa extends ChoicesProvider{&lt;br /&gt;    @Override&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; ChoicesHelper buildhelper() {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; SortedMapChoicesHelper()&lt;br /&gt;    .add(&lt;span class="str"&gt;"al"&lt;/span&gt;, &lt;span class="str"&gt;"Alabama"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;    .add(&lt;span class="str"&gt;"den"&lt;/span&gt;, &lt;span class="str"&gt;"Denver"&lt;/span&gt;)&lt;br /&gt;    .add(&lt;span class="str"&gt;"was"&lt;/span&gt;, &lt;span class="str"&gt;"Washington"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="rem"&gt;//start india----------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; &lt;span class="kwrd"&gt;in&lt;/span&gt; extends ChoicesProvider{&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; ChoicesHelper buildhelper() {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; SortedMapChoicesHelper()&lt;br /&gt;    .add(ass.&lt;span class="kwrd"&gt;class&lt;/span&gt;, &lt;span class="str"&gt;"Assam"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;    .add(ap.&lt;span class="kwrd"&gt;class&lt;/span&gt;, &lt;span class="str"&gt;"Andhra Pradesh"&lt;/span&gt;)&lt;br /&gt;    .add(kar.&lt;span class="kwrd"&gt;class&lt;/span&gt;, &lt;span class="str"&gt;"Karnataka"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;//start states-------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ass extends ChoicesProvider{&lt;br /&gt;    @Override&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; ChoicesHelper buildhelper() {&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; SortedMapChoicesHelper()&lt;br /&gt;    .add(&lt;span class="str"&gt;"dib"&lt;/span&gt;, &lt;span class="str"&gt;"Dibrugarh"&lt;/span&gt;)&lt;br /&gt;    .add(&lt;span class="str"&gt;"guw"&lt;/span&gt;, &lt;span class="str"&gt;"Guwahati"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ap extends ChoicesProvider{&lt;br /&gt;    @Override&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; ChoicesHelper buildhelper() {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; SortedMapChoicesHelper()&lt;br /&gt;    .add(&lt;span class="str"&gt;"hyd"&lt;/span&gt;, &lt;span class="str"&gt;"Hyderabad"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; kar extends ChoicesProvider{&lt;br /&gt;    @Override&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; ChoicesHelper buildhelper() {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; SortedMapChoicesHelper()&lt;br /&gt;    .add(&lt;span class="str"&gt;"ban"&lt;/span&gt;, &lt;span class="str"&gt;"Bangalore"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="rem"&gt;//end states------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="rem"&gt;//end&lt;/span&gt;&lt;br /&gt;    india----------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;(12)&lt;/b&gt;&lt;/br&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Months {&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; List&amp;lt;Integer&amp;gt; monthslst = &lt;span class="kwrd"&gt;new&lt;/span&gt; ArrayList&amp;lt;Integer&amp;gt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IChoiceRenderer renderer = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; {&lt;br /&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = Calendar.JANUARY; i &amp;lt;= Calendar.DECEMBER; i++) {&lt;br /&gt;&lt;br /&gt;    monthslst.add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Integer(i));&lt;br /&gt;    }&lt;br /&gt;    renderer = &lt;span class="kwrd"&gt;new&lt;/span&gt; IChoiceRenderer() {&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; final &lt;span class="kwrd"&gt;long&lt;/span&gt; serialVersionUID = -8125518552105537844L;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Object getDisplayValue(Object &lt;span class="kwrd"&gt;object&lt;/span&gt;) {&lt;br /&gt;    String month;&lt;br /&gt;&lt;br /&gt;    final &lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt; = ((Integer) &lt;span class="kwrd"&gt;object&lt;/span&gt;).intValue();&lt;br /&gt;    &lt;span class="kwrd"&gt;switch&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt;) {&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.JANUARY:&lt;br /&gt;    month = &lt;span class="str"&gt;"Jan"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.FEBRUARY:&lt;br /&gt;&lt;br /&gt;    month = &lt;span class="str"&gt;"Feb"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.MARCH:&lt;br /&gt;    month = &lt;span class="str"&gt;"Mar"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.APRIL:&lt;br /&gt;    month = &lt;span class="str"&gt;"Apr"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.MAY:&lt;br /&gt;    month = &lt;span class="str"&gt;"May"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.JUNE:&lt;br /&gt;&lt;br /&gt;    month = &lt;span class="str"&gt;"Jun"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.JULY:&lt;br /&gt;    month = &lt;span class="str"&gt;"Jul"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.AUGUST:&lt;br /&gt;    month = &lt;span class="str"&gt;"Aug"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.SEPTEMBER:&lt;br /&gt;    month = &lt;span class="str"&gt;"Sep"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.OCTOBER:&lt;br /&gt;&lt;br /&gt;    month = &lt;span class="str"&gt;"Oct"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.NOVEMBER:&lt;br /&gt;    month = &lt;span class="str"&gt;"Nov"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;case&lt;/span&gt; Calendar.DECEMBER:&lt;br /&gt;    month = &lt;span class="str"&gt;"Dec"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;default&lt;/span&gt;:&lt;br /&gt;    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalStateException(&lt;span class="kwrd"&gt;value&lt;/span&gt; + &lt;span class="str"&gt;" is not mapped!"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; month;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; String getIdValue(Object &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt; index) {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;.toString();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; List&amp;lt;Integer&amp;gt; list() {&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; monthslst;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IChoiceRenderer renderer() {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; renderer;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;(13)&lt;/b&gt;&lt;/br&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * example::&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * Numbers fromChoices = new Numbers(1, MAX_VAL);&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * DropDownChoice fromChoice = new DropDownChoice("from", new&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    PropertyModel(getModel(),"from"), fromChoices, fromChoices.renderer()));&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    *&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * Numbers toChoices = new DependentChoicesModel()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    protected Object getParentDependencyValue()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    return fromChoice.getModelObject();&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    protected ChoicesHelper parentprovider()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    return fromChoices.provider();&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    * DropDownChoice toChoice = (FormComponent)new DropDownChoice("to", new PropertyModel(&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    getModel(), "to"), toChoices, toChoices.renderer())&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    public boolean isEnabled()&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    return ((Integer)fromChoice.getModelObject() &amp;gt; 0);&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    }.setOutputMarkupId(true);&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    *&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    */&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Numbers extends ChoicesModel&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; from;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; to;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; ChoicesHelper provider = &lt;span class="kwrd"&gt;new&lt;/span&gt; AbstractChoicesHelper()&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; boolean containsNestedHelper(Object id)&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ChoicesHelper helper(final Object id)&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; AbstractChoicesHelper()&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; boolean containsNestedHelper(Object id)&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ChoicesHelper helper(Object id)&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IllegalArgumentException();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; List list()&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; fromval = from;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (id != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;    fromval = (Integer)id;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    ArrayList lst = &lt;span class="kwrd"&gt;new&lt;/span&gt; ArrayList();&lt;br /&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = fromval + 1; i &amp;lt;= to; i++)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    lst.add(i);&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; lst;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; List list()&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    ArrayList lst = &lt;span class="kwrd"&gt;new&lt;/span&gt; ArrayList();&lt;br /&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = from; i &amp;lt;= to; i++)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    lst.add(i);&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; lst;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Numbers(&lt;span class="kwrd"&gt;int&lt;/span&gt; from, &lt;span class="kwrd"&gt;int&lt;/span&gt; to)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;    super();&lt;br /&gt;    &lt;span class="kwrd"&gt;this&lt;/span&gt;.from = from;&lt;br /&gt;    &lt;span class="kwrd"&gt;this&lt;/span&gt;.to = to;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ChoicesHelper provider()&lt;br /&gt;    {&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; provider;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;===============================================&lt;/blockquote&gt;&lt;blockquote&gt;As it is obvious implimenting ajax functionality is a breeze...&lt;/blockquote&gt;&lt;blockquote&gt;There is nothing much to blog about it.&lt;/blockquote&gt;&lt;blockquote&gt;============================================= &lt;/blockquote&gt;&lt;blockquote style="color: rgb(204, 51, 204);"&gt;Note:::&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;1. I had learnt by forgetting that i often forget this&lt;br /&gt;(needed for updating the components via ajax)::&lt;/span&gt;&lt;b style="color: rgb(204, 51, 204);"&gt; setOutputMarkupId(true)&lt;/b&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;2. I can use all my utility code for my radio choices as well&lt;br /&gt;3. One should look at these::&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;a href="http://www.systemmobile.com/?page_id=236"&gt;systemmobile link--basics on dropdown&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;a href="http://cwiki.apache.org/WICKET/dropdownchoice-examples.html"&gt;wicket wiki link&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;a href="http://wicket.apache.org/exampledropdownchoice.html"&gt;on wicket website&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;a href="http://www.systemmobile.com/?p=206"&gt;system mobile link--chaining choices- country,state example&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4526035505570833554-1459988394773688411?l=donteattoomuch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://donteattoomuch.blogspot.com/feeds/1459988394773688411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4526035505570833554&amp;postID=1459988394773688411' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4526035505570833554/posts/default/1459988394773688411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4526035505570833554/posts/default/1459988394773688411'/><link rel='alternate' type='text/html' href='http://donteattoomuch.blogspot.com/2007/12/playing-with-wicketthe-component.html' title='Playing with Wicket((The component oriented web application framework)) Components: Part 1 :Choices'/><author><name>DontEatTooMuch</name><uri>http://www.blogger.com/profile/04563755867766671563</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry></feed>
