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.renderkit;
021
022 import org.apache.commons.logging.Log;
023 import org.apache.commons.logging.LogFactory;
024 import org.apache.myfaces.tobago.component.ComponentUtil;
025 import org.apache.myfaces.tobago.component.UILayout;
026 import org.apache.myfaces.tobago.config.ThemeConfig;
027 import org.apache.myfaces.tobago.context.ResourceManagerUtil;
028
029 import javax.faces.component.UIComponent;
030 import javax.faces.component.ValueHolder;
031 import javax.faces.context.FacesContext;
032 import javax.faces.convert.Converter;
033 import javax.faces.convert.ConverterException;
034 import java.io.IOException;
035
036 public class RenderUtil {
037
038 private static final Log LOG = LogFactory.getLog(RenderUtil.class);
039
040 public static final String COMPONENT_IN_REQUEST = "org.apache.myfaces.tobago.component";
041
042 public static boolean contains(Object[] list, Object value) {
043 if (list == null) {
044 return false;
045 }
046 for (Object aList : list) {
047 if (aList != null && aList.equals(value)) {
048 return true;
049 }
050 }
051 return false;
052 }
053
054 public static void encodeChildren(FacesContext facesContext,
055 UIComponent panel)
056 throws IOException {
057 // UIComponent layout = panel.getFacet("layout");
058 UILayout layout = UILayout.getLayout(panel);
059 if (layout != null) {
060 layout.encodeChildrenOfComponent(facesContext, panel);
061 } else {
062 for (Object o : panel.getChildren()) {
063 UIComponent child = (UIComponent) o;
064 encode(facesContext, child);
065 }
066 }
067 }
068
069 public static void encode(FacesContext facesContext, UIComponent component) throws IOException {
070 if (component.isRendered()) {
071 if (LOG.isDebugEnabled()) {
072 LOG.debug("rendering " + component.getRendererType() + " " + component);
073 }
074
075 LayoutRenderer layoutRenderer = (LayoutRenderer)
076 ComponentUtil.getRenderer(facesContext, UILayout.getLayout(component));
077 layoutRenderer.prepareRender(facesContext, component);
078
079 component.encodeBegin(facesContext);
080 if (component.getRendersChildren()) {
081 component.encodeChildren(facesContext);
082 } else {
083 for (Object o : component.getChildren()) {
084 UIComponent kid = (UIComponent) o;
085 encode(facesContext, kid);
086 }
087 }
088 component.encodeEnd(facesContext);
089 }
090 }
091
092
093 public static String addMenuCheckToggle(String clientId, String onClick) {
094 if (onClick != null) {
095 onClick = " ; " + onClick;
096 } else {
097 onClick = "";
098 }
099
100 onClick = "menuCheckToggle('" + clientId + "')" + onClick;
101
102 return onClick;
103 }
104
105 public static String getFormattedValue(
106 FacesContext facesContext, UIComponent component) {
107 Object value = null;
108 if (component instanceof ValueHolder) {
109 value = ((ValueHolder) component).getLocalValue();
110 if (value == null) {
111 value = ((ValueHolder) component).getValue();
112 }
113 }
114 return getFormattedValue(facesContext, component, value);
115 }
116
117 public static String getFormattedValue(
118 FacesContext context, UIComponent component, Object currentValue)
119 throws ConverterException {
120
121 if (currentValue == null) {
122 return "";
123 }
124
125 if (!(component instanceof ValueHolder)) {
126 return currentValue.toString();
127 }
128
129 Converter converter = ((ValueHolder) component).getConverter();
130
131 if (converter == null) {
132 if (currentValue instanceof String) {
133 return (String) currentValue;
134 }
135 Class converterType = currentValue.getClass();
136 converter = context.getApplication().createConverter(converterType);
137 }
138
139 if (converter == null) {
140 return currentValue.toString();
141 } else {
142 return converter.getAsString(context, component, currentValue);
143 }
144 }
145
146 public static int calculateStringWidth2(FacesContext facesContext, UIComponent component, String text) {
147 int width = 0;
148 int defaultCharWidth = 0;
149 try {
150 defaultCharWidth = ThemeConfig.getValue(facesContext, component, "fontWidth");
151 } catch (NullPointerException e) {
152 if (LOG.isDebugEnabled()) {
153 LOG.debug("no value for \"fontWidth\" found in theme-config");
154 }
155 }
156
157 String fontWidths = ResourceManagerUtil.getProperty(facesContext, "tobago", "tobago.font2.widths");
158
159 for (char c : text.toCharArray()) {
160 int charWidth;
161 if (c >= 32 && c < 128) {
162 int begin = (c - 32) * 2;
163 charWidth = Integer.parseInt(fontWidths.substring(begin, begin + 2), 16);
164 } else {
165 charWidth = defaultCharWidth;
166 }
167 width += charWidth;
168 }
169
170 return width;
171 }
172
173 public static int calculateStringWidth(FacesContext facesContext, UIComponent component, String text) {
174 int width = 0;
175 int defaultCharWidth = 0;
176 try {
177 defaultCharWidth = ThemeConfig.getValue(facesContext, component, "fontWidth");
178 } catch (NullPointerException e) {
179 if (LOG.isDebugEnabled()) {
180 LOG.debug("no value for \"fontWidth\" found in theme-config");
181 }
182 }
183
184 String fontWidths = ResourceManagerUtil.getProperty(facesContext, "tobago", "tobago.font.widths");
185
186 for (char c : text.toCharArray()) {
187 int charWidth;
188 if (c >= 32 && c < 128) {
189 int begin = (c - 32) * 2;
190 charWidth = Integer.parseInt(fontWidths.substring(begin, begin + 2), 16);
191 } else {
192 charWidth = defaultCharWidth;
193 }
194 width += charWidth;
195 }
196
197 return width;
198 }
199 }