package fr.openwide.core.wicket.more.markup.repeater.table; import java.util.Map; import org.apache.wicket.Component; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.navigation.paging.IPageable; import org.apache.wicket.markup.html.navigation.paging.IPageableItems; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import com.google.common.collect.Multimap; import fr.openwide.core.jpa.more.business.sort.ISort; import fr.openwide.core.wicket.behavior.ClassAttributeAppender; import fr.openwide.core.wicket.markup.html.basic.CountLabel; import fr.openwide.core.wicket.more.condition.Condition; import fr.openwide.core.wicket.more.markup.html.basic.EnclosureContainer; import fr.openwide.core.wicket.more.markup.html.factory.AbstractComponentFactory; import fr.openwide.core.wicket.more.markup.html.factory.AbstractParameterizedComponentFactory; import fr.openwide.core.wicket.more.markup.html.factory.IOneParameterComponentFactory; import fr.openwide.core.wicket.more.markup.html.navigation.paging.HideableAjaxPagingNavigator; import fr.openwide.core.wicket.more.markup.html.navigation.paging.HideablePagingNavigator; import fr.openwide.core.wicket.more.markup.repeater.FactoryRepeatingView; import fr.openwide.core.wicket.more.markup.repeater.sequence.ISequenceProvider; import fr.openwide.core.wicket.more.markup.repeater.table.builder.IDataTableFactory; import fr.openwide.core.wicket.more.model.IErrorAwareDataProvider; import fr.openwide.core.wicket.more.util.binding.CoreWicketMoreBindings; public class DecoratedCoreDataTablePanel<T, S extends ISort<?>> extends Panel implements IPageableItems { private static final long serialVersionUID = 3327546179785797119L; private final CoreDataTable<T, S> dataTable; private final ISequenceProvider<T> sequenceProvider; public static enum AddInPlacement { HEADING_MAIN, HEADING_LEFT, HEADING_RIGHT, BODY_TOP, BODY_BOTTOM, FOOTER_LEFT, FOOTER_RIGHT } public DecoratedCoreDataTablePanel( String id, IDataTableFactory<T, S> factory, Map<IColumn<T, S>, Condition> columns, ISequenceProvider<T> sequenceProvider, long rowsPerPage, Multimap<AddInPlacement, ? extends IOneParameterComponentFactory<?, ? super DecoratedCoreDataTablePanel<T, S>>> addInComponentFactories, Condition responsiveCondition) { super(id); this.sequenceProvider = sequenceProvider; dataTable = newDataTable("dataTable", factory, columns, sequenceProvider, rowsPerPage); add( new WebMarkupContainer("dataTableContainer") .add(dataTable) .setRenderBodyOnly(responsiveCondition.negate().applies()) ); dataTable.setComponentToRefresh(this); FactoryRepeatingView headingMainAddins = new FactoryRepeatingView("mainAddIn"); FactoryRepeatingView headingRightAddins = new FactoryRepeatingView("rightAddIn"); FactoryRepeatingView headingLeftAddins = new FactoryRepeatingView("leftAddIn"); FactoryRepeatingView bodyTopAddins = new FactoryRepeatingView("bodyTopAddIn"); FactoryRepeatingView bodyBottomAddins = new FactoryRepeatingView("bodyBottomAddIn"); FactoryRepeatingView footerRightAddins = new FactoryRepeatingView("rightAddIn"); FactoryRepeatingView footerLeftAddins = new FactoryRepeatingView("leftAddIn"); add( new EnclosureContainer("headingAddInContainer") .condition(Condition.anyChildVisible(headingMainAddins).or(Condition.anyChildVisible(headingRightAddins).or(Condition.anyChildVisible(headingLeftAddins)))) .add(headingMainAddins, headingRightAddins, headingLeftAddins), new EnclosureContainer("bodyTopAddInContainer") .condition(Condition.anyChildVisible(bodyTopAddins)) .add(bodyTopAddins), new EnclosureContainer("bodyBottomAddInContainer") .condition(Condition.anyChildVisible(bodyBottomAddins)) .add(bodyBottomAddins), new EnclosureContainer("footerAddInContainer") .condition(Condition.anyChildVisible(footerRightAddins).or(Condition.anyChildVisible(footerLeftAddins))) .add(footerRightAddins, footerLeftAddins) ); headingMainAddins.addAll(addInComponentFactories.get(AddInPlacement.HEADING_MAIN), this); headingRightAddins.addAll(addInComponentFactories.get(AddInPlacement.HEADING_RIGHT), this); headingLeftAddins.addAll(addInComponentFactories.get(AddInPlacement.HEADING_LEFT), this); bodyTopAddins.addAll(addInComponentFactories.get(AddInPlacement.BODY_TOP), this); bodyBottomAddins.addAll(addInComponentFactories.get(AddInPlacement.BODY_BOTTOM), this); footerRightAddins.addAll(addInComponentFactories.get(AddInPlacement.FOOTER_RIGHT), this); footerLeftAddins.addAll(addInComponentFactories.get(AddInPlacement.FOOTER_LEFT), this); } protected CoreDataTable<T, S> newDataTable(String id, IDataTableFactory<T, S> factory, Map<IColumn<T, S>, Condition> columns, ISequenceProvider<T> sequenceProvider, long rowsPerPage) { return factory.create(id, columns, sequenceProvider, rowsPerPage); } public CoreDataTable<T, S> getDataTable() { return dataTable; } @Override public long getCurrentPage() { return dataTable.getCurrentPage(); } @Override public long getPageCount() { return dataTable.getPageCount(); } @Override public void setCurrentPage(long page) { dataTable.setCurrentPage(page); } @Override public long getItemCount() { return dataTable.getItemCount(); } @Override public long getItemsPerPage() { return dataTable.getItemsPerPage(); } @Override public void setItemsPerPage(long arg0) { dataTable.setItemsPerPage(arg0); } public static class LabelAddInComponentFactory extends AbstractComponentFactory<Component> { private static final long serialVersionUID = 7358590231263113101L; private final IModel<?> labelModel; public LabelAddInComponentFactory(IModel<?> labelModel) { super(); this.labelModel = labelModel; } @Override public Component create(String wicketId) { return new Label(wicketId, labelModel); } } public static class CountAddInComponentFactory extends AbstractComponentFactory<Component> { private static final long serialVersionUID = 7358590231263113101L; private final ISequenceProvider<?> sequenceProvider; private final String countResourceKey; public CountAddInComponentFactory(ISequenceProvider<?> sequenceProvider, String countResourceKey) { super(); this.sequenceProvider = sequenceProvider; this.countResourceKey = countResourceKey; } @Override public Component create(String wicketId) { IModel<Integer> countModel = new PropertyModel<Integer>(sequenceProvider, CoreWicketMoreBindings.iBindableDataProvider().size().getPath()); return new CountLabel(wicketId, countResourceKey, countModel); } } public static class AjaxPagerAddInComponentFactory extends AbstractParameterizedComponentFactory<Component, DecoratedCoreDataTablePanel<?, ?>> { private static final long serialVersionUID = 7358590231263113101L; private final int viewSize; public AjaxPagerAddInComponentFactory(int viewSize) { super(); this.viewSize = viewSize; } @Override public Component create(String wicketId, DecoratedCoreDataTablePanel<?, ?> dataTable) { dataTable.setOutputMarkupId(true); return new HideableAjaxPagingNavigator(wicketId, dataTable, viewSize) .add(new ClassAttributeAppender("add-in-pagination")); } } public static class PagerAddInComponentFactory extends AbstractParameterizedComponentFactory<Component, IPageable> { private static final long serialVersionUID = 7358590231263113101L; private final int viewSize; public PagerAddInComponentFactory(int viewSize) { super(); this.viewSize = viewSize; } @Override public Component create(String wicketId, IPageable pageable) { return new HideablePagingNavigator(wicketId, pageable, viewSize) .add(new ClassAttributeAppender("add-in-pagination")); } } @Override protected void onBeforeRender() { super.onBeforeRender(); // notification en cas d'erreur if ((sequenceProvider instanceof IErrorAwareDataProvider) && (((IErrorAwareDataProvider) sequenceProvider).hasError())) { error(getString("common.error.unexpected")); } } }