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.commons.lang.StringUtils;
025 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_LABEL;
026 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_VALUE;
027 import static org.apache.myfaces.tobago.TobagoConstants.RENDERER_TYPE_LABEL;
028
029 import javax.faces.component.UIComponent;
030 import java.util.Locale;
031
032 public final class LabelWithAccessKey {
033
034 private static final Log LOG = LogFactory.getLog(LabelWithAccessKey.class);
035
036 private String text;
037 private Character accessKey;
038 private int pos = -1;
039 public static final char INDICATOR = '_';
040 public static final String ESCAPED_INDICATOR = "__";
041
042 public LabelWithAccessKey(UIComponent component) {
043 Object value;
044 if (RENDERER_TYPE_LABEL.equals(component.getRendererType())) {
045 value = component.getAttributes().get(ATTR_VALUE);
046 } else {
047 value = component.getAttributes().get(ATTR_LABEL);
048 }
049 text = (value == null) ? null : String.valueOf(value);
050 setup(text);
051 }
052
053 private void findIndicator(String label, int index, int escapedIndicatorCount) {
054 index = label.indexOf(INDICATOR, index);
055 if (index == -1) {
056 text = label;
057 } else if (index == label.length() - 1) {
058 LOG.warn(INDICATOR + " in label is last char, this is not allowed"
059 + "label='" + label + "'.");
060 text = label.substring(0, label.length() - 1);
061 pos = -1;
062 } else if (label.charAt(index + 1) == INDICATOR) {
063 escapedIndicatorCount++;
064 findIndicator(label, index + 2, escapedIndicatorCount);
065 } else {
066 text = label.substring(0, index)
067 + label.substring(index + 1);
068 accessKey = text.charAt(index);
069 pos = index - escapedIndicatorCount;
070 }
071 }
072
073 public void setup(String label) {
074 if (label != null) {
075 findIndicator(label, 0, 0);
076 text = StringUtils.replace(text, ESCAPED_INDICATOR, String.valueOf(INDICATOR));
077 } else {
078 if (accessKey != null && text != null) {
079 pos = text.toLowerCase(Locale.ENGLISH).indexOf(
080 Character.toLowerCase(accessKey.charValue()));
081 }
082 }
083 }
084
085 public void reset() {
086 text = null;
087 accessKey = null;
088 pos = -1;
089 }
090
091 public String getText() {
092 return text;
093 }
094
095 public Character getAccessKey() {
096 return accessKey;
097 }
098
099 public int getPos() {
100 return pos;
101 }
102
103 public void setText(String text) {
104 this.text = text;
105 }
106
107 public void setAccessKey(Character accessKey) {
108 this.accessKey = accessKey;
109 }
110
111 }