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.component; 021 022 import org.apache.commons.logging.Log; 023 import org.apache.commons.logging.LogFactory; 024 import org.apache.myfaces.tobago.util.LayoutUtil; 025 026 import java.util.StringTokenizer; 027 import java.util.List; 028 import java.util.ArrayList; 029 030 /* 031 * Date: May 2, 2007 032 * Time: 1:11:25 PM 033 */ 034 public class LayoutTokens { 035 036 private static final Log LOG = LogFactory.getLog(LayoutTokens.class); 037 038 private List<LayoutToken> tokens = new ArrayList<LayoutToken>(); 039 040 public int getSize() { 041 return tokens.size(); 042 } 043 044 public void set(int index, LayoutToken token) { 045 tokens.set(index, token); 046 } 047 048 public boolean isEmpty() { 049 return getSize() == 0; 050 } 051 052 public LayoutToken get(int index) { 053 return tokens.get(index); 054 } 055 056 public void shrinkSizeTo(int size) { 057 for (int i = getSize() - 1; i >= size; i--) { 058 tokens.remove(i); 059 } 060 } 061 062 public void ensureSize(int size, LayoutToken token) { 063 for (int index = getSize(); index < size; index++) { 064 addToken(token); 065 } 066 } 067 068 public void addToken(LayoutToken token) { 069 tokens.add(token); 070 } 071 072 public static LayoutTokens parse(String[] tokens) { 073 LayoutTokens layoutTokens = new LayoutTokens(); 074 for (String token : tokens) { 075 parseToken(token, layoutTokens); 076 } 077 return layoutTokens; 078 } 079 080 public static LayoutTokens parse(String tokens) { 081 return parse(tokens, null); 082 } 083 084 public static LayoutTokens parse(String tokens, LayoutToken defaultToken) { 085 LayoutTokens layoutTokens = new LayoutTokens(); 086 if (tokens == null) { 087 layoutTokens.addToken(defaultToken); 088 return layoutTokens; 089 } 090 StringTokenizer tokenizer = new StringTokenizer(tokens, ";"); 091 092 while (tokenizer.hasMoreTokens()) { 093 String token = tokenizer.nextToken().trim(); 094 parseToken(token, layoutTokens); 095 } 096 return layoutTokens; 097 } 098 099 private static void parseToken(String token, LayoutTokens layoutTokens) { 100 LayoutToken layoutToken = parseToken(token); 101 if (layoutToken != null) { 102 layoutTokens.addToken(layoutToken); 103 } 104 } 105 106 public static LayoutToken parseToken(String token) { 107 try { 108 if ("*".equals(token)) { 109 return RelativeLayoutToken.DEFAULT_INSTANCE; 110 } else if (token.equals("fixed")) { 111 return FixedLayoutToken.INSTANCE; 112 } else if (token.equals("minimum")) { 113 return new MinimumLayoutToken(); 114 } else if (isPixelToken(token)) { 115 return new PixelLayoutToken(Integer.parseInt(LayoutUtil.removeSuffix(token, PixelLayoutToken.SUFFIX))); 116 } else if (isPercentToken(token)) { 117 return new PercentLayoutToken(Integer.parseInt(LayoutUtil.removeSuffix(token, PercentLayoutToken.SUFFIX))); 118 } else if (isRelativeToken(token)) { 119 return new RelativeLayoutToken(Integer.parseInt(LayoutUtil.removeSuffix(token, RelativeLayoutToken.SUFFIX))); 120 } else { 121 LOG.error("Ignoring unknown layout token '" + token + "'"); 122 } 123 } catch (NumberFormatException e) { 124 LOG.error("Error parsing layout token '" + token + "'", e); 125 } 126 return null; 127 } 128 129 static boolean isPixelToken(String token) { 130 return LayoutUtil.isNumberAndSuffix(token, PixelLayoutToken.SUFFIX); 131 } 132 133 static boolean isPercentToken(String token) { 134 return LayoutUtil.isNumberAndSuffix(token, PercentLayoutToken.SUFFIX); 135 } 136 137 static boolean isRelativeToken(String token) { 138 return LayoutUtil.isNumberAndSuffix(token, RelativeLayoutToken.SUFFIX); 139 } 140 141 public String toString() { 142 StringBuilder str = new StringBuilder(); 143 for (LayoutToken token : tokens) { 144 str.append(token); 145 str.append(";"); 146 } 147 return str.toString(); 148 } 149 150 } 151