/* * This file is part of "SnipSnap Radeox Rendering Engine". * * Copyright (c) 2002 Stephan J. Schmidt, Matthias L. Jugel * All Rights Reserved. * * Please visit http://radeox.org/ for updates and contact. * * --LICENSE NOTICE-- * 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. * --LICENSE NOTICE-- */ package org.radeox.macro.list; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.radeox.util.Linkable; import org.radeox.util.Nameable; /** * Formats a list as AtoZ listing separated by the alphabetical characters. * * @author Matthias L. Jugel * @version $Id: AtoZListFormatter.java 7707 2006-04-12 17:30:19Z * ian@caret.cam.ac.uk $ */ public class AtoZListFormatter implements ListFormatter { public String getName() { return "atoz"; } /** * Create an A to Z index */ public void format(Writer writer, Linkable current, String listComment, Collection c, String emptyText, boolean showSize) throws IOException { if (c.size() > 0) { Iterator it = c.iterator(); Map atozMap = new HashMap(); List numberRestList = new ArrayList(); List otherRestList = new ArrayList(); while (it.hasNext()) { Object object = it.next(); String name, indexChar; if (object instanceof Nameable) { name = ((Nameable) object).getName(); } else { name = object.toString(); } indexChar = name.substring(0, 1).toUpperCase(); if (object instanceof Linkable) { name = ((Linkable) object).getLink(); } if (indexChar.charAt(0) >= 'A' && indexChar.charAt(0) <= 'Z') { if (!atozMap.containsKey(indexChar)) { atozMap.put(indexChar, new ArrayList()); } List list = (List) atozMap.get(indexChar); list.add(name); } else if (indexChar.charAt(0) >= '0' && indexChar.charAt(0) <= '9') { numberRestList.add(name); } else { otherRestList.add(name); } } writer .write("<table width=\"100%\" class=\"index-top\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">"); for (int idxChar = 'A'; idxChar <= 'Z';) { writer.write("<tr>"); for (int i = 0; i < 6 && idxChar + i <= 'Z'; i++) { String ch = "" + (char) (idxChar + i); writer.write("<th><b>  <a href=\""); writer.write(current.getLink()); writer.write("#idx" + ch + "\">"); writer.write(ch); writer.write("</a></b></th>"); writer.write("<th>...</th><th>"); writer.write("" + (atozMap.get(ch) == null ? 0 : ((List) atozMap .get(ch)).size())); writer.write("  </th>"); } idxChar += 6; if (idxChar >= 'Z') { writer.write("<th><b>  <a href=\""); writer.write(current.getLink()); writer.write("#idx0-9\">0-9</a></b></th>"); writer.write("<th>...</th><th>"); writer.write("" + numberRestList.size()); writer.write("  </th>"); writer.write("<th><b>  <a href=\""); writer.write(current.getLink()); writer.write("#idxAT\">@</a></b></th>"); writer.write("<th>...</th><th>"); writer.write("" + otherRestList.size()); writer.write("  </th>"); writer.write("<th></th><th></th><th></th><th></th>"); writer.write("<th></th><th></th><th></th><th></th>"); } writer.write("</tr>"); } writer.write("</table>"); writer.write("<div class=\"list-title\">"); writer.write(listComment); if (showSize) { writer.write(" ("); writer.write("" + c.size()); writer.write(")"); } writer.write("</div>"); writer .write("<table width=\"100%\" class=\"index\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">"); for (int ch = 'A'; ch <= 'Z'; ch += 2) { String left = "" + (char) ch; String right = "" + (char) (ch + 1); insertCharHeader(writer, left, right); addRows(writer, (List) atozMap.get(left), (List) atozMap .get(right)); } insertCharHeader(writer, "0-9", "@"); addRows(writer, numberRestList, otherRestList); writer.write("</table>"); } else { writer.write(emptyText); } } private void addRows(Writer writer, List listLeft, List listRight) throws IOException { Iterator leftIt = listLeft != null ? listLeft.iterator() : new EmptyIterator(); Iterator rightIt = listRight != null ? listRight.iterator() : new EmptyIterator(); while (leftIt.hasNext() || rightIt.hasNext()) { String leftName = (String) (leftIt != null && leftIt.hasNext() ? leftIt .next() : null); String rightName = (String) (rightIt != null && rightIt.hasNext() ? rightIt .next() : null); insertRow(writer, leftName, rightName, false); } } private void insertCharHeader(Writer writer, String leftHeader, String rightHeader) throws IOException { writer.write("<tr><th>"); writer.write("<b><a name=\"idx"); writer.write("@".equals(leftHeader) ? "AT" : leftHeader); writer.write("\"></a>"); writer.write(leftHeader); writer.write("</b></th><th> </th><th>"); writer.write("<b><a name=\"idx"); writer.write("@".equals(rightHeader) ? "AT" : rightHeader); writer.write("\"></a>"); writer.write(rightHeader); writer.write("</b></th></tr>"); } private void insertRow(Writer writer, String left, String right, boolean odd) throws IOException { writer.write("<tr><td>"); if (left != null) { writer.write(left); } writer.write("</td><td> </td><td>"); if (right != null) { writer.write(right); } writer.write("</td></tr>"); } private class EmptyIterator implements Iterator { public boolean hasNext() { return false; } public Object next() { return null; } public void remove() { } } }