001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: * $Header:$
018: */
019: package org.apache.beehive.netui.databinding.datagrid.runtime.rendering.cell;
020:
021: import org.apache.beehive.netui.util.internal.InternalStringBuilder;
022:
023: import java.util.Map;
024: import java.net.URISyntaxException;
025: import javax.servlet.jsp.JspContext;
026: import javax.servlet.http.HttpServletRequest;
027:
028: import org.apache.beehive.netui.databinding.datagrid.api.exceptions.CellDecoratorException;
029: import org.apache.beehive.netui.databinding.datagrid.api.sort.SortModel;
030: import org.apache.beehive.netui.databinding.datagrid.api.sort.SortDirection;
031: import org.apache.beehive.netui.databinding.datagrid.api.rendering.CellModel;
032: import org.apache.beehive.netui.databinding.datagrid.api.rendering.DataGridTagModel;
033: import org.apache.beehive.netui.databinding.datagrid.api.rendering.CellDecorator;
034: import org.apache.beehive.netui.databinding.datagrid.runtime.model.cell.HeaderCellModel;
035: import org.apache.beehive.netui.databinding.datagrid.runtime.util.JspUtil;
036: import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
037: import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
038: import org.apache.beehive.netui.tags.rendering.TagRenderingBase;
039: import org.apache.beehive.netui.tags.rendering.AnchorTag;
040: import org.apache.beehive.netui.tags.rendering.ImageTag;
041: import org.apache.beehive.netui.tags.rendering.AbstractHtmlState;
042: import org.apache.beehive.netui.tags.html.HtmlConstants;
043: import org.apache.beehive.netui.util.logging.Logger;
044: import org.apache.beehive.netui.util.Bundle;
045:
046: /**
047: *
048: */
049: public final class SortedCellDecorator extends CellDecorator {
050:
051: private static final Logger LOGGER = Logger
052: .getInstance(SortedCellDecorator.class);
053:
054: public SortedCellDecorator(CellDecorator decorator) {
055: super (decorator);
056: }
057:
058: public void decorate(JspContext jspContext,
059: AbstractRenderAppender appender, CellModel cellModel)
060: throws CellDecoratorException {
061:
062: assert cellModel instanceof HeaderCellModel;
063: HeaderCellModel headerCellModel = (HeaderCellModel) cellModel;
064:
065: assert getNestedDecorator() != null : "SortedCellDecorator did not find a nested decorator and requires one";
066:
067: getNestedDecorator().decorate(jspContext, appender, cellModel);
068:
069: if (headerCellModel.isSortable()) {
070: String sortLink = buildSortLink(jspContext, headerCellModel);
071: appender.append(" ");
072: appender.append(sortLink);
073: }
074: }
075:
076: protected String buildSortLink(JspContext jspContext,
077: HeaderCellModel cellModel) {
078: HttpServletRequest request = JspUtil.getRequest(jspContext);
079: DataGridTagModel dgm = cellModel.getDataGridTagModel();
080: assert dgm != null;
081:
082: SortModel sortModel = dgm.getState().getSortModel();
083:
084: InternalStringBuilder builder = new InternalStringBuilder();
085: AbstractRenderAppender appender = new StringBuilderRenderAppender(
086: builder);
087:
088: TagRenderingBase imageRenderer = TagRenderingBase.Factory
089: .getRendering(TagRenderingBase.IMAGE_TAG, request);
090: TagRenderingBase anchorRenderer = TagRenderingBase.Factory
091: .getRendering(TagRenderingBase.ANCHOR_TAG, request);
092:
093: AnchorTag.State aTag = new AnchorTag.State();
094: ImageTag.State imgTag = new ImageTag.State();
095:
096: SortDirection sortDirection = sortModel
097: .getSortDirection(cellModel.getSortExpression());
098:
099: /* build icon for existing sort */
100: if (sortModel.isSorted(cellModel.getSortExpression()))
101: imgTag.src = dgm.getResourcePath()
102: + dgm.getSortImagePath(sortDirection);
103: else
104: imgTag.src = dgm.getResourcePath()
105: + dgm.getDefaultSortImagePath();
106:
107: imgTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL,
108: HtmlConstants.BORDER, "false");
109:
110: Map queryParams = dgm.getUrlBuilder().buildSortQueryParamsMap(
111: cellModel.getSortExpression());
112:
113: String href = null;
114: try {
115: href = JspUtil.createURL(cellModel.getSortHref(), cellModel
116: .getSortAction(), null, cellModel.getScopeId(),
117: queryParams, dgm.getJspContext());
118: } catch (URISyntaxException use) {
119: String message = Bundle.getErrorString(
120: "Rendering_URLException", new Object[] {
121: cellModel.getSortHref(),
122: cellModel.getSortAction() });
123: if (LOGGER.isErrorEnabled())
124: LOGGER.error(message, use);
125: throw new CellDecoratorException(message, use);
126: }
127:
128: aTag.href = href;
129:
130: anchorRenderer.doStartTag(appender, aTag);
131: imageRenderer.doStartTag(appender, imgTag);
132: imageRenderer.doEndTag(appender);
133: anchorRenderer.doEndTag(appender);
134:
135: return builder.toString();
136: }
137: }
|