/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.seam.example.wicket;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.feedback.ContainerFeedbackMessageFilter;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.PageParameters;
import org.jboss.seam.wicket.annotations.Begin;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.core.Manager;
import org.jboss.seam.example.wicket.action.Booking;
import org.jboss.seam.example.wicket.action.BookingList;
import org.jboss.seam.example.wicket.action.Hotel;
import org.jboss.seam.example.wicket.action.HotelBooking;
import org.jboss.seam.example.wicket.action.HotelSearching;
import org.jboss.seam.security.Identity;
import org.jboss.seam.wicket.SeamPropertyModel;
@Restrict("#{identity.loggedIn}")
public class Main extends WebPage
{
@In(create = true)
private HotelSearching hotelSearch;
@In(create=true)
private List<Booking> bookings;
@In(create=true)
private BookingList bookingList;
@In(create=true)
private HotelBooking hotelBooking;
private DataView hotelDataView;
private DataView bookedHotelDataView;
private HotelSearchForm hotelSearchForm;
private WebMarkupContainer hotels;
private Component noHotelsFound;
private Component messages;
public Main(final PageParameters parameters)
{
Template body = new Template("body");
add(body);
hotelSearchForm = new HotelSearchForm("searchCriteria");
body.add(hotelSearchForm);
messages = new FeedbackPanel("messages", new ContainerFeedbackMessageFilter(this)).setOutputMarkupId(true);
body.add(messages);
/*
* Hotel Search results
*/
noHotelsFound = new Label("noResults", "No Hotels Found")
{
/**
* Only display the message if no hotels are found
*
*/
@Override
public boolean isVisible()
{
return Identity.instance().isLoggedIn() && hotelSearch.getHotels().size() == 0;
}
};
body.add(noHotelsFound.setOutputMarkupId(true));
hotelDataView = new DataView("hotel", new SimpleDataProvider() // A DataProvider adapts between your data and Wicket's internal representation
{
public Iterator iterator(int from, int count)
{
return hotelSearch.getHotels().subList(from, from + count).iterator();
}
public int size()
{
return hotelSearch.getHotels().size();
}
})
{
/**
* You specify the tr in the html, and populate each one here
*/
@Override
protected void populateItem(Item item)
{
final Hotel hotel = (Hotel) item.getModelObject();
item.add(new Label("hotelName", hotel.getName()));
item.add(new Label("hotelAddress", hotel.getAddress()));
item.add(new Label("hotelCityStateCountry", hotel.getCity() + ", " + hotel.getState() + ", " + hotel.getCountry()));
item.add(new Label("hotelZip", hotel.getZip()));
//item.add(new BookmarkablePageLink("viewHotel", org.jboss.seam.example.wicket.Hotel.class).setParameter("hotelId", hotel.getId()));
item.add(new Link("viewHotel")
{
@Begin
@Override
public void onClick()
{
hotelBooking.selectHotel(hotel);
setResponsePage(new org.jboss.seam.example.wicket.Hotel(new PageParameters()));
}
});
}
};
// Set the maximum items per page
hotelDataView.setItemsPerPage(hotelSearchForm.getPageSize());
hotelDataView.setOutputMarkupId(true);
hotels = new WebMarkupContainer("hotels");
hotels.add(hotelDataView).setOutputMarkupId(true);
// Add a pager
hotels.add(new AjaxPagingNavigator("hotelPager", hotelDataView)
{
@Override
public boolean isVisible()
{
return hotelDataView.isVisible();
}
});
body.add(hotels);
/*
* Existing hotel booking
*/
bookedHotelDataView = new DataView("bookedHotel", new SimpleDataProvider()
{
public Iterator iterator(int from, int count)
{
return bookings.subList(from, from + count).iterator();
}
public int size()
{
return bookings.size();
}
})
{
@Override
protected void populateItem(Item item)
{
final Booking booking = (Booking) item.getModelObject();
item.add(new Label("hotelName", booking.getHotel().getName()));
item.add(new Label("hotelAddress", booking.getHotel().getAddress()));
item.add(new Label("hotelCityStateCountry", booking.getHotel().getCity() + ", " + booking.getHotel().getState() + ", " + booking.getHotel().getState()));
item.add(new Label("hotelCheckInDate", booking.getCheckinDate().toString()));
item.add(new Label("hotelCheckOutDate", booking.getCheckoutDate().toString()));
item.add(new Label("hotelConfirmationNumber", booking.getId().toString()));
item.add(new Link("cancel")
{
@Override
public void onClick()
{
bookingList.cancel(booking);
}
});
}
@Override
public boolean isVisible()
{
return Identity.instance().isLoggedIn() && bookings.size() > 0;
}
};
body.add(bookedHotelDataView);
body.add(new Label("noHotelsBooked", "No Bookings Found")
{
@Override
public boolean isVisible()
{
return Identity.instance().isLoggedIn() && bookings.size() == 0;
}
});
}
public class HotelSearchForm extends Form
{
private Integer pageSize = 10;
public Integer getPageSize()
{
return pageSize;
}
public void setPageSize(Integer pageSize)
{
this.pageSize = pageSize;
}
public HotelSearchForm(String id)
{
super(id);
add(new TextField("searchString", new SeamPropertyModel("searchString")
{
@Override
public Object getTarget()
{
return hotelSearch;
}
}));
List<Integer> pageSizes = Arrays.asList(new Integer[] { 5, 10, 20 });
add(new DropDownChoice("pageSize", new PropertyModel(this, "pageSize"), pageSizes));
add(new IndicatingAjaxButton("submit", this)
{
@Override
protected void onSubmit(AjaxRequestTarget target, Form form)
{
target.addComponent(messages);
hotelSearch.find();
hotelDataView.setCurrentPage(0);
hotelDataView.setItemsPerPage(getPageSize());
hotelDataView.modelChanged();
hotels.modelChanged();
target.addComponent(hotels);
target.addComponent(noHotelsFound);
}
@Override
protected void onError(AjaxRequestTarget target, Form form)
{
target.addComponent(messages);
}
});
}
@Override
protected void onSubmit()
{
hotelDataView.setCurrentPage(0);
hotelDataView.setItemsPerPage(getPageSize());
hotelSearch.find();
}
}
}