KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > fop > fo > flow > BasicLink


1 /*
2  * $Id: BasicLink.java,v 1.8.2.8 2003/04/11 00:24:38 pietsch Exp $
3  * ============================================================================
4  * The Apache Software License, Version 1.1
5  * ============================================================================
6  *
7  * Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without modifica-
10  * tion, are permitted provided that the following conditions are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright notice,
16  * this list of conditions and the following disclaimer in the documentation
17  * and/or other materials provided with the distribution.
18  *
19  * 3. The end-user documentation included with the redistribution, if any, must
20  * include the following acknowledgment: "This product includes software
21  * developed by the Apache Software Foundation (http://www.apache.org/)."
22  * Alternately, this acknowledgment may appear in the software itself, if
23  * and wherever such third-party acknowledgments normally appear.
24  *
25  * 4. The names "FOP" and "Apache Software Foundation" must not be used to
26  * endorse or promote products derived from this software without prior
27  * written permission. For written permission, please contact
28  * apache@apache.org.
29  *
30  * 5. Products derived from this software may not be called "Apache", nor may
31  * "Apache" appear in their name, without prior written permission of the
32  * Apache Software Foundation.
33  *
34  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
35  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
36  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
37  * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
38  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
39  * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
40  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
41  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
42  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
43  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44  * ============================================================================
45  *
46  * This software consists of voluntary contributions made by many individuals
47  * on behalf of the Apache Software Foundation and was originally created by
48  * James Tauber <jtauber@jtauber.com>. For more information on the Apache
49  * Software Foundation, please see <http://www.apache.org/>.
50  */

51 package org.apache.fop.fo.flow;
52
53 // FOP
54
import org.apache.fop.fo.*;
55 import org.apache.fop.apps.FOPException;
56 import org.apache.fop.fo.properties.*;
57 import org.apache.fop.layout.*;
58
59 public class BasicLink extends Inline {
60
61     public static class Maker extends FObj.Maker {
62         public FObj make(FObj parent, PropertyList propertyList,
63                          String JavaDoc systemId, int line, int column)
64             throws FOPException {
65             return new BasicLink(parent, propertyList, systemId, line, column);
66         }
67     }
68
69     public static FObj.Maker maker() {
70         return new BasicLink.Maker();
71     }
72
73     public BasicLink(FObj parent, PropertyList propertyList,
74                      String JavaDoc systemId, int line, int column) throws FOPException {
75         super(parent, propertyList, systemId, line, column);
76     }
77
78     public String JavaDoc getName() {
79         return "fo:basic-link";
80     }
81
82     public int layout(Area area) throws FOPException {
83         String JavaDoc destination;
84         int linkType;
85
86         // Common Accessibility Properties
87
AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
88
89         // Common Aural Properties
90
AuralProps mAurProps = propMgr.getAuralProps();
91
92         // Common Border, Padding, and Background Properties
93
BorderAndPadding bap = propMgr.getBorderAndPadding();
94         BackgroundProps bProps = propMgr.getBackgroundProps();
95
96         // Common Margin Properties-Inline
97
MarginInlineProps mProps = propMgr.getMarginInlineProps();
98
99         // Common Relative Position Properties
100
RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
101
102         // this.properties.get("alignment-adjust");
103
// this.properties.get("alignment-baseline");
104
// this.properties.get("baseline-shift");
105
// this.properties.get("destination-place-offset");
106
// this.properties.get("dominant-baseline");
107
// this.properties.get("external-destination");
108
// this.properties.get("id");
109
// this.properties.get("indicate-destination");
110
// this.properties.get("internal-destination");
111
// this.properties.get("keep-together");
112
// this.properties.get("keep-with-next");
113
// this.properties.get("keep-with-previous");
114
// this.properties.get("line-height");
115
// this.properties.get("line-height-shift-adjustment");
116
// this.properties.get("show-destination");
117
// this.properties.get("target-processing-context");
118
// this.properties.get("target-presentation-context");
119
// this.properties.get("target-stylesheet");
120

121         if (!(destination =
122                 this.properties.get("internal-destination").getString()).equals("")) {
123             linkType = LinkSet.INTERNAL;
124         } else if (!(destination =
125         this.properties.get("external-destination").getString()).equals("")) {
126             linkType = LinkSet.EXTERNAL;
127             if (destination.startsWith("url(") && destination.endsWith(")")) {
128                 destination = destination.substring(4, destination.length() - 1).trim();
129                 if (destination.startsWith("\"") && destination.endsWith("\"")) {
130                     destination = destination.substring(1, destination.length() - 1);
131                 } else if (destination.startsWith("'") && destination.endsWith("'")) {
132                     destination = destination.substring(1, destination.length() - 1);
133                 }
134             }
135         } else {
136             throw new FOPException("internal-destination or external-destination must be specified in basic-link", systemId, line, column);
137         }
138
139         if (this.marker == START) {
140             // initialize id
141
String JavaDoc id = this.properties.get("id").getString();
142             try {
143                 area.getIDReferences().initializeID(id, area);
144             }
145             catch(FOPException e) {
146                 if (!e.isLocationSet()) {
147                     e.setLocation(systemId, line, column);
148                 }
149                 throw e;
150             }
151             this.marker = 0;
152         }
153
154         // new LinkedArea to gather up inlines
155
LinkSet ls = new LinkSet(destination, area, linkType);
156
157         Page p = area.getPage();
158
159         //AreaContainer ac = p.getBody().getCurrentColumnArea();
160
AreaContainer ac = area.getNearestAncestorAreaContainer();
161         while (ac!=null && ac.getPosition()!=Position.ABSOLUTE) {
162             ac = ac.getNearestAncestorAreaContainer();
163         }
164         if (ac == null) {
165             ac = p.getBody().getCurrentColumnArea();
166             //System.err.println("Using currentColumnArea as AC for link");
167
}
168         if (ac == null) {
169             throw new FOPException("Couldn't get ancestor AreaContainer when processing basic-link", systemId, line, column);
170         }
171
172         int numChildren = this.children.size();
173         for (int i = this.marker; i < numChildren; i++) {
174             FONode fo = (FONode)children.get(i);
175             fo.setLinkSet(ls);
176
177             int status;
178             if (Status.isIncomplete((status = fo.layout(area)))) {
179                 this.marker = i;
180                 return status;
181             }
182         }
183
184         ls.applyAreaContainerOffsets(ac, area);
185
186         // pass on command line
187
String JavaDoc mergeLinks = System.getProperty("links.merge");
188         if ((null == mergeLinks) || mergeLinks.equalsIgnoreCase("yes")) {
189             ls.mergeLinks();
190         }
191
192         p.addLinkSet(ls);
193
194         return Status.OK;
195     }
196
197 }
198
Popular Tags