1 /* 2 * $Id$ 3 * 4 * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie. 5 * 6 * The contents of this file are subject to the Mozilla Public License Version 1.1 7 * (the "License"); you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at http://www.mozilla.org/MPL/ 9 * 10 * Software distributed under the License is distributed on an "AS IS" basis, 11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 12 * for the specific language governing rights and limitations under the License. 13 * 14 * The Original Code is 'iText, a free JAVA-PDF library'. 15 * 16 * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by 17 * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie. 18 * All Rights Reserved. 19 * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer 20 * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved. 21 * 22 * Contributor(s): all the names of the contributors are added in the source code 23 * where applicable. 24 * 25 * Alternatively, the contents of this file may be used under the terms of the 26 * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the 27 * provisions of LGPL are applicable instead of those above. If you wish to 28 * allow use of your version of this file only under the terms of the LGPL 29 * License and not to allow others to use your version of this file under 30 * the MPL, indicate your decision by deleting the provisions above and 31 * replace them with the notice and other provisions required by the LGPL. 32 * If you do not delete the provisions above, a recipient may use your version 33 * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE. 34 * 35 * This library is free software; you can redistribute it and/or modify it 36 * under the terms of the MPL as stated above or under the terms of the GNU 37 * Library General Public License as published by the Free Software Foundation; 38 * either version 2 of the License, or any later version. 39 * 40 * This library is distributed in the hope that it will be useful, but WITHOUT 41 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 42 * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more 43 * details. 44 * 45 * If you didn't download this code from the following link, you should check if 46 * you aren't using an obsolete version: 47 * http://www.lowagie.com/iText/ 48 */ 49 50 package com.lowagie.text; 51 52 import java.net.MalformedURLException; 53 import java.net.URL; 54 import java.util.ArrayList; 55 import java.util.Iterator; 56 57 /** 58 * An <CODE>Anchor</CODE> can be a reference or a destination of a reference. 59 * <P> 60 * An <CODE>Anchor</CODE> is a special kind of <CODE>Phrase</CODE>. 61 * It is constructed in the same way. 62 * <P> 63 * Example: 64 * <BLOCKQUOTE><PRE> 65 * <STRONG>Anchor anchor = new Anchor("this is a link");</STRONG> 66 * <STRONG>anchor.setName("LINK");</STRONG> 67 * <STRONG>anchor.setReference("http://www.lowagie.com");</STRONG> 68 * </PRE></BLOCKQUOTE> 69 * 70 * @see Element 71 * @see Phrase 72 */ 73 74 public class Anchor extends Phrase { 75 76 // constant 77 private static final long serialVersionUID = -852278536049236911L; 78 79 // membervariables 80 81 /** This is the name of the <CODE>Anchor</CODE>. */ 82 protected String name = null; 83 84 /** This is the reference of the <CODE>Anchor</CODE>. */ 85 protected String reference = null; 86 87 // constructors 88 89 /** 90 * Constructs an <CODE>Anchor</CODE> without specifying a leading. 91 */ Anchor()92 public Anchor() { 93 super(16); 94 } 95 96 /** 97 * Constructs an <CODE>Anchor</CODE> with a certain leading. 98 * 99 * @param leading the leading 100 */ 101 Anchor(float leading)102 public Anchor(float leading) { 103 super(leading); 104 } 105 106 /** 107 * Constructs an <CODE>Anchor</CODE> with a certain <CODE>Chunk</CODE>. 108 * 109 * @param chunk a <CODE>Chunk</CODE> 110 */ Anchor(Chunk chunk)111 public Anchor(Chunk chunk) { 112 super(chunk); 113 } 114 115 /** 116 * Constructs an <CODE>Anchor</CODE> with a certain <CODE>String</CODE>. 117 * 118 * @param string a <CODE>String</CODE> 119 */ Anchor(String string)120 public Anchor(String string) { 121 super(string); 122 } 123 124 /** 125 * Constructs an <CODE>Anchor</CODE> with a certain <CODE>String</CODE> 126 * and a certain <CODE>Font</CODE>. 127 * 128 * @param string a <CODE>String</CODE> 129 * @param font a <CODE>Font</CODE> 130 */ Anchor(String string, Font font)131 public Anchor(String string, Font font) { 132 super(string, font); 133 } 134 135 /** 136 * Constructs an <CODE>Anchor</CODE> with a certain <CODE>Chunk</CODE> 137 * and a certain leading. 138 * 139 * @param leading the leading 140 * @param chunk a <CODE>Chunk</CODE> 141 */ Anchor(float leading, Chunk chunk)142 public Anchor(float leading, Chunk chunk) { 143 super(leading, chunk); 144 } 145 146 /** 147 * Constructs an <CODE>Anchor</CODE> with a certain leading 148 * and a certain <CODE>String</CODE>. 149 * 150 * @param leading the leading 151 * @param string a <CODE>String</CODE> 152 */ Anchor(float leading, String string)153 public Anchor(float leading, String string) { 154 super(leading, string); 155 } 156 157 /** 158 * Constructs an <CODE>Anchor</CODE> with a certain leading, 159 * a certain <CODE>String</CODE> and a certain <CODE>Font</CODE>. 160 * 161 * @param leading the leading 162 * @param string a <CODE>String</CODE> 163 * @param font a <CODE>Font</CODE> 164 */ Anchor(float leading, String string, Font font)165 public Anchor(float leading, String string, Font font) { 166 super(leading, string, font); 167 } 168 169 /** 170 * Constructs an <CODE>Anchor</CODE> with a certain <CODE>Phrase</CODE>. 171 * 172 * @param phrase a <CODE>Phrase</CODE> 173 */ Anchor(Phrase phrase)174 public Anchor(Phrase phrase) { 175 super(phrase); 176 if (phrase instanceof Anchor) { 177 Anchor a = (Anchor) phrase; 178 setName(a.name); 179 setReference(a.reference); 180 } 181 } 182 183 // implementation of the Element-methods 184 185 /** 186 * Processes the element by adding it (or the different parts) to an 187 * <CODE>ElementListener</CODE>. 188 * 189 * @param listener an <CODE>ElementListener</CODE> 190 * @return <CODE>true</CODE> if the element was processed successfully 191 */ process(ElementListener listener)192 public boolean process(ElementListener listener) { 193 try { 194 Chunk chunk; 195 Iterator i = getChunks().iterator(); 196 boolean localDestination = (reference != null && reference.startsWith("#")); 197 boolean notGotoOK = true; 198 while (i.hasNext()) { 199 chunk = (Chunk) i.next(); 200 if (name != null && notGotoOK && !chunk.isEmpty()) { 201 chunk.setLocalDestination(name); 202 notGotoOK = false; 203 } 204 if (localDestination) { 205 chunk.setLocalGoto(reference.substring(1)); 206 } 207 listener.add(chunk); 208 } 209 return true; 210 } 211 catch(DocumentException de) { 212 return false; 213 } 214 } 215 216 /** 217 * Gets all the chunks in this element. 218 * 219 * @return an <CODE>ArrayList</CODE> 220 */ getChunks()221 public ArrayList getChunks() { 222 ArrayList tmp = new ArrayList(); 223 Chunk chunk; 224 Iterator i = iterator(); 225 boolean localDestination = (reference != null && reference.startsWith("#")); 226 boolean notGotoOK = true; 227 while (i.hasNext()) { 228 chunk = (Chunk) i.next(); 229 if (name != null && notGotoOK && !chunk.isEmpty()) { 230 chunk.setLocalDestination(name); 231 notGotoOK = false; 232 } 233 if (localDestination) { 234 chunk.setLocalGoto(reference.substring(1)); 235 } 236 else if (reference != null) 237 chunk.setAnchor(reference); 238 tmp.add(chunk); 239 } 240 return tmp; 241 } 242 243 /** 244 * Gets the type of the text element. 245 * 246 * @return a type 247 */ type()248 public int type() { 249 return Element.ANCHOR; 250 } 251 252 // methods 253 254 /** 255 * Sets the name of this <CODE>Anchor</CODE>. 256 * 257 * @param name a new name 258 */ setName(String name)259 public void setName(String name) { 260 this.name = name; 261 } 262 263 /** 264 * Sets the reference of this <CODE>Anchor</CODE>. 265 * 266 * @param reference a new reference 267 */ setReference(String reference)268 public void setReference(String reference) { 269 this.reference = reference; 270 } 271 272 // methods to retrieve information 273 274 /** 275 * Returns the name of this <CODE>Anchor</CODE>. 276 * 277 * @return a name 278 */ getName()279 public String getName() { 280 return name; 281 } 282 283 /** 284 * Gets the reference of this <CODE>Anchor</CODE>. 285 * 286 * @return a reference 287 */ getReference()288 public String getReference() { 289 return reference; 290 } 291 292 /** 293 * Gets the reference of this <CODE>Anchor</CODE>. 294 * 295 * @return an <CODE>URL</CODE> 296 */ getUrl()297 public URL getUrl() { 298 try { 299 return new URL(reference); 300 } 301 catch(MalformedURLException mue) { 302 return null; 303 } 304 } 305 306 } 307