001: /*
002: * Copyright 2005 by Bruno Lowagie
003: *
004: * The contents of this file are subject to the Mozilla Public License Version 1.1
005: * (the "License"); you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at http://www.mozilla.org/MPL/
007: *
008: * Software distributed under the License is distributed on an "AS IS" basis,
009: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
010: * for the specific language governing rights and limitations under the License.
011: *
012: * The Original Code is 'iText, a free JAVA-PDF library'.
013: *
014: * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
015: * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
016: * All Rights Reserved.
017: * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
018: * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
019: *
020: * Contributor(s): all the names of the contributors are added in the source code
021: * where applicable.
022: *
023: * Alternatively, the contents of this file may be used under the terms of the
024: * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
025: * provisions of LGPL are applicable instead of those above. If you wish to
026: * allow use of your version of this file only under the terms of the LGPL
027: * License and not to allow others to use your version of this file under
028: * the MPL, indicate your decision by deleting the provisions above and
029: * replace them with the notice and other provisions required by the LGPL.
030: * If you do not delete the provisions above, a recipient may use your version
031: * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
032: *
033: * This library is free software; you can redistribute it and/or modify it
034: * under the terms of the MPL as stated above or under the terms of the GNU
035: * Library General Public License as published by the Free Software Foundation;
036: * either version 2 of the License, or any later version.
037: *
038: * This library is distributed in the hope that it will be useful, but WITHOUT
039: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
040: * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
041: * details.
042: *
043: * If you didn't download this code from the following link, you should check if
044: * you aren't using an obsolete version:
045: * http://www.lowagie.com/iText/
046: */
047: package com.lowagie.text.pdf.events;
048:
049: import java.io.IOException;
050: import java.util.HashMap;
051:
052: import com.lowagie.text.Document;
053: import com.lowagie.text.DocumentException;
054: import com.lowagie.text.ExceptionConverter;
055: import com.lowagie.text.Rectangle;
056: import com.lowagie.text.pdf.PdfContentByte;
057: import com.lowagie.text.pdf.PdfFormField;
058: import com.lowagie.text.pdf.PdfName;
059: import com.lowagie.text.pdf.PdfPCell;
060: import com.lowagie.text.pdf.PdfPCellEvent;
061: import com.lowagie.text.pdf.PdfPageEventHelper;
062: import com.lowagie.text.pdf.PdfRectangle;
063: import com.lowagie.text.pdf.PdfWriter;
064: import com.lowagie.text.pdf.TextField;
065:
066: /**
067: * Class for an index.
068: *
069: * @author Michael Niedermair
070: */
071: public class FieldPositioningEvents extends PdfPageEventHelper
072: implements PdfPCellEvent {
073:
074: /**
075: * Keeps a map with fields that are to be positioned in inGenericTag.
076: */
077: protected HashMap genericChunkFields = new HashMap();
078:
079: /**
080: * Keeps the form field that is to be positioned in a cellLayout event.
081: */
082: protected PdfFormField cellField = null;
083:
084: /**
085: * The PdfWriter to use when a field has to added in a cell event.
086: */
087: protected PdfWriter fieldWriter = null;
088: /**
089: * The PdfFormField that is the parent of the field added in a cell event.
090: */
091: protected PdfFormField parent = null;
092:
093: /** Creates a new event. This constructor will be used if you need to position fields with Chunk objects. */
094: public FieldPositioningEvents() {
095: }
096:
097: /** Some extra padding that will be taken into account when defining the widget. */
098: public float padding;
099:
100: /**
101: * Add a PdfFormField that has to be tied to a generic Chunk.
102: */
103: public void addField(String text, PdfFormField field) {
104: genericChunkFields.put(text, field);
105: }
106:
107: /** Creates a new event. This constructor will be used if you need to position fields with a Cell Event. */
108: public FieldPositioningEvents(PdfWriter writer, PdfFormField field) {
109: this .cellField = field;
110: this .fieldWriter = writer;
111: }
112:
113: /** Creates a new event. This constructor will be used if you need to position fields with a Cell Event. */
114: public FieldPositioningEvents(PdfFormField parent,
115: PdfFormField field) {
116: this .cellField = field;
117: this .parent = parent;
118: }
119:
120: /** Creates a new event. This constructor will be used if you need to position fields with a Cell Event.
121: * @throws DocumentException
122: * @throws IOException*/
123: public FieldPositioningEvents(PdfWriter writer, String text)
124: throws IOException, DocumentException {
125: this .fieldWriter = writer;
126: TextField tf = new TextField(writer, new Rectangle(0, 0), text);
127: tf.setFontSize(14);
128: cellField = tf.getTextField();
129: }
130:
131: /** Creates a new event. This constructor will be used if you need to position fields with a Cell Event.
132: * @throws DocumentException
133: * @throws IOException*/
134: public FieldPositioningEvents(PdfWriter writer,
135: PdfFormField parent, String text) throws IOException,
136: DocumentException {
137: this .parent = parent;
138: TextField tf = new TextField(writer, new Rectangle(0, 0), text);
139: tf.setFontSize(14);
140: cellField = tf.getTextField();
141: }
142:
143: /**
144: * @param padding The padding to set.
145: */
146: public void setPadding(float padding) {
147: this .padding = padding;
148: }
149:
150: /**
151: * @param parent The parent to set.
152: */
153: public void setParent(PdfFormField parent) {
154: this .parent = parent;
155: }
156:
157: /**
158: * @see com.lowagie.text.pdf.PdfPageEvent#onGenericTag(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document, com.lowagie.text.Rectangle, java.lang.String)
159: */
160: public void onGenericTag(PdfWriter writer, Document document,
161: Rectangle rect, String text) {
162: rect.setBottom(rect.getBottom() - 3);
163: PdfFormField field = (PdfFormField) genericChunkFields
164: .get(text);
165: if (field == null) {
166: TextField tf = new TextField(writer, new Rectangle(rect
167: .getLeft(padding), rect.getBottom(padding), rect
168: .getRight(padding), rect.getTop(padding)), text);
169: tf.setFontSize(14);
170: try {
171: field = tf.getTextField();
172: } catch (Exception e) {
173: throw new ExceptionConverter(e);
174: }
175: } else {
176: field.put(PdfName.RECT, new PdfRectangle(rect
177: .getLeft(padding), rect.getBottom(padding), rect
178: .getRight(padding), rect.getTop(padding)));
179: }
180: if (parent == null)
181: writer.addAnnotation(field);
182: else
183: parent.addKid(field);
184: }
185:
186: /**
187: * @see com.lowagie.text.pdf.PdfPCellEvent#cellLayout(com.lowagie.text.pdf.PdfPCell, com.lowagie.text.Rectangle, com.lowagie.text.pdf.PdfContentByte[])
188: */
189: public void cellLayout(PdfPCell cell, Rectangle rect,
190: PdfContentByte[] canvases) {
191: if (cellField == null
192: || (fieldWriter == null && parent == null))
193: throw new ExceptionConverter(
194: new IllegalArgumentException(
195: "You have used the wrong constructor for this FieldPositioningEvents class."));
196: cellField.put(PdfName.RECT, new PdfRectangle(rect
197: .getLeft(padding), rect.getBottom(padding), rect
198: .getRight(padding), rect.getTop(padding)));
199: if (parent == null)
200: fieldWriter.addAnnotation(cellField);
201: else
202: parent.addKid(cellField);
203: }
204: }
|