From 6025b6016517c6d898d8957d1d7e03ba71431912 Mon Sep 17 00:00:00 2001 From: tknall Date: Fri, 1 Dec 2006 12:20:24 +0000 Subject: Initial import of release 2.2. git-svn-id: https://joinup.ec.europa.eu/svn/pdf-as/trunk@4 7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c --- .../com/lowagie/text/pdf/events/IndexEvents.java | 401 +++++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 src/main/java/com/lowagie/text/pdf/events/IndexEvents.java (limited to 'src/main/java/com/lowagie/text/pdf/events/IndexEvents.java') diff --git a/src/main/java/com/lowagie/text/pdf/events/IndexEvents.java b/src/main/java/com/lowagie/text/pdf/events/IndexEvents.java new file mode 100644 index 0000000..13925a5 --- /dev/null +++ b/src/main/java/com/lowagie/text/pdf/events/IndexEvents.java @@ -0,0 +1,401 @@ +/* + * Copyright 2005 by Michael Niedermair. + * + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the License. + * + * The Original Code is 'iText, a free JAVA-PDF library'. + * + * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by + * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie. + * All Rights Reserved. + * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer + * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved. + * + * Contributor(s): all the names of the contributors are added in the source code + * where applicable. + * + * Alternatively, the contents of this file may be used under the terms of the + * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the + * provisions of LGPL are applicable instead of those above. If you wish to + * allow use of your version of this file only under the terms of the LGPL + * License and not to allow others to use your version of this file under + * the MPL, indicate your decision by deleting the provisions above and + * replace them with the notice and other provisions required by the LGPL. + * If you do not delete the provisions above, a recipient may use your version + * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE. + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the MPL as stated above or under the terms of the GNU + * Library General Public License as published by the Free Software Foundation; + * either version 2 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more + * details. + * + * If you didn't download this code from the following link, you should check if + * you aren't using an obsolete version: + * http://www.lowagie.com/iText/ + */ +package com.lowagie.text.pdf.events; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import com.lowagie.text.Chunk; +import com.lowagie.text.Document; +import com.lowagie.text.Rectangle; +import com.lowagie.text.pdf.PdfPageEventHelper; +import com.lowagie.text.pdf.PdfWriter; + +/** + * Class for an index. + * + * @author Michael Niedermair + */ +public class IndexEvents extends PdfPageEventHelper { + + /** + * keeps the indextag with the pagenumber + */ + private Map indextag = new TreeMap(); + + /** + * All the text that is passed to this event, gets registered in the indexentry. + * + * @see com.lowagie.text.pdf.PdfPageEventHelper#onGenericTag( + * com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document, + * com.lowagie.text.Rectangle, java.lang.String) + */ + public void onGenericTag(PdfWriter writer, Document document, + Rectangle rect, String text) { + indextag.put(text, new Integer(writer.getPageNumber())); + } + + // -------------------------------------------------------------------- + /** + * indexcounter + */ + private long indexcounter = 0; + + /** + * the list for the index entry + */ + private List indexentry = new ArrayList(); + + /** + * Create an index entry. + * + * @param text The text for the Chunk. + * @param in1 The first level. + * @param in2 The second level. + * @param in3 The third level. + * @return Returns the Chunk. + */ + public Chunk create(final String text, final String in1, final String in2, + final String in3) { + + Chunk chunk = new Chunk(text); + String tag = "idx_" + String.valueOf(indexcounter++); + chunk.setGenericTag(tag); + chunk.setLocalDestination(tag); + Entry entry = new Entry(in1, in2, in3, tag); + indexentry.add(entry); + return chunk; + } + + /** + * Create an index entry. + * + * @param text The text for the Chunk. + * @param in1 The first level. + * @return Returns the Chunk. + */ + public Chunk create(final String text, final String in1) { + return create(text, in1, "", ""); + } + + /** + * Create an index entry. + * + * @param text The text for the Chunk. + * @param in1 The first level. + * @param in2 The second level. + * @return Returns the Chunk. + */ + public Chunk create(final String text, final String in1, final String in2) { + return create(text, in1, in2, ""); + } + + /** + * Create an index entry. + * + * @param text The text. + * @param in1 The first level. + * @param in2 The second level. + * @param in3 The third level. + */ + public void create(final Chunk text, final String in1, final String in2, + final String in3) { + + String tag = "idx_" + String.valueOf(indexcounter++); + text.setGenericTag(tag); + text.setLocalDestination(tag); + Entry entry = new Entry(in1, in2, in3, tag); + indexentry.add(entry); + } + + /** + * Create an index entry. + * + * @param text The text. + * @param in1 The first level. + */ + public void create(final Chunk text, final String in1) { + create(text, in1, "", ""); + } + + /** + * Create an index entry. + * + * @param text The text. + * @param in1 The first level. + * @param in2 The second level. + */ + public void create(final Chunk text, final String in1, final String in2) { + create(text, in1, in2, ""); + } + + /** + * Comparator for sorting the index + */ + private Comparator comparator = new Comparator() { + + public int compare(Object arg0, Object arg1) { + Entry en1 = (Entry) arg0; + Entry en2 = (Entry) arg1; + + int rt = 0; + if (en1.getIn1() != null && en2.getIn1() != null) { + if ((rt = en1.getIn1().compareToIgnoreCase(en2.getIn1())) == 0) { + // in1 equals + if (en1.getIn2() != null && en2.getIn2() != null) { + if ((rt = en1.getIn2() + .compareToIgnoreCase(en2.getIn2())) == 0) { + // in2 equals + if (en1.getIn3() != null && en2.getIn3() != null) { + rt = en1.getIn3().compareToIgnoreCase( + en2.getIn3()); + } + } + } + } + } + return rt; + } + }; + + /** + * Set the comparator. + * @param aComparator The comparator to set. + */ + public void setComparator(Comparator aComparator) { + comparator = aComparator; + } + + /** + * Returns the sorted list with the entries and the collected page numbers. + * @return Returns the sorted list with the entries and teh collected page numbers. + */ + public List getSortedEntries() { + + Map grouped = new HashMap(); + + for (int i = 0; i < indexentry.size(); i++) { + Entry e = (Entry) indexentry.get(i); + String key = e.getKey(); + + Entry master = (Entry) grouped.get(key); + if (master != null) { + master.addPageNumberAndTag(e.getPageNumber(), e.getTag()); + } else { + e.addPageNumberAndTag(e.getPageNumber(), e.getTag()); + grouped.put(key, e); + } + } + + // copy to a list and sort it + List sorted = new ArrayList(grouped.size()); + Iterator it = grouped.keySet().iterator(); + while (it.hasNext()) { + String key = (String) it.next(); + Entry e = (Entry) grouped.get(key); + sorted.add(e); + } + Collections.sort(sorted, comparator); + return sorted; + } + + // -------------------------------------------------------------------- + /** + * Class for an index entry. + *

+ * In the first step, only in1, in2,in3 and tag are used. + * After the collections of the index entries, pagenumbers are used. + *

+ */ + public class Entry { + + /** + * first level + */ + private String in1; + + /** + * second level + */ + private String in2; + + /** + * third level + */ + private String in3; + + /** + * the tag + */ + private String tag; + + /** + * the lsit of all page numbers. + */ + private List pagenumbers = new ArrayList(); + + /** + * the lsit of all tags. + */ + private List tags = new ArrayList(); + + /** + * Create a new object. + * @param aIn1 The first level. + * @param aIn2 The second level. + * @param aIn3 The third level. + * @param aTag The tag. + */ + public Entry(final String aIn1, final String aIn2, final String aIn3, + final String aTag) { + in1 = aIn1; + in2 = aIn2; + in3 = aIn3; + tag = aTag; + } + + /** + * Returns the in1. + * @return Returns the in1. + */ + public String getIn1() { + return in1; + } + + /** + * Returns the in2. + * @return Returns the in2. + */ + public String getIn2() { + return in2; + } + + /** + * Returns the in3. + * @return Returns the in3. + */ + public String getIn3() { + return in3; + } + + /** + * Returns the tag. + * @return Returns the tag. + */ + public String getTag() { + return tag; + } + + /** + * Returns the pagenumer for this entry. + * @return Returns the pagenumer for this entry. + */ + public int getPageNumber() { + int rt = -1; + Integer i = (Integer) indextag.get(tag); + if (i != null) { + rt = i.intValue(); + } + return rt; + } + + /** + * Add a pagenumber. + * @param number The page number. + * @param tag + */ + public void addPageNumberAndTag(final int number, final String tag) { + pagenumbers.add(new Integer(number)); + tags.add(tag); + } + + /** + * Returns the key for the map-entry. + * @return Returns the key for the map-entry. + */ + public String getKey() { + return in1 + "!" + in2 + "!" + in3; + } + + /** + * Returns the pagenumbers. + * @return Returns the pagenumbers. + */ + public List getPagenumbers() { + return pagenumbers; + } + + /** + * Returns the tags. + * @return Returns the tags. + */ + public List getTags() { + return tags; + } + + /** + * print the entry (only for test) + * @return the toString implementation of the entry + */ + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append(in1).append(" "); + buf.append(in2).append(" "); + buf.append(in3).append(" "); + for (int i = 0; i < pagenumbers.size(); i++) { + buf.append(pagenumbers.get(i)).append(" "); + } + return buf.toString(); + } + } +} \ No newline at end of file -- cgit v1.2.3