/*
* 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.extensions.markup.html.repeater.data.sort;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.util.lang.Args;
/**
* A component that represents a sort header. When the link is clicked it will toggle the state of a
* sortable property within the sort state object.
*
* @param <S>
* the type of the sorting parameter
* @author Phil Kulak
* @author Igor Vaynberg (ivaynberg)
*/
public class OrderByLink<S> extends Link<Void>
{
private static final long serialVersionUID = 1L;
/** sortable property */
private final S property;
/** locator for sort state object */
private final ISortStateLocator<S> stateLocator;
/**
* Constructor.
*
* @param id
* the component id of the link
* @param property
* the name of the sortable property this link represents. this value will be used as
* parameter for sort state object methods. sort state object will be located via the
* stateLocator argument.
* @param stateLocator
* locator used to locate sort state object that this will use to read/write state of
* sorted properties
*
*/
public OrderByLink(final String id, final S property, final ISortStateLocator<S> stateLocator)
{
super(id);
Args.notNull(property, "property");
this.property = property;
this.stateLocator = stateLocator;
}
/**
* @see org.apache.wicket.markup.html.link.Link
*/
@Override
public final void onClick()
{
sort();
onSortChanged();
}
/**
* This method is a hook for subclasses to perform an action after sort has changed
*/
protected void onSortChanged()
{
// noop
}
/**
* Re-sort data provider according to this link
*
* @return this
*/
public final OrderByLink<S> sort()
{
if (isVersioned())
{
// version the old state
addStateChange();
}
ISortState<S> state = stateLocator.getSortState();
// get current sort order
SortOrder order = state.getPropertySortOrder(property);
// set next sort order
state.setPropertySortOrder(property, nextSortOrder(order));
return this;
}
/**
* returns the next sort order when changing it
*
* @param order
* previous sort order
* @return next sort order
*/
protected SortOrder nextSortOrder(final SortOrder order)
{
// init / flip order
if (order == SortOrder.NONE)
{
return SortOrder.ASCENDING;
}
else
{
return order == SortOrder.ASCENDING ? SortOrder.DESCENDING : SortOrder.ASCENDING;
}
}
}