| 1 |
lars |
1 |
<?php
|
|
|
2 |
class GenericInlineBox extends GenericContainerBox {
|
|
|
3 |
function GenericInlineBox() {
|
|
|
4 |
$this->GenericContainerBox();
|
|
|
5 |
}
|
|
|
6 |
|
|
|
7 |
// @todo this code is duplicated in box.block.php
|
|
|
8 |
//
|
|
|
9 |
function reflow(&$parent, &$context) {
|
|
|
10 |
switch ($this->get_css_property(CSS_POSITION)) {
|
|
|
11 |
case POSITION_STATIC:
|
|
|
12 |
return $this->reflow_static($parent, $context);
|
|
|
13 |
|
|
|
14 |
case POSITION_RELATIVE:
|
|
|
15 |
/**
|
|
|
16 |
* CSS 2.1:
|
|
|
17 |
* Once a box has been laid out according to the normal flow or floated, it may be shifted relative
|
|
|
18 |
* to this position. This is called relative positioning. Offsetting a box (B1) in this way has no
|
|
|
19 |
* effect on the box (B2) that follows: B2 is given a position as if B1 were not offset and B2 is
|
|
|
20 |
* not re-positioned after B1's offset is applied. This implies that relative positioning may cause boxes
|
|
|
21 |
* to overlap. However, if relative positioning causes an 'overflow:auto' box to have overflow, the UA must
|
|
|
22 |
* allow the user to access this content, which, through the creation of scrollbars, may affect layout.
|
|
|
23 |
*
|
|
|
24 |
* @link http://www.w3.org/TR/CSS21/visuren.html#x28 CSS 2.1 Relative positioning
|
|
|
25 |
*/
|
|
|
26 |
|
|
|
27 |
$this->reflow_static($parent, $context);
|
|
|
28 |
$this->offsetRelative();
|
|
|
29 |
return;
|
|
|
30 |
}
|
|
|
31 |
}
|
|
|
32 |
|
|
|
33 |
// Checks if current inline box should cause a line break inside the parent box
|
|
|
34 |
//
|
|
|
35 |
// @param $parent reference to a parent box
|
|
|
36 |
// @param $content flow context
|
|
|
37 |
// @return true if line break occurred; false otherwise
|
|
|
38 |
//
|
|
|
39 |
function maybe_line_break(&$parent, &$context) {
|
|
|
40 |
if (!$parent->line_break_allowed()) {
|
|
|
41 |
return false;
|
|
|
42 |
};
|
|
|
43 |
|
|
|
44 |
// Calculate the x-coordinate of this box right edge
|
|
|
45 |
$right_x = $this->get_full_width() + $parent->_current_x;
|
|
|
46 |
|
|
|
47 |
$need_break = false;
|
|
|
48 |
|
|
|
49 |
// Check for right-floating boxes
|
|
|
50 |
// If upper-right corner of this inline box is inside of some float, wrap the line
|
|
|
51 |
if ($context->point_in_floats($right_x, $parent->_current_y)) {
|
|
|
52 |
$need_break = true;
|
|
|
53 |
};
|
|
|
54 |
|
|
|
55 |
// No floats; check if we had run out the right edge of container
|
|
|
56 |
// TODO: nobr-before, nobr-after
|
|
|
57 |
|
|
|
58 |
if (($right_x > $parent->get_right() + EPSILON)) {
|
|
|
59 |
// Now check if parent line box contains any other boxes;
|
|
|
60 |
// if not, we should draw this box unless we have a floating box to the left
|
|
|
61 |
|
|
|
62 |
$first = $parent->get_first();
|
|
|
63 |
|
|
|
64 |
// FIXME: what's this? This condition is invariant!
|
|
|
65 |
$text_indent = $parent->get_css_property(CSS_TEXT_INDENT);
|
|
|
66 |
$indent_offset = ($first->uid == $this->uid || 1) ? $text_indent->calculate($parent) : 0;
|
|
|
67 |
|
|
|
68 |
if ($parent->_current_x > $parent->get_left() + $indent_offset + EPSILON) {
|
|
|
69 |
$need_break = true;
|
|
|
70 |
};
|
|
|
71 |
}
|
|
|
72 |
|
|
|
73 |
// As close-line will not change the current-Y parent coordinate if no
|
|
|
74 |
// items were in the line box, we need to offset this explicitly in this case
|
|
|
75 |
//
|
|
|
76 |
if ($parent->line_box_empty() && $need_break) {
|
|
|
77 |
$parent->_current_y -= $this->get_height();
|
|
|
78 |
};
|
|
|
79 |
|
|
|
80 |
if ($need_break) {
|
|
|
81 |
$parent->close_line($context);
|
|
|
82 |
|
|
|
83 |
// Check if parent inline boxes have left padding/margins and add them to current_x
|
|
|
84 |
$element = $this->parent;
|
|
|
85 |
while (!is_null($element) && is_a($element,"GenericInlineBox")) {
|
|
|
86 |
$parent->_current_x += $element->get_extra_left();
|
|
|
87 |
$element = $element->parent;
|
|
|
88 |
};
|
|
|
89 |
};
|
|
|
90 |
|
|
|
91 |
return $need_break;
|
|
|
92 |
}
|
|
|
93 |
|
|
|
94 |
function get_ascender() {
|
|
|
95 |
$first =& $this->get_first();
|
|
|
96 |
if (is_null($first)) { return 0; };
|
|
|
97 |
return $first->get_ascender();
|
|
|
98 |
}
|
|
|
99 |
|
|
|
100 |
function get_baseline() {
|
|
|
101 |
$first =& $this->get_first();
|
|
|
102 |
if (is_null($first)) { return 0; };
|
|
|
103 |
return $first->get_baseline();
|
|
|
104 |
}
|
|
|
105 |
|
|
|
106 |
function get_descender() {
|
|
|
107 |
$first =& $this->get_first();
|
|
|
108 |
if (is_null($first)) { return 0; };
|
|
|
109 |
return $first->get_descender();
|
|
|
110 |
}
|
|
|
111 |
}
|
|
|
112 |
?>
|