super(id, model); }
@Override protected Iterator getChoices(String input) { if (Strings.isEmpty(input)) { return Collections.EMPTY_LIST.iterator(); }
List choices = new ArrayList(10);
Locale[] locales = Locale.getAvailableLocales();
for (int i = 0; i < locales.length; i++) { final Locale locale = locales[i]; final String country = locale.getDisplayCountry();
if (country.toUpperCase().startsWith(input.toUpperCase())) { choices.add(country); if (choices.size() == 10) { break; } } }
return choices.iterator(); } }
Sfruttiamo i java.util.Locale disponibili recuperandoli con il metodo Locale.getAvailableLocales() e visualizzando i nomi tramite il metodo getDisplayCountry() (sempre della classe Locale). La scelta del talk è stata spostata in una finestra modale. Nella Registration Page, al posto della ListMultipleChoice, adesso troviamo solo un TextField e un org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow. Un componente ModalWindow è una finestra trascinabile che impedisce all'utente di interagire con il resto della pagina chiamante finche' la finestra non viene chiusa. L'aspetto della Registration Page adesso è quello mostrato in figura 1.
In figura 2 invece vediamo come appare la finestra modale.
La finestra modale è una WebPage che contiene la DropDownChoice per la selezione di un talk, il button di selezione e un AjaxLink (org.apache.wicket.ajax.markup.html.AjaxLink) per la gestione della chiusura della finestra con restituzione del focus e del valore di ritorno (il nome del talk selezionato) alla finestra chiamante.
add(new AjaxLink("closeOK") { public void onClick(AjaxRequestTarget target) { if (modalWindowPage != null) {
modalWindowPage.setTalk(selectedTalk); } window.close(target); } });
Nella Registration Page è presente ovviamente anche il codice per la gestione del ritorno dalla modal window:
final ModalWindow talkModalWindow = new ModalWindow("talkModalWindow"); talkModalWindow.setPageMapName("talkModalWindow"); talkModalWindow.setCookieName("talkModalWindow"); talkModalWindow.setPageCreator(new ModalWindow.PageCreator() { public Page createPage() { return new TalkModalPage(RegistrationPage.this, talkModalWindow); } }); talkModalWindow.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() { public void onClose(AjaxRequestTarget target) { target.addComponent(talkTextField); } }); talkModalWindow.setCloseButtonCallback(new ModalWindow.CloseButtonCallback() { public boolean onCloseButtonClicked(AjaxRequestTarget target) { return true; } }); registrationForm.add(talkModalWindow);
registrationForm.add(new AjaxLink("showTalkModalWindow") { public void onClick(AjaxRequestTarget target) { talkModalWindow.show(target); } });
Poichè è possibile accedere alla Modal Window solo dalla Registration Page, non è necessario registrarla nell'init() method della WebApplication. Nella Modal Window, oltre ai titoli dei talk, troviamo altre informazioni relative a questi ultimi: le descrizioni e le date. Le informazioni sono presenti in tre Panel distinti, navigabili tramite breadcrumbs. Ciascuna breadcrumb tramite Wicket viene implementata con una classe che estende la classe astratta org.apache.wicket.extensions.breadcrumb.panel.BreadCrumbPanel. La navigazione avviene tramite gli org.apache.wicket.extension.breadcrumb.panel.BreadCrumbPanelLink. Il codice Java per il Panel iniziale è il seguente:
public class FirstBreadCrumbPanel extends BreadCrumbPanel { public FirstBreadCrumbPanel(final String id, final IBreadCrumbModel breadCrumbModel) { super(id, breadCrumbModel); add(new BreadCrumbPanelLink("linkToSecondPanel", this, SecondBreadCrumbPanel.class));
}
public String getTitle() { return "Talks"; } }
Mentre il template HTML corrispondente è:
<wicket:panel>
<div style="margin: 10px;"> <a href="#" wicket:id="linkToSecondPanel">Go to talk description</a> </div>
</wicket:panel>
Stessa cosa per gli altri due Panel. Le figure 3 e 4 mostrano i due Panel con le descrizioni e le date dei talk.
Il codice dell'applicazione di esempio può essere scaricato come allegato dal menu in alto a sinistra. L'archivio non comprende le librerie necessarie per la compilazione e/o il runtime. Le dipendenze sono le seguenti:
wicket-1.4-m3.jar (compilazione e runtime) wicket-extensions-1.4-m3.jar (compilazione e runtime) slf4j-api-1.5.0.jar (runtime) slf4j-jcl-1.5.0.jar (runtime)
Conclusioni In questo secondo articolo sono stati introdotti alcuni dei principali component extension del framework. Una volta presa confidenza anche con questi ultimi, nel prossimo articolo vedremo come implementare, tramite Wicket, lo strato di presentation in applicazioni Spring based e che utilizzano iBatis o Hibernate per la persistenza.
Riferimenti
[1] Karthik Gurumurthy, "Pro Wicket", Apress, 2006
[2] Sito ufficiale di Wicket presso Apache HYPERLINK "http://wicket.apache.org/"http://wicket.apache.org/
