org.wicketstuff.datatable_autocomplete.button.DTAAjaxFallbackButton Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of wicketstuff-datatable-autocomplete Show documentation
Show all versions of wicketstuff-datatable-autocomplete Show documentation
The Datatable autocomplete project provides a Trie datastructure that allows AJAX searches on large datasets fast.
It is not memory efficient but it is fast especially to know how many results a given prefix matches.
Provides a Datatable component when tied to a textfield will show the matched objects in a table format.
/*
*
* ==============================================================================
* 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 org.wicketstuff.datatable_autocomplete.button;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.IAjaxCallDecorator;
import org.apache.wicket.ajax.IAjaxIndicatorAware;
import org.apache.wicket.ajax.calldecorator.AjaxCallDecorator;
import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton;
import org.apache.wicket.extensions.ajax.markup.html.AjaxIndicatorAppender;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.wicketstuff.datatable_autocomplete.form.action.IFormOnSubmitAction;
/**
* @author mocleiri
*
* A special form submitting button.
*
* It will only render if the action is defined.
*
* It also allows for appending an onclick string. useful for poping an alert is state is
* missing on the client side.
*
* Will by default handle the refresh on the invoking form.
*
*/
public class DTAAjaxFallbackButton extends AjaxFallbackButton implements DTAButtonProvider,
IAjaxIndicatorAware
{
/**
*
*/
private static final long serialVersionUID = 1829825558587963971L;
private static final Logger log = LoggerFactory.getLogger(DTAAjaxFallbackButton.class);
private IFormOnSubmitAction submitAction = null;
private IAjaxCallDecorator ajaxCallDecorator = null;
private IModel preAjaxScriptModel = null;
private Form> form = null;
private boolean actionDeterminesVisibility = true;
private int callCounter = 0;
private final AjaxIndicatorAppender indicatorAppender = new AjaxIndicatorAppender();
static class DTAButtonAjaxCallDecorator extends AjaxCallDecorator
{
/**
*
*/
private static final long serialVersionUID = -8601609694500314263L;
private final IModel decoratingStringModel;
/**
* @param delegate
*/
public DTAButtonAjaxCallDecorator(IModel decoratingStringModel)
{
this.decoratingStringModel = decoratingStringModel;
}
@Override
public CharSequence decorateScript(Component c, CharSequence script)
{
String preDecorator = decoratingStringModel.getObject();
if (preDecorator != null)
return preDecorator + ";" + script;
else
return script;
}
}
/**
* @param actionDeterminesVisibility
* the actionDeterminesVisibility to set
*
* Normally the existance of an action is used to control the visiblilty of the
* button.
*
* setting this to true will have the default behaviour. Setting to false will allow
* visibilty to be controlled externally.
*
*/
public void setActionDeterminesVisibility(boolean actionDeterminesVisibility)
{
this.actionDeterminesVisibility = actionDeterminesVisibility;
}
/**
* @param id
*/
public DTAAjaxFallbackButton(String id, String label, Form> form,
IFormOnSubmitAction submitAction)
{
super(id, Model.of(label), form);
this.form = form;
this.submitAction = submitAction;
add(indicatorAppender);
}
public DTAAjaxFallbackButton(String id, String label, Form> form,
IModel preAjaxScriptModel)
{
this(id, label, form);
this.form = form;
this.preAjaxScriptModel = preAjaxScriptModel;
add(indicatorAppender);
}
public DTAAjaxFallbackButton(String id, IModel labelModel, Form> form)
{
super(id, labelModel, form);
this.form = form;
add(indicatorAppender);
}
public DTAAjaxFallbackButton(String id, String label, Form> form)
{
this(id, Model.of(label), form);
add(indicatorAppender);
}
/*
* (non-Javadoc)
*
* @see org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton#getForm()
*/
@Override
public Form> getForm()
{
return form;
}
/**
* @param form
* the form to set
*/
public void setForm(Form> form)
{
this.form = form;
this.form.setOutputMarkupId(true);
}
/*
* (non-Javadoc)
*
* @see org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton#onSubmit(org
* .apache.wicket.ajax.AjaxRequestTarget, org.apache.wicket.markup.html.form.Form)
*/
@Override
protected final void onSubmit(AjaxRequestTarget target, Form> form)
{
callCounter++;
if (submitAction != null)
submitAction.onSubmit(target, form);
}
@Override
protected void onError(AjaxRequestTarget target, Form> form)
{
if (submitAction != null)
submitAction.onError(target, form);
}
/*
* (non-Javadoc)
*
* @seeorg.apache.wicket.ajax.markup.html.form.AjaxFallbackButton# getAjaxCallDecorator()
*/
@Override
protected IAjaxCallDecorator getAjaxCallDecorator()
{
if (ajaxCallDecorator == null)
{
if (preAjaxScriptModel != null)
{
ajaxCallDecorator = new DTAButtonAjaxCallDecorator(preAjaxScriptModel);
}
}
return ajaxCallDecorator;
}
/*
* (non-Javadoc)
*
* @see org.apache.wicket.Component#onBeforeRender()
*/
@Override
protected void onBeforeRender()
{
if (actionDeterminesVisibility)
{
if (submitAction == null)
setVisible(false);
else
setVisible(true);
}
callCounter = 0;
super.onBeforeRender();
}
/**
* @param submitAction
* the submitAction to set
*/
public void setSubmitAction(IFormOnSubmitAction submitAction)
{
this.submitAction = submitAction;
}
public DTAAjaxFallbackButton getButton()
{
if (!getId().equals(DTAButtonProvider.BUTTON_ID))
{
// this is a problem
throw new RuntimeException("ID of button (" + getId() +
" != DTAButtonProvider.BUTTON_ID");
}
return this;
}
/*
* (non-Javadoc)
*
* @see org.apache.wicket.ajax.IAjaxIndicatorAware#getAjaxIndicatorMarkupId()
*/
public String getAjaxIndicatorMarkupId()
{
return indicatorAppender.getMarkupId();
}
/*
* (non-Javadoc)
*
* @see org.apache.wicket.markup.html.form.FormComponent#onDetach()
*/
@Override
protected void onDetach()
{
super.onDetach();
if (callCounter > 0)
log.debug("button called " + callCounter + " times");
}
}