Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
 
3
/**
4
 * @abstract
5
 */
6
class BoxPageMargin extends GenericContainerBox {
7
  /**
8
   * @param $at_rule CSSAtRuleMarginBox At-rule object describing margin box to be created
9
   * @return Object Object of concrete BoxPageMargin descendant type
10
   */
11
  function &create(&$pipeline, $at_rule) {
12
    switch ($at_rule->getSelector()) {
13
    case CSS_MARGIN_BOX_SELECTOR_TOP:
14
      $box =& new BoxPageMarginTop($pipeline, $at_rule);
15
      break;
16
    case CSS_MARGIN_BOX_SELECTOR_TOP_LEFT_CORNER:
17
      $box =& new BoxPageMarginTopLeftCorner($pipeline, $at_rule);
18
      break;
19
    case CSS_MARGIN_BOX_SELECTOR_TOP_LEFT:
20
      $box =& new BoxPageMarginTopLeft($pipeline, $at_rule);
21
      break;
22
    case CSS_MARGIN_BOX_SELECTOR_TOP_CENTER:
23
      $box =& new BoxPageMarginTopCenter($pipeline, $at_rule);
24
      break;
25
    case CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT:
26
      $box =& new BoxPageMarginTopRight($pipeline, $at_rule);
27
      break;
28
    case CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT_CORNER:
29
      $box =& new BoxPageMarginTopRightCorner($pipeline, $at_rule);
30
      break;
31
    case CSS_MARGIN_BOX_SELECTOR_BOTTOM:
32
      $box =& new BoxPageMarginBottom($pipeline, $at_rule);
33
      break;
34
    case CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT_CORNER:
35
      $box =& new BoxPageMarginBottomLeftCorner($pipeline, $at_rule);
36
      break;
37
    case CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT:
38
      $box =& new BoxPageMarginBottomLeft($pipeline, $at_rule);
39
      break;
40
    case CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER:
41
      $box =& new BoxPageMarginBottomCenter($pipeline, $at_rule);
42
      break;
43
    case CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT:
44
      $box =& new BoxPageMarginBottomRight($pipeline, $at_rule);
45
      break;
46
    case CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT_CORNER:
47
      $box =& new BoxPageMarginBottomRightCorner($pipeline, $at_rule);
48
      break;
49
    case CSS_MARGIN_BOX_SELECTOR_LEFT_TOP:
50
      $box =& new BoxPageMarginLeftTop($pipeline, $at_rule);
51
      break;
52
    case CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE:
53
      $box =& new BoxPageMarginLeftMiddle($pipeline, $at_rule);
54
      break;
55
    case CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM:
56
      $box =& new BoxPageMarginLeftBottom($pipeline, $at_rule);
57
      break;
58
    case CSS_MARGIN_BOX_SELECTOR_RIGHT_TOP:
59
      $box =& new BoxPageMarginRightTop($pipeline, $at_rule);
60
      break;
61
    case CSS_MARGIN_BOX_SELECTOR_RIGHT_MIDDLE:
62
      $box =& new BoxPageMarginRightMiddle($pipeline, $at_rule);
63
      break;
64
    case CSS_MARGIN_BOX_SELECTOR_RIGHT_BOTTOM:
65
      $box =& new BoxPageMarginRightBottom($pipeline, $at_rule);
66
      break;
67
    default:
68
      trigger_error("Unknown selector type", E_USER_ERROR);
69
    };
70
 
71
    return $box;
72
  }
73
 
74
  function BoxPageMargin(&$pipeline, $at_rule) {
75
    $state =& $pipeline->get_current_css_state();
76
    $state->pushDefaultState();
77
 
78
    $root = null;
79
    $at_rule->css->apply($root, $state, $pipeline);
80
 
81
    $this->GenericContainerBox();
82
    $this->readCSS($state);
83
 
84
    $state->pushDefaultstate();
85
 
86
    /**
87
     * Check whether 'content' or '-html2ps-html-content' properties had been defined
88
     * (if both properties are defined, -html2ps-html-content takes precedence)
89
     */
90
    $raw_html_content =& $at_rule->get_css_property(CSS_HTML2PS_HTML_CONTENT);
91
    $html_content = $raw_html_content->render($pipeline->get_counters());
92
 
93
    if ($html_content !== '') {
94
      // We should wrap html_content in DIV tag,
95
      // as we treat only the very first box of the resulting DOM tree as margin box content
96
 
97
      $html_content = html2xhtml("<div>".$html_content."</div>");
98
      $tree = TreeBuilder::build($html_content);
99
      $tree_root = traverse_dom_tree_pdf($tree);
100
      $body_box =& create_pdf_box($tree_root, $pipeline);
101
      $box =& $body_box->content[0];
102
    } else {
103
      $raw_content =& $at_rule->get_css_property(CSS_CONTENT);
104
      $content = $raw_content->render($pipeline->get_counters());
105
 
106
      $box =& InlineBox::create_from_text($content,
107
                                          WHITESPACE_PRE_LINE,
108
                                          $pipeline);
109
    }
110
    $this->add_child($box);
111
 
112
    $state->popState();
113
    $state->popState();
114
  }
115
 
116
  function get_cell_baseline() {
117
    return 0;
118
  }
119
 
120
  function reflow(&$driver, &$media, $boxes) {
121
    $context = new FlowContext;
122
    $this->_position($media, $boxes, $context);
123
 
124
    $this->setCSSProperty(CSS_WIDTH, new WCConstant($this->get_width()));
125
    $this->put_height_constraint(new HCConstraint(array($this->height, false),
126
                                                  null,
127
                                                  null));
128
 
129
    $this->reflow_content($context);
130
 
131
    /**
132
     * Apply vertical-align (behave like table cell)
133
     */
134
    $va = CSSVerticalAlign::value2pdf($this->get_css_property(CSS_VERTICAL_ALIGN));
135
 
136
    $va->apply_cell($this,$this->get_full_height(),0);
137
  }
138
 
139
  function show(&$driver) {
140
    $this->offset(0, $driver->offset);
141
    $this->show_fixed($driver);
142
  }
143
 
144
  function _calc_sizes($full_width, $left, $center, $right) {
145
    $context = new FlowContext;
146
 
147
    $left_width   = $left->get_max_width($context);
148
    $center_width = $center->get_max_width($context);
149
    $right_width  = $right->get_max_width($context);
150
 
151
    $calculated_left_width   = 0;
152
    $calculated_center_width = 0;
153
    $calculated_right_width  = 0;
154
 
155
    if ($center_width > 0) {
156
      $calculated_center_width = $full_width * $center_width / ($center_width + 2*max($left_width, $right_width));
157
      $calculated_left_width   = ($full_width - $calculated_center_width) / 2;
158
      $calculated_right_width  = $calculated_left_width;
159
    } elseif ($left_width == 0 && $right_width == 0) {
160
      $calculated_center_width = 0;
161
      $calculated_left_width   = 0;
162
      $calculated_right_width  = 0;
163
    } elseif ($left_width == 0) {
164
      $calculated_center_width = 0;
165
      $calculated_left_width   = 0;
166
      $calculated_right_width  = $full_width;
167
    } elseif ($right_width == 0) {
168
      $calculated_center_width = 0;
169
      $calculated_left_width   = $full_width;
170
      $calculated_right_width  = 0;
171
    } else {
172
      $calculated_center_width = 0;
173
      $calculated_left_width   = $full_width * $left_width / ($left_width + $right_width);
174
      $calculated_right_width  = $full_width - $calculated_left_width;
175
    };
176
 
177
    return array($calculated_left_width,
178
                 $calculated_center_width,
179
                 $calculated_right_width);
180
  }
181
}
182
 
183
class BoxPageMarginTop extends BoxPageMargin {
184
  function _position($media, $boxes, $context) {
185
    $this->put_left($this->get_extra_left() + 0);
186
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
187
 
188
    $this->put_full_width(mm2pt($media->width()));
189
    $this->put_full_height(mm2pt($media->margins['top']));
190
 
191
    $this->_current_x = $this->get_left();
192
    $this->_current_y = $this->get_top();
193
  }
194
}
195
 
196
class BoxPageMarginTopLeftCorner extends BoxPageMargin {
197
  function _position($media, $boxes, $context) {
198
    $this->put_left($this->get_extra_left() + 0);
199
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
200
 
201
    $this->put_full_width(mm2pt($media->margins['left']));
202
    $this->put_full_height(mm2pt($media->margins['top']));
203
 
204
    $this->_current_x = $this->get_left();
205
    $this->_current_y = $this->get_top();
206
  }
207
}
208
 
209
class BoxPageMarginTopLeft extends BoxPageMargin {
210
  function _position($media, $boxes, $context) {
211
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
212
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_TOP_LEFT],
213
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_TOP_CENTER],
214
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT]);
215
 
216
    $this->put_left($this->get_extra_left() + mm2pt($media->margins['left']));
217
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
218
 
219
    $this->put_full_width($left);
220
    $this->put_full_height(mm2pt($media->margins['top']));
221
 
222
    $this->_current_x = $this->get_left();
223
    $this->_current_y = $this->get_top();
224
  }
225
}
226
 
227
class BoxPageMarginTopCenter extends BoxPageMargin {
228
  function _position($media, $boxes, $context) {
229
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
230
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_TOP_LEFT],
231
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_TOP_CENTER],
232
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT]);
233
 
234
    $this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left);
235
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
236
 
237
    $this->put_full_width($center);
238
    $this->put_full_height(mm2pt($media->margins['top']));
239
 
240
    $this->_current_x = $this->get_left();
241
    $this->_current_y = $this->get_top();
242
  }
243
}
244
 
245
class BoxPageMarginTopRight extends BoxPageMargin {
246
  function _position($media, $boxes, $context) {
247
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
248
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_TOP_LEFT],
249
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_TOP_CENTER],
250
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT]);
251
 
252
    $this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left + $center);
253
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
254
 
255
    $this->put_full_width($right);
256
    $this->put_full_height(mm2pt($media->margins['top']));
257
 
258
    $this->_current_x = $this->get_left();
259
    $this->_current_y = $this->get_top();
260
  }
261
}
262
 
263
class BoxPageMarginTopRightCorner extends BoxPageMargin {
264
  function _position($media, $boxes, $context) {
265
    $this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
266
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
267
 
268
    $this->put_full_width(mm2pt($media->margins['right']));
269
    $this->put_full_height(mm2pt($media->margins['top']));
270
 
271
    $this->_current_x = $this->get_left();
272
    $this->_current_y = $this->get_top();
273
  }
274
}
275
 
276
class BoxPageMarginBottomLeftCorner extends BoxPageMargin {
277
  function _position($media, $boxes, $context) {
278
    $this->put_left($this->get_extra_left() + 0);
279
    $this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
280
 
281
    $this->put_full_width(mm2pt($media->margins['left']));
282
    $this->put_full_height(mm2pt($media->margins['bottom']));
283
 
284
    $this->_current_x = $this->get_left();
285
    $this->_current_y = $this->get_top();
286
  }
287
}
288
 
289
class BoxPageMarginBottomLeft extends BoxPageMargin {
290
  function _position($media, $boxes, $context) {
291
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
292
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT],
293
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER],
294
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT]);
295
 
296
    $this->put_left($this->get_extra_left() + mm2pt($media->margins['left']));
297
    $this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
298
 
299
    $this->put_full_width($left);
300
    $this->put_full_height(mm2pt($media->margins['bottom']));
301
 
302
    $this->_current_x = $this->get_left();
303
    $this->_current_y = $this->get_top();
304
  }
305
}
306
 
307
class BoxPageMarginBottomCenter extends BoxPageMargin {
308
  function _position($media, $boxes, $context) {
309
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
310
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT],
311
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER],
312
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT]);
313
 
314
    $this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left);
315
    $this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
316
 
317
    $this->put_full_width($center);
318
    $this->put_full_height(mm2pt($media->margins['bottom']));
319
 
320
    $this->_current_x = $this->get_left();
321
    $this->_current_y = $this->get_top();
322
  }
323
}
324
 
325
class BoxPageMarginBottomRight extends BoxPageMargin {
326
  function _position($media, $boxes, $context) {
327
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
328
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT],
329
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER],
330
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT]);
331
 
332
    $this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left + $center);
333
    $this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
334
 
335
    $this->put_full_width($right);
336
    $this->put_full_height(mm2pt($media->margins['bottom']));
337
 
338
    $this->_current_x = $this->get_left();
339
    $this->_current_y = $this->get_top();
340
  }
341
}
342
 
343
class BoxPageMarginBottomRightCorner extends BoxPageMargin {
344
  function _position($media, $boxes, $context) {
345
    $this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
346
    $this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
347
 
348
    $this->put_full_width(mm2pt($media->margins['right']));
349
    $this->put_full_height(mm2pt($media->margins['top']));
350
 
351
    $this->_current_x = $this->get_left();
352
    $this->_current_y = $this->get_top();
353
  }
354
}
355
 
356
class BoxPageMarginBottom extends BoxPageMargin {
357
  function _position($media, $boxes, $context) {
358
    $this->put_left($this->get_extra_left() + 0);
359
    $this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
360
 
361
    $this->put_full_width(mm2pt($media->width()));
362
    $this->put_full_height(mm2pt($media->margins['bottom']));
363
 
364
    $this->_current_x = $this->get_left();
365
    $this->_current_y = $this->get_top();
366
  }
367
}
368
 
369
class BoxPageMarginLeftTop extends BoxPageMargin {
370
  function _position($media, $boxes, $context) {
371
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
372
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
373
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
374
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
375
 
376
    $this->put_left($this->get_extra_left() + 0);
377
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']));
378
 
379
    $this->put_full_height($left);
380
    $this->put_full_width(mm2pt($media->margins['left']));
381
 
382
    $this->_current_x = $this->get_left();
383
    $this->_current_y = $this->get_top();
384
  }
385
}
386
 
387
class BoxPageMarginLeftMiddle extends BoxPageMargin {
388
  function _position($media, $boxes, $context) {
389
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
390
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
391
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
392
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
393
    $this->put_left($this->get_extra_left() + 0);
394
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']) - $left);
395
 
396
    $this->put_full_height($center);
397
    $this->put_full_width(mm2pt($media->margins['left']));
398
 
399
    $this->_current_x = $this->get_left();
400
    $this->_current_y = $this->get_top();
401
  }
402
}
403
 
404
class BoxPageMarginLeftBottom extends BoxPageMargin {
405
  function _position($media, $boxes, $context) {
406
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
407
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
408
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
409
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
410
 
411
    $this->put_left($this->get_extra_left() + 0);
412
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']) - $left - $center);
413
 
414
    $this->put_full_height($right);
415
    $this->put_full_width(mm2pt($media->margins['left']));
416
 
417
    $this->_current_x = $this->get_left();
418
    $this->_current_y = $this->get_top();
419
  }
420
}
421
 
422
class BoxPageMarginRightTop extends BoxPageMargin {
423
  function _position($media, $boxes, $context) {
424
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
425
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_RIGHT_TOP],
426
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_RIGHT_MIDDLE],
427
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_RIGHT_BOTTOM]);
428
 
429
    $this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
430
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']));
431
 
432
    $this->put_full_height($left);
433
    $this->put_full_width(mm2pt($media->margins['right']));
434
 
435
    $this->_current_x = $this->get_left();
436
    $this->_current_y = $this->get_top();
437
  }
438
}
439
 
440
class BoxPageMarginRightMiddle extends BoxPageMargin {
441
  function _position($media, $boxes, $context) {
442
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
443
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
444
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
445
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
446
 
447
    $this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
448
    $this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']) - $left);
449
 
450
    $this->put_full_height($center);
451
    $this->put_full_width(mm2pt($media->margins['right']));
452
 
453
    $this->_current_x = $this->get_left();
454
    $this->_current_y = $this->get_top();
455
  }
456
}
457
 
458
class BoxPageMarginRightBottom extends BoxPageMargin {
459
  function _position($media, $boxes, $context) {
460
    list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
461
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
462
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
463
                                                      $boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
464
 
465
    $this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
466
    $this->put_top(-$this->get_extra_top() + mm2pt($media->height() - $media->margins['top']) - $left - $center);
467
 
468
    $this->put_full_height($right);
469
    $this->put_full_width(mm2pt($media->margins['right']));
470
 
471
    $this->_current_x = $this->get_left();
472
    $this->_current_y = $this->get_top();
473
  }
474
}
475
 
476
?>