001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020 package org.apache.myfaces.tobago.taglib.extension; 021 022 import org.apache.commons.logging.Log; 023 import org.apache.commons.logging.LogFactory; 024 import org.apache.myfaces.tobago.apt.annotation.ExtensionTag; 025 import org.apache.myfaces.tobago.apt.annotation.Tag; 026 import org.apache.myfaces.tobago.taglib.component.GridLayoutTag; 027 import org.apache.myfaces.tobago.taglib.component.LabelTag; 028 import org.apache.myfaces.tobago.taglib.component.PanelTag; 029 import org.apache.myfaces.tobago.taglib.decl.HasTip; 030 import org.apache.myfaces.tobago.taglib.decl.HasValue; 031 import org.apache.myfaces.tobago.util.LayoutUtil; 032 033 import javax.faces.webapp.FacetTag; 034 import javax.faces.webapp.UIComponentTag; 035 import javax.servlet.jsp.JspException; 036 import javax.servlet.jsp.tagext.BodyTagSupport; 037 038 import static org.apache.myfaces.tobago.TobagoConstants.FACET_LAYOUT; 039 040 /** 041 * Renders a label to any component. 042 * <br /> 043 * Short syntax of: 044 * <br /> 045 * <pre> 046 * <tc:panel> 047 * <f:facet name="layout"> 048 * <tc:gridLayout columns="fixed;*"/> 049 * </f:facet> 050 * <tc:label value="#{label}" for="@auto"/> 051 * ... 052 * </tc:panel> 053 * </pre> 054 * This is the universal version of the special versions: <tx:in>, etc. 055 * In other words: 056 * <pre> 057 * <tx:label> 058 * <tc:in/> 059 * </tx:label> 060 * </pre> 061 * does the same like 062 * <pre> 063 * <tx:in/> 064 * </pre> 065 */ 066 067 @Tag(name = "label") 068 @ExtensionTag(baseClassName = "org.apache.myfaces.tobago.taglib.component.LabelTag") 069 public class LabelExtensionTag extends BodyTagSupport 070 implements HasValue, HasTip { 071 072 private static final Log LOG = LogFactory.getLog(LabelExtensionTag.class); 073 074 public static final String DEFAULT_COLUMNS = "fixed;*"; 075 076 private String value; 077 private String tip; 078 private String rendered; 079 private String columns = DEFAULT_COLUMNS; 080 private String rows = "fixed"; 081 private String markup; 082 083 private PanelTag panelTag; 084 085 @Override 086 public int doStartTag() throws JspException { 087 088 panelTag = new PanelTag(); 089 panelTag.setPageContext(pageContext); 090 panelTag.setParent(getParent()); 091 if (rendered != null) { 092 panelTag.setRendered(rendered); 093 } 094 if (tip != null) { 095 panelTag.setTip(tip); 096 } 097 panelTag.doStartTag(); 098 099 FacetTag facetTag = new FacetTag(); 100 facetTag.setPageContext(pageContext); 101 facetTag.setName(FACET_LAYOUT); 102 facetTag.setParent(panelTag); 103 facetTag.doStartTag(); 104 105 GridLayoutTag gridLayoutTag = new GridLayoutTag(); 106 gridLayoutTag.setPageContext(pageContext); 107 gridLayoutTag.setColumns(columns); 108 gridLayoutTag.setRows(rows); 109 gridLayoutTag.setParent(facetTag); 110 gridLayoutTag.doStartTag(); 111 gridLayoutTag.doEndTag(); 112 113 facetTag.doEndTag(); 114 115 LabelTag labelTag = new LabelTag(); 116 labelTag.setPageContext(pageContext); 117 if (value != null) { 118 labelTag.setValue(value); 119 } 120 if (markup != null) { 121 labelTag.setMarkup(markup); 122 } 123 labelTag.setFor("@auto"); 124 labelTag.setParent(panelTag); 125 labelTag.doStartTag(); 126 labelTag.doEndTag(); 127 128 return super.doStartTag(); 129 } 130 131 @Override 132 public int doEndTag() throws JspException { 133 panelTag.doEndTag(); 134 return super.doEndTag(); 135 } 136 137 @Override 138 public void release() { 139 super.release(); 140 value = null; 141 tip = null; 142 rendered = null; 143 columns = DEFAULT_COLUMNS; 144 rows = "fixed"; 145 panelTag = null; 146 markup = null; 147 } 148 149 public void setValue(String value) { 150 this.value = value; 151 } 152 153 public void setTip(String tip) { 154 this.tip = tip; 155 } 156 157 public void setRendered(String rendered) { 158 this.rendered = rendered; 159 } 160 161 void setColumns(String columns) { 162 if (!(UIComponentTag.isValueReference(columns) || LayoutUtil.checkTokens(columns))) { 163 LOG.warn("Illegal value for columns = \"" + columns + "\" replacing with default: \"" + DEFAULT_COLUMNS + "\""); 164 this.columns = DEFAULT_COLUMNS; 165 } else { 166 this.columns = columns; 167 } 168 } 169 170 void setRows(String rows) { 171 this.rows = rows; 172 } 173 174 public void setMarkup(String markup) { 175 this.markup = markup; 176 } 177 }