aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop/area/Area.java
blob: fe9832d1eaa2202b41f9fd12c960276caf1efebe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/*
 * $Id$
 * Copyright (C) 2001-2002 The Apache Software Foundation. All rights reserved.
 * For details on use and redistribution please refer to the
 * LICENSE file included with these sources.
 */

package org.apache.fop.area;

import java.io.Serializable;

import java.util.HashMap;

// If the area appears more than once in the output
// or if the area has external data it is cached
// to keep track of it and to minimize rendered output
// renderers can render the output once and display it
// for every occurence
// this should also extend to all outputs (including PDFGraphics2D)
// and all types of renderers

/**
 * Base object for all areas.
 */
public class Area implements Serializable {
    // stacking directions
    /**
     * Stacking left to right
     */
    public static final int LR = 0;

    /**
     * Stacking right to left
     */
    public static final int RL = 1;

    /**
     * Stacking top to bottom
     */
    public static final int TB = 2;

    /**
     * Stacking bottom to top
     */
    public static final int BT = 3;

    // orientations for reference areas
    /**
     * Normal orientation
     */
    public static final int ORIENT_0 = 0;

    /**
     * Rotated 90 degrees clockwise
     */
    public static final int ORIENT_90 = 1;
    
    /**
     * Rotate 180 degrees
     */
    public static final int ORIENT_180 = 2;
    
    /**
     * Rotated 270 degrees clockwise
     */
    public static final int ORIENT_270 = 3;

    // area class values
    
    /**
     * Normal class
     */
    public static final int CLASS_NORMAL = 0;

    /**
     * Fixed position class
     */
    public static final int CLASS_FIXED = 1;

    /**
     * Absolute position class
     */
    public static final int CLASS_ABSOLUTE = 2;

    /**
     * Before float class
     */
    public static final int CLASS_BEFORE_FLOAT = 3;

    /**
     * Footnote class
     */
    public static final int CLASS_FOOTNOTE = 4;

    /**
     * Side float class
     */
    public static final int CLASS_SIDE_FLOAT = 5;

    // IMPORTANT: make sure this is the maximum + 1
    /**
     * Maximum class count
     */
    public static final int CLASS_MAX = CLASS_SIDE_FLOAT + 1;

    private int areaClass = CLASS_NORMAL;
    private int ipd;

    protected Area parent = null; // Doesn't need to be saved in serialization

    public int getAreaClass() {
        return areaClass;
    }

    public void setAreaClass(int areaClass) {
        this.areaClass = areaClass;
    }

    public void setIPD(int i) {
        ipd = i;
    }

    public int getIPD() {
        return ipd;
    }

    /**
     * Return a length range describing the minimum, optimum and maximum
     * lengths available for content in the block-progression-direction.
     * This is calculated from the theoretical maximum size of the area
     * and its current content.
     */
    public MinOptMax getAvailBPD() {
        return MinOptMax.subtract(getMaxBPD(), getContentBPD());
    }

    /**
     * Return a length range describing the theoretical maximum size of an
     * area in the block-progression-direction.
     * For areas holding normal flowing or floating content in paged media,
     * this depends on the size of the body. In general the answer is the
     * gotten from the parent. At the body level, the calculation accounts
     * for the sizes of the conditional areas.
     */
    public MinOptMax getMaxBPD() {
        if (parent != null) {
            return parent.getMaxBPD();
        } else {
            return new MinOptMax();
        }
    }

    /**
     * Return a length range describing the minimum, optimum and maximum
     * lengths of all area content in the block-progression-direction.
     * This is based on the allocation rectangles of all content in
     * the area.
     */
    public MinOptMax getContentBPD() {
        return new MinOptMax();
    }

    /**
     * Return a length range describing the minimum, optimum and maximum
     * lengths of the area's allocation rectangle
     * in the block-progression-direction.
     * This is based on the allocation rectangles of all content in
     * the area.
     * The default implementation simply returns the same as the content BPD.
     * If an Area has before or after border and padding, these contribute
     * to the allocation BPD, depending on conditionality.
     */
    public MinOptMax getAllocationBPD() {
        return getContentBPD();
    }

    public void setParent(Area parent) {
        this.parent = parent;
    }

    // Do nothing! Let subclasses do something if they can have child areas.
    public void addChild(Area child) {
    }


    HashMap props = null;

    public void addTrait(Trait prop) {
        if (props == null) {
            props = new HashMap(20);
        }
        props.put(prop.propType, prop.data);
    }

    public void addTrait(Object traitCode, Object prop) {
        if (props == null) {
            props = new HashMap(20);
        }
        props.put(traitCode, prop);
    }

    public HashMap getTraits() {
        return this.props;
    }

    public Object getTrait(Object oTraitCode) {
        return (props != null ? props.get(oTraitCode) : null);
    }
}