package org.jblooming.waf.html.table;
import org.jblooming.oql.QueryHelper;
import org.jblooming.utilities.JSP;
import org.jblooming.waf.exceptions.ActionException;
import org.jblooming.waf.html.button.ButtonSubmit;
import org.jblooming.waf.html.core.HtmlBootstrap;
import org.jblooming.waf.html.core.JspHelper;
import org.jblooming.waf.html.display.Img;
import org.jblooming.waf.html.state.Form;
import org.jblooming.waf.settings.I18n;
import org.jblooming.waf.view.PageState;
import javax.servlet.jsp.PageContext;
import java.util.ArrayList;
import java.util.List;
/**
* Handles drawing of sortable list headers. Relies on template
* <p/>
* <a href="/commons/layout/partCollector.jsp">partListHeader.jsp</a>
* <p/>
* There is a complete example of usage in
* <p/>
* <a href="/test/testCollector.jsp">/test/testTable.jsp</a>
*
* @author Pietro Polsinelli ppolsinelli@open-lab.com
*/
public class ListHeader extends JspHelper implements HtmlBootstrap {
private List headers = new ArrayList();
public Form form;
public QueryHelper queryHelper;
public String ASC_TO_DESC_TITLE = "ASC_TO_DESC_TITLE";
public String DESC_TO_UNORD_TITLE = "DESC_TO_UNORD_TITLE";
public String TO_ASC_TITLE = "TO_ASC_TITLE";
// used to ajax submit style
private boolean ajaxEnabledLoc =false;
private String ajaxDomIdToReloadLoc =null;
public ListHeader(String id, Form form) {
this.id = id;
urlToInclude = "/commons/layout/partListHeader.jsp";
this.form = form;
}
public static ListHeader getAjaxInstance(String id, Form form, String domIdToRelead){
ListHeader ret= new ListHeader(id,form);
ret.ajaxEnabledLoc = true;
ret.ajaxDomIdToReloadLoc=domIdToRelead;
return ret;
}
public void addHeader(String label) {
addHeader(label, null, null);
}
public void addHeaderFitAndCentered(String label) {
addHeader(label, "1%", null);
}
public void addHeader(String label, String orderingHql) {
addHeader(label, null, orderingHql);
}
public void addHeaderFitAndCentered(String label, String orderingHql) {
addHeader(label, "1%", orderingHql);
}
public void addHeader(String label, String width, String orderingHql) {
addHeader(label, width, null, orderingHql);
}
public void addHeader(String label, String width, String align, String orderingHql) {
ListHeaderButton bs = new ListHeaderButton(form);
final Header header = new Header();
header.bs = bs;
header.orderingHql = orderingHql;
bs.drawOrderBy = orderingHql != null;
header.width = width;
header.align = align;
header.setLabel(label);
getHeaders().add(header);
}
public String getDiscriminator() {
return ListHeader.class.getName();
}
public boolean validate(PageState pageState) {
return true;
}
public List getHeaders() {
return headers;
}
public class Header {
public ListHeaderButton bs;
public String orderingHql;
public String width;
public String align;
private String label;
public int state = UNORDERED;
public static final int UNORDERED = 0;
public static final int ASCENDING = 1;
public static final int DESCENDING = 2;
public void toHtml(PageContext pageContext) {
PageState pageState = PageState.getCurrentPageState();
if (bs.drawOrderBy) {
try {
String FLD_FORM_ORDER_BY = pageState.getEntry(Form.FLD_FORM_ORDER_BY + id).stringValue();
if (orderingHql != null && FLD_FORM_ORDER_BY!=null && FLD_FORM_ORDER_BY.indexOf("asc") > -1 && FLD_FORM_ORDER_BY.indexOf(orderingHql.trim()) > -1)
state = ASCENDING;
else if (orderingHql != null && FLD_FORM_ORDER_BY!=null && FLD_FORM_ORDER_BY.indexOf("desc") > -1 && FLD_FORM_ORDER_BY.indexOf(orderingHql.trim()) > -1)
state = DESCENDING;
} catch (ActionException e1) {
state = UNORDERED;
}
if (state == UNORDERED) {
Img img = new Img(pageState.sessionState.getSkin().imgPath + "table/nosort.gif", I18n.get(TO_ASC_TITLE));
img.translateToolTip = true;
bs.label = getLabel() + " " + img.toHtmlStringBuffer();
bs.variationsFromForm.addClientEntry(Form.FLD_FORM_ORDER_BY + id, orderingHql + " asc");
bs.toolTip = I18n.get(TO_ASC_TITLE);
} else if (state == ASCENDING) {
bs.label = getLabel() + " " + new Img(pageState.sessionState.getSkin().imgPath + "table/asc.gif", I18n.get(ASC_TO_DESC_TITLE)).toHtmlStringBuffer();
bs.toolTip = I18n.get(ASC_TO_DESC_TITLE);
bs.variationsFromForm.addClientEntry(Form.FLD_FORM_ORDER_BY + id, orderingHql + " desc");
} else {
bs.label = getLabel() + " " + new Img(pageState.sessionState.getSkin().imgPath + "table/desc.gif", I18n.get(DESC_TO_UNORD_TITLE)).toHtmlStringBuffer();
bs.toolTip = I18n.get(DESC_TO_UNORD_TITLE);
bs.variationsFromForm.addClientEntry(Form.FLD_FORM_ORDER_BY + id, "");
}
} else {
bs.label = getLabel();
bs.toolTip = getLabel();
}
bs.alertOnChange = false;
bs.toHtml(pageContext);
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}
public class ListHeaderButton extends ButtonSubmit {
public boolean drawOrderBy = true;
public ListHeaderButton(Form form) {
super(form);
this.ajaxDomIdToReload= ajaxDomIdToReloadLoc;
this.ajaxEnabled=ajaxEnabledLoc;
urlToInclude = "/commons/layout/partListHeaderButton.jsp";
}
}
public static void orderAction(QueryHelper qhelp, String s, PageState pageState) {
orderAction(qhelp, s, pageState, null);
}
/**
* must be called by actions of list of HibernatePages
*
* @param qhelp
* @param listHeaderId
* @param pageState
*/
public static void orderAction(QueryHelper qhelp, String listHeaderId, PageState pageState, String defaultOrder) {
String FLD_FORM_ORDER_BY = pageState.getEntry(Form.FLD_FORM_ORDER_BY + listHeaderId).stringValueNullIfEmpty();
if (FLD_FORM_ORDER_BY==null)
FLD_FORM_ORDER_BY = defaultOrder;
if (JSP.ex(FLD_FORM_ORDER_BY)){
int pos = qhelp.getHqlString().toLowerCase().indexOf(" order by ");
if (pos >-1 ){
String hql=qhelp.getHqlString().substring(0,pos);
qhelp.setHqlString(hql);
}
qhelp.addToHqlString(" order by " + FLD_FORM_ORDER_BY);
}
}
public static String orderAction(String oql, String listHeaderId, PageState pageState) {
return orderAction(oql, listHeaderId, pageState, null);
}
public static String orderAction(String oql, String listHeaderId, PageState pageState, String defaultOrder) {
String FLD_FORM_ORDER_BY = pageState.getEntry(Form.FLD_FORM_ORDER_BY + listHeaderId).stringValueNullIfEmpty();
if (FLD_FORM_ORDER_BY==null)
FLD_FORM_ORDER_BY = defaultOrder;
if (JSP.ex(FLD_FORM_ORDER_BY)){
int pos = oql.toLowerCase().indexOf(" order by ");
if (pos >-1 ){
oql=oql.substring(0,pos);
}
oql = oql+" order by " + FLD_FORM_ORDER_BY;
}
return oql;
}
}