1
2
3
4
5
6
7
8
9
10
11
12 package sk.uniba.euromath.foRenderer.figures;
13
14 import org.apache.fop.area.Area;
15 import org.apache.fop.area.RegionViewport;
16 import org.apache.fop.fo.Constants;
17 import org.eclipse.draw2d.ColorConstants;
18
19 import org.eclipse.draw2d.Graphics;
20 import org.eclipse.draw2d.IFigure;
21 import org.eclipse.draw2d.Layer;
22 import org.eclipse.draw2d.ScalableLayeredPane;
23 import org.eclipse.draw2d.geometry.Dimension;
24 import org.eclipse.draw2d.geometry.Insets;
25 import org.eclipse.draw2d.geometry.Point;
26 import org.eclipse.draw2d.geometry.Rectangle;
27 import org.eclipse.swt.graphics.Color;
28
29
30 import sk.uniba.euromath.editor.figures.IEMFigure;
31
32 import sk.uniba.euromath.foRenderer.config.GlobalFOPFigureCfg;
33
34 /***
35 * @author TV Created on 19.1.2004
36 *
37 */
38
39
40 public class PageFigure extends ScalableLayeredPane implements FOPFigure,
41 IEMFigure {
42
43 /***
44 * Margin color
45 */
46 private static Color marginColor = ColorConstants.white;
47
48 /***
49 * Paper layer
50 */
51 public static final String LAYER_PAPER = "Paper Layer";
52
53 /***
54 * Background logo, ...
55 */
56 public static final String LAYER_WATERMARK = "WaterMark Layer";
57
58 /***
59 * Writing layer functions as basic destination for all textual
60 * information belonging to the data being rendered. Printable Layer
61 */
62 public static final String LAYER_WRITING = "Writing Layer";
63
64 /*** for rulers, figure borders, etc. */
65 public static final String LAYER_DECORATION = "Decoration Layer";
66
67 /*** handles??? */
68 public static final String LAYER_ACTION = "User Action Layer";
69
70 private static final String[] LAYER_LIST = { LAYER_PAPER,
71 LAYER_WATERMARK, LAYER_WRITING, LAYER_DECORATION,
72 LAYER_ACTION };
73
74
75
76 private RegionFigure regionBefore = null;
77
78 private RegionFigure regionAfter = null;
79
80 private RegionFigure regionStart = null;
81
82 private RegionFigure regionEnd = null;
83
84 private RegionFigure regionBody = null;
85
86 private int pageWidth = 0;
87
88 private int pageHeight = 0;
89
90 private Insets margins;
91
92 /*** Constructor */
93 public PageFigure() {
94 super();
95 setOpaque(true);
96 setBackgroundColor(ColorConstants.white);
97
98 createLayers();
99
100 setLayoutManager(new PageRegionLayoutManager(this));
101 }
102
103 /***
104 * Constructor
105 *
106 * @param pageSize
107 * size of page
108 * @param margins
109 * @see Insets
110 */
111 public PageFigure(Dimension pageSize, Insets margins) {
112 this();
113 this.pageWidth = pageSize.width;
114 this.pageHeight = pageSize.height;
115 setPreferredSize(pageSize.expand(2, 2));
116 this.margins = margins;
117 }
118
119 /***
120 * Adds the given layer figure, identifiable with the given key, at the
121 * specified index. While adding the layer, it informs the surrounding
122 * layers of the addition.
123 *
124 * @param figure
125 * the layer
126 * @param layerKey
127 * the layer's key
128 * @param index
129 * the index where the layer should be added
130 */
131 public void add(IFigure figure, Object layerKey, int index) {
132 if (figure instanceof RegionFigure) {
133 RegionViewport region = (RegionViewport) ((RegionFigure) figure)
134 .getArea();
135
136 if (region.getRegionReference().getRegionClass() == Constants.FO_REGION_BEFORE) {
137 regionBefore = (RegionFigure) figure;
138 } else if (region.getRegionReference().getRegionClass() == Constants.FO_REGION_AFTER) {
139 regionAfter = (RegionFigure) figure;
140 } else if (region.getRegionReference().getRegionClass() == Constants.FO_REGION_START) {
141 regionStart = (RegionFigure) figure;
142 } else if (region.getRegionReference().getRegionClass() == Constants.FO_REGION_END) {
143 regionEnd = (RegionFigure) figure;
144 } else if (region.getRegionReference().getRegionClass() == Constants.FO_REGION_BODY) {
145 regionBody = (RegionFigure) figure;
146 }
147 super.add(figure, layerKey, index);
148 }
149
150 }
151
152 protected void createLayers() {
153 for (int i = 0; i < LAYER_LIST.length; i++) {
154 add(new Layer(), LAYER_LIST[i], -1);
155 }
156 }
157
158 /***
159 * @return <code> null </code>
160 */
161 public Area getArea() {
162 return null;
163 }
164
165 /***
166 * @return configuration object
167 * @param key
168 */
169 public Object getConfig(Object key) {
170 return GlobalFOPFigureCfg.getConfig().getData(key,
171 this.getClass());
172 }
173
174 /***
175 * @return <code> null </code>
176 */
177 public Object getModel() {
178 return null;
179 }
180
181 /***
182 * @return <code> true </code>
183 */
184 public boolean needsEditPart() {
185 return true;
186 }
187
188 /***
189 * @return null
190 */
191 public String getID() {
192 return null;
193 }
194
195 /***
196 * @see org.eclipse.draw2d.IFigure#getMaximumSize()
197 */
198 public Dimension getMaximumSize() {
199 return getPreferredSize();
200 }
201
202 /***
203 *
204 * @param code
205 * of Region
206 * @return RegionFigure spicified with code
207 */
208 public RegionFigure getRegion(int code) {
209 if (code == Constants.FO_REGION_AFTER) {
210 return regionAfter;
211 } else if (code == Constants.FO_REGION_BEFORE) {
212 return regionBefore;
213 } else if (code == Constants.FO_REGION_BODY) {
214 return regionBody;
215 } else if (code == Constants.FO_REGION_END) {
216 return regionEnd;
217 } else if (code == Constants.FO_REGION_START) {
218 return regionStart;
219 } else {
220 return null;
221 }
222 }
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263 protected void paintFigure(Graphics g) {
264 g.fillRectangle(getBounds());
265
266
267 paintMargins(g);
268
269 }
270
271 protected void paintMargins(Graphics g) {
272 Rectangle area = getClientArea();
273
274 Color background = g.getBackgroundColor();
275 g.translate(area.getLocation());
276 g.setBackgroundColor(marginColor);
277
278 if (margins.left != 0) {
279 g.fillRectangle(0, 0, margins.left - 1, pageHeight - 1);
280 }
281
282 if (margins.top != 0) {
283 g.fillRectangle(0, 0, pageWidth - 1, margins.top - 1);
284 }
285
286 if (margins.right != 0) {
287 g.fillRectangle(pageWidth - margins.right, 0,
288 margins.right - 1, pageHeight - 1);
289 }
290
291 if (margins.bottom != 0) {
292 g.fillRectangle(0, pageHeight - margins.bottom,
293 pageWidth - 1, margins.bottom - 1);
294 }
295
296 g.setBackgroundColor(background);
297 g.translate(area.getLocation().getNegated());
298 }
299
300 /***
301 * @see sk.uniba.euromath.fo.figures.FOPFigure#setPixelDimensions(org.eclipse.draw2d.geometry.Rectangle)
302 * @deprecated
303 * @param r
304 * size in pixels of Figures rectangle
305 */
306 public void setPixelDimensions(Rectangle r) {
307 pageWidth = r.width;
308 pageHeight = r.height;
309 setSize(r.getSize());
310 }
311
312 private class PageRegionLayoutManager extends BaseFOLayout {
313
314 private PageFigure page = null;
315
316 private int verticalExtent, horizontalExtent;
317
318 PageRegionLayoutManager(PageFigure page) {
319 setPage(page);
320 }
321
322 /***
323 * Calculates the preferred size of the given figure, using
324 * width and height hints.
325 *
326 * @param parent
327 * The figure
328 * @param wHint
329 * The width hint
330 * @param hHint
331 * The height hint
332 * @return The preferred size
333 */
334 protected Dimension calculatePreferredSize(IFigure parent,
335 int wHint, int hHint) {
336 setPage(parent);
337
338 if (preferredSize == null) {
339 Insets i = parent.getInsets();
340 preferredSize = page.getSize().getCopy()
341 .expand(i.getWidth(),
342 i.getHeight());
343 }
344 return preferredSize;
345 }
346
347 private BodyRegionFigure getBody() {
348 return (BodyRegionFigure) page
349 .getRegion(Constants.FO_REGION_BODY);
350 }
351
352 /***
353 * @see org.eclipse.draw2d.LayoutManager#layout(org.eclipse.draw2d.IFigure)
354 */
355 public void layout(IFigure parent) {
356 setPage(parent);
357
358 Point origin =
359 RegionFigure region;
360
361 verticalExtent = 0;
362 horizontalExtent = 0;
363
364 region = page.getRegion(Constants.FO_REGION_BEFORE);
365 if (region != null) {
366 layoutBefore(region, origin);
367 }
368
369 region = page.getRegion(Constants.FO_REGION_AFTER);
370 if (region != null) {
371 layoutAfter(region, origin);
372 }
373
374 region = page.getRegion(Constants.FO_REGION_START);
375 if (region != null) {
376 layoutStart(region, origin);
377 }
378
379 region = page.getRegion(Constants.FO_REGION_END);
380 if (region != null) {
381 layoutEnd(region, origin);
382 }
383
384 layoutBodyRegion(getBody(), origin);
385
386 }
387
388 protected void layoutBodyRegion(BodyRegionFigure body,
389 Point origin) {
390 Rectangle data = body.getViewportRectangle();
391
392
393
394
395
396 data.translate(origin);
397
398
399
400
401
402 body.setBounds(data);
403
404 }
405
406 private void layoutAfter(RegionFigure after, Point origin) {
407 Rectangle data = after.getViewportRectangle().getCopy();
408 verticalExtent += data.height;
409 setRegionBounds(after, data.getLocation().translate(
410 origin), data.getSize());
411 }
412
413 private void layoutBefore(RegionFigure before, Point origin) {
414 Rectangle data = before.getViewportRectangle();
415 verticalExtent += data.height;
416 setRegionBounds(before, data.getLocation().translate(
417 origin), data.getSize());
418 }
419
420 private void layoutEnd(RegionFigure before, Point origin) {
421 Rectangle data = before.getViewportRectangle();
422 horizontalExtent += data.width;
423 setRegionBounds(before, data.getLocation().translate(
424 origin), data.getSize());
425 }
426
427 private void layoutStart(RegionFigure before, Point origin) {
428 Rectangle data = before.getViewportRectangle();
429 horizontalExtent += data.width;
430 setRegionBounds(before, data.getLocation().translate(
431 origin), data.getSize());
432 }
433
434 protected void setRegionBounds(RegionFigure region, Point loc,
435 Dimension size) {
436 if (region == null)
437 return;
438 region.setBounds(new Rectangle(loc, size));
439 }
440
441 protected void setPage(IFigure parent) {
442 assert (parent != null);
443
444 if (parent instanceof PageFigure) {
445 page = (PageFigure) parent;
446
447 invalidate();
448 }
449 }
450
451 /***
452 * @see org.eclipse.draw2d.AbstractLayout#getBorderPreferredSize(org.eclipse.draw2d.IFigure)
453 */
454 protected Dimension getBorderPreferredSize(IFigure container) {
455 if (container != null) {
456 Insets i = container.getBorder().getInsets(
457 container);
458 return new Dimension(i.getWidth(), i
459 .getHeight());
460 }
461 return super.getBorderPreferredSize(container);
462 }
463 }
464
465 }