Java tutorial
/* * $Id: ListContactsPage.java 903 2006-08-30 09:08:51Z ivaynberg $ * $Revision: 903 $ * $Date: 2006-08-30 02:08:51 -0700 (Wed, 30 Aug 2006) $ * * ============================================================================== * Licensed 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 za.org.rfm.web.memberdata.page; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxEventBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.*; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.*; import org.apache.wicket.request.mapper.parameter.PageParameters; import za.org.rfm.base.BasePage; import za.org.rfm.facade.MemberFacade; import za.org.rfm.model.Member; import za.org.rfm.web.memberdata.CheckBoxColumn; import za.org.rfm.web.memberdata.MemberDao; import za.org.rfm.web.memberdata.MemberDataProvider; import za.org.rfm.web.members.ViewMember; import java.io.Serializable; import java.util.*; /** * Display a Pageable List of Contacts. * * @author igor */ public class ListMembersPage extends BasePage { private static final long serialVersionUID = 1L; private MemberDao dao; private final DefaultDataTable<Member, String> users; private final Set<Long> selectedMemberIds = new HashSet<Long>(); /** * Provides a composite User Actions panel for the Actions column. * * @author igor */ private static class UserActionsPanel extends Panel { private static final long serialVersionUID = 1L; public UserActionsPanel(String id, IModel<Member> contactModel) { super(id); addEditLink(contactModel); addDeleteLink(contactModel); } private void addDeleteLink(IModel<Member> contactModel) { add(new Link<Member>("deleteLink", contactModel) { private static final long serialVersionUID = 1L; /** * Go to the Delete page, passing this page and the id of the Contact involved. */ @Override public void onClick() { setResponsePage(new DeleteMemberPage(getPage(), getModel())); } }); } private void addEditLink(IModel<Member> contactModel) { add(new Link<Member>("editLink", contactModel) { private static final long serialVersionUID = 1L; /** * Go to the Edit page, passing this page and the id of the Contact involved. */ @Override public void onClick() { setResponsePage(new EditMemberPage(getPage(), getModel())); } }); } } /** * Constructor. Having this constructor public means that the page is 'bookmarkable' and hence * can be called/ created from anywhere. */ public ListMembersPage() { super(); addCreateLink(); // set up data provider MemberDataProvider dataProvider = new MemberDataProvider(dao); // create the form used to contain all filter components final FilterForm<Member> form = new FilterForm<Member>("filter-form", dataProvider) { private static final long serialVersionUID = 1L; @Override protected void onSubmit() { users.setCurrentPage(0); } }; form.add(new Button("delete-selected") { private static final long serialVersionUID = 1L; @Override public void onSubmit() { for (Long selectedMemberId : selectedMemberIds) { MemberFacade.getInstance().delete(selectedMemberId); } // clear out the set, we no longer need the selection selectedMemberIds.clear(); } }); // create the data table users = new DefaultDataTable<Member, String>("users", createColumns(), dataProvider, 10); users.addTopToolbar(new FilterToolbar(users, form, dataProvider)); form.add(users); add(form); } private List<IColumn<Member, String>> createColumns() { List<IColumn<Member, String>> columns = new ArrayList<IColumn<Member, String>>(); columns.add( new CheckBoxColumn<Member>(new PropertyModel<Collection<Serializable>>(this, "selectedMemberIds")) { private static final long serialVersionUID = 1L; @Override protected Serializable getModelObjectToken(IModel<Member> model) { return model.getObject().getId(); } }); columns.add(createActionsColumn()); columns.add(createColumn("first.name", "firstName", "firstName")); columns.add(new ChoiceFilteredPropertyColumn<Member, String, String>(new ResourceModel("last.name"), "lastName", "lastName", new LoadableDetachableModel<List<? extends String>>() { private static final long serialVersionUID = 1L; @Override protected List<String> load() { List<String> uniqueLastNames = MemberFacade.getInstance().getUniqueLastNames(); uniqueLastNames.add(0, ""); return uniqueLastNames; } })); columns.add(createColumn("phone", "phone", "phone")); columns.add(createColumn("email", "email", "email")); return columns; } private TextFilteredPropertyColumn<Member, Member, String> createColumn(String key, String sortProperty, String propertyExpression) { return new TextFilteredPropertyColumn<Member, Member, String>(new ResourceModel(key), sortProperty, propertyExpression); } /** * Create a composite column extending FilteredAbstractColumn. This column adds a * UserActionsPanel as its cell contents. It also provides the go-and-clear filter control * panel. */ private FilteredAbstractColumn<Member, String> createActionsColumn() { return new FilteredAbstractColumn<Member, String>(new Model<String>(getString("actions"))) { private static final long serialVersionUID = 1L; // return the go-and-clear filter for the filter toolbar public Component getFilter(String componentId, FilterForm<?> form) { return new GoAndClearFilter(componentId, form, new ResourceModel("filter"), new ResourceModel("clear")); } // add the UserActionsPanel to the cell item public void populateItem(Item<ICellPopulator<Member>> cellItem, String componentId, final IModel<Member> rowModel) { cellItem.add(new UserActionsPanel(componentId, rowModel)); cellItem.add(new AjaxEventBehavior("onclick") { private static final long serialVersionUID = 6720512493017210281L; @Override protected void onEvent(AjaxRequestTarget target) { PageParameters pageParameters = new PageParameters(); pageParameters.add("memberid", rowModel.getObject().getId().toString()); setResponsePage(ViewMember.class, pageParameters); } }); } }; } private void addCreateLink() { add(new Link<Void>("createLink") { private static final long serialVersionUID = 1L; /** * Go to the Edit page when the link is clicked, passing an empty Contact details */ @Override public void onClick() { setResponsePage(new EditMemberPage(getPage(), new Model<Member>(new Member()))); } }); } }