Java tutorial
/** * Copyright (C) 2014 Premium Minds. * * This file is part of wicket-crudifier. * * wicket-crudifier is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * wicket-crudifier is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with wicket-crudifier. If not, see <http://www.gnu.org/licenses/>. */ package com.premiumminds.wicket.crudifier.table; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AjaxEventBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.head.CssHeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.request.resource.ResourceReference; import com.premiumminds.wicket.crudifier.IObjectRenderer; public abstract class CrudifierTable<T> extends Panel { private static final long serialVersionUID = -6553624504699750680L; private static final ResourceReference CSS = new CssResourceReference(CrudifierTable.class, "CrudifierTable.css"); private List<IColumn<T>> columns = new ArrayList<IColumn<T>>(); private RepeatingView headers = new RepeatingView("headers"); private boolean clickable = false; private ListView<T> listView; private WebMarkupContainer table; private Map<Class<?>, IObjectRenderer<?>> renderers; public CrudifierTable(String id, Map<Class<?>, IObjectRenderer<?>> renderers) { super(id); this.renderers = renderers; add(table = new WebMarkupContainer("table")); table.add(headers); IModel<List<T>> modelList = new LoadableDetachableModel<List<T>>() { private static final long serialVersionUID = 3296835301481871094L; @Override protected List<T> load() { return CrudifierTable.this.load(0, 0); } }; table.add(listView = new ListView<T>("list", modelList) { private static final long serialVersionUID = -2293426877086666745L; @Override protected void populateItem(final ListItem<T> item) { RepeatingView columns = new RepeatingView("columns"); for (final IColumn<T> column : CrudifierTable.this.columns) { columns.add(column.createComponent(columns.newChildId(), item.getModelObject(), CrudifierTable.this, CrudifierTable.this.renderers)); } item.add(columns); CrudifierTable.this.populateItem(item); return; } }.setReuseItems(true)); } public CrudifierTable(String id) { this(id, new HashMap<Class<?>, IObjectRenderer<?>>()); } @Override protected void onConfigure() { super.onConfigure(); headers.removeAll(); for (IColumn<T> column : columns) { headers.add(new Label(headers.newChildId(), new StringResourceModel(column.getPropertyName() + ".label", this, null, column.getPropertyName()))); } } @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.render(CssHeaderItem.forReference(CSS)); } public void addColumn(IColumn<T> column) { columns.add(column); } public boolean isClickable() { return clickable; } public void setClickable(boolean clickable) { this.clickable = clickable; } protected void populateItem(final ListItem<T> item) { if (isClickable()) { item.add(new AjaxEventBehavior("click") { private static final long serialVersionUID = -4889154387600763576L; @Override protected void onEvent(AjaxRequestTarget target) { onSelected(target, item.getModel()); } }); item.add(AttributeModifier.append("class", "hover")); } return; } protected abstract List<T> load(int page, int maxPerPage); protected void onSelected(AjaxRequestTarget target, IModel<T> model) { } public void refresh() { listView.removeAll(); } public Map<Class<?>, IObjectRenderer<?>> getRenderers() { return renderers; } public WebMarkupContainer getTableComponent() { return table; } public CrudifierTable<T> setReuseItems(boolean reuseItems) { listView.setReuseItems(reuseItems); return this; } public boolean getReuseItems() { return listView.getReuseItems(); } }