1 18 package org.apache.beehive.netui.databinding.datagrid.runtime.rendering.cell; 19 20 import org.apache.beehive.netui.util.internal.InternalStringBuilder; 21 22 import java.util.Map ; 23 import java.net.URISyntaxException ; 24 import javax.servlet.jsp.JspContext ; 25 import javax.servlet.http.HttpServletRequest ; 26 27 import org.apache.beehive.netui.databinding.datagrid.api.exceptions.CellDecoratorException; 28 import org.apache.beehive.netui.databinding.datagrid.api.sort.SortModel; 29 import org.apache.beehive.netui.databinding.datagrid.api.sort.SortDirection; 30 import org.apache.beehive.netui.databinding.datagrid.api.rendering.CellModel; 31 import org.apache.beehive.netui.databinding.datagrid.api.rendering.DataGridTagModel; 32 import org.apache.beehive.netui.databinding.datagrid.api.rendering.CellDecorator; 33 import org.apache.beehive.netui.databinding.datagrid.runtime.model.cell.HeaderCellModel; 34 import org.apache.beehive.netui.databinding.datagrid.runtime.util.JspUtil; 35 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender; 36 import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender; 37 import org.apache.beehive.netui.tags.rendering.TagRenderingBase; 38 import org.apache.beehive.netui.tags.rendering.AnchorTag; 39 import org.apache.beehive.netui.tags.rendering.ImageTag; 40 import org.apache.beehive.netui.tags.rendering.AbstractHtmlState; 41 import org.apache.beehive.netui.tags.html.HtmlConstants; 42 import org.apache.beehive.netui.util.logging.Logger; 43 import org.apache.beehive.netui.util.Bundle; 44 45 48 public final class SortedCellDecorator 49 extends CellDecorator { 50 51 private static final Logger LOGGER = Logger.getInstance(SortedCellDecorator.class); 52 53 public SortedCellDecorator(CellDecorator decorator) { 54 super(decorator); 55 } 56 57 public void decorate(JspContext jspContext, AbstractRenderAppender appender, CellModel cellModel) 58 throws CellDecoratorException { 59 60 assert cellModel instanceof HeaderCellModel; 61 HeaderCellModel headerCellModel = (HeaderCellModel)cellModel; 62 63 assert getNestedDecorator() != null : "SortedCellDecorator did not find a nested decorator and requires one"; 64 65 getNestedDecorator().decorate(jspContext, appender, cellModel); 66 67 if(headerCellModel.isSortable()) { 68 String sortLink = buildSortLink(jspContext, headerCellModel); 69 appender.append(" "); 70 appender.append(sortLink); 71 } 72 } 73 74 protected String buildSortLink(JspContext jspContext, HeaderCellModel cellModel) { 75 HttpServletRequest request = JspUtil.getRequest(jspContext); 76 DataGridTagModel dgm = cellModel.getDataGridTagModel(); 77 assert dgm != null; 78 79 SortModel sortModel = dgm.getState().getSortModel(); 80 81 InternalStringBuilder builder = new InternalStringBuilder(); 82 AbstractRenderAppender appender = new StringBuilderRenderAppender(builder); 83 84 TagRenderingBase imageRenderer = TagRenderingBase.Factory.getRendering(TagRenderingBase.IMAGE_TAG, request); 85 TagRenderingBase anchorRenderer = TagRenderingBase.Factory.getRendering(TagRenderingBase.ANCHOR_TAG, request); 86 87 AnchorTag.State aTag = new AnchorTag.State(); 88 ImageTag.State imgTag = new ImageTag.State(); 89 90 SortDirection sortDirection = sortModel.getSortDirection(cellModel.getSortExpression()); 91 92 93 if(sortModel.isSorted(cellModel.getSortExpression())) 94 imgTag.src = dgm.getResourcePath() + dgm.getSortImagePath(sortDirection); 95 else 96 imgTag.src = dgm.getResourcePath() + dgm.getDefaultSortImagePath(); 97 98 imgTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.BORDER, "false"); 99 100 Map queryParams = dgm.getUrlBuilder().buildSortQueryParamsMap(cellModel.getSortExpression()); 101 102 String href = null; 103 try { 104 href = JspUtil.createURL(cellModel.getSortHref(), 105 cellModel.getSortAction(), 106 null, 107 cellModel.getScopeId(), 108 queryParams, 109 dgm.getJspContext()); 110 } 111 catch(URISyntaxException use) { 112 String message = Bundle.getErrorString("Rendering_URLException", new Object []{cellModel.getSortHref(), cellModel.getSortAction()}); 113 if(LOGGER.isErrorEnabled()) 114 LOGGER.error(message, use); 115 throw new CellDecoratorException(message, use); 116 } 117 118 aTag.href = href; 119 120 anchorRenderer.doStartTag(appender, aTag); 121 imageRenderer.doStartTag(appender, imgTag); 122 imageRenderer.doEndTag(appender); 123 anchorRenderer.doEndTag(appender); 124 125 return builder.toString(); 126 } 127 } 128 | Popular Tags |