za.org.rfm.web.memberdata.page.ListMembersPage.java Source code

Java tutorial

Introduction

Here is the source code for za.org.rfm.web.memberdata.page.ListMembersPage.java

Source

/*
 * $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())));
            }
        });
    }
}