/* Copyright (c) 2006 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.gbase.recipe;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
/**
* Methods called from the JSP for generating HTML code.
*
* This is the work normally done by a web framework.
*/
public class DisplayUtils {
/**
* Prints checkboxes on two colums, with a text input field at the end.
* The checked values will be displayed along with the values to be showed.
*
* The text input field can be used to input a custom value. It has the
* same name as the checkbox input fields, so when the submitted values
* are processed, you have to remove the empty value, in case this field
* remains empty.
*
* @param out output writer
* @param name name of the input field
* @param values values to be shown
* @param checked checked values
* @throws IOException
*/
public static void printCheckboxes(Writer out,
String name,
String[] values,
Set<String> checked) throws IOException {
Set<String> allValues = new TreeSet<String>();
// The displayed values are the static values plus the checked values
allValues.addAll(Arrays.asList(values));
if (checked == null) {
checked = new HashSet<String>();
}
allValues.addAll(checked);
int middle = (allValues.size() + 2) / 2;
int row = 0;
out.write("<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">");
out.write("<tr><td><ul class=\"inputlist\">");
for (String value : allValues) {
if (row == middle) {
out.write("</ul></td><td><ul class=\"inputlist\">");
}
out.write("<li>");
printCheckbox(out, name, value, checked.contains(value));
out.write("</li>");
row++;
}
out.write("<li><label>Other:<br/><input id=\"other");
out.write(name);
out.write("\" type=\"text\" name=\"");
out.write(name);
out.write("\" value=\"\" size=\"15\" class=\"txt\"></label></li>");
out.write("</ul></td></tr></table>");
}
/**
* Prints a checkbox input field with a label.
*
* @param out output writer
* @param name name of the field
* @param value value of the field
* @param checked true if the field is checked
* @throws IOException
*/
public static void printCheckbox(Writer out, String name, String value,
boolean checked) throws IOException {
value = escape(value);
out.write("<label><input type=\"checkbox\" name=\"");
out.write(name);
out.write("\" value=\"");
out.write(value);
out.write("\"");
if (checked) {
out.write(" checked");
}
out.write("/> ");
if (checked) {
out.write("<b>");
}
out.write(value);
if (checked) {
out.write("</b>");
}
out.write("</label>");
}
/**
* Escapes the items of the Collection and returns them in a StringBuffer,
* separated by commas.
*
* @param list
* @return list of the elements of the collection, sepparated by commas
*/
public static StringBuffer printList(Collection<String> list) {
StringBuffer sb = new StringBuffer();
if (list != null && list.size() > 0) {
Iterator<String> iter = list.iterator();
while (true) {
sb.append(escape(iter.next()));
if (iter.hasNext()) {
sb.append(", ");
} else {
break;
}
}
}
return sb;
}
/**
* Prints <option> tags and set the selected option.
*
* @param out output writer
* @param names option names, which are used both for
* values and for labels
* @param current name of the current option
* @throws IOException
*/
public static void printOptions(Writer out,
String[] names,
String current) throws IOException {
for (int i=0; i<names.length; i++) {
String name = names[i];
printOption(out, name, name, name.equals(current));
}
printOption(out, "all", "", current==null);
}
/**
* Prints one <option> tag and select it if necessary.
*
* @param out output writer
* @param label option label
* @param value option value
* @param selected true if it's selected
* @throws IOException
*/
public static void printOption(Writer out,
String label,
String value,
boolean selected) throws IOException {
out.write("<option");
if (selected) {
out.write(" selected");
}
out.write(" value=\"");
out.write(value);
out.write("\">");
out.write(escape(label));
out.write("</option>");
}
/**
* Simple HTML escaping of the String version of the specified Object.
*
* @param obj Object that has a meaningful toString() value
* @return string with some escaped characters
*/
public static String escape(Object obj) {
if (obj == null) {
return "";
}
return escapeAndShorten(obj.toString(), -1);
}
/**
* Simple HTML escaping.
*
* Escapes < & and > and leaves the rest as it is.
*
* @param raw
* @return string with some escaped characters
*/
public static String escape(String raw) {
return escapeAndShorten(raw, -1);
}
/**
* Escape HTML data and shorted the result if necessary.
*
* If the text is escaped, <b>...</b> will be
* appended.
*
* @param raw raw text to escape
* @param maxLength maximum output length
* @return HTML code
*/
public static String escapeAndShorten(String raw, int maxLength) {
if (raw == null) {
return "";
}
StringBuilder retval = new StringBuilder();
int length = raw.length();
boolean shortened = false;
if (maxLength != -1 && length > maxLength) {
length = maxLength;
shortened = true;
}
for (int i=0; i<length; i++) {
char c = raw.charAt(i);
switch (c) {
case '<':
retval.append("<");
break;
case '>':
retval.append(">");
break;
case '&':
retval.append("&");
break;
case '\'':
retval.append("'");
break;
case '"':
retval.append(""");
break;
default:
retval.append(c);
break;
}
}
if (shortened) {
retval.append("<b>...</b>");
}
return retval.toString();
}
}