/* * 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.apache.wicket.ajax.markup.html.navigation.paging; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.Page; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.link.AbstractLink; import org.apache.wicket.markup.html.navigation.paging.IPageable; import org.apache.wicket.markup.html.navigation.paging.IPagingLabelProvider; import org.apache.wicket.markup.html.navigation.paging.PagingNavigation; import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; import org.apache.wicket.markup.repeater.AbstractRepeater; /** * A Wicket panel component to draw and maintain a complete page navigator, meant to be easily added * to any PageableListView. A navigation which contains links to the first and last page, the * current page +- some increment and which supports paged navigation bars (@see * PageableListViewNavigationWithMargin). * <p> * <strong>NOTE</strong> To use the <code>AjaxPagingNavigator</code>, you <i>have</i> to put your * <code>ListView</code> in a <code>WebMarkupContainer</code>, otherwise it is not possible to * update the contents of the listview using Ajax. * * @since 1.2 * * @author Martijn Dashorst */ public class AjaxPagingNavigator extends PagingNavigator { private static final long serialVersionUID = 1L; /** The pageable component that needs to be updated. */ private final IPageable pageable; /** * Constructor. * * @param id * See Component * @param pageable * The pageable component the page links are referring to. */ public AjaxPagingNavigator(final String id, final IPageable pageable) { this(id, pageable, null); } /** * Constructor. * * @param id * See Component * @param pageable * The pageable component the page links are referring to. * @param labelProvider * The label provider for the link text. */ public AjaxPagingNavigator(final String id, final IPageable pageable, final IPagingLabelProvider labelProvider) { super(id, pageable, labelProvider); this.pageable = pageable; setOutputMarkupId(true); } /** * Create a new increment link. May be subclassed to make use of specialized links, e.g. Ajaxian * links. * * @param id * the link id * @param pageable * the pageable to control * @param increment * the increment * @return the increment link */ @Override protected AbstractLink newPagingNavigationIncrementLink(String id, IPageable pageable, int increment) { return new AjaxPagingNavigationIncrementLink(id, pageable, increment); } /** * Create a new pagenumber link. May be subclassed to make use of specialized links, e.g. * Ajaxian links. * * @param id * the link id * @param pageable * the pageable to control * @param pageNumber * the page to jump to * @return the pagenumber link */ @Override protected AbstractLink newPagingNavigationLink(String id, IPageable pageable, int pageNumber) { return new AjaxPagingNavigationLink(id, pageable, pageNumber); } /** * @see org.apache.wicket.markup.html.navigation.paging.PagingNavigator#newNavigation(java.lang.String, * org.apache.wicket.markup.html.navigation.paging.IPageable, * org.apache.wicket.markup.html.navigation.paging.IPagingLabelProvider) */ @Override protected PagingNavigation newNavigation(final String id, final IPageable pageable, final IPagingLabelProvider labelProvider) { return new AjaxPagingNavigation(id, pageable, labelProvider); } /** * Override this method to specify the markup container where your IPageable is part of. This * default implementation tries to find a parent which is not an {@link AbstractRepeater} and outputs * its markup id. This is necessary as ListViews can't be updated themselves. * * @param target * the request target to add the components that need to be updated in the ajax * event. * @see Component#getOutputMarkupId(boolean) */ protected void onAjaxEvent(AjaxRequestTarget target) { // Update a parental container of the pageable, this assumes that the pageable is a component. Component container = ((Component)pageable); while (container instanceof AbstractRepeater || container.getOutputMarkupId() == false) { Component parent = container.getParent(); if (parent == null) { break; } container = parent; } target.add(container); // in case the navigator is not contained by the container, we have // to add it to the response if (((MarkupContainer)container).contains(this, true) == false) { target.add(this); } } }